@contentful/experience-design-system-cli 2.35.1-dev-build-fa264c11.0 → 2.35.1-dev-build-657a08f3.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.
Files changed (53) hide show
  1. package/dist/app.d.ts +1 -1
  2. package/dist/app.js +182 -20
  3. package/dist/index.js +198 -30
  4. package/dist/package.json +1 -1
  5. package/dist/src/tui/import/steps/01-welcome/screen.d.ts +2 -1
  6. package/dist/src/tui/import/steps/02-token-input/screen.d.ts +2 -1
  7. package/dist/src/tui/settings/import-defaults/defaults-store.d.ts +6 -0
  8. package/dist/src/tui/settings/import-defaults/screen.d.ts +4 -0
  9. package/legacy/dist/src/analyze/extract-command.d.ts +7 -0
  10. package/legacy/dist/src/apply/command.d.ts +41 -3
  11. package/legacy/dist/src/generate/command.d.ts +0 -18
  12. package/legacy/dist/src/index.js +6950 -7239
  13. package/legacy/package.json +1 -1
  14. package/package.json +2 -2
  15. package/dist/src/legacy/forwarded-import-args.d.ts +0 -1
  16. package/legacy/dist/src/analyze/controller/create-analyze-extract-endpoint.d.ts +0 -13
  17. package/legacy/dist/src/analyze/helpers/resolve-composition-agent.d.ts +0 -9
  18. package/legacy/dist/src/analyze/helpers/resolve-no-cache.d.ts +0 -4
  19. package/legacy/dist/src/analyze/helpers/resolve-unreachable-mode.d.ts +0 -1
  20. package/legacy/dist/src/analyze/helpers/retry-db-write.d.ts +0 -1
  21. package/legacy/dist/src/analyze/orchestrator/execute-analyze-extract.d.ts +0 -21
  22. package/legacy/dist/src/analyze/services/collect-source-files.d.ts +0 -1
  23. package/legacy/dist/src/analyze/services/extract-with-cache.d.ts +0 -17
  24. package/legacy/dist/src/analyze/services/persist-extract-results.d.ts +0 -11
  25. package/legacy/dist/src/analyze/services/resolve-composition-mapping.d.ts +0 -22
  26. package/legacy/dist/src/analyze/services/resolve-source-directory.d.ts +0 -1
  27. package/legacy/dist/src/apply/controller/run-apply.d.ts +0 -1
  28. package/legacy/dist/src/apply/helpers/build-apply-output.d.ts +0 -55
  29. package/legacy/dist/src/apply/helpers/has-breaking-changes.d.ts +0 -2
  30. package/legacy/dist/src/apply/helpers/poll-apply-operation.d.ts +0 -9
  31. package/legacy/dist/src/apply/helpers/read-token-files.d.ts +0 -7
  32. package/legacy/dist/src/apply/helpers/slot-validation.d.ts +0 -20
  33. package/legacy/dist/src/apply/services/apply-interactive.d.ts +0 -13
  34. package/legacy/dist/src/apply/services/apply-non-interactive.d.ts +0 -10
  35. package/legacy/dist/src/apply/services/resolve-apply-inputs.d.ts +0 -14
  36. package/legacy/dist/src/generate/controller/run-generate-components.d.ts +0 -2
  37. package/legacy/dist/src/generate/controller/run-generate-tokens.d.ts +0 -2
  38. package/legacy/dist/src/generate/helpers/assert-file-exists.d.ts +0 -1
  39. package/legacy/dist/src/generate/helpers/normalize-component-for-cache.d.ts +0 -6
  40. package/legacy/dist/src/generate/helpers/parse-precomputed-cached-names.d.ts +0 -1
  41. package/legacy/dist/src/generate/helpers/print-fallback-instructions.d.ts +0 -6
  42. package/legacy/dist/src/generate/helpers/read-file-inline.d.ts +0 -1
  43. package/legacy/dist/src/generate/services/invoke-all-component-agents.d.ts +0 -6
  44. package/legacy/dist/src/generate/services/invoke-component-agent.d.ts +0 -36
  45. package/legacy/dist/src/generate/services/load-accepted-names.d.ts +0 -1
  46. package/legacy/dist/src/generate/services/resolve-component-cache.d.ts +0 -13
  47. package/legacy/dist/src/generate/services/resolve-generate-agent.d.ts +0 -9
  48. package/legacy/dist/src/generate/services/show-generate-view.d.ts +0 -2
  49. package/legacy/dist/src/generate/services/verify-agent-binary.d.ts +0 -2
  50. package/legacy/dist/src/lib/pluralize.d.ts +0 -1
  51. package/legacy/dist/src/map-tokens/controller/run-map-tokens.d.ts +0 -12
  52. package/legacy/dist/src/map-tokens/services/render-map-tokens-result.d.ts +0 -2
  53. package/legacy/dist/src/map-tokens/services/resolve-token-name-paths.d.ts +0 -8
package/dist/app.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- export type Screen = 'start' | 'import' | 'help' | 'settings' | 'settings-configuration' | 'settings-opt-in-analytics' | 'settings-debug-mode' | 'upgrade';
2
+ export type Screen = 'start' | 'import' | 'help' | 'settings' | 'settings-configuration' | 'settings-opt-in-analytics' | 'settings-debug-mode' | 'settings-import-defaults' | 'upgrade';
3
3
  interface AppInstance {
4
4
  unmount: () => void;
5
5
  waitUntilExit: () => Promise<unknown>;
package/dist/app.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // packages/experience-design-system-cli/app.tsx
2
- import { useState as useState10 } from "react";
2
+ import { useEffect as useEffect9, useState as useState11 } from "react";
3
3
 
4
4
  // packages/experience-design-system-cli/src/tui/home/home.tsx
5
5
  import { useEffect as useEffect2, useState as useState2 } from "react";
@@ -269,8 +269,8 @@ var OVERVIEW = [
269
269
  { label: "Step 4", description: "Review generated definitions" },
270
270
  { label: "Step 5", description: "Push to Contentful" }
271
271
  ];
272
- function WelcomeScreen({ onContinue, onQuit }) {
273
- const [projectPath, setProjectPath] = useState3("");
272
+ function WelcomeScreen({ onContinue, onQuit, initialPath = "" }) {
273
+ const [projectPath, setProjectPath] = useState3(initialPath);
274
274
  useWelcomeControls(projectPath, onQuit);
275
275
  const submit = (value) => {
276
276
  const path = toProjectPath(value);
@@ -374,8 +374,13 @@ function validateTokenPath(rawPath) {
374
374
 
375
375
  // packages/experience-design-system-cli/src/tui/import/steps/02-token-input/screen.tsx
376
376
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
377
- function TokenInputScreen({ onConfirm, onSkip, onBack }) {
378
- const [tokenPath, setTokenPath] = useState4("");
377
+ function TokenInputScreen({
378
+ onConfirm,
379
+ onSkip,
380
+ onBack,
381
+ initialPath = ""
382
+ }) {
383
+ const [tokenPath, setTokenPath] = useState4(initialPath);
379
384
  const [failure, setFailure] = useState4(null);
380
385
  useTokenInputControls(tokenPath, onSkip, onBack);
381
386
  const change = (value) => {
@@ -713,6 +718,7 @@ function SettingsScreen({
713
718
  const [focusIdx, setFocusIdx] = useState5(0);
714
719
  const items = [
715
720
  { label: "Configuration", screen: "settings-configuration" },
721
+ { label: "Import Defaults", screen: "settings-import-defaults" },
716
722
  { label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
717
723
  { label: "Debug Mode", screen: "settings-debug-mode" }
718
724
  ];
@@ -1110,13 +1116,163 @@ function DebugModeScreen({ onDone }) {
1110
1116
  ] });
1111
1117
  }
1112
1118
 
1119
+ // packages/experience-design-system-cli/src/tui/settings/import-defaults/screen.tsx
1120
+ import { useEffect as useEffect8, useState as useState10 } from "react";
1121
+ import { Box as Box11, Text as Text11, useInput as useInput11 } from "ink";
1122
+
1123
+ // packages/experience-design-system-cli/src/tui/settings/import-defaults/defaults-store.ts
1124
+ async function readImportDefaults() {
1125
+ const { defaultComponentDir, defaultTokenFile } = await readSettings();
1126
+ return {
1127
+ componentDir: typeof defaultComponentDir === "string" ? defaultComponentDir : "",
1128
+ tokenFile: typeof defaultTokenFile === "string" ? defaultTokenFile : ""
1129
+ };
1130
+ }
1131
+ async function writeImportDefaults(defaults) {
1132
+ const current = await readSettings();
1133
+ const { defaultComponentDir: _dir, defaultTokenFile: _file, ...rest } = current;
1134
+ const componentDir = defaults.componentDir.trim();
1135
+ const tokenFile = defaults.tokenFile.trim();
1136
+ await writeSettings({
1137
+ ...rest,
1138
+ ...componentDir ? { defaultComponentDir: componentDir } : {},
1139
+ ...tokenFile ? { defaultTokenFile: tokenFile } : {}
1140
+ });
1141
+ }
1142
+
1143
+ // packages/experience-design-system-cli/src/tui/settings/import-defaults/screen.tsx
1144
+ import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1145
+ var FIELD_ORDER2 = ["componentDir", "tokenFile"];
1146
+ var FIELD_LABELS2 = {
1147
+ componentDir: "Component directory",
1148
+ tokenFile: "Token file"
1149
+ };
1150
+ function ImportDefaultsScreen({ onDone }) {
1151
+ const [stage, setStage] = useState10("loading");
1152
+ const [defaults, setDefaults] = useState10({ componentDir: "", tokenFile: "" });
1153
+ const [activeField, setActiveField] = useState10("componentDir");
1154
+ const [message, setMessage] = useState10(null);
1155
+ useEffect8(() => {
1156
+ readImportDefaults().then((saved) => {
1157
+ setDefaults(saved);
1158
+ setStage("form");
1159
+ startDebugRun({
1160
+ flow: "settings/import-defaults",
1161
+ step: "01-import-defaults",
1162
+ menuOption: "Import Defaults",
1163
+ inputs: { ...saved }
1164
+ });
1165
+ });
1166
+ }, []);
1167
+ function handleSave() {
1168
+ setStage("saving");
1169
+ setMessage(null);
1170
+ writeImportDefaults(defaults).then(() => {
1171
+ setStage("saved");
1172
+ setMessage("Import defaults saved");
1173
+ }).catch((err) => {
1174
+ setMessage(err instanceof Error ? err.message : "Failed to save");
1175
+ setStage("form");
1176
+ });
1177
+ }
1178
+ useInput11((input, key) => {
1179
+ if (stage === "loading" || stage === "saving") return;
1180
+ if (stage === "saved") {
1181
+ if (key.return || key.escape || input === "q") {
1182
+ void finishDebugRun({ outputs: { ...defaults }, status: "success", exitMethod: "saved" });
1183
+ onDone();
1184
+ }
1185
+ return;
1186
+ }
1187
+ if (key.escape) {
1188
+ void finishDebugRun({ outputs: {}, status: "success", exitMethod: "discarded" });
1189
+ onDone();
1190
+ return;
1191
+ }
1192
+ const idx = FIELD_ORDER2.indexOf(activeField);
1193
+ if (key.tab || key.downArrow) {
1194
+ setActiveField(FIELD_ORDER2[(idx + 1) % FIELD_ORDER2.length]);
1195
+ return;
1196
+ }
1197
+ if (key.upArrow) {
1198
+ setActiveField(FIELD_ORDER2[(idx - 1 + FIELD_ORDER2.length) % FIELD_ORDER2.length]);
1199
+ return;
1200
+ }
1201
+ if (key.return) {
1202
+ if (idx < FIELD_ORDER2.length - 1) setActiveField(FIELD_ORDER2[idx + 1]);
1203
+ else handleSave();
1204
+ return;
1205
+ }
1206
+ if (key.backspace || key.delete) {
1207
+ setDefaults((d) => ({ ...d, [activeField]: d[activeField].slice(0, -1) }));
1208
+ return;
1209
+ }
1210
+ if (input && !key.ctrl && !key.meta) {
1211
+ setDefaults((d) => ({ ...d, [activeField]: d[activeField] + input }));
1212
+ }
1213
+ });
1214
+ if (stage === "loading") {
1215
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1216
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1217
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1218
+ /* @__PURE__ */ jsx11(Text11, { color: PALETTE.accent, children: "Loading..." })
1219
+ ] });
1220
+ }
1221
+ if (stage === "saved") {
1222
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1223
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1224
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1225
+ /* @__PURE__ */ jsxs11(Text11, { color: PALETTE.success, children: [
1226
+ "\u2713 ",
1227
+ message
1228
+ ] }),
1229
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1230
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "[Enter/Esc] Back" })
1231
+ ] });
1232
+ }
1233
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1234
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1235
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "Pre-filled when you start an import. Leave a field empty for no default." }),
1236
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1237
+ /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", children: FIELD_ORDER2.map((field) => {
1238
+ const isActive = activeField === field;
1239
+ const value = defaults[field];
1240
+ return /* @__PURE__ */ jsxs11(Box11, { gap: 1, children: [
1241
+ /* @__PURE__ */ jsx11(Text11, { color: isActive ? PALETTE.accent : void 0, children: isActive ? "\u276F" : " " }),
1242
+ /* @__PURE__ */ jsxs11(Text11, { bold: isActive, children: [
1243
+ FIELD_LABELS2[field],
1244
+ ":"
1245
+ ] }),
1246
+ /* @__PURE__ */ jsx11(Text11, { children: value || /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "(empty)" }) })
1247
+ ] }, field);
1248
+ }) }),
1249
+ message && /* @__PURE__ */ jsxs11(Fragment3, { children: [
1250
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1251
+ /* @__PURE__ */ jsxs11(Text11, { color: PALETTE.error, children: [
1252
+ "\u2717 ",
1253
+ message
1254
+ ] })
1255
+ ] }),
1256
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1257
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "[\u2191/\u2193] Switch field \xB7 [Enter] Save/Next \xB7 [Esc] Back" })
1258
+ ] });
1259
+ }
1260
+
1113
1261
  // packages/experience-design-system-cli/app.tsx
1114
- import { jsx as jsx11 } from "react/jsx-runtime";
1262
+ import { Fragment as Fragment4, jsx as jsx12 } from "react/jsx-runtime";
1115
1263
  function App({ onLaunchImport, importExitCode }) {
1116
1264
  const returnedFromImport = importExitCode !== void 0;
1117
- const [screen, setScreen] = useState10(returnedFromImport ? "import" : "start");
1118
- const [showImportResult, setShowImportResult] = useState10(returnedFromImport);
1119
- const [projectPath, setProjectPath] = useState10();
1265
+ const [screen, setScreen] = useState11(returnedFromImport ? "import" : "start");
1266
+ const [showImportResult, setShowImportResult] = useState11(returnedFromImport);
1267
+ const [projectPath, setProjectPath] = useState11();
1268
+ const [importDefaults, setImportDefaults] = useState11();
1269
+ useEffect9(() => {
1270
+ if (screen !== "import") {
1271
+ setImportDefaults(void 0);
1272
+ return;
1273
+ }
1274
+ void readImportDefaults().then(setImportDefaults);
1275
+ }, [screen]);
1120
1276
  const goToStart = () => setScreen("start");
1121
1277
  const goToSettings = () => setScreen("settings");
1122
1278
  const finishImportResult = () => {
@@ -1130,36 +1286,42 @@ function App({ onLaunchImport, importExitCode }) {
1130
1286
  };
1131
1287
  switch (screen) {
1132
1288
  case "import":
1133
- if (showImportResult) return /* @__PURE__ */ jsx11(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1134
- if (projectPath === void 0) return /* @__PURE__ */ jsx11(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport });
1135
- return /* @__PURE__ */ jsx11(
1289
+ if (showImportResult) return /* @__PURE__ */ jsx12(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1290
+ if (importDefaults === void 0) return /* @__PURE__ */ jsx12(Fragment4, {});
1291
+ if (projectPath === void 0) {
1292
+ return /* @__PURE__ */ jsx12(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1293
+ }
1294
+ return /* @__PURE__ */ jsx12(
1136
1295
  TokenInputScreen,
1137
1296
  {
1297
+ initialPath: importDefaults.tokenFile,
1138
1298
  onConfirm: (tokens) => onLaunchImport?.({ project: projectPath, tokens }),
1139
1299
  onSkip: () => onLaunchImport?.({ project: projectPath }),
1140
1300
  onBack: () => setProjectPath(void 0)
1141
1301
  }
1142
1302
  );
1143
1303
  case "help":
1144
- return /* @__PURE__ */ jsx11(HelpScreen, { onDone: goToStart });
1304
+ return /* @__PURE__ */ jsx12(HelpScreen, { onDone: goToStart });
1145
1305
  case "upgrade":
1146
- return /* @__PURE__ */ jsx11(UpgradeScreen, { onDone: goToStart });
1306
+ return /* @__PURE__ */ jsx12(UpgradeScreen, { onDone: goToStart });
1147
1307
  case "settings":
1148
- return /* @__PURE__ */ jsx11(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1308
+ return /* @__PURE__ */ jsx12(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1149
1309
  case "settings-configuration":
1150
- return /* @__PURE__ */ jsx11(ConfigurationScreen, { onDone: goToSettings });
1310
+ return /* @__PURE__ */ jsx12(ConfigurationScreen, { onDone: goToSettings });
1151
1311
  case "settings-opt-in-analytics":
1152
- return /* @__PURE__ */ jsx11(OptInAnalyticsScreen, { onDone: goToSettings });
1312
+ return /* @__PURE__ */ jsx12(OptInAnalyticsScreen, { onDone: goToSettings });
1153
1313
  case "settings-debug-mode":
1154
- return /* @__PURE__ */ jsx11(DebugModeScreen, { onDone: goToSettings });
1314
+ return /* @__PURE__ */ jsx12(DebugModeScreen, { onDone: goToSettings });
1315
+ case "settings-import-defaults":
1316
+ return /* @__PURE__ */ jsx12(ImportDefaultsScreen, { onDone: goToSettings });
1155
1317
  case "start":
1156
- return /* @__PURE__ */ jsx11(HomeScreen, { onNavigate: setScreen });
1318
+ return /* @__PURE__ */ jsx12(HomeScreen, { onNavigate: setScreen });
1157
1319
  }
1158
1320
  }
1159
1321
  async function renderUntilImportRequestedOrExit(renderApp, importExitCode) {
1160
1322
  let requestedImport;
1161
1323
  const instance = renderApp(
1162
- /* @__PURE__ */ jsx11(
1324
+ /* @__PURE__ */ jsx12(
1163
1325
  App,
1164
1326
  {
1165
1327
  importExitCode,
package/dist/index.js CHANGED
@@ -336,8 +336,8 @@ import { useState as useState3 } from "react";
336
336
  import { Box as Box3, Text as Text3 } from "ink";
337
337
  import TextInput from "ink-text-input";
338
338
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
339
- function WelcomeScreen({ onContinue, onQuit }) {
340
- const [projectPath, setProjectPath] = useState3("");
339
+ function WelcomeScreen({ onContinue, onQuit, initialPath = "" }) {
340
+ const [projectPath, setProjectPath] = useState3(initialPath);
341
341
  useWelcomeControls(projectPath, onQuit);
342
342
  const submit = (value) => {
343
343
  const path = toProjectPath(value);
@@ -471,8 +471,13 @@ import { useState as useState4 } from "react";
471
471
  import { Box as Box4, Text as Text4 } from "ink";
472
472
  import TextInput2 from "ink-text-input";
473
473
  import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
474
- function TokenInputScreen({ onConfirm, onSkip, onBack }) {
475
- const [tokenPath, setTokenPath] = useState4("");
474
+ function TokenInputScreen({
475
+ onConfirm,
476
+ onSkip,
477
+ onBack,
478
+ initialPath = ""
479
+ }) {
480
+ const [tokenPath, setTokenPath] = useState4(initialPath);
476
481
  const [failure, setFailure] = useState4(null);
477
482
  useTokenInputControls(tokenPath, onSkip, onBack);
478
483
  const change = (value) => {
@@ -844,6 +849,7 @@ function SettingsScreen({
844
849
  const [focusIdx, setFocusIdx] = useState5(0);
845
850
  const items = [
846
851
  { label: "Configuration", screen: "settings-configuration" },
852
+ { label: "Import Defaults", screen: "settings-import-defaults" },
847
853
  { label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
848
854
  { label: "Debug Mode", screen: "settings-debug-mode" }
849
855
  ];
@@ -1295,18 +1301,181 @@ var init_screen4 = __esm({
1295
1301
  }
1296
1302
  });
1297
1303
 
1304
+ // packages/experience-design-system-cli/src/tui/settings/import-defaults/defaults-store.ts
1305
+ async function readImportDefaults() {
1306
+ const { defaultComponentDir, defaultTokenFile } = await readSettings();
1307
+ return {
1308
+ componentDir: typeof defaultComponentDir === "string" ? defaultComponentDir : "",
1309
+ tokenFile: typeof defaultTokenFile === "string" ? defaultTokenFile : ""
1310
+ };
1311
+ }
1312
+ async function writeImportDefaults(defaults) {
1313
+ const current = await readSettings();
1314
+ const { defaultComponentDir: _dir, defaultTokenFile: _file, ...rest } = current;
1315
+ const componentDir = defaults.componentDir.trim();
1316
+ const tokenFile = defaults.tokenFile.trim();
1317
+ await writeSettings({
1318
+ ...rest,
1319
+ ...componentDir ? { defaultComponentDir: componentDir } : {},
1320
+ ...tokenFile ? { defaultTokenFile: tokenFile } : {}
1321
+ });
1322
+ }
1323
+ var init_defaults_store = __esm({
1324
+ "packages/experience-design-system-cli/src/tui/settings/import-defaults/defaults-store.ts"() {
1325
+ "use strict";
1326
+ init_config();
1327
+ }
1328
+ });
1329
+
1330
+ // packages/experience-design-system-cli/src/tui/settings/import-defaults/screen.tsx
1331
+ import { useEffect as useEffect8, useState as useState10 } from "react";
1332
+ import { Box as Box11, Text as Text11, useInput as useInput11 } from "ink";
1333
+ import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
1334
+ function ImportDefaultsScreen({ onDone }) {
1335
+ const [stage, setStage] = useState10("loading");
1336
+ const [defaults, setDefaults] = useState10({ componentDir: "", tokenFile: "" });
1337
+ const [activeField, setActiveField] = useState10("componentDir");
1338
+ const [message, setMessage] = useState10(null);
1339
+ useEffect8(() => {
1340
+ readImportDefaults().then((saved) => {
1341
+ setDefaults(saved);
1342
+ setStage("form");
1343
+ startDebugRun({
1344
+ flow: "settings/import-defaults",
1345
+ step: "01-import-defaults",
1346
+ menuOption: "Import Defaults",
1347
+ inputs: { ...saved }
1348
+ });
1349
+ });
1350
+ }, []);
1351
+ function handleSave() {
1352
+ setStage("saving");
1353
+ setMessage(null);
1354
+ writeImportDefaults(defaults).then(() => {
1355
+ setStage("saved");
1356
+ setMessage("Import defaults saved");
1357
+ }).catch((err) => {
1358
+ setMessage(err instanceof Error ? err.message : "Failed to save");
1359
+ setStage("form");
1360
+ });
1361
+ }
1362
+ useInput11((input, key) => {
1363
+ if (stage === "loading" || stage === "saving") return;
1364
+ if (stage === "saved") {
1365
+ if (key.return || key.escape || input === "q") {
1366
+ void finishDebugRun({ outputs: { ...defaults }, status: "success", exitMethod: "saved" });
1367
+ onDone();
1368
+ }
1369
+ return;
1370
+ }
1371
+ if (key.escape) {
1372
+ void finishDebugRun({ outputs: {}, status: "success", exitMethod: "discarded" });
1373
+ onDone();
1374
+ return;
1375
+ }
1376
+ const idx = FIELD_ORDER2.indexOf(activeField);
1377
+ if (key.tab || key.downArrow) {
1378
+ setActiveField(FIELD_ORDER2[(idx + 1) % FIELD_ORDER2.length]);
1379
+ return;
1380
+ }
1381
+ if (key.upArrow) {
1382
+ setActiveField(FIELD_ORDER2[(idx - 1 + FIELD_ORDER2.length) % FIELD_ORDER2.length]);
1383
+ return;
1384
+ }
1385
+ if (key.return) {
1386
+ if (idx < FIELD_ORDER2.length - 1) setActiveField(FIELD_ORDER2[idx + 1]);
1387
+ else handleSave();
1388
+ return;
1389
+ }
1390
+ if (key.backspace || key.delete) {
1391
+ setDefaults((d) => ({ ...d, [activeField]: d[activeField].slice(0, -1) }));
1392
+ return;
1393
+ }
1394
+ if (input && !key.ctrl && !key.meta) {
1395
+ setDefaults((d) => ({ ...d, [activeField]: d[activeField] + input }));
1396
+ }
1397
+ });
1398
+ if (stage === "loading") {
1399
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1400
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1401
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1402
+ /* @__PURE__ */ jsx11(Text11, { color: PALETTE.accent, children: "Loading..." })
1403
+ ] });
1404
+ }
1405
+ if (stage === "saved") {
1406
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1407
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1408
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1409
+ /* @__PURE__ */ jsxs11(Text11, { color: PALETTE.success, children: [
1410
+ "\u2713 ",
1411
+ message
1412
+ ] }),
1413
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1414
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "[Enter/Esc] Back" })
1415
+ ] });
1416
+ }
1417
+ return /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1418
+ /* @__PURE__ */ jsx11(Text11, { bold: true, children: "Import Defaults" }),
1419
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "Pre-filled when you start an import. Leave a field empty for no default." }),
1420
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1421
+ /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", children: FIELD_ORDER2.map((field) => {
1422
+ const isActive = activeField === field;
1423
+ const value = defaults[field];
1424
+ return /* @__PURE__ */ jsxs11(Box11, { gap: 1, children: [
1425
+ /* @__PURE__ */ jsx11(Text11, { color: isActive ? PALETTE.accent : void 0, children: isActive ? "\u276F" : " " }),
1426
+ /* @__PURE__ */ jsxs11(Text11, { bold: isActive, children: [
1427
+ FIELD_LABELS2[field],
1428
+ ":"
1429
+ ] }),
1430
+ /* @__PURE__ */ jsx11(Text11, { children: value || /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "(empty)" }) })
1431
+ ] }, field);
1432
+ }) }),
1433
+ message && /* @__PURE__ */ jsxs11(Fragment3, { children: [
1434
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1435
+ /* @__PURE__ */ jsxs11(Text11, { color: PALETTE.error, children: [
1436
+ "\u2717 ",
1437
+ message
1438
+ ] })
1439
+ ] }),
1440
+ /* @__PURE__ */ jsx11(Text11, { children: " " }),
1441
+ /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "[\u2191/\u2193] Switch field \xB7 [Enter] Save/Next \xB7 [Esc] Back" })
1442
+ ] });
1443
+ }
1444
+ var FIELD_ORDER2, FIELD_LABELS2;
1445
+ var init_screen5 = __esm({
1446
+ "packages/experience-design-system-cli/src/tui/settings/import-defaults/screen.tsx"() {
1447
+ "use strict";
1448
+ init_home_theme();
1449
+ init_debug_store();
1450
+ init_defaults_store();
1451
+ FIELD_ORDER2 = ["componentDir", "tokenFile"];
1452
+ FIELD_LABELS2 = {
1453
+ componentDir: "Component directory",
1454
+ tokenFile: "Token file"
1455
+ };
1456
+ }
1457
+ });
1458
+
1298
1459
  // packages/experience-design-system-cli/app.tsx
1299
1460
  var app_exports = {};
1300
1461
  __export(app_exports, {
1301
1462
  runApp: () => runApp
1302
1463
  });
1303
- import { useState as useState10 } from "react";
1304
- import { jsx as jsx11 } from "react/jsx-runtime";
1464
+ import { useEffect as useEffect9, useState as useState11 } from "react";
1465
+ import { Fragment as Fragment4, jsx as jsx12 } from "react/jsx-runtime";
1305
1466
  function App({ onLaunchImport, importExitCode }) {
1306
1467
  const returnedFromImport = importExitCode !== void 0;
1307
- const [screen, setScreen] = useState10(returnedFromImport ? "import" : "start");
1308
- const [showImportResult, setShowImportResult] = useState10(returnedFromImport);
1309
- const [projectPath, setProjectPath] = useState10();
1468
+ const [screen, setScreen] = useState11(returnedFromImport ? "import" : "start");
1469
+ const [showImportResult, setShowImportResult] = useState11(returnedFromImport);
1470
+ const [projectPath, setProjectPath] = useState11();
1471
+ const [importDefaults, setImportDefaults] = useState11();
1472
+ useEffect9(() => {
1473
+ if (screen !== "import") {
1474
+ setImportDefaults(void 0);
1475
+ return;
1476
+ }
1477
+ void readImportDefaults().then(setImportDefaults);
1478
+ }, [screen]);
1310
1479
  const goToStart = () => setScreen("start");
1311
1480
  const goToSettings = () => setScreen("settings");
1312
1481
  const finishImportResult = () => {
@@ -1320,36 +1489,42 @@ function App({ onLaunchImport, importExitCode }) {
1320
1489
  };
1321
1490
  switch (screen) {
1322
1491
  case "import":
1323
- if (showImportResult) return /* @__PURE__ */ jsx11(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1324
- if (projectPath === void 0) return /* @__PURE__ */ jsx11(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport });
1325
- return /* @__PURE__ */ jsx11(
1492
+ if (showImportResult) return /* @__PURE__ */ jsx12(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1493
+ if (importDefaults === void 0) return /* @__PURE__ */ jsx12(Fragment4, {});
1494
+ if (projectPath === void 0) {
1495
+ return /* @__PURE__ */ jsx12(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1496
+ }
1497
+ return /* @__PURE__ */ jsx12(
1326
1498
  TokenInputScreen,
1327
1499
  {
1500
+ initialPath: importDefaults.tokenFile,
1328
1501
  onConfirm: (tokens) => onLaunchImport?.({ project: projectPath, tokens }),
1329
1502
  onSkip: () => onLaunchImport?.({ project: projectPath }),
1330
1503
  onBack: () => setProjectPath(void 0)
1331
1504
  }
1332
1505
  );
1333
1506
  case "help":
1334
- return /* @__PURE__ */ jsx11(HelpScreen, { onDone: goToStart });
1507
+ return /* @__PURE__ */ jsx12(HelpScreen, { onDone: goToStart });
1335
1508
  case "upgrade":
1336
- return /* @__PURE__ */ jsx11(UpgradeScreen, { onDone: goToStart });
1509
+ return /* @__PURE__ */ jsx12(UpgradeScreen, { onDone: goToStart });
1337
1510
  case "settings":
1338
- return /* @__PURE__ */ jsx11(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1511
+ return /* @__PURE__ */ jsx12(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1339
1512
  case "settings-configuration":
1340
- return /* @__PURE__ */ jsx11(ConfigurationScreen, { onDone: goToSettings });
1513
+ return /* @__PURE__ */ jsx12(ConfigurationScreen, { onDone: goToSettings });
1341
1514
  case "settings-opt-in-analytics":
1342
- return /* @__PURE__ */ jsx11(OptInAnalyticsScreen, { onDone: goToSettings });
1515
+ return /* @__PURE__ */ jsx12(OptInAnalyticsScreen, { onDone: goToSettings });
1343
1516
  case "settings-debug-mode":
1344
- return /* @__PURE__ */ jsx11(DebugModeScreen, { onDone: goToSettings });
1517
+ return /* @__PURE__ */ jsx12(DebugModeScreen, { onDone: goToSettings });
1518
+ case "settings-import-defaults":
1519
+ return /* @__PURE__ */ jsx12(ImportDefaultsScreen, { onDone: goToSettings });
1345
1520
  case "start":
1346
- return /* @__PURE__ */ jsx11(HomeScreen, { onNavigate: setScreen });
1521
+ return /* @__PURE__ */ jsx12(HomeScreen, { onNavigate: setScreen });
1347
1522
  }
1348
1523
  }
1349
1524
  async function renderUntilImportRequestedOrExit(renderApp, importExitCode) {
1350
1525
  let requestedImport;
1351
1526
  const instance = renderApp(
1352
- /* @__PURE__ */ jsx11(
1527
+ /* @__PURE__ */ jsx12(
1353
1528
  App,
1354
1529
  {
1355
1530
  importExitCode,
@@ -1387,6 +1562,8 @@ var init_app = __esm({
1387
1562
  init_screen3();
1388
1563
  init_PageContainer4();
1389
1564
  init_screen4();
1565
+ init_screen5();
1566
+ init_defaults_store();
1390
1567
  }
1391
1568
  });
1392
1569
 
@@ -1394,11 +1571,6 @@ var init_app = __esm({
1394
1571
  import { readFileSync as readFileSync3 } from "node:fs";
1395
1572
  import { Command } from "commander";
1396
1573
 
1397
- // packages/experience-design-system-cli/src/legacy/forwarded-import-args.ts
1398
- function forwardedImportArgs(argv) {
1399
- return argv[0] === "import" ? argv.slice(1) : argv;
1400
- }
1401
-
1402
1574
  // packages/experience-design-system-cli/src/legacy/run-legacy.ts
1403
1575
  init_legacy_cli_path();
1404
1576
  import { spawn } from "node:child_process";
@@ -1452,11 +1624,7 @@ function registerForwardedCommands(program) {
1452
1624
  }
1453
1625
  function createProgram() {
1454
1626
  const program = new Command().name("experiences").description("Contentful Experiences design system import CLI").version(pkg.version, "--version", "Print version number");
1455
- program.command("import", { isDefault: true }).description("Launch the Experiences CLI").allowUnknownOption().allowExcessArguments().helpOption(false).argument("[args...]").action(async () => {
1456
- const forwarded = forwardedImportArgs(process.argv.slice(2));
1457
- if (forwarded.length > 0) {
1458
- process.exit(await runLegacy(["import", ...forwarded]));
1459
- }
1627
+ program.command("import", { isDefault: true }).description("Launch the Experiences CLI").action(async () => {
1460
1628
  const { render } = await import("ink");
1461
1629
  const { runApp: runApp2 } = await Promise.resolve().then(() => (init_app(), app_exports));
1462
1630
  await runApp2(render);
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.35.1-dev-build-fa264c11.0",
3
+ "version": "2.35.1-dev-build-657a08f3.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  interface WelcomeScreenProps {
3
3
  onContinue: (projectPath: string) => void;
4
4
  onQuit: () => void;
5
+ initialPath?: string;
5
6
  }
6
- export declare function WelcomeScreen({ onContinue, onQuit }: WelcomeScreenProps): React.ReactElement;
7
+ export declare function WelcomeScreen({ onContinue, onQuit, initialPath }: WelcomeScreenProps): React.ReactElement;
7
8
  export {};
@@ -3,6 +3,7 @@ interface TokenInputScreenProps {
3
3
  onConfirm: (tokensPath: string) => void;
4
4
  onSkip: () => void;
5
5
  onBack: () => void;
6
+ initialPath?: string;
6
7
  }
7
- export declare function TokenInputScreen({ onConfirm, onSkip, onBack }: TokenInputScreenProps): React.ReactElement;
8
+ export declare function TokenInputScreen({ onConfirm, onSkip, onBack, initialPath, }: TokenInputScreenProps): React.ReactElement;
8
9
  export {};
@@ -0,0 +1,6 @@
1
+ export type ImportDefaults = {
2
+ componentDir: string;
3
+ tokenFile: string;
4
+ };
5
+ export declare function readImportDefaults(): Promise<ImportDefaults>;
6
+ export declare function writeImportDefaults(defaults: ImportDefaults): Promise<void>;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare function ImportDefaultsScreen({ onDone }: {
3
+ onDone: () => void;
4
+ }): React.ReactElement;
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ export declare function resolveExtractNoCache(opts: {
3
+ cache?: boolean;
4
+ noCache?: boolean;
5
+ }): boolean;
6
+ export declare function collectSourceFiles(directory: string, onProgress?: (scannedCount: number) => void): Promise<string[]>;
7
+ export declare function registerInternalExtractCommand(program: Command): void;