@se-studio/site-check 1.3.0 → 1.3.1

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Export CMS SEO tooling at `@se-studio/site-check/cms-seo` (audit, bulk publish, featured-image backfill) — available here until `@se-studio/cms-seo` can be published to npm.
8
+
3
9
  ## 1.3.0
4
10
 
5
11
  ### Minor Changes
@@ -0,0 +1,56 @@
1
+ import type { PlainClient } from './cma-types.js';
2
+ export type BulkPublishPhase = 'assets' | 'leaf' | 'composable' | 'chrome' | 'taxonomy' | 'article' | 'page';
3
+ export declare const BULK_PUBLISH_PHASES: BulkPublishPhase[];
4
+ export interface BulkActionPublishOptions {
5
+ apply: boolean;
6
+ skipAssets?: boolean;
7
+ phase?: BulkPublishPhase;
8
+ validateBeforePublish?: boolean;
9
+ }
10
+ export interface BulkPublishCounts {
11
+ published: number;
12
+ alreadyLive: number;
13
+ failed: number;
14
+ }
15
+ export interface BulkPublishFailure {
16
+ kind: 'asset' | 'entry';
17
+ id: string;
18
+ contentType?: string;
19
+ label: string;
20
+ error: string;
21
+ /** JSON or multi-line detail from Contentful bulk action / validate API. */
22
+ details?: string;
23
+ bulkActionId?: string;
24
+ }
25
+ export interface BulkActionPublishResult {
26
+ assets: BulkPublishCounts;
27
+ entriesByType: Record<string, BulkPublishCounts>;
28
+ failures: BulkPublishFailure[];
29
+ }
30
+ /** True when the entry/asset is not yet on delivery API or has real draft changes. */
31
+ export declare function needsPublish(sys: {
32
+ publishedAt?: string;
33
+ publishedVersion?: number;
34
+ version: number;
35
+ archivedAt?: string;
36
+ archivedVersion?: number;
37
+ }): boolean;
38
+ /** Serialize Contentful error `details` for console output. */
39
+ export declare function formatBulkErrorDetails(details: unknown): string | undefined;
40
+ /** Combine bulk-action entity error message with structured details. */
41
+ export declare function formatBulkEntityError(fallbackMessage: string, rawError?: {
42
+ message?: string;
43
+ details?: unknown;
44
+ }): {
45
+ error: string;
46
+ details?: string;
47
+ };
48
+ /** Extract message and details from thrown validate/publish errors. */
49
+ export declare function formatCaughtBulkError(error: unknown): {
50
+ message: string;
51
+ details?: string;
52
+ };
53
+ export declare function printFailureReport(failures: BulkPublishFailure[]): void;
54
+ export declare function bulkActionPublishAll(client: PlainClient, options: BulkActionPublishOptions): Promise<BulkActionPublishResult>;
55
+ export declare function parseBulkPublishArgv(argv: string[]): BulkActionPublishOptions;
56
+ //# sourceMappingURL=bulk-action-publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-action-publish.d.ts","sourceRoot":"","sources":["../../src/cms-seo/bulk-action-publish.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAWlD,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,CAAC;AAEX,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EAQjD,CAAC;AAoCF,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAiBD,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAMV;AA6BD,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,QAAQ,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAIrC;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAY3F;AAaD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAUvE;AAiYD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAsDlC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAa7E"}
@@ -0,0 +1,488 @@
1
+ const LOCALE = 'en-US';
2
+ const BATCH_SIZE = 200;
3
+ const COMPONENT_RETRY_PASSES = 5;
4
+ /** Bulk publish is all-or-nothing: if one entity fails, nothing in that batch is published. */
5
+ const BLOCKED_AFTER_RETRY_ERROR = 'Still unpublished after retry — bulk batch failed (often due to another entry in the same batch)';
6
+ const POLL_INTERVAL_MS = 1500;
7
+ const RATE_LIMIT_BACKOFF_MS = 5000;
8
+ export const BULK_PUBLISH_PHASES = [
9
+ 'assets',
10
+ 'leaf',
11
+ 'composable',
12
+ 'chrome',
13
+ 'taxonomy',
14
+ 'article',
15
+ 'page',
16
+ ];
17
+ const LEAF_CONTENT_TYPES = [
18
+ 'link',
19
+ 'media',
20
+ 'externalVideo',
21
+ 'externalComponent',
22
+ 'htmlComponent',
23
+ 'banner',
24
+ 'person',
25
+ 'schema',
26
+ 'customType',
27
+ ];
28
+ const COMPOSABLE_CONTENT_TYPES = ['component', 'collection'];
29
+ const CHROME_CONTENT_TYPES = [
30
+ 'alternatePageContent',
31
+ 'pageVariant',
32
+ 'pageTest',
33
+ 'template',
34
+ 'navigationItem',
35
+ 'navigation',
36
+ ];
37
+ const TAXONOMY_CONTENT_TYPES = ['tagType', 'tag', 'articleType'];
38
+ const PHASE_CONTENT_TYPES = {
39
+ leaf: LEAF_CONTENT_TYPES,
40
+ composable: COMPOSABLE_CONTENT_TYPES,
41
+ chrome: CHROME_CONTENT_TYPES,
42
+ taxonomy: TAXONOMY_CONTENT_TYPES,
43
+ article: ['article'],
44
+ page: ['page'],
45
+ };
46
+ function isArchived(sys) {
47
+ return sys.archivedAt != null || sys.archivedVersion != null;
48
+ }
49
+ /** True when the entry/asset is not yet on delivery API or has real draft changes. */
50
+ export function needsPublish(sys) {
51
+ if (isArchived(sys))
52
+ return false;
53
+ if (!sys.publishedAt)
54
+ return true;
55
+ const publishedVersion = sys.publishedVersion;
56
+ if (publishedVersion == null)
57
+ return true;
58
+ return sys.version > publishedVersion + 1;
59
+ }
60
+ function entryLabel(entry) {
61
+ const fields = entry.fields ?? {};
62
+ for (const key of ['cmsLabel', 'name', 'slug', 'heading', 'title']) {
63
+ const value = fields[key]?.[LOCALE];
64
+ if (typeof value === 'string' && value.trim())
65
+ return value;
66
+ }
67
+ return entry.sys.id;
68
+ }
69
+ function assetLabel(asset) {
70
+ const title = asset.fields?.title?.[LOCALE];
71
+ if (typeof title === 'string' && title.trim())
72
+ return title;
73
+ const fileName = asset.fields?.file?.[LOCALE]?.fileName;
74
+ if (typeof fileName === 'string' && fileName.trim())
75
+ return fileName;
76
+ return asset.sys.id;
77
+ }
78
+ function chunk(items, size) {
79
+ const batches = [];
80
+ for (let i = 0; i < items.length; i += size) {
81
+ batches.push(items.slice(i, i + size));
82
+ }
83
+ return batches;
84
+ }
85
+ const MAX_ERROR_DETAILS_CHARS = 2000;
86
+ /** Serialize Contentful error `details` for console output. */
87
+ export function formatBulkErrorDetails(details) {
88
+ if (details == null)
89
+ return undefined;
90
+ try {
91
+ const text = JSON.stringify(details, null, 2);
92
+ if (text.length <= MAX_ERROR_DETAILS_CHARS)
93
+ return text;
94
+ return `${text.slice(0, MAX_ERROR_DETAILS_CHARS)}…`;
95
+ }
96
+ catch {
97
+ const text = String(details);
98
+ return text.length <= MAX_ERROR_DETAILS_CHARS
99
+ ? text
100
+ : `${text.slice(0, MAX_ERROR_DETAILS_CHARS)}…`;
101
+ }
102
+ }
103
+ /** Combine bulk-action entity error message with structured details. */
104
+ export function formatBulkEntityError(fallbackMessage, rawError) {
105
+ const error = rawError?.message?.trim() || fallbackMessage;
106
+ const details = formatBulkErrorDetails(rawError?.details);
107
+ return details ? { error, details } : { error };
108
+ }
109
+ /** Extract message and details from thrown validate/publish errors. */
110
+ export function formatCaughtBulkError(error) {
111
+ if (error && typeof error === 'object') {
112
+ const err = error;
113
+ const message = err.message ?? err.data?.message ?? String(error);
114
+ const details = formatBulkErrorDetails(err.details ?? err.data?.details ?? err.data);
115
+ return details ? { message, details } : { message };
116
+ }
117
+ return { message: error instanceof Error ? error.message : String(error) };
118
+ }
119
+ function logFailures(heading, failures) {
120
+ if (failures.length === 0)
121
+ return;
122
+ console.error(`\n--- ${heading} (${failures.length}) ---`);
123
+ for (const failure of failures) {
124
+ console.error(`FAILED ${failure.kind} ${failure.label} (${failure.id}) — ${failure.error}`);
125
+ if (failure.contentType)
126
+ console.error(` content type: ${failure.contentType}`);
127
+ if (failure.bulkActionId)
128
+ console.error(` bulk action: ${failure.bulkActionId}`);
129
+ if (failure.details)
130
+ console.error(` details:\n${failure.details}`);
131
+ }
132
+ }
133
+ export function printFailureReport(failures) {
134
+ if (failures.length === 0)
135
+ return;
136
+ console.error(`\n=== Failure report (${failures.length}) ===`);
137
+ for (const failure of failures) {
138
+ const typePart = failure.contentType ? ` [${failure.contentType}]` : '';
139
+ console.error(`- ${failure.id}${typePart}: ${failure.label}`);
140
+ console.error(` ${failure.error}`);
141
+ if (failure.details)
142
+ console.error(` ${failure.details.split('\n').join('\n ')}`);
143
+ if (failure.bulkActionId)
144
+ console.error(` bulk action: ${failure.bulkActionId}`);
145
+ }
146
+ }
147
+ function sleep(ms) {
148
+ return new Promise((resolve) => setTimeout(resolve, ms));
149
+ }
150
+ function isRateLimitError(error) {
151
+ const message = error instanceof Error ? error.message : String(error);
152
+ return message.includes('429') || message.toLowerCase().includes('rate limit');
153
+ }
154
+ function toBulkEntityLink(entity) {
155
+ const linkType = entity.sys.type === 'Asset' ? 'Asset' : 'Entry';
156
+ return {
157
+ sys: {
158
+ type: 'Link',
159
+ linkType,
160
+ id: entity.sys.id,
161
+ version: entity.sys.version,
162
+ },
163
+ };
164
+ }
165
+ async function fetchAllAssets(client) {
166
+ const items = [];
167
+ let skip = 0;
168
+ while (true) {
169
+ const page = await client.asset.getMany({ query: { limit: 100, skip } });
170
+ items.push(...page.items);
171
+ skip += 100;
172
+ if (skip >= page.total)
173
+ break;
174
+ }
175
+ return items;
176
+ }
177
+ async function fetchEntriesByType(client, contentType) {
178
+ const items = [];
179
+ let skip = 0;
180
+ while (true) {
181
+ const page = await client.entry.getMany({
182
+ query: { content_type: contentType, limit: 100, skip },
183
+ });
184
+ items.push(...page.items);
185
+ skip += 100;
186
+ if (skip >= page.total)
187
+ break;
188
+ }
189
+ return items;
190
+ }
191
+ async function waitForAssetReady(client, assetId, maxAttempts = 15) {
192
+ let current = await client.asset.get({ assetId });
193
+ for (let i = 0; i < maxAttempts; i++) {
194
+ if (current.fields?.file?.[LOCALE]?.url)
195
+ return current;
196
+ await sleep(2000);
197
+ current = await client.asset.get({ assetId });
198
+ }
199
+ throw new Error('Asset file not ready for publish');
200
+ }
201
+ async function waitForBulkAction(client, bulkActionId) {
202
+ while (true) {
203
+ const action = await client.bulkAction.get({ bulkActionId });
204
+ const status = action.sys.status;
205
+ if (status === 'succeeded' || status === 'failed')
206
+ return action;
207
+ await sleep(POLL_INTERVAL_MS);
208
+ }
209
+ }
210
+ function toValidateEntityLink(entity) {
211
+ const linkType = entity.sys.type === 'Asset' ? 'Asset' : 'Entry';
212
+ return {
213
+ sys: {
214
+ type: 'Link',
215
+ linkType,
216
+ id: entity.sys.id,
217
+ },
218
+ };
219
+ }
220
+ async function runBulkPublishBatch(client, entities, options) {
221
+ const succeeded = [];
222
+ const failed = [];
223
+ const blocked = [];
224
+ const batchSize = options.batchSize ?? BATCH_SIZE;
225
+ for (const batchItems of chunk(entities, batchSize)) {
226
+ const items = batchItems.map(toBulkEntityLink);
227
+ let bulkAction;
228
+ for (let attempt = 0; attempt < 3; attempt++) {
229
+ try {
230
+ if (options.validate) {
231
+ await client.bulkAction.validate({}, {
232
+ action: 'publish',
233
+ entities: { items: batchItems.map(toValidateEntityLink) },
234
+ });
235
+ }
236
+ bulkAction = await client.bulkAction.publish({}, { entities: { items } });
237
+ break;
238
+ }
239
+ catch (error) {
240
+ if (isRateLimitError(error) && attempt < 2) {
241
+ await sleep(RATE_LIMIT_BACKOFF_MS * (attempt + 1));
242
+ continue;
243
+ }
244
+ // Validate/publish threw before the bulk action completed — nothing in this batch published.
245
+ const { message } = formatCaughtBulkError(error);
246
+ console.error(`Batch publish/validate error (${batchItems.length} entities queued for retry): ${message}`);
247
+ for (const entity of batchItems) {
248
+ blocked.push(entity);
249
+ }
250
+ bulkAction = undefined;
251
+ break;
252
+ }
253
+ }
254
+ if (!bulkAction)
255
+ continue;
256
+ const completed = await waitForBulkAction(client, bulkAction.sys.id);
257
+ if (completed.sys.status === 'succeeded') {
258
+ for (const entity of batchItems) {
259
+ if (entity.sys.type === 'Asset') {
260
+ console.log(`PUBLISHED asset: ${assetLabel(entity)}`);
261
+ }
262
+ else {
263
+ const entry = entity;
264
+ console.log(`PUBLISHED ${entry.sys.contentType?.sys?.id}: ${entryLabel(entry)}`);
265
+ }
266
+ }
267
+ succeeded.push(...batchItems);
268
+ continue;
269
+ }
270
+ // Bulk publish is all-or-nothing: failed status means nothing in this batch was published.
271
+ const entityErrors = completed.error?.details?.errors ?? [];
272
+ const failedIds = new Set(entityErrors
273
+ .map((item) => {
274
+ const entity = item.entity;
275
+ return 'id' in entity.sys ? entity.sys.id : undefined;
276
+ })
277
+ .filter(Boolean));
278
+ for (const entity of batchItems) {
279
+ if (failedIds.has(entity.sys.id)) {
280
+ const entityError = entityErrors.find((item) => {
281
+ const link = item.entity;
282
+ return 'id' in link.sys && link.sys.id === entity.sys.id;
283
+ });
284
+ const formatted = formatBulkEntityError(entityError?.error?.message ?? completed.error?.message ?? 'Bulk publish failed', entityError?.error);
285
+ failed.push(failureFromEntity(entity, formatted.error, completed.sys.id, formatted.details));
286
+ }
287
+ else {
288
+ blocked.push(entity);
289
+ }
290
+ }
291
+ }
292
+ return { succeeded, failed, blocked };
293
+ }
294
+ function failureFromEntity(entity, error, bulkActionId, details) {
295
+ if (entity.sys.type === 'Asset') {
296
+ return {
297
+ kind: 'asset',
298
+ id: entity.sys.id,
299
+ label: assetLabel(entity),
300
+ error,
301
+ details,
302
+ bulkActionId,
303
+ };
304
+ }
305
+ const entry = entity;
306
+ return {
307
+ kind: 'entry',
308
+ id: entry.sys.id,
309
+ contentType: entry.sys.contentType?.sys?.id,
310
+ label: entryLabel(entry),
311
+ error,
312
+ details,
313
+ bulkActionId,
314
+ };
315
+ }
316
+ async function publishEntityBatch(client, entities, apply, validate) {
317
+ if (entities.length === 0)
318
+ return { published: 0, failed: [] };
319
+ if (!apply) {
320
+ for (const entity of entities) {
321
+ if (entity.sys.type === 'Asset') {
322
+ console.log(`DRY asset: ${assetLabel(entity)} (${entity.sys.id})`);
323
+ }
324
+ else {
325
+ const entry = entity;
326
+ console.log(`DRY ${entry.sys.contentType?.sys?.id ?? 'entry'}: ${entryLabel(entry)} (${entry.sys.id})`);
327
+ }
328
+ }
329
+ return { published: entities.length, failed: [] };
330
+ }
331
+ let published = 0;
332
+ const pass1 = await runBulkPublishBatch(client, entities, { validate, batchSize: BATCH_SIZE });
333
+ published += pass1.succeeded.length;
334
+ let failures = pass1.failed;
335
+ if (pass1.failed.length > 0) {
336
+ logFailures('Root-cause publish failures (pass 1)', pass1.failed);
337
+ }
338
+ if (pass1.blocked.length > 0) {
339
+ const culpritIds = new Set(pass1.failed.map((failure) => failure.id));
340
+ const toRetry = pass1.blocked.filter((entity) => !culpritIds.has(entity.sys.id));
341
+ console.error(`\n--- Retrying ${toRetry.length} entities blocked by failed bulk batches (${pass1.blocked.length} in failed batches, pass 2) ---`);
342
+ if (toRetry.length > 0) {
343
+ const pass2 = await runBulkPublishBatch(client, toRetry, { validate, batchSize: BATCH_SIZE });
344
+ published += pass2.succeeded.length;
345
+ failures = [...failures, ...pass2.failed];
346
+ if (pass2.failed.length > 0) {
347
+ logFailures('Root-cause publish failures (pass 2)', pass2.failed);
348
+ }
349
+ if (pass2.blocked.length > 0) {
350
+ const stillBlockedFailures = pass2.blocked.map((entity) => failureFromEntity(entity, BLOCKED_AFTER_RETRY_ERROR));
351
+ failures.push(...stillBlockedFailures);
352
+ logFailures('Still blocked after retry', stillBlockedFailures);
353
+ }
354
+ }
355
+ }
356
+ return { published, failed: failures };
357
+ }
358
+ async function prepareAssets(client, assets, apply) {
359
+ const ready = [];
360
+ for (const asset of assets) {
361
+ if (!asset.fields?.file?.[LOCALE]?.url) {
362
+ if (!apply) {
363
+ ready.push(asset);
364
+ continue;
365
+ }
366
+ try {
367
+ ready.push(await waitForAssetReady(client, asset.sys.id));
368
+ }
369
+ catch (error) {
370
+ const message = error instanceof Error ? error.message : String(error);
371
+ console.error(`SKIP asset ${assetLabel(asset)} (${asset.sys.id}) — ${message}`);
372
+ }
373
+ continue;
374
+ }
375
+ ready.push(asset);
376
+ }
377
+ return ready;
378
+ }
379
+ async function publishAssetsPhase(client, apply) {
380
+ const allAssets = await fetchAllAssets(client);
381
+ const outdated = allAssets.filter((asset) => !isArchived(asset.sys) && needsPublish(asset.sys));
382
+ const counts = {
383
+ published: 0,
384
+ alreadyLive: allAssets.length - outdated.length,
385
+ failed: 0,
386
+ };
387
+ console.log(`\n--- Phase: assets (${outdated.length} outdated) ---`);
388
+ const ready = await prepareAssets(client, outdated, apply);
389
+ const { published, failed } = await publishEntityBatch(client, ready, apply, false);
390
+ counts.published = published;
391
+ counts.failed = failed.length;
392
+ console.log(`Assets: published=${counts.published}, already live=${counts.alreadyLive}, failed=${counts.failed}`);
393
+ return { counts, failures: failed };
394
+ }
395
+ async function publishContentType(client, contentType, apply, validate, maxPasses) {
396
+ const entries = await fetchEntriesByType(client, contentType);
397
+ const pending = entries.filter((entry) => !isArchived(entry.sys) && needsPublish(entry.sys));
398
+ const counts = {
399
+ published: 0,
400
+ alreadyLive: entries.length - pending.length,
401
+ failed: 0,
402
+ };
403
+ if (pending.length === 0) {
404
+ console.log(`${contentType}: published=0, already live=${counts.alreadyLive}, failed=0`);
405
+ return { counts, failures: [] };
406
+ }
407
+ console.log(`\n--- ${contentType} (${pending.length} outdated) ---`);
408
+ if (!apply) {
409
+ const dry = await publishEntityBatch(client, pending, false, validate);
410
+ counts.published = dry.published;
411
+ return { counts, failures: dry.failed };
412
+ }
413
+ let remaining = pending;
414
+ const failuresById = new Map();
415
+ for (let pass = 1; pass <= maxPasses && remaining.length > 0; pass++) {
416
+ const { published, failed } = await publishEntityBatch(client, remaining, true, validate);
417
+ counts.published += published;
418
+ const failedIds = new Set(failed.map((item) => item.id));
419
+ for (const item of failed)
420
+ failuresById.set(item.id, item);
421
+ remaining = remaining.filter((entry) => failedIds.has(entry.sys.id));
422
+ if (published === 0)
423
+ break;
424
+ }
425
+ counts.failed = failuresById.size;
426
+ console.log(`${contentType}: published=${counts.published}, already live=${counts.alreadyLive}, failed=${counts.failed}`);
427
+ return { counts, failures: [...failuresById.values()] };
428
+ }
429
+ function shouldRunPhase(phase, target) {
430
+ return phase == null || phase === target;
431
+ }
432
+ export async function bulkActionPublishAll(client, options) {
433
+ const apply = options.apply;
434
+ const result = {
435
+ assets: { published: 0, alreadyLive: 0, failed: 0 },
436
+ entriesByType: {},
437
+ failures: [],
438
+ };
439
+ console.log(apply
440
+ ? '\n=== APPLY: bulk publishing outdated content ==='
441
+ : '\n=== DRY RUN: no changes will be made ===');
442
+ if (!options.skipAssets && shouldRunPhase(options.phase, 'assets')) {
443
+ const assetResult = await publishAssetsPhase(client, apply);
444
+ result.assets = assetResult.counts;
445
+ result.failures.push(...assetResult.failures);
446
+ }
447
+ for (const phase of BULK_PUBLISH_PHASES) {
448
+ if (phase === 'assets')
449
+ continue;
450
+ if (!shouldRunPhase(options.phase, phase))
451
+ continue;
452
+ const contentTypes = PHASE_CONTENT_TYPES[phase];
453
+ const maxPasses = phase === 'composable' ? COMPONENT_RETRY_PASSES : 1;
454
+ const validate = (options.validateBeforePublish ?? false) && (phase === 'article' || phase === 'page');
455
+ console.log(`\n=== Phase: ${phase} ===`);
456
+ for (const contentType of contentTypes) {
457
+ const typeResult = await publishContentType(client, contentType, apply, validate, maxPasses);
458
+ result.entriesByType[contentType] = typeResult.counts;
459
+ result.failures.push(...typeResult.failures);
460
+ }
461
+ }
462
+ const totalPublished = result.assets.published +
463
+ Object.values(result.entriesByType).reduce((sum, counts) => sum + counts.published, 0);
464
+ const totalFailed = result.assets.failed +
465
+ Object.values(result.entriesByType).reduce((sum, counts) => sum + counts.failed, 0);
466
+ console.log('\n=== Summary ===');
467
+ console.log(`Would publish / published: ${totalPublished}`);
468
+ console.log(`Failed: ${totalFailed}`);
469
+ if (!apply && totalPublished > 0) {
470
+ console.log('\nRe-run with --apply to publish.');
471
+ }
472
+ printFailureReport(result.failures);
473
+ return result;
474
+ }
475
+ export function parseBulkPublishArgv(argv) {
476
+ const phaseArg = argv.find((arg) => arg.startsWith('--phase='));
477
+ const phaseValue = phaseArg?.slice('--phase='.length);
478
+ if (phaseValue && !BULK_PUBLISH_PHASES.includes(phaseValue)) {
479
+ throw new Error(`Unknown phase "${phaseValue}". Valid: ${BULK_PUBLISH_PHASES.join(', ')}`);
480
+ }
481
+ return {
482
+ apply: argv.includes('--apply'),
483
+ skipAssets: argv.includes('--skip-assets'),
484
+ phase: phaseValue,
485
+ validateBeforePublish: argv.includes('--validate'),
486
+ };
487
+ }
488
+ //# sourceMappingURL=bulk-action-publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-action-publish.js","sourceRoot":"","sources":["../../src/cms-seo/bulk-action-publish.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,GAAG,OAAO,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,+FAA+F;AAC/F,MAAM,yBAAyB,GAC7B,kGAAkG,CAAC;AACrG,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAWnC,MAAM,CAAC,MAAM,mBAAmB,GAAuB;IACrD,QAAQ;IACR,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;CACP,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB,MAAM;IACN,OAAO;IACP,eAAe;IACf,mBAAmB;IACnB,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,YAAY;CACJ,CAAC;AAEX,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,YAAY,CAAU,CAAC;AAEtE,MAAM,oBAAoB,GAAG;IAC3B,sBAAsB;IACtB,aAAa;IACb,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,YAAY;CACJ,CAAC;AAEX,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,aAAa,CAAU,CAAC;AAE1E,MAAM,mBAAmB,GAAmE;IAC1F,IAAI,EAAE,kBAAkB;IACxB,UAAU,EAAE,wBAAwB;IACpC,MAAM,EAAE,oBAAoB;IAC5B,QAAQ,EAAE,sBAAsB;IAChC,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,IAAI,EAAE,CAAC,MAAM,CAAC;CACf,CAAC;AA2CF,SAAS,UAAU,CAAC,GAAsD;IACxE,OAAO,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,GAM5B;IACC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAC9C,IAAI,gBAAgB,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,GAAG,CAAC,OAAO,GAAG,gBAAgB,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAU,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC;IACrE,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,KAAK,CAAI,KAAU,EAAE,IAAY;IACxC,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,uBAAuB;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,GAAG,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,IAAI,uBAAuB;YAC3C,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,GAAG,CAAC;IACnD,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,qBAAqB,CACnC,eAAuB,EACvB,QAAkD;IAElD,MAAM,KAAK,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC;IAC3D,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAIX,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACrF,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,QAA8B;IAClE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,OAAO,CAAC,KAAK,CAAC,SAAS,OAAO,KAAK,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC;IAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,WAAW;YAAE,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,YAAY;YAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAClF,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAA8B;IAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,OAAO,CAAC,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,OAAO,CAAC,CAAC;IAC/D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EAAE,GAAG,QAAQ,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpF,IAAI,OAAO,CAAC,YAAY;YAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,MAAM;YACZ,QAAQ;YACR,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;YACjB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;SAC5B;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,KAAsB,CAAC,CAAC;QAC5C,IAAI,IAAI,GAAG,CAAC;QACZ,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM;IAChC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,MAAmB,EAAE,WAAmB;IACxE,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE;SACvD,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,KAAsB,CAAC,CAAC;QAC5C,IAAI,IAAI,GAAG,CAAC;QACZ,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM;IAChC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAmB,EACnB,OAAe,EACf,WAAW,GAAG,EAAE;IAEhB,IAAI,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG;YAAE,OAAO,OAAO,CAAC;QACxD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAmB,EACnB,YAAoB;IAEpB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC;QACjE,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAqB;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,OAAO;QACL,GAAG,EAAE;YACH,IAAI,EAAE,MAAe;YACrB,QAAQ;YACR,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;SAClB;KACF,CAAC;AACJ,CAAC;AAUD,KAAK,UAAU,mBAAmB,CAChC,MAAmB,EACnB,QAAyB,EACzB,OAAmD;IAEnD,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAElD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE/C,IAAI,UAAuC,CAAC;QAC5C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAC9B,EAAE,EACF;wBACE,MAAM,EAAE,SAAS;wBACjB,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;qBAC1D,CACF,CAAC;gBACJ,CAAC;gBACD,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1E,MAAM;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;oBACnD,SAAS;gBACX,CAAC;gBACD,6FAA6F;gBAC7F,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBACjD,OAAO,CAAC,KAAK,CACX,iCAAiC,UAAU,CAAC,MAAM,gCAAgC,OAAO,EAAE,CAC5F,CAAC;gBACF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBACD,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;gBAChC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,MAAoB,CAAC,EAAE,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,MAAoB,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,KAAK,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,2FAA2F;QAC3F,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,YAAY;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,OAAO,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAa,CAC/B,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;oBACzB,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3D,CAAC,CAAC,CAAC;gBACH,MAAM,SAAS,GAAG,qBAAqB,CACrC,WAAW,EAAE,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAChF,WAAW,EAAE,KAAK,CACnB,CAAC;gBACF,MAAM,CAAC,IAAI,CACT,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,CAChF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAqB,EACrB,KAAa,EACb,YAAqB,EACrB,OAAgB;IAEhB,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;YACjB,KAAK,EAAE,UAAU,CAAC,MAAoB,CAAC;YACvC,KAAK;YACL,OAAO;YACP,YAAY;SACb,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAoB,CAAC;IACnC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;QAChB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE;QAC3C,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;QACxB,KAAK;QACL,OAAO;QACP,YAAY;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAmB,EACnB,QAAyB,EACzB,KAAc,EACd,QAAiB;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,MAAoB,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAoB,CAAC;gBACnC,OAAO,CAAC,GAAG,CACT,QAAQ,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,IAAI,OAAO,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAC5F,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/F,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,WAAW,CAAC,sCAAsC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjF,OAAO,CAAC,KAAK,CACX,kBAAkB,OAAO,CAAC,MAAM,6CAA6C,KAAK,CAAC,OAAO,CAAC,MAAM,iCAAiC,CACnI,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YAC9F,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;YACpC,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,WAAW,CAAC,sCAAsC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACxD,iBAAiB,CAAC,MAAM,EAAE,yBAAyB,CAAC,CACrD,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;gBACvC,WAAW,CAAC,2BAA2B,EAAE,oBAAoB,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAmB,EACnB,MAAoB,EACpB,KAAc;IAEd,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,cAAc,UAAU,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC;YAClF,CAAC;YACD,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAmB,EACnB,KAAc;IAEd,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAChG,MAAM,MAAM,GAAsB;QAChC,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC/C,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpF,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,OAAO,CAAC,GAAG,CACT,qBAAqB,MAAM,CAAC,SAAS,kBAAkB,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC,MAAM,EAAE,CACrG,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAmB,EACnB,WAAmB,EACnB,KAAc,EACd,QAAiB,EACjB,SAAiB;IAEjB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAsB;QAChC,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;QAC5C,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,+BAA+B,MAAM,CAAC,WAAW,YAAY,CAAC,CAAC;QACzF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,KAAK,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAErE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACvE,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE3D,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACrE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1F,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3D,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,SAAS,KAAK,CAAC;YAAE,MAAM;IAC7B,CAAC;IAED,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;IAElC,OAAO,CAAC,GAAG,CACT,GAAG,WAAW,eAAe,MAAM,CAAC,SAAS,kBAAkB,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC,MAAM,EAAE,CAC7G,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,KAAmC,EAAE,MAAwB;IACnF,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAmB,EACnB,OAAiC;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,MAAM,GAA4B;QACtC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QACnD,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,KAAK;QACH,CAAC,CAAC,mDAAmD;QACrD,CAAC,CAAC,4CAA4C,CACjD,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnE,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;QACxC,IAAI,KAAK,KAAK,QAAQ;YAAE,SAAS;QACjC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;YAAE,SAAS;QAEpD,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GACZ,CAAC,OAAO,CAAC,qBAAqB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC;QAExF,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC;QACzC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC7F,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;YACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,CAAC,SAAS;QACvB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACzF,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,CAAC,MAAM;QACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEtF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,8BAA8B,cAAc,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAiC,CAAC;IACtF,IAAI,UAAU,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,aAAa,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/B,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC1C,KAAK,EAAE,UAAU;QACjB,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PlainClient } from './cma-types.js';
2
+ export interface CreateCmaClientOptions {
3
+ accessToken?: string;
4
+ spaceId?: string;
5
+ environmentId?: string;
6
+ }
7
+ export declare function createCmaClient(options?: CreateCmaClientOptions): PlainClient;
8
+ //# sourceMappingURL=cma-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cma-client.d.ts","sourceRoot":"","sources":["../../src/cms-seo/cma-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,WAAW,CAW7E"}
@@ -0,0 +1,11 @@
1
+ import { createClient } from 'contentful-management';
2
+ export function createCmaClient(options) {
3
+ const accessToken = options?.accessToken ?? process.env.CONTENTFUL_MANAGEMENT_TOKEN;
4
+ const spaceId = options?.spaceId ?? process.env.CONTENTFUL_SPACE_ID;
5
+ const environmentId = options?.environmentId ?? process.env.CONTENTFUL_ENVIRONMENT_NAME ?? 'master';
6
+ if (!accessToken || !spaceId) {
7
+ throw new Error('CONTENTFUL_SPACE_ID and CONTENTFUL_MANAGEMENT_TOKEN are required');
8
+ }
9
+ return createClient({ accessToken }, { type: 'plain', defaults: { spaceId, environmentId } });
10
+ }
11
+ //# sourceMappingURL=cma-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cma-client.js","sourceRoot":"","sources":["../../src/cms-seo/cma-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAUrD,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACpF,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACpE,MAAM,aAAa,GACjB,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,QAAQ,CAAC;IAEhF,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;AAChG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type PlainClient = any;
2
+ //# sourceMappingURL=cma-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cma-types.d.ts","sourceRoot":"","sources":["../../src/cms-seo/cma-types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cma-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cma-types.js","sourceRoot":"","sources":["../../src/cms-seo/cma-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { PlainClient } from './cma-types.js';
2
+ import type { SiteSeoConfig } from './seo-audit.js';
3
+ export interface FeaturedImageBackfillOptions {
4
+ apply: boolean;
5
+ }
6
+ export interface FeaturedImageBackfillResult {
7
+ scanned: number;
8
+ alreadySet: number;
9
+ updated: number;
10
+ fromHero: number;
11
+ fromLogo: number;
12
+ noSource: number;
13
+ errors: number;
14
+ }
15
+ export declare function runFeaturedImageBackfill(client: PlainClient, config: SiteSeoConfig, options: FeaturedImageBackfillOptions): Promise<FeaturedImageBackfillResult>;
16
+ //# sourceMappingURL=featured-image-backfill.d.ts.map