@roster-lock/config-editor-cli 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/.claude-plugin/plugin.json +6 -0
  2. package/LICENSE.md +11 -0
  3. package/README.md +40 -0
  4. package/dist/commands/draft/from-lock.js +31 -0
  5. package/dist/commands/draft/from-lock.js.map +1 -0
  6. package/dist/commands/draft/index.js +22 -0
  7. package/dist/commands/draft/index.js.map +1 -0
  8. package/dist/commands/draft/init.js +25 -0
  9. package/dist/commands/draft/init.js.map +1 -0
  10. package/dist/commands/draft/promote.js +24 -0
  11. package/dist/commands/draft/promote.js.map +1 -0
  12. package/dist/commands/draft/publish.js +26 -0
  13. package/dist/commands/draft/publish.js.map +1 -0
  14. package/dist/commands/draft/validate.js +30 -0
  15. package/dist/commands/draft/validate.js.map +1 -0
  16. package/dist/commands/engine/add-asset.js +44 -0
  17. package/dist/commands/engine/add-asset.js.map +1 -0
  18. package/dist/commands/engine/add-piece-type.js +47 -0
  19. package/dist/commands/engine/add-piece-type.js.map +1 -0
  20. package/dist/commands/engine/edit-definition.js +49 -0
  21. package/dist/commands/engine/edit-definition.js.map +1 -0
  22. package/dist/commands/engine/index.js +24 -0
  23. package/dist/commands/engine/index.js.map +1 -0
  24. package/dist/commands/engine/remove-asset.js +27 -0
  25. package/dist/commands/engine/remove-asset.js.map +1 -0
  26. package/dist/commands/engine/remove-piece-type.js +28 -0
  27. package/dist/commands/engine/remove-piece-type.js.map +1 -0
  28. package/dist/commands/engine/set-info.js +22 -0
  29. package/dist/commands/engine/set-info.js.map +1 -0
  30. package/dist/commands/engine/show.js +23 -0
  31. package/dist/commands/engine/show.js.map +1 -0
  32. package/dist/commands/piece-meta/index.js +19 -0
  33. package/dist/commands/piece-meta/index.js.map +1 -0
  34. package/dist/commands/piece-meta/set.js +27 -0
  35. package/dist/commands/piece-meta/set.js.map +1 -0
  36. package/dist/commands/piece-meta/show.js +15 -0
  37. package/dist/commands/piece-meta/show.js.map +1 -0
  38. package/dist/commands/roster/add-piece.js +93 -0
  39. package/dist/commands/roster/add-piece.js.map +1 -0
  40. package/dist/commands/roster/edit-piece.js +92 -0
  41. package/dist/commands/roster/edit-piece.js.map +1 -0
  42. package/dist/commands/roster/import-piece.js +83 -0
  43. package/dist/commands/roster/import-piece.js.map +1 -0
  44. package/dist/commands/roster/index.js +24 -0
  45. package/dist/commands/roster/index.js.map +1 -0
  46. package/dist/commands/roster/list.js +24 -0
  47. package/dist/commands/roster/list.js.map +1 -0
  48. package/dist/commands/roster/remove-piece.js +30 -0
  49. package/dist/commands/roster/remove-piece.js.map +1 -0
  50. package/dist/commands/roster/rescan.js +55 -0
  51. package/dist/commands/roster/rescan.js.map +1 -0
  52. package/dist/commands/roster/test-download.js +72 -0
  53. package/dist/commands/roster/test-download.js.map +1 -0
  54. package/dist/commands/selection/add-script.js +43 -0
  55. package/dist/commands/selection/add-script.js.map +1 -0
  56. package/dist/commands/selection/index.js +21 -0
  57. package/dist/commands/selection/index.js.map +1 -0
  58. package/dist/commands/selection/run-script.js +27 -0
  59. package/dist/commands/selection/run-script.js.map +1 -0
  60. package/dist/commands/selection/set.js +41 -0
  61. package/dist/commands/selection/set.js.map +1 -0
  62. package/dist/commands/selection/show.js +15 -0
  63. package/dist/commands/selection/show.js.map +1 -0
  64. package/dist/commands/show.js +15 -0
  65. package/dist/commands/show.js.map +1 -0
  66. package/dist/commands/validate.js +31 -0
  67. package/dist/commands/validate.js.map +1 -0
  68. package/dist/index.js +55 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/lib/cli-options.js +7 -0
  71. package/dist/lib/cli-options.js.map +1 -0
  72. package/dist/lib/draft-io.js +38 -0
  73. package/dist/lib/draft-io.js.map +1 -0
  74. package/dist/lib/errors.js +32 -0
  75. package/dist/lib/errors.js.map +1 -0
  76. package/dist/lib/fs-walk.js +28 -0
  77. package/dist/lib/fs-walk.js.map +1 -0
  78. package/dist/lib/json-input.js +16 -0
  79. package/dist/lib/json-input.js.map +1 -0
  80. package/dist/lib/lock-io.js +20 -0
  81. package/dist/lib/lock-io.js.map +1 -0
  82. package/dist/lib/parse.js +52 -0
  83. package/dist/lib/parse.js.map +1 -0
  84. package/dist/lib/piece-scan.js +12 -0
  85. package/dist/lib/piece-scan.js.map +1 -0
  86. package/dist/lib/schema-help.js +38 -0
  87. package/dist/lib/schema-help.js.map +1 -0
  88. package/dist/lib/schemas.js +71 -0
  89. package/dist/lib/schemas.js.map +1 -0
  90. package/dist/lib/semver-report.js +13 -0
  91. package/dist/lib/semver-report.js.map +1 -0
  92. package/dist/lib/slugify.js +13 -0
  93. package/dist/lib/slugify.js.map +1 -0
  94. package/dist/version.js +5 -0
  95. package/dist/version.js.map +1 -0
  96. package/package.json +49 -0
  97. package/scripts/bundle.js +15 -0
  98. package/scripts/generate-version.js +14 -0
  99. package/skills/rosterlock-config-editor/SKILL.md +151 -0
  100. package/src/commands/draft/from-lock.ts +34 -0
  101. package/src/commands/draft/index.ts +5 -0
  102. package/src/commands/draft/init.ts +21 -0
  103. package/src/commands/draft/promote.ts +24 -0
  104. package/src/commands/draft/publish.ts +26 -0
  105. package/src/commands/draft/validate.ts +30 -0
  106. package/src/commands/engine/add-asset.ts +46 -0
  107. package/src/commands/engine/add-piece-type.ts +56 -0
  108. package/src/commands/engine/edit-definition.ts +58 -0
  109. package/src/commands/engine/index.ts +7 -0
  110. package/src/commands/engine/remove-asset.ts +25 -0
  111. package/src/commands/engine/remove-piece-type.ts +27 -0
  112. package/src/commands/engine/set-info.ts +17 -0
  113. package/src/commands/engine/show.ts +20 -0
  114. package/src/commands/piece-meta/index.ts +2 -0
  115. package/src/commands/piece-meta/set.ts +29 -0
  116. package/src/commands/piece-meta/show.ts +12 -0
  117. package/src/commands/roster/add-piece.ts +109 -0
  118. package/src/commands/roster/edit-piece.ts +99 -0
  119. package/src/commands/roster/import-piece.ts +112 -0
  120. package/src/commands/roster/index.ts +7 -0
  121. package/src/commands/roster/list.ts +23 -0
  122. package/src/commands/roster/remove-piece.ts +28 -0
  123. package/src/commands/roster/rescan.ts +63 -0
  124. package/src/commands/roster/test-download.ts +76 -0
  125. package/src/commands/selection/add-script.ts +44 -0
  126. package/src/commands/selection/index.ts +4 -0
  127. package/src/commands/selection/run-script.ts +30 -0
  128. package/src/commands/selection/set.ts +54 -0
  129. package/src/commands/selection/show.ts +12 -0
  130. package/src/commands/show.ts +12 -0
  131. package/src/commands/validate.ts +26 -0
  132. package/src/index.ts +85 -0
  133. package/src/lib/cli-options.ts +8 -0
  134. package/src/lib/draft-io.ts +41 -0
  135. package/src/lib/errors.ts +30 -0
  136. package/src/lib/fs-walk.ts +31 -0
  137. package/src/lib/json-input.ts +21 -0
  138. package/src/lib/lock-io.ts +18 -0
  139. package/src/lib/parse.ts +42 -0
  140. package/src/lib/piece-scan.ts +19 -0
  141. package/src/lib/schema-help.ts +44 -0
  142. package/src/lib/schemas.ts +100 -0
  143. package/src/lib/semver-report.ts +11 -0
  144. package/src/lib/slugify.ts +9 -0
  145. package/test.rosterlock.draft.json +62 -0
  146. package/tests/commands/add-piece.spec.ts +92 -0
  147. package/tests/commands/draft-validate.spec.ts +85 -0
  148. package/tests/commands/edit-definition.spec.ts +94 -0
  149. package/tests/commands/edit-piece.spec.ts +153 -0
  150. package/tests/commands/from-lock.spec.ts +80 -0
  151. package/tests/commands/help-arguments.spec.ts +31 -0
  152. package/tests/commands/import-piece.spec.ts +228 -0
  153. package/tests/commands/piece-meta.spec.ts +123 -0
  154. package/tests/commands/rescan.spec.ts +137 -0
  155. package/tests/lib/draft-io.spec.ts +76 -0
  156. package/tests/lib/errors.spec.ts +48 -0
  157. package/tests/lib/fs-walk.spec.ts +35 -0
  158. package/tests/lib/json-input.spec.ts +63 -0
  159. package/tests/lib/parse.spec.ts +85 -0
  160. package/tests/lib/schema-help.spec.ts +42 -0
  161. package/tests/lib/schemas.spec.ts +82 -0
  162. package/tests/lib/slugify.spec.ts +28 -0
  163. package/tsconfig.json +19 -0
  164. package/tsconfig.test.json +10 -0
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addScriptCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const utils_1 = require("@roster-lock/utils");
8
+ const shared_1 = require("@roster-lock/shared");
9
+ const draft_io_1 = require("../../lib/draft-io");
10
+ const cli_options_1 = require("../../lib/cli-options");
11
+ const errors_1 = require("../../lib/errors");
12
+ const fs_walk_1 = require("../../lib/fs-walk");
13
+ exports.addScriptCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("add-script"))
14
+ .description("Add one or more selection scripts (a single file, or every file in a folder) to the staged lock")
15
+ .argument("<fileOrFolder>", "path to a single script file, or a folder of script files")
16
+ .option("--key <relPath>", "script key to use when adding a single file (defaults to its basename)")
17
+ .action((0, errors_1.withErrorHandling)(async (fileOrFolder, opts) => {
18
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
19
+ const draft = (0, draft_io_1.readDraft)(draftPath);
20
+ const target = (0, node_path_1.resolve)(process.cwd(), fileOrFolder);
21
+ const stats = (0, node_fs_1.statSync)(target);
22
+ const lastLoad = Date.now();
23
+ const entries = [];
24
+ if (stats.isDirectory()) {
25
+ for await (const relativePath of (0, fs_walk_1.walkRelative)(target)) {
26
+ entries.push({ key: relativePath, absolutePath: (0, node_path_1.resolve)(target, relativePath) });
27
+ }
28
+ }
29
+ else {
30
+ entries.push({ key: opts.key ?? (0, node_path_1.basename)(target), absolutePath: target });
31
+ }
32
+ for (const { key, absolutePath } of entries) {
33
+ const contentRaw = (0, node_fs_1.readFileSync)(absolutePath);
34
+ const content = (0, utils_1.bufferToStr)(contentRaw);
35
+ const sha = await (0, utils_1.createShaFromBuffer)(contentRaw);
36
+ draft.stagedLock.selection.scriptDictionary[key] = { content };
37
+ draft.draft.selectionScriptInfo[key] = { lastLoad, sha, referencePath: absolutePath };
38
+ }
39
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
40
+ (0, draft_io_1.writeDraft)(draftPath, draft);
41
+ console.log(`Added ${entries.length} script(s): ${entries.map((e) => e.key).join(", ")}`);
42
+ }));
43
+ //# sourceMappingURL=add-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-script.js","sourceRoot":"","sources":["../../../src/commands/selection/add-script.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,qCAAiD;AACjD,yCAA8C;AAC9C,8CAAsE;AACtE,gDAAsE;AACtE,iDAA6E;AAC7E,uDAAwD;AACxD,6CAAqD;AACrD,+CAAiD;AAEpC,QAAA,gBAAgB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,YAAY,CAAC,CAAC;KACvE,WAAW,CAAC,iGAAiG,CAAC;KAC9G,QAAQ,CAAC,gBAAgB,EAAE,2DAA2D,CAAC;KACvF,MAAM,CAAC,iBAAiB,EAAE,wEAAwE,CAAC;KACnG,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,YAAoB,EAAE,IAAsC,EAAE,EAAE;IAC/F,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAiD,EAAE,CAAC;IACjE,IAAG,KAAK,CAAC,WAAW,EAAE,EAAC,CAAC;QACtB,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,IAAA,sBAAY,EAAC,MAAM,CAAC,EAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,IAAA,mBAAO,EAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAA,oBAAQ,EAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAI,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,OAAO,EAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAA,sBAAY,EAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,UAAU,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,IAAA,2BAAmB,EAAC,UAAU,CAAC,CAAC;QAElD,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QAC/D,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACxF,CAAC;IAED,wCAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,IAAA,qBAAU,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5F,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./add-script"), exports);
18
+ __exportStar(require("./set"), exports);
19
+ __exportStar(require("./run-script"), exports);
20
+ __exportStar(require("./show"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/selection/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,wCAAsB;AACtB,+CAA6B;AAC7B,yCAAuB"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runScriptCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const node_fs_1 = require("node:fs");
6
+ const plugin_runtime_1 = require("@roster-lock/plugin-runtime");
7
+ const draft_io_1 = require("../../lib/draft-io");
8
+ const cli_options_1 = require("../../lib/cli-options");
9
+ const errors_1 = require("../../lib/errors");
10
+ exports.runScriptCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("run-script"))
11
+ .description("Run a selection script from the staged lock against sample input, without modifying the draft")
12
+ .argument("<scriptRef>", "the script's key in scriptDictionary")
13
+ .requiredOption("--input <jsonFile>", "JSON file with { purpose: ScriptPurposeInput, randomSeeds?: string[] }")
14
+ .option("--method <name>", "exported function to call (default: main)")
15
+ .action((0, errors_1.withErrorHandling)(async (scriptRef, opts) => {
16
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
17
+ const draft = (0, draft_io_1.readDraft)(draftPath);
18
+ const input = JSON.parse((0, node_fs_1.readFileSync)(opts.input, "utf-8"));
19
+ const result = await (0, plugin_runtime_1.runUntrustedScript)(plugin_runtime_1.DEFAULT_PLUGIN_DIR, {
20
+ config: draft.stagedLock,
21
+ randomSeeds: input.randomSeeds ?? [],
22
+ purpose: input.purpose,
23
+ entryScript: { src: scriptRef, method: opts.method },
24
+ });
25
+ console.log(JSON.stringify(result, null, 2));
26
+ }));
27
+ //# sourceMappingURL=run-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-script.js","sourceRoot":"","sources":["../../../src/commands/selection/run-script.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,qCAAuC;AACvC,gEAAqF;AAErF,iDAAiE;AACjE,uDAAwD;AACxD,6CAAqD;AAExC,QAAA,gBAAgB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,YAAY,CAAC,CAAC;KACvE,WAAW,CAAC,+FAA+F,CAAC;KAC5G,QAAQ,CAAC,aAAa,EAAE,sCAAsC,CAAC;KAC/D,cAAc,CAAC,oBAAoB,EAAE,wEAAwE,CAAC;KAC9G,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;KACtE,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,SAAiB,EAAE,IAAwD,EAAE,EAAE;IAC9G,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAEzD,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAkB,EAAC,mCAAkB,EAAE;QAC1D,MAAM,EAAE,KAAK,CAAC,UAAU;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;KACrD,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectionSetCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const shared_1 = require("@roster-lock/shared");
6
+ const utils_1 = require("@roster-lock/utils");
7
+ const draft_io_1 = require("../../lib/draft-io");
8
+ const cli_options_1 = require("../../lib/cli-options");
9
+ const errors_1 = require("../../lib/errors");
10
+ const json_input_1 = require("../../lib/json-input");
11
+ const schemas_1 = require("../../lib/schemas");
12
+ const schema_help_1 = require("../../lib/schema-help");
13
+ const TEMPLATES = {
14
+ normal: shared_1.EMPTY_ROSTER_NORMAL_SELECTION,
15
+ preselected: shared_1.EMPTY_ROSTER_PRESELECTED_SELECTION,
16
+ unselectable: shared_1.EMPTY_ROSTER_UNSELECTABLE_SELECTION,
17
+ "game-controlled": shared_1.EMPTY_ROSTER_GAME_SELECTION,
18
+ };
19
+ const JSON_SHAPE_BY_TYPE = Object.entries(schemas_1.selectionOverridesSchemas)
20
+ .map(([type, schema]) => `${type}: ${(0, schema_help_1.describeSchemaShape)(schema)}`)
21
+ .join("; ");
22
+ exports.selectionSetCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("set"))
23
+ .description("Set the selection config for a piece type")
24
+ .argument("<pieceType>", "the piece type key")
25
+ .requiredOption("--type <type>", "normal|preselected|unselectable|game-controlled")
26
+ .option("--json <file>", "type-specific fields to merge in, read from a JSON file (or \"-\" for stdin); shape depends on --type. " +
27
+ `Shapes: ${JSON_SHAPE_BY_TYPE}`)
28
+ .action((0, errors_1.withErrorHandling)(async (pieceType, opts) => {
29
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
30
+ const draft = (0, draft_io_1.readDraft)(draftPath);
31
+ const template = TEMPLATES[opts.type];
32
+ if (!template)
33
+ throw new Error(`Invalid --type "${opts.type}" (expected normal|preselected|unselectable|game-controlled)`);
34
+ const overridesSchema = schemas_1.selectionOverridesSchemas[opts.type];
35
+ const overrides = opts.json ? await (0, json_input_1.readJsonInput)(opts.json, overridesSchema) : {};
36
+ draft.stagedLock.selection.piece[pieceType] = { ...(0, utils_1.cloneJSON)(template), ...overrides };
37
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
38
+ (0, draft_io_1.writeDraft)(draftPath, draft);
39
+ console.log(`Set selection for "${pieceType}" to "${opts.type}"`);
40
+ }));
41
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/selection/set.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AAEpC,gDAM6B;AAC7B,8CAA+C;AAC/C,iDAA6E;AAC7E,uDAAwD;AACxD,6CAAqD;AACrD,qDAAqD;AACrD,+CAA8D;AAC9D,uDAA4D;AAE5D,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE,sCAA6B;IACrC,WAAW,EAAE,2CAAkC;IAC/C,YAAY,EAAE,4CAAmC;IACjD,iBAAiB,EAAE,oCAA2B;CACtC,CAAC;AAEX,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,mCAAyB,CAAC;KACjE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAA,iCAAmB,EAAC,MAAM,CAAC,EAAE,CAAC;KAClE,IAAI,CAAC,IAAI,CAAC,CAAC;AAED,QAAA,mBAAmB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,KAAK,CAAC,CAAC;KACnE,WAAW,CAAC,2CAA2C,CAAC;KACxD,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC7C,cAAc,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAClF,MAAM,CACL,eAAe,EACf,yGAAyG;IACzG,WAAW,kBAAkB,EAAE,CAChC;KACA,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,SAAiB,EAAE,IAAqD,EAAE,EAAE;IAC3G,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAA8B,CAAC,CAAC;IAChE,IAAG,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,8DAA8D,CAAC,CAAC;IAE1H,MAAM,eAAe,GAAG,mCAAyB,CAAC,IAAI,CAAC,IAA8C,CAEpG,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAA,iBAAS,EAAC,QAAQ,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;IAEvF,wCAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,IAAA,qBAAU,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectionShowCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const draft_io_1 = require("../../lib/draft-io");
6
+ const cli_options_1 = require("../../lib/cli-options");
7
+ const errors_1 = require("../../lib/errors");
8
+ exports.selectionShowCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("show"))
9
+ .description("Print the staged lock's selection config")
10
+ .action((0, errors_1.withErrorHandling)(async (opts) => {
11
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
12
+ const draft = (0, draft_io_1.readDraft)(draftPath);
13
+ console.log(JSON.stringify(draft.stagedLock.selection, null, 2));
14
+ }));
15
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/selection/show.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAiE;AACjE,uDAAwD;AACxD,6CAAqD;AAExC,QAAA,oBAAoB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;KACrE,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IAC3D,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.showCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const draft_io_1 = require("../lib/draft-io");
6
+ const cli_options_1 = require("../lib/cli-options");
7
+ const errors_1 = require("../lib/errors");
8
+ exports.showCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("show"))
9
+ .description("Print the draft's full staged lock as JSON")
10
+ .action((0, errors_1.withErrorHandling)(async (opts) => {
11
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
12
+ const draft = (0, draft_io_1.readDraft)(draftPath);
13
+ console.log(JSON.stringify(draft.stagedLock, null, 2));
14
+ }));
15
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,8CAA8D;AAC9D,oDAAqD;AACrD,0CAAkD;AAErC,QAAA,WAAW,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;KAC5D,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IAC3D,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const node_fs_1 = require("node:fs");
6
+ const shared_1 = require("@roster-lock/shared");
7
+ const draft_io_1 = require("../lib/draft-io");
8
+ const cli_options_1 = require("../lib/cli-options");
9
+ const errors_1 = require("../lib/errors");
10
+ exports.validateCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("validate"))
11
+ .description("Validate a draft (default) or, with --lock, a published lock file")
12
+ .option("--lock <path>", "validate a plain lock file instead of a draft")
13
+ .action(async (opts) => {
14
+ try {
15
+ if (opts.lock) {
16
+ const json = JSON.parse((0, node_fs_1.readFileSync)(opts.lock, "utf-8"));
17
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(json, true);
18
+ }
19
+ else {
20
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
21
+ const json = JSON.parse((0, node_fs_1.readFileSync)(draftPath, "utf-8"));
22
+ shared_1.ROSTERLOCK_V1_DRAFT_CASTER_JSONSCHEMA.cast(json, true);
23
+ }
24
+ console.log("OK");
25
+ }
26
+ catch (e) {
27
+ console.error((0, errors_1.formatError)(e));
28
+ process.exitCode = 1;
29
+ }
30
+ });
31
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,qCAAuC;AACvC,gDAA6G;AAC7G,8CAAmD;AACnD,oDAAqD;AACrD,0CAA4C;AAE/B,QAAA,eAAe,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,UAAU,CAAC,CAAC;KACpE,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,IAAuC,EAAE,EAAE;IACxD,IAAI,CAAC;QACH,IAAG,IAAI,CAAC,IAAI,EAAC,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,wCAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,8CAAqC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAAC,OAAM,CAAC,EAAC,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const draft_1 = require("./commands/draft");
6
+ const engine_1 = require("./commands/engine");
7
+ const roster_1 = require("./commands/roster");
8
+ const selection_1 = require("./commands/selection");
9
+ const piece_meta_1 = require("./commands/piece-meta");
10
+ const validate_1 = require("./commands/validate");
11
+ const show_1 = require("./commands/show");
12
+ const version_1 = require("./version");
13
+ commander_1.program
14
+ .name("rosterlock-config-editor")
15
+ .description("A cli tool to build roster lock configs")
16
+ .version(version_1.VERSION);
17
+ const draftCommand = new commander_1.Command("draft").description("Manage the draft lifecycle (create, promote, publish, validate)");
18
+ draftCommand.addCommand(draft_1.initCommand);
19
+ draftCommand.addCommand(draft_1.fromLockCommand);
20
+ draftCommand.addCommand(draft_1.promoteCommand);
21
+ draftCommand.addCommand(draft_1.publishCommand);
22
+ draftCommand.addCommand(draft_1.draftValidateCommand);
23
+ commander_1.program.addCommand(draftCommand);
24
+ commander_1.program.addCommand(validate_1.validateCommand);
25
+ commander_1.program.addCommand(show_1.showCommand);
26
+ const engineCommand = new commander_1.Command("engine").description("Edit the staged lock's engine (piece types)");
27
+ engineCommand.addCommand(engine_1.setInfoCommand);
28
+ engineCommand.addCommand(engine_1.addPieceTypeCommand);
29
+ engineCommand.addCommand(engine_1.editDefinitionCommand);
30
+ engineCommand.addCommand(engine_1.addAssetCommand);
31
+ engineCommand.addCommand(engine_1.removePieceTypeCommand);
32
+ engineCommand.addCommand(engine_1.removeAssetCommand);
33
+ engineCommand.addCommand(engine_1.engineShowCommand);
34
+ commander_1.program.addCommand(engineCommand);
35
+ const rosterCommand = new commander_1.Command("roster").description("Edit the staged lock's rosters (pieces)");
36
+ rosterCommand.addCommand(roster_1.addPieceCommand);
37
+ rosterCommand.addCommand(roster_1.editPieceCommand);
38
+ rosterCommand.addCommand(roster_1.importPieceCommand);
39
+ rosterCommand.addCommand(roster_1.rescanCommand);
40
+ rosterCommand.addCommand(roster_1.testDownloadCommand);
41
+ rosterCommand.addCommand(roster_1.rosterListCommand);
42
+ rosterCommand.addCommand(roster_1.removePieceCommand);
43
+ commander_1.program.addCommand(rosterCommand);
44
+ const selectionCommand = new commander_1.Command("selection").description("Edit the staged lock's selection config");
45
+ selectionCommand.addCommand(selection_1.addScriptCommand);
46
+ selectionCommand.addCommand(selection_1.selectionSetCommand);
47
+ selectionCommand.addCommand(selection_1.runScriptCommand);
48
+ selectionCommand.addCommand(selection_1.selectionShowCommand);
49
+ commander_1.program.addCommand(selectionCommand);
50
+ const pieceMetaCommand = new commander_1.Command("piece-meta").description("Edit the staged lock's piece meta (custom per-piece fields)");
51
+ pieceMetaCommand.addCommand(piece_meta_1.pieceMetaSetCommand);
52
+ pieceMetaCommand.addCommand(piece_meta_1.pieceMetaShowCommand);
53
+ commander_1.program.addCommand(pieceMetaCommand);
54
+ commander_1.program.parse();
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAA6C;AAE7C,4CAAsH;AACtH,8CAQ2B;AAC3B,8CAQ2B;AAC3B,oDAK8B;AAC9B,sDAG+B;AAC/B,kDAAsD;AACtD,0CAA8C;AAC9C,uCAAoC;AAEpC,mBAAO;KACJ,IAAI,CAAC,0BAA0B,CAAC;KAChC,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,iBAAO,CAAC,CAAC;AAEpB,MAAM,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,iEAAiE,CAAC,CAAC;AACzH,YAAY,CAAC,UAAU,CAAC,mBAAW,CAAC,CAAC;AACrC,YAAY,CAAC,UAAU,CAAC,uBAAe,CAAC,CAAC;AACzC,YAAY,CAAC,UAAU,CAAC,sBAAc,CAAC,CAAC;AACxC,YAAY,CAAC,UAAU,CAAC,sBAAc,CAAC,CAAC;AACxC,YAAY,CAAC,UAAU,CAAC,4BAAoB,CAAC,CAAC;AAC9C,mBAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,mBAAO,CAAC,UAAU,CAAC,0BAAe,CAAC,CAAC;AACpC,mBAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAEhC,MAAM,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,6CAA6C,CAAC,CAAC;AACvG,aAAa,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACzC,aAAa,CAAC,UAAU,CAAC,4BAAmB,CAAC,CAAC;AAC9C,aAAa,CAAC,UAAU,CAAC,8BAAqB,CAAC,CAAC;AAChD,aAAa,CAAC,UAAU,CAAC,wBAAe,CAAC,CAAC;AAC1C,aAAa,CAAC,UAAU,CAAC,+BAAsB,CAAC,CAAC;AACjD,aAAa,CAAC,UAAU,CAAC,2BAAkB,CAAC,CAAC;AAC7C,aAAa,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;AAC5C,mBAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,MAAM,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;AACnG,aAAa,CAAC,UAAU,CAAC,wBAAe,CAAC,CAAC;AAC1C,aAAa,CAAC,UAAU,CAAC,yBAAgB,CAAC,CAAC;AAC3C,aAAa,CAAC,UAAU,CAAC,2BAAkB,CAAC,CAAC;AAC7C,aAAa,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AACxC,aAAa,CAAC,UAAU,CAAC,4BAAmB,CAAC,CAAC;AAC9C,aAAa,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;AAC5C,aAAa,CAAC,UAAU,CAAC,2BAAkB,CAAC,CAAC;AAC7C,mBAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,MAAM,gBAAgB,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;AACzG,gBAAgB,CAAC,UAAU,CAAC,4BAAgB,CAAC,CAAC;AAC9C,gBAAgB,CAAC,UAAU,CAAC,+BAAmB,CAAC,CAAC;AACjD,gBAAgB,CAAC,UAAU,CAAC,4BAAgB,CAAC,CAAC;AAC9C,gBAAgB,CAAC,UAAU,CAAC,gCAAoB,CAAC,CAAC;AAClD,mBAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAErC,MAAM,gBAAgB,GAAG,IAAI,mBAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,6DAA6D,CAAC,CAAC;AAC9H,gBAAgB,CAAC,UAAU,CAAC,gCAAmB,CAAC,CAAC;AACjD,gBAAgB,CAAC,UAAU,CAAC,iCAAoB,CAAC,CAAC;AAClD,mBAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAErC,mBAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withDraftOption = withDraftOption;
4
+ function withDraftOption(cmd) {
5
+ return cmd.option("-d, --draft <path>", "path to the draft file (defaults to the sole *.rosterlock.draft.json file in the current directory)");
6
+ }
7
+ //# sourceMappingURL=cli-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-options.js","sourceRoot":"","sources":["../../src/lib/cli-options.ts"],"names":[],"mappings":";;;AAEA,yBAAgC,GAAY;IAC1C,OAAO,GAAG,CAAC,MAAM,CACf,oBAAoB,EACpB,qGAAqG,CACtG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DRAFT_SUFFIX = void 0;
4
+ exports.resolveDraftPath = resolveDraftPath;
5
+ exports.defaultDraftPath = defaultDraftPath;
6
+ exports.readDraft = readDraft;
7
+ exports.writeDraft = writeDraft;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const shared_1 = require("@roster-lock/shared");
11
+ const slugify_1 = require("./slugify");
12
+ exports.DRAFT_SUFFIX = ".rosterlock.draft.json";
13
+ function resolveDraftPath(explicit) {
14
+ if (explicit)
15
+ return (0, node_path_1.resolve)(process.cwd(), explicit);
16
+ const cwd = process.cwd();
17
+ const candidates = (0, node_fs_1.readdirSync)(cwd).filter((name) => name.endsWith(exports.DRAFT_SUFFIX));
18
+ if (candidates.length === 0) {
19
+ throw new Error(`No draft file found in current directory (expected a *${exports.DRAFT_SUFFIX} file); pass --draft <path>`);
20
+ }
21
+ if (candidates.length > 1) {
22
+ throw new Error(`Multiple draft files found in current directory: ${candidates.join(", ")}; pass --draft <path> to choose one`);
23
+ }
24
+ return (0, node_path_1.resolve)(cwd, candidates[0]);
25
+ }
26
+ function defaultDraftPath(title) {
27
+ const slug = (0, slugify_1.slugify)(title && title.length > 0 ? title : "config") || "config";
28
+ return (0, node_path_1.resolve)(process.cwd(), `${slug}${exports.DRAFT_SUFFIX}`);
29
+ }
30
+ function readDraft(path) {
31
+ const json = JSON.parse((0, node_fs_1.readFileSync)(path, "utf-8"));
32
+ return shared_1.ROSTERLOCK_V1_DRAFT_CASTER_JSONSCHEMA.cast(json, true);
33
+ }
34
+ function writeDraft(path, draft) {
35
+ shared_1.ROSTERLOCK_V1_DRAFT_CASTER_JSONSCHEMA.cast(draft, true);
36
+ (0, node_fs_1.writeFileSync)(path, JSON.stringify(draft, null, 2) + "\n");
37
+ }
38
+ //# sourceMappingURL=draft-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-io.js","sourceRoot":"","sources":["../../src/lib/draft-io.ts"],"names":[],"mappings":";;;;;;;AAAA,qCAAmE;AACnE,yCAAoC;AACpC,gDAA4E;AAE5E,uCAAoC;AAEvB,QAAA,YAAY,GAAG,wBAAwB,CAAC;AAErD,0BAAiC,QAAiB;IAChD,IAAG,QAAQ;QAAE,OAAO,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAA,YAAY,CAAC,CAAC,CAAC;IAElF,IAAG,UAAU,CAAC,MAAM,KAAK,CAAC,EAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAA,YAAY,6BAA6B,CACnG,CAAC;IACJ,CAAC;IACD,IAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,oDAAoD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAC/G,CAAC;IACJ,CAAC;IACD,OAAO,IAAA,mBAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,0BAAiC,KAAc;IAC7C,MAAM,IAAI,GAAG,IAAA,iBAAO,EAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;IAC/E,OAAO,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,GAAG,QAAA,YAAY,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,mBAA0B,IAAY;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,OAAO,8CAAqC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,oBAA2B,IAAY,EAAE,KAAwB;IAC/D,8CAAqC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxD,IAAA,uBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatError = formatError;
4
+ exports.withErrorHandling = withErrorHandling;
5
+ const zod_1 = require("zod");
6
+ function formatError(e) {
7
+ if (e instanceof zod_1.ZodError) {
8
+ return e.issues
9
+ .map((issue) => `/${issue.path.join("/")} ${issue.message}`)
10
+ .join("\n");
11
+ }
12
+ if (Array.isArray(e)) {
13
+ return e
14
+ .map((err) => `${err.instancePath || "/"} ${err.message}`)
15
+ .join("\n");
16
+ }
17
+ if (e instanceof Error)
18
+ return e.message;
19
+ return String(e);
20
+ }
21
+ function withErrorHandling(fn) {
22
+ return async (...args) => {
23
+ try {
24
+ await fn(...args);
25
+ }
26
+ catch (e) {
27
+ console.error(formatError(e));
28
+ process.exitCode = 1;
29
+ }
30
+ };
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":";;;;AACA,6BAA+B;AAE/B,qBAA4B,CAAU;IACpC,IAAG,CAAC,YAAY,cAAQ,EAAC,CAAC;QACxB,OAAO,CAAC,CAAC,MAAM;aACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;aAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,CAAC;QACnB,OAAQ,CAAwB;aAC7B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;aACzD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAG,CAAC,YAAY,KAAK;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACxC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,2BACE,EAAoC;IAEpC,OAAO,KAAK,EAAE,GAAG,IAAU,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAM,CAAC,EAAC,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.walkRelative = walkRelative;
4
+ exports.getFileFromRoot = getFileFromRoot;
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ async function* walkRelative(root) {
9
+ yield* walk(root, root);
10
+ }
11
+ async function* walk(root, dir) {
12
+ const entries = await (0, promises_1.readdir)(dir, { withFileTypes: true });
13
+ for (const entry of entries) {
14
+ const fullPath = (0, node_path_1.join)(dir, entry.name);
15
+ if (entry.isDirectory()) {
16
+ yield* walk(root, fullPath);
17
+ }
18
+ else {
19
+ yield (0, node_path_1.relative)(root, fullPath).split(node_path_1.sep).join("/");
20
+ }
21
+ }
22
+ }
23
+ async function getFileFromRoot(root, relativePath) {
24
+ const fullPath = (0, node_path_1.join)(root, relativePath);
25
+ const stats = await (0, promises_1.stat)(fullPath);
26
+ return { byteSize: stats.size, stream: (0, node_fs_1.createReadStream)(fullPath) };
27
+ }
28
+ //# sourceMappingURL=fs-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-walk.js","sourceRoot":"","sources":["../../src/lib/fs-walk.ts"],"names":[],"mappings":";;;;AAAA,+CAA2D;AAC3D,qCAA2C;AAC3C,yCAAuF;AAMhF,KAAK,SAAS,CAAC,cAAc,IAAY;IAC9C,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAY,EAAE,GAAW;IAC5C,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAI,MAAM,KAAK,IAAI,OAAO,EAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAG,KAAK,CAAC,WAAW,EAAE,EAAC,CAAC;YACtB,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAA,oBAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,eAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC;AAEM,KAAK,0BACV,IAAY,EAAE,YAAoB;IAElC,MAAM,QAAQ,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAA,0BAAgB,EAAC,QAAQ,CAAC,EAAE,CAAC;AACtE,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readJsonInput = readJsonInput;
4
+ const promises_1 = require("node:fs/promises");
5
+ async function readJsonInput(source, schema) {
6
+ const raw = source === "-" ? await readStdin() : await (0, promises_1.readFile)(source, "utf-8");
7
+ return schema.parse(JSON.parse(raw));
8
+ }
9
+ async function readStdin() {
10
+ const chunks = [];
11
+ for await (const chunk of process.stdin) {
12
+ chunks.push(Buffer.from(chunk));
13
+ }
14
+ return Buffer.concat(chunks).toString("utf-8");
15
+ }
16
+ //# sourceMappingURL=json-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-input.js","sourceRoot":"","sources":["../../src/lib/json-input.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AASrC,KAAK,wBAA2B,MAAc,EAAE,MAAkB;IACvE,MAAM,GAAG,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,IAAA,mBAAQ,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAC,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readLock = readLock;
4
+ exports.writeLock = writeLock;
5
+ exports.defaultLockPath = defaultLockPath;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const shared_1 = require("@roster-lock/shared");
9
+ function readLock(path) {
10
+ const json = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.resolve)(process.cwd(), path), "utf-8"));
11
+ return shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(json, true);
12
+ }
13
+ function writeLock(path, lock) {
14
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(lock, true);
15
+ (0, node_fs_1.writeFileSync)((0, node_path_1.resolve)(process.cwd(), path), JSON.stringify(lock, null, 2) + "\n");
16
+ }
17
+ function defaultLockPath(title, version) {
18
+ return (0, node_path_1.resolve)(process.cwd(), `${title}-${version}.rosterlock.json`);
19
+ }
20
+ //# sourceMappingURL=lock-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-io.js","sourceRoot":"","sources":["../../src/lib/lock-io.ts"],"names":[],"mappings":";;;;;AAAA,qCAAsD;AACtD,yCAAoC;AACpC,gDAAsE;AAGtE,kBAAyB,IAAY;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7E,OAAO,wCAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,mBAA0B,IAAY,EAAE,IAAwB;IAC9D,wCAA+B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,IAAA,uBAAa,EAAC,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,yBAAgC,KAAa,EAAE,OAAe;IAC5D,OAAO,IAAA,mBAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,IAAI,OAAO,kBAAkB,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseKeyValueList = parseKeyValueList;
4
+ exports.parseCommaList = parseCommaList;
5
+ exports.parseCount = parseCount;
6
+ exports.parseStrategy = parseStrategy;
7
+ function parseKeyValueList(value) {
8
+ if (!value)
9
+ return {};
10
+ const result = {};
11
+ for (const pair of value.split(",")) {
12
+ const trimmed = pair.trim();
13
+ if (!trimmed)
14
+ continue;
15
+ const eq = trimmed.indexOf("=");
16
+ if (eq === -1)
17
+ throw new Error(`Invalid key=value pair: "${trimmed}"`);
18
+ result[trimmed.slice(0, eq)] = trimmed.slice(eq + 1);
19
+ }
20
+ return result;
21
+ }
22
+ function parseCommaList(value) {
23
+ if (!value)
24
+ return [];
25
+ return value.split(",").map((v) => v.trim()).filter((v) => v.length > 0);
26
+ }
27
+ function parseCount(value) {
28
+ if (value === "*")
29
+ return "*";
30
+ if (value.includes(":")) {
31
+ const [minRaw, maxRaw] = value.split(":");
32
+ const min = Number.parseInt(minRaw, 10);
33
+ if (Number.isNaN(min))
34
+ throw new Error(`Invalid count range: "${value}"`);
35
+ const max = maxRaw === "*" ? "*" : Number.parseInt(maxRaw, 10);
36
+ if (max !== "*" && Number.isNaN(max))
37
+ throw new Error(`Invalid count range: "${value}"`);
38
+ return [min, max];
39
+ }
40
+ const n = Number.parseInt(value, 10);
41
+ if (Number.isNaN(n))
42
+ throw new Error(`Invalid count: "${value}"`);
43
+ return n;
44
+ }
45
+ function parseStrategy(value) {
46
+ const normalized = value === "on-demand" ? "on demand" : value;
47
+ if (!["mandatory", "personal", "shared", "on demand"].includes(normalized)) {
48
+ throw new Error(`Invalid strategy: "${value}" (expected mandatory|personal|shared|on-demand)`);
49
+ }
50
+ return normalized;
51
+ }
52
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/lib/parse.ts"],"names":[],"mappings":";;;;;;AAEA,2BAAkC,KAAyB;IACzD,IAAG,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAI,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAG,CAAC,OAAO;YAAE,SAAS;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAG,EAAE,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAA+B,KAAyB;IACtD,IAAG,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,oBAA2B,KAAa;IACtC,IAAG,KAAK,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC7B,IAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAC,CAAC;QACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxC,IAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,GAAG,CAAC,CAAC;QACzE,MAAM,GAAG,GAAiB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAG,GAAG,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,GAAG,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,IAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,uBAA8B,KAAa;IACzC,MAAM,UAAU,GAAG,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,IAAG,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAC,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,kDAAkD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,UAA+D,CAAC;AACzE,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanPieceFolder = scanPieceFolder;
4
+ const shared_1 = require("@roster-lock/shared");
5
+ const fs_walk_1 = require("./fs-walk");
6
+ async function scanPieceFolder(folder, pathVariables, pieceDefinition) {
7
+ const assetInfo = await (0, shared_1.getAssetsOfFiles)((0, fs_walk_1.walkRelative)(folder), pathVariables, pieceDefinition);
8
+ const errors = (0, shared_1.collectAssetFileErrors)(assetInfo);
9
+ const version = await (0, shared_1.calculatePieceVersion)(assetInfo.filesWithAssets, (relativePath) => (0, fs_walk_1.getFileFromRoot)(folder, relativePath));
10
+ return { version, errors };
11
+ }
12
+ //# sourceMappingURL=piece-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piece-scan.js","sourceRoot":"","sources":["../../src/lib/piece-scan.ts"],"names":[],"mappings":";;;AAAA,gDAAsG;AAEtG,uCAA0D;AAInD,KAAK,0BACV,MAAc,EACd,aAAqC,EACrC,eAAgC;IAEhC,MAAM,SAAS,GAAG,MAAM,IAAA,yBAAgB,EAAC,IAAA,sBAAY,EAAC,MAAM,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,IAAA,+BAAsB,EAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAqB,EACzC,SAAS,CAAC,eAAe,EACzB,CAAC,YAAY,EAAE,EAAE,CAAC,IAAA,yBAAe,EAAC,MAAM,EAAE,YAAY,CAAC,CACxD,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.describeSchemaShape = describeSchemaShape;
4
+ function describeSchemaShape(schema) {
5
+ return describe(schema);
6
+ }
7
+ function describe(node) {
8
+ switch (node.type) {
9
+ case "object": {
10
+ const shape = node.def.shape;
11
+ const parts = Object.entries(shape).map(([key, value]) => {
12
+ const isOptional = value.type === "optional";
13
+ const inner = isOptional ? value.def.innerType : value;
14
+ return `${key}${isOptional ? "?" : ""}: ${describe(inner)}`;
15
+ });
16
+ return `{ ${parts.join(", ")} }`;
17
+ }
18
+ case "array":
19
+ return `${describe(node.def.element)}[]`;
20
+ case "tuple":
21
+ return `[${node.def.items.map(describe).join(", ")}]`;
22
+ case "union":
23
+ return node.def.options.map(describe).join(" | ");
24
+ case "enum":
25
+ return Object.values(node.def.entries).map((v) => JSON.stringify(v)).join(" | ");
26
+ case "literal":
27
+ return node.def.values.map((v) => JSON.stringify(v)).join(" | ");
28
+ case "record":
29
+ return `Record<${describe(node.def.keyType)}, ${describe(node.def.valueType)}>`;
30
+ case "optional":
31
+ return `${describe(node.def.innerType)}?`;
32
+ case "lazy":
33
+ return "<recursive>";
34
+ default:
35
+ return node.type;
36
+ }
37
+ }
38
+ //# sourceMappingURL=schema-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-help.js","sourceRoot":"","sources":["../../src/lib/schema-help.ts"],"names":[],"mappings":";;;AASA,6BAAoC,MAAe;IACjD,OAAO,QAAQ,CAAC,MAA4B,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,QAAO,IAAI,CAAC,IAAI,EAAC,CAAC;QAChB,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAgC,CAAC;YACxD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACvD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;gBAC7C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,CAAC,SAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;gBACpE,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC;QACD,KAAK,OAAO;YACV,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAkB,CAAC,IAAI,CAAC;QACtD,KAAK,OAAO;YACV,OAAO,IAAK,IAAI,CAAC,GAAG,CAAC,KAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5E,KAAK,OAAO;YACV,OAAQ,IAAI,CAAC,GAAG,CAAC,OAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAiC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7G,KAAK,SAAS;YACZ,OAAQ,IAAI,CAAC,GAAG,CAAC,MAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvF,KAAK,QAAQ;YACX,OAAO,UAAU,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAkB,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAoB,CAAC,GAAG,CAAC;QACxG,KAAK,UAAU;YACb,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAoB,CAAC,GAAG,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;AACH,CAAC"}