Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/workflows/check-external-urls.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: External URL check

on:
workflow_dispatch:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main

permissions:
contents: read

jobs:
check:
name: External URL check
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: pnpm

- name: Install dependencies
run: pnpm install

- name: Check external URLs
run: pnpm vitest run --config vitest.external-urls.config.ts
38 changes: 38 additions & 0 deletions .github/workflows/check-toolkit-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Toolkit docs coverage

on:
workflow_dispatch:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main

permissions:
contents: read

jobs:
coverage:
name: Toolkit docs coverage
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: pnpm

- name: Install dependencies
run: pnpm install

- name: Run toolkit coverage check
run: pnpm run check:toolkit-coverage
env:
ENGINE_API_URL: ${{ secrets.ENGINE_API_URL }}
ENGINE_API_KEY: ${{ secrets.ENGINE_API_KEY }}
48 changes: 48 additions & 0 deletions app/en/resources/integrations/create-category-meta.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import type { MetaRecord } from "nextra";

type ToolkitType =
| "arcade"
| "arcade_starter"
| "community"
| "verified"
| "auth";

export type CategoryEntry = {
slug: string;
title: string;
href: string;
type: ToolkitType;
};

/**
* Builds a Nextra MetaRecord for an integration category, automatically
* inserting "Optimized" and "Starter" separator headings based on toolkit type.
*
* - "Optimized" group: any entry whose type is not "arcade_starter"
* - "Starter" group: entries with type "arcade_starter"
*
* A separator is only emitted when its group is non-empty, so categories
* with a single type do not show an unnecessary heading.
*/
export function createCategoryMeta(entries: CategoryEntry[]): MetaRecord {
const optimized = entries.filter((e) => e.type !== "arcade_starter");
const starter = entries.filter((e) => e.type === "arcade_starter");

const result: MetaRecord = {};

if (optimized.length > 0) {
result["-- Optimized"] = { type: "separator", title: "Optimized" };
for (const entry of optimized) {
result[entry.slug] = { title: entry.title, href: entry.href };
}
}

if (starter.length > 0) {
result["-- Starter"] = { type: "separator", title: "Starter" };
for (const entry of starter) {
result[entry.slug] = { title: entry.title, href: entry.href };
}
}

return result;
}
40 changes: 21 additions & 19 deletions app/en/resources/integrations/customer-support/_meta.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,40 @@
import type { MetaRecord } from "nextra";
import { createCategoryMeta } from "../create-category-meta";

const meta: MetaRecord = {
"-- Optimized": {
type: "separator",
title: "Optimized",
},
zendesk: {
export default createCategoryMeta([
{
slug: "zendesk",
title: "Zendesk",
href: "/en/resources/integrations/customer-support/zendesk",
type: "arcade",
},
"-- Starter": {
type: "separator",
title: "Starter",
},
"customerio-api": {
{
slug: "customerio-api",
title: "Customer.io API",
href: "/en/resources/integrations/customer-support/customerio-api",
type: "arcade_starter",
},
"customerio-pipelines-api": {
{
slug: "customerio-pipelines-api",
title: "Customer.io Pipelines API",
href: "/en/resources/integrations/customer-support/customerio-pipelines-api",
type: "arcade_starter",
},
"customerio-track-api": {
{
slug: "customerio-track-api",
title: "Customer.io Track API",
href: "/en/resources/integrations/customer-support/customerio-track-api",
type: "arcade_starter",
},
"freshservice-api": {
{
slug: "freshservice-api",
title: "Freshservice API",
href: "/en/resources/integrations/customer-support/freshservice-api",
type: "arcade_starter",
},
"intercom-api": {
{
slug: "intercom-api",
title: "Intercom API",
href: "/en/resources/integrations/customer-support/intercom-api",
type: "arcade_starter",
},
};

export default meta;
]);
36 changes: 18 additions & 18 deletions app/en/resources/integrations/databases/_meta.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import type { MetaRecord } from "nextra";
import { createCategoryMeta } from "../create-category-meta";

const meta: MetaRecord = {
"-- Optimized": {
type: "separator",
title: "Optimized",
},
clickhouse: {
export default createCategoryMeta([
{
slug: "clickhouse",
title: "Clickhouse",
href: "/en/resources/integrations/databases/clickhouse",
type: "community",
},
mongodb: {
{
slug: "mongodb",
title: "MongoDB",
href: "/en/resources/integrations/databases/mongodb",
type: "community",
},
postgres: {
{
slug: "postgres",
title: "Postgres",
href: "/en/resources/integrations/databases/postgres",
type: "community",
},
"-- Starter": {
type: "separator",
title: "Starter",
},
"weaviate-api": {
{
slug: "weaviate-api",
title: "Weaviate API",
href: "/en/resources/integrations/databases/weaviate-api",
type: "arcade_starter",
},
yugabytedb: {
{
slug: "yugabytedb",
title: "YugabyteDB",
href: "/en/resources/integrations/databases/yugabytedb",
type: "arcade_starter",
},
};

export default meta;
]);
104 changes: 60 additions & 44 deletions app/en/resources/integrations/development/_meta.tsx
Original file line number Diff line number Diff line change
@@ -1,102 +1,118 @@
import type { MetaRecord } from "nextra";
import { createCategoryMeta } from "../create-category-meta";

const meta: MetaRecord = {
"-- Optimized": {
type: "separator",
title: "Optimized",
},
brightdata: {
export default createCategoryMeta([
{
slug: "brightdata",
title: "Bright Data",
href: "/en/resources/integrations/development/brightdata",
type: "community",
},
complextools: {
title: "ComplexTools",
href: "/en/resources/integrations/development/complextools",
},
daytona: {
{
slug: "daytona",
title: "Daytona",
href: "/en/resources/integrations/development/daytona",
type: "arcade",
},
deepwiki: {
title: "Deepwiki",
href: "/en/resources/integrations/development/deepwiki",
},
e2b: {
{
slug: "e2b",
title: "E2B",
href: "/en/resources/integrations/development/e2b",
type: "arcade",
},
figma: {
{
slug: "figma",
title: "Figma",
href: "/en/resources/integrations/development/figma",
type: "arcade",
},
firecrawl: {
{
slug: "firecrawl",
title: "Firecrawl",
href: "/en/resources/integrations/development/firecrawl",
type: "arcade",
},
github: {
{
slug: "github",
title: "GitHub",
href: "/en/resources/integrations/development/github",
type: "arcade",
},
math: {
{
slug: "math",
title: "Math",
href: "/en/resources/integrations/development/math",
type: "arcade",
},
pagerduty: {
{
slug: "pagerduty",
title: "Pagerduty",
href: "/en/resources/integrations/development/pagerduty",
type: "arcade",
},
pylon: {
{
slug: "pylon",
title: "Pylon",
href: "/en/resources/integrations/development/pylon",
type: "arcade",
},
search: {
{
slug: "search",
title: "Search",
href: "/en/resources/integrations/development/search",
type: "arcade",
},
test2: {
title: "Test2",
href: "/en/resources/integrations/development/test2",
},
web: {
{
slug: "web",
title: "Web",
href: "/en/resources/integrations/development/web",
type: "arcade",
},
"-- Starter": {
type: "separator",
title: "Starter",
},
"arcade-engine-api": {
{
slug: "arcade-engine-api",
title: "Arcade Engine API",
href: "/en/resources/integrations/development/arcade-engine-api",
type: "arcade_starter",
},
"cursor-agents-api": {
{
slug: "cursor-agents-api",
title: "Cursor Agents API",
href: "/en/resources/integrations/development/cursor-agents-api",
type: "arcade_starter",
},
"datadog-api": {
{
slug: "datadog-api",
title: "Datadog API",
href: "/en/resources/integrations/development/datadog-api",
type: "arcade_starter",
},
"github-api": {
{
slug: "github-api",
title: "GitHub API",
href: "/en/resources/integrations/development/github-api",
type: "arcade_starter",
},
"pagerduty-api": {
{
slug: "pagerduty-api",
title: "PagerDuty API",
href: "/en/resources/integrations/development/pagerduty-api",
type: "arcade_starter",
},
"posthog-api": {
{
slug: "posthog-api",
title: "PostHog API",
href: "/en/resources/integrations/development/posthog-api",
type: "arcade_starter",
},
pylonapi: {
{
slug: "pylonapi",
title: "PylonApi",
href: "/en/resources/integrations/development/pylonapi",
type: "arcade_starter",
},
"vercel-api": {
{
slug: "vercel-api",
title: "Vercel API",
href: "/en/resources/integrations/development/vercel-api",
type: "arcade_starter",
},
};

export default meta;
]);
Loading