@svadmin/create 0.12.3 → 0.13.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 CHANGED
@@ -66,6 +66,28 @@ Ejected files are placed in `src/components/svadmin/`. Then pass them via the `c
66
66
 
67
67
  `Layout` · `Sidebar` · `Header` · `LoginPage` · `AutoTable` · `AutoForm` · `ShowPage` · `ProfilePage` · `StatsCard` · `AuditLogDrawer` · `LiveIndicator` · `CommandPalette` · `AICommandBar` · `ChatDialog` · `PasswordInput` · `BooleanField` · `FieldRenderer` · `MarkdownRenderer` · `AnomalyBadge` · `Toast` · `ConfirmDialog` · `TooltipButton` · `Breadcrumbs` · `ConfigErrorScreen` · `DevTools`
68
68
 
69
+ ## Project Maintenance
70
+
71
+ Check the current project against the dependency versions shipped with the CLI. This command is read-only and does not access the network:
72
+
73
+ ```bash
74
+ npx @svadmin/create doctor
75
+ ```
76
+
77
+ Preview an upgrade plan without changing `package.json`:
78
+
79
+ ```bash
80
+ npx @svadmin/create upgrade
81
+ ```
82
+
83
+ Apply the plan explicitly. The CLI creates a timestamped `package.json.svadmin-backup-*` file before replacing `package.json`:
84
+
85
+ ```bash
86
+ npx @svadmin/create upgrade --write
87
+ ```
88
+
89
+ Both commands accept an optional project-directory argument. Upgrade only manages dependencies known by the shipped scaffold; custom dependencies, scripts, and other package fields are preserved.
90
+
69
91
  ## Development
70
92
 
71
93
  ```bash
package/dist/index.js CHANGED
@@ -33,7 +33,7 @@ var __toESM = (mod, isNodeMode, target) => {
33
33
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
34
34
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
35
35
 
36
- // ../../node_modules/.bun/kleur@3.0.3/node_modules/kleur/index.js
36
+ // ../../node_modules/prompts/node_modules/kleur/index.js
37
37
  var require_kleur = __commonJS((exports, module) => {
38
38
  var { FORCE_COLOR, NODE_DISABLE_COLORS, TERM } = process.env;
39
39
  var $ = {
@@ -124,7 +124,7 @@ var require_kleur = __commonJS((exports, module) => {
124
124
  module.exports = $;
125
125
  });
126
126
 
127
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/action.js
127
+ // ../../node_modules/prompts/dist/util/action.js
128
128
  var require_action = __commonJS((exports, module) => {
129
129
  module.exports = (key, isSelect) => {
130
130
  if (key.meta && key.name !== "escape")
@@ -181,7 +181,7 @@ var require_action = __commonJS((exports, module) => {
181
181
  };
182
182
  });
183
183
 
184
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/strip.js
184
+ // ../../node_modules/prompts/dist/util/strip.js
185
185
  var require_strip = __commonJS((exports, module) => {
186
186
  module.exports = (str) => {
187
187
  const pattern = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))"].join("|");
@@ -190,7 +190,7 @@ var require_strip = __commonJS((exports, module) => {
190
190
  };
191
191
  });
192
192
 
193
- // ../../node_modules/.bun/sisteransi@1.0.5/node_modules/sisteransi/src/index.js
193
+ // ../../node_modules/sisteransi/src/index.js
194
194
  var require_src = __commonJS((exports, module) => {
195
195
  var ESC = "\x1B";
196
196
  var CSI = `${ESC}[`;
@@ -248,7 +248,7 @@ var require_src = __commonJS((exports, module) => {
248
248
  module.exports = { cursor, scroll, erase, beep };
249
249
  });
250
250
 
251
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/clear.js
251
+ // ../../node_modules/prompts/dist/util/clear.js
252
252
  var require_clear = __commonJS((exports, module) => {
253
253
  function _createForOfIteratorHelper(o, allowArrayLike) {
254
254
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
@@ -334,7 +334,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
334
334
  };
335
335
  });
336
336
 
337
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/figures.js
337
+ // ../../node_modules/prompts/dist/util/figures.js
338
338
  var require_figures = __commonJS((exports, module) => {
339
339
  var main = {
340
340
  arrowUp: "↑",
@@ -368,7 +368,7 @@ var require_figures = __commonJS((exports, module) => {
368
368
  module.exports = figures;
369
369
  });
370
370
 
371
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/style.js
371
+ // ../../node_modules/prompts/dist/util/style.js
372
372
  var require_style = __commonJS((exports, module) => {
373
373
  var c = require_kleur();
374
374
  var figures = require_figures();
@@ -410,7 +410,7 @@ var require_style = __commonJS((exports, module) => {
410
410
  };
411
411
  });
412
412
 
413
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/lines.js
413
+ // ../../node_modules/prompts/dist/util/lines.js
414
414
  var require_lines = __commonJS((exports, module) => {
415
415
  var strip = require_strip();
416
416
  module.exports = function(msg, perLine) {
@@ -421,7 +421,7 @@ var require_lines = __commonJS((exports, module) => {
421
421
  };
422
422
  });
423
423
 
424
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/wrap.js
424
+ // ../../node_modules/prompts/dist/util/wrap.js
425
425
  var require_wrap = __commonJS((exports, module) => {
426
426
  module.exports = (msg, opts = {}) => {
427
427
  const tab = Number.isSafeInteger(parseInt(opts.margin)) ? new Array(parseInt(opts.margin)).fill(" ").join("") : opts.margin || "";
@@ -438,7 +438,7 @@ var require_wrap = __commonJS((exports, module) => {
438
438
  };
439
439
  });
440
440
 
441
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/entriesToDisplay.js
441
+ // ../../node_modules/prompts/dist/util/entriesToDisplay.js
442
442
  var require_entriesToDisplay = __commonJS((exports, module) => {
443
443
  module.exports = (cursor, total, maxVisible) => {
444
444
  maxVisible = maxVisible || total;
@@ -453,7 +453,7 @@ var require_entriesToDisplay = __commonJS((exports, module) => {
453
453
  };
454
454
  });
455
455
 
456
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/util/index.js
456
+ // ../../node_modules/prompts/dist/util/index.js
457
457
  var require_util = __commonJS((exports, module) => {
458
458
  module.exports = {
459
459
  action: require_action(),
@@ -467,7 +467,7 @@ var require_util = __commonJS((exports, module) => {
467
467
  };
468
468
  });
469
469
 
470
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/prompt.js
470
+ // ../../node_modules/prompts/dist/elements/prompt.js
471
471
  var require_prompt = __commonJS((exports, module) => {
472
472
  var readline = __require("readline");
473
473
  var _require = require_util();
@@ -535,7 +535,7 @@ var require_prompt = __commonJS((exports, module) => {
535
535
  module.exports = Prompt;
536
536
  });
537
537
 
538
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/text.js
538
+ // ../../node_modules/prompts/dist/elements/text.js
539
539
  var require_text = __commonJS((exports, module) => {
540
540
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
541
541
  try {
@@ -759,7 +759,7 @@ ${i ? " " : figures.pointerSmall} ${color.red().italic(l)}`, ``);
759
759
  module.exports = TextPrompt;
760
760
  });
761
761
 
762
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/select.js
762
+ // ../../node_modules/prompts/dist/elements/select.js
763
763
  var require_select = __commonJS((exports, module) => {
764
764
  var color = require_kleur();
765
765
  var Prompt = require_prompt();
@@ -915,7 +915,7 @@ var require_select = __commonJS((exports, module) => {
915
915
  module.exports = SelectPrompt;
916
916
  });
917
917
 
918
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/toggle.js
918
+ // ../../node_modules/prompts/dist/elements/toggle.js
919
919
  var require_toggle = __commonJS((exports, module) => {
920
920
  var color = require_kleur();
921
921
  var Prompt = require_prompt();
@@ -1019,7 +1019,7 @@ var require_toggle = __commonJS((exports, module) => {
1019
1019
  module.exports = TogglePrompt;
1020
1020
  });
1021
1021
 
1022
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/datepart.js
1022
+ // ../../node_modules/prompts/dist/dateparts/datepart.js
1023
1023
  var require_datepart = __commonJS((exports, module) => {
1024
1024
  class DatePart {
1025
1025
  constructor({
@@ -1052,7 +1052,7 @@ var require_datepart = __commonJS((exports, module) => {
1052
1052
  module.exports = DatePart;
1053
1053
  });
1054
1054
 
1055
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/meridiem.js
1055
+ // ../../node_modules/prompts/dist/dateparts/meridiem.js
1056
1056
  var require_meridiem = __commonJS((exports, module) => {
1057
1057
  var DatePart = require_datepart();
1058
1058
 
@@ -1074,7 +1074,7 @@ var require_meridiem = __commonJS((exports, module) => {
1074
1074
  module.exports = Meridiem;
1075
1075
  });
1076
1076
 
1077
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/day.js
1077
+ // ../../node_modules/prompts/dist/dateparts/day.js
1078
1078
  var require_day = __commonJS((exports, module) => {
1079
1079
  var DatePart = require_datepart();
1080
1080
  var pos = (n) => {
@@ -1104,7 +1104,7 @@ var require_day = __commonJS((exports, module) => {
1104
1104
  module.exports = Day;
1105
1105
  });
1106
1106
 
1107
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/hours.js
1107
+ // ../../node_modules/prompts/dist/dateparts/hours.js
1108
1108
  var require_hours = __commonJS((exports, module) => {
1109
1109
  var DatePart = require_datepart();
1110
1110
 
@@ -1131,7 +1131,7 @@ var require_hours = __commonJS((exports, module) => {
1131
1131
  module.exports = Hours;
1132
1132
  });
1133
1133
 
1134
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/milliseconds.js
1134
+ // ../../node_modules/prompts/dist/dateparts/milliseconds.js
1135
1135
  var require_milliseconds = __commonJS((exports, module) => {
1136
1136
  var DatePart = require_datepart();
1137
1137
 
@@ -1155,7 +1155,7 @@ var require_milliseconds = __commonJS((exports, module) => {
1155
1155
  module.exports = Milliseconds;
1156
1156
  });
1157
1157
 
1158
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/minutes.js
1158
+ // ../../node_modules/prompts/dist/dateparts/minutes.js
1159
1159
  var require_minutes = __commonJS((exports, module) => {
1160
1160
  var DatePart = require_datepart();
1161
1161
 
@@ -1180,7 +1180,7 @@ var require_minutes = __commonJS((exports, module) => {
1180
1180
  module.exports = Minutes;
1181
1181
  });
1182
1182
 
1183
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/month.js
1183
+ // ../../node_modules/prompts/dist/dateparts/month.js
1184
1184
  var require_month = __commonJS((exports, module) => {
1185
1185
  var DatePart = require_datepart();
1186
1186
 
@@ -1207,7 +1207,7 @@ var require_month = __commonJS((exports, module) => {
1207
1207
  module.exports = Month;
1208
1208
  });
1209
1209
 
1210
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/seconds.js
1210
+ // ../../node_modules/prompts/dist/dateparts/seconds.js
1211
1211
  var require_seconds = __commonJS((exports, module) => {
1212
1212
  var DatePart = require_datepart();
1213
1213
 
@@ -1232,7 +1232,7 @@ var require_seconds = __commonJS((exports, module) => {
1232
1232
  module.exports = Seconds;
1233
1233
  });
1234
1234
 
1235
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/year.js
1235
+ // ../../node_modules/prompts/dist/dateparts/year.js
1236
1236
  var require_year = __commonJS((exports, module) => {
1237
1237
  var DatePart = require_datepart();
1238
1238
 
@@ -1257,7 +1257,7 @@ var require_year = __commonJS((exports, module) => {
1257
1257
  module.exports = Year;
1258
1258
  });
1259
1259
 
1260
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/dateparts/index.js
1260
+ // ../../node_modules/prompts/dist/dateparts/index.js
1261
1261
  var require_dateparts = __commonJS((exports, module) => {
1262
1262
  module.exports = {
1263
1263
  DatePart: require_datepart(),
@@ -1272,7 +1272,7 @@ var require_dateparts = __commonJS((exports, module) => {
1272
1272
  };
1273
1273
  });
1274
1274
 
1275
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/date.js
1275
+ // ../../node_modules/prompts/dist/elements/date.js
1276
1276
  var require_date = __commonJS((exports, module) => {
1277
1277
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
1278
1278
  try {
@@ -1499,7 +1499,7 @@ ${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
1499
1499
  module.exports = DatePrompt;
1500
1500
  });
1501
1501
 
1502
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/number.js
1502
+ // ../../node_modules/prompts/dist/elements/number.js
1503
1503
  var require_number = __commonJS((exports, module) => {
1504
1504
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
1505
1505
  try {
@@ -1722,7 +1722,7 @@ ${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
1722
1722
  module.exports = NumberPrompt;
1723
1723
  });
1724
1724
 
1725
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/multiselect.js
1725
+ // ../../node_modules/prompts/dist/elements/multiselect.js
1726
1726
  var require_multiselect = __commonJS((exports, module) => {
1727
1727
  var color = require_kleur();
1728
1728
  var _require = require_src();
@@ -1958,7 +1958,7 @@ Instructions:
1958
1958
  module.exports = MultiselectPrompt;
1959
1959
  });
1960
1960
 
1961
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/autocomplete.js
1961
+ // ../../node_modules/prompts/dist/elements/autocomplete.js
1962
1962
  var require_autocomplete = __commonJS((exports, module) => {
1963
1963
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
1964
1964
  try {
@@ -2229,7 +2229,7 @@ var require_autocomplete = __commonJS((exports, module) => {
2229
2229
  module.exports = AutocompletePrompt;
2230
2230
  });
2231
2231
 
2232
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/autocompleteMultiselect.js
2232
+ // ../../node_modules/prompts/dist/elements/autocompleteMultiselect.js
2233
2233
  var require_autocompleteMultiselect = __commonJS((exports, module) => {
2234
2234
  var color = require_kleur();
2235
2235
  var _require = require_src();
@@ -2391,7 +2391,7 @@ Filtered results for: ${this.inputValue ? this.inputValue : color.gray("Enter so
2391
2391
  module.exports = AutocompleteMultiselectPrompt;
2392
2392
  });
2393
2393
 
2394
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/confirm.js
2394
+ // ../../node_modules/prompts/dist/elements/confirm.js
2395
2395
  var require_confirm = __commonJS((exports, module) => {
2396
2396
  var color = require_kleur();
2397
2397
  var Prompt = require_prompt();
@@ -2466,7 +2466,7 @@ var require_confirm = __commonJS((exports, module) => {
2466
2466
  module.exports = ConfirmPrompt;
2467
2467
  });
2468
2468
 
2469
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/elements/index.js
2469
+ // ../../node_modules/prompts/dist/elements/index.js
2470
2470
  var require_elements = __commonJS((exports, module) => {
2471
2471
  module.exports = {
2472
2472
  TextPrompt: require_text(),
@@ -2481,7 +2481,7 @@ var require_elements = __commonJS((exports, module) => {
2481
2481
  };
2482
2482
  });
2483
2483
 
2484
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/prompts.js
2484
+ // ../../node_modules/prompts/dist/prompts.js
2485
2485
  var require_prompts = __commonJS((exports) => {
2486
2486
  var $ = exports;
2487
2487
  var el = require_elements();
@@ -2542,7 +2542,7 @@ var require_prompts = __commonJS((exports) => {
2542
2542
  };
2543
2543
  });
2544
2544
 
2545
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/dist/index.js
2545
+ // ../../node_modules/prompts/dist/index.js
2546
2546
  var require_dist = __commonJS((exports, module) => {
2547
2547
  function ownKeys(object, enumerableOnly) {
2548
2548
  var keys = Object.keys(object);
@@ -2772,7 +2772,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
2772
2772
  });
2773
2773
  });
2774
2774
 
2775
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/action.js
2775
+ // ../../node_modules/prompts/lib/util/action.js
2776
2776
  var require_action2 = __commonJS((exports, module) => {
2777
2777
  module.exports = (key, isSelect) => {
2778
2778
  if (key.meta && key.name !== "escape")
@@ -2829,7 +2829,7 @@ var require_action2 = __commonJS((exports, module) => {
2829
2829
  };
2830
2830
  });
2831
2831
 
2832
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/strip.js
2832
+ // ../../node_modules/prompts/lib/util/strip.js
2833
2833
  var require_strip2 = __commonJS((exports, module) => {
2834
2834
  module.exports = (str) => {
2835
2835
  const pattern = [
@@ -2841,7 +2841,7 @@ var require_strip2 = __commonJS((exports, module) => {
2841
2841
  };
2842
2842
  });
2843
2843
 
2844
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/clear.js
2844
+ // ../../node_modules/prompts/lib/util/clear.js
2845
2845
  var require_clear2 = __commonJS((exports, module) => {
2846
2846
  var strip = require_strip2();
2847
2847
  var { erase, cursor } = require_src();
@@ -2858,7 +2858,7 @@ var require_clear2 = __commonJS((exports, module) => {
2858
2858
  };
2859
2859
  });
2860
2860
 
2861
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/figures.js
2861
+ // ../../node_modules/prompts/lib/util/figures.js
2862
2862
  var require_figures2 = __commonJS((exports, module) => {
2863
2863
  var main = {
2864
2864
  arrowUp: "↑",
@@ -2892,7 +2892,7 @@ var require_figures2 = __commonJS((exports, module) => {
2892
2892
  module.exports = figures;
2893
2893
  });
2894
2894
 
2895
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/style.js
2895
+ // ../../node_modules/prompts/lib/util/style.js
2896
2896
  var require_style2 = __commonJS((exports, module) => {
2897
2897
  var c = require_kleur();
2898
2898
  var figures = require_figures2();
@@ -2922,7 +2922,7 @@ var require_style2 = __commonJS((exports, module) => {
2922
2922
  };
2923
2923
  });
2924
2924
 
2925
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/lines.js
2925
+ // ../../node_modules/prompts/lib/util/lines.js
2926
2926
  var require_lines2 = __commonJS((exports, module) => {
2927
2927
  var strip = require_strip2();
2928
2928
  module.exports = function(msg, perLine) {
@@ -2933,7 +2933,7 @@ var require_lines2 = __commonJS((exports, module) => {
2933
2933
  };
2934
2934
  });
2935
2935
 
2936
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/wrap.js
2936
+ // ../../node_modules/prompts/lib/util/wrap.js
2937
2937
  var require_wrap2 = __commonJS((exports, module) => {
2938
2938
  module.exports = (msg, opts = {}) => {
2939
2939
  const tab = Number.isSafeInteger(parseInt(opts.margin)) ? new Array(parseInt(opts.margin)).fill(" ").join("") : opts.margin || "";
@@ -2950,7 +2950,7 @@ var require_wrap2 = __commonJS((exports, module) => {
2950
2950
  };
2951
2951
  });
2952
2952
 
2953
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/entriesToDisplay.js
2953
+ // ../../node_modules/prompts/lib/util/entriesToDisplay.js
2954
2954
  var require_entriesToDisplay2 = __commonJS((exports, module) => {
2955
2955
  module.exports = (cursor, total, maxVisible) => {
2956
2956
  maxVisible = maxVisible || total;
@@ -2962,7 +2962,7 @@ var require_entriesToDisplay2 = __commonJS((exports, module) => {
2962
2962
  };
2963
2963
  });
2964
2964
 
2965
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/util/index.js
2965
+ // ../../node_modules/prompts/lib/util/index.js
2966
2966
  var require_util2 = __commonJS((exports, module) => {
2967
2967
  module.exports = {
2968
2968
  action: require_action2(),
@@ -2976,7 +2976,7 @@ var require_util2 = __commonJS((exports, module) => {
2976
2976
  };
2977
2977
  });
2978
2978
 
2979
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/prompt.js
2979
+ // ../../node_modules/prompts/lib/elements/prompt.js
2980
2980
  var require_prompt2 = __commonJS((exports, module) => {
2981
2981
  var readline = __require("readline");
2982
2982
  var { action } = require_util2();
@@ -3038,7 +3038,7 @@ var require_prompt2 = __commonJS((exports, module) => {
3038
3038
  module.exports = Prompt;
3039
3039
  });
3040
3040
 
3041
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/text.js
3041
+ // ../../node_modules/prompts/lib/elements/text.js
3042
3042
  var require_text2 = __commonJS((exports, module) => {
3043
3043
  var color = require_kleur();
3044
3044
  var Prompt = require_prompt2();
@@ -3226,7 +3226,7 @@ ${i ? " " : figures.pointerSmall} ${color.red().italic(l)}`, ``);
3226
3226
  module.exports = TextPrompt;
3227
3227
  });
3228
3228
 
3229
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/select.js
3229
+ // ../../node_modules/prompts/lib/elements/select.js
3230
3230
  var require_select2 = __commonJS((exports, module) => {
3231
3231
  var color = require_kleur();
3232
3232
  var Prompt = require_prompt2();
@@ -3375,7 +3375,7 @@ var require_select2 = __commonJS((exports, module) => {
3375
3375
  module.exports = SelectPrompt;
3376
3376
  });
3377
3377
 
3378
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/toggle.js
3378
+ // ../../node_modules/prompts/lib/elements/toggle.js
3379
3379
  var require_toggle2 = __commonJS((exports, module) => {
3380
3380
  var color = require_kleur();
3381
3381
  var Prompt = require_prompt2();
@@ -3482,7 +3482,7 @@ var require_toggle2 = __commonJS((exports, module) => {
3482
3482
  module.exports = TogglePrompt;
3483
3483
  });
3484
3484
 
3485
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/datepart.js
3485
+ // ../../node_modules/prompts/lib/dateparts/datepart.js
3486
3486
  var require_datepart2 = __commonJS((exports, module) => {
3487
3487
  class DatePart {
3488
3488
  constructor({ token, date, parts, locales }) {
@@ -3510,7 +3510,7 @@ var require_datepart2 = __commonJS((exports, module) => {
3510
3510
  module.exports = DatePart;
3511
3511
  });
3512
3512
 
3513
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/meridiem.js
3513
+ // ../../node_modules/prompts/lib/dateparts/meridiem.js
3514
3514
  var require_meridiem2 = __commonJS((exports, module) => {
3515
3515
  var DatePart = require_datepart2();
3516
3516
 
@@ -3532,7 +3532,7 @@ var require_meridiem2 = __commonJS((exports, module) => {
3532
3532
  module.exports = Meridiem;
3533
3533
  });
3534
3534
 
3535
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/day.js
3535
+ // ../../node_modules/prompts/lib/dateparts/day.js
3536
3536
  var require_day2 = __commonJS((exports, module) => {
3537
3537
  var DatePart = require_datepart2();
3538
3538
  var pos = (n) => {
@@ -3562,7 +3562,7 @@ var require_day2 = __commonJS((exports, module) => {
3562
3562
  module.exports = Day;
3563
3563
  });
3564
3564
 
3565
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/hours.js
3565
+ // ../../node_modules/prompts/lib/dateparts/hours.js
3566
3566
  var require_hours2 = __commonJS((exports, module) => {
3567
3567
  var DatePart = require_datepart2();
3568
3568
 
@@ -3589,7 +3589,7 @@ var require_hours2 = __commonJS((exports, module) => {
3589
3589
  module.exports = Hours;
3590
3590
  });
3591
3591
 
3592
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/milliseconds.js
3592
+ // ../../node_modules/prompts/lib/dateparts/milliseconds.js
3593
3593
  var require_milliseconds2 = __commonJS((exports, module) => {
3594
3594
  var DatePart = require_datepart2();
3595
3595
 
@@ -3613,7 +3613,7 @@ var require_milliseconds2 = __commonJS((exports, module) => {
3613
3613
  module.exports = Milliseconds;
3614
3614
  });
3615
3615
 
3616
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/minutes.js
3616
+ // ../../node_modules/prompts/lib/dateparts/minutes.js
3617
3617
  var require_minutes2 = __commonJS((exports, module) => {
3618
3618
  var DatePart = require_datepart2();
3619
3619
 
@@ -3638,7 +3638,7 @@ var require_minutes2 = __commonJS((exports, module) => {
3638
3638
  module.exports = Minutes;
3639
3639
  });
3640
3640
 
3641
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/month.js
3641
+ // ../../node_modules/prompts/lib/dateparts/month.js
3642
3642
  var require_month2 = __commonJS((exports, module) => {
3643
3643
  var DatePart = require_datepart2();
3644
3644
 
@@ -3665,7 +3665,7 @@ var require_month2 = __commonJS((exports, module) => {
3665
3665
  module.exports = Month;
3666
3666
  });
3667
3667
 
3668
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/seconds.js
3668
+ // ../../node_modules/prompts/lib/dateparts/seconds.js
3669
3669
  var require_seconds2 = __commonJS((exports, module) => {
3670
3670
  var DatePart = require_datepart2();
3671
3671
 
@@ -3690,7 +3690,7 @@ var require_seconds2 = __commonJS((exports, module) => {
3690
3690
  module.exports = Seconds;
3691
3691
  });
3692
3692
 
3693
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/year.js
3693
+ // ../../node_modules/prompts/lib/dateparts/year.js
3694
3694
  var require_year2 = __commonJS((exports, module) => {
3695
3695
  var DatePart = require_datepart2();
3696
3696
 
@@ -3715,7 +3715,7 @@ var require_year2 = __commonJS((exports, module) => {
3715
3715
  module.exports = Year;
3716
3716
  });
3717
3717
 
3718
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/dateparts/index.js
3718
+ // ../../node_modules/prompts/lib/dateparts/index.js
3719
3719
  var require_dateparts2 = __commonJS((exports, module) => {
3720
3720
  module.exports = {
3721
3721
  DatePart: require_datepart2(),
@@ -3730,7 +3730,7 @@ var require_dateparts2 = __commonJS((exports, module) => {
3730
3730
  };
3731
3731
  });
3732
3732
 
3733
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/date.js
3733
+ // ../../node_modules/prompts/lib/elements/date.js
3734
3734
  var require_date2 = __commonJS((exports, module) => {
3735
3735
  var color = require_kleur();
3736
3736
  var Prompt = require_prompt2();
@@ -3906,7 +3906,7 @@ ${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
3906
3906
  module.exports = DatePrompt;
3907
3907
  });
3908
3908
 
3909
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/number.js
3909
+ // ../../node_modules/prompts/lib/elements/number.js
3910
3910
  var require_number2 = __commonJS((exports, module) => {
3911
3911
  var color = require_kleur();
3912
3912
  var Prompt = require_prompt2();
@@ -4093,7 +4093,7 @@ ${i ? ` ` : figures.pointerSmall} ${color.red().italic(l)}`, ``);
4093
4093
  module.exports = NumberPrompt;
4094
4094
  });
4095
4095
 
4096
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/multiselect.js
4096
+ // ../../node_modules/prompts/lib/elements/multiselect.js
4097
4097
  var require_multiselect2 = __commonJS((exports, module) => {
4098
4098
  var color = require_kleur();
4099
4099
  var { cursor } = require_src();
@@ -4322,7 +4322,7 @@ Instructions:
4322
4322
  module.exports = MultiselectPrompt;
4323
4323
  });
4324
4324
 
4325
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/autocomplete.js
4325
+ // ../../node_modules/prompts/lib/elements/autocomplete.js
4326
4326
  var require_autocomplete2 = __commonJS((exports, module) => {
4327
4327
  var color = require_kleur();
4328
4328
  var Prompt = require_prompt2();
@@ -4546,7 +4546,7 @@ var require_autocomplete2 = __commonJS((exports, module) => {
4546
4546
  module.exports = AutocompletePrompt;
4547
4547
  });
4548
4548
 
4549
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/autocompleteMultiselect.js
4549
+ // ../../node_modules/prompts/lib/elements/autocompleteMultiselect.js
4550
4550
  var require_autocompleteMultiselect2 = __commonJS((exports, module) => {
4551
4551
  var color = require_kleur();
4552
4552
  var { cursor } = require_src();
@@ -4709,7 +4709,7 @@ Filtered results for: ${this.inputValue ? this.inputValue : color.gray("Enter so
4709
4709
  module.exports = AutocompleteMultiselectPrompt;
4710
4710
  });
4711
4711
 
4712
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/confirm.js
4712
+ // ../../node_modules/prompts/lib/elements/confirm.js
4713
4713
  var require_confirm2 = __commonJS((exports, module) => {
4714
4714
  var color = require_kleur();
4715
4715
  var Prompt = require_prompt2();
@@ -4785,7 +4785,7 @@ var require_confirm2 = __commonJS((exports, module) => {
4785
4785
  module.exports = ConfirmPrompt;
4786
4786
  });
4787
4787
 
4788
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/elements/index.js
4788
+ // ../../node_modules/prompts/lib/elements/index.js
4789
4789
  var require_elements2 = __commonJS((exports, module) => {
4790
4790
  module.exports = {
4791
4791
  TextPrompt: require_text2(),
@@ -4800,7 +4800,7 @@ var require_elements2 = __commonJS((exports, module) => {
4800
4800
  };
4801
4801
  });
4802
4802
 
4803
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/prompts.js
4803
+ // ../../node_modules/prompts/lib/prompts.js
4804
4804
  var require_prompts2 = __commonJS((exports) => {
4805
4805
  var $ = exports;
4806
4806
  var el = require_elements2();
@@ -4861,7 +4861,7 @@ var require_prompts2 = __commonJS((exports) => {
4861
4861
  };
4862
4862
  });
4863
4863
 
4864
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/lib/index.js
4864
+ // ../../node_modules/prompts/lib/index.js
4865
4865
  var require_lib = __commonJS((exports, module) => {
4866
4866
  var prompts = require_prompts2();
4867
4867
  var passOn = ["suggest", "format", "onState", "validate", "onRender", "type"];
@@ -4934,7 +4934,7 @@ var require_lib = __commonJS((exports, module) => {
4934
4934
  module.exports = Object.assign(prompt, { prompt, prompts, inject, override });
4935
4935
  });
4936
4936
 
4937
- // ../../node_modules/.bun/prompts@2.4.2/node_modules/prompts/index.js
4937
+ // ../../node_modules/prompts/index.js
4938
4938
  var require_prompts3 = __commonJS((exports, module) => {
4939
4939
  function isNodeLT(tar) {
4940
4940
  tar = (Array.isArray(tar) ? tar : tar.split(".")).map(Number);
@@ -4950,7 +4950,7 @@ var require_prompts3 = __commonJS((exports, module) => {
4950
4950
  module.exports = isNodeLT("8.6.0") ? require_dist() : require_lib();
4951
4951
  });
4952
4952
 
4953
- // ../../node_modules/.bun/picocolors@1.1.1/node_modules/picocolors/picocolors.js
4953
+ // ../../node_modules/picocolors/picocolors.js
4954
4954
  var require_picocolors = __commonJS((exports, module) => {
4955
4955
  var p = process || {};
4956
4956
  var argv = p.argv || [];
@@ -5027,8 +5027,495 @@ import fs from "node:fs";
5027
5027
  import path from "node:path";
5028
5028
  import { fileURLToPath } from "node:url";
5029
5029
  import { createRequire as createRequire2 } from "node:module";
5030
+ import { spawnSync } from "node:child_process";
5031
+
5032
+ // src/project-manifest.ts
5033
+ import { readFileSync } from "node:fs";
5034
+ var DATA_PROVIDER_CHOICES = ["simple-rest", "supabase", "graphql", "none"];
5035
+ var AUTH_PROVIDER_CHOICES = ["mock", "jwt", "supabase", "none"];
5036
+ function assertJsonObject(candidate, path) {
5037
+ if (candidate === null || typeof candidate !== "object" || Array.isArray(candidate)) {
5038
+ throw new Error(`${path} must be an object`);
5039
+ }
5040
+ }
5041
+ function assertNonEmptyString(candidate, path) {
5042
+ if (typeof candidate !== "string" || candidate.length === 0) {
5043
+ throw new Error(`${path} must be a non-empty string`);
5044
+ }
5045
+ }
5046
+ function assertStringRecord(candidate, path) {
5047
+ assertJsonObject(candidate, path);
5048
+ for (const [key, entry] of Object.entries(candidate)) {
5049
+ assertNonEmptyString(entry, `${path}.${key}`);
5050
+ }
5051
+ }
5052
+ function assertSelectionMap(candidate, choices, path) {
5053
+ assertJsonObject(candidate, path);
5054
+ for (const choice of choices) {
5055
+ const packs = candidate[choice];
5056
+ if (!Array.isArray(packs) || packs.some((pack) => typeof pack !== "string")) {
5057
+ throw new Error(`${path}.${choice} must be an array of dependency-pack names`);
5058
+ }
5059
+ }
5060
+ }
5061
+ function assertDependencyPacks(candidate) {
5062
+ assertJsonObject(candidate, "scaffold manifest.svadmin.dependencyPacks");
5063
+ for (const [packName, pack] of Object.entries(candidate)) {
5064
+ assertStringRecord(pack, `scaffold manifest.svadmin.dependencyPacks.${packName}`);
5065
+ }
5066
+ }
5067
+ function assertReferencedPacksExist(dependencyPacks, selectedPacks) {
5068
+ for (const packName of selectedPacks) {
5069
+ if (!(packName in dependencyPacks)) {
5070
+ throw new Error(`scaffold manifest references unknown dependency pack: ${packName}`);
5071
+ }
5072
+ }
5073
+ }
5074
+ function assertScaffoldManifest(candidate) {
5075
+ assertJsonObject(candidate, "scaffold manifest");
5076
+ assertNonEmptyString(candidate.name, "scaffold manifest.name");
5077
+ assertNonEmptyString(candidate.version, "scaffold manifest.version");
5078
+ if (candidate.private !== true) {
5079
+ throw new Error("scaffold manifest.private must be true");
5080
+ }
5081
+ assertNonEmptyString(candidate.type, "scaffold manifest.type");
5082
+ assertStringRecord(candidate.scripts, "scaffold manifest.scripts");
5083
+ assertStringRecord(candidate.dependencies, "scaffold manifest.dependencies");
5084
+ assertStringRecord(candidate.devDependencies, "scaffold manifest.devDependencies");
5085
+ assertJsonObject(candidate.svadmin, "scaffold manifest.svadmin");
5086
+ assertDependencyPacks(candidate.svadmin.dependencyPacks);
5087
+ assertSelectionMap(candidate.svadmin.dataProviders, DATA_PROVIDER_CHOICES, "scaffold manifest.svadmin.dataProviders");
5088
+ assertSelectionMap(candidate.svadmin.authProviders, AUTH_PROVIDER_CHOICES, "scaffold manifest.svadmin.authProviders");
5089
+ assertReferencedPacksExist(candidate.svadmin.dependencyPacks, [
5090
+ ...Object.values(candidate.svadmin.dataProviders).flat(),
5091
+ ...Object.values(candidate.svadmin.authProviders).flat()
5092
+ ]);
5093
+ }
5094
+ function loadScaffoldManifest(manifestPath) {
5095
+ const parsed = JSON.parse(readFileSync(manifestPath, "utf8"));
5096
+ assertScaffoldManifest(parsed);
5097
+ return parsed;
5098
+ }
5099
+ function mergeDependencyPack(dependencies, pack, packName) {
5100
+ for (const [packageName, version] of Object.entries(pack)) {
5101
+ const existingVersion = dependencies[packageName];
5102
+ if (existingVersion !== undefined && existingVersion !== version) {
5103
+ throw new Error(`Dependency ${packageName} has conflicting versions ${existingVersion} and ${version} in pack ${packName}`);
5104
+ }
5105
+ dependencies[packageName] = version;
5106
+ }
5107
+ }
5108
+ function createProjectPackageJson(scaffold, options) {
5109
+ const dependencies = { ...scaffold.dependencies };
5110
+ const selectedPacks = new Set([
5111
+ ...scaffold.svadmin.dataProviders[options.dataProvider],
5112
+ ...scaffold.svadmin.authProviders[options.authProvider]
5113
+ ]);
5114
+ for (const packName of selectedPacks) {
5115
+ mergeDependencyPack(dependencies, scaffold.svadmin.dependencyPacks[packName], packName);
5116
+ }
5117
+ return {
5118
+ name: options.projectName.trim(),
5119
+ version: scaffold.version,
5120
+ private: scaffold.private,
5121
+ type: scaffold.type,
5122
+ scripts: { ...scaffold.scripts },
5123
+ dependencies,
5124
+ devDependencies: { ...scaffold.devDependencies }
5125
+ };
5126
+ }
5127
+
5128
+ // src/project-maintenance.ts
5129
+ import {
5130
+ constants,
5131
+ copyFileSync,
5132
+ readFileSync as readFileSync2,
5133
+ renameSync,
5134
+ unlinkSync,
5135
+ writeFileSync
5136
+ } from "node:fs";
5137
+ function parseDependencyMap(candidate, path) {
5138
+ if (candidate === undefined)
5139
+ return;
5140
+ assertStringRecord(candidate, path);
5141
+ return { ...candidate };
5142
+ }
5143
+ function parseMaintainedPackageJson(packageJsonCandidate) {
5144
+ assertJsonObject(packageJsonCandidate, "package.json");
5145
+ const packageJson = structuredClone(packageJsonCandidate);
5146
+ const dependencies = parseDependencyMap(packageJsonCandidate.dependencies, "package.json.dependencies");
5147
+ const devDependencies = parseDependencyMap(packageJsonCandidate.devDependencies, "package.json.devDependencies");
5148
+ if (dependencies !== undefined)
5149
+ packageJson.dependencies = dependencies;
5150
+ if (devDependencies !== undefined)
5151
+ packageJson.devDependencies = devDependencies;
5152
+ return packageJson;
5153
+ }
5154
+ function readMaintainedPackageJson(packagePath) {
5155
+ const parsed = JSON.parse(readFileSync2(packagePath, "utf8"));
5156
+ return parseMaintainedPackageJson(parsed);
5157
+ }
5158
+ function allProjectDependencies(project) {
5159
+ return { ...project.dependencies ?? {}, ...project.devDependencies ?? {} };
5160
+ }
5161
+ function selectedDependencyPacks(project, scaffold) {
5162
+ const currentDependencies = allProjectDependencies(project);
5163
+ const directlySelectedPacks = new Set;
5164
+ for (const [packName, pack] of Object.entries(scaffold.svadmin.dependencyPacks)) {
5165
+ const providerPackage = Object.keys(pack).find((packageName) => packageName.startsWith("@svadmin/"));
5166
+ if (providerPackage !== undefined && currentDependencies[providerPackage] !== undefined) {
5167
+ directlySelectedPacks.add(packName);
5168
+ }
5169
+ }
5170
+ const selectedPacks = new Set(directlySelectedPacks);
5171
+ const selections = [
5172
+ ...Object.values(scaffold.svadmin.dataProviders),
5173
+ ...Object.values(scaffold.svadmin.authProviders)
5174
+ ];
5175
+ for (const packs of selections) {
5176
+ if (packs.some((packName) => directlySelectedPacks.has(packName))) {
5177
+ for (const packName of packs)
5178
+ selectedPacks.add(packName);
5179
+ }
5180
+ }
5181
+ return selectedPacks;
5182
+ }
5183
+ function desiredDependencies(project, scaffold) {
5184
+ const desired = new Map;
5185
+ for (const [packageName, version] of Object.entries(scaffold.dependencies)) {
5186
+ desired.set(packageName, { packageName, version, section: "dependencies" });
5187
+ }
5188
+ for (const [packageName, version] of Object.entries(scaffold.devDependencies)) {
5189
+ desired.set(packageName, { packageName, version, section: "devDependencies" });
5190
+ }
5191
+ for (const packName of selectedDependencyPacks(project, scaffold)) {
5192
+ const pack = scaffold.svadmin.dependencyPacks[packName];
5193
+ for (const [packageName, version] of Object.entries(pack)) {
5194
+ const existing = desired.get(packageName);
5195
+ if (existing !== undefined && (existing.version !== version || existing.section !== "dependencies")) {
5196
+ throw new Error(`scaffold dependency ${packageName} has conflicting canonical locations or versions`);
5197
+ }
5198
+ desired.set(packageName, { packageName, version, section: "dependencies" });
5199
+ }
5200
+ }
5201
+ return [...desired.values()];
5202
+ }
5203
+ function compareVersions(left, right) {
5204
+ if (left.major !== right.major)
5205
+ return left.major - right.major;
5206
+ if (left.minor !== right.minor)
5207
+ return left.minor - right.minor;
5208
+ return left.patch - right.patch;
5209
+ }
5210
+ function parseSimpleInterval(branch) {
5211
+ const match = /^([~^]?)(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(branch.trim());
5212
+ if (!match)
5213
+ return null;
5214
+ const operator = match[1];
5215
+ const minimum = {
5216
+ major: Number(match[2]),
5217
+ minor: Number(match[3]),
5218
+ patch: Number(match[4])
5219
+ };
5220
+ let maximumExclusive;
5221
+ if (operator === "^") {
5222
+ maximumExclusive = minimum.major > 0 ? { major: minimum.major + 1, minor: 0, patch: 0 } : minimum.minor > 0 ? { major: 0, minor: minimum.minor + 1, patch: 0 } : { major: 0, minor: 0, patch: minimum.patch + 1 };
5223
+ } else if (operator === "~") {
5224
+ maximumExclusive = { major: minimum.major, minor: minimum.minor + 1, patch: 0 };
5225
+ } else {
5226
+ maximumExclusive = { major: minimum.major, minor: minimum.minor, patch: minimum.patch + 1 };
5227
+ }
5228
+ return { minimum, maximumExclusive };
5229
+ }
5230
+ function parseSimpleRange(range) {
5231
+ const intervals = range.split("||").map(parseSimpleInterval);
5232
+ return intervals.some((interval) => interval === null) ? null : intervals.filter((interval) => interval !== null);
5233
+ }
5234
+ function intervalsOverlap(left, right) {
5235
+ return compareVersions(left.minimum, right.maximumExclusive) < 0 && compareVersions(right.minimum, left.maximumExclusive) < 0;
5236
+ }
5237
+ function rangesClearlyIncompatible(actual, expected) {
5238
+ const actualIntervals = parseSimpleRange(actual);
5239
+ const expectedIntervals = parseSimpleRange(expected);
5240
+ if (actualIntervals === null || expectedIntervals === null)
5241
+ return false;
5242
+ return !actualIntervals.some((actualInterval) => expectedIntervals.some((expectedInterval) => intervalsOverlap(actualInterval, expectedInterval)));
5243
+ }
5244
+ function alternateSection(section) {
5245
+ return section === "dependencies" ? "devDependencies" : "dependencies";
5246
+ }
5247
+ function dependencyState(project, desired) {
5248
+ const alternate = alternateSection(desired.section);
5249
+ return {
5250
+ canonicalVersion: project[desired.section]?.[desired.packageName],
5251
+ alternateVersion: project[alternate]?.[desired.packageName],
5252
+ alternateSection: alternate
5253
+ };
5254
+ }
5255
+ function upgradeAction(instruction) {
5256
+ return `${instruction} by running upgrade --write for this project`;
5257
+ }
5258
+ function missingDependencyIssue(desired) {
5259
+ return {
5260
+ kind: "missing",
5261
+ packageName: desired.packageName,
5262
+ expectedVersion: desired.version,
5263
+ expectedSection: desired.section,
5264
+ action: upgradeAction(`Add ${desired.packageName}@${desired.version} to ${desired.section}`)
5265
+ };
5266
+ }
5267
+ function misplacedDependencyIssue(desired, state) {
5268
+ return {
5269
+ kind: "section",
5270
+ packageName: desired.packageName,
5271
+ expectedVersion: desired.version,
5272
+ actualVersion: state.alternateVersion,
5273
+ expectedSection: desired.section,
5274
+ actualSection: state.alternateSection,
5275
+ action: upgradeAction(`Move ${desired.packageName} to ${desired.section}`)
5276
+ };
5277
+ }
5278
+ function versionDependencyIssue(desired, actualVersion) {
5279
+ const kind = rangesClearlyIncompatible(actualVersion, desired.version) ? "incompatible" : "drift";
5280
+ return {
5281
+ kind,
5282
+ packageName: desired.packageName,
5283
+ expectedVersion: desired.version,
5284
+ actualVersion,
5285
+ expectedSection: desired.section,
5286
+ action: upgradeAction(`Update ${desired.packageName} from ${actualVersion} to ${desired.version}`)
5287
+ };
5288
+ }
5289
+ function duplicateDependencyIssue(desired, state) {
5290
+ return {
5291
+ kind: "section",
5292
+ packageName: desired.packageName,
5293
+ expectedVersion: desired.version,
5294
+ actualVersion: state.alternateVersion,
5295
+ expectedSection: desired.section,
5296
+ actualSection: state.alternateSection,
5297
+ action: upgradeAction(`Remove the duplicate ${desired.packageName} entry from ${state.alternateSection}`)
5298
+ };
5299
+ }
5300
+ function doctorIssueForDependency(project, desired) {
5301
+ const state = dependencyState(project, desired);
5302
+ if (state.canonicalVersion === undefined) {
5303
+ return state.alternateVersion === undefined ? missingDependencyIssue(desired) : misplacedDependencyIssue(desired, state);
5304
+ }
5305
+ if (state.canonicalVersion !== desired.version) {
5306
+ return versionDependencyIssue(desired, state.canonicalVersion);
5307
+ }
5308
+ return state.alternateVersion === undefined ? null : duplicateDependencyIssue(desired, state);
5309
+ }
5310
+ function doctorProjectPackageJson(packageJsonCandidate, scaffold) {
5311
+ const project = parseMaintainedPackageJson(packageJsonCandidate);
5312
+ const issues = desiredDependencies(project, scaffold).map((desired) => doctorIssueForDependency(project, desired)).filter((issue) => issue !== null);
5313
+ return issues.length === 0 ? { status: "clean", exitCode: 0, issues: [] } : { status: "issues", exitCode: 1, issues };
5314
+ }
5315
+ function upgradeChangeForDependency(desired, state) {
5316
+ if (state.canonicalVersion === undefined && state.alternateVersion === undefined) {
5317
+ return { action: "add", packageName: desired.packageName, to: desired.version, section: desired.section };
5318
+ }
5319
+ if (state.canonicalVersion === undefined) {
5320
+ return {
5321
+ action: "move",
5322
+ packageName: desired.packageName,
5323
+ from: state.alternateVersion,
5324
+ to: desired.version,
5325
+ section: desired.section,
5326
+ previousSection: state.alternateSection
5327
+ };
5328
+ }
5329
+ if (state.canonicalVersion === desired.version && state.alternateVersion === undefined)
5330
+ return null;
5331
+ return {
5332
+ action: state.alternateVersion === undefined ? "update" : "move",
5333
+ packageName: desired.packageName,
5334
+ from: state.canonicalVersion,
5335
+ to: desired.version,
5336
+ section: desired.section,
5337
+ previousSection: state.alternateVersion === undefined ? undefined : state.alternateSection
5338
+ };
5339
+ }
5340
+ function applyDesiredDependency(updatedPackageJson, desired) {
5341
+ const canonicalDependencies = updatedPackageJson[desired.section] ?? {};
5342
+ const otherSection = alternateSection(desired.section);
5343
+ const alternateDependencies = updatedPackageJson[otherSection] ?? {};
5344
+ canonicalDependencies[desired.packageName] = desired.version;
5345
+ updatedPackageJson[desired.section] = canonicalDependencies;
5346
+ updatedPackageJson[otherSection] = Object.fromEntries(Object.entries(alternateDependencies).filter(([packageName]) => packageName !== desired.packageName));
5347
+ }
5348
+ function planProjectUpgrade(packageJsonCandidate, scaffold) {
5349
+ const project = parseMaintainedPackageJson(packageJsonCandidate);
5350
+ const updatedPackageJson = structuredClone(project);
5351
+ updatedPackageJson.dependencies = { ...project.dependencies ?? {} };
5352
+ updatedPackageJson.devDependencies = { ...project.devDependencies ?? {} };
5353
+ const changes = [];
5354
+ for (const desired of desiredDependencies(project, scaffold)) {
5355
+ const change = upgradeChangeForDependency(desired, dependencyState(updatedPackageJson, desired));
5356
+ if (change !== null)
5357
+ changes.push(change);
5358
+ applyDesiredDependency(updatedPackageJson, desired);
5359
+ }
5360
+ changes.sort((left, right) => left.section.localeCompare(right.section) || left.packageName.localeCompare(right.packageName));
5361
+ return { changes, updatedPackageJson };
5362
+ }
5363
+ function timestampForBackup(date) {
5364
+ return date.toISOString().replace(/[-:.]/g, "");
5365
+ }
5366
+ function createBackup(packagePath, timestamp) {
5367
+ for (let suffix = 0;suffix < 1000; suffix++) {
5368
+ const suffixText = suffix === 0 ? "" : `-${suffix}`;
5369
+ const backupPath = `${packagePath}.svadmin-backup-${timestamp}${suffixText}`;
5370
+ try {
5371
+ copyFileSync(packagePath, backupPath, constants.COPYFILE_EXCL);
5372
+ return backupPath;
5373
+ } catch (error) {
5374
+ if (error.code !== "EEXIST")
5375
+ throw error;
5376
+ }
5377
+ }
5378
+ throw new Error(`Unable to allocate a unique backup path for ${packagePath}`);
5379
+ }
5380
+ function writePackageJsonAtomically(packagePath, updatedPackageJson, timestamp) {
5381
+ const temporaryPath = `${packagePath}.svadmin-tmp-${process.pid}-${timestamp}`;
5382
+ try {
5383
+ writeFileSync(temporaryPath, `${JSON.stringify(updatedPackageJson, null, 2)}
5384
+ `, {
5385
+ encoding: "utf8",
5386
+ flag: "wx"
5387
+ });
5388
+ renameSync(temporaryPath, packagePath);
5389
+ } catch (error) {
5390
+ try {
5391
+ unlinkSync(temporaryPath);
5392
+ } catch (cleanupError) {
5393
+ if (cleanupError.code !== "ENOENT")
5394
+ throw cleanupError;
5395
+ }
5396
+ throw error;
5397
+ }
5398
+ }
5399
+ function planProjectPackageFileUpgrade(packagePath, scaffold) {
5400
+ const project = readMaintainedPackageJson(packagePath);
5401
+ const plan = planProjectUpgrade(project, scaffold);
5402
+ return { wrote: false, backupPath: null, plan };
5403
+ }
5404
+ function writeProjectPackageJsonUpgrade(packagePath, scaffold, backupDate) {
5405
+ const plannedUpgrade = planProjectPackageFileUpgrade(packagePath, scaffold);
5406
+ if (plannedUpgrade.plan.changes.length === 0)
5407
+ return plannedUpgrade;
5408
+ const timestamp = timestampForBackup(backupDate);
5409
+ const backupPath = createBackup(packagePath, timestamp);
5410
+ writePackageJsonAtomically(packagePath, plannedUpgrade.plan.updatedPackageJson, timestamp);
5411
+ return { wrote: true, backupPath, plan: plannedUpgrade.plan };
5412
+ }
5413
+
5414
+ // src/index.ts
5030
5415
  var __filename2 = fileURLToPath(import.meta.url);
5031
5416
  var __dirname2 = path.dirname(__filename2);
5417
+ function loadShippedScaffoldManifest() {
5418
+ return loadScaffoldManifest(path.join(__dirname2, "..", "scaffold-manifest.json"));
5419
+ }
5420
+ function projectDirectoryFromArguments(positional) {
5421
+ if (positional.length > 1) {
5422
+ throw new Error(`Expected at most one project directory, received: ${positional.join(", ")}`);
5423
+ }
5424
+ return path.resolve(process.cwd(), positional[0] ?? ".");
5425
+ }
5426
+ function doctorProjectDirectory(args) {
5427
+ const unknownOption = args.find((argument) => argument.startsWith("-"));
5428
+ if (unknownOption !== undefined)
5429
+ throw new Error(`Unknown option: ${unknownOption}`);
5430
+ return projectDirectoryFromArguments(args);
5431
+ }
5432
+ function parseUpgradeArguments(args) {
5433
+ let write = false;
5434
+ const positional = [];
5435
+ for (const argument of args) {
5436
+ if (argument === "--write") {
5437
+ write = true;
5438
+ } else if (argument.startsWith("-")) {
5439
+ throw new Error(`Unknown option: ${argument}`);
5440
+ } else {
5441
+ positional.push(argument);
5442
+ }
5443
+ }
5444
+ return { projectDirectory: projectDirectoryFromArguments(positional), write };
5445
+ }
5446
+ function doctorIssueMessage(issue) {
5447
+ const actualDescription = issue.actualVersion === undefined ? "missing" : `${issue.actualVersion}${issue.actualSection ? ` in ${issue.actualSection}` : ""}`;
5448
+ return `${issue.packageName}: ${issue.kind}; expected ${issue.expectedVersion} in ` + `${issue.expectedSection}, found ${actualDescription}`;
5449
+ }
5450
+ function upgradeChangeMessage(change) {
5451
+ if (change.action === "add") {
5452
+ return `add ${change.packageName}@${change.to} to ${change.section}`;
5453
+ }
5454
+ if (change.action === "move") {
5455
+ return `move ${change.packageName} to ${change.section} and set ${change.to}`;
5456
+ }
5457
+ return `update ${change.packageName} from ${change.from ?? "missing"} to ${change.to}`;
5458
+ }
5459
+ function printDoctorIssue(issue) {
5460
+ const marker = issue.kind === "drift" || issue.kind === "section" ? import_picocolors.default.yellow(" ⚠") : import_picocolors.default.red(" ✗");
5461
+ console.log(`${marker} ${doctorIssueMessage(issue)}`);
5462
+ console.log(import_picocolors.default.dim(` → ${issue.action}`));
5463
+ }
5464
+ function printDoctorReport(report, projectDirectory) {
5465
+ console.log();
5466
+ console.log(import_picocolors.default.bold(`svadmin doctor — ${projectDirectory}`));
5467
+ if (report.status === "clean") {
5468
+ console.log(import_picocolors.default.green(" ✔ Dependencies match the shipped svadmin scaffold."));
5469
+ } else {
5470
+ for (const issue of report.issues)
5471
+ printDoctorIssue(issue);
5472
+ console.log();
5473
+ console.log(import_picocolors.default.yellow(` ${report.issues.length} actionable issue(s) found.`));
5474
+ }
5475
+ console.log();
5476
+ }
5477
+ function doctor(args) {
5478
+ const projectDirectory = doctorProjectDirectory(args);
5479
+ const project = readMaintainedPackageJson(path.join(projectDirectory, "package.json"));
5480
+ const report = doctorProjectPackageJson(project, loadShippedScaffoldManifest());
5481
+ printDoctorReport(report, projectDirectory);
5482
+ process.exitCode = report.exitCode;
5483
+ }
5484
+ function printUpgradeChanges(upgradeExecution) {
5485
+ for (const change of upgradeExecution.plan.changes) {
5486
+ console.log(` ${import_picocolors.default.cyan("•")} ${upgradeChangeMessage(change)}`);
5487
+ }
5488
+ console.log();
5489
+ }
5490
+ function printUpgradeOutcome(upgradeExecution, packagePath) {
5491
+ if (upgradeExecution.wrote) {
5492
+ console.log(import_picocolors.default.green(" ✔ package.json updated."));
5493
+ console.log(` Backup: ${import_picocolors.default.cyan(upgradeExecution.backupPath)}`);
5494
+ console.log(` Restore by copying the backup over: ${import_picocolors.default.cyan(packagePath)}`);
5495
+ } else {
5496
+ console.log(import_picocolors.default.yellow(" Dry run only; package.json was not changed."));
5497
+ console.log(" Re-run this command with --write to apply the plan.");
5498
+ }
5499
+ console.log();
5500
+ }
5501
+ function printUpgradeExecution(upgradeExecution, projectDirectory, packagePath) {
5502
+ console.log();
5503
+ console.log(import_picocolors.default.bold(`svadmin upgrade — ${projectDirectory}`));
5504
+ if (upgradeExecution.plan.changes.length === 0) {
5505
+ console.log(import_picocolors.default.green(" ✔ package.json already matches the shipped scaffold."));
5506
+ console.log();
5507
+ return;
5508
+ }
5509
+ printUpgradeChanges(upgradeExecution);
5510
+ printUpgradeOutcome(upgradeExecution, packagePath);
5511
+ }
5512
+ function upgrade(args) {
5513
+ const commandArguments = parseUpgradeArguments(args);
5514
+ const packagePath = path.join(commandArguments.projectDirectory, "package.json");
5515
+ const scaffoldManifest = loadShippedScaffoldManifest();
5516
+ const upgradeExecution = commandArguments.write ? writeProjectPackageJsonUpgrade(packagePath, scaffoldManifest, new Date) : planProjectPackageFileUpgrade(packagePath, scaffoldManifest);
5517
+ printUpgradeExecution(upgradeExecution, commandArguments.projectDirectory, packagePath);
5518
+ }
5032
5519
  async function init() {
5033
5520
  console.log();
5034
5521
  console.log(import_picocolors.default.cyan(" ╔═══════════════════════════════════╗"));
@@ -5096,6 +5583,7 @@ Operation cancelled.
5096
5583
  ${import_picocolors.default.bold("Scaffolding")} project in ${import_picocolors.default.green(projectDir)}...
5097
5584
  `);
5098
5585
  const templateDir = path.join(__dirname2, "..", "template");
5586
+ const scaffoldManifest = loadShippedScaffoldManifest();
5099
5587
  function copyDir(src, dest) {
5100
5588
  fs.mkdirSync(dest, { recursive: true });
5101
5589
  const entries = fs.readdirSync(src, { withFileTypes: true });
@@ -5113,52 +5601,13 @@ ${import_picocolors.default.bold("Scaffolding")} project in ${import_picocolors.
5113
5601
  copyDir(templateDir, projectDir);
5114
5602
  console.log(import_picocolors.default.green(" ✔") + " Template files copied");
5115
5603
  }
5116
- const packageJson = {
5117
- name: response.projectName,
5118
- version: "0.1.0",
5119
- private: true,
5120
- type: "module",
5121
- scripts: {
5122
- dev: "vite",
5123
- build: "vite build",
5124
- preview: "vite preview",
5125
- check: "svelte-check --tsconfig ./tsconfig.json"
5126
- },
5127
- dependencies: {
5128
- "@svadmin/core": "^0.31.0",
5129
- "@svadmin/ui": "^0.38.0",
5130
- "@tanstack/svelte-query": "^6.1.29",
5131
- "highlight.js": "^11.11.1",
5132
- "@lucide/svelte": "^1.17.0"
5133
- },
5134
- devDependencies: {
5135
- "@sveltejs/vite-plugin-svelte": "^7.0.0",
5136
- "@tailwindcss/vite": "^4.2.2",
5137
- svelte: "^5.55.1",
5138
- "svelte-check": "^4.4.8",
5139
- tailwindcss: "^4.2.2",
5140
- "tw-animate-css": "^1.4.0",
5141
- typescript: "^6.0.0",
5142
- vite: "^8.0.3"
5143
- }
5144
- };
5145
- const dpMap = {
5146
- "simple-rest": { "@svadmin/simple-rest": "^0.9.8", "@refinedev/simple-rest": "^5.0.0" },
5147
- supabase: { "@svadmin/supabase": "^0.11.3", "@supabase/supabase-js": "^2.101.1" },
5148
- graphql: { "@svadmin/graphql": "^0.9.9", "graphql-request": "^7.4.0", graphql: "^16.8.0" }
5149
- };
5150
- if (dpMap[response.dataProvider]) {
5151
- Object.assign(packageJson.dependencies, dpMap[response.dataProvider]);
5152
- }
5153
- if (response.authProvider === "supabase" && response.dataProvider !== "supabase") {
5154
- packageJson.dependencies["@svadmin/supabase"] = "^0.11.3";
5155
- packageJson.dependencies["@supabase/supabase-js"] = "^2.101.1";
5156
- }
5157
- if (response.authProvider === "jwt" && response.dataProvider !== "simple-rest") {
5158
- packageJson.dependencies["@svadmin/simple-rest"] = "^0.9.8";
5159
- packageJson.dependencies["@refinedev/simple-rest"] = "^5.0.0";
5160
- }
5161
- fs.writeFileSync(path.join(projectDir, "package.json"), JSON.stringify(packageJson, null, 2));
5604
+ const packageJson = createProjectPackageJson(scaffoldManifest, {
5605
+ projectName: response.projectName,
5606
+ dataProvider: response.dataProvider,
5607
+ authProvider: response.authProvider
5608
+ });
5609
+ fs.writeFileSync(path.join(projectDir, "package.json"), `${JSON.stringify(packageJson, null, 2)}
5610
+ `);
5162
5611
  console.log(import_picocolors.default.green(" ✔") + " package.json generated");
5163
5612
  fs.writeFileSync(path.join(projectDir, ".gitignore"), `node_modules
5164
5613
  dist
@@ -5193,13 +5642,10 @@ bun run dev
5193
5642
  console.log(`
5194
5643
  ${import_picocolors.default.bold("Installing dependencies...")}
5195
5644
  `);
5196
- const { execSync } = await import("child_process");
5197
- try {
5198
- execSync("bun install", { cwd: projectDir, stdio: "inherit" });
5199
- } catch {
5200
- try {
5201
- execSync("npm install", { cwd: projectDir, stdio: "inherit" });
5202
- } catch {
5645
+ const bunInstall = spawnSync("bun", ["install"], { cwd: projectDir, stdio: "inherit" });
5646
+ if (bunInstall.status !== 0) {
5647
+ const npmInstall = spawnSync("npm", ["install"], { cwd: projectDir, stdio: "inherit" });
5648
+ if (npmInstall.status !== 0) {
5203
5649
  console.log(import_picocolors.default.yellow("\n ⚠ Auto-install failed. Run `bun install` or `npm install` manually."));
5204
5650
  }
5205
5651
  }
@@ -5308,8 +5754,21 @@ async function eject(args) {
5308
5754
  console.log();
5309
5755
  }
5310
5756
  var [, , subcommand, ...rest] = process.argv;
5757
+ var runCommand = (command) => {
5758
+ Promise.resolve().then(command).catch((error) => {
5759
+ const message = error instanceof Error ? error.message : String(error);
5760
+ console.error(import_picocolors.default.red(`
5761
+ ✗ ${message}
5762
+ `));
5763
+ process.exitCode = 2;
5764
+ });
5765
+ };
5311
5766
  if (subcommand === "eject") {
5312
- eject(rest).catch(console.error);
5767
+ runCommand(() => eject(rest));
5768
+ } else if (subcommand === "doctor") {
5769
+ runCommand(() => doctor(rest));
5770
+ } else if (subcommand === "upgrade") {
5771
+ runCommand(() => upgrade(rest));
5313
5772
  } else {
5314
- init().catch(console.error);
5773
+ runCommand(init);
5315
5774
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/create",
3
- "version": "0.12.3",
3
+ "version": "0.13.0",
4
4
  "description": "Scaffolding tool for svadmin projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,10 +8,13 @@
8
8
  },
9
9
  "files": [
10
10
  "dist",
11
- "template"
11
+ "template",
12
+ "scaffold-manifest.json"
12
13
  ],
13
14
  "scripts": {
14
15
  "build": "bun build src/index.ts --outdir dist --target node --format esm",
16
+ "test": "bun test src",
17
+ "check:compat": "bun ../../scripts/check-create-svadmin-compat.ts",
15
18
  "sync-template": "bun src/sync-template.ts",
16
19
  "prepublishOnly": "bun run build"
17
20
  },
@@ -20,9 +23,9 @@
20
23
  "picocolors": "^1.1.1"
21
24
  },
22
25
  "devDependencies": {
23
- "@types/node": "^26.1.1",
26
+ "@types/node": "^26.2.0",
24
27
  "@types/prompts": "^2.4.9",
25
- "typescript": "^6.0.3"
28
+ "typescript": "^7.0.2"
26
29
  },
27
30
  "keywords": [
28
31
  "svadmin",
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "svadmin-app",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "check": "svelte-check --tsconfig ./tsconfig.json"
11
+ },
12
+ "dependencies": {
13
+ "@svadmin/core": "^0.35.0",
14
+ "@svadmin/ui": "^0.41.0",
15
+ "@tanstack/svelte-query": "^6.1.38",
16
+ "highlight.js": "^11.11.1",
17
+ "@lucide/svelte": "^1.30.0"
18
+ },
19
+ "devDependencies": {
20
+ "@sveltejs/vite-plugin-svelte": "^7.3.0",
21
+ "@tailwindcss/vite": "^4.3.3",
22
+ "svelte": "^5.56.8",
23
+ "svelte-check": "^4.7.5",
24
+ "tailwindcss": "^4.3.3",
25
+ "tw-animate-css": "^1.4.0",
26
+ "typescript": "~6.0.3",
27
+ "vite": "^8.2.1"
28
+ },
29
+ "svadmin": {
30
+ "dependencyPacks": {
31
+ "refine-core": {
32
+ "@refinedev/core": "^5.0.12"
33
+ },
34
+ "simple-rest": {
35
+ "@svadmin/simple-rest": "^0.9.11",
36
+ "@refinedev/simple-rest": "^6.0.1"
37
+ },
38
+ "supabase": {
39
+ "@svadmin/supabase": "^0.11.8",
40
+ "@supabase/supabase-js": "^2.112.2",
41
+ "@refinedev/supabase": "^6.0.2"
42
+ },
43
+ "graphql": {
44
+ "@svadmin/graphql": "^0.9.11",
45
+ "@refinedev/graphql": "^8.0.1",
46
+ "graphql-request": "^7.4.0",
47
+ "graphql": "^16.8.0"
48
+ }
49
+ },
50
+ "dataProviders": {
51
+ "simple-rest": ["refine-core", "simple-rest"],
52
+ "supabase": ["refine-core", "supabase"],
53
+ "graphql": ["refine-core", "graphql"],
54
+ "none": []
55
+ },
56
+ "authProviders": {
57
+ "mock": [],
58
+ "jwt": ["refine-core", "simple-rest"],
59
+ "supabase": ["refine-core", "supabase"],
60
+ "none": []
61
+ }
62
+ }
63
+ }