octocms 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agentDocs-BKJBT3HN.js → agentDocs-LCTKE4NJ.js} +2 -2
- package/dist/{chunk-SIXGLITH.js → chunk-37T54ASM.js} +18 -4
- package/dist/{chunk-SIXGLITH.js.map → chunk-37T54ASM.js.map} +1 -1
- package/dist/chunk-PFWKOLV4.js +7 -0
- package/dist/chunk-PFWKOLV4.js.map +1 -0
- package/dist/cli/index.js +6 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/{init-ESHPKWKN.js → init-SGG3EI5G.js} +41 -6
- package/dist/init-SGG3EI5G.js.map +1 -0
- package/dist/{update-YDXCLS6L.js → update-6ZBUX6O4.js} +2 -2
- package/package.json +1 -1
- package/dist/init-ESHPKWKN.js.map +0 -1
- /package/dist/{agentDocs-BKJBT3HN.js.map → agentDocs-LCTKE4NJ.js.map} +0 -0
- /package/dist/{update-YDXCLS6L.js.map → update-6ZBUX6O4.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
agentsMdSection,
|
|
3
3
|
agentsMdTemplate
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-37T54ASM.js";
|
|
5
5
|
import {
|
|
6
6
|
log
|
|
7
7
|
} from "./chunk-6PHFHGTZ.js";
|
|
@@ -35,4 +35,4 @@ async function agentDocsCommand(projectRoot) {
|
|
|
35
35
|
export {
|
|
36
36
|
agentDocsCommand
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=agentDocs-
|
|
38
|
+
//# sourceMappingURL=agentDocs-LCTKE4NJ.js.map
|
|
@@ -250,11 +250,25 @@ Built with [OctoCMS](https://octocms.com) \u2014 a file-based CMS on Next.js.
|
|
|
250
250
|
|
|
251
251
|
## Setup
|
|
252
252
|
|
|
253
|
-
### 1.
|
|
253
|
+
### 1. Install dependencies
|
|
254
|
+
|
|
255
|
+
\`\`\`bash
|
|
256
|
+
npm install octocms next-auth @tanstack/react-query @mdxeditor/editor \\
|
|
257
|
+
@radix-ui/react-avatar @radix-ui/react-dialog @radix-ui/react-dropdown-menu \\
|
|
258
|
+
@radix-ui/react-label @radix-ui/react-select @radix-ui/react-slot \\
|
|
259
|
+
@radix-ui/react-tabs @radix-ui/react-toast \\
|
|
260
|
+
class-variance-authority clsx glob lucide-react minisearch octokit \\
|
|
261
|
+
react-markdown rehype-sanitize remark-gfm remark-mdx \\
|
|
262
|
+
sharp slugify sonner tailwind-merge zod
|
|
263
|
+
\`\`\`
|
|
264
|
+
|
|
265
|
+
> The exact list (with the right \`octocms\` version pin) is also printed by \`npx octocms init\` \u2014 copy it from there.
|
|
266
|
+
|
|
267
|
+
### 2. Create a GitHub App
|
|
254
268
|
|
|
255
269
|
Follow the [OctoCMS GitHub App setup guide](https://octocms.com/docs/github-app) to create a GitHub App for authentication.
|
|
256
270
|
|
|
257
|
-
###
|
|
271
|
+
### 3. Configure environment variables
|
|
258
272
|
|
|
259
273
|
Copy the values from your GitHub App into \`.env.local\`:
|
|
260
274
|
|
|
@@ -275,7 +289,7 @@ GITHUB_REPO_NAME=your_repo_name
|
|
|
275
289
|
# CMS_GITHUB_TOKEN=your_github_pat
|
|
276
290
|
\`\`\`
|
|
277
291
|
|
|
278
|
-
###
|
|
292
|
+
### 4. Run the dev server
|
|
279
293
|
|
|
280
294
|
\`\`\`bash
|
|
281
295
|
npm run dev
|
|
@@ -357,4 +371,4 @@ export {
|
|
|
357
371
|
agentsMdTemplate,
|
|
358
372
|
tsconfigPaths
|
|
359
373
|
};
|
|
360
|
-
//# sourceMappingURL=chunk-
|
|
374
|
+
//# sourceMappingURL=chunk-37T54ASM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/lib/templates.ts"],"sourcesContent":["/**\n * File templates used by `octocms init` and `octocms update`.\n */\n\nconst CODEGEN_BANNER = `/*\n * AUTO-GENERATED — DO NOT EDIT.\n * Generated from cms/octocms.config.ts.\n * Run \\`npx octocms types:gen\\` to regenerate.\n */\n\n`;\n\n/** Static cms/__generated__/types.ts for the helloPage demo schema. */\nexport const generatedTypesTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\nexport interface HelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface HelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: HelloPageFields;\n}\n\nexport type AnyEntry = HelloPageEntry;\n\nexport type EntryMap = {\n helloPage: HelloPageEntry;\n};\n`;\n\n/** Static cms/__generated__/enums.ts for the helloPage demo schema. */\nexport const generatedEnumsTemplate =\n CODEGEN_BANNER +\n `export const CollectionName = {\n HelloPage: 'helloPage',\n} as const;\nexport type CollectionName = (typeof CollectionName)[keyof typeof CollectionName];\n\nexport const COLLECTION_NAMES = ['helloPage'] as const;\n\nexport const FieldFormat = {\n String: 'string',\n Text: 'text',\n Markdown: 'markdown',\n Boolean: 'boolean',\n Reference: 'reference',\n Image: 'image',\n Number: 'number',\n Datetime: 'datetime',\n Json: 'json',\n Slug: 'slug',\n Select: 'select',\n Url: 'url',\n Color: 'color',\n Conditional: 'conditional',\n Richtext: 'richtext',\n} as const;\nexport type FieldFormat = (typeof FieldFormat)[keyof typeof FieldFormat];\n`;\n\n/** Static cms/__generated__/content.d.ts for the helloPage demo schema. */\nexport const generatedContentDeclsTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\n// Raw on-disk types (before query() processing).\nexport interface RawHelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface RawHelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: RawHelloPageFields;\n}\n`;\n\n/** Static cms/__generated__/index.ts — always the same shape. */\nexport const generatedIndexTemplate =\n CODEGEN_BANNER +\n `export * from './types';\nexport * from './enums';\nexport * from './query';\n`;\n\n/** Static cms/__generated__/query.ts — always the same shape (schema-independent). */\nexport const generatedQueryTemplate =\n CODEGEN_BANNER +\n `import { createQuery } from 'octocms/query';\nimport { configOctoCMS, type OctoConfig } from '../octocms.config';\nimport type { EntryMap } from './types';\n\n// configOctoCMS is widened to Config for admin internals; cast back to OctoConfig so\n// createQuery preserves literal collection/field names for type-safe queries.\nexport const query = createQuery<EntryMap, OctoConfig>(configOctoCMS as unknown as OctoConfig);\n`;\n\n/** Static cms/__generated__/configInit.ts — always the same shape (schema-independent). */\nexport const generatedConfigInitTemplate =\n CODEGEN_BANNER +\n `import { configOctoCMS } from '../octocms.config';\nimport { setConfig } from 'octocms/lib/configStore';\n\nsetConfig(configOctoCMS);\n`;\n\n/**\n * Minimal root layout written when `app/layout.tsx` does not already exist.\n * The configInit import is the critical side-effect; the rest is a Next.js\n * boilerplate shell.\n */\nexport const rootLayoutTemplate = `import '../cms/__generated__/configInit';\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'My App',\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n`;\n\n/** The one-liner prepended to an existing root layout to register the config. */\nexport const rootLayoutConfigInitImport = `import '../cms/__generated__/configInit';\\n`;\n\n/**\n * `../` count from `…/cms/layout.tsx` to project root (`cms/__generated__/configInit`).\n */\nexport const ADMIN_LAYOUT_CONFIG_INIT_DEPTH = {\n /** `app/cms/layout.tsx` */\n fromAppCms: 2,\n /** `src/app/cms/layout.tsx` */\n fromSrcAppCms: 3,\n} as const;\n\nexport function buildAdminLayoutTemplate(configInitUpSegments: number): string {\n const up = '../'.repeat(configInitUpSegments);\n return `import '${up}cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin';\n`;\n}\n\n/**\n * Number of `../` segments from `…/cms/[[...path]]/` up to the project root\n * (so `cms/__generated__/configInit` resolves).\n */\nexport const ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH = {\n /** `app/cms/[[...path]]/page.tsx` */\n fromAppCmsCatchAll: 3,\n /** `src/app/cms/[[...path]]/page.tsx` */\n fromSrcAppCmsCatchAll: 4,\n} as const;\n\n/**\n * Catch-all admin route — every \\`/cms/*\\` URL renders the package's\n * \\`AdminApp\\` async server component (awaits \\`params\\`, no outer Suspense).\n * Side-effect-imports \\`configInit\\` so server-action bundles register\n * \\`setConfig()\\` even when Next.js does not load \\`layout.tsx\\` for the POST.\n */\nexport function buildAdminPageTemplate(configInitUpSegments: number): string {\n const up = '../'.repeat(configInitUpSegments);\n return `// Registers setConfig() for server actions — some POST bundles skip layout.tsx.\nimport '${up}cms/__generated__/configInit';\n\nexport { AdminApp as default } from 'octocms/admin';\n`;\n}\n\n/**\n * Admin error boundary — rendered by Next.js when anything in the catch-all\n * tree throws during render. Re-uses the shared \\`AdminErrorView\\` so GitHub\n * config / auth / availability / rate-limit copy stays consistent with the\n * public-page error boundary.\n */\nexport const adminErrorTemplate = `'use client';\n\nexport { AdminError as default } from 'octocms/admin';\n`;\n\n/**\n * Historical template values used by \\`octocms update\\` to recognise an\n * unmodified install when migrating between routing models. Each entry is\n * the literal file content shipped by a previous OctoCMS version. If a\n * user-app file matches one of these byte-for-byte, \\`update\\` will replace\n * it with the current template; otherwise it leaves it alone.\n */\nexport const LEGACY_ADMIN_LAYOUT_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `import '../../cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin/pages/AdminLayout';\n`,\n];\n\nexport const LEGACY_ADMIN_CATCH_ALL_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `export { AdminApp as default } from 'octocms/admin/AdminApp';\n`,\n // 0.5.x — barrel re-export without configInit on the page (server actions could miss setConfig).\n `export { AdminApp as default } from 'octocms/admin';\n`,\n];\n\nexport const nextAuthRouteTemplate = `import NextAuth from 'next-auth';\nimport { authOptions } from 'octocms/admin/auth';\n\nconst handler = NextAuth(authOptions);\n\nexport { handler as GET, handler as POST };\n`;\n\n/**\n * Build a thin re-export Route Handler for the chat-agent SSE endpoint.\n *\n * The actual handler lives in `octocms/agent/chatApi.ts`\n * (`chatRoute` / `chatStatusRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so\n * `getAgentConfig()` resolves on cold start (Route Handlers don't run\n * `app/layout.tsx`); and\n * 2. re-exports `chatRoute` as `POST` and `chatStatusRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/api/agent/route.ts` that is 4;\n * for `src/app/api/agent/route.ts` it is 5.\n */\nexport function agentChatRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` + \\`agentConfig\\` into the\n// runtime stores so \\`getAgentConfig()\\` resolves on cold start. Route Handlers\n// don't run \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { chatRoute as POST, chatStatusRoute as GET } from 'octocms/agent';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the `/media/[...slug]` proxy.\n *\n * The actual handler lives in `octocms/admin/mediaRoute.ts`\n * (`mediaRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `mediaRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/media/[...slug]/route.ts`\n * that is 3; for the same file under `src/app/...` it is 4.\n */\nexport function mediaRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { mediaRoute as GET } from 'octocms/admin/mediaRoute';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the public-site `/api/search`\n * endpoint consumed by the `SearchBox` component shipped at\n * `octocms/components/public`.\n *\n * The actual handler lives in `octocms/admin/searchRoute.ts`\n * (`searchRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `searchRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/api/search/route.ts` that is 3;\n * for the same file under `src/app/...` it is 4.\n */\nexport function searchRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { searchRoute as GET } from 'octocms/admin/searchRoute';\n`;\n}\n\nexport function octoConfigTemplate(opts: { projectName: string; baseBranch: string; pointerBranch?: string }): string {\n const gitBlock = opts.pointerBranch\n ? ` git: {\\n baseBranch: '${opts.baseBranch}',\\n publishedPointerBranch: '${opts.pointerBranch}',\\n },`\n : ` git: { baseBranch: '${opts.baseBranch}' },`;\n\n return `import type { Config } from 'octocms/types';\nimport { defineConfig } from 'octocms/config';\n\nconst _typedConfigOctoCMS = defineConfig({\n projectName: '${opts.projectName}',\n${gitBlock}\n contentFolder: 'cms/content',\n mediaContentFolder: 'cms/media',\n mediaFolder: 'public/media',\n mediaAllowedFormats: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif'],\n collections: {\n helloPage: {\n label: 'Hello Page',\n fields: {\n title: { label: 'Title', format: 'string', entryTitle: true, required: true },\n description: { label: 'Description', format: 'text' },\n },\n },\n },\n});\n\nexport const configOctoCMS: Config = _typedConfigOctoCMS;\nexport type OctoConfig = typeof _typedConfigOctoCMS;\n`;\n}\n\nexport function nextConfigTemplate(): string {\n return `import type { NextConfig } from 'next';\nimport { withOctoCMS } from 'octocms/config';\nimport { configOctoCMS } from './cms/octocms.config';\n\nexport { configOctoCMS } from './cms/octocms.config';\nexport type { OctoConfig } from './cms/octocms.config';\n\nconst nextConfig: NextConfig = {};\n\nexport default withOctoCMS(nextConfig, configOctoCMS);\n`;\n}\n\nexport function demoHelloPageJson(): string {\n return JSON.stringify(\n {\n sys: { id: '0000', type: 'helloPage', status: 'merged' },\n fields: {\n title: 'Hello World',\n description: 'Welcome to your new OctoCMS site! Edit this content in the CMS admin panel.',\n },\n },\n null,\n 2,\n );\n}\n\nexport const helloPageTemplate = `import { query } from 'cms/__generated__/query';\n\nexport default async function HelloPage() {\n const page = await query('helloPage').first();\n if (!page) return null;\n return (\n <main>\n <h1>{page.fields.title}</h1>\n <p>{page.fields.description}</p>\n </main>\n );\n}\n`;\n\nexport function readmeTemplate(projectName: string): string {\n return `# ${projectName}\n\nBuilt with [OctoCMS](https://octocms.com) — a file-based CMS on Next.js.\n\n## Setup\n\n### 1. Create a GitHub App\n\nFollow the [OctoCMS GitHub App setup guide](https://octocms.com/docs/github-app) to create a GitHub App for authentication.\n\n### 2. Configure environment variables\n\nCopy the values from your GitHub App into \\`.env.local\\`:\n\n\\`\\`\\`bash\n# GitHub App credentials (required for CMS auth)\nGITHUB_ID=your_github_app_client_id\nGITHUB_SECRET=your_github_app_client_secret\n\n# NextAuth (generate secret: openssl rand -base64 32)\nNEXTAUTH_SECRET=your_nextauth_secret\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=your_github_username_or_org\nGITHUB_REPO_NAME=your_repo_name\n\n# Optional: static GitHub token for private repos / higher API rate limits\n# CMS_GITHUB_TOKEN=your_github_pat\n\\`\\`\\`\n\n### 3. Run the dev server\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n\nOpen [http://localhost:3000/cms](http://localhost:3000/cms) to access the CMS admin.\n`;\n}\n\nexport function envLocalTemplate(): string {\n return `# GitHub App credentials (required for CMS auth)\n# Create a GitHub App at: https://github.com/settings/apps/new\nGITHUB_ID=\nGITHUB_SECRET=\n\n# NextAuth secret — generate with: openssl rand -base64 32\nNEXTAUTH_SECRET=\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=\nGITHUB_REPO_NAME=\n\n# Optional: static GitHub token for private repos or higher API rate limits\n# CMS_GITHUB_TOKEN=\n`;\n}\n\nconst AGENT_DOCS_MARKER = '<!-- octocms:agent-docs -->';\n\nexport function agentsMdSection(): string {\n return `${AGENT_DOCS_MARKER}\n## OctoCMS — AI Content Management\n\nFor tasks that involve creating, editing, or deleting CMS content directly (without the admin UI), read the auto-generated agent docs:\n\n- **\\`octocms/docs/overview.md\\`** — How to find, create, update, and delete content entries via file operations\n- **\\`octocms/docs/schema.md\\`** — Per-collection field definitions, example JSON, and file path conventions\n\nThese docs are generated from \\`cms/octocms.config.ts\\`. Regenerate after schema changes: \\`npm run agent-docs:gen\\`.`;\n}\n\nexport function agentsMdTemplate(): string {\n return `# Project Guidelines\n\n${agentsMdSection()}\n`;\n}\n\nexport function tsconfigPaths(): Record<string, string[]> {\n return {\n 'cms/__generated__': ['./cms/__generated__/index.ts'],\n 'cms/__generated__/*': ['./cms/__generated__/*'],\n '@/*': ['./src/*'],\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../cli/lib/templates.ts"],"sourcesContent":["/**\n * File templates used by `octocms init` and `octocms update`.\n */\n\nconst CODEGEN_BANNER = `/*\n * AUTO-GENERATED — DO NOT EDIT.\n * Generated from cms/octocms.config.ts.\n * Run \\`npx octocms types:gen\\` to regenerate.\n */\n\n`;\n\n/** Static cms/__generated__/types.ts for the helloPage demo schema. */\nexport const generatedTypesTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\nexport interface HelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface HelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: HelloPageFields;\n}\n\nexport type AnyEntry = HelloPageEntry;\n\nexport type EntryMap = {\n helloPage: HelloPageEntry;\n};\n`;\n\n/** Static cms/__generated__/enums.ts for the helloPage demo schema. */\nexport const generatedEnumsTemplate =\n CODEGEN_BANNER +\n `export const CollectionName = {\n HelloPage: 'helloPage',\n} as const;\nexport type CollectionName = (typeof CollectionName)[keyof typeof CollectionName];\n\nexport const COLLECTION_NAMES = ['helloPage'] as const;\n\nexport const FieldFormat = {\n String: 'string',\n Text: 'text',\n Markdown: 'markdown',\n Boolean: 'boolean',\n Reference: 'reference',\n Image: 'image',\n Number: 'number',\n Datetime: 'datetime',\n Json: 'json',\n Slug: 'slug',\n Select: 'select',\n Url: 'url',\n Color: 'color',\n Conditional: 'conditional',\n Richtext: 'richtext',\n} as const;\nexport type FieldFormat = (typeof FieldFormat)[keyof typeof FieldFormat];\n`;\n\n/** Static cms/__generated__/content.d.ts for the helloPage demo schema. */\nexport const generatedContentDeclsTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\n// Raw on-disk types (before query() processing).\nexport interface RawHelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface RawHelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: RawHelloPageFields;\n}\n`;\n\n/** Static cms/__generated__/index.ts — always the same shape. */\nexport const generatedIndexTemplate =\n CODEGEN_BANNER +\n `export * from './types';\nexport * from './enums';\nexport * from './query';\n`;\n\n/** Static cms/__generated__/query.ts — always the same shape (schema-independent). */\nexport const generatedQueryTemplate =\n CODEGEN_BANNER +\n `import { createQuery } from 'octocms/query';\nimport { configOctoCMS, type OctoConfig } from '../octocms.config';\nimport type { EntryMap } from './types';\n\n// configOctoCMS is widened to Config for admin internals; cast back to OctoConfig so\n// createQuery preserves literal collection/field names for type-safe queries.\nexport const query = createQuery<EntryMap, OctoConfig>(configOctoCMS as unknown as OctoConfig);\n`;\n\n/** Static cms/__generated__/configInit.ts — always the same shape (schema-independent). */\nexport const generatedConfigInitTemplate =\n CODEGEN_BANNER +\n `import { configOctoCMS } from '../octocms.config';\nimport { setConfig } from 'octocms/lib/configStore';\n\nsetConfig(configOctoCMS);\n`;\n\n/**\n * Minimal root layout written when `app/layout.tsx` does not already exist.\n * The configInit import is the critical side-effect; the rest is a Next.js\n * boilerplate shell.\n */\nexport const rootLayoutTemplate = `import '../cms/__generated__/configInit';\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'My App',\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n`;\n\n/** The one-liner prepended to an existing root layout to register the config. */\nexport const rootLayoutConfigInitImport = `import '../cms/__generated__/configInit';\\n`;\n\n/**\n * `../` count from `…/cms/layout.tsx` to project root (`cms/__generated__/configInit`).\n */\nexport const ADMIN_LAYOUT_CONFIG_INIT_DEPTH = {\n /** `app/cms/layout.tsx` */\n fromAppCms: 2,\n /** `src/app/cms/layout.tsx` */\n fromSrcAppCms: 3,\n} as const;\n\nexport function buildAdminLayoutTemplate(configInitUpSegments: number): string {\n const up = '../'.repeat(configInitUpSegments);\n return `import '${up}cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin';\n`;\n}\n\n/**\n * Number of `../` segments from `…/cms/[[...path]]/` up to the project root\n * (so `cms/__generated__/configInit` resolves).\n */\nexport const ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH = {\n /** `app/cms/[[...path]]/page.tsx` */\n fromAppCmsCatchAll: 3,\n /** `src/app/cms/[[...path]]/page.tsx` */\n fromSrcAppCmsCatchAll: 4,\n} as const;\n\n/**\n * Catch-all admin route — every \\`/cms/*\\` URL renders the package's\n * \\`AdminApp\\` async server component (awaits \\`params\\`, no outer Suspense).\n * Side-effect-imports \\`configInit\\` so server-action bundles register\n * \\`setConfig()\\` even when Next.js does not load \\`layout.tsx\\` for the POST.\n */\nexport function buildAdminPageTemplate(configInitUpSegments: number): string {\n const up = '../'.repeat(configInitUpSegments);\n return `// Registers setConfig() for server actions — some POST bundles skip layout.tsx.\nimport '${up}cms/__generated__/configInit';\n\nexport { AdminApp as default } from 'octocms/admin';\n`;\n}\n\n/**\n * Admin error boundary — rendered by Next.js when anything in the catch-all\n * tree throws during render. Re-uses the shared \\`AdminErrorView\\` so GitHub\n * config / auth / availability / rate-limit copy stays consistent with the\n * public-page error boundary.\n */\nexport const adminErrorTemplate = `'use client';\n\nexport { AdminError as default } from 'octocms/admin';\n`;\n\n/**\n * Historical template values used by \\`octocms update\\` to recognise an\n * unmodified install when migrating between routing models. Each entry is\n * the literal file content shipped by a previous OctoCMS version. If a\n * user-app file matches one of these byte-for-byte, \\`update\\` will replace\n * it with the current template; otherwise it leaves it alone.\n */\nexport const LEGACY_ADMIN_LAYOUT_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `import '../../cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin/pages/AdminLayout';\n`,\n];\n\nexport const LEGACY_ADMIN_CATCH_ALL_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `export { AdminApp as default } from 'octocms/admin/AdminApp';\n`,\n // 0.5.x — barrel re-export without configInit on the page (server actions could miss setConfig).\n `export { AdminApp as default } from 'octocms/admin';\n`,\n];\n\nexport const nextAuthRouteTemplate = `import NextAuth from 'next-auth';\nimport { authOptions } from 'octocms/admin/auth';\n\nconst handler = NextAuth(authOptions);\n\nexport { handler as GET, handler as POST };\n`;\n\n/**\n * Build a thin re-export Route Handler for the chat-agent SSE endpoint.\n *\n * The actual handler lives in `octocms/agent/chatApi.ts`\n * (`chatRoute` / `chatStatusRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so\n * `getAgentConfig()` resolves on cold start (Route Handlers don't run\n * `app/layout.tsx`); and\n * 2. re-exports `chatRoute` as `POST` and `chatStatusRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/api/agent/route.ts` that is 4;\n * for `src/app/api/agent/route.ts` it is 5.\n */\nexport function agentChatRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` + \\`agentConfig\\` into the\n// runtime stores so \\`getAgentConfig()\\` resolves on cold start. Route Handlers\n// don't run \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { chatRoute as POST, chatStatusRoute as GET } from 'octocms/agent';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the `/media/[...slug]` proxy.\n *\n * The actual handler lives in `octocms/admin/mediaRoute.ts`\n * (`mediaRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `mediaRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/media/[...slug]/route.ts`\n * that is 3; for the same file under `src/app/...` it is 4.\n */\nexport function mediaRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { mediaRoute as GET } from 'octocms/admin/mediaRoute';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the public-site `/api/search`\n * endpoint consumed by the `SearchBox` component shipped at\n * `octocms/components/public`.\n *\n * The actual handler lives in `octocms/admin/searchRoute.ts`\n * (`searchRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `searchRoute` as `GET`.\n *\n * `depth` is the number of `..` segments needed to reach the project root\n * from the route file's directory. For `app/api/search/route.ts` that is 3;\n * for the same file under `src/app/...` it is 4.\n */\nexport function searchRouteTemplate(opts: { depth: number }): string {\n const upDirs = '../'.repeat(opts.depth);\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\nimport '${upDirs}cms/__generated__/configInit';\n\nexport { searchRoute as GET } from 'octocms/admin/searchRoute';\n`;\n}\n\nexport function octoConfigTemplate(opts: { projectName: string; baseBranch: string; pointerBranch?: string }): string {\n const gitBlock = opts.pointerBranch\n ? ` git: {\\n baseBranch: '${opts.baseBranch}',\\n publishedPointerBranch: '${opts.pointerBranch}',\\n },`\n : ` git: { baseBranch: '${opts.baseBranch}' },`;\n\n return `import type { Config } from 'octocms/types';\nimport { defineConfig } from 'octocms/config';\n\nconst _typedConfigOctoCMS = defineConfig({\n projectName: '${opts.projectName}',\n${gitBlock}\n contentFolder: 'cms/content',\n mediaContentFolder: 'cms/media',\n mediaFolder: 'public/media',\n mediaAllowedFormats: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif'],\n collections: {\n helloPage: {\n label: 'Hello Page',\n fields: {\n title: { label: 'Title', format: 'string', entryTitle: true, required: true },\n description: { label: 'Description', format: 'text' },\n },\n },\n },\n});\n\nexport const configOctoCMS: Config = _typedConfigOctoCMS;\nexport type OctoConfig = typeof _typedConfigOctoCMS;\n`;\n}\n\nexport function nextConfigTemplate(): string {\n return `import type { NextConfig } from 'next';\nimport { withOctoCMS } from 'octocms/config';\nimport { configOctoCMS } from './cms/octocms.config';\n\nexport { configOctoCMS } from './cms/octocms.config';\nexport type { OctoConfig } from './cms/octocms.config';\n\nconst nextConfig: NextConfig = {};\n\nexport default withOctoCMS(nextConfig, configOctoCMS);\n`;\n}\n\nexport function demoHelloPageJson(): string {\n return JSON.stringify(\n {\n sys: { id: '0000', type: 'helloPage', status: 'merged' },\n fields: {\n title: 'Hello World',\n description: 'Welcome to your new OctoCMS site! Edit this content in the CMS admin panel.',\n },\n },\n null,\n 2,\n );\n}\n\nexport const helloPageTemplate = `import { query } from 'cms/__generated__/query';\n\nexport default async function HelloPage() {\n const page = await query('helloPage').first();\n if (!page) return null;\n return (\n <main>\n <h1>{page.fields.title}</h1>\n <p>{page.fields.description}</p>\n </main>\n );\n}\n`;\n\nexport function readmeTemplate(projectName: string): string {\n return `# ${projectName}\n\nBuilt with [OctoCMS](https://octocms.com) — a file-based CMS on Next.js.\n\n## Setup\n\n### 1. Install dependencies\n\n\\`\\`\\`bash\nnpm install octocms next-auth @tanstack/react-query @mdxeditor/editor \\\\\n @radix-ui/react-avatar @radix-ui/react-dialog @radix-ui/react-dropdown-menu \\\\\n @radix-ui/react-label @radix-ui/react-select @radix-ui/react-slot \\\\\n @radix-ui/react-tabs @radix-ui/react-toast \\\\\n class-variance-authority clsx glob lucide-react minisearch octokit \\\\\n react-markdown rehype-sanitize remark-gfm remark-mdx \\\\\n sharp slugify sonner tailwind-merge zod\n\\`\\`\\`\n\n> The exact list (with the right \\`octocms\\` version pin) is also printed by \\`npx octocms init\\` — copy it from there.\n\n### 2. Create a GitHub App\n\nFollow the [OctoCMS GitHub App setup guide](https://octocms.com/docs/github-app) to create a GitHub App for authentication.\n\n### 3. Configure environment variables\n\nCopy the values from your GitHub App into \\`.env.local\\`:\n\n\\`\\`\\`bash\n# GitHub App credentials (required for CMS auth)\nGITHUB_ID=your_github_app_client_id\nGITHUB_SECRET=your_github_app_client_secret\n\n# NextAuth (generate secret: openssl rand -base64 32)\nNEXTAUTH_SECRET=your_nextauth_secret\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=your_github_username_or_org\nGITHUB_REPO_NAME=your_repo_name\n\n# Optional: static GitHub token for private repos / higher API rate limits\n# CMS_GITHUB_TOKEN=your_github_pat\n\\`\\`\\`\n\n### 4. Run the dev server\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n\nOpen [http://localhost:3000/cms](http://localhost:3000/cms) to access the CMS admin.\n`;\n}\n\nexport function envLocalTemplate(): string {\n return `# GitHub App credentials (required for CMS auth)\n# Create a GitHub App at: https://github.com/settings/apps/new\nGITHUB_ID=\nGITHUB_SECRET=\n\n# NextAuth secret — generate with: openssl rand -base64 32\nNEXTAUTH_SECRET=\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=\nGITHUB_REPO_NAME=\n\n# Optional: static GitHub token for private repos or higher API rate limits\n# CMS_GITHUB_TOKEN=\n`;\n}\n\nconst AGENT_DOCS_MARKER = '<!-- octocms:agent-docs -->';\n\nexport function agentsMdSection(): string {\n return `${AGENT_DOCS_MARKER}\n## OctoCMS — AI Content Management\n\nFor tasks that involve creating, editing, or deleting CMS content directly (without the admin UI), read the auto-generated agent docs:\n\n- **\\`octocms/docs/overview.md\\`** — How to find, create, update, and delete content entries via file operations\n- **\\`octocms/docs/schema.md\\`** — Per-collection field definitions, example JSON, and file path conventions\n\nThese docs are generated from \\`cms/octocms.config.ts\\`. Regenerate after schema changes: \\`npm run agent-docs:gen\\`.`;\n}\n\nexport function agentsMdTemplate(): string {\n return `# Project Guidelines\n\n${agentsMdSection()}\n`;\n}\n\nexport function tsconfigPaths(): Record<string, string[]> {\n return {\n 'cms/__generated__': ['./cms/__generated__/index.ts'],\n 'cms/__generated__/*': ['./cms/__generated__/*'],\n '@/*': ['./src/*'],\n };\n}\n"],"mappings":";AAIA,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShB,IAAM,yBACX,iBACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBK,IAAM,yBACX,iBACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BK,IAAM,gCACX,iBACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeK,IAAM,yBACX,iBACA;AAAA;AAAA;AAAA;AAMK,IAAM,yBACX,iBACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUK,IAAM,8BACX,iBACA;AAAA;AAAA;AAAA;AAAA;AAWK,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB3B,IAAM,6BAA6B;AAAA;AAKnC,IAAM,iCAAiC;AAAA;AAAA,EAE5C,YAAY;AAAA;AAAA,EAEZ,eAAe;AACjB;AAEO,SAAS,yBAAyB,sBAAsC;AAC7E,QAAM,KAAK,MAAM,OAAO,oBAAoB;AAC5C,SAAO,WAAW,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAMtB;AAMO,IAAM,oCAAoC;AAAA;AAAA,EAE/C,oBAAoB;AAAA;AAAA,EAEpB,uBAAuB;AACzB;AAQO,SAAS,uBAAuB,sBAAsC;AAC3E,QAAM,KAAK,MAAM,OAAO,oBAAoB;AAC5C,SAAO;AAAA,UACC,EAAE;AAAA;AAAA;AAAA;AAIZ;AAQO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAY3B,IAAM,gCAAuD;AAAA;AAAA,EAElE;AAAA;AAAA;AAAA;AAAA;AAAA;AAMF;AAEO,IAAM,mCAA0D;AAAA;AAAA,EAErE;AAAA;AAAA;AAAA,EAGA;AAAA;AAEF;AAEO,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB9B,SAAS,uBAAuB,MAAiC;AACtE,QAAM,SAAS,MAAM,OAAO,KAAK,KAAK;AACtC,SAAO;AAAA;AAAA;AAAA,UAGC,MAAM;AAAA;AAAA;AAAA;AAIhB;AAeO,SAAS,mBAAmB,MAAiC;AAClE,QAAM,SAAS,MAAM,OAAO,KAAK,KAAK;AACtC,SAAO;AAAA;AAAA;AAAA,UAGC,MAAM;AAAA;AAAA;AAAA;AAIhB;AA4BO,SAAS,mBAAmB,MAAmF;AACpH,QAAM,WAAW,KAAK,gBAClB;AAAA,mBAA8B,KAAK,UAAU;AAAA,+BAAoC,KAAK,aAAa;AAAA,QACnG,yBAAyB,KAAK,UAAU;AAE5C,SAAO;AAAA;AAAA;AAAA;AAAA,kBAIS,KAAK,WAAW;AAAA,EAChC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBV;AAEO,SAAS,qBAA6B;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWT;AAEO,SAAS,oBAA4B;AAC1C,SAAO,KAAK;AAAA,IACV;AAAA,MACE,KAAK,EAAE,IAAI,QAAQ,MAAM,aAAa,QAAQ,SAAS;AAAA,MACvD,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc1B,SAAS,eAAe,aAA6B;AAC1D,SAAO,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqDzB;AAEO,SAAS,mBAA2B;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBT;AAEA,IAAM,oBAAoB;AAEnB,SAAS,kBAA0B;AACxC,SAAO,GAAG,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS7B;AAEO,SAAS,mBAA2B;AACzC,SAAO;AAAA;AAAA,EAEP,gBAAgB,CAAC;AAAA;AAEnB;AAEO,SAAS,gBAA0C;AACxD,SAAO;AAAA,IACL,qBAAqB,CAAC,8BAA8B;AAAA,IACpD,uBAAuB,CAAC,uBAAuB;AAAA,IAC/C,OAAO,CAAC,SAAS;AAAA,EACnB;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"octocms\",\n \"version\": \"0.4.7\",\n \"description\": \"A file-based CMS for Next.js — schema-driven, Git-backed, no database\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"keywords\": [\n \"cms\",\n \"nextjs\",\n \"headless-cms\",\n \"git-cms\",\n \"content-management\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/octocms/octocms.git\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.ts\",\n \"require\": \"./dist/query.cjs\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"require\": \"./dist/config.cjs\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.ts\",\n \"require\": \"./dist/defineConfig.cjs\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"require\": \"./dist/types.cjs\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.ts\",\n \"require\": \"./dist/withOctoCMS.cjs\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.cjs\",\n \"import\": \"./dist/agent/index.js\"\n },\n \"./schema\": {\n \"types\": \"./dist/schema/index.d.ts\",\n \"import\": \"./dist/schema/index.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.ts\",\n \"require\": \"./dist/components/public/index.cjs\",\n \"import\": \"./dist/components/public/index.js\"\n },\n \"./lib/configStore\": {\n \"types\": \"./dist/lib/configStore.d.ts\",\n \"require\": \"./dist/lib/configStore.cjs\",\n \"import\": \"./dist/lib/configStore.js\"\n },\n \"./admin\": {\n \"types\": \"./dist/admin/index.d.ts\",\n \"import\": \"./dist/admin/index.js\"\n },\n \"./admin/*\": {\n \"types\": \"./dist/admin/*.d.ts\",\n \"import\": \"./dist/admin/*.js\"\n },\n \"./components/*\": {\n \"types\": \"./dist/components/*.d.ts\",\n \"import\": \"./dist/components/*.js\"\n },\n \"./hooks/*\": {\n \"types\": \"./dist/hooks/*.d.ts\",\n \"import\": \"./dist/hooks/*.js\"\n },\n \"./lib/*\": {\n \"types\": \"./dist/lib/*.d.ts\",\n \"import\": \"./dist/lib/*.js\"\n },\n \"./schema/*\": {\n \"types\": \"./dist/schema/*.d.ts\",\n \"import\": \"./dist/schema/*.js\"\n },\n \"./utils/*\": {\n \"types\": \"./dist/utils/*.d.ts\",\n \"import\": \"./dist/utils/*.js\"\n },\n \"./globals.css\": \"./globals.css\",\n \"./docs/*\": \"./docs/*\"\n },\n \"bin\": {\n \"octocms\": \"dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"docs\",\n \"globals.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json && cp globals.css dist/globals.css\",\n \"prepublishOnly\": \"npm run checks && npm run build\",\n \"lint\": \"oxlint .\",\n \"lint:fix\": \"oxlint --fix .\",\n \"fmt\": \"oxfmt .\",\n \"fmt:check\": \"oxfmt --check .\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"ts-check\": \"tsc --noEmit --incremental false\",\n \"checks\": \"npm run lint && npm run ts-check && npm run fmt:check && npm run test:run\",\n \"checks:fix\": \"npm run lint:fix && npm run fmt && npm run test:run\"\n },\n \"peerDependencies\": {\n \"@anthropic-ai/sdk\": \">=0.91\",\n \"@huggingface/transformers\": \">=4\",\n \"@mdxeditor/editor\": \">=3\",\n \"@radix-ui/react-avatar\": \">=1\",\n \"@radix-ui/react-dialog\": \">=1\",\n \"@radix-ui/react-dropdown-menu\": \">=2\",\n \"@radix-ui/react-label\": \">=2\",\n \"@radix-ui/react-select\": \">=2\",\n \"@radix-ui/react-slot\": \">=1\",\n \"@radix-ui/react-tabs\": \">=1\",\n \"@radix-ui/react-toast\": \">=1\",\n \"@tanstack/react-query\": \">=5\",\n \"@tanstack/react-query-devtools\": \">=5\",\n \"class-variance-authority\": \">=0.7\",\n \"clsx\": \">=2\",\n \"glob\": \">=11\",\n \"lucide-react\": \">=1\",\n \"mammoth\": \">=1.12\",\n \"minisearch\": \">=7\",\n \"next\": \">=15\",\n \"next-auth\": \">=4\",\n \"octokit\": \">=4\",\n \"openai\": \">=4\",\n \"pdfjs-dist\": \">=4\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"react-markdown\": \">=10\",\n \"rehype-sanitize\": \">=6\",\n \"remark-gfm\": \">=4\",\n \"remark-mdx\": \">=3\",\n \"sharp\": \">=0.34\",\n \"slugify\": \">=1\",\n \"sonner\": \">=2\",\n \"tailwind-merge\": \">=3\",\n \"zod\": \">=4\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic-ai/sdk\": {\n \"optional\": true\n },\n \"@huggingface/transformers\": {\n \"optional\": true\n },\n \"mammoth\": {\n \"optional\": true\n },\n \"openai\": {\n \"optional\": true\n },\n \"pdfjs-dist\": {\n \"optional\": true\n },\n \"@tanstack/react-query-devtools\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.9\",\n \"@tanstack/react-query-devtools\": \"^5.100.9\",\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19.2.14\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitejs/plugin-react\": \"^6.0.1\",\n \"jsdom\": \"^29.0.1\",\n \"oxfmt\": \"^0.11.0\",\n \"oxlint\": \"^0.17.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.9.3\",\n \"vite-tsconfig-paths\": \"^6.1.1\",\n \"vitest\": \"^4.1.2\"\n }\n}\n"],"mappings":";AAEE,cAAW;","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
version
|
|
4
|
+
} from "../chunk-PFWKOLV4.js";
|
|
2
5
|
import {
|
|
3
6
|
resolveProjectRoot
|
|
4
7
|
} from "../chunk-TG624CCO.js";
|
|
@@ -8,9 +11,6 @@ import {
|
|
|
8
11
|
} from "../chunk-6PHFHGTZ.js";
|
|
9
12
|
import "../chunk-DDAAVRWG.js";
|
|
10
13
|
|
|
11
|
-
// package.json
|
|
12
|
-
var version = "0.4.5";
|
|
13
|
-
|
|
14
14
|
// cli/index.ts
|
|
15
15
|
var HELP = `
|
|
16
16
|
${fmt.bold("OctoCMS CLI")} v${version}
|
|
@@ -164,7 +164,7 @@ async function main() {
|
|
|
164
164
|
try {
|
|
165
165
|
switch (command) {
|
|
166
166
|
case "init": {
|
|
167
|
-
const { initCommand } = await import("../init-
|
|
167
|
+
const { initCommand } = await import("../init-SGG3EI5G.js");
|
|
168
168
|
await initCommand(process.cwd(), { yes: flags.yes === true });
|
|
169
169
|
break;
|
|
170
170
|
}
|
|
@@ -195,13 +195,13 @@ async function main() {
|
|
|
195
195
|
}
|
|
196
196
|
case "update": {
|
|
197
197
|
const projectRoot = resolveProjectRoot();
|
|
198
|
-
const { updateCommand } = await import("../update-
|
|
198
|
+
const { updateCommand } = await import("../update-6ZBUX6O4.js");
|
|
199
199
|
await updateCommand(projectRoot);
|
|
200
200
|
break;
|
|
201
201
|
}
|
|
202
202
|
case "agent-docs": {
|
|
203
203
|
const projectRoot = resolveProjectRoot();
|
|
204
|
-
const { agentDocsCommand } = await import("../agentDocs-
|
|
204
|
+
const { agentDocsCommand } = await import("../agentDocs-LCTKE4NJ.js");
|
|
205
205
|
await agentDocsCommand(projectRoot);
|
|
206
206
|
break;
|
|
207
207
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../package.json","../../cli/index.ts"],"sourcesContent":["{\n \"name\": \"octocms\",\n \"version\": \"0.4.5\",\n \"description\": \"A file-based CMS for Next.js — schema-driven, Git-backed, no database\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"keywords\": [\n \"cms\",\n \"nextjs\",\n \"headless-cms\",\n \"git-cms\",\n \"content-management\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/octocms/octocms.git\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.ts\",\n \"require\": \"./dist/query.cjs\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"require\": \"./dist/config.cjs\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.ts\",\n \"require\": \"./dist/defineConfig.cjs\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"require\": \"./dist/types.cjs\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.ts\",\n \"require\": \"./dist/withOctoCMS.cjs\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.cjs\",\n \"import\": \"./dist/agent/index.js\"\n },\n \"./schema\": {\n \"types\": \"./dist/schema/index.d.ts\",\n \"import\": \"./dist/schema/index.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.ts\",\n \"require\": \"./dist/components/public/index.cjs\",\n \"import\": \"./dist/components/public/index.js\"\n },\n \"./lib/configStore\": {\n \"types\": \"./dist/lib/configStore.d.ts\",\n \"require\": \"./dist/lib/configStore.cjs\",\n \"import\": \"./dist/lib/configStore.js\"\n },\n \"./admin\": {\n \"types\": \"./dist/admin/index.d.ts\",\n \"import\": \"./dist/admin/index.js\"\n },\n \"./admin/*\": {\n \"types\": \"./dist/admin/*.d.ts\",\n \"import\": \"./dist/admin/*.js\"\n },\n \"./components/*\": {\n \"types\": \"./dist/components/*.d.ts\",\n \"import\": \"./dist/components/*.js\"\n },\n \"./hooks/*\": {\n \"types\": \"./dist/hooks/*.d.ts\",\n \"import\": \"./dist/hooks/*.js\"\n },\n \"./lib/*\": {\n \"types\": \"./dist/lib/*.d.ts\",\n \"import\": \"./dist/lib/*.js\"\n },\n \"./schema/*\": {\n \"types\": \"./dist/schema/*.d.ts\",\n \"import\": \"./dist/schema/*.js\"\n },\n \"./utils/*\": {\n \"types\": \"./dist/utils/*.d.ts\",\n \"import\": \"./dist/utils/*.js\"\n },\n \"./globals.css\": \"./globals.css\",\n \"./docs/*\": \"./docs/*\"\n },\n \"bin\": {\n \"octocms\": \"dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"docs\",\n \"globals.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json && cp globals.css dist/globals.css\",\n \"prepublishOnly\": \"npm run checks && npm run build\",\n \"lint\": \"oxlint .\",\n \"lint:fix\": \"oxlint --fix .\",\n \"fmt\": \"oxfmt .\",\n \"fmt:check\": \"oxfmt --check .\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"ts-check\": \"tsc --noEmit --incremental false\",\n \"checks\": \"npm run lint && npm run ts-check && npm run fmt:check && npm run test:run\",\n \"checks:fix\": \"npm run lint:fix && npm run fmt && npm run test:run\"\n },\n \"peerDependencies\": {\n \"@anthropic-ai/sdk\": \">=0.91\",\n \"@huggingface/transformers\": \">=4\",\n \"@mdxeditor/editor\": \">=3\",\n \"@radix-ui/react-avatar\": \">=1\",\n \"@radix-ui/react-dialog\": \">=1\",\n \"@radix-ui/react-dropdown-menu\": \">=2\",\n \"@radix-ui/react-label\": \">=2\",\n \"@radix-ui/react-select\": \">=2\",\n \"@radix-ui/react-slot\": \">=1\",\n \"@radix-ui/react-tabs\": \">=1\",\n \"@radix-ui/react-toast\": \">=1\",\n \"@tanstack/react-query\": \">=5\",\n \"@tanstack/react-query-devtools\": \">=5\",\n \"class-variance-authority\": \">=0.7\",\n \"clsx\": \">=2\",\n \"glob\": \">=11\",\n \"lucide-react\": \">=1\",\n \"mammoth\": \">=1.12\",\n \"minisearch\": \">=7\",\n \"next\": \">=15\",\n \"next-auth\": \">=4\",\n \"octokit\": \">=4\",\n \"openai\": \">=4\",\n \"pdfjs-dist\": \">=4\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"react-markdown\": \">=10\",\n \"rehype-sanitize\": \">=6\",\n \"remark-gfm\": \">=4\",\n \"remark-mdx\": \">=3\",\n \"sharp\": \">=0.34\",\n \"slugify\": \">=1\",\n \"sonner\": \">=2\",\n \"tailwind-merge\": \">=3\",\n \"zod\": \">=4\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic-ai/sdk\": {\n \"optional\": true\n },\n \"@huggingface/transformers\": {\n \"optional\": true\n },\n \"mammoth\": {\n \"optional\": true\n },\n \"openai\": {\n \"optional\": true\n },\n \"pdfjs-dist\": {\n \"optional\": true\n },\n \"@tanstack/react-query-devtools\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.9\",\n \"@tanstack/react-query-devtools\": \"^5.100.9\",\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19.2.14\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitejs/plugin-react\": \"^6.0.1\",\n \"jsdom\": \"^29.0.1\",\n \"oxfmt\": \"^0.11.0\",\n \"oxlint\": \"^0.17.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.9.3\",\n \"vite-tsconfig-paths\": \"^6.1.1\",\n \"vitest\": \"^4.1.2\"\n }\n}\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n\n/**\n * OctoCMS CLI — command-line tools for managing an OctoCMS project.\n *\n * Commands:\n * init Initialize OctoCMS in a Next.js project\n * dev Start development server with config watching\n * types:gen Generate TypeScript types from next.config.ts\n * embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n * validate Validate all content entries against the schema\n * update Regenerate admin route files\n * agent-docs Inject AI agent doc links into AGENTS.md\n *\n * Usage:\n * octocms <command> [options]\n * octocms --help\n * octocms --version\n */\n\nimport { fmt, log } from './lib/logger';\nimport { resolveProjectRoot } from './lib/project';\nimport { version as VERSION } from '../package.json';\n\nconst HELP = `\n ${fmt.bold('OctoCMS CLI')} v${VERSION}\n\n Usage: octocms <command> [options]\n\n ${fmt.bold('Commands:')}\n init Initialize OctoCMS in a Next.js project\n dev Start development server with config watching\n types:gen Generate TypeScript types from next.config.ts\n embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n validate Validate all content entries against the schema\n update Regenerate admin route files\n agent-docs Inject AI agent doc links into AGENTS.md\n\n ${fmt.bold('Options:')}\n --help Show this help message\n --version Show version number\n\n Run ${fmt.cyan('octocms <command> --help')} for command-specific help.\n`;\n\nconst COMMAND_HELP: Record<string, string> = {\n init: `\n ${fmt.bold('octocms init')} — Initialize OctoCMS in a Next.js project\n\n Creates next.config.ts, admin route files, demo content, and updates\n next.config.ts and tsconfig.json with required configuration.\n\n ${fmt.bold('Usage:')} octocms init [options]\n\n ${fmt.bold('Options:')}\n --yes, -y Accept all defaults (non-interactive)\n --help Show this help message\n`,\n dev: `\n ${fmt.bold('octocms dev')} — Start development server with config watching\n\n Spawns Next.js dev server and watches next.config.ts. When the config\n changes, types are automatically regenerated.\n\n ${fmt.bold('Usage:')} octocms dev [options]\n\n ${fmt.bold('Options:')}\n --port <n> Port number (default: 3000)\n --help Show this help message\n`,\n 'types:gen': `\n ${fmt.bold('octocms types:gen')} — Generate TypeScript types from next.config.ts\n\n Produces cms/__generated__/types.ts, enums.ts, content.d.ts, and index.ts.\n Validates the config before generating.\n\n ${fmt.bold('Usage:')} octocms types:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'embeddings:gen': `\n ${fmt.bold('octocms embeddings:gen')} — Generate cms/__generated__/embeddings.json\n\n Walks every content entry, embeds new/changed entries via the local\n @huggingface/transformers model (Xenova/bge-small-en-v1.5, 384 dims), and\n writes the merged store. Re-running on unchanged content is a fast no-op.\n\n Requires the @huggingface/transformers peer dep installed.\n\n ${fmt.bold('Usage:')} octocms embeddings:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n validate: `\n ${fmt.bold('octocms validate')} — Validate all content entries against the schema\n\n Reads every JSON file in cms/content/, validates structure, field types,\n required fields, select option values, reference targets, and companion files.\n\n ${fmt.bold('Usage:')} octocms validate\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'agent-docs': `\n ${fmt.bold('octocms agent-docs')} — Inject AI agent doc links into AGENTS.md\n\n Creates AGENTS.md if it doesn't exist, or appends the OctoCMS section\n if the file exists but doesn't reference the agent docs yet.\n\n ${fmt.bold('Usage:')} octocms agent-docs\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n update: `\n ${fmt.bold('octocms update')} — Regenerate admin route files\n\n Ensures src/app/cms/layout.tsx and the catch-all page re-export are\n up-to-date with the latest OctoCMS version.\n\n ${fmt.bold('Usage:')} octocms update\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n};\n\nfunction parseArgs(argv: string[]): { command: string | null; flags: Record<string, string | boolean> } {\n const args = argv.slice(2); // skip node + script path\n const flags: Record<string, string | boolean> = {};\n let command: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--help' || arg === '-h') {\n flags.help = true;\n } else if (arg === '--version' || arg === '-v') {\n flags.version = true;\n } else if (arg === '--yes' || arg === '-y') {\n flags.yes = true;\n } else if (arg === '--port') {\n flags.port = args[++i] ?? '';\n } else if (arg.startsWith('--port=')) {\n flags.port = arg.slice(7);\n } else if (!arg.startsWith('-') && !command) {\n // Handle compound commands as single tokens\n if (arg === 'types:gen' || arg === 'embeddings:gen' || arg === 'agent-docs') {\n command = arg;\n } else {\n command = arg;\n }\n }\n }\n\n return { command, flags };\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv);\n\n if (flags.version) {\n console.log(VERSION);\n return;\n }\n\n if (!command || flags.help) {\n if (command && COMMAND_HELP[command]) {\n console.log(COMMAND_HELP[command]);\n } else {\n console.log(HELP);\n }\n return;\n }\n\n if (COMMAND_HELP[command] && flags.help) {\n console.log(COMMAND_HELP[command]);\n return;\n }\n\n try {\n switch (command) {\n case 'init': {\n // init doesn't need an existing project root — use cwd\n const { initCommand } = await import('./commands/init');\n await initCommand(process.cwd(), { yes: flags.yes === true });\n break;\n }\n case 'dev': {\n const projectRoot = resolveProjectRoot();\n const { devCommand } = await import('./commands/dev');\n const port = flags.port ? Number(flags.port) : undefined;\n await devCommand(projectRoot, { port });\n break;\n }\n case 'types:gen': {\n const projectRoot = resolveProjectRoot();\n const { typesGenCommand } = await import('./commands/typesGen');\n await typesGenCommand(projectRoot);\n break;\n }\n case 'embeddings:gen': {\n const projectRoot = resolveProjectRoot();\n const { embeddingsGenCommand } = await import('./commands/embeddingsGen');\n await embeddingsGenCommand(projectRoot);\n break;\n }\n case 'validate': {\n const projectRoot = resolveProjectRoot();\n const { validateCommand } = await import('./commands/validate');\n await validateCommand(projectRoot);\n break;\n }\n case 'update': {\n const projectRoot = resolveProjectRoot();\n const { updateCommand } = await import('./commands/update');\n await updateCommand(projectRoot);\n break;\n }\n case 'agent-docs': {\n const projectRoot = resolveProjectRoot();\n const { agentDocsCommand } = await import('./commands/agentDocs');\n await agentDocsCommand(projectRoot);\n break;\n }\n default:\n log.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exitCode = 1;\n }\n } catch (e) {\n log.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nmain();\n"],"mappings":";;;;;;;;;;;AAEE,cAAW;;;ACuBb,IAAM,OAAO;AAAA,IACT,IAAI,KAAK,aAAa,CAAC,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,IAInC,IAAI,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASrB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,QAIhB,IAAI,KAAK,0BAA0B,CAAC;AAAA;AAG5C,IAAM,eAAuC;AAAA,EAC3C,MAAM;AAAA,IACJ,IAAI,KAAK,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKxB,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,EAItB,KAAK;AAAA,IACH,IAAI,KAAK,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKvB,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,EAItB,aAAa;AAAA,IACX,IAAI,KAAK,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK7B,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,EAGtB,kBAAkB;AAAA,IAChB,IAAI,KAAK,wBAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQlC,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,EAGtB,UAAU;AAAA,IACR,IAAI,KAAK,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5B,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,EAGtB,cAAc;AAAA,IACZ,IAAI,KAAK,oBAAoB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK9B,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,EAGtB,QAAQ;AAAA,IACN,IAAI,KAAK,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1B,IAAI,KAAK,QAAQ,CAAC;AAAA;AAAA,IAElB,IAAI,KAAK,UAAU,CAAC;AAAA;AAAA;AAGxB;AAEA,SAAS,UAAU,MAAqF;AAnIxG;AAoIE,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,QAAM,QAA0C,CAAC;AACjD,MAAI,UAAyB;AAE7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,YAAM,OAAO;AAAA,IACf,WAAW,QAAQ,eAAe,QAAQ,MAAM;AAC9C,YAAM,UAAU;AAAA,IAClB,WAAW,QAAQ,WAAW,QAAQ,MAAM;AAC1C,YAAM,MAAM;AAAA,IACd,WAAW,QAAQ,UAAU;AAC3B,YAAM,QAAO,UAAK,EAAE,CAAC,MAAR,YAAa;AAAA,IAC5B,WAAW,IAAI,WAAW,SAAS,GAAG;AACpC,YAAM,OAAO,IAAI,MAAM,CAAC;AAAA,IAC1B,WAAW,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,SAAS;AAE3C,UAAI,QAAQ,eAAe,QAAQ,oBAAoB,QAAQ,cAAc;AAC3E,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM;AAC1B;AAEA,eAAe,OAAsB;AACnC,QAAM,EAAE,SAAS,MAAM,IAAI,UAAU,QAAQ,IAAI;AAEjD,MAAI,MAAM,SAAS;AACjB,YAAQ,IAAI,OAAO;AACnB;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,MAAM,MAAM;AAC1B,QAAI,WAAW,aAAa,OAAO,GAAG;AACpC,cAAQ,IAAI,aAAa,OAAO,CAAC;AAAA,IACnC,OAAO;AACL,cAAQ,IAAI,IAAI;AAAA,IAClB;AACA;AAAA,EACF;AAEA,MAAI,aAAa,OAAO,KAAK,MAAM,MAAM;AACvC,YAAQ,IAAI,aAAa,OAAO,CAAC;AACjC;AAAA,EACF;AAEA,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK,QAAQ;AAEX,cAAM,EAAE,YAAY,IAAI,MAAM,OAAO,qBAAiB;AACtD,cAAM,YAAY,QAAQ,IAAI,GAAG,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC;AAC5D;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,WAAW,IAAI,MAAM,OAAO,oBAAgB;AACpD,cAAM,OAAO,MAAM,OAAO,OAAO,MAAM,IAAI,IAAI;AAC/C,cAAM,WAAW,aAAa,EAAE,KAAK,CAAC;AACtC;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,yBAAqB;AAC9D,cAAM,gBAAgB,WAAW;AACjC;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,8BAA0B;AACxE,cAAM,qBAAqB,WAAW;AACtC;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,yBAAqB;AAC9D,cAAM,gBAAgB,WAAW;AACjC;AAAA,MACF;AAAA,MACA,KAAK,UAAU;AACb,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,cAAc,IAAI,MAAM,OAAO,uBAAmB;AAC1D,cAAM,cAAc,WAAW;AAC/B;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,cAAc,mBAAmB;AACvC,cAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,0BAAsB;AAChE,cAAM,iBAAiB,WAAW;AAClC;AAAA,MACF;AAAA,MACA;AACE,YAAI,MAAM,oBAAoB,OAAO,EAAE;AACvC,gBAAQ,IAAI,IAAI;AAChB,gBAAQ,WAAW;AAAA,IACvB;AAAA,EACF,SAAS,GAAG;AACV,QAAI,MAAO,EAAY,OAAO;AAC9B,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,KAAK;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/* eslint-disable no-console */\n\n/**\n * OctoCMS CLI — command-line tools for managing an OctoCMS project.\n *\n * Commands:\n * init Initialize OctoCMS in a Next.js project\n * dev Start development server with config watching\n * types:gen Generate TypeScript types from next.config.ts\n * embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n * validate Validate all content entries against the schema\n * update Regenerate admin route files\n * agent-docs Inject AI agent doc links into AGENTS.md\n *\n * Usage:\n * octocms <command> [options]\n * octocms --help\n * octocms --version\n */\n\nimport { fmt, log } from './lib/logger';\nimport { resolveProjectRoot } from './lib/project';\nimport { version as VERSION } from '../package.json';\n\nconst HELP = `\n ${fmt.bold('OctoCMS CLI')} v${VERSION}\n\n Usage: octocms <command> [options]\n\n ${fmt.bold('Commands:')}\n init Initialize OctoCMS in a Next.js project\n dev Start development server with config watching\n types:gen Generate TypeScript types from next.config.ts\n embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n validate Validate all content entries against the schema\n update Regenerate admin route files\n agent-docs Inject AI agent doc links into AGENTS.md\n\n ${fmt.bold('Options:')}\n --help Show this help message\n --version Show version number\n\n Run ${fmt.cyan('octocms <command> --help')} for command-specific help.\n`;\n\nconst COMMAND_HELP: Record<string, string> = {\n init: `\n ${fmt.bold('octocms init')} — Initialize OctoCMS in a Next.js project\n\n Creates next.config.ts, admin route files, demo content, and updates\n next.config.ts and tsconfig.json with required configuration.\n\n ${fmt.bold('Usage:')} octocms init [options]\n\n ${fmt.bold('Options:')}\n --yes, -y Accept all defaults (non-interactive)\n --help Show this help message\n`,\n dev: `\n ${fmt.bold('octocms dev')} — Start development server with config watching\n\n Spawns Next.js dev server and watches next.config.ts. When the config\n changes, types are automatically regenerated.\n\n ${fmt.bold('Usage:')} octocms dev [options]\n\n ${fmt.bold('Options:')}\n --port <n> Port number (default: 3000)\n --help Show this help message\n`,\n 'types:gen': `\n ${fmt.bold('octocms types:gen')} — Generate TypeScript types from next.config.ts\n\n Produces cms/__generated__/types.ts, enums.ts, content.d.ts, and index.ts.\n Validates the config before generating.\n\n ${fmt.bold('Usage:')} octocms types:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'embeddings:gen': `\n ${fmt.bold('octocms embeddings:gen')} — Generate cms/__generated__/embeddings.json\n\n Walks every content entry, embeds new/changed entries via the local\n @huggingface/transformers model (Xenova/bge-small-en-v1.5, 384 dims), and\n writes the merged store. Re-running on unchanged content is a fast no-op.\n\n Requires the @huggingface/transformers peer dep installed.\n\n ${fmt.bold('Usage:')} octocms embeddings:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n validate: `\n ${fmt.bold('octocms validate')} — Validate all content entries against the schema\n\n Reads every JSON file in cms/content/, validates structure, field types,\n required fields, select option values, reference targets, and companion files.\n\n ${fmt.bold('Usage:')} octocms validate\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'agent-docs': `\n ${fmt.bold('octocms agent-docs')} — Inject AI agent doc links into AGENTS.md\n\n Creates AGENTS.md if it doesn't exist, or appends the OctoCMS section\n if the file exists but doesn't reference the agent docs yet.\n\n ${fmt.bold('Usage:')} octocms agent-docs\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n update: `\n ${fmt.bold('octocms update')} — Regenerate admin route files\n\n Ensures src/app/cms/layout.tsx and the catch-all page re-export are\n up-to-date with the latest OctoCMS version.\n\n ${fmt.bold('Usage:')} octocms update\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n};\n\nfunction parseArgs(argv: string[]): { command: string | null; flags: Record<string, string | boolean> } {\n const args = argv.slice(2); // skip node + script path\n const flags: Record<string, string | boolean> = {};\n let command: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--help' || arg === '-h') {\n flags.help = true;\n } else if (arg === '--version' || arg === '-v') {\n flags.version = true;\n } else if (arg === '--yes' || arg === '-y') {\n flags.yes = true;\n } else if (arg === '--port') {\n flags.port = args[++i] ?? '';\n } else if (arg.startsWith('--port=')) {\n flags.port = arg.slice(7);\n } else if (!arg.startsWith('-') && !command) {\n // Handle compound commands as single tokens\n if (arg === 'types:gen' || arg === 'embeddings:gen' || arg === 'agent-docs') {\n command = arg;\n } else {\n command = arg;\n }\n }\n }\n\n return { command, flags };\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv);\n\n if (flags.version) {\n console.log(VERSION);\n return;\n }\n\n if (!command || flags.help) {\n if (command && COMMAND_HELP[command]) {\n console.log(COMMAND_HELP[command]);\n } else {\n console.log(HELP);\n }\n return;\n }\n\n if (COMMAND_HELP[command] && flags.help) {\n console.log(COMMAND_HELP[command]);\n return;\n }\n\n try {\n switch (command) {\n case 'init': {\n // init doesn't need an existing project root — use cwd\n const { initCommand } = await import('./commands/init');\n await initCommand(process.cwd(), { yes: flags.yes === true });\n break;\n }\n case 'dev': {\n const projectRoot = resolveProjectRoot();\n const { devCommand } = await import('./commands/dev');\n const port = flags.port ? Number(flags.port) : undefined;\n await devCommand(projectRoot, { port });\n break;\n }\n case 'types:gen': {\n const projectRoot = resolveProjectRoot();\n const { typesGenCommand } = await import('./commands/typesGen');\n await typesGenCommand(projectRoot);\n break;\n }\n case 'embeddings:gen': {\n const projectRoot = resolveProjectRoot();\n const { embeddingsGenCommand } = await import('./commands/embeddingsGen');\n await embeddingsGenCommand(projectRoot);\n break;\n }\n case 'validate': {\n const projectRoot = resolveProjectRoot();\n const { validateCommand } = await import('./commands/validate');\n await validateCommand(projectRoot);\n break;\n }\n case 'update': {\n const projectRoot = resolveProjectRoot();\n const { updateCommand } = await import('./commands/update');\n await updateCommand(projectRoot);\n break;\n }\n case 'agent-docs': {\n const projectRoot = resolveProjectRoot();\n const { agentDocsCommand } = await import('./commands/agentDocs');\n await agentDocsCommand(projectRoot);\n break;\n }\n default:\n log.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exitCode = 1;\n }\n } catch (e) {\n log.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nmain();\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
version
|
|
3
|
+
} from "./chunk-PFWKOLV4.js";
|
|
1
4
|
import {
|
|
2
5
|
ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH,
|
|
3
6
|
ADMIN_LAYOUT_CONFIG_INIT_DEPTH,
|
|
@@ -22,8 +25,9 @@ import {
|
|
|
22
25
|
rootLayoutConfigInitImport,
|
|
23
26
|
rootLayoutTemplate,
|
|
24
27
|
tsconfigPaths
|
|
25
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-37T54ASM.js";
|
|
26
29
|
import {
|
|
30
|
+
fmt,
|
|
27
31
|
log
|
|
28
32
|
} from "./chunk-6PHFHGTZ.js";
|
|
29
33
|
import "./chunk-DDAAVRWG.js";
|
|
@@ -32,6 +36,34 @@ import "./chunk-DDAAVRWG.js";
|
|
|
32
36
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
33
37
|
import { join } from "path";
|
|
34
38
|
import readline from "readline";
|
|
39
|
+
var REQUIRED_PEER_DEPS = [
|
|
40
|
+
"@mdxeditor/editor",
|
|
41
|
+
"@radix-ui/react-avatar",
|
|
42
|
+
"@radix-ui/react-dialog",
|
|
43
|
+
"@radix-ui/react-dropdown-menu",
|
|
44
|
+
"@radix-ui/react-label",
|
|
45
|
+
"@radix-ui/react-select",
|
|
46
|
+
"@radix-ui/react-slot",
|
|
47
|
+
"@radix-ui/react-tabs",
|
|
48
|
+
"@radix-ui/react-toast",
|
|
49
|
+
"@tanstack/react-query",
|
|
50
|
+
"class-variance-authority",
|
|
51
|
+
"clsx",
|
|
52
|
+
"glob",
|
|
53
|
+
"lucide-react",
|
|
54
|
+
"minisearch",
|
|
55
|
+
"next-auth",
|
|
56
|
+
"octokit",
|
|
57
|
+
"react-markdown",
|
|
58
|
+
"rehype-sanitize",
|
|
59
|
+
"remark-gfm",
|
|
60
|
+
"remark-mdx",
|
|
61
|
+
"sharp",
|
|
62
|
+
"slugify",
|
|
63
|
+
"sonner",
|
|
64
|
+
"tailwind-merge",
|
|
65
|
+
"zod"
|
|
66
|
+
];
|
|
35
67
|
async function prompt(rl, question, defaultValue) {
|
|
36
68
|
const suffix = defaultValue ? ` (${defaultValue})` : "";
|
|
37
69
|
return new Promise((resolve) => {
|
|
@@ -221,11 +253,14 @@ async function initCommand(projectRoot, options = {}) {
|
|
|
221
253
|
log.success("README.md \u2014 already exists, skipped");
|
|
222
254
|
}
|
|
223
255
|
const port = detectDevPort(projectRoot);
|
|
256
|
+
log.blank();
|
|
224
257
|
log.info("Next steps:");
|
|
225
|
-
log.info(" 1.
|
|
226
|
-
log.info(
|
|
227
|
-
log.info(
|
|
228
|
-
log.info(
|
|
258
|
+
log.info(" 1. Install dependencies:");
|
|
259
|
+
log.info(` ${fmt.cyan(`npm install octocms@${version} ${REQUIRED_PEER_DEPS.join(" ")}`)}`);
|
|
260
|
+
log.info(" 2. Fill in GitHub App credentials in .env.local (see README.md)");
|
|
261
|
+
log.info(" 3. Run: npm run dev");
|
|
262
|
+
log.info(` 4. Visit demo page: http://localhost:${port}/hello`);
|
|
263
|
+
log.info(` 5. Visit CMS admin: http://localhost:${port}/cms`);
|
|
229
264
|
log.info("");
|
|
230
265
|
log.info(" After editing cms/octocms.config.ts, regenerate types:");
|
|
231
266
|
log.info(" npx octocms types:gen");
|
|
@@ -234,4 +269,4 @@ async function initCommand(projectRoot, options = {}) {
|
|
|
234
269
|
export {
|
|
235
270
|
initCommand
|
|
236
271
|
};
|
|
237
|
-
//# sourceMappingURL=init-
|
|
272
|
+
//# sourceMappingURL=init-SGG3EI5G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../cli/commands/init.ts"],"sourcesContent":["/**\n * `octocms init` — Initialize OctoCMS in a Next.js project.\n *\n * Writes the full CMS config inline into `next.config.ts`, creates admin\n * route files, demo content, and updates `tsconfig.json` with required\n * path aliases.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport readline from 'readline';\n\nimport { version as CLI_VERSION } from '../../package.json';\nimport { fmt, log } from '../lib/logger';\n\nimport {\n adminErrorTemplate,\n ADMIN_LAYOUT_CONFIG_INIT_DEPTH,\n ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH,\n buildAdminLayoutTemplate,\n buildAdminPageTemplate,\n agentChatRouteTemplate,\n mediaRouteTemplate,\n demoHelloPageJson,\n envLocalTemplate,\n generatedConfigInitTemplate,\n generatedContentDeclsTemplate,\n generatedEnumsTemplate,\n generatedIndexTemplate,\n generatedQueryTemplate,\n generatedTypesTemplate,\n helloPageTemplate,\n nextAuthRouteTemplate,\n nextConfigTemplate,\n octoConfigTemplate,\n readmeTemplate,\n rootLayoutConfigInitImport,\n rootLayoutTemplate,\n tsconfigPaths,\n} from '../lib/templates';\n\n/**\n * Required (non-optional) peer dependencies of `octocms`, excluding\n * `next` / `react` / `react-dom` which any Next.js project already has.\n *\n * Keep in sync with `octocms/package.json` `peerDependencies` minus the\n * entries flagged `optional: true` in `peerDependenciesMeta`. The\n * `init.test.ts` `keeps REQUIRED_PEER_DEPS in sync` test enforces this.\n */\nconst REQUIRED_PEER_DEPS: readonly string[] = [\n '@mdxeditor/editor',\n '@radix-ui/react-avatar',\n '@radix-ui/react-dialog',\n '@radix-ui/react-dropdown-menu',\n '@radix-ui/react-label',\n '@radix-ui/react-select',\n '@radix-ui/react-slot',\n '@radix-ui/react-tabs',\n '@radix-ui/react-toast',\n '@tanstack/react-query',\n 'class-variance-authority',\n 'clsx',\n 'glob',\n 'lucide-react',\n 'minisearch',\n 'next-auth',\n 'octokit',\n 'react-markdown',\n 'rehype-sanitize',\n 'remark-gfm',\n 'remark-mdx',\n 'sharp',\n 'slugify',\n 'sonner',\n 'tailwind-merge',\n 'zod',\n];\n\nexport type InitOptions = {\n /** Accept all defaults without prompting. */\n yes?: boolean;\n};\n\ntype InitAnswers = {\n projectName: string;\n baseBranch: string;\n usePointerBranch: boolean;\n pointerBranch: string;\n};\n\nasync function prompt(rl: readline.Interface, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n return new Promise((resolve) => {\n rl.question(` ? ${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\nasync function confirm(rl: readline.Interface, question: string, defaultYes = false): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N';\n const answer = await prompt(rl, `${question} (${hint})`);\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n}\n\nasync function gatherAnswers(options: InitOptions): Promise<InitAnswers> {\n if (options.yes) {\n return {\n projectName: 'My CMS',\n baseBranch: 'main',\n usePointerBranch: false,\n pointerBranch: '',\n };\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const projectName = await prompt(rl, 'Project name', 'My CMS');\n const baseBranch = await prompt(rl, 'Git base branch', 'main');\n const usePointerBranch = await confirm(rl, 'Use a separate published pointer branch?');\n let pointerBranch = '';\n if (usePointerBranch) {\n pointerBranch = await prompt(rl, 'Pointer branch name', 'cms/publish-pointer');\n }\n\n return { projectName, baseBranch, usePointerBranch, pointerBranch };\n } finally {\n rl.close();\n }\n}\n\n/** Detect the dev port from the project's package.json dev script. Defaults to 3000. */\nfunction detectDevPort(projectRoot: string): number {\n try {\n const pkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf8')) as {\n scripts?: Record<string, string>;\n };\n const devScript = pkg.scripts?.dev ?? '';\n const match = /(?:-p|--port)[= ](\\d+)/.exec(devScript);\n if (match) return parseInt(match[1], 10);\n } catch {\n // ignore\n }\n return 3000;\n}\n\nexport async function initCommand(projectRoot: string, options: InitOptions = {}): Promise<void> {\n log.header('Initialize a new project');\n\n // Already initialized if cms/octocms.config.ts already contains defineConfig\n const octoConfigPath = join(projectRoot, 'cms', 'octocms.config.ts');\n if (existsSync(octoConfigPath) && readFileSync(octoConfigPath, 'utf8').includes('defineConfig')) {\n log.error('cms/octocms.config.ts already contains defineConfig — this project is already initialized.');\n log.info('Use `octocms update` to regenerate admin route files.');\n process.exitCode = 1;\n return;\n }\n const nextConfigPath = join(projectRoot, 'next.config.ts');\n\n if (!existsSync(join(projectRoot, 'package.json'))) {\n log.error('No package.json found — run this inside a Next.js project.');\n process.exitCode = 1;\n return;\n }\n\n const answers = await gatherAnswers(options);\n\n log.blank();\n log.info('Creating files...');\n\n // Admin route files — three thin re-exports. The package owns dispatch +\n // per-component Suspense + skeletons via the `octocms/admin` barrel.\n const cmsRouteDir = join(projectRoot, 'app', 'cms');\n mkdirSync(join(cmsRouteDir, '[[...path]]'), { recursive: true });\n\n writeFileSync(\n join(cmsRouteDir, 'layout.tsx'),\n buildAdminLayoutTemplate(ADMIN_LAYOUT_CONFIG_INIT_DEPTH.fromAppCms),\n 'utf8',\n );\n log.success('app/cms/layout.tsx');\n\n writeFileSync(\n join(cmsRouteDir, '[[...path]]', 'page.tsx'),\n buildAdminPageTemplate(ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH.fromAppCmsCatchAll),\n 'utf8',\n );\n log.success('app/cms/[[...path]]/page.tsx');\n\n writeFileSync(join(cmsRouteDir, 'error.tsx'), adminErrorTemplate, 'utf8');\n log.success('app/cms/error.tsx');\n\n // Root layout — ensure configInit is imported so public page serverless functions\n // initialize the OctoCMS config on cold start (not just admin routes).\n const rootLayoutPath = join(projectRoot, 'app', 'layout.tsx');\n if (!existsSync(rootLayoutPath)) {\n writeFileSync(rootLayoutPath, rootLayoutTemplate, 'utf8');\n log.success('app/layout.tsx — created with configInit import');\n } else {\n const existing = readFileSync(rootLayoutPath, 'utf8');\n if (!existing.includes('configInit')) {\n writeFileSync(rootLayoutPath, rootLayoutConfigInitImport + existing, 'utf8');\n log.success('app/layout.tsx — added configInit import');\n } else {\n log.success('app/layout.tsx — configInit import already present');\n }\n }\n\n // NextAuth API route\n const authRouteDir = join(projectRoot, 'app', 'api', 'auth', '[...nextauth]');\n mkdirSync(authRouteDir, { recursive: true });\n writeFileSync(join(authRouteDir, 'route.ts'), nextAuthRouteTemplate, 'utf8');\n log.success('app/api/auth/[...nextauth]/route.ts');\n\n // Chat-agent routes — thin re-exports of handlers in `octocms/agent`.\n // The handlers are opt-in (the agent feature is gated by config + provider\n // key at runtime); shipping the routes by default costs nothing when the\n // agent is disabled — every endpoint 404s in that case.\n // Depth from `app/api/agent/route.ts` to project root = 4.\n const chatRouteDir = join(projectRoot, 'app', 'api', 'agent');\n mkdirSync(chatRouteDir, { recursive: true });\n writeFileSync(join(chatRouteDir, 'route.ts'), agentChatRouteTemplate({ depth: 4 }), 'utf8');\n log.success('app/api/agent/route.ts');\n\n // Note: chat-agent proposal accept/reject are server actions\n // (`acceptProposalAction` / `rejectProposalAction` in\n // `octocms/admin/actions/agent.ts`), called directly from `useChatStream` —\n // no public endpoint files are scaffolded.\n\n // Media proxy route — thin re-export of `mediaRoute` from `octocms/admin/mediaRoute`.\n // Vercel's filesystem is immutable after build, so images committed from the\n // CMS UI never land in `public/media/` on the running instance — routing\n // them through a Route Handler lets the GitHub-API path serve them.\n // Depth from `app/media/[...slug]/route.ts` to project root = 3.\n const mediaRouteDir = join(projectRoot, 'app', 'media', '[...slug]');\n mkdirSync(mediaRouteDir, { recursive: true });\n writeFileSync(join(mediaRouteDir, 'route.ts'), mediaRouteTemplate({ depth: 3 }), 'utf8');\n log.success('app/media/[...slug]/route.ts');\n\n // Hello page demo route\n mkdirSync(join(projectRoot, 'app', 'hello'), { recursive: true });\n writeFileSync(join(projectRoot, 'app', 'hello', 'page.tsx'), helloPageTemplate, 'utf8');\n log.success('app/hello/page.tsx');\n\n // Demo content\n const contentDir = join(projectRoot, 'cms', 'content', 'helloPage');\n mkdirSync(contentDir, { recursive: true });\n writeFileSync(join(contentDir, 'helloPage-0000.json'), demoHelloPageJson(), 'utf8');\n log.success('cms/content/helloPage/helloPage-0000.json');\n\n // cms/__generated__/ — write static starter files (schema-accurate for helloPage demo)\n // These are valid immediately; re-run `npx octocms types:gen` after editing the schema.\n const generatedDir = join(projectRoot, 'cms', '__generated__');\n mkdirSync(generatedDir, { recursive: true });\n const generatedFiles: [string, string][] = [\n ['types.ts', generatedTypesTemplate],\n ['enums.ts', generatedEnumsTemplate],\n ['content.d.ts', generatedContentDeclsTemplate],\n ['index.ts', generatedIndexTemplate],\n ['query.ts', generatedQueryTemplate],\n ['configInit.ts', generatedConfigInitTemplate],\n ];\n for (const [name, content] of generatedFiles) {\n writeFileSync(join(generatedDir, name), content, 'utf8');\n log.success(`cms/__generated__/${name}`);\n }\n\n // Media directory\n mkdirSync(join(projectRoot, 'public', 'media'), { recursive: true });\n\n // cms/octocms.config.ts — write the OctoCMS schema\n log.blank();\n log.info('Updating configuration...');\n mkdirSync(join(projectRoot, 'cms'), { recursive: true });\n writeFileSync(\n octoConfigPath,\n octoConfigTemplate({\n projectName: answers.projectName,\n baseBranch: answers.baseBranch,\n pointerBranch: answers.usePointerBranch ? answers.pointerBranch : undefined,\n }),\n 'utf8',\n );\n log.success('cms/octocms.config.ts — OctoCMS schema');\n\n // next.config.ts — write the thin Next.js wrapper\n writeFileSync(nextConfigPath, nextConfigTemplate(), 'utf8');\n log.success('next.config.ts — Next.js wrapper');\n\n // tsconfig.json\n const tsconfigPath = join(projectRoot, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n try {\n const raw = readFileSync(tsconfigPath, 'utf8');\n const tsconfig = JSON.parse(raw);\n if (!tsconfig.compilerOptions) tsconfig.compilerOptions = {};\n if (!tsconfig.compilerOptions.paths) tsconfig.compilerOptions.paths = {};\n const requiredPaths = tsconfigPaths();\n let changed = false;\n for (const [alias, targets] of Object.entries(requiredPaths)) {\n if (!tsconfig.compilerOptions.paths[alias]) {\n tsconfig.compilerOptions.paths[alias] = targets;\n changed = true;\n }\n }\n if (changed) {\n writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\\n', 'utf8');\n log.success('tsconfig.json — added path aliases');\n } else {\n log.success('tsconfig.json — path aliases already present');\n }\n } catch {\n log.warn('tsconfig.json — could not parse; add path aliases manually');\n }\n } else {\n log.warn('tsconfig.json not found — create one with the required path aliases');\n }\n\n // .env.local — write stub only if it doesn't already exist\n const envLocalPath = join(projectRoot, '.env.local');\n if (!existsSync(envLocalPath)) {\n writeFileSync(envLocalPath, envLocalTemplate(), 'utf8');\n log.success('.env.local — environment variable stubs');\n } else {\n log.success('.env.local — already exists, skipped');\n }\n\n // README.md — write only if it doesn't already exist\n const readmePath = join(projectRoot, 'README.md');\n if (!existsSync(readmePath)) {\n writeFileSync(readmePath, readmeTemplate(answers.projectName), 'utf8');\n log.success('README.md — setup guide');\n } else {\n log.success('README.md — already exists, skipped');\n }\n\n const port = detectDevPort(projectRoot);\n log.blank();\n log.info('Next steps:');\n log.info(' 1. Install dependencies:');\n log.info(` ${fmt.cyan(`npm install octocms@${CLI_VERSION} ${REQUIRED_PEER_DEPS.join(' ')}`)}`);\n log.info(' 2. Fill in GitHub App credentials in .env.local (see README.md)');\n log.info(' 3. Run: npm run dev');\n log.info(` 4. Visit demo page: http://localhost:${port}/hello`);\n log.info(` 5. Visit CMS admin: http://localhost:${port}/cms`);\n log.info('');\n log.info(' After editing cms/octocms.config.ts, regenerate types:');\n log.info(' npx octocms types:gen');\n log.blank();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
mediaRouteTemplate,
|
|
11
11
|
nextAuthRouteTemplate,
|
|
12
12
|
rootLayoutConfigInitImport
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-37T54ASM.js";
|
|
14
14
|
import {
|
|
15
15
|
log
|
|
16
16
|
} from "./chunk-6PHFHGTZ.js";
|
|
@@ -199,4 +199,4 @@ async function updateCommand(projectRoot) {
|
|
|
199
199
|
export {
|
|
200
200
|
updateCommand
|
|
201
201
|
};
|
|
202
|
-
//# sourceMappingURL=update-
|
|
202
|
+
//# sourceMappingURL=update-6ZBUX6O4.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/commands/init.ts"],"sourcesContent":["/**\n * `octocms init` — Initialize OctoCMS in a Next.js project.\n *\n * Writes the full CMS config inline into `next.config.ts`, creates admin\n * route files, demo content, and updates `tsconfig.json` with required\n * path aliases.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport readline from 'readline';\n\nimport { log } from '../lib/logger';\nimport {\n adminErrorTemplate,\n ADMIN_LAYOUT_CONFIG_INIT_DEPTH,\n ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH,\n buildAdminLayoutTemplate,\n buildAdminPageTemplate,\n agentChatRouteTemplate,\n mediaRouteTemplate,\n demoHelloPageJson,\n envLocalTemplate,\n generatedConfigInitTemplate,\n generatedContentDeclsTemplate,\n generatedEnumsTemplate,\n generatedIndexTemplate,\n generatedQueryTemplate,\n generatedTypesTemplate,\n helloPageTemplate,\n nextAuthRouteTemplate,\n nextConfigTemplate,\n octoConfigTemplate,\n readmeTemplate,\n rootLayoutConfigInitImport,\n rootLayoutTemplate,\n tsconfigPaths,\n} from '../lib/templates';\n\nexport type InitOptions = {\n /** Accept all defaults without prompting. */\n yes?: boolean;\n};\n\ntype InitAnswers = {\n projectName: string;\n baseBranch: string;\n usePointerBranch: boolean;\n pointerBranch: string;\n};\n\nasync function prompt(rl: readline.Interface, question: string, defaultValue?: string): Promise<string> {\n const suffix = defaultValue ? ` (${defaultValue})` : '';\n return new Promise((resolve) => {\n rl.question(` ? ${question}${suffix}: `, (answer) => {\n resolve(answer.trim() || defaultValue || '');\n });\n });\n}\n\nasync function confirm(rl: readline.Interface, question: string, defaultYes = false): Promise<boolean> {\n const hint = defaultYes ? 'Y/n' : 'y/N';\n const answer = await prompt(rl, `${question} (${hint})`);\n if (!answer) return defaultYes;\n return answer.toLowerCase().startsWith('y');\n}\n\nasync function gatherAnswers(options: InitOptions): Promise<InitAnswers> {\n if (options.yes) {\n return {\n projectName: 'My CMS',\n baseBranch: 'main',\n usePointerBranch: false,\n pointerBranch: '',\n };\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const projectName = await prompt(rl, 'Project name', 'My CMS');\n const baseBranch = await prompt(rl, 'Git base branch', 'main');\n const usePointerBranch = await confirm(rl, 'Use a separate published pointer branch?');\n let pointerBranch = '';\n if (usePointerBranch) {\n pointerBranch = await prompt(rl, 'Pointer branch name', 'cms/publish-pointer');\n }\n\n return { projectName, baseBranch, usePointerBranch, pointerBranch };\n } finally {\n rl.close();\n }\n}\n\n/** Detect the dev port from the project's package.json dev script. Defaults to 3000. */\nfunction detectDevPort(projectRoot: string): number {\n try {\n const pkg = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf8')) as {\n scripts?: Record<string, string>;\n };\n const devScript = pkg.scripts?.dev ?? '';\n const match = /(?:-p|--port)[= ](\\d+)/.exec(devScript);\n if (match) return parseInt(match[1], 10);\n } catch {\n // ignore\n }\n return 3000;\n}\n\nexport async function initCommand(projectRoot: string, options: InitOptions = {}): Promise<void> {\n log.header('Initialize a new project');\n\n // Already initialized if cms/octocms.config.ts already contains defineConfig\n const octoConfigPath = join(projectRoot, 'cms', 'octocms.config.ts');\n if (existsSync(octoConfigPath) && readFileSync(octoConfigPath, 'utf8').includes('defineConfig')) {\n log.error('cms/octocms.config.ts already contains defineConfig — this project is already initialized.');\n log.info('Use `octocms update` to regenerate admin route files.');\n process.exitCode = 1;\n return;\n }\n const nextConfigPath = join(projectRoot, 'next.config.ts');\n\n if (!existsSync(join(projectRoot, 'package.json'))) {\n log.error('No package.json found — run this inside a Next.js project.');\n process.exitCode = 1;\n return;\n }\n\n const answers = await gatherAnswers(options);\n\n log.blank();\n log.info('Creating files...');\n\n // Admin route files — three thin re-exports. The package owns dispatch +\n // per-component Suspense + skeletons via the `octocms/admin` barrel.\n const cmsRouteDir = join(projectRoot, 'app', 'cms');\n mkdirSync(join(cmsRouteDir, '[[...path]]'), { recursive: true });\n\n writeFileSync(\n join(cmsRouteDir, 'layout.tsx'),\n buildAdminLayoutTemplate(ADMIN_LAYOUT_CONFIG_INIT_DEPTH.fromAppCms),\n 'utf8',\n );\n log.success('app/cms/layout.tsx');\n\n writeFileSync(\n join(cmsRouteDir, '[[...path]]', 'page.tsx'),\n buildAdminPageTemplate(ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH.fromAppCmsCatchAll),\n 'utf8',\n );\n log.success('app/cms/[[...path]]/page.tsx');\n\n writeFileSync(join(cmsRouteDir, 'error.tsx'), adminErrorTemplate, 'utf8');\n log.success('app/cms/error.tsx');\n\n // Root layout — ensure configInit is imported so public page serverless functions\n // initialize the OctoCMS config on cold start (not just admin routes).\n const rootLayoutPath = join(projectRoot, 'app', 'layout.tsx');\n if (!existsSync(rootLayoutPath)) {\n writeFileSync(rootLayoutPath, rootLayoutTemplate, 'utf8');\n log.success('app/layout.tsx — created with configInit import');\n } else {\n const existing = readFileSync(rootLayoutPath, 'utf8');\n if (!existing.includes('configInit')) {\n writeFileSync(rootLayoutPath, rootLayoutConfigInitImport + existing, 'utf8');\n log.success('app/layout.tsx — added configInit import');\n } else {\n log.success('app/layout.tsx — configInit import already present');\n }\n }\n\n // NextAuth API route\n const authRouteDir = join(projectRoot, 'app', 'api', 'auth', '[...nextauth]');\n mkdirSync(authRouteDir, { recursive: true });\n writeFileSync(join(authRouteDir, 'route.ts'), nextAuthRouteTemplate, 'utf8');\n log.success('app/api/auth/[...nextauth]/route.ts');\n\n // Chat-agent routes — thin re-exports of handlers in `octocms/agent`.\n // The handlers are opt-in (the agent feature is gated by config + provider\n // key at runtime); shipping the routes by default costs nothing when the\n // agent is disabled — every endpoint 404s in that case.\n // Depth from `app/api/agent/route.ts` to project root = 4.\n const chatRouteDir = join(projectRoot, 'app', 'api', 'agent');\n mkdirSync(chatRouteDir, { recursive: true });\n writeFileSync(join(chatRouteDir, 'route.ts'), agentChatRouteTemplate({ depth: 4 }), 'utf8');\n log.success('app/api/agent/route.ts');\n\n // Note: chat-agent proposal accept/reject are server actions\n // (`acceptProposalAction` / `rejectProposalAction` in\n // `octocms/admin/actions/agent.ts`), called directly from `useChatStream` —\n // no public endpoint files are scaffolded.\n\n // Media proxy route — thin re-export of `mediaRoute` from `octocms/admin/mediaRoute`.\n // Vercel's filesystem is immutable after build, so images committed from the\n // CMS UI never land in `public/media/` on the running instance — routing\n // them through a Route Handler lets the GitHub-API path serve them.\n // Depth from `app/media/[...slug]/route.ts` to project root = 3.\n const mediaRouteDir = join(projectRoot, 'app', 'media', '[...slug]');\n mkdirSync(mediaRouteDir, { recursive: true });\n writeFileSync(join(mediaRouteDir, 'route.ts'), mediaRouteTemplate({ depth: 3 }), 'utf8');\n log.success('app/media/[...slug]/route.ts');\n\n // Hello page demo route\n mkdirSync(join(projectRoot, 'app', 'hello'), { recursive: true });\n writeFileSync(join(projectRoot, 'app', 'hello', 'page.tsx'), helloPageTemplate, 'utf8');\n log.success('app/hello/page.tsx');\n\n // Demo content\n const contentDir = join(projectRoot, 'cms', 'content', 'helloPage');\n mkdirSync(contentDir, { recursive: true });\n writeFileSync(join(contentDir, 'helloPage-0000.json'), demoHelloPageJson(), 'utf8');\n log.success('cms/content/helloPage/helloPage-0000.json');\n\n // cms/__generated__/ — write static starter files (schema-accurate for helloPage demo)\n // These are valid immediately; re-run `npx octocms types:gen` after editing the schema.\n const generatedDir = join(projectRoot, 'cms', '__generated__');\n mkdirSync(generatedDir, { recursive: true });\n const generatedFiles: [string, string][] = [\n ['types.ts', generatedTypesTemplate],\n ['enums.ts', generatedEnumsTemplate],\n ['content.d.ts', generatedContentDeclsTemplate],\n ['index.ts', generatedIndexTemplate],\n ['query.ts', generatedQueryTemplate],\n ['configInit.ts', generatedConfigInitTemplate],\n ];\n for (const [name, content] of generatedFiles) {\n writeFileSync(join(generatedDir, name), content, 'utf8');\n log.success(`cms/__generated__/${name}`);\n }\n\n // Media directory\n mkdirSync(join(projectRoot, 'public', 'media'), { recursive: true });\n\n // cms/octocms.config.ts — write the OctoCMS schema\n log.blank();\n log.info('Updating configuration...');\n mkdirSync(join(projectRoot, 'cms'), { recursive: true });\n writeFileSync(\n octoConfigPath,\n octoConfigTemplate({\n projectName: answers.projectName,\n baseBranch: answers.baseBranch,\n pointerBranch: answers.usePointerBranch ? answers.pointerBranch : undefined,\n }),\n 'utf8',\n );\n log.success('cms/octocms.config.ts — OctoCMS schema');\n\n // next.config.ts — write the thin Next.js wrapper\n writeFileSync(nextConfigPath, nextConfigTemplate(), 'utf8');\n log.success('next.config.ts — Next.js wrapper');\n\n // tsconfig.json\n const tsconfigPath = join(projectRoot, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n try {\n const raw = readFileSync(tsconfigPath, 'utf8');\n const tsconfig = JSON.parse(raw);\n if (!tsconfig.compilerOptions) tsconfig.compilerOptions = {};\n if (!tsconfig.compilerOptions.paths) tsconfig.compilerOptions.paths = {};\n const requiredPaths = tsconfigPaths();\n let changed = false;\n for (const [alias, targets] of Object.entries(requiredPaths)) {\n if (!tsconfig.compilerOptions.paths[alias]) {\n tsconfig.compilerOptions.paths[alias] = targets;\n changed = true;\n }\n }\n if (changed) {\n writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + '\\n', 'utf8');\n log.success('tsconfig.json — added path aliases');\n } else {\n log.success('tsconfig.json — path aliases already present');\n }\n } catch {\n log.warn('tsconfig.json — could not parse; add path aliases manually');\n }\n } else {\n log.warn('tsconfig.json not found — create one with the required path aliases');\n }\n\n // .env.local — write stub only if it doesn't already exist\n const envLocalPath = join(projectRoot, '.env.local');\n if (!existsSync(envLocalPath)) {\n writeFileSync(envLocalPath, envLocalTemplate(), 'utf8');\n log.success('.env.local — environment variable stubs');\n } else {\n log.success('.env.local — already exists, skipped');\n }\n\n // README.md — write only if it doesn't already exist\n const readmePath = join(projectRoot, 'README.md');\n if (!existsSync(readmePath)) {\n writeFileSync(readmePath, readmeTemplate(answers.projectName), 'utf8');\n log.success('README.md — setup guide');\n } else {\n log.success('README.md — already exists, skipped');\n }\n\n const port = detectDevPort(projectRoot);\n log.info('Next steps:');\n log.info(' 1. Fill in GitHub App credentials in .env.local (see README.md)');\n log.info(' 2. Run: npm run dev');\n log.info(` 3. Visit demo page: http://localhost:${port}/hello`);\n log.info(` 4. Visit CMS admin: http://localhost:${port}/cms`);\n log.info('');\n log.info(' After editing cms/octocms.config.ts, regenerate types:');\n log.info(' npx octocms types:gen');\n log.blank();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,YAAY;AACrB,OAAO,cAAc;AAyCrB,eAAe,OAAO,IAAwB,UAAkB,cAAwC;AACtG,QAAM,SAAS,eAAe,KAAK,YAAY,MAAM;AACrD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,OAAG,SAAS,OAAO,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW;AACpD,cAAQ,OAAO,KAAK,KAAK,gBAAgB,EAAE;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,QAAQ,IAAwB,UAAkB,aAAa,OAAyB;AACrG,QAAM,OAAO,aAAa,QAAQ;AAClC,QAAM,SAAS,MAAM,OAAO,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG;AACvD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,YAAY,EAAE,WAAW,GAAG;AAC5C;AAEA,eAAe,cAAc,SAA4C;AACvE,MAAI,QAAQ,KAAK;AACf,WAAO;AAAA,MACL,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,IAAI,gBAAgB,QAAQ;AAC7D,UAAM,aAAa,MAAM,OAAO,IAAI,mBAAmB,MAAM;AAC7D,UAAM,mBAAmB,MAAM,QAAQ,IAAI,0CAA0C;AACrF,QAAI,gBAAgB;AACpB,QAAI,kBAAkB;AACpB,sBAAgB,MAAM,OAAO,IAAI,uBAAuB,qBAAqB;AAAA,IAC/E;AAEA,WAAO,EAAE,aAAa,YAAY,kBAAkB,cAAc;AAAA,EACpE,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAGA,SAAS,cAAc,aAA6B;AAlGpD;AAmGE,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,aAAa,KAAK,aAAa,cAAc,GAAG,MAAM,CAAC;AAG9E,UAAM,aAAY,eAAI,YAAJ,mBAAa,QAAb,YAAoB;AACtC,UAAM,QAAQ,yBAAyB,KAAK,SAAS;AACrD,QAAI,MAAO,QAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,EACzC,SAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,eAAsB,YAAY,aAAqB,UAAuB,CAAC,GAAkB;AAC/F,MAAI,OAAO,0BAA0B;AAGrC,QAAM,iBAAiB,KAAK,aAAa,OAAO,mBAAmB;AACnE,MAAI,WAAW,cAAc,KAAK,aAAa,gBAAgB,MAAM,EAAE,SAAS,cAAc,GAAG;AAC/F,QAAI,MAAM,iGAA4F;AACtG,QAAI,KAAK,uDAAuD;AAChE,YAAQ,WAAW;AACnB;AAAA,EACF;AACA,QAAM,iBAAiB,KAAK,aAAa,gBAAgB;AAEzD,MAAI,CAAC,WAAW,KAAK,aAAa,cAAc,CAAC,GAAG;AAClD,QAAI,MAAM,iEAA4D;AACtE,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,cAAc,OAAO;AAE3C,MAAI,MAAM;AACV,MAAI,KAAK,mBAAmB;AAI5B,QAAM,cAAc,KAAK,aAAa,OAAO,KAAK;AAClD,YAAU,KAAK,aAAa,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/D;AAAA,IACE,KAAK,aAAa,YAAY;AAAA,IAC9B,yBAAyB,+BAA+B,UAAU;AAAA,IAClE;AAAA,EACF;AACA,MAAI,QAAQ,oBAAoB;AAEhC;AAAA,IACE,KAAK,aAAa,eAAe,UAAU;AAAA,IAC3C,uBAAuB,kCAAkC,kBAAkB;AAAA,IAC3E;AAAA,EACF;AACA,MAAI,QAAQ,8BAA8B;AAE1C,gBAAc,KAAK,aAAa,WAAW,GAAG,oBAAoB,MAAM;AACxE,MAAI,QAAQ,mBAAmB;AAI/B,QAAM,iBAAiB,KAAK,aAAa,OAAO,YAAY;AAC5D,MAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,kBAAc,gBAAgB,oBAAoB,MAAM;AACxD,QAAI,QAAQ,sDAAiD;AAAA,EAC/D,OAAO;AACL,UAAM,WAAW,aAAa,gBAAgB,MAAM;AACpD,QAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,oBAAc,gBAAgB,6BAA6B,UAAU,MAAM;AAC3E,UAAI,QAAQ,+CAA0C;AAAA,IACxD,OAAO;AACL,UAAI,QAAQ,yDAAoD;AAAA,IAClE;AAAA,EACF;AAGA,QAAM,eAAe,KAAK,aAAa,OAAO,OAAO,QAAQ,eAAe;AAC5E,YAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,gBAAc,KAAK,cAAc,UAAU,GAAG,uBAAuB,MAAM;AAC3E,MAAI,QAAQ,qCAAqC;AAOjD,QAAM,eAAe,KAAK,aAAa,OAAO,OAAO,OAAO;AAC5D,YAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,gBAAc,KAAK,cAAc,UAAU,GAAG,uBAAuB,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM;AAC1F,MAAI,QAAQ,wBAAwB;AAYpC,QAAM,gBAAgB,KAAK,aAAa,OAAO,SAAS,WAAW;AACnE,YAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc,KAAK,eAAe,UAAU,GAAG,mBAAmB,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM;AACvF,MAAI,QAAQ,8BAA8B;AAG1C,YAAU,KAAK,aAAa,OAAO,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,gBAAc,KAAK,aAAa,OAAO,SAAS,UAAU,GAAG,mBAAmB,MAAM;AACtF,MAAI,QAAQ,oBAAoB;AAGhC,QAAM,aAAa,KAAK,aAAa,OAAO,WAAW,WAAW;AAClE,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,gBAAc,KAAK,YAAY,qBAAqB,GAAG,kBAAkB,GAAG,MAAM;AAClF,MAAI,QAAQ,2CAA2C;AAIvD,QAAM,eAAe,KAAK,aAAa,OAAO,eAAe;AAC7D,YAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,QAAM,iBAAqC;AAAA,IACzC,CAAC,YAAY,sBAAsB;AAAA,IACnC,CAAC,YAAY,sBAAsB;AAAA,IACnC,CAAC,gBAAgB,6BAA6B;AAAA,IAC9C,CAAC,YAAY,sBAAsB;AAAA,IACnC,CAAC,YAAY,sBAAsB;AAAA,IACnC,CAAC,iBAAiB,2BAA2B;AAAA,EAC/C;AACA,aAAW,CAAC,MAAM,OAAO,KAAK,gBAAgB;AAC5C,kBAAc,KAAK,cAAc,IAAI,GAAG,SAAS,MAAM;AACvD,QAAI,QAAQ,qBAAqB,IAAI,EAAE;AAAA,EACzC;AAGA,YAAU,KAAK,aAAa,UAAU,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAGnE,MAAI,MAAM;AACV,MAAI,KAAK,2BAA2B;AACpC,YAAU,KAAK,aAAa,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD;AAAA,IACE;AAAA,IACA,mBAAmB;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,mBAAmB,QAAQ,gBAAgB;AAAA,IACpE,CAAC;AAAA,IACD;AAAA,EACF;AACA,MAAI,QAAQ,6CAAwC;AAGpD,gBAAc,gBAAgB,mBAAmB,GAAG,MAAM;AAC1D,MAAI,QAAQ,uCAAkC;AAG9C,QAAM,eAAe,KAAK,aAAa,eAAe;AACtD,MAAI,WAAW,YAAY,GAAG;AAC5B,QAAI;AACF,YAAM,MAAM,aAAa,cAAc,MAAM;AAC7C,YAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,UAAI,CAAC,SAAS,gBAAiB,UAAS,kBAAkB,CAAC;AAC3D,UAAI,CAAC,SAAS,gBAAgB,MAAO,UAAS,gBAAgB,QAAQ,CAAC;AACvE,YAAM,gBAAgB,cAAc;AACpC,UAAI,UAAU;AACd,iBAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC5D,YAAI,CAAC,SAAS,gBAAgB,MAAM,KAAK,GAAG;AAC1C,mBAAS,gBAAgB,MAAM,KAAK,IAAI;AACxC,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,UAAI,SAAS;AACX,sBAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,MAAM;AAC5E,YAAI,QAAQ,yCAAoC;AAAA,MAClD,OAAO;AACL,YAAI,QAAQ,mDAA8C;AAAA,MAC5D;AAAA,IACF,SAAQ;AACN,UAAI,KAAK,iEAA4D;AAAA,IACvE;AAAA,EACF,OAAO;AACL,QAAI,KAAK,0EAAqE;AAAA,EAChF;AAGA,QAAM,eAAe,KAAK,aAAa,YAAY;AACnD,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,kBAAc,cAAc,iBAAiB,GAAG,MAAM;AACtD,QAAI,QAAQ,8CAAyC;AAAA,EACvD,OAAO;AACL,QAAI,QAAQ,2CAAsC;AAAA,EACpD;AAGA,QAAM,aAAa,KAAK,aAAa,WAAW;AAChD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,kBAAc,YAAY,eAAe,QAAQ,WAAW,GAAG,MAAM;AACrE,QAAI,QAAQ,8BAAyB;AAAA,EACvC,OAAO;AACL,QAAI,QAAQ,0CAAqC;AAAA,EACnD;AAEA,QAAM,OAAO,cAAc,WAAW;AACtC,MAAI,KAAK,aAAa;AACtB,MAAI,KAAK,mEAAmE;AAC5E,MAAI,KAAK,uBAAuB;AAChC,MAAI,KAAK,0CAA0C,IAAI,QAAQ;AAC/D,MAAI,KAAK,2CAA2C,IAAI,MAAM;AAC9D,MAAI,KAAK,EAAE;AACX,MAAI,KAAK,0DAA0D;AACnE,MAAI,KAAK,yBAAyB;AAClC,MAAI,MAAM;AACZ;","names":[]}
|
|
File without changes
|
|
File without changes
|