@se-studio/contentful-cms 1.0.37 → 1.0.38

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.
@@ -0,0 +1,426 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import pc from 'picocolors';
3
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
4
+ import { createSafeEnvironment } from '../contentful/client.js';
5
+ import { fetchEntryTree, findEntryBySlug, serializeEntry } from '../contentful/fetch.js';
6
+ import { isJsonMode } from '../output/mode.js';
7
+ import { errorMsg, infoMsg } from '../output/print.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Walk-up: resolve slug-bearing ancestors
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Content types that have a public slug and represent meaningful usage context.
13
+ * Intermediate types (media, visual, component, collection, navigationItem…)
14
+ * are traversed silently until one of these is found.
15
+ */
16
+ const SLUG_BEARING_TYPES = new Set([
17
+ 'page',
18
+ 'article',
19
+ 'articleType',
20
+ 'pageVariant',
21
+ 'tag',
22
+ 'person',
23
+ ]);
24
+ const MAX_WALK_DEPTH = 5;
25
+ const WALK_PARENT_LIMIT = 20;
26
+ /**
27
+ * Walks UP the entry graph via `links_to_entry` until it reaches a slug-bearing
28
+ * content type (page, article, articleType, pageVariant, tag, person).
29
+ *
30
+ * Returns deduplicated slug-bearing ancestors. If the entry itself is slug-bearing
31
+ * it is returned directly without further traversal.
32
+ */
33
+ async function resolveSlugBearingAncestors(env, entryId, contentType, locale, visited, depth = 0) {
34
+ if (visited.has(entryId))
35
+ return [];
36
+ visited.add(entryId);
37
+ // Base case: this entry is slug-bearing → fetch it and return
38
+ if (SLUG_BEARING_TYPES.has(contentType)) {
39
+ try {
40
+ const raw = await env.getEntry(entryId);
41
+ const fields = raw.fields;
42
+ const label = getEntryLabel(fields, locale);
43
+ const slugField = fields['slug'];
44
+ const rawSlug = slugField ? String(slugField[locale] ?? slugField['en-US'] ?? '') : '';
45
+ const slug = rawSlug ? (rawSlug.startsWith('/') ? rawSlug : `/${rawSlug}`) : null;
46
+ return [{ id: entryId, contentType, label, slug }];
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ }
52
+ // Depth limit
53
+ if (depth >= MAX_WALK_DEPTH)
54
+ return [];
55
+ // Walk up: find entries that link to this one
56
+ const parents = await env.getEntries({ links_to_entry: entryId, limit: WALK_PARENT_LIMIT });
57
+ const results = [];
58
+ const seen = new Set();
59
+ for (const parent of parents.items) {
60
+ const ancestors = await resolveSlugBearingAncestors(env, parent.sys.id, parent.sys.contentType.sys.id, locale, visited, depth + 1);
61
+ for (const a of ancestors) {
62
+ if (!seen.has(a.id)) {
63
+ seen.add(a.id);
64
+ results.push(a);
65
+ }
66
+ }
67
+ }
68
+ return results;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Shared helpers
72
+ // ---------------------------------------------------------------------------
73
+ function getEntryLabel(fields, locale) {
74
+ const lf = (key) => {
75
+ const f = fields[key];
76
+ if (!f)
77
+ return undefined;
78
+ const v = f[locale] ?? f['en-US'];
79
+ return v ? String(v) : undefined;
80
+ };
81
+ return (lf('cmsLabel') ?? lf('heading') ?? lf('title') ?? lf('adminLabel') ?? lf('slug') ?? '(no label)');
82
+ }
83
+ function isAssetLink(item) {
84
+ return (typeof item === 'object' &&
85
+ item !== null &&
86
+ 'sys' in item &&
87
+ typeof item.sys === 'object' &&
88
+ item.sys.linkType === 'Asset');
89
+ }
90
+ function isEntryLink(item) {
91
+ return (typeof item === 'object' &&
92
+ item !== null &&
93
+ 'sys' in item &&
94
+ item.sys.linkType === 'Entry');
95
+ }
96
+ /**
97
+ * Extracts all Asset links from an entry's fields at a given locale.
98
+ * Returns { assetId, fieldName } for each found link.
99
+ */
100
+ function extractAssetLinks(fields, locale) {
101
+ const results = [];
102
+ for (const [fieldName, fieldData] of Object.entries(fields)) {
103
+ if (!fieldData)
104
+ continue;
105
+ const val = fieldData[locale] ?? fieldData['en-US'];
106
+ if (!val)
107
+ continue;
108
+ if (isAssetLink(val)) {
109
+ results.push({ assetId: val.sys.id, fieldName });
110
+ }
111
+ else if (Array.isArray(val)) {
112
+ for (const item of val) {
113
+ if (isAssetLink(item))
114
+ results.push({ assetId: item.sys.id, fieldName });
115
+ }
116
+ }
117
+ }
118
+ return results;
119
+ }
120
+ /**
121
+ * Returns IDs of child entries reachable via content array / single-link fields.
122
+ * Mirrors the traversal logic in fetch.ts extractLinkedEntryIds.
123
+ */
124
+ function getContentChildIds(entry, locale) {
125
+ const ids = [];
126
+ const fields = entry.fields;
127
+ const ctId = entry.sys.contentType.sys.id;
128
+ const arrayFields = ctId === 'template'
129
+ ? ['topContent', 'content', 'bottomContent', 'contents', 'preContent', 'postContent']
130
+ : ['topContent', 'content', 'bottomContent', 'contents'];
131
+ for (const fieldId of arrayFields) {
132
+ const fieldData = fields[fieldId];
133
+ if (!fieldData)
134
+ continue;
135
+ const val = fieldData[locale] ?? fieldData['en-US'];
136
+ if (!Array.isArray(val))
137
+ continue;
138
+ for (const item of val) {
139
+ if (isEntryLink(item))
140
+ ids.push(item.sys.id);
141
+ }
142
+ }
143
+ for (const fieldId of ['template', 'articleType', 'author']) {
144
+ const fieldData = fields[fieldId];
145
+ if (!fieldData)
146
+ continue;
147
+ const val = fieldData[locale] ?? fieldData['en-US'];
148
+ if (isEntryLink(val))
149
+ ids.push(val.sys.id);
150
+ }
151
+ return ids;
152
+ }
153
+ /** Paginates through all page entries in the CMA. */
154
+ async function fetchAllPageInfos(env, locale) {
155
+ const pages = [];
156
+ let skip = 0;
157
+ const limit = 200;
158
+ while (true) {
159
+ const result = await env.getEntries({
160
+ content_type: 'page',
161
+ select: 'sys,fields.slug,fields.title',
162
+ limit,
163
+ skip,
164
+ });
165
+ for (const raw of result.items) {
166
+ const fields = raw.fields;
167
+ const rawSlug = String(fields['slug']?.[locale] ?? fields['slug']?.['en-US'] ?? raw.sys.id);
168
+ const slug = rawSlug.startsWith('/') ? rawSlug : `/${rawSlug}`;
169
+ const title = String(fields['title']?.[locale] ?? fields['title']?.['en-US'] ?? slug);
170
+ pages.push({ id: raw.sys.id, slug, title });
171
+ }
172
+ if (result.items.length < limit)
173
+ break;
174
+ skip += limit;
175
+ }
176
+ return pages;
177
+ }
178
+ function summariseRawAsset(raw) {
179
+ const fileField = raw.fields.file;
180
+ const fileLoc = Object.keys(fileField ?? {})[0] ?? 'en-US';
181
+ const fileData = fileField?.[fileLoc];
182
+ const titleField = raw.fields.title;
183
+ const title = String(titleField?.[fileLoc] ?? titleField?.['en-US'] ?? raw.sys.id);
184
+ return {
185
+ id: raw.sys.id,
186
+ title,
187
+ fileName: fileData?.fileName ?? '',
188
+ contentType: fileData?.contentType ?? '',
189
+ url: fileData?.url ? `https:${fileData.url}` : '',
190
+ width: fileData?.details?.image?.width ?? null,
191
+ height: fileData?.details?.image?.height ?? null,
192
+ size: fileData?.details?.size ?? null,
193
+ };
194
+ }
195
+ async function runAuditImages(opts) {
196
+ const config = loadConfig(opts.config);
197
+ const { key, space } = resolveSpaceConfig(config, opts.space);
198
+ const env = await createSafeEnvironment(space);
199
+ const locale = space.defaultLocale;
200
+ // 1. Fetch all image assets (paginated)
201
+ infoMsg(`Fetching all image assets for space "${key}"…`);
202
+ const rawAssets = [];
203
+ let skip = 0;
204
+ const limit = 100;
205
+ while (true) {
206
+ const result = await env.getAssets({ limit, skip });
207
+ for (const raw of result.items) {
208
+ const summary = summariseRawAsset(raw);
209
+ if (summary.contentType.startsWith('image/') || summary.contentType === '') {
210
+ rawAssets.push(summary);
211
+ }
212
+ }
213
+ if (result.items.length < limit)
214
+ break;
215
+ skip += limit;
216
+ }
217
+ infoMsg(`Found ${String(rawAssets.length)} image asset(s).`);
218
+ // 2. For each asset, walk up from immediate backlinks to slug-bearing ancestors
219
+ const images = [];
220
+ let i = 0;
221
+ for (const asset of rawAssets) {
222
+ i++;
223
+ infoMsg(` [${String(i)}/${String(rawAssets.length)}] ${asset.title}`);
224
+ const backlinks = await env.getEntries({ links_to_asset: asset.id, limit: 50 });
225
+ const seen = new Set();
226
+ const usages = [];
227
+ // Shared visited set across all backlinks for this asset to avoid redundant walks
228
+ const visited = new Set();
229
+ for (const entry of backlinks.items) {
230
+ const ancestors = await resolveSlugBearingAncestors(env, entry.sys.id, entry.sys.contentType.sys.id, locale, visited);
231
+ for (const a of ancestors) {
232
+ if (!seen.has(a.id)) {
233
+ seen.add(a.id);
234
+ usages.push(a);
235
+ }
236
+ }
237
+ }
238
+ images.push({ ...asset, usages });
239
+ }
240
+ const output = {
241
+ space: key,
242
+ generated: new Date().toISOString(),
243
+ total: images.length,
244
+ images,
245
+ };
246
+ if (isJsonMode()) {
247
+ console.log(JSON.stringify(output, null, 2));
248
+ return;
249
+ }
250
+ // Human-readable summary
251
+ console.log(`\n${pc.bold(`Image Audit — ${key}`)}\n`);
252
+ for (const img of images) {
253
+ const dims = img.width && img.height ? ` ${String(img.width)}×${String(img.height)}` : '';
254
+ const ct = img.contentType ? ` ${pc.dim(img.contentType)}` : '';
255
+ console.log(`${pc.bold(img.title)} ${pc.dim(img.fileName)}${pc.dim(dims)}${ct}`);
256
+ console.log(` ID: ${img.id}`);
257
+ if (img.usages.length === 0) {
258
+ console.log(` ${pc.yellow('⚠ No usages found — may be unused')}`);
259
+ }
260
+ else {
261
+ for (const u of img.usages) {
262
+ const slugStr = u.slug ? pc.cyan(u.slug) : pc.dim('(no slug)');
263
+ console.log(` ${slugStr} ${pc.blue(u.contentType)} "${u.label}"`);
264
+ }
265
+ }
266
+ console.log('');
267
+ }
268
+ console.log(pc.dim(`${String(images.length)} image(s) total. Use --json for full JSON output.`));
269
+ }
270
+ function buildNodeTree(entryId, allEntries, locale, visited) {
271
+ if (visited.has(entryId))
272
+ return null;
273
+ const entry = allEntries[entryId];
274
+ if (!entry)
275
+ return null;
276
+ visited.add(entryId);
277
+ const fields = entry.fields;
278
+ const ctId = entry.sys.contentType.sys.id;
279
+ const label = getEntryLabel(fields, locale);
280
+ const assets = extractAssetLinks(fields, locale);
281
+ const childIds = getContentChildIds(entry, locale);
282
+ const children = [];
283
+ for (const childId of childIds) {
284
+ const child = buildNodeTree(childId, allEntries, locale, visited);
285
+ if (child)
286
+ children.push(child);
287
+ }
288
+ return { id: entryId, contentType: ctId, label, assets, children };
289
+ }
290
+ function renderNodeLine(node, prefix, isLast) {
291
+ const connector = isLast ? '└── ' : '├── ';
292
+ const childPrefix = prefix + (isLast ? ' ' : '│ ');
293
+ const ct = pc.blue(node.contentType.padEnd(18));
294
+ const lbl = pc.white(`"${node.label.length > 45 ? `${node.label.slice(0, 44)}…` : node.label}"`);
295
+ const id = pc.dim(`[…${node.id.slice(-6)}]`);
296
+ console.log(`${prefix}${connector}${ct} ${lbl} ${id}`);
297
+ const assetCount = node.assets.length;
298
+ const childCount = node.children.length;
299
+ const totalSubs = assetCount + childCount;
300
+ let subIdx = 0;
301
+ for (const a of node.assets) {
302
+ subIdx++;
303
+ const ac = subIdx === totalSubs ? '└── ' : '├── ';
304
+ console.log(`${childPrefix}${ac}${pc.yellow('🖼')} ${pc.dim(a.fieldName)} → ${pc.dim(a.assetId)}`);
305
+ }
306
+ for (let i = 0; i < node.children.length; i++) {
307
+ const child = node.children[i];
308
+ if (child)
309
+ renderNodeLine(child, childPrefix, i === node.children.length - 1);
310
+ }
311
+ }
312
+ async function runAuditTree(opts) {
313
+ const config = loadConfig(opts.config);
314
+ const { key, space } = resolveSpaceConfig(config, opts.space);
315
+ const env = await createSafeEnvironment(space);
316
+ const locale = space.defaultLocale;
317
+ let targetPages;
318
+ if (opts.page) {
319
+ infoMsg(`Finding page: ${opts.page}…`);
320
+ const raw = await findEntryBySlug(env, opts.page, locale);
321
+ if (!raw) {
322
+ errorMsg(`Page not found: ${opts.page}`);
323
+ process.exit(1);
324
+ return;
325
+ }
326
+ const entry = serializeEntry(raw);
327
+ const fields = entry.fields;
328
+ const rawSlug = String(fields['slug']?.[locale] ?? fields['slug']?.['en-US'] ?? raw.sys.id);
329
+ const slug = rawSlug.startsWith('/') ? rawSlug : `/${rawSlug}`;
330
+ const title = String(fields['title']?.[locale] ?? fields['title']?.['en-US'] ?? slug);
331
+ targetPages = [{ id: raw.sys.id, slug, title }];
332
+ }
333
+ else {
334
+ infoMsg(`Fetching all pages for space "${key}"…`);
335
+ targetPages = await fetchAllPageInfos(env, locale);
336
+ }
337
+ infoMsg(`Building content tree(s) for ${String(targetPages.length)} page(s)…`);
338
+ const pageTrees = [];
339
+ for (const page of targetPages) {
340
+ infoMsg(` ${page.slug}…`);
341
+ const allEntries = await fetchEntryTree(env, page.id);
342
+ const rootEntry = allEntries[page.id];
343
+ if (!rootEntry)
344
+ continue;
345
+ const visited = new Set([page.id]);
346
+ const topLevelIds = getContentChildIds(rootEntry, locale);
347
+ const children = [];
348
+ for (const childId of topLevelIds) {
349
+ const child = buildNodeTree(childId, allEntries, locale, visited);
350
+ if (child)
351
+ children.push(child);
352
+ }
353
+ pageTrees.push({ id: page.id, slug: page.slug, title: page.title, children });
354
+ }
355
+ if (opts.output === 'json' || isJsonMode()) {
356
+ console.log(JSON.stringify({ space: key, pages: pageTrees }, null, 2));
357
+ return;
358
+ }
359
+ // Text tree output
360
+ console.log(`\n${pc.bold(`Content Tree — ${key}`)}\n`);
361
+ for (const pageTree of pageTrees) {
362
+ const titleStr = pc.dim(`"${pageTree.title}"`);
363
+ const idStr = pc.dim(`[…${pageTree.id.slice(-6)}]`);
364
+ console.log(`${pc.cyan(pc.bold(pageTree.slug))} ${titleStr} ${idStr}`);
365
+ for (let i = 0; i < pageTree.children.length; i++) {
366
+ const child = pageTree.children[i];
367
+ if (child)
368
+ renderNodeLine(child, '', i === pageTree.children.length - 1);
369
+ }
370
+ console.log('');
371
+ }
372
+ }
373
+ // ---------------------------------------------------------------------------
374
+ // Registration
375
+ // ---------------------------------------------------------------------------
376
+ export function registerAuditCommand(program) {
377
+ const audit = program
378
+ .command('audit')
379
+ .description('Audit CMS content — asset inventory and content relationship trees. No session required.\n' +
380
+ 'Subcommands: images, tree\n' +
381
+ 'Examples:\n' +
382
+ ' cms-edit --json audit images # full image inventory as JSON\n' +
383
+ ' cms-edit audit tree --page / # content tree for the homepage');
384
+ audit
385
+ .command('images')
386
+ .description('List all image assets with their page/component usages.\n' +
387
+ 'Outputs a JSON payload designed for the image-guide skill to enrich with AI descriptions.\n' +
388
+ 'Use --json flag on the parent command for machine-readable output:\n' +
389
+ ' cms-edit --json audit images')
390
+ .action(async (_opts, cmd) => {
391
+ const parentOpts = cmd.parent?.parent?.opts() ?? {};
392
+ try {
393
+ await runAuditImages({ space: parentOpts.space, config: parentOpts.config });
394
+ }
395
+ catch (err) {
396
+ errorMsg(err instanceof Error ? err.message : String(err));
397
+ process.exit(1);
398
+ }
399
+ });
400
+ audit
401
+ .command('tree')
402
+ .description('Show the content relationship tree for all pages, or a single page.\n' +
403
+ 'Queries Contentful CMA directly — no session or running app needed.\n' +
404
+ 'Examples:\n' +
405
+ ' cms-edit audit tree # full site tree (text)\n' +
406
+ ' cms-edit audit tree --page / # homepage only\n' +
407
+ ' cms-edit --json audit tree # JSON output')
408
+ .option('--page <slug>', 'Only show the tree for this page slug (e.g. /about)')
409
+ .option('--output <format>', 'Output format: text (default) or json (overridden by --json flag)', 'text')
410
+ .action(async (opts, cmd) => {
411
+ const parentOpts = cmd.parent?.parent?.opts() ?? {};
412
+ try {
413
+ await runAuditTree({
414
+ page: opts.page,
415
+ output: opts.output,
416
+ space: parentOpts.space,
417
+ config: parentOpts.config,
418
+ });
419
+ }
420
+ catch (err) {
421
+ errorMsg(err instanceof Error ? err.message : String(err));
422
+ process.exit(1);
423
+ }
424
+ });
425
+ }
426
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ /**
4
+ * Registers the `create from-json` subcommand on the existing `create` Command group.
5
+ * Must be called with the Command instance returned by registerCreateCommand.
6
+ */
7
+ export declare function registerCreateFromJsonCommand(createCmd: Command): void;
8
+ //# sourceMappingURL=create-from-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-from-json.d.ts","sourceRoot":"","sources":["../../src/commands/create-from-json.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiFzC;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CA4KtE"}