@ikas/component-cli 1.4.0-beta.19 → 1.4.0-beta.191

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 (172) hide show
  1. package/dist/build-tools.d.ts +37 -0
  2. package/dist/build-tools.d.ts.map +1 -0
  3. package/dist/build-tools.js +36 -0
  4. package/dist/build-tools.js.map +1 -0
  5. package/dist/commands/add-sections-to-page.d.ts +3 -0
  6. package/dist/commands/add-sections-to-page.d.ts.map +1 -0
  7. package/dist/commands/add-sections-to-page.js +39 -0
  8. package/dist/commands/add-sections-to-page.js.map +1 -0
  9. package/dist/commands/add.d.ts.map +1 -1
  10. package/dist/commands/add.js +11 -2
  11. package/dist/commands/add.js.map +1 -1
  12. package/dist/commands/build.d.ts.map +1 -1
  13. package/dist/commands/build.js +5 -165
  14. package/dist/commands/build.js.map +1 -1
  15. package/dist/commands/config.d.ts +35 -0
  16. package/dist/commands/config.d.ts.map +1 -1
  17. package/dist/commands/config.js +1021 -122
  18. package/dist/commands/config.js.map +1 -1
  19. package/dist/commands/create-design-tokens.d.ts +24 -0
  20. package/dist/commands/create-design-tokens.d.ts.map +1 -0
  21. package/dist/commands/create-design-tokens.js +327 -0
  22. package/dist/commands/create-design-tokens.js.map +1 -0
  23. package/dist/commands/create-global-variable.d.ts +3 -0
  24. package/dist/commands/create-global-variable.d.ts.map +1 -0
  25. package/dist/commands/create-global-variable.js +53 -0
  26. package/dist/commands/create-global-variable.js.map +1 -0
  27. package/dist/commands/create-page.d.ts +3 -0
  28. package/dist/commands/create-page.d.ts.map +1 -0
  29. package/dist/commands/create-page.js +31 -0
  30. package/dist/commands/create-page.js.map +1 -0
  31. package/dist/commands/delete-page.d.ts +3 -0
  32. package/dist/commands/delete-page.d.ts.map +1 -0
  33. package/dist/commands/delete-page.js +28 -0
  34. package/dist/commands/delete-page.js.map +1 -0
  35. package/dist/commands/delete-theme-globals.d.ts +4 -0
  36. package/dist/commands/delete-theme-globals.d.ts.map +1 -0
  37. package/dist/commands/delete-theme-globals.js +48 -0
  38. package/dist/commands/delete-theme-globals.js.map +1 -0
  39. package/dist/commands/dev.d.ts.map +1 -1
  40. package/dist/commands/dev.js +170 -31
  41. package/dist/commands/dev.js.map +1 -1
  42. package/dist/commands/enable-builtin-pages.d.ts +3 -0
  43. package/dist/commands/enable-builtin-pages.d.ts.map +1 -0
  44. package/dist/commands/enable-builtin-pages.js +27 -0
  45. package/dist/commands/enable-builtin-pages.js.map +1 -0
  46. package/dist/commands/get-component-props.d.ts +3 -0
  47. package/dist/commands/get-component-props.d.ts.map +1 -0
  48. package/dist/commands/get-component-props.js +32 -0
  49. package/dist/commands/get-component-props.js.map +1 -0
  50. package/dist/commands/get-page-by-type.d.ts +3 -0
  51. package/dist/commands/get-page-by-type.d.ts.map +1 -0
  52. package/dist/commands/get-page-by-type.js +25 -0
  53. package/dist/commands/get-page-by-type.js.map +1 -0
  54. package/dist/commands/get-section-values.d.ts +3 -0
  55. package/dist/commands/get-section-values.d.ts.map +1 -0
  56. package/dist/commands/get-section-values.js +39 -0
  57. package/dist/commands/get-section-values.js.map +1 -0
  58. package/dist/commands/list-builtin-pages.d.ts +3 -0
  59. package/dist/commands/list-builtin-pages.d.ts.map +1 -0
  60. package/dist/commands/list-builtin-pages.js +28 -0
  61. package/dist/commands/list-builtin-pages.js.map +1 -0
  62. package/dist/commands/list-entities.d.ts +3 -0
  63. package/dist/commands/list-entities.d.ts.map +1 -0
  64. package/dist/commands/list-entities.js +32 -0
  65. package/dist/commands/list-entities.js.map +1 -0
  66. package/dist/commands/list-page-sections.d.ts.map +1 -1
  67. package/dist/commands/list-page-sections.js +8 -2
  68. package/dist/commands/list-page-sections.js.map +1 -1
  69. package/dist/commands/list-theme-globals.d.ts +3 -0
  70. package/dist/commands/list-theme-globals.d.ts.map +1 -0
  71. package/dist/commands/list-theme-globals.js +22 -0
  72. package/dist/commands/list-theme-globals.js.map +1 -0
  73. package/dist/commands/move-page-section.d.ts +3 -0
  74. package/dist/commands/move-page-section.d.ts.map +1 -0
  75. package/dist/commands/move-page-section.js +62 -0
  76. package/dist/commands/move-page-section.js.map +1 -0
  77. package/dist/commands/publish-theme.d.ts +3 -0
  78. package/dist/commands/publish-theme.d.ts.map +1 -0
  79. package/dist/commands/publish-theme.js +29 -0
  80. package/dist/commands/publish-theme.js.map +1 -0
  81. package/dist/commands/publish.d.ts.map +1 -1
  82. package/dist/commands/publish.js +54 -3
  83. package/dist/commands/publish.js.map +1 -1
  84. package/dist/commands/remove-page-section.d.ts +3 -0
  85. package/dist/commands/remove-page-section.d.ts.map +1 -0
  86. package/dist/commands/remove-page-section.js +40 -0
  87. package/dist/commands/remove-page-section.js.map +1 -0
  88. package/dist/commands/search-products.d.ts +3 -0
  89. package/dist/commands/search-products.d.ts.map +1 -0
  90. package/dist/commands/search-products.js +40 -0
  91. package/dist/commands/search-products.js.map +1 -0
  92. package/dist/commands/update-builtin-page-prop.d.ts +3 -0
  93. package/dist/commands/update-builtin-page-prop.d.ts.map +1 -0
  94. package/dist/commands/update-builtin-page-prop.js +49 -0
  95. package/dist/commands/update-builtin-page-prop.js.map +1 -0
  96. package/dist/commands/update-global-variable.d.ts +3 -0
  97. package/dist/commands/update-global-variable.d.ts.map +1 -0
  98. package/dist/commands/update-global-variable.js +47 -0
  99. package/dist/commands/update-global-variable.js.map +1 -0
  100. package/dist/commands/update-page-sections.d.ts +3 -0
  101. package/dist/commands/update-page-sections.d.ts.map +1 -0
  102. package/dist/commands/update-page-sections.js +39 -0
  103. package/dist/commands/update-page-sections.js.map +1 -0
  104. package/dist/commands/update-section-prop.d.ts.map +1 -1
  105. package/dist/commands/update-section-prop.js +27 -9
  106. package/dist/commands/update-section-prop.js.map +1 -1
  107. package/dist/commands/upload-image.d.ts.map +1 -1
  108. package/dist/commands/upload-image.js +5 -46
  109. package/dist/commands/upload-image.js.map +1 -1
  110. package/dist/commands/upload-images.d.ts +3 -0
  111. package/dist/commands/upload-images.d.ts.map +1 -0
  112. package/dist/commands/upload-images.js +48 -0
  113. package/dist/commands/upload-images.js.map +1 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +54 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/types.d.ts +45 -0
  118. package/dist/types.d.ts.map +1 -1
  119. package/dist/utils/compile.d.ts +17 -2
  120. package/dist/utils/compile.d.ts.map +1 -1
  121. package/dist/utils/compile.js +746 -117
  122. package/dist/utils/compile.js.map +1 -1
  123. package/dist/utils/component-helpers.d.ts +128 -2
  124. package/dist/utils/component-helpers.d.ts.map +1 -1
  125. package/dist/utils/component-helpers.js +330 -27
  126. package/dist/utils/component-helpers.js.map +1 -1
  127. package/dist/utils/css-import-resolver.d.ts +4 -1
  128. package/dist/utils/css-import-resolver.d.ts.map +1 -1
  129. package/dist/utils/css-import-resolver.js +9 -1
  130. package/dist/utils/css-import-resolver.js.map +1 -1
  131. package/dist/utils/editor-action-client.d.ts +4 -3
  132. package/dist/utils/editor-action-client.d.ts.map +1 -1
  133. package/dist/utils/editor-action-client.js +55 -19
  134. package/dist/utils/editor-action-client.js.map +1 -1
  135. package/dist/utils/esm-transform.d.ts +30 -0
  136. package/dist/utils/esm-transform.d.ts.map +1 -1
  137. package/dist/utils/esm-transform.js +169 -2
  138. package/dist/utils/esm-transform.js.map +1 -1
  139. package/dist/utils/find-component-for-file.d.ts +12 -0
  140. package/dist/utils/find-component-for-file.d.ts.map +1 -0
  141. package/dist/utils/find-component-for-file.js +24 -0
  142. package/dist/utils/find-component-for-file.js.map +1 -0
  143. package/dist/utils/forbid-deep-imports.d.ts +3 -0
  144. package/dist/utils/forbid-deep-imports.d.ts.map +1 -0
  145. package/dist/utils/forbid-deep-imports.js +54 -0
  146. package/dist/utils/forbid-deep-imports.js.map +1 -0
  147. package/dist/utils/forbid-external-packages.d.ts +26 -0
  148. package/dist/utils/forbid-external-packages.d.ts.map +1 -0
  149. package/dist/utils/forbid-external-packages.js +99 -0
  150. package/dist/utils/forbid-external-packages.js.map +1 -0
  151. package/dist/utils/load-image.d.ts +16 -0
  152. package/dist/utils/load-image.d.ts.map +1 -0
  153. package/dist/utils/load-image.js +50 -0
  154. package/dist/utils/load-image.js.map +1 -0
  155. package/dist/utils/vendor-storefront.d.ts +13 -0
  156. package/dist/utils/vendor-storefront.d.ts.map +1 -0
  157. package/dist/utils/vendor-storefront.js +91 -0
  158. package/dist/utils/vendor-storefront.js.map +1 -0
  159. package/dist/utils/websocket-server.d.ts +88 -5
  160. package/dist/utils/websocket-server.d.ts.map +1 -1
  161. package/dist/utils/websocket-server.js +233 -43
  162. package/dist/utils/websocket-server.js.map +1 -1
  163. package/package.json +17 -2
  164. package/templates/add/section.css +11 -0
  165. package/dist/commands/create.d.ts +0 -4
  166. package/dist/commands/create.d.ts.map +0 -1
  167. package/dist/commands/create.js +0 -228
  168. package/dist/commands/create.js.map +0 -1
  169. package/dist/commands/proxy.d.ts +0 -39
  170. package/dist/commands/proxy.d.ts.map +0 -1
  171. package/dist/commands/proxy.js +0 -210
  172. package/dist/commands/proxy.js.map +0 -1
@@ -0,0 +1,40 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
3
+ async function runRemovePageSection(options) {
4
+ if (!options.pageId || typeof options.pageId !== "string") {
5
+ printErrorAndExit(new Error("--page-id is required (use `ikas-component list-pages` to discover ids)"));
6
+ }
7
+ if (!options.elementId || typeof options.elementId !== "string") {
8
+ printErrorAndExit(new Error("--element-id is required (use `ikas-component list-page-sections` to discover ids)"));
9
+ }
10
+ const port = options.port ? parseInt(options.port, 10) : undefined;
11
+ try {
12
+ // The flag is only forwarded — the editor action owns the refusal, so a client
13
+ // that skips the CLI is gated by the same check and there is one message to keep.
14
+ const result = await runEditorAction("remove-page-section", {
15
+ pageId: options.pageId,
16
+ elementId: options.elementId,
17
+ confirmed: !!options.yes,
18
+ ...(options.sfRoutingId ? { sfRoutingId: options.sfRoutingId } : {}),
19
+ ...(options.specificationId ? { specificationId: options.specificationId } : {}),
20
+ }, port ? { port } : {});
21
+ printResultAndExit(result);
22
+ }
23
+ catch (e) {
24
+ printErrorAndExit(e);
25
+ }
26
+ }
27
+ export function createRemovePageSectionCommand() {
28
+ const cmd = new Command("remove-page-section");
29
+ cmd
30
+ .description("Remove one section placement from a page. Targets the placement by --element-id (from `list-page-sections`), NOT the sectionId — a section placed twice has two independent placements. A common (header/footer) section on the home page is HIDDEN rather than deleted, so the prop values it carries on every other page survive. Pass --sf-routing-id/--specification-id to remove from a customized page state instead of the base layer. This deletes the merchant's content in that section — confirm with the user before running it.")
31
+ .requiredOption("--page-id <pageId>", "Page holding the placement (from `list-pages`)")
32
+ .requiredOption("--element-id <elementId>", "Placement element id (from `list-page-sections`)")
33
+ .option("--sf-routing-id <id>", "Target a customized routing state instead of the base layer")
34
+ .option("--specification-id <id>", "Target a customized specification state instead of the base layer")
35
+ .option("--yes", "Confirm the removal. Required — the command refuses to run without it.")
36
+ .option("--port <port>", "Dev server WebSocket port", "5201")
37
+ .action(runRemovePageSection);
38
+ return cmd;
39
+ }
40
+ //# sourceMappingURL=remove-page-section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-page-section.js","sourceRoot":"","sources":["../../src/commands/remove-page-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAW1C,KAAK,UAAU,oBAAoB,CAAC,OAAiC;IACnE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChE,iBAAiB,CACf,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,+EAA+E;QAC/E,kFAAkF;QAClF,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,qBAAqB,EACrB;YACE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG;YACxB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjF,EACD,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CACrB,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/C,GAAG;SACA,WAAW,CACV,8gBAA8gB,CAC/gB;SACA,cAAc,CAAC,oBAAoB,EAAE,gDAAgD,CAAC;SACtF,cAAc,CAAC,0BAA0B,EAAE,kDAAkD,CAAC;SAC9F,MAAM,CAAC,sBAAsB,EAAE,6DAA6D,CAAC;SAC7F,MAAM,CAAC,yBAAyB,EAAE,mEAAmE,CAAC;SACtG,MAAM,CAAC,OAAO,EAAE,wEAAwE,CAAC;SACzF,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createSearchProductsCommand(): Command;
3
+ //# sourceMappingURL=search-products.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-products.d.ts","sourceRoot":"","sources":["../../src/commands/search-products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,2BAA2B,IAAI,OAAO,CAarD"}
@@ -0,0 +1,40 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
3
+ async function runSearchProducts(options) {
4
+ const port = options.port ? parseInt(options.port, 10) : undefined;
5
+ const productIds = options.ids
6
+ ? options.ids
7
+ .split(",")
8
+ .map(s => s.trim())
9
+ .filter(Boolean)
10
+ : undefined;
11
+ const perPage = options.perPage ? parseInt(options.perPage, 10) : undefined;
12
+ const page = options.page ? parseInt(options.page, 10) : undefined;
13
+ try {
14
+ const result = await runEditorAction("search-products", {
15
+ ...(options.query ? { query: options.query } : {}),
16
+ ...(productIds && productIds.length ? { productIds } : {}),
17
+ ...(typeof perPage === "number" && !Number.isNaN(perPage) ? { perPage } : {}),
18
+ ...(typeof page === "number" && !Number.isNaN(page) ? { page } : {}),
19
+ },
20
+ // The host fetches from the store API, so allow more than the default 10s.
21
+ { ...(port ? { port } : {}), timeoutMs: 20_000 });
22
+ printResultAndExit(result);
23
+ }
24
+ catch (e) {
25
+ printErrorAndExit(e);
26
+ }
27
+ }
28
+ export function createSearchProductsCommand() {
29
+ const cmd = new Command("search-products");
30
+ cmd
31
+ .description("Search the connected store's products and return each product's id (productId) + first variantId, name, slug, and variant count. Use the productId/variantId to fill a PRODUCT prop value via `ikas-component update-section-prop`. Requires the editor embedded in the ikas admin panel (the host runs the search).")
32
+ .option("--query <text>", "Free-text search query (name, sku, barcode)")
33
+ .option("--ids <ids>", "Comma-separated product ids to look up directly")
34
+ .option("--per-page <n>", "Results per page")
35
+ .option("--page <n>", "Page number")
36
+ .option("--port <port>", "Dev server WebSocket port", "5201")
37
+ .action(runSearchProducts);
38
+ return cmd;
39
+ }
40
+ //# sourceMappingURL=search-products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-products.js","sourceRoot":"","sources":["../../src/commands/search-products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAU1C,KAAK,UAAU,iBAAiB,CAAC,OAA8B;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG;QAC5B,CAAC,CAAC,OAAO,CAAC,GAAG;aACR,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aAClB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,iBAAiB,EACjB;YACE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE;QACD,2EAA2E;QAC3E,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CACjD,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3C,GAAG;SACA,WAAW,CACV,sTAAsT,CACvT;SACA,MAAM,CAAC,gBAAgB,EAAE,6CAA6C,CAAC;SACvE,MAAM,CAAC,aAAa,EAAE,iDAAiD,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;SAC5C,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;SACnC,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createUpdateBuiltinPagePropCommand(): Command;
3
+ //# sourceMappingURL=update-builtin-page-prop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-builtin-page-prop.d.ts","sourceRoot":"","sources":["../../src/commands/update-builtin-page-prop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDpC,wBAAgB,kCAAkC,IAAI,OAAO,CAmC5D"}
@@ -0,0 +1,49 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
3
+ async function runUpdateBuiltinPageProp(options) {
4
+ // Target/prop validation is the editor handler's job — one source of error truth.
5
+ let value;
6
+ if (options.value !== undefined) {
7
+ try {
8
+ value = JSON.parse(options.value);
9
+ }
10
+ catch {
11
+ // A bare string is the common case for TEXT props; keep it verbatim.
12
+ value = options.value;
13
+ }
14
+ }
15
+ const port = options.port ? parseInt(options.port, 10) : undefined;
16
+ try {
17
+ const result = await runEditorAction("update-builtin-page-prop", {
18
+ ...(options.pageType ? { pageType: options.pageType } : {}),
19
+ ...(options.scopeId ? { scopeId: options.scopeId } : {}),
20
+ ...(options.propId ? { propId: options.propId } : {}),
21
+ ...(options.propName ? { propName: options.propName } : {}),
22
+ ...(value !== undefined ? { value } : {}),
23
+ ...(options.bindGlobal ? { bindGlobal: options.bindGlobal } : {}),
24
+ ...(options.clear ? { clear: true } : {}),
25
+ ...(options.sfRoutingId ? { sfRoutingId: options.sfRoutingId } : {}),
26
+ }, port ? { port } : {});
27
+ printResultAndExit(result);
28
+ }
29
+ catch (e) {
30
+ printErrorAndExit(e);
31
+ }
32
+ }
33
+ export function createUpdateBuiltinPagePropCommand() {
34
+ const cmd = new Command("update-builtin-page-prop");
35
+ cmd
36
+ .description('Set, bind, or clear one prop of an ikas-rendered built-in page (--page-type) or of a shared scope (--scope-id). Values are stored RAW — a TEXT prop takes the plain string, a COLOR takes "#rrggbb" or a {"patternValueId"} global-color binding, an IMAGE takes {"id"}. Get the schema and current values from list-builtin-pages.')
37
+ .option("--page-type <type>", "Built-in page type whose own prop to write (e.g. LOGIN)")
38
+ .option("--scope-id <id>", "Shared scope whose prop to write (reaches every page in its group)")
39
+ .option("--prop-id <id>", "Prop id (from list-builtin-pages)")
40
+ .option("--prop-name <name>", "Prop name (alternative to --prop-id)")
41
+ .option("--value <json>", "The raw value as JSON (a bare string is taken verbatim)")
42
+ .option("--bind-global <name>", "Bind the prop to a global variable (Theme Setting) instead of a static value — pass the global's name from list-theme-globals")
43
+ .option("--clear", "Delete the stored value so the prop falls back to the default")
44
+ .option("--sf-routing-id <id>", "Write one storefront routing's override (default: the base value)")
45
+ .option("--port <port>", "Dev server WebSocket port", "5201")
46
+ .action(runUpdateBuiltinPageProp);
47
+ return cmd;
48
+ }
49
+ //# sourceMappingURL=update-builtin-page-prop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-builtin-page-prop.js","sourceRoot":"","sources":["../../src/commands/update-builtin-page-prop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createUpdateGlobalVariableCommand(): Command;
3
+ //# sourceMappingURL=update-global-variable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-global-variable.d.ts","sourceRoot":"","sources":["../../src/commands/update-global-variable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiDpC,wBAAgB,iCAAiC,IAAI,OAAO,CAW3D"}
@@ -0,0 +1,47 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction } from "../utils/editor-action-client.js";
3
+ const VALID_TYPES = ["TEXT", "RICH_TEXT", "IMAGE", "COLOR", "NUMBER", "BOOLEAN", "BORDER", "SHADOW"];
4
+ function parseValue(raw) {
5
+ if (raw == null)
6
+ return undefined;
7
+ try {
8
+ return JSON.parse(raw);
9
+ }
10
+ catch {
11
+ return raw;
12
+ }
13
+ }
14
+ async function runUpdateGlobalVariable(options) {
15
+ if (!options.name) {
16
+ printErrorAndExit(new Error("--name is required (the variable's runtime key, from list-theme-globals)"));
17
+ }
18
+ if (options.type && !VALID_TYPES.includes(options.type)) {
19
+ printErrorAndExit(new Error(`--type must be one of: ${VALID_TYPES.join(", ")}`));
20
+ }
21
+ const port = options.port ? parseInt(options.port, 10) : undefined;
22
+ try {
23
+ const result = await runEditorAction("update-global-variable", {
24
+ name: options.name,
25
+ ...(options.displayName !== undefined ? { displayName: options.displayName } : {}),
26
+ ...(options.type !== undefined ? { type: options.type } : {}),
27
+ ...(options.value !== undefined ? { value: parseValue(options.value) } : {}),
28
+ }, port ? { port } : {});
29
+ printResultAndExit(result);
30
+ }
31
+ catch (e) {
32
+ printErrorAndExit(e);
33
+ }
34
+ }
35
+ export function createUpdateGlobalVariableCommand() {
36
+ const cmd = new Command("update-global-variable");
37
+ cmd
38
+ .description("Update a global variable's value, display name, and/or type in the connected editor")
39
+ .requiredOption("--name <key>", "The variable's runtime key (from `list-theme-globals`)")
40
+ .option("--display-name <name>", "New human-facing label")
41
+ .option("--type <type>", `New value type: ${VALID_TYPES.join(" | ")}`)
42
+ .option("--value <json>", "New value (JSON for objects/null; plain string also accepted)")
43
+ .option("--port <port>", "Dev server WebSocket port", "5201")
44
+ .action(runUpdateGlobalVariable);
45
+ return cmd;
46
+ }
47
+ //# sourceMappingURL=update-global-variable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-global-variable.js","sourceRoot":"","sources":["../../src/commands/update-global-variable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE1G,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAUrG,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,OAAoC;IACzE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,iBAAiB,CAAC,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,iBAAiB,CAAC,IAAI,KAAK,CAAC,0BAA0B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,wBAAwB,EACxB;YACE,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,EACD,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CACrB,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAClD,GAAG;SACA,WAAW,CAAC,qFAAqF,CAAC;SAClG,cAAc,CAAC,cAAc,EAAE,wDAAwD,CAAC;SACxF,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;SACzD,MAAM,CAAC,eAAe,EAAE,mBAAmB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;SACrE,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC;SACzF,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createUpdatePageSectionsCommand(): Command;
3
+ //# sourceMappingURL=update-page-sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-page-sections.d.ts","sourceRoot":"","sources":["../../src/commands/update-page-sections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiDpC,wBAAgB,+BAA+B,IAAI,OAAO,CAczD"}
@@ -0,0 +1,39 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
3
+ async function runUpdatePageSections(options) {
4
+ if (!options.pageId || typeof options.pageId !== "string") {
5
+ printErrorAndExit(new Error("--page-id is required (use `ikas-component list-pages`)"));
6
+ }
7
+ if (options.sections === undefined) {
8
+ printErrorAndExit(new Error('--sections is required: a JSON array, e.g. \'[{"elementId":"<id>","updates":[{"propName":"heading","value":{"value":"Hi"}}]}]\''));
9
+ }
10
+ let sections;
11
+ try {
12
+ sections = JSON.parse(options.sections);
13
+ }
14
+ catch {
15
+ printErrorAndExit(new Error(`--sections must be valid JSON. Received: ${options.sections}`));
16
+ }
17
+ if (!Array.isArray(sections) || sections.length === 0) {
18
+ printErrorAndExit(new Error('--sections must be a non-empty JSON array of { elementId, updates: [...] } objects.'));
19
+ }
20
+ const port = options.port ? parseInt(options.port, 10) : undefined;
21
+ try {
22
+ const result = await runEditorAction("update-page-sections", { pageId: options.pageId, sections }, { ...(port ? { port } : {}), timeoutMs: 30_000 });
23
+ printResultAndExit(result);
24
+ }
25
+ catch (e) {
26
+ printErrorAndExit(e);
27
+ }
28
+ }
29
+ export function createUpdatePageSectionsCommand() {
30
+ const cmd = new Command("update-page-sections");
31
+ cmd
32
+ .description("Fill MANY placed sections of a page in one call. --sections is a JSON array of { elementId, updates: [{ propId|propName, value }] }, each value using the same per-type shape as update-section-prop. All-or-nothing across the whole page: every value is resolved and validated before any is written. A COMMON (global) section among them — the theme's header/footer — is written to its one theme-wide record on the INDEX (Home) page, so it changes on every page (see the result's `common` block); a header/footer that is missing from the INDEX page rejects the whole call.")
33
+ .requiredOption("--page-id <id>", "Page id (from `ikas-component list-pages`)")
34
+ .requiredOption("--sections <json>", 'JSON array, e.g. \'[{"elementId":"<id>","updates":[{"propName":"heading","value":{"value":"Hi"}}]}]\'')
35
+ .option("--port <port>", "Dev server WebSocket port", "5201")
36
+ .action(runUpdatePageSections);
37
+ return cmd;
38
+ }
39
+ //# sourceMappingURL=update-page-sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-page-sections.js","sourceRoot":"","sources":["../../src/commands/update-page-sections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAQ1C,KAAK,UAAU,qBAAqB,CAAC,OAAkC;IACrE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,iBAAiB,CACf,IAAI,KAAK,CACP,iIAAiI,CAClI,CACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB,CAAC,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,iBAAiB,CACf,IAAI,KAAK,CAAC,qFAAqF,CAAC,CACjG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,sBAAsB,EACtB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EACpC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CACjD,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAChD,GAAG;SACA,WAAW,CACV,0jBAA0jB,CAC3jB;SACA,cAAc,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SAC9E,cAAc,CACb,mBAAmB,EACnB,uGAAuG,CACxG;SACA,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-section-prop.d.ts","sourceRoot":"","sources":["../../src/commands/update-section-prop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,8BAA8B,IAAI,OAAO,CAqBxD"}
1
+ {"version":3,"file":"update-section-prop.d.ts","sourceRoot":"","sources":["../../src/commands/update-section-prop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6EpC,wBAAgB,8BAA8B,IAAI,OAAO,CA0BxD"}
@@ -10,15 +10,26 @@ async function runUpdateSectionProp(options) {
10
10
  if (!options.propId && !options.propName) {
11
11
  printErrorAndExit(new Error("Provide --prop-id or --prop-name (see `ikas-component list-page-sections`)"));
12
12
  }
13
- if (options.value === undefined) {
14
- printErrorAndExit(new Error("--value is required (JSON, e.g. '{\"value\":\"Hello\"}')"));
13
+ if (options.value === undefined && !options.bindGlobal) {
14
+ printErrorAndExit(new Error("Provide --value (JSON, e.g. '{\"value\":\"Hello\"}') or --bind-global <name> to bind a global variable"));
15
15
  }
16
16
  let value;
17
- try {
18
- value = JSON.parse(options.value);
17
+ if (options.value !== undefined) {
18
+ try {
19
+ value = JSON.parse(options.value);
20
+ }
21
+ catch {
22
+ printErrorAndExit(new Error(`--value must be valid JSON (e.g. '{"value":"Hello"}'). Received: ${options.value}`));
23
+ }
19
24
  }
20
- catch {
21
- printErrorAndExit(new Error(`--value must be valid JSON (e.g. '{"value":"Hello"}'). Received: ${options.value}`));
25
+ let listPath;
26
+ if (options.listPath !== undefined) {
27
+ try {
28
+ listPath = JSON.parse(options.listPath);
29
+ }
30
+ catch {
31
+ printErrorAndExit(new Error(`--list-path must be valid JSON. Received: ${options.listPath}`));
32
+ }
22
33
  }
23
34
  const port = options.port ? parseInt(options.port, 10) : undefined;
24
35
  try {
@@ -27,7 +38,9 @@ async function runUpdateSectionProp(options) {
27
38
  elementId: options.elementId,
28
39
  ...(options.propId ? { propId: options.propId } : {}),
29
40
  ...(options.propName ? { propName: options.propName } : {}),
30
- value,
41
+ ...(options.bindGlobal
42
+ ? { bindGlobal: options.bindGlobal, ...(listPath ? { listPath } : {}) }
43
+ : { value }),
31
44
  }, port ? { port } : {});
32
45
  printResultAndExit(result);
33
46
  }
@@ -42,15 +55,20 @@ export function createUpdateSectionPropCommand() {
42
55
  "Change a single prop value of a section placed on a page. Target the placement by its elementId (from `ikas-component list-page-sections`) and the prop by --prop-id or --prop-name.",
43
56
  "--value is the JSON-encoded prop value. Shape depends on the prop type:",
44
57
  " Scalars (TEXT/RICH_TEXT/BOOLEAN/NUMBER/COLOR/ENUM/DATE) are { \"value\": <scalar> } — e.g. '{\"value\":\"Hello\"}', '{\"value\":true}', '{\"value\":\"#FF0000\"}'.",
45
- " Object props are NOT wrapped: IMAGE/VIDEO/SVG = '{\"id\":\"<asset-id>\",\"altText\":\"...\"}' (get id via `ikas-component upload-image`); LINK = '{\"linkType\":\"...\",\"label\":\"...\",\"externalLink\":\"...\"}'; PRODUCT = '{\"productId\":\"...\"}'.",
58
+ " Object props are NOT wrapped: IMAGE/VIDEO/SVG = '{\"id\":\"<asset-id>\",\"altText\":\"...\"}' (get id via `ikas-component upload-image`); PRODUCT = '{\"productId\":\"...\"}'.",
59
+ " LINK = a single link object needing id + linkType + label + subLinks: PAGE = '{\"id\":\"<unique>\",\"linkType\":\"PAGE\",\"label\":\"Home\",\"pageId\":\"<id>\",\"pageType\":\"INDEX\",\"subLinks\":[]}'; EXTERNAL = '{\"id\":\"<unique>\",\"linkType\":\"EXTERNAL\",\"label\":\"Docs\",\"externalLink\":\"https://...\",\"subLinks\":[]}'. (pageId/pageType from `list-pages`.) LIST_OF_LINK = '{\"links\":[<link>,...]}'.",
46
60
  " COMPONENT_LIST = '{\"components\":[{\"id\":\"<unique>\",\"codeComponentId\":\"<child-id>\",\"propValues\":{\"<childProp>\":<value>}}]}' (single COMPONENT = one such entry). Each entry needs a unique id and codeComponentId (or componentId); child propValues use the same per-type shapes recursively.",
47
61
  " The value REPLACES the whole prop — to edit a COMPONENT_LIST, read the current value from `list-page-sections` and resend the entire array. Wrong shapes are rejected with an error, not stored silently.",
62
+ "COMMON (global) sections — the theme's header/footer — share ONE set of prop values across every page, stored on the INDEX (Home) page's placement: the write lands there whatever --page-id you pass and changes that section on ALL pages (the result's `common` block says so, and the echoed value is read back from that canonical placement). Read the current values first (`get-section-values`) and change only what you mean to; if the INDEX page has no placement of the section, add it there first — otherwise the write is rejected.",
63
+ "Instead of --value, use --bind-global <name> to bind the prop to a project GLOBAL variable (Theme Setting) as a live dynamic value — pass the global's `name` (variableName) from `ikas-component list-theme-globals`. Add --list-path to bind a prop of a COMPONENT_LIST child (then --prop-id is the child's prop id).",
48
64
  ].join("\n"))
49
65
  .requiredOption("--page-id <id>", "Page id (from `ikas-component list-pages`)")
50
66
  .requiredOption("--element-id <id>", "Placed section elementId (from `ikas-component list-page-sections`)")
51
67
  .option("--prop-id <id>", "Blueprint prop id to update")
52
68
  .option("--prop-name <name>", "Blueprint prop name to update (alternative to --prop-id)")
53
- .requiredOption("--value <json>", 'JSON-encoded prop value, e.g. \'{"value":"Hello"}\'')
69
+ .option("--value <json>", 'JSON-encoded prop value, e.g. \'{"value":"Hello"}\' (omit when using --bind-global)')
70
+ .option("--bind-global <name>", "Bind the prop to a global variable (its name/variableName from list-theme-globals) instead of a static value")
71
+ .option("--list-path <json>", 'JSON [{ "propId", "index" }, ...] targeting a COMPONENT_LIST child when using --bind-global')
54
72
  .option("--port <port>", "Dev server WebSocket port", "5201")
55
73
  .action(runUpdateSectionProp);
56
74
  return cmd;
@@ -1 +1 @@
1
- {"version":3,"file":"update-section-prop.js","sourceRoot":"","sources":["../../src/commands/update-section-prop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-section-prop.js","sourceRoot":"","sources":["../../src/commands/update-section-prop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAa1C,KAAK,UAAU,oBAAoB,CAAC,OAAiC;IACnE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1D,iBAAiB,CAAC,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChE,iBAAiB,CACf,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzC,iBAAiB,CAAC,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACvD,iBAAiB,CACf,IAAI,KAAK,CAAC,wGAAwG,CAAC,CACpH,CAAC;IACJ,CAAC;IAED,IAAI,KAAc,CAAC;IACnB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB,CACf,IAAI,KAAK,CAAC,oEAAoE,OAAO,CAAC,KAAK,EAAE,CAAC,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,QAAiB,CAAC;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB,CAAC,IAAI,KAAK,CAAC,6CAA6C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,qBAAqB,EACrB;YACE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,UAAU;gBACpB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;gBACvE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SACf,EACD,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CACrB,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/C,GAAG;SACA,WAAW,CACV;QACE,sLAAsL;QACtL,yEAAyE;QACzE,sKAAsK;QACtK,kLAAkL;QAClL,+ZAA+Z;QAC/Z,8SAA8S;QAC9S,6MAA6M;QAC7M,qhBAAqhB;QACrhB,0TAA0T;KAC3T,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;SACA,cAAc,CAAC,gBAAgB,EAAE,4CAA4C,CAAC;SAC9E,cAAc,CAAC,mBAAmB,EAAE,qEAAqE,CAAC;SAC1G,MAAM,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;SACvD,MAAM,CAAC,oBAAoB,EAAE,0DAA0D,CAAC;SACxF,MAAM,CAAC,gBAAgB,EAAE,qFAAqF,CAAC;SAC/G,MAAM,CAAC,sBAAsB,EAAE,8GAA8G,CAAC;SAC9I,MAAM,CAAC,oBAAoB,EAAE,6FAA6F,CAAC;SAC3H,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upload-image.d.ts","sourceRoot":"","sources":["../../src/commands/upload-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4FpC,wBAAgB,wBAAwB,IAAI,OAAO,CAYlD"}
1
+ {"version":3,"file":"upload-image.d.ts","sourceRoot":"","sources":["../../src/commands/upload-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCpC,wBAAgB,wBAAwB,IAAI,OAAO,CAYlD"}
@@ -1,54 +1,13 @@
1
1
  import { Command } from "commander";
2
- import { readFile } from "node:fs/promises";
3
- import { basename, extname } from "node:path";
4
2
  import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
5
- const MIME_BY_EXT = {
6
- ".png": "image/png",
7
- ".jpg": "image/jpeg",
8
- ".jpeg": "image/jpeg",
9
- ".webp": "image/webp",
10
- ".gif": "image/gif",
11
- };
12
- const VALID_IMAGE_TYPES = Object.values(MIME_BY_EXT);
13
- const MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10MB, mirrors the editor's IMAGE_UPLOAD_LIMIT_SIZE
14
- async function loadImage(options) {
15
- if (options.file && options.url) {
16
- throw new Error("Provide only one of --file or --url, not both");
17
- }
18
- if (options.file) {
19
- const buffer = await readFile(options.file);
20
- const ext = extname(options.file).toLowerCase();
21
- const mimeType = MIME_BY_EXT[ext];
22
- if (!mimeType) {
23
- throw new Error(`Unsupported image extension "${ext || "(none)"}". Supported: ${Object.keys(MIME_BY_EXT).join(", ")}`);
24
- }
25
- if (buffer.byteLength > MAX_SIZE_BYTES) {
26
- throw new Error(`Image is ${(buffer.byteLength / 1024 / 1024).toFixed(1)}MB; the limit is 10MB`);
27
- }
28
- return { base64: buffer.toString("base64"), mimeType, fileName: basename(options.file) };
29
- }
30
- if (options.url) {
31
- const res = await fetch(options.url);
32
- if (!res.ok) {
33
- throw new Error(`Failed to fetch image: ${res.status} ${res.statusText}`);
34
- }
35
- const mimeType = (res.headers.get("content-type") || "").split(";")[0].trim();
36
- if (!VALID_IMAGE_TYPES.includes(mimeType)) {
37
- throw new Error(`URL returned content-type "${mimeType || "(none)"}". Supported: ${VALID_IMAGE_TYPES.join(", ")}`);
38
- }
39
- const buffer = Buffer.from(await res.arrayBuffer());
40
- if (buffer.byteLength > MAX_SIZE_BYTES) {
41
- throw new Error(`Image is ${(buffer.byteLength / 1024 / 1024).toFixed(1)}MB; the limit is 10MB`);
42
- }
43
- const urlName = basename(new URL(options.url).pathname) || "image";
44
- return { base64: buffer.toString("base64"), mimeType, fileName: urlName };
45
- }
46
- throw new Error("Provide --file <path> or --url <url>");
47
- }
3
+ import { loadImageSource } from "../utils/load-image.js";
48
4
  async function runUploadImage(options) {
49
5
  const port = options.port ? parseInt(options.port, 10) : undefined;
6
+ if (!options.file && !options.url) {
7
+ printErrorAndExit(new Error("Provide --file <path> or --url <url>"));
8
+ }
50
9
  try {
51
- const { base64, mimeType, fileName } = await loadImage(options);
10
+ const { base64, mimeType, fileName } = await loadImageSource({ file: options.file, url: options.url });
52
11
  const result = await runEditorAction("upload-image", {
53
12
  base64,
54
13
  mimeType,
@@ -1 +1 @@
1
- {"version":3,"file":"upload-image.js","sourceRoot":"","sources":["../../src/commands/upload-image.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-image.js","sourceRoot":"","sources":["../../src/commands/upload-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AASzD,KAAK,UAAU,cAAc,CAAC,OAA2B;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,iBAAiB,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvG,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,cAAc,EACd;YACE,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,KAAK;SACf;QACD,2EAA2E;QAC3E,yDAAyD;QACzD,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CACjD,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,GAAG;SACA,WAAW,CACV,2UAA2U,CAC5U;SACA,MAAM,CAAC,eAAe,EAAE,wDAAwD,CAAC;SACjF,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;SACtD,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;SAChD,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createUploadImagesCommand(): Command;
3
+ //# sourceMappingURL=upload-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-images.d.ts","sourceRoot":"","sources":["../../src/commands/upload-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,yBAAyB,IAAI,OAAO,CAanD"}
@@ -0,0 +1,48 @@
1
+ import { Command } from "commander";
2
+ import { printErrorAndExit, printResultAndExit, runEditorAction, } from "../utils/editor-action-client.js";
3
+ import { loadImageSource } from "../utils/load-image.js";
4
+ async function runUploadImages(options) {
5
+ if (options.manifest === undefined) {
6
+ printErrorAndExit(new Error('--manifest is required: a JSON array, e.g. \'[{"file":"/a.png","alt":"A"},{"url":"https://...","alt":"B"}]\''));
7
+ }
8
+ let manifest;
9
+ try {
10
+ manifest = JSON.parse(options.manifest);
11
+ }
12
+ catch {
13
+ printErrorAndExit(new Error(`--manifest must be valid JSON. Received: ${options.manifest}`));
14
+ return;
15
+ }
16
+ if (!Array.isArray(manifest) || manifest.length === 0) {
17
+ printErrorAndExit(new Error("--manifest must be a non-empty JSON array of { file|url, alt? } objects."));
18
+ }
19
+ const port = options.port ? parseInt(options.port, 10) : undefined;
20
+ try {
21
+ // Read/encode all sources in parallel, then send one batch editor-action.
22
+ const images = await Promise.all(manifest.map(async (entry) => {
23
+ const { base64, mimeType, fileName } = await loadImageSource({ file: entry.file, url: entry.url });
24
+ return {
25
+ base64,
26
+ mimeType,
27
+ fileName,
28
+ ...(entry.alt ? { altText: entry.alt } : {}),
29
+ isVideo: false,
30
+ };
31
+ }));
32
+ const result = await runEditorAction("upload-images", { images }, { ...(port ? { port } : {}), timeoutMs: 60_000 });
33
+ printResultAndExit(result);
34
+ }
35
+ catch (e) {
36
+ printErrorAndExit(e);
37
+ }
38
+ }
39
+ export function createUploadImagesCommand() {
40
+ const cmd = new Command("upload-images");
41
+ cmd
42
+ .description("Upload MANY images in one call (batch upload-image) and return their ids in order. --manifest is a JSON array of { file|url, alt? }. The host uploads them all in a single round-trip. Requires the editor embedded in the ikas admin panel.")
43
+ .requiredOption("--manifest <json>", 'JSON array, e.g. \'[{"file":"/a.png","alt":"A"},{"url":"https://x/b.jpg"}]\'')
44
+ .option("--port <port>", "Dev server WebSocket port", "5201")
45
+ .action(runUploadImages);
46
+ return cmd;
47
+ }
48
+ //# sourceMappingURL=upload-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-images.js","sourceRoot":"","sources":["../../src/commands/upload-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAazD,KAAK,UAAU,eAAe,CAAC,OAA4B;IACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,iBAAiB,CACf,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAC1H,CAAC;IACJ,CAAC;IACD,IAAI,QAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB,CAAC,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,iBAAiB,CAAC,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,0EAA0E;QAC1E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YACzB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACnG,OAAO;gBACL,MAAM;gBACN,QAAQ;gBACR,QAAQ;gBACR,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,eAAe,EACf,EAAE,MAAM,EAAE,EACV,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CACjD,CAAC;QACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACzC,GAAG;SACA,WAAW,CACV,8OAA8O,CAC/O;SACA,cAAc,CACb,mBAAmB,EACnB,8EAA8E,CAC/E;SACA,MAAM,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,eAAe,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCpC,wBAAgB,GAAG,qBAElB;AAED,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyGpC,wBAAgB,GAAG,qBAElB;AAED,cAAc,YAAY,CAAC"}