@ecomweb/cli 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +235 -40
  2. package/dist/base-command.d.ts +8 -0
  3. package/dist/base-command.js +43 -4
  4. package/dist/base-command.js.map +1 -1
  5. package/dist/commands/auth/login.d.ts +6 -4
  6. package/dist/commands/auth/login.js +117 -89
  7. package/dist/commands/auth/login.js.map +1 -1
  8. package/dist/commands/auth/logout.js +28 -9
  9. package/dist/commands/auth/logout.js.map +1 -1
  10. package/dist/commands/auth/profiles/delete.js +11 -0
  11. package/dist/commands/auth/profiles/delete.js.map +1 -1
  12. package/dist/commands/auth/profiles/list.js +2 -2
  13. package/dist/commands/auth/profiles/list.js.map +1 -1
  14. package/dist/commands/auth/status.js +17 -9
  15. package/dist/commands/auth/status.js.map +1 -1
  16. package/dist/commands/deploy.js +16 -3
  17. package/dist/commands/deploy.js.map +1 -1
  18. package/dist/commands/deployments/promote.js +1 -1
  19. package/dist/commands/deployments/promote.js.map +1 -1
  20. package/dist/commands/deployments/rollback.js +1 -1
  21. package/dist/commands/deployments/rollback.js.map +1 -1
  22. package/dist/commands/deployments/unpublish.js +1 -1
  23. package/dist/commands/deployments/unpublish.js.map +1 -1
  24. package/dist/commands/describe.d.ts +1 -1
  25. package/dist/commands/describe.js +4 -4
  26. package/dist/commands/describe.js.map +1 -1
  27. package/dist/commands/{init.d.ts → metafield-definitions/create.d.ts} +4 -6
  28. package/dist/commands/metafield-definitions/create.js +34 -0
  29. package/dist/commands/metafield-definitions/create.js.map +1 -0
  30. package/dist/commands/metafield-definitions/delete.d.ts +21 -0
  31. package/dist/commands/metafield-definitions/delete.js +32 -0
  32. package/dist/commands/metafield-definitions/delete.js.map +1 -0
  33. package/dist/commands/metafield-definitions/get.d.ts +21 -0
  34. package/dist/commands/metafield-definitions/get.js +30 -0
  35. package/dist/commands/metafield-definitions/get.js.map +1 -0
  36. package/dist/commands/metafield-definitions/list.d.ts +19 -0
  37. package/dist/commands/metafield-definitions/list.js +35 -0
  38. package/dist/commands/metafield-definitions/list.js.map +1 -0
  39. package/dist/commands/metafield-definitions/update.d.ts +23 -0
  40. package/dist/commands/metafield-definitions/update.js +39 -0
  41. package/dist/commands/metafield-definitions/update.js.map +1 -0
  42. package/dist/commands/{auth/verify.d.ts → metafields/get.d.ts} +2 -3
  43. package/dist/commands/metafields/get.js +32 -0
  44. package/dist/commands/metafields/get.js.map +1 -0
  45. package/dist/commands/metafields/set.d.ts +24 -0
  46. package/dist/commands/metafields/set.js +83 -0
  47. package/dist/commands/metafields/set.js.map +1 -0
  48. package/dist/commands/metaobject-definitions/create.d.ts +20 -0
  49. package/dist/commands/metaobject-definitions/create.js +33 -0
  50. package/dist/commands/metaobject-definitions/create.js.map +1 -0
  51. package/dist/commands/metaobject-definitions/delete.d.ts +21 -0
  52. package/dist/commands/metaobject-definitions/delete.js +32 -0
  53. package/dist/commands/metaobject-definitions/delete.js.map +1 -0
  54. package/dist/commands/metaobject-definitions/get.d.ts +21 -0
  55. package/dist/commands/metaobject-definitions/get.js +31 -0
  56. package/dist/commands/metaobject-definitions/get.js.map +1 -0
  57. package/dist/commands/metaobject-definitions/list.d.ts +20 -0
  58. package/dist/commands/metaobject-definitions/list.js +41 -0
  59. package/dist/commands/metaobject-definitions/list.js.map +1 -0
  60. package/dist/commands/metaobject-definitions/update.d.ts +23 -0
  61. package/dist/commands/metaobject-definitions/update.js +38 -0
  62. package/dist/commands/metaobject-definitions/update.js.map +1 -0
  63. package/dist/commands/metaobjects/create.d.ts +24 -0
  64. package/dist/commands/metaobjects/create.js +40 -0
  65. package/dist/commands/metaobjects/create.js.map +1 -0
  66. package/dist/commands/metaobjects/delete.d.ts +22 -0
  67. package/dist/commands/metaobjects/delete.js +34 -0
  68. package/dist/commands/metaobjects/delete.js.map +1 -0
  69. package/dist/commands/metaobjects/get.d.ts +22 -0
  70. package/dist/commands/metaobjects/get.js +32 -0
  71. package/dist/commands/metaobjects/get.js.map +1 -0
  72. package/dist/commands/metaobjects/list.d.ts +24 -0
  73. package/dist/commands/metaobjects/list.js +56 -0
  74. package/dist/commands/metaobjects/list.js.map +1 -0
  75. package/dist/commands/metaobjects/update.d.ts +27 -0
  76. package/dist/commands/metaobjects/update.js +45 -0
  77. package/dist/commands/metaobjects/update.js.map +1 -0
  78. package/dist/commands/storefront/init.d.ts +3 -1
  79. package/dist/commands/storefront/init.js +23 -2
  80. package/dist/commands/storefront/init.js.map +1 -1
  81. package/dist/commands/stores/create.d.ts +21 -0
  82. package/dist/commands/stores/create.js +68 -0
  83. package/dist/commands/stores/create.js.map +1 -0
  84. package/dist/commands/stores/current.js +1 -1
  85. package/dist/commands/stores/current.js.map +1 -1
  86. package/dist/commands/stores/list.js +3 -3
  87. package/dist/commands/stores/list.js.map +1 -1
  88. package/dist/commands/stores/switch.js +14 -6
  89. package/dist/commands/stores/switch.js.map +1 -1
  90. package/dist/commands/theme/create.d.ts +20 -0
  91. package/dist/commands/theme/create.js +40 -0
  92. package/dist/commands/theme/create.js.map +1 -0
  93. package/dist/commands/{auth/register.d.ts → theme/duplicate.d.ts} +4 -2
  94. package/dist/commands/theme/duplicate.js +34 -0
  95. package/dist/commands/theme/duplicate.js.map +1 -0
  96. package/dist/commands/theme/link.d.ts +24 -0
  97. package/dist/commands/theme/link.js +60 -0
  98. package/dist/commands/theme/link.js.map +1 -0
  99. package/dist/commands/{setup.d.ts → theme/list.d.ts} +2 -3
  100. package/dist/commands/theme/list.js +32 -0
  101. package/dist/commands/theme/list.js.map +1 -0
  102. package/dist/commands/theme/publish.d.ts +22 -0
  103. package/dist/commands/theme/publish.js +68 -0
  104. package/dist/commands/theme/publish.js.map +1 -0
  105. package/dist/commands/theme/schema/push.d.ts +20 -0
  106. package/dist/commands/theme/schema/push.js +61 -0
  107. package/dist/commands/theme/schema/push.js.map +1 -0
  108. package/dist/commands/theme/update.d.ts +23 -0
  109. package/dist/commands/theme/update.js +62 -0
  110. package/dist/commands/theme/update.js.map +1 -0
  111. package/dist/commands/theme/use.d.ts +23 -0
  112. package/dist/commands/theme/use.js +71 -0
  113. package/dist/commands/theme/use.js.map +1 -0
  114. package/dist/commands/theme/versions.d.ts +21 -0
  115. package/dist/commands/theme/versions.js +33 -0
  116. package/dist/commands/theme/versions.js.map +1 -0
  117. package/dist/lib/api-client.d.ts +5 -4
  118. package/dist/lib/api-client.js +32 -16
  119. package/dist/lib/api-client.js.map +1 -1
  120. package/dist/lib/codex-skill.d.ts +1 -1
  121. package/dist/lib/codex-skill.js +12 -8
  122. package/dist/lib/codex-skill.js.map +1 -1
  123. package/dist/lib/config.d.ts +6 -18
  124. package/dist/lib/config.js +35 -64
  125. package/dist/lib/config.js.map +1 -1
  126. package/dist/lib/credential-store.d.ts +44 -0
  127. package/dist/lib/credential-store.js +137 -0
  128. package/dist/lib/credential-store.js.map +1 -0
  129. package/dist/lib/custom-data.d.ts +42 -0
  130. package/dist/lib/custom-data.js +167 -0
  131. package/dist/lib/custom-data.js.map +1 -0
  132. package/dist/lib/deployments.d.ts +8 -1
  133. package/dist/lib/deployments.js +58 -11
  134. package/dist/lib/deployments.js.map +1 -1
  135. package/dist/lib/describe-metafields.d.ts +9 -0
  136. package/dist/lib/describe-metafields.js +213 -0
  137. package/dist/lib/describe-metafields.js.map +1 -0
  138. package/dist/lib/device-login.d.ts +22 -0
  139. package/dist/lib/device-login.js +66 -0
  140. package/dist/lib/device-login.js.map +1 -0
  141. package/dist/lib/errors.d.ts +1 -0
  142. package/dist/lib/errors.js +6 -1
  143. package/dist/lib/errors.js.map +1 -1
  144. package/dist/lib/file-lock.d.ts +6 -0
  145. package/dist/lib/file-lock.js +66 -0
  146. package/dist/lib/file-lock.js.map +1 -0
  147. package/dist/lib/live-confirm.d.ts +11 -0
  148. package/dist/lib/live-confirm.js +34 -0
  149. package/dist/lib/live-confirm.js.map +1 -0
  150. package/dist/lib/open-browser.d.ts +13 -0
  151. package/dist/lib/open-browser.js +38 -0
  152. package/dist/lib/open-browser.js.map +1 -0
  153. package/dist/lib/pending-login.d.ts +5 -0
  154. package/dist/lib/pending-login.js +39 -0
  155. package/dist/lib/pending-login.js.map +1 -0
  156. package/dist/lib/project-setup.d.ts +1 -0
  157. package/dist/lib/project-setup.js +20 -0
  158. package/dist/lib/project-setup.js.map +1 -1
  159. package/dist/lib/secure-file.d.ts +1 -0
  160. package/dist/lib/secure-file.js +15 -0
  161. package/dist/lib/secure-file.js.map +1 -0
  162. package/dist/lib/session.d.ts +40 -0
  163. package/dist/lib/session.js +80 -0
  164. package/dist/lib/session.js.map +1 -0
  165. package/dist/lib/store-selection.d.ts +19 -0
  166. package/dist/lib/store-selection.js +23 -0
  167. package/dist/lib/store-selection.js.map +1 -0
  168. package/dist/lib/template-scaffold.d.ts +1 -0
  169. package/dist/lib/template-scaffold.js +5 -2
  170. package/dist/lib/template-scaffold.js.map +1 -1
  171. package/dist/lib/theme-schema-export.d.ts +1 -1
  172. package/dist/lib/theme-schema-export.js +4 -5
  173. package/dist/lib/theme-schema-export.js.map +1 -1
  174. package/dist/lib/themes.d.ts +143 -0
  175. package/dist/lib/themes.js +277 -0
  176. package/dist/lib/themes.js.map +1 -0
  177. package/dist/lib/validators.js +16 -0
  178. package/dist/lib/validators.js.map +1 -1
  179. package/oclif.manifest.json +8168 -5388
  180. package/package.json +2 -1
  181. package/dist/commands/auth/register.js +0 -35
  182. package/dist/commands/auth/register.js.map +0 -1
  183. package/dist/commands/auth/verify.js +0 -43
  184. package/dist/commands/auth/verify.js.map +0 -1
  185. package/dist/commands/init.js +0 -84
  186. package/dist/commands/init.js.map +0 -1
  187. package/dist/commands/setup.js +0 -186
  188. package/dist/commands/setup.js.map +0 -1
  189. package/dist/lib/email-login.d.ts +0 -35
  190. package/dist/lib/email-login.js +0 -86
  191. package/dist/lib/email-login.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { BaseCommand } from "../base-command";
2
- export default class Setup extends BaseCommand {
1
+ import { BaseCommand } from "../../base-command";
2
+ export default class ThemeList extends BaseCommand {
3
3
  static description: string;
4
4
  static examples: string[];
5
5
  static flags: {
@@ -15,5 +15,4 @@ export default class Setup extends BaseCommand {
15
15
  exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
16
  };
17
17
  run(): Promise<void>;
18
- private promptNewStore;
19
18
  }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_command_1 = require("../../base-command");
4
+ const output_1 = require("../../lib/output");
5
+ const themes_1 = require("../../lib/themes");
6
+ class ThemeList extends base_command_1.BaseCommand {
7
+ async run() {
8
+ const storeRef = this.requireStore();
9
+ const rows = (await (0, themes_1.listThemes)(this.apiClient)).map(themes_1.themeRow);
10
+ this.outputResult((0, output_1.listEnvelope)("theme", storeRef, rows, { total: rows.length }, {
11
+ availableActions: ["create", "duplicate", "versions", "use", "link", "update", "publish", "schema push"],
12
+ hints: {
13
+ create: "ecomweb theme create [--from <catalog id>] [--name <name>]",
14
+ duplicate: "ecomweb theme duplicate <id> [--name <name>]",
15
+ versions: "ecomweb theme versions <id>",
16
+ use: "ecomweb theme use <id> <version id>",
17
+ link: "ecomweb theme link <id> --url <https url>",
18
+ update: "ecomweb theme update <id>",
19
+ publish: "ecomweb theme publish <id>",
20
+ schema_push: "ecomweb theme schema push --theme <id>",
21
+ deploy: "ecomweb deploy --theme <id>",
22
+ },
23
+ }));
24
+ }
25
+ }
26
+ ThemeList.description = "List the store's themes: id, name, mode (theme, custom or headless: the kind of the version in use), the version in use, which one is live, and a newer release to update to";
27
+ ThemeList.examples = ["ecomweb theme list", "ecomweb theme list --output table"];
28
+ ThemeList.flags = {
29
+ ...base_command_1.BaseCommand.baseFlags,
30
+ };
31
+ exports.default = ThemeList;
32
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/theme/list.ts"],"names":[],"mappings":";;AAAA,qDAAiD;AACjD,6CAAgD;AAChD,6CAAwD;AAExD,MAAqB,SAAU,SAAQ,0BAAW;IAUhD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,mBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,CACf,IAAA,qBAAY,EAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;YAC5D,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;YACxG,KAAK,EAAE;gBACL,MAAM,EAAE,4DAA4D;gBACpE,SAAS,EAAE,8CAA8C;gBACzD,QAAQ,EAAE,6BAA6B;gBACvC,GAAG,EAAE,qCAAqC;gBAC1C,IAAI,EAAE,2CAA2C;gBACjD,MAAM,EAAE,2BAA2B;gBACnC,OAAO,EAAE,4BAA4B;gBACrC,WAAW,EAAE,wCAAwC;gBACrD,MAAM,EAAE,6BAA6B;aACtC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;;AA5BM,qBAAW,GAChB,8KAA8K,CAAC;AAE1K,kBAAQ,GAAG,CAAC,oBAAoB,EAAE,mCAAmC,CAAC,CAAC;AAEvE,eAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;CACzB,CAAC;kBARiB,SAAS"}
@@ -0,0 +1,22 @@
1
+ import { BaseCommand } from "../../base-command";
2
+ export default class ThemePublish extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ yes: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ "store-ref": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ "api-key": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ "api-url": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ "dry-run": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ profile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ full: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
18
+ fields: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const prompts_1 = require("@inquirer/prompts");
4
+ const core_1 = require("@oclif/core");
5
+ const base_command_1 = require("../../base-command");
6
+ const errors_1 = require("../../lib/errors");
7
+ const live_confirm_1 = require("../../lib/live-confirm");
8
+ const output_1 = require("../../lib/output");
9
+ const themes_1 = require("../../lib/themes");
10
+ class ThemePublish extends base_command_1.BaseCommand {
11
+ async run() {
12
+ const storeRef = this.requireStore();
13
+ const { args } = await this.parse(ThemePublish);
14
+ const id = args.id;
15
+ if (this.isDryRun) {
16
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "publish (dry-run)", storeRef, { theme: id }));
17
+ return;
18
+ }
19
+ const interactive = (0, live_confirm_1.isInteractive)();
20
+ const yes = this.getFlag("yes");
21
+ if (!interactive && !yes) {
22
+ throw new errors_1.CliError("CONFIRMATION_REQUIRED", `Publishing makes theme ${id} live for shoppers right away: confirm it with --yes.`, errors_1.ExitCode.VALIDATION, { hint: `ecomweb theme publish ${id} --yes` });
23
+ }
24
+ const themes = await (0, themes_1.listThemes)(this.apiClient);
25
+ const target = themes.find((t) => String(t.id) === id);
26
+ if (!target) {
27
+ throw new errors_1.CliError("THEME_NOT_FOUND", `This store has no theme ${id}.`, errors_1.ExitCode.NOT_FOUND, {
28
+ hint: "List the store's themes with: ecomweb theme list",
29
+ });
30
+ }
31
+ const previous = themes.find((t) => t.is_published);
32
+ if (!yes && !target.is_published) {
33
+ const label = target.current_version?.label;
34
+ const shows = label ? `, using ${label}` : "";
35
+ const replaces = previous ? `: it replaces ${previous.name} for shoppers right away` : "";
36
+ let ok = false;
37
+ try {
38
+ ok = await (0, prompts_1.confirm)({ message: `Publish ${target.name} (${id})${shows}${replaces}. Publish it?`, default: false }, { output: process.stderr });
39
+ }
40
+ catch (error) {
41
+ if (!(0, live_confirm_1.promptCancelled)(error))
42
+ throw error;
43
+ }
44
+ if (!ok) {
45
+ throw new errors_1.CliError("CANCELLED", "Not published: the shop is unchanged.", errors_1.ExitCode.ERROR, {
46
+ hint: `ecomweb theme publish ${id} --yes`,
47
+ });
48
+ }
49
+ }
50
+ const row = (0, themes_1.themeRow)(await (0, themes_1.publishTheme)(this.apiClient, id));
51
+ const undo = previous && String(previous.id) !== row.id ? String(previous.id) : undefined;
52
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "publish", storeRef, row, {
53
+ list: "ecomweb theme list",
54
+ ...(undo && { undo: `ecomweb theme publish ${undo}` }),
55
+ }));
56
+ }
57
+ }
58
+ ThemePublish.description = "Make a theme live: shoppers see its version in use (see ecomweb theme versions) right away. Asks first on a terminal; --yes skips that and is required in CI or without a terminal";
59
+ ThemePublish.examples = ["ecomweb theme publish 12", "ecomweb theme publish 12 --yes"];
60
+ ThemePublish.args = {
61
+ id: core_1.Args.string({ description: "The theme to publish (see ecomweb theme list)", required: true }),
62
+ };
63
+ ThemePublish.flags = {
64
+ ...base_command_1.BaseCommand.baseFlags,
65
+ yes: core_1.Flags.boolean({ char: "y", description: "Publish without asking", default: false }),
66
+ };
67
+ exports.default = ThemePublish;
68
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/theme/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { BaseCommand } from "../../../base-command";
2
+ export default class ThemeSchemaPush extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ theme: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ dir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
8
+ "store-ref": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ "api-key": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ "api-url": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ "dry-run": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ profile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ full: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ fields: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_path_1 = __importDefault(require("node:path"));
7
+ const core_1 = require("@oclif/core");
8
+ const base_command_1 = require("../../../base-command");
9
+ const custom_data_1 = require("../../../lib/custom-data");
10
+ const errors_1 = require("../../../lib/errors");
11
+ const output_1 = require("../../../lib/output");
12
+ const project_setup_1 = require("../../../lib/project-setup");
13
+ const theme_schema_export_1 = require("../../../lib/theme-schema-export");
14
+ const themes_1 = require("../../../lib/themes");
15
+ class ThemeSchemaPush extends base_command_1.BaseCommand {
16
+ async run() {
17
+ const dir = node_path_1.default.resolve(this.getFlag("dir"));
18
+ const storeRef = this.requireStore(dir);
19
+ const raw = this.getFlag("theme") ?? (0, project_setup_1.projectStoreThemeId)(dir);
20
+ if (!raw) {
21
+ throw new errors_1.CliError("THEME_REQUIRED", "Say which theme to push the schema to.", errors_1.ExitCode.VALIDATION, {
22
+ hint: "Run ecomweb theme schema push --theme <id> (see ecomweb theme list), set ECOMWEB_STORE_THEME_ID, or set storeThemeId in .ecomweb.json.",
23
+ });
24
+ }
25
+ const themeId = (0, custom_data_1.routeIdArg)(raw, "--theme");
26
+ const settingsSchema = await (0, theme_schema_export_1.exportThemeSchema)(dir, undefined, "push again");
27
+ if (settingsSchema === undefined) {
28
+ throw new errors_1.CliError("THEME_EXPORT_MISSING", `${dir} has no theme:export script to read its settings schema from.`, errors_1.ExitCode.VALIDATION, {
29
+ hint: "Add a theme:export script that prints the theme release JSON (the storefront template has one), or run this in your storefront project (--dir).",
30
+ });
31
+ }
32
+ if (this.isDryRun) {
33
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "schema push (dry-run)", storeRef, { theme: themeId, settings_schema: settingsSchema }));
34
+ return;
35
+ }
36
+ const theme = await (0, themes_1.pushThemeSchema)(this.apiClient, themeId, settingsSchema);
37
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "schema push", storeRef, {
38
+ ...(0, themes_1.themeRow)({ ...theme, id: theme?.id ?? themeId }),
39
+ sections: Array.isArray(settingsSchema) ? settingsSchema.length : undefined,
40
+ }));
41
+ }
42
+ }
43
+ ThemeSchemaPush.description = "Push the settings schema of a theme linked to your own site (ecomweb theme link), from the project's pnpm run theme:export, so its settings can be edited in the dashboard. Builds get theirs with each deploy";
44
+ ThemeSchemaPush.examples = [
45
+ "ecomweb theme schema push --theme 9",
46
+ "ECOMWEB_STORE_THEME_ID=9 ecomweb theme schema push",
47
+ "ecomweb theme schema push --dir ./my-storefront",
48
+ ];
49
+ ThemeSchemaPush.flags = {
50
+ ...base_command_1.BaseCommand.baseFlags,
51
+ theme: core_1.Flags.string({
52
+ description: "The theme that uses a link (its id from ecomweb theme list). Also ECOMWEB_STORE_THEME_ID or storeThemeId in .ecomweb.json",
53
+ env: "ECOMWEB_STORE_THEME_ID",
54
+ }),
55
+ dir: core_1.Flags.string({
56
+ description: "The storefront project whose schema to push",
57
+ default: ".",
58
+ }),
59
+ };
60
+ exports.default = ThemeSchemaPush;
61
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../src/commands/theme/schema/push.ts"],"names":[],"mappings":";;;;;AAAA,0DAA6B;AAC7B,sCAAoC;AACpC,wDAAoD;AACpD,0DAAsD;AACtD,gDAAyD;AACzD,gDAAuD;AACvD,8DAAiE;AACjE,0EAAqE;AACrE,gDAAgE;AAEhE,MAAqB,eAAgB,SAAQ,0BAAW;IAsBtD,KAAK,CAAC,GAAG;QACP,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAS,KAAK,CAAC,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAqB,OAAO,CAAC,IAAI,IAAA,mCAAmB,EAAC,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,iBAAQ,CAAC,gBAAgB,EAAE,wCAAwC,EAAE,iBAAQ,CAAC,UAAU,EAAE;gBAClG,IAAI,EAAE,wIAAwI;aAC/I,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,IAAA,wBAAU,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,cAAc,GAAG,MAAM,IAAA,uCAAiB,EAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,iBAAQ,CAAC,sBAAsB,EAAE,GAAG,GAAG,+DAA+D,EAAE,iBAAQ,CAAC,UAAU,EAAE;gBACrI,IAAI,EAAE,iJAAiJ;aACxJ,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,CACf,IAAA,yBAAgB,EAAC,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,CAClH,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAA,wBAAe,EAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAC7E,IAAI,CAAC,YAAY,CACf,IAAA,yBAAgB,EAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE;YACjD,GAAG,IAAA,iBAAQ,EAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC;YACnD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC,CACH,CAAC;IACJ,CAAC;;AAtDM,2BAAW,GAChB,gNAAgN,CAAC;AAE5M,wBAAQ,GAAG;IAChB,qCAAqC;IACrC,oDAAoD;IACpD,iDAAiD;CAClD,CAAC;AAEK,qBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,KAAK,EAAE,YAAK,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,2HAA2H;QACxI,GAAG,EAAE,wBAAwB;KAC9B,CAAC;IACF,GAAG,EAAE,YAAK,CAAC,MAAM,CAAC;QAChB,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,GAAG;KACb,CAAC;CACH,CAAC;kBApBiB,eAAe"}
@@ -0,0 +1,23 @@
1
+ import { BaseCommand } from "../../base-command";
2
+ export default class ThemeUpdate extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ version: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ yes: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ "store-ref": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ "api-key": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ "api-url": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ "dry-run": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
17
+ profile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ full: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
19
+ fields: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ };
22
+ run(): Promise<void>;
23
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const live_confirm_1 = require("../../lib/live-confirm");
6
+ const output_1 = require("../../lib/output");
7
+ const themes_1 = require("../../lib/themes");
8
+ class ThemeUpdate extends base_command_1.BaseCommand {
9
+ async run() {
10
+ const storeRef = this.requireStore();
11
+ const { args } = await this.parse(ThemeUpdate);
12
+ const id = args.id;
13
+ const version = this.getFlag("version")?.trim() || undefined;
14
+ if (this.isDryRun) {
15
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "update (dry-run)", storeRef, { theme: id, ...(0, themes_1.releaseVersionBody)(version) }));
16
+ return;
17
+ }
18
+ const yes = this.getFlag("yes");
19
+ const retry = `ecomweb theme update ${id}${version ? ` --version ${version}` : ""} --yes`;
20
+ const theme = await (0, themes_1.getThemeForChange)(this.apiClient, id, { yes, retry });
21
+ const current = theme?.current_version;
22
+ const before = current?.id !== undefined ? String(current.id) : undefined;
23
+ const onRelease = current?.kind === "release";
24
+ const unchanged = version ? current?.release_version === version : !(0, themes_1.newerRelease)(theme ?? {});
25
+ if (theme && onRelease && unchanged) {
26
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "update", storeRef, { ...(0, themes_1.themeRow)(theme), unchanged: true }, {
27
+ versions: `ecomweb theme versions ${id}`,
28
+ }));
29
+ return;
30
+ }
31
+ if (theme?.is_published) {
32
+ const target = version ?? theme.latest_release?.version;
33
+ const release = target ? `release ${target}` : "the newest release";
34
+ await (0, live_confirm_1.confirmLiveChange)({
35
+ yes,
36
+ question: `${theme.name} (${id}) is live: shoppers will see ${release} from the theme store, right away. Update it?`,
37
+ required: `${theme.name} (${id}) is live: updating it changes what shoppers see right away. Confirm it with --yes.`,
38
+ retry,
39
+ });
40
+ }
41
+ const added = await (0, themes_1.addReleaseVersion)(this.apiClient, id, version);
42
+ const row = (0, themes_1.themeRow)(added.theme);
43
+ const changed = before !== undefined && before !== String(added.version.id);
44
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "update", storeRef, { ...row, version_id: String(added.version.id) }, {
45
+ versions: `ecomweb theme versions ${id}`,
46
+ ...(changed && { undo: `ecomweb theme use ${id} ${before}` }),
47
+ ...(!row.live && { publish: `ecomweb theme publish ${id}` }),
48
+ }));
49
+ }
50
+ }
51
+ ThemeUpdate.description = "Add a release of the theme's catalog theme (default: the newest) as a version, and use it. Settings stay with the theme. On the live theme it asks first on a terminal; --yes skips that and is required in CI or without a terminal";
52
+ ThemeUpdate.examples = ["ecomweb theme update 12", "ecomweb theme update 12 --version 1.1.0 --yes"];
53
+ ThemeUpdate.args = {
54
+ id: core_1.Args.string({ description: "The theme (see ecomweb theme list)", required: true }),
55
+ };
56
+ ThemeUpdate.flags = {
57
+ ...base_command_1.BaseCommand.baseFlags,
58
+ version: core_1.Flags.string({ description: "The release to add (default: the newest in the theme store)" }),
59
+ yes: core_1.Flags.boolean({ char: "y", description: "On the live theme: update it without asking", default: false }),
60
+ };
61
+ exports.default = ThemeUpdate;
62
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/theme/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { BaseCommand } from "../../base-command";
2
+ export default class ThemeUse extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ versionId: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ yes: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ "store-ref": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ "api-key": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ "api-url": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
+ "dry-run": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
17
+ profile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ full: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
19
+ fields: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ };
22
+ run(): Promise<void>;
23
+ }
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const errors_1 = require("../../lib/errors");
6
+ const live_confirm_1 = require("../../lib/live-confirm");
7
+ const output_1 = require("../../lib/output");
8
+ const themes_1 = require("../../lib/themes");
9
+ class ThemeUse extends base_command_1.BaseCommand {
10
+ async run() {
11
+ const storeRef = this.requireStore();
12
+ const { args } = await this.parse(ThemeUse);
13
+ const { id, versionId } = args;
14
+ if (this.isDryRun) {
15
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "use (dry-run)", storeRef, { theme: id, version: versionId }));
16
+ return;
17
+ }
18
+ const yes = this.getFlag("yes");
19
+ const retry = `ecomweb theme use ${id} ${versionId} --yes`;
20
+ const theme = await (0, themes_1.getThemeForChange)(this.apiClient, id, { yes, retry });
21
+ const current = theme?.current_version;
22
+ const before = current?.id !== undefined ? String(current.id) : undefined;
23
+ if (theme?.is_published && !yes && before !== versionId) {
24
+ const required = `${theme.name} (${id}) is live: using version ${versionId} changes what shoppers see right away. Confirm it with --yes.`;
25
+ if (!(0, live_confirm_1.isInteractive)())
26
+ throw (0, live_confirm_1.confirmationRequired)(required, retry);
27
+ const version = (await (0, themes_1.listVersions)(this.apiClient, id)).find((v) => String(v.id) === versionId);
28
+ if (!version) {
29
+ throw new errors_1.CliError("VERSION_NOT_FOUND", `Theme ${id} has no version ${versionId}.`, errors_1.ExitCode.NOT_FOUND, {
30
+ hint: `List the theme's versions with: ecomweb theme versions ${id}`,
31
+ });
32
+ }
33
+ if (!version.usable && version.unusable_reason === "hosting_not_in_plan")
34
+ throw (0, themes_1.hostingNotInPlan)(versionId);
35
+ if (!version.usable) {
36
+ throw new errors_1.CliError("VERSION_NOT_USABLE", `Version ${versionId} can't be used.`, errors_1.ExitCode.VALIDATION, {
37
+ hint: (0, themes_1.unusableHint)(version.unusable_reason, { themeId: id }),
38
+ ...(version.unusable_reason && { details: { reason: version.unusable_reason } }),
39
+ });
40
+ }
41
+ const otherKind = version.kind !== current?.kind;
42
+ const copyFirst = otherKind ? ` To try it first, copy the theme (ecomweb theme duplicate ${id}) and use it there.` : "";
43
+ await (0, live_confirm_1.confirmLiveChange)({
44
+ yes,
45
+ question: `${theme.name} (${id}) is live: shoppers will see ${(0, themes_1.describeVersion)(version)}, right away.${copyFirst} Use it?`,
46
+ required,
47
+ retry,
48
+ });
49
+ }
50
+ const row = (0, themes_1.themeRow)(await (0, themes_1.useVersion)(this.apiClient, id, versionId));
51
+ const changed = before !== undefined && before !== versionId;
52
+ this.outputResult((0, output_1.mutationEnvelope)("theme", "use", storeRef, row, {
53
+ versions: `ecomweb theme versions ${id}`,
54
+ ...(changed && { undo: `ecomweb theme use ${id} ${before}` }),
55
+ ...(row.mode === "headless" && { schema_push: `ecomweb theme schema push --theme ${id}` }),
56
+ ...(!row.live && { publish: `ecomweb theme publish ${id}` }),
57
+ }));
58
+ }
59
+ }
60
+ ThemeUse.description = "Use one of a theme's versions (see ecomweb theme versions): a release, a build or a link. Settings stay with the theme. On the live theme shoppers see it right away, so it asks first on a terminal; --yes skips that and is required in CI or without a terminal";
61
+ ThemeUse.examples = ["ecomweb theme use 12 31", "ecomweb theme use 12 31 --yes"];
62
+ ThemeUse.args = {
63
+ id: core_1.Args.string({ description: "The theme (see ecomweb theme list)", required: true }),
64
+ versionId: core_1.Args.string({ description: "The version to use (see ecomweb theme versions <id>)", required: true }),
65
+ };
66
+ ThemeUse.flags = {
67
+ ...base_command_1.BaseCommand.baseFlags,
68
+ yes: core_1.Flags.boolean({ char: "y", description: "On the live theme: use it without asking", default: false }),
69
+ };
70
+ exports.default = ThemeUse;
71
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../../src/commands/theme/use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { BaseCommand } from "../../base-command";
2
+ export default class ThemeVersions extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ "store-ref": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ "api-key": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ "api-url": import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ output: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ quiet: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ "dry-run": import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ profile: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ full: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
17
+ fields: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ exclude: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ };
20
+ run(): Promise<void>;
21
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const output_1 = require("../../lib/output");
6
+ const themes_1 = require("../../lib/themes");
7
+ class ThemeVersions extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const storeRef = this.requireStore();
10
+ const { args } = await this.parse(ThemeVersions);
11
+ const id = args.id;
12
+ const rows = (await (0, themes_1.listVersions)(this.apiClient, id)).map(themes_1.versionRow);
13
+ this.outputResult((0, output_1.listEnvelope)("theme version", storeRef, rows, { total: rows.length, theme: id }, {
14
+ availableActions: ["use", "link", "update"],
15
+ hints: {
16
+ use: `ecomweb theme use ${id} <version id>`,
17
+ link: `ecomweb theme link ${id} --url <https url>`,
18
+ update: `ecomweb theme update ${id}`,
19
+ deploy: `ecomweb deploy --theme ${id}`,
20
+ },
21
+ }));
22
+ }
23
+ }
24
+ ThemeVersions.description = "List a theme's versions, newest first: releases from the theme store, builds of your code (ecomweb deploy) and links to your own site. One is in use (current); `ecomweb theme use` switches";
25
+ ThemeVersions.examples = ["ecomweb theme versions 12", "ecomweb theme versions 12 --output table"];
26
+ ThemeVersions.args = {
27
+ id: core_1.Args.string({ description: "The theme (see ecomweb theme list)", required: true }),
28
+ };
29
+ ThemeVersions.flags = {
30
+ ...base_command_1.BaseCommand.baseFlags,
31
+ };
32
+ exports.default = ThemeVersions;
33
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../src/commands/theme/versions.ts"],"names":[],"mappings":";;AAAA,sCAAmC;AACnC,qDAAiD;AACjD,6CAAgD;AAChD,6CAA4D;AAE5D,MAAqB,aAAc,SAAQ,0BAAW;IAcpD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,qBAAY,EAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAU,CAAC,CAAC;QACtE,IAAI,CAAC,YAAY,CACf,IAAA,qBAAY,EAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YAC/E,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;YAC3C,KAAK,EAAE;gBACL,GAAG,EAAE,qBAAqB,EAAE,eAAe;gBAC3C,IAAI,EAAE,sBAAsB,EAAE,oBAAoB;gBAClD,MAAM,EAAE,wBAAwB,EAAE,EAAE;gBACpC,MAAM,EAAE,0BAA0B,EAAE,EAAE;aACvC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;;AA7BM,yBAAW,GAChB,8LAA8L,CAAC;AAE1L,sBAAQ,GAAG,CAAC,2BAA2B,EAAE,0CAA0C,CAAC,CAAC;AAErF,kBAAI,GAAG;IACZ,EAAE,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oCAAoC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACvF,CAAC;AAEK,mBAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;CACzB,CAAC;kBAZiB,aAAa"}
@@ -1,9 +1,10 @@
1
1
  import { AxiosRequestConfig } from "axios";
2
2
  import FormData from "form-data";
3
+ import { SessionProvider } from "./session";
3
4
  export interface ApiClientOptions {
4
5
  baseUrl: string;
5
6
  apiKey?: string;
6
- jwtToken?: string;
7
+ session?: SessionProvider;
7
8
  timeout?: number;
8
9
  }
9
10
  export interface PaginatedResponse<T> {
@@ -19,11 +20,11 @@ export interface PaginatedResponse<T> {
19
20
  };
20
21
  }
21
22
  export declare class ApiClient {
23
+ private readonly options;
22
24
  private client;
23
25
  private storeRef?;
24
26
  constructor(options: ApiClientOptions);
25
- setJwtToken(token: string): void;
26
- clearAuth(): void;
27
+ anonymous(): ApiClient;
27
28
  setStoreRef(storeRef: string): void;
28
29
  private storePath;
29
30
  get<T = any>(path: string, params?: Record<string, any>): Promise<T>;
@@ -45,6 +46,6 @@ export declare class ApiClient {
45
46
  listAll<T = any>(path: string, params?: Record<string, any>): Promise<T[]>;
46
47
  private paginateAll;
47
48
  health(): Promise<any>;
48
- listStores(): Promise<any[]>;
49
+ listStores(params?: Record<string, any>): Promise<any[]>;
49
50
  getStore(ref: string): Promise<any>;
50
51
  }
@@ -5,35 +5,51 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ApiClient = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
+ const form_data_1 = __importDefault(require("form-data"));
9
+ const session_1 = require("./session");
8
10
  class ApiClient {
9
11
  constructor(options) {
12
+ this.options = options;
10
13
  this.client = axios_1.default.create({
11
14
  baseURL: options.baseUrl,
12
15
  timeout: options.timeout || 30_000,
13
16
  headers: {
14
17
  "Content-Type": "application/json",
15
18
  ...(options.apiKey && { "x-api-key": options.apiKey }),
16
- ...(options.jwtToken && { Authorization: `Bearer ${options.jwtToken}` }),
17
19
  },
18
20
  });
21
+ this.client.interceptors.request.use(async (config) => {
22
+ const session = this.options.session;
23
+ if (!this.options.apiKey && session?.hasSession() && !config.headers.has("Authorization")) {
24
+ config.headers.set("Authorization", `Bearer ${await session.accessToken()}`);
25
+ }
26
+ return config;
27
+ });
19
28
  this.client.interceptors.response.use(undefined, async (error) => {
20
29
  const config = error.config;
21
- if (!error.response || error.response.status !== 429 || config._retryCount >= 3) {
22
- return Promise.reject(error);
30
+ const status = error.response?.status;
31
+ if (config && status === 429 && (config._retryCount ?? 0) < 3) {
32
+ config._retryCount = (config._retryCount || 0) + 1;
33
+ const delay = Math.pow(2, config._retryCount) * 1000;
34
+ await new Promise((r) => setTimeout(r, delay));
35
+ return this.client.request(config);
23
36
  }
24
- config._retryCount = (config._retryCount || 0) + 1;
25
- const delay = Math.pow(2, config._retryCount) * 1000;
26
- await new Promise((r) => setTimeout(r, delay));
27
- return this.client.request(config);
37
+ const session = this.options.session;
38
+ if (config && status === 401 && session && !this.options.apiKey) {
39
+ if (!session.hasSession())
40
+ return Promise.reject((0, session_1.notLoggedIn)());
41
+ const replayable = !(config.data instanceof form_data_1.default);
42
+ if (replayable && !config._authRetried) {
43
+ config._authRetried = true;
44
+ config.headers.set("Authorization", `Bearer ${await session.accessToken({ force: true })}`);
45
+ return this.client.request(config);
46
+ }
47
+ }
48
+ return Promise.reject(error);
28
49
  });
29
50
  }
30
- setJwtToken(token) {
31
- this.client.defaults.headers.common["Authorization"] = `Bearer ${token}`;
32
- delete this.client.defaults.headers.common["x-api-key"];
33
- }
34
- clearAuth() {
35
- delete this.client.defaults.headers.common["Authorization"];
36
- delete this.client.defaults.headers.common["x-api-key"];
51
+ anonymous() {
52
+ return new ApiClient({ baseUrl: this.options.baseUrl, timeout: this.options.timeout });
37
53
  }
38
54
  setStoreRef(storeRef) {
39
55
  this.storeRef = storeRef;
@@ -129,8 +145,8 @@ class ApiClient {
129
145
  async health() {
130
146
  return this.get("/health");
131
147
  }
132
- async listStores() {
133
- const result = await this.get("/stores");
148
+ async listStores(params) {
149
+ const result = await this.get("/stores", params);
134
150
  return Array.isArray(result) ? result : result.data || [];
135
151
  }
136
152
  async getStore(ref) {