octocms 0.3.0 → 0.3.2
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-GRGCRZBL.js → agentDocs-KAVPY3J3.js} +3 -4
- package/dist/{agentDocs-GRGCRZBL.js.map → agentDocs-KAVPY3J3.js.map} +1 -1
- package/dist/chunk-33PHLOAE.js +57 -0
- package/dist/{chunk-6PHFHGTZ.js.map → chunk-33PHLOAE.js.map} +1 -1
- package/dist/{chunk-VL7NZ3J2.js → chunk-IGDBPZSB.js} +88 -1
- package/dist/chunk-IGDBPZSB.js.map +1 -0
- package/dist/{chunk-VN27V5NE.js → chunk-TG624CCO.js} +4 -4
- package/dist/{chunk-VN27V5NE.js.map → chunk-TG624CCO.js.map} +1 -1
- package/dist/cli/index.js +9 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/components/public/{index.d.mts → index.d.ts} +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/{defineConfig.d.mts → defineConfig.d.ts} +1 -1
- package/dist/{dev-MZYDFX7K.js → dev-W5U5LD4P.js} +3 -5
- package/dist/{dev-MZYDFX7K.js.map → dev-W5U5LD4P.js.map} +1 -1
- package/dist/{index.d.mts → index.d.ts} +4 -4
- package/dist/{init-XLCXOUQB.js → init-27Z6QIYE.js} +26 -14
- package/dist/init-27Z6QIYE.js.map +1 -0
- package/dist/{query.d.mts → query.d.ts} +2 -2
- package/dist/{typesGen-RGHGMI34.js → typesGen-RDG5SY5R.js} +3 -4
- package/dist/{typesGen-RGHGMI34.js.map → typesGen-RDG5SY5R.js.map} +1 -1
- package/dist/{update-VXVCXDEE.js → update-YESE5PS2.js} +3 -4
- package/dist/{update-VXVCXDEE.js.map → update-YESE5PS2.js.map} +1 -1
- package/dist/{validate-X6ALTVGH.js → validate-IPA3LKXQ.js} +5 -7
- package/dist/{validate-X6ALTVGH.js.map → validate-IPA3LKXQ.js.map} +1 -1
- package/dist/{withOctoCMS.d.mts → withOctoCMS.d.ts} +1 -1
- package/package.json +9 -8
- package/dist/chunk-6PHFHGTZ.js +0 -35
- package/dist/chunk-VL7NZ3J2.js.map +0 -1
- package/dist/chunk-W6QJTGBC.js +0 -57
- package/dist/chunk-W6QJTGBC.js.map +0 -1
- package/dist/config.d.mts +0 -4
- package/dist/init-XLCXOUQB.js.map +0 -1
- package/dist/jiti-VYEW7A6R.js +0 -3068
- package/dist/jiti-VYEW7A6R.js.map +0 -1
- /package/dist/{types.d.mts → types.d.ts} +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
agentsMdSection,
|
|
3
3
|
agentsMdTemplate
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IGDBPZSB.js";
|
|
5
5
|
import {
|
|
6
6
|
log
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-W6QJTGBC.js";
|
|
7
|
+
} from "./chunk-33PHLOAE.js";
|
|
9
8
|
|
|
10
9
|
// cli/commands/agentDocs.ts
|
|
11
10
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -35,4 +34,4 @@ async function agentDocsCommand(projectRoot) {
|
|
|
35
34
|
export {
|
|
36
35
|
agentDocsCommand
|
|
37
36
|
};
|
|
38
|
-
//# sourceMappingURL=agentDocs-
|
|
37
|
+
//# sourceMappingURL=agentDocs-KAVPY3J3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/commands/agentDocs.ts"],"sourcesContent":["/**\n * `octocms agent-docs` — Inject AI agent documentation 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 contain it yet.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { log } from '../lib/logger';\nimport { agentsMdSection, agentsMdTemplate } from '../lib/templates';\n\nexport async function agentDocsCommand(projectRoot: string): Promise<void> {\n log.header('Agent documentation');\n\n const agentsMdPath = join(projectRoot, 'AGENTS.md');\n const MARKER = '<!-- octocms:agent-docs -->';\n\n if (!existsSync(agentsMdPath)) {\n writeFileSync(agentsMdPath, agentsMdTemplate(), 'utf8');\n log.success('AGENTS.md — created with OctoCMS agent docs section');\n } else {\n const current = readFileSync(agentsMdPath, 'utf8');\n if (current.includes(MARKER)) {\n log.success('AGENTS.md — OctoCMS section already present');\n } else {\n const updated = current.trimEnd() + '\\n\\n' + agentsMdSection() + '\\n';\n writeFileSync(agentsMdPath, updated, 'utf8');\n log.step('AGENTS.md — appended OctoCMS agent docs section');\n }\n }\n\n log.blank();\n log.info('AI agents can now read octocms/docs/ for content management instructions.');\n log.info('Regenerate the docs after schema changes: npm run agent-docs:gen');\n log.blank();\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../cli/commands/agentDocs.ts"],"sourcesContent":["/**\n * `octocms agent-docs` — Inject AI agent documentation 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 contain it yet.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\n\nimport { log } from '../lib/logger';\nimport { agentsMdSection, agentsMdTemplate } from '../lib/templates';\n\nexport async function agentDocsCommand(projectRoot: string): Promise<void> {\n log.header('Agent documentation');\n\n const agentsMdPath = join(projectRoot, 'AGENTS.md');\n const MARKER = '<!-- octocms:agent-docs -->';\n\n if (!existsSync(agentsMdPath)) {\n writeFileSync(agentsMdPath, agentsMdTemplate(), 'utf8');\n log.success('AGENTS.md — created with OctoCMS agent docs section');\n } else {\n const current = readFileSync(agentsMdPath, 'utf8');\n if (current.includes(MARKER)) {\n log.success('AGENTS.md — OctoCMS section already present');\n } else {\n const updated = current.trimEnd() + '\\n\\n' + agentsMdSection() + '\\n';\n writeFileSync(agentsMdPath, updated, 'utf8');\n log.step('AGENTS.md — appended OctoCMS agent docs section');\n }\n }\n\n log.blank();\n log.info('AI agents can now read octocms/docs/ for content management instructions.');\n log.info('Regenerate the docs after schema changes: npm run agent-docs:gen');\n log.blank();\n}\n"],"mappings":";;;;;;;;;AAOA,SAAS,YAAY,cAAc,qBAAqB;AACxD,SAAS,YAAY;AAKrB,eAAsB,iBAAiB,aAAoC;AACzE,MAAI,OAAO,qBAAqB;AAEhC,QAAM,eAAe,KAAK,aAAa,WAAW;AAClD,QAAM,SAAS;AAEf,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,kBAAc,cAAc,iBAAiB,GAAG,MAAM;AACtD,QAAI,QAAQ,0DAAqD;AAAA,EACnE,OAAO;AACL,UAAM,UAAU,aAAa,cAAc,MAAM;AACjD,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,UAAI,QAAQ,kDAA6C;AAAA,IAC3D,OAAO;AACL,YAAM,UAAU,QAAQ,QAAQ,IAAI,SAAS,gBAAgB,IAAI;AACjE,oBAAc,cAAc,SAAS,MAAM;AAC3C,UAAI,KAAK,sDAAiD;AAAA,IAC5D;AAAA,EACF;AAEA,MAAI,MAAM;AACV,MAAI,KAAK,2EAA2E;AACpF,MAAI,KAAK,kEAAkE;AAC3E,MAAI,MAAM;AACZ;","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
|
|
21
|
+
// cli/lib/logger.ts
|
|
22
|
+
var RESET = "\x1B[0m";
|
|
23
|
+
var BOLD = "\x1B[1m";
|
|
24
|
+
var DIM = "\x1B[2m";
|
|
25
|
+
var RED = "\x1B[31m";
|
|
26
|
+
var GREEN = "\x1B[32m";
|
|
27
|
+
var YELLOW = "\x1B[33m";
|
|
28
|
+
var CYAN = "\x1B[36m";
|
|
29
|
+
var fmt = {
|
|
30
|
+
bold: (s) => `${BOLD}${s}${RESET}`,
|
|
31
|
+
dim: (s) => `${DIM}${s}${RESET}`,
|
|
32
|
+
red: (s) => `${RED}${s}${RESET}`,
|
|
33
|
+
green: (s) => `${GREEN}${s}${RESET}`,
|
|
34
|
+
yellow: (s) => `${YELLOW}${s}${RESET}`,
|
|
35
|
+
cyan: (s) => `${CYAN}${s}${RESET}`
|
|
36
|
+
};
|
|
37
|
+
var log = {
|
|
38
|
+
info: (msg) => console.log(` ${msg}`),
|
|
39
|
+
success: (msg) => console.log(` ${fmt.green("\u2713")} ${msg}`),
|
|
40
|
+
warn: (msg) => console.log(` ${fmt.yellow("\u26A0")} ${msg}`),
|
|
41
|
+
error: (msg) => console.error(` ${fmt.red("\u2717")} ${msg}`),
|
|
42
|
+
step: (msg) => console.log(` ${fmt.cyan("\u21BB")} ${msg}`),
|
|
43
|
+
blank: () => console.log(),
|
|
44
|
+
header: (title) => {
|
|
45
|
+
console.log();
|
|
46
|
+
console.log(` ${fmt.bold(`OctoCMS`)} \u2014 ${title}`);
|
|
47
|
+
console.log();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
__spreadValues,
|
|
53
|
+
__spreadProps,
|
|
54
|
+
fmt,
|
|
55
|
+
log
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=chunk-33PHLOAE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/lib/logger.ts"],"sourcesContent":["/* eslint-disable no-console */\n/** ANSI color helpers for CLI output. No external dependencies. */\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\n\nexport const fmt = {\n bold: (s: string) => `${BOLD}${s}${RESET}`,\n dim: (s: string) => `${DIM}${s}${RESET}`,\n red: (s: string) => `${RED}${s}${RESET}`,\n green: (s: string) => `${GREEN}${s}${RESET}`,\n yellow: (s: string) => `${YELLOW}${s}${RESET}`,\n cyan: (s: string) => `${CYAN}${s}${RESET}`,\n};\n\nexport const log = {\n info: (msg: string) => console.log(` ${msg}`),\n success: (msg: string) => console.log(` ${fmt.green('✓')} ${msg}`),\n warn: (msg: string) => console.log(` ${fmt.yellow('⚠')} ${msg}`),\n error: (msg: string) => console.error(` ${fmt.red('✗')} ${msg}`),\n step: (msg: string) => console.log(` ${fmt.cyan('↻')} ${msg}`),\n blank: () => console.log(),\n header: (title: string) => {\n console.log();\n console.log(` ${fmt.bold(`OctoCMS`)} — ${title}`);\n console.log();\n },\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../cli/lib/logger.ts"],"sourcesContent":["/* eslint-disable no-console */\n/** ANSI color helpers for CLI output. No external dependencies. */\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\n\nexport const fmt = {\n bold: (s: string) => `${BOLD}${s}${RESET}`,\n dim: (s: string) => `${DIM}${s}${RESET}`,\n red: (s: string) => `${RED}${s}${RESET}`,\n green: (s: string) => `${GREEN}${s}${RESET}`,\n yellow: (s: string) => `${YELLOW}${s}${RESET}`,\n cyan: (s: string) => `${CYAN}${s}${RESET}`,\n};\n\nexport const log = {\n info: (msg: string) => console.log(` ${msg}`),\n success: (msg: string) => console.log(` ${fmt.green('✓')} ${msg}`),\n warn: (msg: string) => console.log(` ${fmt.yellow('⚠')} ${msg}`),\n error: (msg: string) => console.error(` ${fmt.red('✗')} ${msg}`),\n step: (msg: string) => console.log(` ${fmt.cyan('↻')} ${msg}`),\n blank: () => console.log(),\n header: (title: string) => {\n console.log();\n console.log(` ${fmt.bold(`OctoCMS`)} — ${title}`);\n console.log();\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGA,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,OAAO;AAEN,IAAM,MAAM;AAAA,EACjB,MAAM,CAAC,MAAc,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK;AAAA,EACxC,KAAK,CAAC,MAAc,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK;AAAA,EACtC,KAAK,CAAC,MAAc,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK;AAAA,EACtC,OAAO,CAAC,MAAc,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK;AAAA,EAC1C,QAAQ,CAAC,MAAc,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK;AAAA,EAC5C,MAAM,CAAC,MAAc,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK;AAC1C;AAEO,IAAM,MAAM;AAAA,EACjB,MAAM,CAAC,QAAgB,QAAQ,IAAI,KAAK,GAAG,EAAE;AAAA,EAC7C,SAAS,CAAC,QAAgB,QAAQ,IAAI,KAAK,IAAI,MAAM,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAClE,MAAM,CAAC,QAAgB,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAChE,OAAO,CAAC,QAAgB,QAAQ,MAAM,KAAK,IAAI,IAAI,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAChE,MAAM,CAAC,QAAgB,QAAQ,IAAI,KAAK,IAAI,KAAK,QAAG,CAAC,IAAI,GAAG,EAAE;AAAA,EAC9D,OAAO,MAAM,QAAQ,IAAI;AAAA,EACzB,QAAQ,CAAC,UAAkB;AACzB,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK,IAAI,KAAK,SAAS,CAAC,WAAM,KAAK,EAAE;AACjD,YAAQ,IAAI;AAAA,EACd;AACF;","names":[]}
|
|
@@ -1,4 +1,85 @@
|
|
|
1
1
|
// cli/lib/templates.ts
|
|
2
|
+
var CODEGEN_BANNER = `/*
|
|
3
|
+
* AUTO-GENERATED \u2014 DO NOT EDIT.
|
|
4
|
+
* Generated from cms/octocms.config.ts.
|
|
5
|
+
* Run \`npx octocms types:gen\` to regenerate.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
`;
|
|
9
|
+
var generatedTypesTemplate = CODEGEN_BANNER + `import type { EntryStatus } from 'octocms/types';
|
|
10
|
+
|
|
11
|
+
export interface HelloPageFields {
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface HelloPageEntry {
|
|
17
|
+
sys: { id: string; type: 'helloPage'; status: EntryStatus };
|
|
18
|
+
fields: HelloPageFields;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type AnyEntry = HelloPageEntry;
|
|
22
|
+
|
|
23
|
+
export type EntryMap = {
|
|
24
|
+
helloPage: HelloPageEntry;
|
|
25
|
+
};
|
|
26
|
+
`;
|
|
27
|
+
var generatedEnumsTemplate = CODEGEN_BANNER + `export const CollectionName = {
|
|
28
|
+
HelloPage: 'helloPage',
|
|
29
|
+
} as const;
|
|
30
|
+
export type CollectionName = (typeof CollectionName)[keyof typeof CollectionName];
|
|
31
|
+
|
|
32
|
+
export const COLLECTION_NAMES = ['helloPage'] as const;
|
|
33
|
+
|
|
34
|
+
export const FieldFormat = {
|
|
35
|
+
String: 'string',
|
|
36
|
+
Text: 'text',
|
|
37
|
+
Markdown: 'markdown',
|
|
38
|
+
Boolean: 'boolean',
|
|
39
|
+
Reference: 'reference',
|
|
40
|
+
Image: 'image',
|
|
41
|
+
Number: 'number',
|
|
42
|
+
Datetime: 'datetime',
|
|
43
|
+
Json: 'json',
|
|
44
|
+
Slug: 'slug',
|
|
45
|
+
Select: 'select',
|
|
46
|
+
Url: 'url',
|
|
47
|
+
Color: 'color',
|
|
48
|
+
Conditional: 'conditional',
|
|
49
|
+
Richtext: 'richtext',
|
|
50
|
+
} as const;
|
|
51
|
+
export type FieldFormat = (typeof FieldFormat)[keyof typeof FieldFormat];
|
|
52
|
+
`;
|
|
53
|
+
var generatedContentDeclsTemplate = CODEGEN_BANNER + `import type { EntryStatus } from 'octocms/types';
|
|
54
|
+
|
|
55
|
+
// Raw on-disk types (before query() processing).
|
|
56
|
+
export interface RawHelloPageFields {
|
|
57
|
+
title: string;
|
|
58
|
+
description: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface RawHelloPageEntry {
|
|
62
|
+
sys: { id: string; type: 'helloPage'; status: EntryStatus };
|
|
63
|
+
fields: RawHelloPageFields;
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
var generatedIndexTemplate = CODEGEN_BANNER + `export * from './types';
|
|
67
|
+
export * from './enums';
|
|
68
|
+
export * from './query';
|
|
69
|
+
`;
|
|
70
|
+
var generatedQueryTemplate = CODEGEN_BANNER + `import { createQuery } from 'octocms/query';
|
|
71
|
+
import { configOctoCMS, type OctoConfig } from '../octocms.config';
|
|
72
|
+
import type { EntryMap } from './types';
|
|
73
|
+
|
|
74
|
+
// configOctoCMS is widened to Config for admin internals; cast back to OctoConfig so
|
|
75
|
+
// createQuery preserves literal collection/field names for type-safe queries.
|
|
76
|
+
export const query = createQuery<EntryMap, OctoConfig>(configOctoCMS as unknown as OctoConfig);
|
|
77
|
+
`;
|
|
78
|
+
var generatedConfigInitTemplate = CODEGEN_BANNER + `import { configOctoCMS } from '../octocms.config';
|
|
79
|
+
import { setConfig } from 'octocms/lib/configStore';
|
|
80
|
+
|
|
81
|
+
setConfig(configOctoCMS);
|
|
82
|
+
`;
|
|
2
83
|
var adminLayoutTemplate = `import '../../cms/__generated__/configInit';
|
|
3
84
|
import 'octocms/globals.css';
|
|
4
85
|
import '@mdxeditor/editor/style.css';
|
|
@@ -161,6 +242,12 @@ function tsconfigPaths() {
|
|
|
161
242
|
}
|
|
162
243
|
|
|
163
244
|
export {
|
|
245
|
+
generatedTypesTemplate,
|
|
246
|
+
generatedEnumsTemplate,
|
|
247
|
+
generatedContentDeclsTemplate,
|
|
248
|
+
generatedIndexTemplate,
|
|
249
|
+
generatedQueryTemplate,
|
|
250
|
+
generatedConfigInitTemplate,
|
|
164
251
|
adminLayoutTemplate,
|
|
165
252
|
adminPageTemplate,
|
|
166
253
|
octoConfigTemplate,
|
|
@@ -173,4 +260,4 @@ export {
|
|
|
173
260
|
agentsMdTemplate,
|
|
174
261
|
tsconfigPaths
|
|
175
262
|
};
|
|
176
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-IGDBPZSB.js.map
|
|
@@ -0,0 +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\nexport const adminLayoutTemplate = `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\nexport const adminPageTemplate = `export { AdminApp as default } from 'octocms/admin/AdminApp';\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 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":";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;AAMK,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B,IAAM,oBAAoB;AAAA;AAG1B,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;AAkBV;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;AAuCzB;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":[]}
|
|
@@ -16,7 +16,7 @@ function resolveProjectRoot(startDir) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
async function loadProjectConfig(projectRoot) {
|
|
19
|
-
const { createJiti } = await import("
|
|
19
|
+
const { createJiti } = await import("jiti");
|
|
20
20
|
const alias = {};
|
|
21
21
|
const localOctocms = resolve(projectRoot, "octocms");
|
|
22
22
|
if (existsSync(localOctocms)) {
|
|
@@ -37,7 +37,7 @@ async function loadProjectConfig(projectRoot) {
|
|
|
37
37
|
return mod.configOctoCMS;
|
|
38
38
|
}
|
|
39
39
|
async function loadCollections(projectRoot) {
|
|
40
|
-
const { createJiti } = await import("
|
|
40
|
+
const { createJiti } = await import("jiti");
|
|
41
41
|
const alias = {};
|
|
42
42
|
const localOctocms = resolve(projectRoot, "octocms");
|
|
43
43
|
if (existsSync(localOctocms)) {
|
|
@@ -58,7 +58,7 @@ async function loadCollections(projectRoot) {
|
|
|
58
58
|
return mod.COLLECTIONS;
|
|
59
59
|
}
|
|
60
60
|
async function loadFieldTypes(projectRoot) {
|
|
61
|
-
const { createJiti } = await import("
|
|
61
|
+
const { createJiti } = await import("jiti");
|
|
62
62
|
const alias = {};
|
|
63
63
|
const localOctocms = resolve(projectRoot, "octocms");
|
|
64
64
|
if (existsSync(localOctocms)) {
|
|
@@ -85,4 +85,4 @@ export {
|
|
|
85
85
|
loadCollections,
|
|
86
86
|
loadFieldTypes
|
|
87
87
|
};
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
88
|
+
//# sourceMappingURL=chunk-TG624CCO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/lib/project.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve } from 'path';\n\n/**\n * Walk up from `startDir` until we find a directory containing a\n * `next.config.ts` that includes `withOctoCMS`.\n * Returns the absolute path to the project root.\n */\nexport function resolveProjectRoot(startDir?: string): string {\n let dir = startDir ?? process.cwd();\n for (;;) {\n const nextConfigPath = join(dir, 'next.config.ts');\n if (existsSync(nextConfigPath) && readFileSync(nextConfigPath, 'utf8').includes('withOctoCMS')) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) {\n throw new Error('Could not find next.config.ts with withOctoCMS — are you inside an OctoCMS project?');\n }\n dir = parent;\n }\n}\n\n/**\n * Load the CMS config from a project root. Uses `jiti` to handle TypeScript\n * files and tsconfig path aliases at runtime.\n */\nexport async function loadProjectConfig(projectRoot: string) {\n // Dynamic import so jiti stays an optional peer when published\n const { createJiti } = await import('jiti');\n // In this monorepo, octocms/ lives at the project root. When installed as an npm\n // package it lives in node_modules/octocms — jiti resolves it normally in that case.\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'cms', 'octocms.config.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !mod.configOctoCMS) {\n throw new Error('cms/octocms.config.ts must export a `configOctoCMS` object (use defineConfig())');\n }\n return mod.configOctoCMS as import('../../types').Config;\n}\n\n/**\n * Load the COLLECTIONS array from `octocms/admin/consts.ts`.\n */\nexport async function loadCollections(projectRoot: string): Promise<readonly string[]> {\n const { createJiti } = await import('jiti');\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'octocms/admin/consts.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !Array.isArray(mod.COLLECTIONS)) {\n throw new Error('Could not load COLLECTIONS from octocms/admin/consts.ts');\n }\n return mod.COLLECTIONS as readonly string[];\n}\n\n/**\n * Load FIELD_TYPES from `octocms/admin/consts.ts`.\n */\nexport async function loadFieldTypes(projectRoot: string): Promise<readonly string[]> {\n const { createJiti } = await import('jiti');\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'octocms/admin/consts.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !Array.isArray(mod.FIELD_TYPES)) {\n throw new Error('Could not load FIELD_TYPES from octocms/admin/consts.ts');\n }\n return mod.FIELD_TYPES as readonly string[];\n}\n"],"mappings":";AAAA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,MAAM,eAAe;AAOhC,SAAS,mBAAmB,UAA2B;AAC5D,MAAI,MAAM,8BAAY,QAAQ,IAAI;AAClC,aAAS;AACP,UAAM,iBAAiB,KAAK,KAAK,gBAAgB;AACjD,QAAI,WAAW,cAAc,KAAK,aAAa,gBAAgB,MAAM,EAAE,SAAS,aAAa,GAAG;AAC9F,aAAO;AAAA,IACT;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,KAAK;AAClB,YAAM,IAAI,MAAM,0FAAqF;AAAA,IACvG;AACA,UAAM;AAAA,EACR;AACF;AAMA,eAAsB,kBAAkB,aAAqB;AAE3D,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,
|
|
1
|
+
{"version":3,"sources":["../cli/lib/project.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve } from 'path';\n\n/**\n * Walk up from `startDir` until we find a directory containing a\n * `next.config.ts` that includes `withOctoCMS`.\n * Returns the absolute path to the project root.\n */\nexport function resolveProjectRoot(startDir?: string): string {\n let dir = startDir ?? process.cwd();\n for (;;) {\n const nextConfigPath = join(dir, 'next.config.ts');\n if (existsSync(nextConfigPath) && readFileSync(nextConfigPath, 'utf8').includes('withOctoCMS')) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) {\n throw new Error('Could not find next.config.ts with withOctoCMS — are you inside an OctoCMS project?');\n }\n dir = parent;\n }\n}\n\n/**\n * Load the CMS config from a project root. Uses `jiti` to handle TypeScript\n * files and tsconfig path aliases at runtime.\n */\nexport async function loadProjectConfig(projectRoot: string) {\n // Dynamic import so jiti stays an optional peer when published\n const { createJiti } = await import('jiti');\n // In this monorepo, octocms/ lives at the project root. When installed as an npm\n // package it lives in node_modules/octocms — jiti resolves it normally in that case.\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'cms', 'octocms.config.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !mod.configOctoCMS) {\n throw new Error('cms/octocms.config.ts must export a `configOctoCMS` object (use defineConfig())');\n }\n return mod.configOctoCMS as import('../../types').Config;\n}\n\n/**\n * Load the COLLECTIONS array from `octocms/admin/consts.ts`.\n */\nexport async function loadCollections(projectRoot: string): Promise<readonly string[]> {\n const { createJiti } = await import('jiti');\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'octocms/admin/consts.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !Array.isArray(mod.COLLECTIONS)) {\n throw new Error('Could not load COLLECTIONS from octocms/admin/consts.ts');\n }\n return mod.COLLECTIONS as readonly string[];\n}\n\n/**\n * Load FIELD_TYPES from `octocms/admin/consts.ts`.\n */\nexport async function loadFieldTypes(projectRoot: string): Promise<readonly string[]> {\n const { createJiti } = await import('jiti');\n const alias: Record<string, string> = {};\n const localOctocms = resolve(projectRoot, 'octocms');\n if (existsSync(localOctocms)) {\n alias['octocms/'] = localOctocms + '/';\n }\n const jiti = createJiti(join(projectRoot, '__cli_loader__.ts'), {\n fsCache: false,\n moduleCache: false,\n alias,\n });\n const mod = (await jiti.import(join(projectRoot, 'octocms/admin/consts.ts'), {\n default: true,\n try: true,\n })) as Record<string, unknown> | undefined;\n if (!mod || !Array.isArray(mod.FIELD_TYPES)) {\n throw new Error('Could not load FIELD_TYPES from octocms/admin/consts.ts');\n }\n return mod.FIELD_TYPES as readonly string[];\n}\n"],"mappings":";AAAA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,MAAM,eAAe;AAOhC,SAAS,mBAAmB,UAA2B;AAC5D,MAAI,MAAM,8BAAY,QAAQ,IAAI;AAClC,aAAS;AACP,UAAM,iBAAiB,KAAK,KAAK,gBAAgB;AACjD,QAAI,WAAW,cAAc,KAAK,aAAa,gBAAgB,MAAM,EAAE,SAAS,aAAa,GAAG;AAC9F,aAAO;AAAA,IACT;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,KAAK;AAClB,YAAM,IAAI,MAAM,0FAAqF;AAAA,IACvG;AACA,UAAM;AAAA,EACR;AACF;AAMA,eAAsB,kBAAkB,aAAqB;AAE3D,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAG1C,QAAM,QAAgC,CAAC;AACvC,QAAM,eAAe,QAAQ,aAAa,SAAS;AACnD,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,UAAU,IAAI,eAAe;AAAA,EACrC;AACA,QAAM,OAAO,WAAW,KAAK,aAAa,mBAAmB,GAAG;AAAA,IAC9D,SAAS;AAAA,IACT,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,QAAM,MAAO,MAAM,KAAK,OAAO,KAAK,aAAa,OAAO,mBAAmB,GAAG;AAAA,IAC5E,SAAS;AAAA,IACT,KAAK;AAAA,EACP,CAAC;AACD,MAAI,CAAC,OAAO,CAAC,IAAI,eAAe;AAC9B,UAAM,IAAI,MAAM,iFAAiF;AAAA,EACnG;AACA,SAAO,IAAI;AACb;AAKA,eAAsB,gBAAgB,aAAiD;AACrF,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAC1C,QAAM,QAAgC,CAAC;AACvC,QAAM,eAAe,QAAQ,aAAa,SAAS;AACnD,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,UAAU,IAAI,eAAe;AAAA,EACrC;AACA,QAAM,OAAO,WAAW,KAAK,aAAa,mBAAmB,GAAG;AAAA,IAC9D,SAAS;AAAA,IACT,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,QAAM,MAAO,MAAM,KAAK,OAAO,KAAK,aAAa,yBAAyB,GAAG;AAAA,IAC3E,SAAS;AAAA,IACT,KAAK;AAAA,EACP,CAAC;AACD,MAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAC3C,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO,IAAI;AACb;AAKA,eAAsB,eAAe,aAAiD;AACpF,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,MAAM;AAC1C,QAAM,QAAgC,CAAC;AACvC,QAAM,eAAe,QAAQ,aAAa,SAAS;AACnD,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,UAAU,IAAI,eAAe;AAAA,EACrC;AACA,QAAM,OAAO,WAAW,KAAK,aAAa,mBAAmB,GAAG;AAAA,IAC9D,SAAS;AAAA,IACT,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,QAAM,MAAO,MAAM,KAAK,OAAO,KAAK,aAAa,yBAAyB,GAAG;AAAA,IAC3E,SAAS;AAAA,IACT,KAAK;AAAA,EACP,CAAC;AACD,MAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAC3C,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,SAAO,IAAI;AACb;","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveProjectRoot
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-TG624CCO.js";
|
|
5
5
|
import {
|
|
6
6
|
fmt,
|
|
7
7
|
log
|
|
8
|
-
} from "../chunk-
|
|
9
|
-
import "../chunk-W6QJTGBC.js";
|
|
8
|
+
} from "../chunk-33PHLOAE.js";
|
|
10
9
|
|
|
11
10
|
// package.json
|
|
12
|
-
var version = "0.3.
|
|
11
|
+
var version = "0.3.2";
|
|
13
12
|
|
|
14
13
|
// cli/index.ts
|
|
15
14
|
var HELP = `
|
|
@@ -149,38 +148,38 @@ async function main() {
|
|
|
149
148
|
try {
|
|
150
149
|
switch (command) {
|
|
151
150
|
case "init": {
|
|
152
|
-
const { initCommand } = await import("../init-
|
|
151
|
+
const { initCommand } = await import("../init-27Z6QIYE.js");
|
|
153
152
|
await initCommand(process.cwd(), { yes: flags.yes === true });
|
|
154
153
|
break;
|
|
155
154
|
}
|
|
156
155
|
case "dev": {
|
|
157
156
|
const projectRoot = resolveProjectRoot();
|
|
158
|
-
const { devCommand } = await import("../dev-
|
|
157
|
+
const { devCommand } = await import("../dev-W5U5LD4P.js");
|
|
159
158
|
const port = flags.port ? Number(flags.port) : void 0;
|
|
160
159
|
await devCommand(projectRoot, { port });
|
|
161
160
|
break;
|
|
162
161
|
}
|
|
163
162
|
case "types:gen": {
|
|
164
163
|
const projectRoot = resolveProjectRoot();
|
|
165
|
-
const { typesGenCommand } = await import("../typesGen-
|
|
164
|
+
const { typesGenCommand } = await import("../typesGen-RDG5SY5R.js");
|
|
166
165
|
await typesGenCommand(projectRoot);
|
|
167
166
|
break;
|
|
168
167
|
}
|
|
169
168
|
case "validate": {
|
|
170
169
|
const projectRoot = resolveProjectRoot();
|
|
171
|
-
const { validateCommand } = await import("../validate-
|
|
170
|
+
const { validateCommand } = await import("../validate-IPA3LKXQ.js");
|
|
172
171
|
await validateCommand(projectRoot);
|
|
173
172
|
break;
|
|
174
173
|
}
|
|
175
174
|
case "update": {
|
|
176
175
|
const projectRoot = resolveProjectRoot();
|
|
177
|
-
const { updateCommand } = await import("../update-
|
|
176
|
+
const { updateCommand } = await import("../update-YESE5PS2.js");
|
|
178
177
|
await updateCommand(projectRoot);
|
|
179
178
|
break;
|
|
180
179
|
}
|
|
181
180
|
case "agent-docs": {
|
|
182
181
|
const projectRoot = resolveProjectRoot();
|
|
183
|
-
const { agentDocsCommand } = await import("../agentDocs-
|
|
182
|
+
const { agentDocsCommand } = await import("../agentDocs-KAVPY3J3.js");
|
|
184
183
|
await agentDocsCommand(projectRoot);
|
|
185
184
|
break;
|
|
186
185
|
}
|
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.3.0\",\n \"description\": \"A file-based CMS for Next.js — schema-driven, Git-backed, no database\",\n \"license\": \"MIT\",\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.mts\",\n \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.mts\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.mts\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.mts\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.mts\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.mts\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.mts\",\n \"import\": \"./dist/components/public/index.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\",\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 \"next\": \">=15\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"@mdxeditor/editor\": \"^3.11.4\",\n \"@radix-ui/react-avatar\": \"^1.1.11\",\n \"@radix-ui/react-dialog\": \"^1.1.15\",\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"@radix-ui/react-label\": \"^2.1.8\",\n \"@radix-ui/react-select\": \"^2.2.6\",\n \"@radix-ui/react-slot\": \"^1.2.4\",\n \"@radix-ui/react-tabs\": \"^1.1.13\",\n \"@radix-ui/react-toast\": \"^1.2.15\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"glob\": \"^11.0.0\",\n \"lucide-react\": \"^1.7.0\",\n \"minisearch\": \"^7.2.0\",\n \"next-auth\": \"^4.24.13\",\n \"octokit\": \"^4.1.4\",\n \"react-markdown\": \"^10.1.0\",\n \"rehype-sanitize\": \"^6.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"remark-mdx\": \"^3.1.1\",\n \"sharp\": \"^0.34.5\",\n \"slugify\": \"^1.6.9\",\n \"sonner\": \"^2.0.7\",\n \"tailwind-merge\": \"^3.5.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\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 * 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 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 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 === '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 '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
|
+
{"version":3,"sources":["../../package.json","../../cli/index.ts"],"sourcesContent":["{\n \"name\": \"octocms\",\n \"version\": \"0.3.2\",\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 \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.ts\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.ts\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.ts\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.ts\",\n \"import\": \"./dist/components/public/index.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\",\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 \"next\": \">=15\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"dependencies\": {\n \"@mdxeditor/editor\": \"^3.11.4\",\n \"@radix-ui/react-avatar\": \"^1.1.11\",\n \"@radix-ui/react-dialog\": \"^1.1.15\",\n \"@radix-ui/react-dropdown-menu\": \"^2.1.16\",\n \"@radix-ui/react-label\": \"^2.1.8\",\n \"@radix-ui/react-select\": \"^2.2.6\",\n \"@radix-ui/react-slot\": \"^1.2.4\",\n \"@radix-ui/react-tabs\": \"^1.1.13\",\n \"@radix-ui/react-toast\": \"^1.2.15\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"glob\": \"^11.0.0\",\n \"lucide-react\": \"^1.7.0\",\n \"minisearch\": \"^7.2.0\",\n \"next-auth\": \"^4.24.13\",\n \"octokit\": \"^4.1.4\",\n \"react-markdown\": \"^10.1.0\",\n \"rehype-sanitize\": \"^6.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"remark-mdx\": \"^3.1.1\",\n \"sharp\": \"^0.34.5\",\n \"slugify\": \"^1.6.9\",\n \"sonner\": \"^2.0.7\",\n \"tailwind-merge\": \"^3.5.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\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 * 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 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 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 === '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 '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":[]}
|
package/dist/config.d.ts
ADDED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
__spreadValues,
|
|
2
3
|
log
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
__spreadValues
|
|
6
|
-
} from "./chunk-W6QJTGBC.js";
|
|
4
|
+
} from "./chunk-33PHLOAE.js";
|
|
7
5
|
|
|
8
6
|
// cli/commands/dev.ts
|
|
9
7
|
import { spawn } from "child_process";
|
|
@@ -84,4 +82,4 @@ function regenerateTypes(projectRoot) {
|
|
|
84
82
|
export {
|
|
85
83
|
devCommand
|
|
86
84
|
};
|
|
87
|
-
//# sourceMappingURL=dev-
|
|
85
|
+
//# sourceMappingURL=dev-W5U5LD4P.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/commands/dev.ts"],"sourcesContent":["/**\n * `octocms dev` — Start Next.js dev server with next.config.ts watching.\n *\n * Spawns `next dev` and watches the config file for changes. When the\n * config changes, types are automatically regenerated.\n */\n\nimport { spawn } from 'child_process';\nimport { existsSync, watch } from 'fs';\nimport { join } from 'path';\n\nimport { log } from '../lib/logger';\n\nexport type DevOptions = {\n port?: number;\n};\n\nexport async function devCommand(projectRoot: string, options: DevOptions = {}): Promise<void> {\n const port = options.port ?? 3000;\n\n log.header('Development server');\n\n const nextConfigPath = join(projectRoot, 'next.config.ts');\n const octoConfigPath = join(projectRoot, 'cms', 'octocms.config.ts');\n if (!existsSync(nextConfigPath)) {\n log.error('next.config.ts not found — run `octocms init` first.');\n process.exitCode = 1;\n return;\n }\n\n log.info(`Starting Next.js dev server on port ${port}...`);\n log.info('Watching next.config.ts and cms/octocms.config.ts for changes...');\n log.blank();\n\n // Spawn next dev\n const nextBin = join(projectRoot, 'node_modules', '.bin', 'next');\n const child = spawn(nextBin, ['dev', '-p', String(port)], {\n cwd: projectRoot,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n // Watch both config files for changes and regenerate types\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const onConfigChange = () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n regenerateTypes(projectRoot);\n }, 300);\n };\n\n const nextWatcher = watch(nextConfigPath, onConfigChange);\n const octoWatcher = existsSync(octoConfigPath) ? watch(octoConfigPath, onConfigChange) : null;\n\n // Forward signals to child\n const cleanup = () => {\n nextWatcher.close();\n octoWatcher?.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n child.kill();\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n child.on('exit', (code) => {\n nextWatcher.close();\n octoWatcher?.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n process.exitCode = code ?? 0;\n });\n}\n\nfunction regenerateTypes(projectRoot: string): void {\n log.blank();\n log.step('Config changed — regenerating types...');\n\n const jitiBin = join(projectRoot, 'node_modules', '.bin', 'jiti');\n const scriptPath = join(projectRoot, 'scripts', 'generate-types.ts');\n\n const child = spawn(jitiBin, [scriptPath], {\n cwd: projectRoot,\n stdio: 'pipe',\n });\n\n let stderr = '';\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n log.success('Types regenerated');\n } else {\n log.error('Type generation failed:');\n if (stderr.trim()) {\n for (const line of stderr.trim().split('\\n')) {\n log.info(` ${line}`);\n }\n }\n }\n log.blank();\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../cli/commands/dev.ts"],"sourcesContent":["/**\n * `octocms dev` — Start Next.js dev server with next.config.ts watching.\n *\n * Spawns `next dev` and watches the config file for changes. When the\n * config changes, types are automatically regenerated.\n */\n\nimport { spawn } from 'child_process';\nimport { existsSync, watch } from 'fs';\nimport { join } from 'path';\n\nimport { log } from '../lib/logger';\n\nexport type DevOptions = {\n port?: number;\n};\n\nexport async function devCommand(projectRoot: string, options: DevOptions = {}): Promise<void> {\n const port = options.port ?? 3000;\n\n log.header('Development server');\n\n const nextConfigPath = join(projectRoot, 'next.config.ts');\n const octoConfigPath = join(projectRoot, 'cms', 'octocms.config.ts');\n if (!existsSync(nextConfigPath)) {\n log.error('next.config.ts not found — run `octocms init` first.');\n process.exitCode = 1;\n return;\n }\n\n log.info(`Starting Next.js dev server on port ${port}...`);\n log.info('Watching next.config.ts and cms/octocms.config.ts for changes...');\n log.blank();\n\n // Spawn next dev\n const nextBin = join(projectRoot, 'node_modules', '.bin', 'next');\n const child = spawn(nextBin, ['dev', '-p', String(port)], {\n cwd: projectRoot,\n stdio: 'inherit',\n env: { ...process.env },\n });\n\n // Watch both config files for changes and regenerate types\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const onConfigChange = () => {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n regenerateTypes(projectRoot);\n }, 300);\n };\n\n const nextWatcher = watch(nextConfigPath, onConfigChange);\n const octoWatcher = existsSync(octoConfigPath) ? watch(octoConfigPath, onConfigChange) : null;\n\n // Forward signals to child\n const cleanup = () => {\n nextWatcher.close();\n octoWatcher?.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n child.kill();\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n child.on('exit', (code) => {\n nextWatcher.close();\n octoWatcher?.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n process.exitCode = code ?? 0;\n });\n}\n\nfunction regenerateTypes(projectRoot: string): void {\n log.blank();\n log.step('Config changed — regenerating types...');\n\n const jitiBin = join(projectRoot, 'node_modules', '.bin', 'jiti');\n const scriptPath = join(projectRoot, 'scripts', 'generate-types.ts');\n\n const child = spawn(jitiBin, [scriptPath], {\n cwd: projectRoot,\n stdio: 'pipe',\n });\n\n let stderr = '';\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n log.success('Types regenerated');\n } else {\n log.error('Type generation failed:');\n if (stderr.trim()) {\n for (const line of stderr.trim().split('\\n')) {\n log.info(` ${line}`);\n }\n }\n }\n log.blank();\n });\n}\n"],"mappings":";;;;;;AAOA,SAAS,aAAa;AACtB,SAAS,YAAY,aAAa;AAClC,SAAS,YAAY;AAQrB,eAAsB,WAAW,aAAqB,UAAsB,CAAC,GAAkB;AAjB/F;AAkBE,QAAM,QAAO,aAAQ,SAAR,YAAgB;AAE7B,MAAI,OAAO,oBAAoB;AAE/B,QAAM,iBAAiB,KAAK,aAAa,gBAAgB;AACzD,QAAM,iBAAiB,KAAK,aAAa,OAAO,mBAAmB;AACnE,MAAI,CAAC,WAAW,cAAc,GAAG;AAC/B,QAAI,MAAM,2DAAsD;AAChE,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI,KAAK,uCAAuC,IAAI,KAAK;AACzD,MAAI,KAAK,kEAAkE;AAC3E,MAAI,MAAM;AAGV,QAAM,UAAU,KAAK,aAAa,gBAAgB,QAAQ,MAAM;AAChE,QAAM,QAAQ,MAAM,SAAS,CAAC,OAAO,MAAM,OAAO,IAAI,CAAC,GAAG;AAAA,IACxD,KAAK;AAAA,IACL,OAAO;AAAA,IACP,KAAK,mBAAK,QAAQ;AAAA,EACpB,CAAC;AAGD,MAAI,gBAAsD;AAE1D,QAAM,iBAAiB,MAAM;AAC3B,QAAI,cAAe,cAAa,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,sBAAgB,WAAW;AAAA,IAC7B,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,cAAc,MAAM,gBAAgB,cAAc;AACxD,QAAM,cAAc,WAAW,cAAc,IAAI,MAAM,gBAAgB,cAAc,IAAI;AAGzF,QAAM,UAAU,MAAM;AACpB,gBAAY,MAAM;AAClB,+CAAa;AACb,QAAI,cAAe,cAAa,aAAa;AAC7C,UAAM,KAAK;AAAA,EACb;AAEA,UAAQ,GAAG,UAAU,OAAO;AAC5B,UAAQ,GAAG,WAAW,OAAO;AAE7B,QAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,gBAAY,MAAM;AAClB,+CAAa;AACb,QAAI,cAAe,cAAa,aAAa;AAC7C,YAAQ,WAAW,sBAAQ;AAAA,EAC7B,CAAC;AACH;AAEA,SAAS,gBAAgB,aAA2B;AA1EpD;AA2EE,MAAI,MAAM;AACV,MAAI,KAAK,6CAAwC;AAEjD,QAAM,UAAU,KAAK,aAAa,gBAAgB,QAAQ,MAAM;AAChE,QAAM,aAAa,KAAK,aAAa,WAAW,mBAAmB;AAEnE,QAAM,QAAQ,MAAM,SAAS,CAAC,UAAU,GAAG;AAAA,IACzC,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AAED,MAAI,SAAS;AACb,cAAM,WAAN,mBAAc,GAAG,QAAQ,CAAC,SAAiB;AACzC,cAAU,KAAK,SAAS;AAAA,EAC1B;AAEA,QAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,QAAI,SAAS,GAAG;AACd,UAAI,QAAQ,mBAAmB;AAAA,IACjC,OAAO;AACL,UAAI,MAAM,yBAAyB;AACnC,UAAI,OAAO,KAAK,GAAG;AACjB,mBAAW,QAAQ,OAAO,KAAK,EAAE,MAAM,IAAI,GAAG;AAC5C,cAAI,KAAK,KAAK,IAAI,EAAE;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createQuery } from './query.
|
|
2
|
-
export { CollectionNames, FieldFormatToType, InferConditions, InferEntry, InferFields, defineConfig } from './defineConfig.
|
|
3
|
-
export { withOctoCMS } from './withOctoCMS.
|
|
4
|
-
export { Collection, CollectionField, Config, EntryStatus, FieldFormat, GitIntegrationConfig, ReferenceFieldConfig, ResolvedImageField, RichTextDocument, RichTextNode, SearchConfig, SelectOption } from './types.
|
|
1
|
+
export { createQuery } from './query.js';
|
|
2
|
+
export { CollectionNames, FieldFormatToType, InferConditions, InferEntry, InferFields, defineConfig } from './defineConfig.js';
|
|
3
|
+
export { withOctoCMS } from './withOctoCMS.js';
|
|
4
|
+
export { Collection, CollectionField, Config, EntryStatus, FieldFormat, GitIntegrationConfig, ReferenceFieldConfig, ResolvedImageField, RichTextDocument, RichTextNode, SearchConfig, SelectOption } from './types.js';
|
|
5
5
|
import 'next';
|
|
@@ -3,16 +3,21 @@ import {
|
|
|
3
3
|
adminPageTemplate,
|
|
4
4
|
demoHelloPageJson,
|
|
5
5
|
envLocalTemplate,
|
|
6
|
+
generatedConfigInitTemplate,
|
|
7
|
+
generatedContentDeclsTemplate,
|
|
8
|
+
generatedEnumsTemplate,
|
|
9
|
+
generatedIndexTemplate,
|
|
10
|
+
generatedQueryTemplate,
|
|
11
|
+
generatedTypesTemplate,
|
|
6
12
|
helloPageTemplate,
|
|
7
13
|
nextConfigTemplate,
|
|
8
14
|
octoConfigTemplate,
|
|
9
15
|
readmeTemplate,
|
|
10
16
|
tsconfigPaths
|
|
11
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-IGDBPZSB.js";
|
|
12
18
|
import {
|
|
13
19
|
log
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-W6QJTGBC.js";
|
|
20
|
+
} from "./chunk-33PHLOAE.js";
|
|
16
21
|
|
|
17
22
|
// cli/commands/init.ts
|
|
18
23
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -100,7 +105,20 @@ async function initCommand(projectRoot, options = {}) {
|
|
|
100
105
|
mkdirSync(contentDir, { recursive: true });
|
|
101
106
|
writeFileSync(join(contentDir, "helloPage-0000.json"), demoHelloPageJson(), "utf8");
|
|
102
107
|
log.success("cms/content/helloPage/helloPage-0000.json");
|
|
103
|
-
|
|
108
|
+
const generatedDir = join(projectRoot, "cms", "__generated__");
|
|
109
|
+
mkdirSync(generatedDir, { recursive: true });
|
|
110
|
+
const generatedFiles = [
|
|
111
|
+
["types.ts", generatedTypesTemplate],
|
|
112
|
+
["enums.ts", generatedEnumsTemplate],
|
|
113
|
+
["content.d.ts", generatedContentDeclsTemplate],
|
|
114
|
+
["index.ts", generatedIndexTemplate],
|
|
115
|
+
["query.ts", generatedQueryTemplate],
|
|
116
|
+
["configInit.ts", generatedConfigInitTemplate]
|
|
117
|
+
];
|
|
118
|
+
for (const [name, content] of generatedFiles) {
|
|
119
|
+
writeFileSync(join(generatedDir, name), content, "utf8");
|
|
120
|
+
log.success(`cms/__generated__/${name}`);
|
|
121
|
+
}
|
|
104
122
|
mkdirSync(join(projectRoot, "public", "media"), { recursive: true });
|
|
105
123
|
log.blank();
|
|
106
124
|
log.info("Updating configuration...");
|
|
@@ -158,24 +176,18 @@ async function initCommand(projectRoot, options = {}) {
|
|
|
158
176
|
} else {
|
|
159
177
|
log.success("README.md \u2014 already exists, skipped");
|
|
160
178
|
}
|
|
161
|
-
log.blank();
|
|
162
|
-
log.info("Generating types...");
|
|
163
|
-
try {
|
|
164
|
-
const { typesGenCommand } = await import("./typesGen-RGHGMI34.js");
|
|
165
|
-
await typesGenCommand(projectRoot);
|
|
166
|
-
} catch (e) {
|
|
167
|
-
log.warn(`Type generation failed: ${String(e.message)}`);
|
|
168
|
-
log.warn("Run `npx octocms types:gen` after installing dependencies.");
|
|
169
|
-
}
|
|
170
179
|
const port = detectDevPort(projectRoot);
|
|
171
180
|
log.info("Next steps:");
|
|
172
181
|
log.info(" 1. Fill in GitHub App credentials in .env.local (see README.md)");
|
|
173
182
|
log.info(" 2. Run: npm run dev");
|
|
174
183
|
log.info(` 3. Visit demo page: http://localhost:${port}/hello`);
|
|
175
184
|
log.info(` 4. Visit CMS admin: http://localhost:${port}/cms`);
|
|
185
|
+
log.info("");
|
|
186
|
+
log.info(" After editing cms/octocms.config.ts, regenerate types:");
|
|
187
|
+
log.info(" npx octocms types:gen");
|
|
176
188
|
log.blank();
|
|
177
189
|
}
|
|
178
190
|
export {
|
|
179
191
|
initCommand
|
|
180
192
|
};
|
|
181
|
-
//# sourceMappingURL=init-
|
|
193
|
+
//# sourceMappingURL=init-27Z6QIYE.js.map
|