@contentful/experience-design-system-cli 2.18.1-dev-build-ebf672a.0 → 2.18.1-dev-build-2117d43.0
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/README.md +2 -1
- package/dist/package.json +2 -2
- package/dist/src/apply/api-client.d.ts +4 -1
- package/dist/src/apply/api-client.js +4 -2
- package/dist/src/apply/command.js +22 -5
- package/dist/src/apply/tui/ServerApplyView.d.ts +4 -2
- package/dist/src/apply/tui/ServerApplyView.js +5 -4
- package/dist/src/apply/tui/ServerPreviewView.d.ts +2 -1
- package/dist/src/apply/tui/ServerPreviewView.js +2 -2
- package/dist/src/import/command.js +6 -1
- package/dist/src/import/orchestrator.d.ts +1 -0
- package/dist/src/import/orchestrator.js +2 -0
- package/dist/src/import/tui/WizardApp.d.ts +2 -1
- package/dist/src/import/tui/WizardApp.js +5 -5
- package/dist/src/import/tui/steps/WizardPreviewStep.d.ts +3 -2
- package/dist/src/import/tui/steps/WizardPreviewStep.js +9 -3
- package/dist/src/lib/command-options.d.ts +1 -0
- package/dist/src/lib/command-options.js +3 -0
- package/dist/src/runs/modify-launcher.d.ts +2 -0
- package/dist/src/runs/modify-launcher.js +2 -0
- package/dist/src/runs/push-helpers.d.ts +1 -0
- package/dist/src/runs/push-helpers.js +3 -0
- package/dist/src/runs/replay-helpers.d.ts +4 -0
- package/dist/src/runs/replay-helpers.js +3 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -214,6 +214,7 @@ Pass `--select-prompt-path <path>` and/or `--generate-prompt-path <path>` to swa
|
|
|
214
214
|
| `--host <url>` | `https://api.contentful.com` | Override API base URL |
|
|
215
215
|
| `--on-conflict <mode>` | _(prompt via `<SaveConflictGate>`)_ | Headless conflict resolution when a file already exists at the save path: `overwrite`, `skip`, or `fail`. Bypasses the wizard's interactive save-conflict gate. Mutex with `--no-save`. |
|
|
216
216
|
| `--print-prompt` | — | Print the generate prompt to stdout and exit. Replaces the prompt-print semantics of `--dry-run`. |
|
|
217
|
+
| `--allow-deletions` | off (non-destructive) | Allow the push to delete remote ComponentTypes/DesignTokens missing from the manifest. Default skips them instead of deleting. Forwarded to headless subprocess pushes and `--push-from-run`. |
|
|
217
218
|
| `--dry-run` | _(deprecated)_ | Deprecated alias for `--print-prompt`. Emits a stderr deprecation notice; prompt-print semantics will be removed in a future release. |
|
|
218
219
|
|
|
219
220
|
### Run-picker at wizard start
|
|
@@ -418,7 +419,7 @@ experiences apply select --space-id <id> --environment-id <env> --session <id>
|
|
|
418
419
|
experiences apply push --space-id <id> --environment-id <env> --session <id> [--yes]
|
|
419
420
|
```
|
|
420
421
|
|
|
421
|
-
Shared flags: `--components`, `--tokens`, `--session`, `--space-id`, `--environment-id`, `--cma-token`, `--host`, `--viewports`. `apply preview` adds `--include-unchanged`. `apply select` adds `--select-all`, `--select`, `--deselect`, `--force`. `apply push` adds `--yes`, `--verbose`, `--force`, `--dry-run`.
|
|
422
|
+
Shared flags: `--components`, `--tokens`, `--session`, `--space-id`, `--environment-id`, `--cma-token`, `--host`, `--viewports`. `apply preview` adds `--include-unchanged`. `apply select` adds `--select-all`, `--select`, `--deselect`, `--force`, `--allow-deletions`. `apply push` adds `--yes`, `--verbose`, `--force`, `--dry-run`, `--allow-deletions`. By default, remote ComponentTypes and DesignTokens missing from the pushed manifest are skipped, not deleted; pass `--allow-deletions` to restore the prior delete behavior.
|
|
422
423
|
|
|
423
424
|
Design tokens are written first (component types may reference token kinds). Each entity write is recorded in the session database atomically — interrupted pushes resume from where they left off.
|
|
424
425
|
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentful/experience-design-system-cli",
|
|
3
|
-
"version": "2.18.1-dev-build-
|
|
3
|
+
"version": "2.18.1-dev-build-2117d43.0",
|
|
4
4
|
"description": "Contentful Experiences design system import CLI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"eslint-plugin-prettier": "^5.5.4",
|
|
57
57
|
"ink-testing-library": "^4.0.0",
|
|
58
58
|
"typescript-eslint": "^8.52.0",
|
|
59
|
-
"vitest": "^4.
|
|
59
|
+
"vitest": "^4.0.16"
|
|
60
60
|
},
|
|
61
61
|
"repository": {
|
|
62
62
|
"type": "git",
|
|
@@ -51,7 +51,10 @@ export declare class ImportApiClient {
|
|
|
51
51
|
private requestWithRetry;
|
|
52
52
|
validateToken(): Promise<void>;
|
|
53
53
|
previewImport(manifest: ManifestPayload): Promise<ServerPreviewResponse>;
|
|
54
|
-
applyImport(manifest: ManifestPayload,
|
|
54
|
+
applyImport(manifest: ManifestPayload, options: {
|
|
55
|
+
acknowledgeBreakingChanges: boolean;
|
|
56
|
+
allowDeletions?: boolean;
|
|
57
|
+
}): Promise<ApplyOperationResponse>;
|
|
55
58
|
pollOperation(operationId: string, opts?: {
|
|
56
59
|
intervalMs?: number;
|
|
57
60
|
maxIntervalMs?: number;
|
|
@@ -296,12 +296,14 @@ export class ImportApiClient {
|
|
|
296
296
|
debug.event('apply', 'preview.ok', { status: result.response.status, durationMs: Date.now() - startedAt });
|
|
297
297
|
return sanitizePreviewResponse(parsed);
|
|
298
298
|
}
|
|
299
|
-
async applyImport(manifest,
|
|
299
|
+
async applyImport(manifest, options) {
|
|
300
|
+
const { acknowledgeBreakingChanges, allowDeletions = false } = options;
|
|
300
301
|
const debug = getDebugLogger();
|
|
301
302
|
const startedAt = Date.now();
|
|
302
303
|
debug.event('apply', 'apply.request', {
|
|
303
304
|
url: `${this.base()}/design_systems/imports/apply`,
|
|
304
305
|
acknowledgeBreakingChanges,
|
|
306
|
+
allowDeletions,
|
|
305
307
|
});
|
|
306
308
|
let result;
|
|
307
309
|
try {
|
|
@@ -309,7 +311,7 @@ export class ImportApiClient {
|
|
|
309
311
|
baseUrl: this.host,
|
|
310
312
|
headers: this.headers(),
|
|
311
313
|
path: { spaceId: this.spaceId, environmentId: this.environmentId },
|
|
312
|
-
body: { ...manifest, acknowledgeBreakingChanges },
|
|
314
|
+
body: { ...manifest, acknowledgeBreakingChanges, allowDeletions },
|
|
313
315
|
parseAs: 'json',
|
|
314
316
|
});
|
|
315
317
|
}
|
|
@@ -12,7 +12,7 @@ import { ServerPreviewApp, ServerPreviewConfirm, ServerApplyProgress, ServerAppl
|
|
|
12
12
|
import { SelectView, makeSelectKey } from './tui/SelectView.js';
|
|
13
13
|
import { buildPostPushUrl } from '../lib/contentful-urls.js';
|
|
14
14
|
import { resolveCompositionMode } from '../lib/composition-mode.js';
|
|
15
|
-
import { addArtifactInputOptions, addCompositionOptions, addContentfulTargetOptions, addSelectionOptions, } from '../lib/command-options.js';
|
|
15
|
+
import { addAllowDeletionsOption, addArtifactInputOptions, addCompositionOptions, addContentfulTargetOptions, addSelectionOptions, } from '../lib/command-options.js';
|
|
16
16
|
import { stripAllowedComponents } from '../import/strip-allowed-components.js';
|
|
17
17
|
import { readExperiencesCredentials } from '../credentials-store.js';
|
|
18
18
|
import { getInteractiveTerminalSupport, requireInteractiveTerminal } from '../lib/terminal-capabilities.js';
|
|
@@ -457,6 +457,7 @@ export function registerApplyCommand(program) {
|
|
|
457
457
|
preview,
|
|
458
458
|
spaceId,
|
|
459
459
|
environmentId,
|
|
460
|
+
allowDeletions: false,
|
|
460
461
|
}));
|
|
461
462
|
await waitUntilExit();
|
|
462
463
|
}
|
|
@@ -469,6 +470,7 @@ export function registerApplyCommand(program) {
|
|
|
469
470
|
addArtifactInputOptions(pushCmd);
|
|
470
471
|
addContentfulTargetOptions(pushCmd);
|
|
471
472
|
addCompositionOptions(pushCmd);
|
|
473
|
+
addAllowDeletionsOption(pushCmd);
|
|
472
474
|
pushCmd
|
|
473
475
|
.option('--yes', 'Skip interactive confirmation')
|
|
474
476
|
.option('--verbose', 'Show all entity progress including skipped/unchanged')
|
|
@@ -517,6 +519,7 @@ export function registerApplyCommand(program) {
|
|
|
517
519
|
preview,
|
|
518
520
|
spaceId,
|
|
519
521
|
environmentId,
|
|
522
|
+
allowDeletions: opts.allowDeletions === true,
|
|
520
523
|
}));
|
|
521
524
|
await waitUntilExit();
|
|
522
525
|
}
|
|
@@ -547,7 +550,10 @@ export function registerApplyCommand(program) {
|
|
|
547
550
|
}
|
|
548
551
|
let operation;
|
|
549
552
|
try {
|
|
550
|
-
operation = await client.applyImport(manifest,
|
|
553
|
+
operation = await client.applyImport(manifest, {
|
|
554
|
+
acknowledgeBreakingChanges: breakingWithImpact || opts.force === true,
|
|
555
|
+
allowDeletions: opts.allowDeletions === true,
|
|
556
|
+
});
|
|
551
557
|
}
|
|
552
558
|
catch (e) {
|
|
553
559
|
if (e instanceof ApiError)
|
|
@@ -577,7 +583,10 @@ export function registerApplyCommand(program) {
|
|
|
577
583
|
}));
|
|
578
584
|
let operation;
|
|
579
585
|
try {
|
|
580
|
-
operation = await client.applyImport(manifest,
|
|
586
|
+
operation = await client.applyImport(manifest, {
|
|
587
|
+
acknowledgeBreakingChanges: acknowledge,
|
|
588
|
+
allowDeletions: opts.allowDeletions === true,
|
|
589
|
+
});
|
|
581
590
|
}
|
|
582
591
|
catch (e) {
|
|
583
592
|
if (e instanceof ApiError) {
|
|
@@ -625,6 +634,7 @@ export function registerApplyCommand(program) {
|
|
|
625
634
|
spaceId,
|
|
626
635
|
environmentId,
|
|
627
636
|
breakingWithImpact,
|
|
637
|
+
allowDeletions: opts.allowDeletions === true,
|
|
628
638
|
onConfirm: (acknowledge) => {
|
|
629
639
|
void runApply(acknowledge);
|
|
630
640
|
},
|
|
@@ -640,6 +650,7 @@ export function registerApplyCommand(program) {
|
|
|
640
650
|
addContentfulTargetOptions(selectCmd);
|
|
641
651
|
addCompositionOptions(selectCmd);
|
|
642
652
|
addSelectionOptions(selectCmd);
|
|
653
|
+
addAllowDeletionsOption(selectCmd);
|
|
643
654
|
selectCmd.option('--force', 'Skip confirmation for breaking changes').action(async (opts) => {
|
|
644
655
|
const nonInteractive = opts.selectAll || (opts.select ?? []).length > 0 || (opts.deselect ?? []).length > 0;
|
|
645
656
|
if (!nonInteractive) {
|
|
@@ -707,7 +718,10 @@ export function registerApplyCommand(program) {
|
|
|
707
718
|
}
|
|
708
719
|
let operation;
|
|
709
720
|
try {
|
|
710
|
-
operation = await client.applyImport(filteredManifest,
|
|
721
|
+
operation = await client.applyImport(filteredManifest, {
|
|
722
|
+
acknowledgeBreakingChanges: hasBreaking || opts.force === true,
|
|
723
|
+
allowDeletions: opts.allowDeletions === true,
|
|
724
|
+
});
|
|
711
725
|
}
|
|
712
726
|
catch (e) {
|
|
713
727
|
if (e instanceof ApiError)
|
|
@@ -749,7 +763,10 @@ export function registerApplyCommand(program) {
|
|
|
749
763
|
}));
|
|
750
764
|
let operation;
|
|
751
765
|
try {
|
|
752
|
-
operation = await client.applyImport(filteredManifest,
|
|
766
|
+
operation = await client.applyImport(filteredManifest, {
|
|
767
|
+
acknowledgeBreakingChanges: hasBreaking,
|
|
768
|
+
allowDeletions: opts.allowDeletions === true,
|
|
769
|
+
});
|
|
753
770
|
}
|
|
754
771
|
catch (e) {
|
|
755
772
|
if (e instanceof ApiError) {
|
|
@@ -5,16 +5,18 @@ interface ServerPreviewConfirmProps {
|
|
|
5
5
|
spaceId: string;
|
|
6
6
|
environmentId: string;
|
|
7
7
|
breakingWithImpact: boolean;
|
|
8
|
+
allowDeletions: boolean;
|
|
8
9
|
onConfirm: (acknowledge: boolean) => void;
|
|
9
10
|
onCancel: () => void;
|
|
10
11
|
}
|
|
11
|
-
export declare function ServerPreviewConfirm({ preview, spaceId, environmentId, breakingWithImpact, onConfirm, onCancel, }: ServerPreviewConfirmProps): React.ReactElement;
|
|
12
|
+
export declare function ServerPreviewConfirm({ preview, spaceId, environmentId, breakingWithImpact, allowDeletions, onConfirm, onCancel, }: ServerPreviewConfirmProps): React.ReactElement;
|
|
12
13
|
interface ServerPreviewAppProps {
|
|
13
14
|
preview: ServerPreviewResponse;
|
|
14
15
|
spaceId: string;
|
|
15
16
|
environmentId: string;
|
|
17
|
+
allowDeletions: boolean;
|
|
16
18
|
}
|
|
17
|
-
export declare function ServerPreviewApp({ preview, spaceId, environmentId }: ServerPreviewAppProps): React.ReactElement;
|
|
19
|
+
export declare function ServerPreviewApp({ preview, spaceId, environmentId, allowDeletions, }: ServerPreviewAppProps): React.ReactElement;
|
|
18
20
|
interface ServerApplyProgressProps {
|
|
19
21
|
spaceId: string;
|
|
20
22
|
environmentId: string;
|
|
@@ -3,21 +3,22 @@ import { Box, Text, useInput } from 'ink';
|
|
|
3
3
|
import { ServerPreviewView } from './ServerPreviewView.js';
|
|
4
4
|
import { buildPostPushUrl } from '../../lib/contentful-urls.js';
|
|
5
5
|
import { formatEdsiError } from '../../lib/error-parser.js';
|
|
6
|
-
export function ServerPreviewConfirm({ preview, spaceId, environmentId, breakingWithImpact, onConfirm, onCancel, }) {
|
|
6
|
+
export function ServerPreviewConfirm({ preview, spaceId, environmentId, breakingWithImpact, allowDeletions, onConfirm, onCancel, }) {
|
|
7
7
|
useInput((input, key) => {
|
|
8
8
|
if (key.return)
|
|
9
9
|
onConfirm(breakingWithImpact);
|
|
10
10
|
if (key.escape || input === 'q')
|
|
11
11
|
onCancel();
|
|
12
12
|
});
|
|
13
|
-
|
|
13
|
+
const removedCount = preview.components.removed.length + preview.tokens.removed.length;
|
|
14
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(ServerPreviewView, { preview: preview, spaceId: spaceId, environmentId: environmentId, allowDeletions: allowDeletions }), _jsxs(Box, { paddingX: 2, flexDirection: "column", children: [breakingWithImpact && (_jsxs(Text, { color: "red", bold: true, children: [' ', "\u26A0 Breaking changes will affect downstream entities. Press Enter to acknowledge and apply."] })), allowDeletions && removedCount > 0 && (_jsxs(Text, { color: "red", bold: true, children: [' ', "\u26A0 ", removedCount, " missing ", removedCount === 1 ? 'entity' : 'entities', " will be permanently deleted. Press Enter to confirm."] })), _jsxs(Text, { children: [' ', "Press ", _jsx(Text, { bold: true, children: "Enter" }), " to apply, ", _jsx(Text, { bold: true, children: "Esc" }), " to cancel"] })] })] }));
|
|
14
15
|
}
|
|
15
|
-
export function ServerPreviewApp({ preview, spaceId, environmentId }) {
|
|
16
|
+
export function ServerPreviewApp({ preview, spaceId, environmentId, allowDeletions, }) {
|
|
16
17
|
useInput((input, key) => {
|
|
17
18
|
if (key.escape || input === 'q')
|
|
18
19
|
process.exit(0);
|
|
19
20
|
});
|
|
20
|
-
return _jsx(ServerPreviewView, { preview: preview, spaceId: spaceId, environmentId: environmentId });
|
|
21
|
+
return (_jsx(ServerPreviewView, { preview: preview, spaceId: spaceId, environmentId: environmentId, allowDeletions: allowDeletions }));
|
|
21
22
|
}
|
|
22
23
|
export function ServerApplyProgress({ spaceId, environmentId, status, operationId, error, }) {
|
|
23
24
|
useInput((_input, key) => {
|
|
@@ -4,6 +4,7 @@ interface ServerPreviewViewProps {
|
|
|
4
4
|
preview: ServerPreviewResponse;
|
|
5
5
|
spaceId: string;
|
|
6
6
|
environmentId: string;
|
|
7
|
+
allowDeletions: boolean;
|
|
7
8
|
}
|
|
8
|
-
export declare function ServerPreviewView({ preview, spaceId, environmentId }: ServerPreviewViewProps): React.ReactElement;
|
|
9
|
+
export declare function ServerPreviewView({ preview, spaceId, environmentId, allowDeletions, }: ServerPreviewViewProps): React.ReactElement;
|
|
9
10
|
export {};
|
|
@@ -13,11 +13,11 @@ function DraftWarning({ hasDraft }) {
|
|
|
13
13
|
return null;
|
|
14
14
|
return _jsx(Text, { color: "yellow", children: " \u26A1 has pending draft changes" });
|
|
15
15
|
}
|
|
16
|
-
export function ServerPreviewView({ preview, spaceId, environmentId }) {
|
|
16
|
+
export function ServerPreviewView({ preview, spaceId, environmentId, allowDeletions, }) {
|
|
17
17
|
const { components, tokens } = preview;
|
|
18
18
|
const totalComponents = components.new.length + components.changed.length + components.unchanged.length + components.removed.length;
|
|
19
19
|
const totalTokens = tokens.new.length + tokens.changed.length + tokens.unchanged.length + tokens.removed.length;
|
|
20
|
-
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Text, { bold: true, children: ["Preview \u2014 ", environmentId, " @ ", spaceId] }), _jsx(Text, { children: " " }), totalComponents > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: [" Component Types (", totalComponents, " total)"] }), _jsxs(Text, { color: "green", children: [" \u2746 ", components.new.length, " to create"] }), _jsxs(Text, { color: "yellow", children: [" ~ ", components.changed.length, " to update"] }), _jsxs(Text, { color:
|
|
20
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [_jsxs(Text, { bold: true, children: ["Preview \u2014 ", environmentId, " @ ", spaceId] }), _jsx(Text, { children: " " }), totalComponents > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: [" Component Types (", totalComponents, " total)"] }), _jsxs(Text, { color: "green", children: [" \u2746 ", components.new.length, " to create"] }), _jsxs(Text, { color: "yellow", children: [" ~ ", components.changed.length, " to update"] }), _jsxs(Text, { color: allowDeletions ? 'red' : 'yellow', children: [' ', allowDeletions ? '✗' : '⊘', " ", components.removed.length, " to ", allowDeletions ? 'delete' : 'skip'] }), _jsxs(Text, { dimColor: true, children: [" \u00B7 ", components.unchanged.length, " unchanged"] }), components.changed.map((item, i) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: "yellow", children: [" ~ ", item.current.name] }), _jsx(DraftWarning, { hasDraft: item.hasPendingDraftChanges })] }), _jsx(BreakingBadge, { item: item })] }, i))), _jsx(Text, { children: " " })] })), totalTokens > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: [" Design Tokens (", totalTokens, " total)"] }), _jsxs(Text, { color: "green", children: [" \u2746 ", tokens.new.length, " to create"] }), _jsxs(Text, { color: "yellow", children: [" ~ ", tokens.changed.length, " to update"] }), _jsxs(Text, { color: allowDeletions ? 'red' : 'yellow', children: [' ', allowDeletions ? '✗' : '⊘', " ", tokens.removed.length, " to ", allowDeletions ? 'delete' : 'skip'] }), _jsxs(Text, { dimColor: true, children: [" \u00B7 ", tokens.unchanged.length, " unchanged"] }), tokens.changed
|
|
21
21
|
.filter((t) => t.hasPendingDraftChanges)
|
|
22
22
|
.map((item, i) => (_jsxs(Box, { flexDirection: "row", children: [_jsxs(Text, { color: "yellow", children: [" ~ ", item.current.name] }), _jsx(DraftWarning, { hasDraft: true })] }, i))), _jsx(Text, { children: " " })] })), _jsx(Text, { dimColor: true, children: " Press Q to exit." })] }));
|
|
23
23
|
}
|
|
@@ -4,7 +4,7 @@ import { resolveAutoFilter } from './auto-filter-resolve.js';
|
|
|
4
4
|
import { resolveAgent, resolveModel } from './agent-model-resolve.js';
|
|
5
5
|
import { addAgentModelOptions } from '../lib/agent-model-options.js';
|
|
6
6
|
import { resolveCompositionMode } from '../lib/composition-mode.js';
|
|
7
|
-
import { addCompositionOptions } from '../lib/command-options.js';
|
|
7
|
+
import { addAllowDeletionsOption, addCompositionOptions } from '../lib/command-options.js';
|
|
8
8
|
import { isConflictMode } from '../runs/save-path-resolver.js';
|
|
9
9
|
import { readExperiencesCredentials } from '../credentials-store.js';
|
|
10
10
|
import { DEFAULT_CONFIGURED_HOST, toConfiguredHost } from '../host-utils.js';
|
|
@@ -46,6 +46,7 @@ export function registerImportCommand(program) {
|
|
|
46
46
|
.option('--print-prompt', 'Print the generate components prompt without invoking the agent. Replaces the legacy --dry-run prompt-print behaviour on this command.')
|
|
47
47
|
.option('--auto-accept-scope', 'Accept all extracted components without prompting (for scripted/non-TTY callers)');
|
|
48
48
|
addCompositionOptions(cmd);
|
|
49
|
+
addAllowDeletionsOption(cmd);
|
|
49
50
|
cmd
|
|
50
51
|
.option('--composition-map <path>', 'Consume a hand-authored parent→children interchange map (implies --composite)')
|
|
51
52
|
.option('--composition-agent', 'Opt into agentic mapping resolution when deterministic sources find no groups (implies --composite)')
|
|
@@ -136,6 +137,7 @@ export function registerImportCommand(program) {
|
|
|
136
137
|
...(opts.host ? { host: opts.host } : {}),
|
|
137
138
|
interactive: interactiveTerminalSupported,
|
|
138
139
|
...(opts.force ? { force: true } : {}),
|
|
140
|
+
...(opts.allowDeletions ? { allowDeletions: true } : {}),
|
|
139
141
|
});
|
|
140
142
|
return;
|
|
141
143
|
}
|
|
@@ -166,6 +168,7 @@ export function registerImportCommand(program) {
|
|
|
166
168
|
...(opts.saveAsNew ? { saveAsNew: true } : {}),
|
|
167
169
|
...(opts.outDir ? { outDir: opts.outDir } : {}),
|
|
168
170
|
...(opts.force ? { force: true } : {}),
|
|
171
|
+
...(opts.allowDeletions ? { allowDeletions: true } : {}),
|
|
169
172
|
});
|
|
170
173
|
return;
|
|
171
174
|
}
|
|
@@ -297,6 +300,7 @@ export function registerImportCommand(program) {
|
|
|
297
300
|
selectPromptPath: opts.selectPromptPath ?? creds.selectPromptPath,
|
|
298
301
|
generatePromptPath: opts.generatePromptPath ?? creds.generatePromptPath,
|
|
299
302
|
...(opts.rawTokens ? { initialRawTokensPath: resolve(opts.rawTokens) } : {}),
|
|
303
|
+
allowDeletions: opts.allowDeletions === true,
|
|
300
304
|
...pickerProps,
|
|
301
305
|
}));
|
|
302
306
|
unmountInk = unmount;
|
|
@@ -357,6 +361,7 @@ export function registerImportCommand(program) {
|
|
|
357
361
|
dryRun: dryRunForward,
|
|
358
362
|
selectPromptPath: opts.selectPromptPath,
|
|
359
363
|
autoRejectCycles: opts.autoRejectCycles ?? false,
|
|
364
|
+
allowDeletions: opts.allowDeletions ?? false,
|
|
360
365
|
compositionMode: headlessCompositionMode,
|
|
361
366
|
...(opts.compositionMap ? { compositionMap: opts.compositionMap } : {}),
|
|
362
367
|
...(opts.compositionAgent ? { compositionAgent: true } : {}),
|
|
@@ -26,6 +26,7 @@ export interface PipelineOptions {
|
|
|
26
26
|
selectPromptPath?: string;
|
|
27
27
|
/** When true, auto-reject cycle participants and retry push instead of surfacing an error. */
|
|
28
28
|
autoRejectCycles?: boolean;
|
|
29
|
+
allowDeletions?: boolean;
|
|
29
30
|
compositionMode?: CompositionMode;
|
|
30
31
|
compositionMap?: string;
|
|
31
32
|
compositionAgent?: boolean;
|
|
@@ -418,6 +418,8 @@ export async function runPipeline(opts, progressWriter, cliPathOverride) {
|
|
|
418
418
|
pushArgs.push('--host', opts.host);
|
|
419
419
|
if (opts.verbose)
|
|
420
420
|
pushArgs.push('--verbose');
|
|
421
|
+
if (opts.allowDeletions)
|
|
422
|
+
pushArgs.push('--allow-deletions');
|
|
421
423
|
pushArgs.push('--yes');
|
|
422
424
|
const pushStepId = createStep(db, sessionId, 'apply push', {
|
|
423
425
|
components: componentsPath,
|
|
@@ -66,5 +66,6 @@ export type WizardAppProps = {
|
|
|
66
66
|
initialRawTokensPath?: string;
|
|
67
67
|
initialRuns?: RunRecord[];
|
|
68
68
|
onRunPicked?: (selection: RunPickerSelection) => void;
|
|
69
|
+
allowDeletions?: boolean;
|
|
69
70
|
};
|
|
70
|
-
export declare function WizardApp({ initialSpaceId, initialEnvironmentId, initialCmaToken, initialHost, initialAgent, initialModel, initialProjectPath, host, autoAcceptScope, autoRejectCycles, compositionMode, compositionMap, compositionAgent, compositionAgentMode, compositionRefresh, generateMap, promptOverrides, noCache, autoFilter, livePreview, noPush, noSave, outDirOverride, onConflictMode, selectPromptPath, generatePromptPath, seedExtractSessionId, seedGenerateSessionId, seedTokenSessionId, seedTokensPath, initialStep, initialRawTokensPath, initialRuns, onRunPicked, }?: WizardAppProps): React.ReactElement;
|
|
71
|
+
export declare function WizardApp({ initialSpaceId, initialEnvironmentId, initialCmaToken, initialHost, initialAgent, initialModel, initialProjectPath, host, autoAcceptScope, autoRejectCycles, compositionMode, compositionMap, compositionAgent, compositionAgentMode, compositionRefresh, generateMap, promptOverrides, noCache, autoFilter, livePreview, noPush, noSave, outDirOverride, onConflictMode, selectPromptPath, generatePromptPath, seedExtractSessionId, seedGenerateSessionId, seedTokenSessionId, seedTokensPath, initialStep, initialRawTokensPath, initialRuns, onRunPicked, allowDeletions, }?: WizardAppProps): React.ReactElement;
|
|
@@ -138,7 +138,7 @@ function logStep(entry) {
|
|
|
138
138
|
appendFileSync(WIZARD_LOG, line);
|
|
139
139
|
getDebugLogger().event('wizard', 'step', entry);
|
|
140
140
|
}
|
|
141
|
-
export function WizardApp({ initialSpaceId = '', initialEnvironmentId = 'master', initialCmaToken = '', initialHost, initialAgent, initialModel, initialProjectPath, host, autoAcceptScope = false, autoRejectCycles = false, compositionMode = 'atomic', compositionMap, compositionAgent = false, compositionAgentMode, compositionRefresh = false, generateMap, promptOverrides, noCache = false, autoFilter = true, livePreview = true, noPush = false, noSave = false, outDirOverride, onConflictMode, selectPromptPath, generatePromptPath, seedExtractSessionId, seedGenerateSessionId, seedTokenSessionId, seedTokensPath, initialStep, initialRawTokensPath, initialRuns, onRunPicked, } = {}) {
|
|
141
|
+
export function WizardApp({ initialSpaceId = '', initialEnvironmentId = 'master', initialCmaToken = '', initialHost, initialAgent, initialModel, initialProjectPath, host, autoAcceptScope = false, autoRejectCycles = false, compositionMode = 'atomic', compositionMap, compositionAgent = false, compositionAgentMode, compositionRefresh = false, generateMap, promptOverrides, noCache = false, autoFilter = true, livePreview = true, noPush = false, noSave = false, outDirOverride, onConflictMode, selectPromptPath, generatePromptPath, seedExtractSessionId, seedGenerateSessionId, seedTokenSessionId, seedTokensPath, initialStep, initialRawTokensPath, initialRuns, onRunPicked, allowDeletions = false, } = {}) {
|
|
142
142
|
const defaultConfiguredHost = toConfiguredHost(host || process.env['EDS_HOST']) ?? DEFAULT_CONFIGURED_HOST;
|
|
143
143
|
const resolveWizardHost = (hostValue) => hostValue || defaultConfiguredHost;
|
|
144
144
|
const { stdout } = useStdout();
|
|
@@ -942,7 +942,7 @@ export function WizardApp({ initialSpaceId = '', initialEnvironmentId = 'master'
|
|
|
942
942
|
});
|
|
943
943
|
}
|
|
944
944
|
};
|
|
945
|
-
const runPush = async (manifest, spaceId, environmentId, cmaToken, host, acknowledgeBreakingChanges, preview) => {
|
|
945
|
+
const runPush = async (manifest, spaceId, environmentId, cmaToken, host, acknowledgeBreakingChanges, allowDeletions, preview) => {
|
|
946
946
|
if (shouldRefusePush(state)) {
|
|
947
947
|
update(buildSkippedPushTransition());
|
|
948
948
|
return;
|
|
@@ -982,7 +982,7 @@ export function WizardApp({ initialSpaceId = '', initialEnvironmentId = 'master'
|
|
|
982
982
|
environmentId,
|
|
983
983
|
host: resolvedHost,
|
|
984
984
|
});
|
|
985
|
-
let operation = await client.applyImport(manifest, acknowledgeBreakingChanges);
|
|
985
|
+
let operation = await client.applyImport(manifest, { acknowledgeBreakingChanges, allowDeletions });
|
|
986
986
|
try {
|
|
987
987
|
logStep({
|
|
988
988
|
applyResponse: {
|
|
@@ -1601,8 +1601,8 @@ export function WizardApp({ initialSpaceId = '', initialEnvironmentId = 'master'
|
|
|
1601
1601
|
// present-but-empty (only $schema), so editing would dead-end on the
|
|
1602
1602
|
// "No generated definitions found" screen.
|
|
1603
1603
|
const editableComponentCount = Object.keys(state.manifest?.componentsManifest ?? {}).filter((k) => k !== '$schema').length;
|
|
1604
|
-
return (_jsx(WizardPreviewStep, { preview: state.serverPreview, spaceId: state.spaceId, environmentId: state.environmentId, stepNumber: totalSteps, totalSteps: totalSteps, onConfirm: (acknowledge) => {
|
|
1605
|
-
void runPush(state.manifest, state.spaceId, state.environmentId, state.cmaToken, state.host, acknowledge, state.serverPreview);
|
|
1604
|
+
return (_jsx(WizardPreviewStep, { preview: state.serverPreview, spaceId: state.spaceId, environmentId: state.environmentId, stepNumber: totalSteps, totalSteps: totalSteps, initialAllowDeletions: allowDeletions, onConfirm: (acknowledge, deleteMissing) => {
|
|
1605
|
+
void runPush(state.manifest, state.spaceId, state.environmentId, state.cmaToken, state.host, acknowledge, deleteMissing, state.serverPreview);
|
|
1606
1606
|
}, ...(editableComponentCount > 0 ? { onEdit: () => void runEditFromPreview() } : {}), onSaveFiles: () => {
|
|
1607
1607
|
void startSaveFlow();
|
|
1608
1608
|
}, onQuit: () => process.exit(0) }));
|
|
@@ -12,10 +12,11 @@ type WizardPreviewStepProps = {
|
|
|
12
12
|
environmentId: string;
|
|
13
13
|
stepNumber: number;
|
|
14
14
|
totalSteps: number;
|
|
15
|
-
|
|
15
|
+
initialAllowDeletions?: boolean;
|
|
16
|
+
onConfirm: (acknowledge: boolean, allowDeletions: boolean) => void;
|
|
16
17
|
onEdit?: () => void;
|
|
17
18
|
onSaveFiles?: () => void;
|
|
18
19
|
onQuit: () => void;
|
|
19
20
|
};
|
|
20
|
-
export declare function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber, totalSteps, onConfirm, onEdit, onSaveFiles, onQuit, }: WizardPreviewStepProps): React.ReactElement;
|
|
21
|
+
export declare function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber, totalSteps, initialAllowDeletions, onConfirm, onEdit, onSaveFiles, onQuit, }: WizardPreviewStepProps): React.ReactElement;
|
|
21
22
|
export {};
|
|
@@ -89,10 +89,11 @@ export function buildPreviewDiffLines(preview) {
|
|
|
89
89
|
}
|
|
90
90
|
return lines;
|
|
91
91
|
}
|
|
92
|
-
export function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber, totalSteps, onConfirm, onEdit, onSaveFiles, onQuit, }) {
|
|
92
|
+
export function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber, totalSteps, initialAllowDeletions = false, onConfirm, onEdit, onSaveFiles, onQuit, }) {
|
|
93
93
|
const breakingWithImpact = hasBreakingChangesWithImpact(preview);
|
|
94
94
|
const [diffExpanded, setDiffExpanded] = useState(false);
|
|
95
95
|
const [scrollOffset, setScrollOffset] = useState(0);
|
|
96
|
+
const [allowDeletions, setAllowDeletions] = useState(initialAllowDeletions);
|
|
96
97
|
const { stdout } = useStdout();
|
|
97
98
|
const terminalRows = stdout?.rows ?? 40;
|
|
98
99
|
const viewportHeight = Math.max(terminalRows - 14, 10);
|
|
@@ -105,9 +106,14 @@ export function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber,
|
|
|
105
106
|
}));
|
|
106
107
|
}, [diffExpanded, preview]);
|
|
107
108
|
const maxScroll = Math.max(0, allDiffLines.length - viewportHeight);
|
|
109
|
+
const removedCount = preview.components.removed.length + preview.tokens.removed.length;
|
|
108
110
|
useImmediateInput((input, key) => {
|
|
109
111
|
if (key.return) {
|
|
110
|
-
onConfirm(breakingWithImpact);
|
|
112
|
+
onConfirm(breakingWithImpact, allowDeletions);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if ((input === 'x' || input === 'X') && removedCount > 0) {
|
|
116
|
+
setAllowDeletions((prev) => !prev);
|
|
111
117
|
return;
|
|
112
118
|
}
|
|
113
119
|
if (input === 'd' || input === 'D') {
|
|
@@ -156,5 +162,5 @@ export function WizardPreviewStep({ preview, spaceId, environmentId, stepNumber,
|
|
|
156
162
|
})] })), components.changed.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: PALETTE.warning, children: " \uFF5E" }), _jsxs(Text, { children: [components.changed.length, " will be updated"] })] }), components.changed.map((item, i) => {
|
|
157
163
|
const isBreaking = item.changeClassification?.classification === 'breaking';
|
|
158
164
|
return (_jsxs(Text, { color: isBreaking ? PALETTE.error : PALETTE.warning, children: [' ', isBreaking ? '⚠' : '~', " ", item.current.name] }, `chg-${i}`));
|
|
159
|
-
})] })), components.removed.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: PALETTE.error, children:
|
|
165
|
+
})] })), components.removed.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: allowDeletions ? PALETTE.error : PALETTE.warning, children: allowDeletions ? ' ✗' : ' ⊘' }), _jsxs(Text, { children: [components.removed.length, " will be ", allowDeletions ? 'deleted' : 'skipped'] })] }), components.removed.map((item, i) => (_jsxs(Text, { color: allowDeletions ? PALETTE.error : PALETTE.warning, dimColor: !allowDeletions, children: [' ', allowDeletions ? '✗' : '⊘', " ", item.name] }, `rm-${i}`)))] })), components.unchanged.length > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: " \u00B7" }), _jsxs(Text, { dimColor: true, children: [components.unchanged.length, " unchanged"] })] }))] })), hasTokens && (_jsxs(Box, { flexDirection: "column", gap: 0, children: [_jsx(Box, { gap: 1, marginTop: 1, children: _jsx(Text, { bold: true, dimColor: true, children: "Design Tokens" }) }), tokens.new.length > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: PALETTE.success, children: " \uFF0B" }), _jsxs(Text, { children: [tokens.new.length, " will be created"] })] })), tokens.changed.length > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: PALETTE.warning, children: " \uFF5E" }), _jsxs(Text, { children: [tokens.changed.length, " will be updated"] })] })), tokens.removed.length > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: allowDeletions ? PALETTE.error : PALETTE.warning, children: allowDeletions ? ' ✗' : ' ⊘' }), _jsxs(Text, { children: [tokens.removed.length, " will be ", allowDeletions ? 'deleted' : 'skipped'] })] })), tokens.unchanged.length > 0 && (_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: " \u00B7" }), _jsxs(Text, { dimColor: true, children: [tokens.unchanged.length, " unchanged"] })] }))] })), diffExpanded && allDiffLines.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { dimColor: true, children: '─'.repeat(40) }), _jsxs(Text, { dimColor: true, children: [' ', "Diff (", allDiffLines.length, " lines) \u2014 line ", scrollOffset + 1, "\u2013", Math.min(scrollOffset + viewportHeight, allDiffLines.length), " of ", allDiffLines.length] }), _jsx(Box, { flexDirection: "column", children: allDiffLines.slice(scrollOffset, scrollOffset + viewportHeight).map((line) => (_jsx(Box, { children: line.element }, line.key))) }), maxScroll > 0 && _jsx(Text, { dimColor: true, children: " \u2195 j/k to scroll, f/b to page" })] }))] })) : (_jsx(Text, { dimColor: true, children: "Nothing to push \u2014 everything is already up to date." })), _jsxs(Box, { gap: 1, marginTop: 1, children: [_jsx(Text, { dimColor: true, children: "Space:" }), _jsx(Text, { children: spaceId }), _jsx(Text, { dimColor: true, children: "/" }), _jsx(Text, { dimColor: true, children: "Environment:" }), _jsx(Text, { children: environmentId })] }), breakingWithImpact && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: PALETTE.error, bold: true, children: "\u26A0 Breaking changes will affect downstream entities. Press Enter to acknowledge and apply." }) })), allowDeletions && removedCount > 0 && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: PALETTE.error, bold: true, children: ["\u26A0 ", removedCount, " missing ", removedCount === 1 ? 'entity' : 'entities', " will be permanently deleted. Press Enter to confirm."] }) })), _jsxs(Box, { gap: 3, marginTop: 1, children: [_jsx(Text, { dimColor: true, children: "[Enter] Push to Contentful" }), _jsxs(Text, { dimColor: true, children: ["[d] ", diffExpanded ? 'Hide' : 'Show', " diff"] }), diffExpanded && _jsx(Text, { dimColor: true, children: "[j/k] Scroll [f/b] Page" }), onEdit && _jsx(Text, { dimColor: true, children: "[e] Edit definitions" }), onSaveFiles && _jsx(Text, { dimColor: true, children: "[s] Save files instead" }), removedCount > 0 && (_jsxs(Text, { dimColor: true, children: ["[x] ", allowDeletions ? '[✓]' : '[ ]', " Also delete ", removedCount, " ", removedCount === 1 ? 'entity' : 'entities'] })), _jsx(Text, { dimColor: true, children: "[q] Cancel" })] })] }));
|
|
160
166
|
}
|
|
@@ -3,3 +3,4 @@ export declare function addArtifactInputOptions(cmd: Command): Command;
|
|
|
3
3
|
export declare function addContentfulTargetOptions(cmd: Command): Command;
|
|
4
4
|
export declare function addCompositionOptions(cmd: Command): Command;
|
|
5
5
|
export declare function addSelectionOptions(cmd: Command): Command;
|
|
6
|
+
export declare function addAllowDeletionsOption(cmd: Command): Command;
|
|
@@ -25,3 +25,6 @@ export function addSelectionOptions(cmd) {
|
|
|
25
25
|
.option('--select <pattern>', 'Select entities by ID pattern (repeatable)', collectOptionValue, [])
|
|
26
26
|
.option('--deselect <pattern>', 'Deselect entities by ID pattern (repeatable)', collectOptionValue, []);
|
|
27
27
|
}
|
|
28
|
+
export function addAllowDeletionsOption(cmd) {
|
|
29
|
+
return cmd.option('--allow-deletions', 'Allow the push to delete remote ComponentTypes/DesignTokens missing from the manifest (default: skip them)');
|
|
30
|
+
}
|
|
@@ -26,5 +26,7 @@ export type ModifyLauncherInput = {
|
|
|
26
26
|
initialHost?: string;
|
|
27
27
|
/** Pre-fill CMA token (from credentials.json / env). */
|
|
28
28
|
initialCmaToken?: string;
|
|
29
|
+
/** From `--allow-deletions` flag. Forwarded to wizard's push step. */
|
|
30
|
+
allowDeletions?: boolean;
|
|
29
31
|
};
|
|
30
32
|
export declare function launchModifyWizard(input: ModifyLauncherInput): Promise<void>;
|
|
@@ -35,6 +35,8 @@ export async function launchModifyWizard(input) {
|
|
|
35
35
|
props.initialHost = input.initialHost;
|
|
36
36
|
if (input.initialCmaToken)
|
|
37
37
|
props.initialCmaToken = input.initialCmaToken;
|
|
38
|
+
if (input.allowDeletions !== undefined)
|
|
39
|
+
props.allowDeletions = input.allowDeletions;
|
|
38
40
|
const { waitUntilExit } = render(createElement(WizardApp, props));
|
|
39
41
|
await waitUntilExit();
|
|
40
42
|
}
|
|
@@ -16,6 +16,8 @@ export type ReplayRunOptions = {
|
|
|
16
16
|
interactive?: boolean;
|
|
17
17
|
/** When true, bypass the source/saved-file staleness check. */
|
|
18
18
|
force?: boolean;
|
|
19
|
+
/** From `--allow-deletions` flag. Forwarded verbatim to the pushed session's apply request. */
|
|
20
|
+
allowDeletions?: boolean;
|
|
19
21
|
/**
|
|
20
22
|
* Test seam: replace the interactive prompt with a deterministic resolver.
|
|
21
23
|
* The CLI surface never sets this; only used by tests.
|
|
@@ -57,6 +59,8 @@ export type ModifyRunOptions = {
|
|
|
57
59
|
outDir?: string;
|
|
58
60
|
/** When true, bypass the source/saved-file staleness check. */
|
|
59
61
|
force?: boolean;
|
|
62
|
+
/** From `--allow-deletions` flag. Forwarded through the modify wizard's push step. */
|
|
63
|
+
allowDeletions?: boolean;
|
|
60
64
|
};
|
|
61
65
|
/**
|
|
62
66
|
* Re-open the wizard with a prior run's extract/generate session pre-populated
|
|
@@ -83,6 +83,7 @@ export async function replayRun(opts) {
|
|
|
83
83
|
environmentId,
|
|
84
84
|
cmaToken,
|
|
85
85
|
...(host ? { host } : {}),
|
|
86
|
+
...(opts.allowDeletions ? { allowDeletions: true } : {}),
|
|
86
87
|
});
|
|
87
88
|
if (!result.ok) {
|
|
88
89
|
throw new Error(result.error);
|
|
@@ -98,6 +99,7 @@ export async function replayRun(opts) {
|
|
|
98
99
|
environmentId,
|
|
99
100
|
cmaToken,
|
|
100
101
|
...(host ? { host } : {}),
|
|
102
|
+
...(opts.allowDeletions ? { allowDeletions: true } : {}),
|
|
101
103
|
});
|
|
102
104
|
if (!tokenResult.ok) {
|
|
103
105
|
throw new Error(tokenResult.error);
|
|
@@ -157,5 +159,6 @@ export async function modifyRun(opts) {
|
|
|
157
159
|
...(mergedEnvironmentId ? { initialEnvironmentId: mergedEnvironmentId } : {}),
|
|
158
160
|
...(mergedHost ? { initialHost: mergedHost } : {}),
|
|
159
161
|
...(mergedCmaToken ? { initialCmaToken: mergedCmaToken } : {}),
|
|
162
|
+
...(opts.allowDeletions !== undefined ? { allowDeletions: opts.allowDeletions } : {}),
|
|
160
163
|
});
|
|
161
164
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentful/experience-design-system-cli",
|
|
3
|
-
"version": "2.18.1-dev-build-
|
|
3
|
+
"version": "2.18.1-dev-build-2117d43.0",
|
|
4
4
|
"description": "Contentful Experiences design system import CLI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
"react": "^18.3.1",
|
|
35
35
|
"react-devtools-core": "^4.19.1",
|
|
36
36
|
"react-dom": "^18.3.1",
|
|
37
|
-
"@contentful/experience-design-system-client": "2.18.1-dev-build-
|
|
38
|
-
"@contentful/experience-design-system-
|
|
39
|
-
"@contentful/experience-design-system-
|
|
37
|
+
"@contentful/experience-design-system-client": "2.18.1-dev-build-2117d43.0",
|
|
38
|
+
"@contentful/experience-design-system-types": "2.18.1-dev-build-2117d43.0",
|
|
39
|
+
"@contentful/experience-design-system-extraction": "2.18.1-dev-build-2117d43.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@tsconfig/node24": "^24.0.3",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"eslint-plugin-prettier": "^5.5.4",
|
|
48
48
|
"ink-testing-library": "^4.0.0",
|
|
49
49
|
"typescript-eslint": "^8.52.0",
|
|
50
|
-
"vitest": "^4.
|
|
50
|
+
"vitest": "^4.0.16"
|
|
51
51
|
},
|
|
52
52
|
"repository": {
|
|
53
53
|
"type": "git",
|