@contentful/experience-design-system-cli 2.35.1-dev-build-657a08f3.0 → 2.35.1-dev-build-beaac232.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/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' | 'settings-import-defaults' | 'upgrade';
2
+ export type Screen = 'start' | 'import' | 'help' | 'settings' | 'settings-configuration' | 'settings-opt-in-analytics' | 'settings-debug-mode' | '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 { useEffect as useEffect9, useState as useState11 } from "react";
2
+ import { useEffect as useEffect8, useState as useState10 } 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";
@@ -718,7 +718,6 @@ function SettingsScreen({
718
718
  const [focusIdx, setFocusIdx] = useState5(0);
719
719
  const items = [
720
720
  { label: "Configuration", screen: "settings-configuration" },
721
- { label: "Import Defaults", screen: "settings-import-defaults" },
722
721
  { label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
723
722
  { label: "Debug Mode", screen: "settings-debug-mode" }
724
723
  ];
@@ -757,6 +756,7 @@ function SettingsScreen({
757
756
  // packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
758
757
  import { useEffect as useEffect4, useState as useState6 } from "react";
759
758
  import { Box as Box7, Text as Text7, useInput as useInput7 } from "ink";
759
+ import TextInput3 from "ink-text-input";
760
760
 
761
761
  // packages/experience-design-system-cli/src/tui/settings/utils/v1-store.ts
762
762
  var readV1Store = readSettings;
@@ -769,7 +769,9 @@ async function readCredentials() {
769
769
  spaceId: store.spaceId || "",
770
770
  environmentId: store.environmentId || "",
771
771
  cmaToken: store.cmaToken || "",
772
- host: store.host || ""
772
+ host: store.host || "",
773
+ defaultComponentDir: store.defaultComponentDir || "",
774
+ defaultTokenFile: store.defaultTokenFile || ""
773
775
  };
774
776
  }
775
777
  async function writeCredentials(config) {
@@ -786,26 +788,39 @@ async function writeCredentials(config) {
786
788
 
787
789
  // packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
788
790
  import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
789
- var FIELD_ORDER = ["spaceId", "environmentId", "cmaToken", "host"];
791
+ var FIELD_ORDER = [
792
+ "spaceId",
793
+ "environmentId",
794
+ "cmaToken",
795
+ "host",
796
+ "defaultComponentDir",
797
+ "defaultTokenFile"
798
+ ];
790
799
  function debugFields(config) {
791
800
  return {
792
801
  space_id: config?.spaceId ?? "",
793
802
  environment_id: config?.environmentId ?? "",
794
803
  cma_token: config?.cmaToken ?? "",
795
- host: config?.host ?? ""
804
+ host: config?.host ?? "",
805
+ default_component_dir: config?.defaultComponentDir ?? "",
806
+ default_token_file: config?.defaultTokenFile ?? ""
796
807
  };
797
808
  }
798
809
  var FIELD_LABELS = {
799
810
  spaceId: "Space ID",
800
811
  environmentId: "Environment ID",
801
812
  cmaToken: "CMA Token",
802
- host: "API Host (optional)"
813
+ host: "API Host (optional)",
814
+ defaultComponentDir: "Default component directory (optional)",
815
+ defaultTokenFile: "Default token file (optional)"
803
816
  };
804
817
  function ConfigurationScreen({ onDone }) {
805
818
  const [stage, setStage] = useState6("loading");
806
819
  const [config, setConfig] = useState6(null);
807
820
  const [activeField, setActiveField] = useState6("spaceId");
808
821
  const [message, setMessage] = useState6(null);
822
+ const [editing, setEditing] = useState6(false);
823
+ const [valueBeforeEdit, setValueBeforeEdit] = useState6("");
809
824
  useEffect4(() => {
810
825
  readCredentials().then((cfg) => {
811
826
  setConfig(cfg);
@@ -826,13 +841,13 @@ function ConfigurationScreen({ onDone }) {
826
841
  if (!config) return;
827
842
  setConfig({ ...config, [field]: value });
828
843
  }
829
- function handleSave() {
844
+ function saveAndLeave() {
830
845
  if (!config) return;
831
846
  setStage("saving");
832
847
  setMessage(null);
833
848
  writeCredentials(config).then(() => {
834
- setStage("saved");
835
- setMessage("Configuration saved");
849
+ void finishDebugRun({ outputs: debugFields(config), status: "success", exitMethod: "saved" });
850
+ onDone();
836
851
  }).catch((err) => {
837
852
  setMessage(err instanceof Error ? err.message : "Failed to save");
838
853
  setStage("form");
@@ -840,16 +855,15 @@ function ConfigurationScreen({ onDone }) {
840
855
  }
841
856
  useInput7((input, key) => {
842
857
  if (stage === "loading" || stage === "saving") return;
843
- if (stage === "saved") {
844
- if (key.return || key.escape || input === "q") {
845
- void finishDebugRun({ outputs: debugFields(config), status: "success", exitMethod: "saved" });
846
- onDone();
858
+ if (editing) {
859
+ if (key.escape) {
860
+ setFieldValue(activeField, valueBeforeEdit);
861
+ setEditing(false);
847
862
  }
848
863
  return;
849
864
  }
850
865
  if (key.escape || input === "q") {
851
- void finishDebugRun({ outputs: {}, status: "success", exitMethod: "discarded" });
852
- onDone();
866
+ saveAndLeave();
853
867
  return;
854
868
  }
855
869
  if (key.tab || key.downArrow) {
@@ -863,21 +877,8 @@ function ConfigurationScreen({ onDone }) {
863
877
  return;
864
878
  }
865
879
  if (key.return) {
866
- const idx = FIELD_ORDER.indexOf(activeField);
867
- if (idx < FIELD_ORDER.length - 1) {
868
- setActiveField(FIELD_ORDER[idx + 1]);
869
- } else {
870
- handleSave();
871
- }
872
- return;
873
- }
874
- if (key.backspace || key.delete) {
875
- const current = fieldValue(activeField);
876
- setFieldValue(activeField, current.slice(0, -1));
877
- return;
878
- }
879
- if (input && !key.ctrl && !key.meta) {
880
- setFieldValue(activeField, fieldValue(activeField) + input);
880
+ setValueBeforeEdit(fieldValue(activeField));
881
+ setEditing(true);
881
882
  }
882
883
  });
883
884
  if (stage === "loading") {
@@ -887,18 +888,6 @@ function ConfigurationScreen({ onDone }) {
887
888
  /* @__PURE__ */ jsx7(Text7, { color: PALETTE.accent, children: "Loading..." })
888
889
  ] });
889
890
  }
890
- if (stage === "saved") {
891
- return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
892
- /* @__PURE__ */ jsx7(Text7, { bold: true, children: "Configuration" }),
893
- /* @__PURE__ */ jsx7(Text7, { children: " " }),
894
- /* @__PURE__ */ jsxs7(Text7, { color: PALETTE.success, children: [
895
- "\u2713 ",
896
- message
897
- ] }),
898
- /* @__PURE__ */ jsx7(Text7, { children: " " }),
899
- /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "[Enter] Back to Settings" })
900
- ] });
901
- }
902
891
  return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
903
892
  /* @__PURE__ */ jsx7(Text7, { bold: true, children: "Configuration" }),
904
893
  /* @__PURE__ */ jsx7(Text7, { children: " " }),
@@ -914,7 +903,15 @@ function ConfigurationScreen({ onDone }) {
914
903
  FIELD_LABELS[field],
915
904
  ":"
916
905
  ] }),
917
- /* @__PURE__ */ jsx7(Text7, { children: display || /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "(empty)" }) })
906
+ isActive && editing ? /* @__PURE__ */ jsx7(
907
+ TextInput3,
908
+ {
909
+ value,
910
+ onChange: (next) => setFieldValue(field, next),
911
+ onSubmit: () => setEditing(false),
912
+ mask: field === "cmaToken" ? "\u2022" : void 0
913
+ }
914
+ ) : /* @__PURE__ */ jsx7(Text7, { children: display || /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "(empty)" }) })
918
915
  ] }, field);
919
916
  }) }),
920
917
  message && /* @__PURE__ */ jsxs7(Fragment, { children: [
@@ -925,7 +922,7 @@ function ConfigurationScreen({ onDone }) {
925
922
  ] })
926
923
  ] }),
927
924
  /* @__PURE__ */ jsx7(Text7, { children: " " }),
928
- /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "[\u2191/\u2193] Switch field \xB7 [Enter] Save/Next \xB7 [Esc/q] Back" })
925
+ /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: editing ? "[type] Edit \xB7 [\u2190/\u2192] Move cursor \xB7 [Enter] Done \xB7 [Esc] Cancel edit" : "[\u2191/\u2193] Switch field \xB7 [Enter] Edit \xB7 [Esc/q] Save & back" })
929
926
  ] });
930
927
  }
931
928
 
@@ -1116,162 +1113,22 @@ function DebugModeScreen({ onDone }) {
1116
1113
  ] });
1117
1114
  }
1118
1115
 
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
-
1261
1116
  // packages/experience-design-system-cli/app.tsx
1262
- import { Fragment as Fragment4, jsx as jsx12 } from "react/jsx-runtime";
1117
+ import { Fragment as Fragment3, jsx as jsx11 } from "react/jsx-runtime";
1263
1118
  function App({ onLaunchImport, importExitCode }) {
1264
1119
  const returnedFromImport = importExitCode !== void 0;
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(() => {
1120
+ const [screen, setScreen] = useState10(returnedFromImport ? "import" : "start");
1121
+ const [showImportResult, setShowImportResult] = useState10(returnedFromImport);
1122
+ const [projectPath, setProjectPath] = useState10();
1123
+ const [importDefaults, setImportDefaults] = useState10();
1124
+ useEffect8(() => {
1270
1125
  if (screen !== "import") {
1271
1126
  setImportDefaults(void 0);
1272
1127
  return;
1273
1128
  }
1274
- void readImportDefaults().then(setImportDefaults);
1129
+ void readCredentials().then(
1130
+ (saved) => setImportDefaults({ componentDir: saved.defaultComponentDir ?? "", tokenFile: saved.defaultTokenFile ?? "" })
1131
+ );
1275
1132
  }, [screen]);
1276
1133
  const goToStart = () => setScreen("start");
1277
1134
  const goToSettings = () => setScreen("settings");
@@ -1286,12 +1143,12 @@ function App({ onLaunchImport, importExitCode }) {
1286
1143
  };
1287
1144
  switch (screen) {
1288
1145
  case "import":
1289
- if (showImportResult) return /* @__PURE__ */ jsx12(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1290
- if (importDefaults === void 0) return /* @__PURE__ */ jsx12(Fragment4, {});
1146
+ if (showImportResult) return /* @__PURE__ */ jsx11(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1147
+ if (importDefaults === void 0) return /* @__PURE__ */ jsx11(Fragment3, {});
1291
1148
  if (projectPath === void 0) {
1292
- return /* @__PURE__ */ jsx12(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1149
+ return /* @__PURE__ */ jsx11(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1293
1150
  }
1294
- return /* @__PURE__ */ jsx12(
1151
+ return /* @__PURE__ */ jsx11(
1295
1152
  TokenInputScreen,
1296
1153
  {
1297
1154
  initialPath: importDefaults.tokenFile,
@@ -1301,27 +1158,25 @@ function App({ onLaunchImport, importExitCode }) {
1301
1158
  }
1302
1159
  );
1303
1160
  case "help":
1304
- return /* @__PURE__ */ jsx12(HelpScreen, { onDone: goToStart });
1161
+ return /* @__PURE__ */ jsx11(HelpScreen, { onDone: goToStart });
1305
1162
  case "upgrade":
1306
- return /* @__PURE__ */ jsx12(UpgradeScreen, { onDone: goToStart });
1163
+ return /* @__PURE__ */ jsx11(UpgradeScreen, { onDone: goToStart });
1307
1164
  case "settings":
1308
- return /* @__PURE__ */ jsx12(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1165
+ return /* @__PURE__ */ jsx11(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1309
1166
  case "settings-configuration":
1310
- return /* @__PURE__ */ jsx12(ConfigurationScreen, { onDone: goToSettings });
1167
+ return /* @__PURE__ */ jsx11(ConfigurationScreen, { onDone: goToSettings });
1311
1168
  case "settings-opt-in-analytics":
1312
- return /* @__PURE__ */ jsx12(OptInAnalyticsScreen, { onDone: goToSettings });
1169
+ return /* @__PURE__ */ jsx11(OptInAnalyticsScreen, { onDone: goToSettings });
1313
1170
  case "settings-debug-mode":
1314
- return /* @__PURE__ */ jsx12(DebugModeScreen, { onDone: goToSettings });
1315
- case "settings-import-defaults":
1316
- return /* @__PURE__ */ jsx12(ImportDefaultsScreen, { onDone: goToSettings });
1171
+ return /* @__PURE__ */ jsx11(DebugModeScreen, { onDone: goToSettings });
1317
1172
  case "start":
1318
- return /* @__PURE__ */ jsx12(HomeScreen, { onNavigate: setScreen });
1173
+ return /* @__PURE__ */ jsx11(HomeScreen, { onNavigate: setScreen });
1319
1174
  }
1320
1175
  }
1321
1176
  async function renderUntilImportRequestedOrExit(renderApp, importExitCode) {
1322
1177
  let requestedImport;
1323
1178
  const instance = renderApp(
1324
- /* @__PURE__ */ jsx12(
1179
+ /* @__PURE__ */ jsx11(
1325
1180
  App,
1326
1181
  {
1327
1182
  importExitCode,
package/dist/index.js CHANGED
@@ -849,7 +849,6 @@ function SettingsScreen({
849
849
  const [focusIdx, setFocusIdx] = useState5(0);
850
850
  const items = [
851
851
  { label: "Configuration", screen: "settings-configuration" },
852
- { label: "Import Defaults", screen: "settings-import-defaults" },
853
852
  { label: "Opt-in Analytics", screen: "settings-opt-in-analytics" },
854
853
  { label: "Debug Mode", screen: "settings-debug-mode" }
855
854
  ];
@@ -908,7 +907,9 @@ async function readCredentials() {
908
907
  spaceId: store.spaceId || "",
909
908
  environmentId: store.environmentId || "",
910
909
  cmaToken: store.cmaToken || "",
911
- host: store.host || ""
910
+ host: store.host || "",
911
+ defaultComponentDir: store.defaultComponentDir || "",
912
+ defaultTokenFile: store.defaultTokenFile || ""
912
913
  };
913
914
  }
914
915
  async function writeCredentials(config) {
@@ -932,13 +933,16 @@ var init_config_store = __esm({
932
933
  // packages/experience-design-system-cli/src/tui/settings/contentful-configuration/ContentfulConfigScreen.tsx
933
934
  import { useEffect as useEffect4, useState as useState6 } from "react";
934
935
  import { Box as Box7, Text as Text7, useInput as useInput7 } from "ink";
936
+ import TextInput3 from "ink-text-input";
935
937
  import { Fragment, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
936
938
  function debugFields(config) {
937
939
  return {
938
940
  space_id: config?.spaceId ?? "",
939
941
  environment_id: config?.environmentId ?? "",
940
942
  cma_token: config?.cmaToken ?? "",
941
- host: config?.host ?? ""
943
+ host: config?.host ?? "",
944
+ default_component_dir: config?.defaultComponentDir ?? "",
945
+ default_token_file: config?.defaultTokenFile ?? ""
942
946
  };
943
947
  }
944
948
  function ConfigurationScreen({ onDone }) {
@@ -946,6 +950,8 @@ function ConfigurationScreen({ onDone }) {
946
950
  const [config, setConfig] = useState6(null);
947
951
  const [activeField, setActiveField] = useState6("spaceId");
948
952
  const [message, setMessage] = useState6(null);
953
+ const [editing, setEditing] = useState6(false);
954
+ const [valueBeforeEdit, setValueBeforeEdit] = useState6("");
949
955
  useEffect4(() => {
950
956
  readCredentials().then((cfg) => {
951
957
  setConfig(cfg);
@@ -966,13 +972,13 @@ function ConfigurationScreen({ onDone }) {
966
972
  if (!config) return;
967
973
  setConfig({ ...config, [field]: value });
968
974
  }
969
- function handleSave() {
975
+ function saveAndLeave() {
970
976
  if (!config) return;
971
977
  setStage("saving");
972
978
  setMessage(null);
973
979
  writeCredentials(config).then(() => {
974
- setStage("saved");
975
- setMessage("Configuration saved");
980
+ void finishDebugRun({ outputs: debugFields(config), status: "success", exitMethod: "saved" });
981
+ onDone();
976
982
  }).catch((err) => {
977
983
  setMessage(err instanceof Error ? err.message : "Failed to save");
978
984
  setStage("form");
@@ -980,16 +986,15 @@ function ConfigurationScreen({ onDone }) {
980
986
  }
981
987
  useInput7((input, key) => {
982
988
  if (stage === "loading" || stage === "saving") return;
983
- if (stage === "saved") {
984
- if (key.return || key.escape || input === "q") {
985
- void finishDebugRun({ outputs: debugFields(config), status: "success", exitMethod: "saved" });
986
- onDone();
989
+ if (editing) {
990
+ if (key.escape) {
991
+ setFieldValue(activeField, valueBeforeEdit);
992
+ setEditing(false);
987
993
  }
988
994
  return;
989
995
  }
990
996
  if (key.escape || input === "q") {
991
- void finishDebugRun({ outputs: {}, status: "success", exitMethod: "discarded" });
992
- onDone();
997
+ saveAndLeave();
993
998
  return;
994
999
  }
995
1000
  if (key.tab || key.downArrow) {
@@ -1003,21 +1008,8 @@ function ConfigurationScreen({ onDone }) {
1003
1008
  return;
1004
1009
  }
1005
1010
  if (key.return) {
1006
- const idx = FIELD_ORDER.indexOf(activeField);
1007
- if (idx < FIELD_ORDER.length - 1) {
1008
- setActiveField(FIELD_ORDER[idx + 1]);
1009
- } else {
1010
- handleSave();
1011
- }
1012
- return;
1013
- }
1014
- if (key.backspace || key.delete) {
1015
- const current = fieldValue(activeField);
1016
- setFieldValue(activeField, current.slice(0, -1));
1017
- return;
1018
- }
1019
- if (input && !key.ctrl && !key.meta) {
1020
- setFieldValue(activeField, fieldValue(activeField) + input);
1011
+ setValueBeforeEdit(fieldValue(activeField));
1012
+ setEditing(true);
1021
1013
  }
1022
1014
  });
1023
1015
  if (stage === "loading") {
@@ -1027,18 +1019,6 @@ function ConfigurationScreen({ onDone }) {
1027
1019
  /* @__PURE__ */ jsx7(Text7, { color: PALETTE.accent, children: "Loading..." })
1028
1020
  ] });
1029
1021
  }
1030
- if (stage === "saved") {
1031
- return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1032
- /* @__PURE__ */ jsx7(Text7, { bold: true, children: "Configuration" }),
1033
- /* @__PURE__ */ jsx7(Text7, { children: " " }),
1034
- /* @__PURE__ */ jsxs7(Text7, { color: PALETTE.success, children: [
1035
- "\u2713 ",
1036
- message
1037
- ] }),
1038
- /* @__PURE__ */ jsx7(Text7, { children: " " }),
1039
- /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "[Enter] Back to Settings" })
1040
- ] });
1041
- }
1042
1022
  return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", paddingX: 2, paddingY: 1, children: [
1043
1023
  /* @__PURE__ */ jsx7(Text7, { bold: true, children: "Configuration" }),
1044
1024
  /* @__PURE__ */ jsx7(Text7, { children: " " }),
@@ -1054,7 +1034,15 @@ function ConfigurationScreen({ onDone }) {
1054
1034
  FIELD_LABELS[field],
1055
1035
  ":"
1056
1036
  ] }),
1057
- /* @__PURE__ */ jsx7(Text7, { children: display || /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "(empty)" }) })
1037
+ isActive && editing ? /* @__PURE__ */ jsx7(
1038
+ TextInput3,
1039
+ {
1040
+ value,
1041
+ onChange: (next) => setFieldValue(field, next),
1042
+ onSubmit: () => setEditing(false),
1043
+ mask: field === "cmaToken" ? "\u2022" : void 0
1044
+ }
1045
+ ) : /* @__PURE__ */ jsx7(Text7, { children: display || /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "(empty)" }) })
1058
1046
  ] }, field);
1059
1047
  }) }),
1060
1048
  message && /* @__PURE__ */ jsxs7(Fragment, { children: [
@@ -1065,7 +1053,7 @@ function ConfigurationScreen({ onDone }) {
1065
1053
  ] })
1066
1054
  ] }),
1067
1055
  /* @__PURE__ */ jsx7(Text7, { children: " " }),
1068
- /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "[\u2191/\u2193] Switch field \xB7 [Enter] Save/Next \xB7 [Esc/q] Back" })
1056
+ /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: editing ? "[type] Edit \xB7 [\u2190/\u2192] Move cursor \xB7 [Enter] Done \xB7 [Esc] Cancel edit" : "[\u2191/\u2193] Switch field \xB7 [Enter] Edit \xB7 [Esc/q] Save & back" })
1069
1057
  ] });
1070
1058
  }
1071
1059
  var FIELD_ORDER, FIELD_LABELS;
@@ -1075,12 +1063,21 @@ var init_ContentfulConfigScreen = __esm({
1075
1063
  init_home_theme();
1076
1064
  init_config_store();
1077
1065
  init_debug_store();
1078
- FIELD_ORDER = ["spaceId", "environmentId", "cmaToken", "host"];
1066
+ FIELD_ORDER = [
1067
+ "spaceId",
1068
+ "environmentId",
1069
+ "cmaToken",
1070
+ "host",
1071
+ "defaultComponentDir",
1072
+ "defaultTokenFile"
1073
+ ];
1079
1074
  FIELD_LABELS = {
1080
1075
  spaceId: "Space ID",
1081
1076
  environmentId: "Environment ID",
1082
1077
  cmaToken: "CMA Token",
1083
- host: "API Host (optional)"
1078
+ host: "API Host (optional)",
1079
+ defaultComponentDir: "Default component directory (optional)",
1080
+ defaultTokenFile: "Default token file (optional)"
1084
1081
  };
1085
1082
  }
1086
1083
  });
@@ -1301,180 +1298,27 @@ var init_screen4 = __esm({
1301
1298
  }
1302
1299
  });
1303
1300
 
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
-
1459
1301
  // packages/experience-design-system-cli/app.tsx
1460
1302
  var app_exports = {};
1461
1303
  __export(app_exports, {
1462
1304
  runApp: () => runApp
1463
1305
  });
1464
- import { useEffect as useEffect9, useState as useState11 } from "react";
1465
- import { Fragment as Fragment4, jsx as jsx12 } from "react/jsx-runtime";
1306
+ import { useEffect as useEffect8, useState as useState10 } from "react";
1307
+ import { Fragment as Fragment3, jsx as jsx11 } from "react/jsx-runtime";
1466
1308
  function App({ onLaunchImport, importExitCode }) {
1467
1309
  const returnedFromImport = importExitCode !== void 0;
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(() => {
1310
+ const [screen, setScreen] = useState10(returnedFromImport ? "import" : "start");
1311
+ const [showImportResult, setShowImportResult] = useState10(returnedFromImport);
1312
+ const [projectPath, setProjectPath] = useState10();
1313
+ const [importDefaults, setImportDefaults] = useState10();
1314
+ useEffect8(() => {
1473
1315
  if (screen !== "import") {
1474
1316
  setImportDefaults(void 0);
1475
1317
  return;
1476
1318
  }
1477
- void readImportDefaults().then(setImportDefaults);
1319
+ void readCredentials().then(
1320
+ (saved) => setImportDefaults({ componentDir: saved.defaultComponentDir ?? "", tokenFile: saved.defaultTokenFile ?? "" })
1321
+ );
1478
1322
  }, [screen]);
1479
1323
  const goToStart = () => setScreen("start");
1480
1324
  const goToSettings = () => setScreen("settings");
@@ -1489,12 +1333,12 @@ function App({ onLaunchImport, importExitCode }) {
1489
1333
  };
1490
1334
  switch (screen) {
1491
1335
  case "import":
1492
- if (showImportResult) return /* @__PURE__ */ jsx12(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1493
- if (importDefaults === void 0) return /* @__PURE__ */ jsx12(Fragment4, {});
1336
+ if (showImportResult) return /* @__PURE__ */ jsx11(ImportScreen, { exitCode: importExitCode, onDone: finishImportResult });
1337
+ if (importDefaults === void 0) return /* @__PURE__ */ jsx11(Fragment3, {});
1494
1338
  if (projectPath === void 0) {
1495
- return /* @__PURE__ */ jsx12(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1339
+ return /* @__PURE__ */ jsx11(WelcomeScreen, { onContinue: setProjectPath, onQuit: leaveImport, initialPath: importDefaults.componentDir });
1496
1340
  }
1497
- return /* @__PURE__ */ jsx12(
1341
+ return /* @__PURE__ */ jsx11(
1498
1342
  TokenInputScreen,
1499
1343
  {
1500
1344
  initialPath: importDefaults.tokenFile,
@@ -1504,27 +1348,25 @@ function App({ onLaunchImport, importExitCode }) {
1504
1348
  }
1505
1349
  );
1506
1350
  case "help":
1507
- return /* @__PURE__ */ jsx12(HelpScreen, { onDone: goToStart });
1351
+ return /* @__PURE__ */ jsx11(HelpScreen, { onDone: goToStart });
1508
1352
  case "upgrade":
1509
- return /* @__PURE__ */ jsx12(UpgradeScreen, { onDone: goToStart });
1353
+ return /* @__PURE__ */ jsx11(UpgradeScreen, { onDone: goToStart });
1510
1354
  case "settings":
1511
- return /* @__PURE__ */ jsx12(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1355
+ return /* @__PURE__ */ jsx11(SettingsScreen, { onNavigate: setScreen, onBack: goToStart });
1512
1356
  case "settings-configuration":
1513
- return /* @__PURE__ */ jsx12(ConfigurationScreen, { onDone: goToSettings });
1357
+ return /* @__PURE__ */ jsx11(ConfigurationScreen, { onDone: goToSettings });
1514
1358
  case "settings-opt-in-analytics":
1515
- return /* @__PURE__ */ jsx12(OptInAnalyticsScreen, { onDone: goToSettings });
1359
+ return /* @__PURE__ */ jsx11(OptInAnalyticsScreen, { onDone: goToSettings });
1516
1360
  case "settings-debug-mode":
1517
- return /* @__PURE__ */ jsx12(DebugModeScreen, { onDone: goToSettings });
1518
- case "settings-import-defaults":
1519
- return /* @__PURE__ */ jsx12(ImportDefaultsScreen, { onDone: goToSettings });
1361
+ return /* @__PURE__ */ jsx11(DebugModeScreen, { onDone: goToSettings });
1520
1362
  case "start":
1521
- return /* @__PURE__ */ jsx12(HomeScreen, { onNavigate: setScreen });
1363
+ return /* @__PURE__ */ jsx11(HomeScreen, { onNavigate: setScreen });
1522
1364
  }
1523
1365
  }
1524
1366
  async function renderUntilImportRequestedOrExit(renderApp, importExitCode) {
1525
1367
  let requestedImport;
1526
1368
  const instance = renderApp(
1527
- /* @__PURE__ */ jsx12(
1369
+ /* @__PURE__ */ jsx11(
1528
1370
  App,
1529
1371
  {
1530
1372
  importExitCode,
@@ -1562,8 +1404,7 @@ var init_app = __esm({
1562
1404
  init_screen3();
1563
1405
  init_PageContainer4();
1564
1406
  init_screen4();
1565
- init_screen5();
1566
- init_defaults_store();
1407
+ init_config_store();
1567
1408
  }
1568
1409
  });
1569
1410
 
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-657a08f3.0",
3
+ "version": "2.35.1-dev-build-beaac232.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -3,6 +3,8 @@ export type V1Credentials = {
3
3
  environmentId?: string;
4
4
  cmaToken?: string;
5
5
  host?: string;
6
+ defaultComponentDir?: string;
7
+ defaultTokenFile?: string;
6
8
  [key: string]: string | undefined;
7
9
  };
8
10
  export declare function readCredentials(): Promise<V1Credentials>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.35.1-dev-build-657a08f3.0",
3
+ "version": "2.35.1-dev-build-beaac232.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/experience-design-system-cli",
3
- "version": "2.35.1-dev-build-657a08f3.0",
3
+ "version": "2.35.1-dev-build-beaac232.0",
4
4
  "description": "Contentful Experiences design system import CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -42,7 +42,7 @@
42
42
  "svelte": "^5.56.4",
43
43
  "ts-morph": "^27.0.2",
44
44
  "typescript": "^5.9.3",
45
- "@contentful/experience-design-system-types": "2.35.1-dev-build-657a08f3.0"
45
+ "@contentful/experience-design-system-types": "2.35.1-dev-build-beaac232.0"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@tsconfig/node24": "^24.0.4",
@@ -1,6 +0,0 @@
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>;
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- export declare function ImportDefaultsScreen({ onDone }: {
3
- onDone: () => void;
4
- }): React.ReactElement;