@se-studio/contentful-cms 1.0.5 → 1.0.6
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/CHANGELOG.md +6 -0
- package/package.json +3 -8
- package/dist/bin/cms-capture-screenshots.d.ts +0 -4
- package/dist/bin/cms-capture-screenshots.d.ts.map +0 -1
- package/dist/bin/cms-capture-screenshots.js +0 -183
- package/dist/bin/cms-capture-screenshots.js.map +0 -1
- package/dist/bin/cms-generate-collection-guidelines.d.ts +0 -4
- package/dist/bin/cms-generate-collection-guidelines.d.ts.map +0 -1
- package/dist/bin/cms-generate-collection-guidelines.js +0 -209
- package/dist/bin/cms-generate-collection-guidelines.js.map +0 -1
- package/dist/bin/cms-generate-field-list.d.ts +0 -4
- package/dist/bin/cms-generate-field-list.d.ts.map +0 -1
- package/dist/bin/cms-generate-field-list.js +0 -114
- package/dist/bin/cms-generate-field-list.js.map +0 -1
- package/dist/bin/cms-merge-guidelines.d.ts +0 -4
- package/dist/bin/cms-merge-guidelines.d.ts.map +0 -1
- package/dist/bin/cms-merge-guidelines.js +0 -147
- package/dist/bin/cms-merge-guidelines.js.map +0 -1
- package/dist/bin/cms-update-colour-hints.d.ts +0 -4
- package/dist/bin/cms-update-colour-hints.d.ts.map +0 -1
- package/dist/bin/cms-update-colour-hints.js +0 -111
- package/dist/bin/cms-update-colour-hints.js.map +0 -1
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/contentful-cms",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "CLI tool for AI agents to read and edit Contentful draft content without publish permissions",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -18,12 +18,7 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"bin": {
|
|
21
|
-
"cms-edit": "./dist/bin/cms-edit.js"
|
|
22
|
-
"cms-generate-field-list": "./dist/bin/cms-generate-field-list.js",
|
|
23
|
-
"cms-merge-guidelines": "./dist/bin/cms-merge-guidelines.js",
|
|
24
|
-
"cms-capture-screenshots": "./dist/bin/cms-capture-screenshots.js",
|
|
25
|
-
"cms-update-colour-hints": "./dist/bin/cms-update-colour-hints.js",
|
|
26
|
-
"cms-generate-collection-guidelines": "./dist/bin/cms-generate-collection-guidelines.js"
|
|
21
|
+
"cms-edit": "./dist/bin/cms-edit.js"
|
|
27
22
|
},
|
|
28
23
|
"files": [
|
|
29
24
|
"dist",
|
|
@@ -41,7 +36,7 @@
|
|
|
41
36
|
"@biomejs/biome": "^2.4.6",
|
|
42
37
|
"@types/node": "^22.19.15",
|
|
43
38
|
"typescript": "^5.9.3",
|
|
44
|
-
"vitest": "^4.0
|
|
39
|
+
"vitest": "^4.1.0"
|
|
45
40
|
},
|
|
46
41
|
"keywords": [
|
|
47
42
|
"contentful",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-capture-screenshots.d.ts","sourceRoot":"","sources":["../../src/bin/cms-capture-screenshots.ts"],"names":[],"mappings":";AACA,uFAAuF"}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
3
|
-
/**
|
|
4
|
-
* cms-capture-screenshots
|
|
5
|
-
*
|
|
6
|
-
* Captures showcase screenshots for one or more CMS types using cms-edit.
|
|
7
|
-
* Screenshots are saved to <app-dir>/docs/cms-guidelines/screenshots/<type>-<label>.png.
|
|
8
|
-
* The path is resolved from process.cwd(), so run from the monorepo root when using --app-dir
|
|
9
|
-
* (e.g. node packages/contentful-cms/dist/bin/cms-capture-screenshots.js --variants ... --app-dir apps/example-se2026).
|
|
10
|
-
*
|
|
11
|
-
* Usage:
|
|
12
|
-
* cms-capture-screenshots --type Hero [--app-dir <path>]
|
|
13
|
-
* cms-capture-screenshots --variants variants.json [--app-dir <path>]
|
|
14
|
-
*
|
|
15
|
-
* Where variants.json follows the output contract from the variant-proposal-prompt:
|
|
16
|
-
* {
|
|
17
|
-
* "typeName": "Hero",
|
|
18
|
-
* "variants": [
|
|
19
|
-
* { "label": "default", "description": "...", "showcaseParams": {} },
|
|
20
|
-
* { "label": "navy", "description": "...", "showcaseParams": { "backgroundColour": "Navy" } }
|
|
21
|
-
* ]
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* If --type is passed without --variants, uses a default set of variants for that type.
|
|
25
|
-
*
|
|
26
|
-
* Prerequisites:
|
|
27
|
-
* - agent-browser installed: npm install -g agent-browser && agent-browser install
|
|
28
|
-
* - App running on its dev port (e.g. pnpm --filter example-brightline dev)
|
|
29
|
-
* - cms-edit available on PATH (installed with this package)
|
|
30
|
-
*/
|
|
31
|
-
import { spawnSync } from 'node:child_process';
|
|
32
|
-
import { mkdirSync, readFileSync } from 'node:fs';
|
|
33
|
-
import { join, resolve } from 'node:path';
|
|
34
|
-
// Default variants for well-known types (used when --type is passed without --variants)
|
|
35
|
-
const DEFAULT_VARIANTS = {
|
|
36
|
-
Hero: {
|
|
37
|
-
typeName: 'Hero',
|
|
38
|
-
mode: 'component',
|
|
39
|
-
variants: [
|
|
40
|
-
{
|
|
41
|
-
label: 'default',
|
|
42
|
-
description: 'All fields populated, no colour override.',
|
|
43
|
-
showcaseParams: {},
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
label: 'no-visual',
|
|
47
|
-
description: 'visual field removed; copy spans full width.',
|
|
48
|
-
showcaseParams: { showVisual: 'false' },
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
label: 'navy',
|
|
52
|
-
description: 'Navy background + Off White text.',
|
|
53
|
-
showcaseParams: { backgroundColour: 'Navy', textColour: 'Off White' },
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
label: 'minimal',
|
|
57
|
-
description: 'Heading only, no eyebrow/subtitle/body/links/visual.',
|
|
58
|
-
showcaseParams: { showVisual: 'false', showLinks: 'false' },
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
'Hero Flipped': {
|
|
63
|
-
typeName: 'Hero Flipped',
|
|
64
|
-
mode: 'component',
|
|
65
|
-
variants: [
|
|
66
|
-
{
|
|
67
|
-
label: 'default',
|
|
68
|
-
description: 'Default flipped layout — visual on left, copy on right.',
|
|
69
|
-
showcaseParams: {},
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
function parseCli() {
|
|
75
|
-
const args = process.argv.slice(2);
|
|
76
|
-
const result = {
|
|
77
|
-
variantsFile: null,
|
|
78
|
-
type: null,
|
|
79
|
-
appDir: process.cwd(),
|
|
80
|
-
};
|
|
81
|
-
for (let i = 0; i < args.length; i++) {
|
|
82
|
-
if (args[i] === '--variants' && args[i + 1]) {
|
|
83
|
-
result.variantsFile = args[++i];
|
|
84
|
-
}
|
|
85
|
-
else if (args[i] === '--type' && args[i + 1]) {
|
|
86
|
-
result.type = args[++i];
|
|
87
|
-
}
|
|
88
|
-
else if (args[i] === '--app-dir' && args[i + 1]) {
|
|
89
|
-
result.appDir = args[++i];
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return result;
|
|
93
|
-
}
|
|
94
|
-
function typeNameToSlug(typeName) {
|
|
95
|
-
return typeName.toLowerCase().replace(/\s+/g, '-');
|
|
96
|
-
}
|
|
97
|
-
function buildCmsEditArgs(typeName, mode, params) {
|
|
98
|
-
const modeFlag = mode === 'collection' ? '--collection' : '--component';
|
|
99
|
-
const paramFlags = Object.entries(params).flatMap(([k, v]) => ['--param', `${k}=${v}`]);
|
|
100
|
-
return [modeFlag, typeName, ...paramFlags];
|
|
101
|
-
}
|
|
102
|
-
function captureScreenshot(typeName, mode, variant, outPath, appDir) {
|
|
103
|
-
const args = buildCmsEditArgs(typeName, mode, variant.showcaseParams);
|
|
104
|
-
// Validate URL generation first (shell: false so type names with spaces are one argument)
|
|
105
|
-
const urlResult = spawnSync('cms-edit', ['screenshot', ...args, '--url-only'], {
|
|
106
|
-
cwd: appDir,
|
|
107
|
-
encoding: 'utf8',
|
|
108
|
-
shell: false,
|
|
109
|
-
});
|
|
110
|
-
if (urlResult.status !== 0) {
|
|
111
|
-
console.error(` ✗ URL generation failed for ${typeName} / ${variant.label}`);
|
|
112
|
-
console.error(` ${urlResult.stderr}`);
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
const url = urlResult.stdout.trim();
|
|
116
|
-
console.log(` URL: ${url}`);
|
|
117
|
-
const result = spawnSync('cms-edit', ['screenshot', ...args, '--out', outPath, '--wait', '1000'], {
|
|
118
|
-
cwd: appDir,
|
|
119
|
-
encoding: 'utf8',
|
|
120
|
-
timeout: 60000,
|
|
121
|
-
shell: false,
|
|
122
|
-
});
|
|
123
|
-
if (result.status !== 0) {
|
|
124
|
-
const stderr = result.stderr ?? '';
|
|
125
|
-
if (stderr.includes('agent-browser') ||
|
|
126
|
-
stderr.includes('not found') ||
|
|
127
|
-
stderr.includes('ENOENT')) {
|
|
128
|
-
console.warn(` ⚠ agent-browser not available. Screenshot URL only:`);
|
|
129
|
-
console.warn(` ${url}`);
|
|
130
|
-
console.warn(` Install with: npm install -g agent-browser && agent-browser install`);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
console.error(` ✗ Screenshot failed: ${stderr}`);
|
|
134
|
-
}
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
console.log(` ✓ Saved: ${outPath}`);
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
function main() {
|
|
141
|
-
const { variantsFile, type, appDir } = parseCli();
|
|
142
|
-
// Resolve relative to process.cwd() so path is absolute when passed to cms-edit (which runs with cwd: appDir)
|
|
143
|
-
const screenshotsDir = resolve(process.cwd(), appDir, 'docs/cms-guidelines/screenshots');
|
|
144
|
-
mkdirSync(screenshotsDir, { recursive: true });
|
|
145
|
-
let jobs = [];
|
|
146
|
-
if (variantsFile) {
|
|
147
|
-
const data = JSON.parse(readFileSync(variantsFile, 'utf8'));
|
|
148
|
-
const payload = Array.isArray(data) ? data : [data];
|
|
149
|
-
jobs = payload.map((entry) => ({
|
|
150
|
-
typeName: entry.typeName,
|
|
151
|
-
mode: entry.mode ?? 'component',
|
|
152
|
-
variants: entry.variants,
|
|
153
|
-
}));
|
|
154
|
-
}
|
|
155
|
-
else if (type) {
|
|
156
|
-
const defaults = DEFAULT_VARIANTS[type];
|
|
157
|
-
if (!defaults) {
|
|
158
|
-
console.error(`No default variants for type "${type}". Use --variants <file> instead.`);
|
|
159
|
-
process.exit(1);
|
|
160
|
-
}
|
|
161
|
-
jobs = [defaults];
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
console.log('Usage:');
|
|
165
|
-
console.log(' cms-capture-screenshots --type Hero');
|
|
166
|
-
console.log(' cms-capture-screenshots --variants variants.json');
|
|
167
|
-
console.log(' cms-capture-screenshots --type Hero --app-dir /path/to/app');
|
|
168
|
-
process.exit(0);
|
|
169
|
-
}
|
|
170
|
-
for (const job of jobs) {
|
|
171
|
-
const slug = typeNameToSlug(job.typeName);
|
|
172
|
-
console.log(`\nCapturing screenshots for: ${job.typeName} (${job.variants.length} variants)`);
|
|
173
|
-
for (const variant of job.variants) {
|
|
174
|
-
const outFile = `${slug}-${variant.label}.png`;
|
|
175
|
-
const outPath = join(screenshotsDir, outFile);
|
|
176
|
-
console.log(`\n Variant: ${variant.label} — ${variant.description}`);
|
|
177
|
-
captureScreenshot(job.typeName, job.mode, variant, outPath, appDir);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
console.log('\nDone.');
|
|
181
|
-
}
|
|
182
|
-
main();
|
|
183
|
-
//# sourceMappingURL=cms-capture-screenshots.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-capture-screenshots.js","sourceRoot":"","sources":["../../src/bin/cms-capture-screenshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-generate-collection-guidelines.d.ts","sourceRoot":"","sources":["../../src/bin/cms-generate-collection-guidelines.ts"],"names":[],"mappings":";AACA,uFAAuF"}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
3
|
-
/**
|
|
4
|
-
* cms-generate-collection-guidelines
|
|
5
|
-
*
|
|
6
|
-
* Generates guideline markdown fragments for all collections and external components
|
|
7
|
-
* in a project by reading from the live discovery API. This script is project-independent:
|
|
8
|
-
* it needs only a discovery URL and an app directory.
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* cms-generate-collection-guidelines --discovery-url <url> --app-dir <path>
|
|
12
|
-
*
|
|
13
|
-
* Example:
|
|
14
|
-
* cms-generate-collection-guidelines \
|
|
15
|
-
* --discovery-url http://localhost:3010/api/cms/discovery/ \
|
|
16
|
-
* --app-dir apps/example-brightline
|
|
17
|
-
*
|
|
18
|
-
* What it does:
|
|
19
|
-
* 1. Fetches discovery JSON from the URL.
|
|
20
|
-
* 2. For each collections[] entry:
|
|
21
|
-
* - Computes slug (name lowercased, spaces → hyphens, parentheses stripped)
|
|
22
|
-
* - Writes docs/cms-guidelines/collections/<slug>.md
|
|
23
|
-
* - Writes colour hint (section or none) to generated/cms-discovery/colour-hints.json
|
|
24
|
-
* 3. For each externals[] entry:
|
|
25
|
-
* - Computes slug
|
|
26
|
-
* - Writes docs/cms-guidelines/externals/<slug>.md
|
|
27
|
-
* - Writes colour hint (none)
|
|
28
|
-
*
|
|
29
|
-
* Existing files are overwritten; run this to regenerate after adding types or changing fields.
|
|
30
|
-
*
|
|
31
|
-
* Prerequisites:
|
|
32
|
-
* - App must be running so the discovery URL is reachable.
|
|
33
|
-
* - generated/cms-discovery/ directory must exist (created by cms-generate-field-list).
|
|
34
|
-
*/
|
|
35
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
36
|
-
import { dirname, join } from 'node:path';
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// CLI argument parsing
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
function parseCli() {
|
|
41
|
-
const args = process.argv.slice(2);
|
|
42
|
-
let discoveryUrl = '';
|
|
43
|
-
let appDir = process.cwd();
|
|
44
|
-
for (let i = 0; i < args.length; i++) {
|
|
45
|
-
if (args[i] === '--discovery-url' && args[i + 1]) {
|
|
46
|
-
discoveryUrl = args[++i];
|
|
47
|
-
}
|
|
48
|
-
else if (args[i] === '--app-dir' && args[i + 1]) {
|
|
49
|
-
appDir = args[++i];
|
|
50
|
-
}
|
|
51
|
-
else if (args[i] === '--help' || args[i] === '-h') {
|
|
52
|
-
printHelp();
|
|
53
|
-
process.exit(0);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
if (!discoveryUrl) {
|
|
57
|
-
console.error('Error: --discovery-url is required.');
|
|
58
|
-
printHelp();
|
|
59
|
-
process.exit(1);
|
|
60
|
-
}
|
|
61
|
-
return { discoveryUrl, appDir };
|
|
62
|
-
}
|
|
63
|
-
function printHelp() {
|
|
64
|
-
console.log('Usage:');
|
|
65
|
-
console.log(' cms-generate-collection-guidelines --discovery-url <url> [--app-dir <path>]');
|
|
66
|
-
console.log('');
|
|
67
|
-
console.log('Options:');
|
|
68
|
-
console.log(' --discovery-url <url> Discovery API URL (e.g. http://localhost:3010/api/cms/discovery/)');
|
|
69
|
-
console.log(' --app-dir <path> App directory (default: cwd)');
|
|
70
|
-
console.log('');
|
|
71
|
-
console.log('Example:');
|
|
72
|
-
console.log(' cms-generate-collection-guidelines \\');
|
|
73
|
-
console.log(' --discovery-url http://localhost:3010/api/cms/discovery/ \\');
|
|
74
|
-
console.log(' --app-dir apps/example-brightline');
|
|
75
|
-
}
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
// Slug computation
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
function toSlug(name) {
|
|
80
|
-
return name.toLowerCase().replace(/\s+/g, '-').replace(/[()]/g, '');
|
|
81
|
-
}
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// Markdown generation
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
const SECTION_EXCLUDE = new Set(['contents', 'collectionType', 'cmsLabel', 'id', 'index']);
|
|
86
|
-
const CARD_EXCLUDE = new Set(['parentId', 'componentType', 'id']);
|
|
87
|
-
function generateCollectionMarkdown(entry) {
|
|
88
|
-
const sectionFields = entry.usedFields.filter((f) => !SECTION_EXCLUDE.has(f));
|
|
89
|
-
const cardFields = (entry.cardUsedFields ?? []).filter((f) => !CARD_EXCLUDE.has(f));
|
|
90
|
-
const hasCard = cardFields.length > 0;
|
|
91
|
-
const hasColour = entry.usedFields.some((f) => f === 'backgroundColour' || f === 'textColour') ||
|
|
92
|
-
entry.cardUsedFields?.some((f) => f === 'backgroundColour' || f === 'textColour');
|
|
93
|
-
let md = `# ${entry.name}\n\n`;
|
|
94
|
-
md += 'Collection section with optional section heading and a set of items (cards or list).\n\n';
|
|
95
|
-
md += '## Section fields\n\n';
|
|
96
|
-
md += '| Field | Effect |\n|---|---|\n';
|
|
97
|
-
for (const f of sectionFields) {
|
|
98
|
-
md += `| \`${f}\` | Section-level. |\n`;
|
|
99
|
-
}
|
|
100
|
-
if (hasCard) {
|
|
101
|
-
md += '\n## Card / item fields\n\n';
|
|
102
|
-
for (const f of cardFields) {
|
|
103
|
-
md += `- \`${f}\`\n`;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (hasColour) {
|
|
107
|
-
md +=
|
|
108
|
-
'\n## Colours\n\nSection and/or cards may use `backgroundColour` and `textColour` from the palette.\n';
|
|
109
|
-
}
|
|
110
|
-
return md;
|
|
111
|
-
}
|
|
112
|
-
function generateExternalMarkdown(entry) {
|
|
113
|
-
return `# ${entry.name}\n\nExternal component: embeds or integrates third-party content (e.g. form, iframe, RSS). Configure in CMS; layout and styling are project-specific.\n`;
|
|
114
|
-
}
|
|
115
|
-
// ---------------------------------------------------------------------------
|
|
116
|
-
// Colour hints
|
|
117
|
-
// ---------------------------------------------------------------------------
|
|
118
|
-
function loadColourHints(hintsPath) {
|
|
119
|
-
if (!existsSync(hintsPath)) {
|
|
120
|
-
return {};
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
return JSON.parse(readFileSync(hintsPath, 'utf8'));
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
return {};
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
function saveColourHints(hintsPath, hints) {
|
|
130
|
-
mkdirSync(dirname(hintsPath), { recursive: true });
|
|
131
|
-
const sorted = Object.fromEntries(Object.entries(hints).sort(([a], [b]) => a.localeCompare(b)));
|
|
132
|
-
writeFileSync(hintsPath, JSON.stringify(sorted, null, 2) + '\n');
|
|
133
|
-
}
|
|
134
|
-
// ---------------------------------------------------------------------------
|
|
135
|
-
// Main
|
|
136
|
-
// ---------------------------------------------------------------------------
|
|
137
|
-
async function main() {
|
|
138
|
-
const { discoveryUrl, appDir } = parseCli();
|
|
139
|
-
console.log(`Fetching discovery from: ${discoveryUrl}`);
|
|
140
|
-
console.log(`App directory: ${appDir}`);
|
|
141
|
-
// Fetch discovery
|
|
142
|
-
let discovery;
|
|
143
|
-
try {
|
|
144
|
-
const res = await fetch(discoveryUrl);
|
|
145
|
-
if (!res.ok) {
|
|
146
|
-
console.error(`Discovery fetch failed: HTTP ${res.status} ${res.statusText}`);
|
|
147
|
-
console.error(`URL: ${discoveryUrl}`);
|
|
148
|
-
process.exit(1);
|
|
149
|
-
}
|
|
150
|
-
discovery = (await res.json());
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
console.error(`Failed to fetch discovery URL: ${discoveryUrl}`);
|
|
154
|
-
console.error(String(err));
|
|
155
|
-
console.error('\nIs the app running? Start it with:');
|
|
156
|
-
console.error(' pnpm --filter <appName> dev');
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
const collectionsDir = join(appDir, 'docs/cms-guidelines/collections');
|
|
160
|
-
const externalsDir = join(appDir, 'docs/cms-guidelines/externals');
|
|
161
|
-
const hintsPath = join(appDir, 'generated/cms-discovery/colour-hints.json');
|
|
162
|
-
mkdirSync(collectionsDir, { recursive: true });
|
|
163
|
-
mkdirSync(externalsDir, { recursive: true });
|
|
164
|
-
mkdirSync(dirname(hintsPath), { recursive: true });
|
|
165
|
-
const hints = loadColourHints(hintsPath);
|
|
166
|
-
// Collections
|
|
167
|
-
console.log(`\nGenerating ${discovery.collections.length} collection guidelines...`);
|
|
168
|
-
for (const entry of discovery.collections) {
|
|
169
|
-
const slug = toSlug(entry.name);
|
|
170
|
-
const outPath = join(collectionsDir, `${slug}.md`);
|
|
171
|
-
const md = generateCollectionMarkdown(entry);
|
|
172
|
-
writeFileSync(outPath, md, 'utf8');
|
|
173
|
-
// Colour hint: section if backgroundColour or textColour in used/card fields; else none
|
|
174
|
-
const hasColourFields = entry.usedFields.some((f) => f === 'backgroundColour' || f === 'textColour') ||
|
|
175
|
-
entry.cardUsedFields?.some((f) => f === 'backgroundColour' || f === 'textColour');
|
|
176
|
-
hints[entry.name] = {
|
|
177
|
-
colourApplication: hasColourFields ? 'section' : 'none',
|
|
178
|
-
notes: hasColourFields
|
|
179
|
-
? 'Section and/or cards use backgroundColour/textColour from palette.'
|
|
180
|
-
: 'No colour fields in used fields or card fields.',
|
|
181
|
-
};
|
|
182
|
-
console.log(` ✓ ${entry.name} → collections/${slug}.md`);
|
|
183
|
-
}
|
|
184
|
-
// Externals
|
|
185
|
-
console.log(`\nGenerating ${discovery.externals.length} external component guidelines...`);
|
|
186
|
-
for (const entry of discovery.externals) {
|
|
187
|
-
const slug = toSlug(entry.name);
|
|
188
|
-
const outPath = join(externalsDir, `${slug}.md`);
|
|
189
|
-
const md = generateExternalMarkdown(entry);
|
|
190
|
-
writeFileSync(outPath, md, 'utf8');
|
|
191
|
-
hints[entry.name] = {
|
|
192
|
-
colourApplication: 'none',
|
|
193
|
-
notes: 'External embed; no colour fields.',
|
|
194
|
-
};
|
|
195
|
-
console.log(` ✓ ${entry.name} → externals/${slug}.md`);
|
|
196
|
-
}
|
|
197
|
-
// Save colour hints
|
|
198
|
-
saveColourHints(hintsPath, hints);
|
|
199
|
-
console.log(`\nColour hints written to ${hintsPath}`);
|
|
200
|
-
console.log(`\nDone. ${discovery.collections.length} collections and ${discovery.externals.length} externals generated.`);
|
|
201
|
-
console.log('\nNext step: run merge to update COMPONENT_GUIDELINES_FOR_LLM.md:');
|
|
202
|
-
console.log(' cms-merge-guidelines --app-dir <appDir>');
|
|
203
|
-
console.log(' (or: pnpm run cms-guidelines:merge from the app directory)');
|
|
204
|
-
}
|
|
205
|
-
main().catch((err) => {
|
|
206
|
-
console.error(err);
|
|
207
|
-
process.exit(1);
|
|
208
|
-
});
|
|
209
|
-
//# sourceMappingURL=cms-generate-collection-guidelines.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-generate-collection-guidelines.js","sourceRoot":"","sources":["../../src/bin/cms-generate-collection-guidelines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-generate-field-list.d.ts","sourceRoot":"","sources":["../../src/bin/cms-generate-field-list.ts"],"names":[],"mappings":";AACA,uFAAuF"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
3
|
-
/**
|
|
4
|
-
* cms-generate-field-list
|
|
5
|
-
*
|
|
6
|
-
* Parses the generated Contentful TypeScript type files in an app to produce
|
|
7
|
-
* generated/cms-discovery/field-list.json.
|
|
8
|
-
*
|
|
9
|
-
* This file contains field metadata for component, collection, and external
|
|
10
|
-
* component content types: field id, label, type, whether required, summary,
|
|
11
|
-
* and valid enum values if applicable.
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* cms-generate-field-list [--app-dir <path>]
|
|
15
|
-
*
|
|
16
|
-
* Prerequisites:
|
|
17
|
-
* Run `pnpm codegen` (or `pnpm generate:types`) first to ensure
|
|
18
|
-
* src/generated/types/ is up to date.
|
|
19
|
-
*
|
|
20
|
-
* Output:
|
|
21
|
-
* <app-dir>/generated/cms-discovery/field-list.json
|
|
22
|
-
*/
|
|
23
|
-
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
24
|
-
import { dirname, join } from 'node:path';
|
|
25
|
-
// Parse --app-dir flag (default: cwd)
|
|
26
|
-
function parseAppDir() {
|
|
27
|
-
const args = process.argv.slice(2);
|
|
28
|
-
const idx = args.indexOf('--app-dir');
|
|
29
|
-
return idx !== -1 && args[idx + 1] ? args[idx + 1] : process.cwd();
|
|
30
|
-
}
|
|
31
|
-
const appRoot = parseAppDir();
|
|
32
|
-
// Content types to parse: [ fileName, contentTypeId ]
|
|
33
|
-
const CONTENT_TYPES = [
|
|
34
|
-
['TypeComponent.ts', 'component'],
|
|
35
|
-
['TypeCollection.ts', 'collection'],
|
|
36
|
-
['TypeExternalComponent.ts', 'externalComponent'],
|
|
37
|
-
];
|
|
38
|
-
const TYPES_DIR = join(appRoot, 'src/generated/types');
|
|
39
|
-
const OUTPUT_PATH = join(appRoot, 'generated/cms-discovery/field-list.json');
|
|
40
|
-
/**
|
|
41
|
-
* Derive a simplified field type name and enum values from an EntryFieldTypes expression.
|
|
42
|
-
*/
|
|
43
|
-
function parseFieldType(typeExpr) {
|
|
44
|
-
const entryFieldMatch = typeExpr.match(/EntryFieldTypes\.(\w+)/);
|
|
45
|
-
if (!entryFieldMatch) {
|
|
46
|
-
return { type: 'Unknown' };
|
|
47
|
-
}
|
|
48
|
-
const typeName = entryFieldMatch[1];
|
|
49
|
-
if (typeName === 'Symbol') {
|
|
50
|
-
const enumMatch = typeExpr.match(/EntryFieldTypes\.Symbol<(.+?)>/);
|
|
51
|
-
if (enumMatch) {
|
|
52
|
-
const enumStr = enumMatch[1];
|
|
53
|
-
const enumValues = enumStr.split('|').map((v) => v.trim().replace(/^"(.+)"$/, '$1'));
|
|
54
|
-
return { type: 'Symbol', enumValues };
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return { type: typeName };
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Parse a TypeXxx.ts file and extract field metadata from the TypeXxxFields interface.
|
|
61
|
-
*/
|
|
62
|
-
function parseTypeFile(fileName) {
|
|
63
|
-
const filePath = join(TYPES_DIR, fileName);
|
|
64
|
-
let source;
|
|
65
|
-
try {
|
|
66
|
-
source = readFileSync(filePath, 'utf8');
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
console.error(`Could not read ${filePath}`);
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
const interfaceMatch = source.match(/export interface Type\w+Fields \{([\s\S]+?)^}/m);
|
|
73
|
-
if (!interfaceMatch) {
|
|
74
|
-
console.error(`Could not find TypeXxxFields interface in ${fileName}`);
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
const body = interfaceMatch[1];
|
|
78
|
-
const fields = [];
|
|
79
|
-
const fieldBlockRegex = /\/\*\*([\s\S]*?)\*\/\s*\n\s+(\w+)(\??):\s*([\s\S]+?);/g;
|
|
80
|
-
let match = fieldBlockRegex.exec(body);
|
|
81
|
-
while (match !== null) {
|
|
82
|
-
const [, jsdoc, fieldId, optionalMark, typeExpr] = match;
|
|
83
|
-
const nameMatch = jsdoc.match(/@name (.+)/);
|
|
84
|
-
const label = nameMatch ? nameMatch[1].trim() : fieldId;
|
|
85
|
-
const summaryMatch = jsdoc.match(/@summary (.+)/);
|
|
86
|
-
const summary = summaryMatch ? summaryMatch[1].trim() : undefined;
|
|
87
|
-
const required = optionalMark !== '?';
|
|
88
|
-
const { type, enumValues } = parseFieldType(typeExpr.replace(/\s+/g, ' '));
|
|
89
|
-
const field = { id: fieldId, label, required, type };
|
|
90
|
-
if (summary) {
|
|
91
|
-
field.summary = summary;
|
|
92
|
-
}
|
|
93
|
-
if (enumValues) {
|
|
94
|
-
field.enumValues = enumValues;
|
|
95
|
-
}
|
|
96
|
-
fields.push(field);
|
|
97
|
-
match = fieldBlockRegex.exec(body);
|
|
98
|
-
}
|
|
99
|
-
return fields;
|
|
100
|
-
}
|
|
101
|
-
function main() {
|
|
102
|
-
console.log(`Generating field list for: ${appRoot}`);
|
|
103
|
-
const output = {};
|
|
104
|
-
for (const [fileName, contentTypeId] of CONTENT_TYPES) {
|
|
105
|
-
const fields = parseTypeFile(fileName);
|
|
106
|
-
output[contentTypeId] = { fields };
|
|
107
|
-
console.log(` ${contentTypeId}: ${fields.length} fields`);
|
|
108
|
-
}
|
|
109
|
-
mkdirSync(dirname(OUTPUT_PATH), { recursive: true });
|
|
110
|
-
writeFileSync(OUTPUT_PATH, JSON.stringify(output, null, 2));
|
|
111
|
-
console.log(`\nWrote ${OUTPUT_PATH}`);
|
|
112
|
-
}
|
|
113
|
-
main();
|
|
114
|
-
//# sourceMappingURL=cms-generate-field-list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-generate-field-list.js","sourceRoot":"","sources":["../../src/bin/cms-generate-field-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-merge-guidelines.d.ts","sourceRoot":"","sources":["../../src/bin/cms-merge-guidelines.ts"],"names":[],"mappings":";AAEA,uFAAuF"}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
3
|
-
/**
|
|
4
|
-
* cms-merge-guidelines
|
|
5
|
-
*
|
|
6
|
-
* Merges all per-type guideline markdown files into one document:
|
|
7
|
-
* <app-dir>/docs/cms-guidelines/COMPONENT_GUIDELINES_FOR_LLM.md
|
|
8
|
-
*
|
|
9
|
-
* Reads from:
|
|
10
|
-
* docs/cms-guidelines/components/*.md (one file per componentType)
|
|
11
|
-
* docs/cms-guidelines/collections/*.md (one file per collectionType)
|
|
12
|
-
* docs/cms-guidelines/externals/*.md (one file per externalComponentType)
|
|
13
|
-
*
|
|
14
|
-
* Versioning: generated date and current git commit id are appended.
|
|
15
|
-
*
|
|
16
|
-
* Usage:
|
|
17
|
-
* cms-merge-guidelines [--app-dir <path>] [--app-name <name>]
|
|
18
|
-
*/
|
|
19
|
-
import { execSync } from 'node:child_process';
|
|
20
|
-
import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
21
|
-
import { basename, extname, join } from 'node:path';
|
|
22
|
-
// Parse CLI flags
|
|
23
|
-
function parseCli() {
|
|
24
|
-
const args = process.argv.slice(2);
|
|
25
|
-
let appDir = process.cwd();
|
|
26
|
-
let appName = null;
|
|
27
|
-
for (let i = 0; i < args.length; i++) {
|
|
28
|
-
if (args[i] === '--app-dir' && args[i + 1]) {
|
|
29
|
-
appDir = args[++i];
|
|
30
|
-
}
|
|
31
|
-
else if (args[i] === '--app-name' && args[i + 1]) {
|
|
32
|
-
appName = args[++i];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return { appDir, appName };
|
|
36
|
-
}
|
|
37
|
-
const { appDir: appRoot, appName: cliAppName } = parseCli();
|
|
38
|
-
// Derive app name from directory if not provided
|
|
39
|
-
const appName = cliAppName ?? basename(appRoot);
|
|
40
|
-
const GUIDELINES_DIR = join(appRoot, 'docs/cms-guidelines');
|
|
41
|
-
const OUTPUT_PATH = join(GUIDELINES_DIR, 'COMPONENT_GUIDELINES_FOR_LLM.md');
|
|
42
|
-
const SECTIONS = [
|
|
43
|
-
{ dir: 'components', label: 'Components' },
|
|
44
|
-
{ dir: 'collections', label: 'Collections' },
|
|
45
|
-
{ dir: 'externals', label: 'External Components' },
|
|
46
|
-
];
|
|
47
|
-
function readMarkdownFiles(dir) {
|
|
48
|
-
let files;
|
|
49
|
-
try {
|
|
50
|
-
files = readdirSync(dir);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
return files
|
|
56
|
-
.filter((f) => extname(f) === '.md')
|
|
57
|
-
.sort()
|
|
58
|
-
.map((f) => ({
|
|
59
|
-
name: basename(f, '.md'),
|
|
60
|
-
content: readFileSync(join(dir, f), 'utf8').trim(),
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
function getCommitId() {
|
|
64
|
-
try {
|
|
65
|
-
return execSync('git rev-parse --short HEAD', { cwd: appRoot }).toString().trim();
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return 'unknown';
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
function formatDate(date) {
|
|
72
|
-
return date.toISOString().split('T')[0];
|
|
73
|
-
}
|
|
74
|
-
function main() {
|
|
75
|
-
console.log(`Merging guidelines for: ${appRoot}`);
|
|
76
|
-
const commitId = getCommitId();
|
|
77
|
-
const generatedDate = formatDate(new Date());
|
|
78
|
-
const parts = [];
|
|
79
|
-
parts.push(`# CMS Component Guidelines — ${appName}`);
|
|
80
|
-
parts.push('');
|
|
81
|
-
parts.push('This document is **self-contained**: it describes the visual layout, typography, colours,');
|
|
82
|
-
parts.push('field behaviour, and content impact for every CMS component, collection, and external');
|
|
83
|
-
parts.push('component available on this site. Source code access is not required to use it.');
|
|
84
|
-
parts.push('');
|
|
85
|
-
parts.push('All behaviour described here is accurate as of the version noted below.');
|
|
86
|
-
parts.push('');
|
|
87
|
-
parts.push(`> Generated: ${generatedDate} | Commit: ${commitId}`);
|
|
88
|
-
parts.push('');
|
|
89
|
-
parts.push('---');
|
|
90
|
-
parts.push('');
|
|
91
|
-
// Table of contents
|
|
92
|
-
parts.push('## Table of Contents');
|
|
93
|
-
parts.push('');
|
|
94
|
-
for (const { dir, label } of SECTIONS) {
|
|
95
|
-
const entries = readMarkdownFiles(join(GUIDELINES_DIR, dir));
|
|
96
|
-
if (entries.length === 0) {
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
parts.push(`### ${label}`);
|
|
100
|
-
parts.push('');
|
|
101
|
-
for (const { name, content } of entries) {
|
|
102
|
-
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
103
|
-
const displayName = h1Match ? h1Match[1] : name;
|
|
104
|
-
parts.push(`- [${displayName}](#${name.replace(/\s+/g, '-').toLowerCase()})`);
|
|
105
|
-
}
|
|
106
|
-
parts.push('');
|
|
107
|
-
}
|
|
108
|
-
parts.push('---');
|
|
109
|
-
parts.push('');
|
|
110
|
-
// Content sections
|
|
111
|
-
let hasContent = false;
|
|
112
|
-
for (const { dir, label } of SECTIONS) {
|
|
113
|
-
const entries = readMarkdownFiles(join(GUIDELINES_DIR, dir));
|
|
114
|
-
if (entries.length === 0) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
hasContent = true;
|
|
118
|
-
parts.push(`## ${label}`);
|
|
119
|
-
parts.push('');
|
|
120
|
-
for (const { content } of entries) {
|
|
121
|
-
parts.push(content);
|
|
122
|
-
parts.push('');
|
|
123
|
-
parts.push('---');
|
|
124
|
-
parts.push('');
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (!hasContent) {
|
|
128
|
-
parts.push('*No guidelines have been generated yet.*');
|
|
129
|
-
parts.push('');
|
|
130
|
-
parts.push('Run the generation pipeline to populate this document.');
|
|
131
|
-
parts.push('See `docs/cms-guidelines/README.md` for instructions.');
|
|
132
|
-
parts.push('');
|
|
133
|
-
}
|
|
134
|
-
// Footer
|
|
135
|
-
parts.push('---');
|
|
136
|
-
parts.push('');
|
|
137
|
-
parts.push('*This document was generated automatically. Do not edit directly — edit the per-type*');
|
|
138
|
-
parts.push(`*files in \`docs/cms-guidelines/\` and re-run \`cms-merge-guidelines\`.*`);
|
|
139
|
-
parts.push('');
|
|
140
|
-
parts.push(`Generated: ${generatedDate} | Commit: ${commitId}`);
|
|
141
|
-
const output = parts.join('\n');
|
|
142
|
-
writeFileSync(OUTPUT_PATH, output);
|
|
143
|
-
console.log(`Merged ${OUTPUT_PATH}`);
|
|
144
|
-
console.log(` Generated: ${generatedDate} | Commit: ${commitId}`);
|
|
145
|
-
}
|
|
146
|
-
main();
|
|
147
|
-
//# sourceMappingURL=cms-merge-guidelines.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-merge-guidelines.js","sourceRoot":"","sources":["../../src/bin/cms-merge-guidelines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-update-colour-hints.d.ts","sourceRoot":"","sources":["../../src/bin/cms-update-colour-hints.ts"],"names":[],"mappings":";AACA,uFAAuF"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
|
|
3
|
-
/**
|
|
4
|
-
* cms-update-colour-hints
|
|
5
|
-
*
|
|
6
|
-
* Adds or updates a colour hint entry in generated/cms-discovery/colour-hints.json.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* cms-update-colour-hints --type "Hero" --hint "section" [--app-dir <path>]
|
|
10
|
-
* [--notes "backgroundColour and textColour applied to the full Section wrapper."]
|
|
11
|
-
*
|
|
12
|
-
* cms-update-colour-hints --from /tmp/hero-colour-hint.json [--app-dir <path>]
|
|
13
|
-
*
|
|
14
|
-
* colour-hints.json format:
|
|
15
|
-
* {
|
|
16
|
-
* "Hero": { "colourApplication": "section", "notes": "..." },
|
|
17
|
-
* "Cards Grid": { "colourApplication": "section", "notes": "..." }
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* Valid colourApplication values: "section", "card", "section+card", "none"
|
|
21
|
-
*/
|
|
22
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
23
|
-
import { dirname, join } from 'node:path';
|
|
24
|
-
const VALID_HINTS = ['section', 'card', 'section+card', 'none'];
|
|
25
|
-
function parseCli() {
|
|
26
|
-
const args = process.argv.slice(2);
|
|
27
|
-
const result = {
|
|
28
|
-
type: null,
|
|
29
|
-
hint: null,
|
|
30
|
-
notes: null,
|
|
31
|
-
from: null,
|
|
32
|
-
appDir: process.cwd(),
|
|
33
|
-
};
|
|
34
|
-
for (let i = 0; i < args.length; i++) {
|
|
35
|
-
if (args[i] === '--type' && args[i + 1]) {
|
|
36
|
-
result.type = args[++i];
|
|
37
|
-
}
|
|
38
|
-
else if (args[i] === '--hint' && args[i + 1]) {
|
|
39
|
-
result.hint = args[++i];
|
|
40
|
-
}
|
|
41
|
-
else if (args[i] === '--notes' && args[i + 1]) {
|
|
42
|
-
result.notes = args[++i];
|
|
43
|
-
}
|
|
44
|
-
else if (args[i] === '--from' && args[i + 1]) {
|
|
45
|
-
result.from = args[++i];
|
|
46
|
-
}
|
|
47
|
-
else if (args[i] === '--app-dir' && args[i + 1]) {
|
|
48
|
-
result.appDir = args[++i];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return result;
|
|
52
|
-
}
|
|
53
|
-
function loadHints(hintsPath) {
|
|
54
|
-
if (!existsSync(hintsPath)) {
|
|
55
|
-
return {};
|
|
56
|
-
}
|
|
57
|
-
return JSON.parse(readFileSync(hintsPath, 'utf8'));
|
|
58
|
-
}
|
|
59
|
-
function saveHints(hintsPath, hints) {
|
|
60
|
-
mkdirSync(dirname(hintsPath), { recursive: true });
|
|
61
|
-
const sorted = Object.fromEntries(Object.entries(hints).sort(([a], [b]) => a.localeCompare(b)));
|
|
62
|
-
writeFileSync(hintsPath, JSON.stringify(sorted, null, 2));
|
|
63
|
-
}
|
|
64
|
-
function isValidHint(value) {
|
|
65
|
-
return VALID_HINTS.includes(value);
|
|
66
|
-
}
|
|
67
|
-
function main() {
|
|
68
|
-
const { type, hint, notes, from, appDir } = parseCli();
|
|
69
|
-
const hintsPath = join(appDir, 'generated/cms-discovery/colour-hints.json');
|
|
70
|
-
const hints = loadHints(hintsPath);
|
|
71
|
-
if (from) {
|
|
72
|
-
const data = JSON.parse(readFileSync(from, 'utf8'));
|
|
73
|
-
const typeName = data.typeName;
|
|
74
|
-
const colourApplication = data.colourApplication;
|
|
75
|
-
if (!typeName || !colourApplication) {
|
|
76
|
-
console.error('JSON must have typeName and colourApplication fields.');
|
|
77
|
-
process.exit(1);
|
|
78
|
-
}
|
|
79
|
-
if (!isValidHint(colourApplication)) {
|
|
80
|
-
console.error(`Invalid colourApplication "${colourApplication}". Valid: ${VALID_HINTS.join(', ')}`);
|
|
81
|
-
process.exit(1);
|
|
82
|
-
}
|
|
83
|
-
hints[typeName] = { colourApplication };
|
|
84
|
-
if (data.notes) {
|
|
85
|
-
hints[typeName] = { ...hints[typeName], notes: data.notes };
|
|
86
|
-
}
|
|
87
|
-
saveHints(hintsPath, hints);
|
|
88
|
-
console.log(`Updated colour hint for "${typeName}": ${colourApplication}`);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
if (!type || !hint) {
|
|
92
|
-
console.log('Usage:');
|
|
93
|
-
console.log(' cms-update-colour-hints --type "Hero" --hint "section" [--notes "..."] [--app-dir <path>]');
|
|
94
|
-
console.log(' cms-update-colour-hints --from /tmp/hint.json [--app-dir <path>]');
|
|
95
|
-
console.log(`Valid hints: ${VALID_HINTS.join(', ')}`);
|
|
96
|
-
process.exit(0);
|
|
97
|
-
}
|
|
98
|
-
if (!isValidHint(hint)) {
|
|
99
|
-
console.error(`Invalid hint "${hint}". Valid: ${VALID_HINTS.join(', ')}`);
|
|
100
|
-
process.exit(1);
|
|
101
|
-
}
|
|
102
|
-
hints[type] = { colourApplication: hint };
|
|
103
|
-
if (notes) {
|
|
104
|
-
hints[type] = { ...hints[type], notes };
|
|
105
|
-
}
|
|
106
|
-
saveHints(hintsPath, hints);
|
|
107
|
-
console.log(`Updated colour hint for "${type}": ${hint}`);
|
|
108
|
-
console.log(`Written to ${hintsPath}`);
|
|
109
|
-
}
|
|
110
|
-
main();
|
|
111
|
-
//# sourceMappingURL=cms-update-colour-hints.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-update-colour-hints.js","sourceRoot":"","sources":["../../src/bin/cms-update-colour-hints.ts"],"names":[],"mappings":"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"}
|