diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml
index 307593a..d3898f1 100644
--- a/.github/workflows/pr-checks.yml
+++ b/.github/workflows/pr-checks.yml
@@ -1,4 +1,4 @@
-name: PR Checks
+name: CI
on:
pull_request:
@@ -7,14 +7,12 @@ permissions:
contents: read
jobs:
- checks:
- name: Lint, Test, Build, and Type Check
+ lint:
+ name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- with:
- fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v4
@@ -31,14 +29,100 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
- - name: Lint
+ - name: Run lint
run: pnpm lint
- - name: Type check
+ typecheck:
+ name: Type Check
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 9.8.0
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Run type check
run: pnpm typecheck
- - name: Test
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 9.8.0
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Build packages
+ run: pnpm build
+
+ - name: Run tests
run: pnpm test
- - name: Build
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 9.8.0
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Run build
run: pnpm build
+
+ status-check:
+ name: PR Checks
+ runs-on: ubuntu-latest
+ needs: [lint, typecheck, test, build]
+ if: always()
+ steps:
+ - name: Check all jobs
+ run: |
+ if [[ "${{ needs.lint.result }}" != "success" ]] || \
+ [[ "${{ needs.typecheck.result }}" != "success" ]] || \
+ [[ "${{ needs.test.result }}" != "success" ]] || \
+ [[ "${{ needs.build.result }}" != "success" ]]; then
+ echo "One or more checks failed"
+ exit 1
+ fi
+ echo "All checks passed!"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e036fd9..bcaa196 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -108,3 +108,16 @@ jobs:
console.error(`Failed to create release for ${tagName}:`, error.message);
}
}
+
+ - name: Deploy Documentation to Cloudflare Pages
+ if: steps.changesets.outputs.published == 'true'
+ run: |
+ echo "Building documentation site..."
+ pnpm --filter @ts-contract/docs build
+ echo "Installing Wrangler..."
+ npm install -g wrangler
+ echo "Deploying to Cloudflare Pages..."
+ npx wrangler pages deploy apps/docs/out --project-name=ts-contract-docs
+ env:
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
diff --git a/apps/docs/app/api/search/route.ts b/apps/docs/app/api/search/route.ts
deleted file mode 100644
index 7ba7e82..0000000
--- a/apps/docs/app/api/search/route.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { source } from '@/lib/source';
-import { createFromSource } from 'fumadocs-core/search/server';
-
-export const { GET } = createFromSource(source, {
- // https://docs.orama.com/docs/orama-js/supported-languages
- language: 'english',
-});
diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx
index 22fdca3..0fe34bc 100644
--- a/apps/docs/app/layout.tsx
+++ b/apps/docs/app/layout.tsx
@@ -1,6 +1,7 @@
import { RootProvider } from 'fumadocs-ui/provider/next';
import './global.css';
import { Inter } from 'next/font/google';
+import { ConstructionBanner } from '@/components/construction-banner';
const inter = Inter({
subsets: ['latin'],
@@ -10,6 +11,7 @@ export default function Layout({ children }: LayoutProps<'/'>) {
return (
+
{children}
diff --git a/apps/docs/app/llms-full.txt/route.ts b/apps/docs/app/llms-full.txt/route.ts
deleted file mode 100644
index d494d2c..0000000
--- a/apps/docs/app/llms-full.txt/route.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { getLLMText, source } from '@/lib/source';
-
-export const revalidate = false;
-
-export async function GET() {
- const scan = source.getPages().map(getLLMText);
- const scanned = await Promise.all(scan);
-
- return new Response(scanned.join('\n\n'));
-}
diff --git a/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts b/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts
deleted file mode 100644
index fde26d9..0000000
--- a/apps/docs/app/llms.mdx/docs/[[...slug]]/route.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { getLLMText, source } from '@/lib/source';
-import { notFound } from 'next/navigation';
-
-export const revalidate = false;
-
-export async function GET(_req: Request, { params }: RouteContext<'/llms.mdx/docs/[[...slug]]'>) {
- const { slug } = await params;
- const page = source.getPage(slug);
- if (!page) notFound();
-
- return new Response(await getLLMText(page), {
- headers: {
- 'Content-Type': 'text/markdown',
- },
- });
-}
-
-export function generateStaticParams() {
- return source.generateParams();
-}
diff --git a/apps/docs/app/llms.txt/route.ts b/apps/docs/app/llms.txt/route.ts
deleted file mode 100644
index 6639c25..0000000
--- a/apps/docs/app/llms.txt/route.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { source } from '@/lib/source';
-
-export const revalidate = false;
-
-export async function GET() {
- const lines: string[] = [];
- lines.push('# Documentation');
- lines.push('');
- for (const page of source.getPages()) {
- lines.push(`- [${page.data.title}](${page.url}): ${page.data.description}`);
- }
- return new Response(lines.join('\n'));
-}
diff --git a/apps/docs/components/construction-banner.tsx b/apps/docs/components/construction-banner.tsx
new file mode 100644
index 0000000..e738f03
--- /dev/null
+++ b/apps/docs/components/construction-banner.tsx
@@ -0,0 +1,16 @@
+export function ConstructionBanner() {
+ return (
+
+
+
+
+ 🚧
+
+
+ Under Construction - This documentation is actively being developed
+
+
+
+
+ );
+}
diff --git a/apps/docs/lib/layout.shared.tsx b/apps/docs/lib/layout.shared.tsx
index 37ddd45..4c44e15 100644
--- a/apps/docs/lib/layout.shared.tsx
+++ b/apps/docs/lib/layout.shared.tsx
@@ -23,5 +23,12 @@ export function baseOptions(): BaseLayoutProps {
),
},
githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`,
+ links: [
+ {
+ text: 'Documentation',
+ url: '/docs',
+ active: 'nested-url',
+ },
+ ],
};
}
diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs
index 3d4907f..d361ce0 100644
--- a/apps/docs/next.config.mjs
+++ b/apps/docs/next.config.mjs
@@ -4,14 +4,11 @@ const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {
+ output: 'export',
reactStrictMode: true,
- async rewrites() {
- return [
- {
- source: '/:path*.mdx',
- destination: '/llms.mdx/docs/:path*',
- },
- ];
+ trailingSlash: true,
+ images: {
+ unoptimized: true,
},
};
diff --git a/package.json b/package.json
index 847927e..db7104e 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,8 @@
"typecheck": "tsc -b",
"changeset": "changeset",
"version-packages": "changeset version",
- "release": "pnpm build && changeset publish"
+ "release": "pnpm build && changeset publish",
+ "deploy-docs": "./scripts/deploy-docs.sh"
},
"dependencies": {
"@shikijs/transformers": "^3.22.0",
@@ -30,6 +31,7 @@
"tslib": "^2.3.0",
"typescript": "~5.9.2",
"typescript-eslint": "^8.40.0",
- "vitest": "~4.0.18"
+ "vitest": "~4.0.18",
+ "wrangler": "^4.68.1"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9e268a6..a197d38 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,6 +51,9 @@ importers:
vitest:
specifier: ~4.0.18
version: 4.0.18(@types/node@20.19.9)(jiti@2.6.1)(lightningcss@1.31.1)(yaml@2.8.2)
+ wrangler:
+ specifier: ^4.68.1
+ version: 4.68.1
apps/docs:
dependencies:
@@ -223,6 +226,53 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+ '@cloudflare/kv-asset-handler@0.4.2':
+ resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@cloudflare/unenv-preset@2.14.0':
+ resolution: {integrity: sha512-XKAkWhi1nBdNsSEoNG9nkcbyvfUrSjSf+VYVPfOto3gLTZVc3F4g6RASCMh6IixBKCG2yDgZKQIHGKtjcnLnKg==}
+ peerDependencies:
+ unenv: 2.0.0-rc.24
+ workerd: ^1.20260218.0
+ peerDependenciesMeta:
+ workerd:
+ optional: true
+
+ '@cloudflare/workerd-darwin-64@1.20260302.0':
+ resolution: {integrity: sha512-cGtxPByeVrgoqxbmd8qs631wuGwf8yTm/FY44dEW4HdoXrb5jhlE4oWYHFafedkQCvGjY1Vbs3puAiKnuMxTXQ==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@cloudflare/workerd-darwin-arm64@1.20260302.0':
+ resolution: {integrity: sha512-WRGqV6RNXM3xoQblJJw1EHKwx9exyhB18cdnToSCUFPObFhk3fzMLoQh7S+nUHUpto6aUrXPVj6R/4G3UPjCxw==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@cloudflare/workerd-linux-64@1.20260302.0':
+ resolution: {integrity: sha512-gG423mtUjrmlQT+W2+KisLc6qcGcBLR+QcK5x1gje3bu/dF3oNiYuqY7o58A+sQk6IB849UC4UyNclo1RhP2xw==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [linux]
+
+ '@cloudflare/workerd-linux-arm64@1.20260302.0':
+ resolution: {integrity: sha512-7M25noGI4WlSBOhrIaY8xZrnn87OQKtJg9YWAO2EFqGjF1Su5QXGaLlQVF4fAKbqTywbHnI8BAuIsIlUSNkhCg==}
+ engines: {node: '>=16'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@cloudflare/workerd-windows-64@1.20260302.0':
+ resolution: {integrity: sha512-jK1L3ADkiWxFzlqZTq2iHW1Bd2Nzu1fmMWCGZw4sMZ2W1B2WCm2wHwO2SX/py4BgylyEN3wuF+5zagbkNKht9A==}
+ engines: {node: '>=16'}
+ cpu: [x64]
+ os: [win32]
+
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
'@emnapi/runtime@1.8.1':
resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
@@ -627,6 +677,9 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
'@manypkg/find-root@1.1.0':
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
@@ -703,6 +756,15 @@ packages:
resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==}
engines: {node: '>= 20.0.0'}
+ '@poppinss/colors@4.1.6':
+ resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==}
+
+ '@poppinss/dumper@0.6.5':
+ resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==}
+
+ '@poppinss/exception@1.2.3':
+ resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==}
+
'@radix-ui/number@1.1.1':
resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
@@ -1225,6 +1287,13 @@ packages:
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+ '@sindresorhus/is@7.2.0':
+ resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==}
+ engines: {node: '>=18'}
+
+ '@speed-highlight/core@1.2.14':
+ resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
@@ -1546,6 +1615,9 @@ packages:
resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
engines: {node: '>=4'}
+ blake3-wasm@2.1.5:
+ resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
+
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@@ -1633,6 +1705,10 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -1694,6 +1770,9 @@ packages:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
+ error-stack-parser-es@1.0.5:
+ resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==}
+
es-module-lexer@1.7.0:
resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
@@ -2198,6 +2277,10 @@ packages:
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
@@ -2477,6 +2560,11 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
+ miniflare@4.20260302.0:
+ resolution: {integrity: sha512-joGFywlo7HdfHXXGOkc6tDCVkwjEncM0mwEsMOLWcl+vDVJPj9HRV7JtEa0+lCpNOLdYw7mZNHYe12xz9KtJOw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
minimatch@10.2.2:
resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==}
engines: {node: 18 || 20 || >=22}
@@ -2626,6 +2714,9 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
+ path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+
path-to-regexp@8.3.0:
resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
@@ -2907,6 +2998,10 @@ packages:
babel-plugin-macros:
optional: true
+ supports-color@10.2.2:
+ resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
+ engines: {node: '>=18'}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2989,6 +3084,13 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ undici@7.18.2:
+ resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==}
+ engines: {node: '>=20.18.1'}
+
+ unenv@2.0.0-rc.24:
+ resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
+
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -3143,6 +3245,33 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
+ workerd@1.20260302.0:
+ resolution: {integrity: sha512-FhNdC8cenMDllI6bTktFgxP5Bn5ZEnGtofgKipY6pW9jtq708D1DeGI6vGad78KQLBGaDwFy1eThjCoLYgFfog==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ wrangler@4.68.1:
+ resolution: {integrity: sha512-G+TI3k/olEGBAVkPtUlhAX/DIbL/190fv3aK+r+45/wPclNEymjxCc35T8QGTDhc2fEMXiw51L5bH9aNsBg+yQ==}
+ engines: {node: '>=20.0.0'}
+ hasBin: true
+ peerDependencies:
+ '@cloudflare/workers-types': ^4.20260302.0
+ peerDependenciesMeta:
+ '@cloudflare/workers-types':
+ optional: true
+
+ ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
yaml@2.8.2:
resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
engines: {node: '>= 14.6'}
@@ -3152,6 +3281,12 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ youch-core@0.3.3:
+ resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==}
+
+ youch@4.1.0-beta.10:
+ resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==}
+
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
@@ -3323,6 +3458,33 @@ snapshots:
human-id: 4.1.3
prettier: 2.8.8
+ '@cloudflare/kv-asset-handler@0.4.2': {}
+
+ '@cloudflare/unenv-preset@2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260302.0)':
+ dependencies:
+ unenv: 2.0.0-rc.24
+ optionalDependencies:
+ workerd: 1.20260302.0
+
+ '@cloudflare/workerd-darwin-64@1.20260302.0':
+ optional: true
+
+ '@cloudflare/workerd-darwin-arm64@1.20260302.0':
+ optional: true
+
+ '@cloudflare/workerd-linux-64@1.20260302.0':
+ optional: true
+
+ '@cloudflare/workerd-linux-arm64@1.20260302.0':
+ optional: true
+
+ '@cloudflare/workerd-windows-64@1.20260302.0':
+ optional: true
+
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
'@emnapi/runtime@1.8.1':
dependencies:
tslib: 2.8.1
@@ -3495,8 +3657,7 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
- '@img/colour@1.0.0':
- optional: true
+ '@img/colour@1.0.0': {}
'@img/sharp-darwin-arm64@0.34.5':
optionalDependencies:
@@ -3618,6 +3779,11 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
'@manypkg/find-root@1.1.0':
dependencies:
'@babel/runtime': 7.28.6
@@ -3704,6 +3870,18 @@ snapshots:
'@orama/orama@3.1.18': {}
+ '@poppinss/colors@4.1.6':
+ dependencies:
+ kleur: 4.1.5
+
+ '@poppinss/dumper@0.6.5':
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@sindresorhus/is': 7.2.0
+ supports-color: 10.2.2
+
+ '@poppinss/exception@1.2.3': {}
+
'@radix-ui/number@1.1.1': {}
'@radix-ui/primitive@1.1.3': {}
@@ -4191,6 +4369,10 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {}
+ '@sindresorhus/is@7.2.0': {}
+
+ '@speed-highlight/core@1.2.14': {}
+
'@standard-schema/spec@1.1.0': {}
'@swc/helpers@0.5.15':
@@ -4529,6 +4711,8 @@ snapshots:
dependencies:
is-windows: 1.0.2
+ blake3-wasm@2.1.5: {}
+
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
@@ -4599,6 +4783,8 @@ snapshots:
concat-map@0.0.1: {}
+ cookie@1.1.1: {}
+
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -4647,6 +4833,8 @@ snapshots:
entities@6.0.1: {}
+ error-stack-parser-es@1.0.5: {}
+
es-module-lexer@1.7.0: {}
esast-util-from-estree@2.0.0:
@@ -5264,6 +5452,8 @@ snapshots:
dependencies:
json-buffer: 3.0.1
+ kleur@4.1.5: {}
+
levn@0.4.1:
dependencies:
prelude-ls: 1.2.1
@@ -5792,6 +5982,18 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.1
+ miniflare@4.20260302.0:
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ sharp: 0.34.5
+ undici: 7.18.2
+ workerd: 1.20260302.0
+ ws: 8.18.0
+ youch: 4.1.0-beta.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
minimatch@10.2.2:
dependencies:
brace-expansion: 5.0.3
@@ -5932,6 +6134,8 @@ snapshots:
path-key@3.1.1: {}
+ path-to-regexp@6.3.0: {}
+
path-to-regexp@8.3.0: {}
path-type@4.0.0: {}
@@ -6209,7 +6413,6 @@ snapshots:
'@img/sharp-win32-arm64': 0.34.5
'@img/sharp-win32-ia32': 0.34.5
'@img/sharp-win32-x64': 0.34.5
- optional: true
shebang-command@2.0.0:
dependencies:
@@ -6277,6 +6480,8 @@ snapshots:
client-only: 0.0.1
react: 19.2.4
+ supports-color@10.2.2: {}
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -6348,6 +6553,12 @@ snapshots:
undici-types@6.21.0: {}
+ undici@7.18.2: {}
+
+ unenv@2.0.0-rc.24:
+ dependencies:
+ pathe: 2.0.3
+
unified@11.0.5:
dependencies:
'@types/unist': 3.0.3
@@ -6493,11 +6704,50 @@ snapshots:
word-wrap@1.2.5: {}
+ workerd@1.20260302.0:
+ optionalDependencies:
+ '@cloudflare/workerd-darwin-64': 1.20260302.0
+ '@cloudflare/workerd-darwin-arm64': 1.20260302.0
+ '@cloudflare/workerd-linux-64': 1.20260302.0
+ '@cloudflare/workerd-linux-arm64': 1.20260302.0
+ '@cloudflare/workerd-windows-64': 1.20260302.0
+
+ wrangler@4.68.1:
+ dependencies:
+ '@cloudflare/kv-asset-handler': 0.4.2
+ '@cloudflare/unenv-preset': 2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260302.0)
+ blake3-wasm: 2.1.5
+ esbuild: 0.27.3
+ miniflare: 4.20260302.0
+ path-to-regexp: 6.3.0
+ unenv: 2.0.0-rc.24
+ workerd: 1.20260302.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ ws@8.18.0: {}
+
yaml@2.8.2:
optional: true
yocto-queue@0.1.0: {}
+ youch-core@0.3.3:
+ dependencies:
+ '@poppinss/exception': 1.2.3
+ error-stack-parser-es: 1.0.5
+
+ youch@4.1.0-beta.10:
+ dependencies:
+ '@poppinss/colors': 4.1.6
+ '@poppinss/dumper': 0.6.5
+ '@speed-highlight/core': 1.2.14
+ cookie: 1.1.1
+ youch-core: 0.3.3
+
zod@4.3.6: {}
zwitch@2.0.4: {}
diff --git a/scripts/deploy-docs.sh b/scripts/deploy-docs.sh
new file mode 100755
index 0000000..e4194e7
--- /dev/null
+++ b/scripts/deploy-docs.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+# Load environment variables from .env file
+if [ -f .env ]; then
+ export $(cat .env | grep -v '^#' | xargs)
+fi
+
+# Check required environment variables
+if [ -z "$CLOUDFLARE_API_TOKEN" ]; then
+ echo "Error: CLOUDFLARE_API_TOKEN not set"
+ exit 1
+fi
+
+if [ -z "$CLOUDFLARE_ACCOUNT_ID" ]; then
+ echo "Error: CLOUDFLARE_ACCOUNT_ID not set"
+ exit 1
+fi
+
+if [ -z "$CLOUDFLARE_PROJECT_NAME" ]; then
+ echo "Error: CLOUDFLARE_PROJECT_NAME not set"
+ exit 1
+fi
+
+echo "Building documentation site..."
+pnpm --filter @ts-contract/docs build
+
+if [ ! -d "apps/docs/out" ]; then
+ echo "Error: Build output directory apps/docs/out does not exist"
+ exit 1
+fi
+
+echo "Deploying to Cloudflare Pages..."
+echo "Project: $CLOUDFLARE_PROJECT_NAME"
+
+# Use local wrangler installation
+pnpm exec wrangler pages deploy apps/docs/out \
+ --project-name="$CLOUDFLARE_PROJECT_NAME" \
+ --branch=main
+
+echo "Deployment complete!"