@salesforce/b2c-cli 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/README.md +70 -1
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +14 -1
  4. package/dist/commands/am/clients/create.d.ts +28 -0
  5. package/dist/commands/am/clients/create.js +158 -0
  6. package/dist/commands/am/clients/create.js.map +1 -0
  7. package/dist/commands/am/clients/delete.d.ts +13 -0
  8. package/dist/commands/am/clients/delete.js +29 -0
  9. package/dist/commands/am/clients/delete.js.map +1 -0
  10. package/dist/commands/am/clients/get.d.ts +26 -0
  11. package/dist/commands/am/clients/get.js +186 -0
  12. package/dist/commands/am/clients/get.js.map +1 -0
  13. package/dist/commands/am/clients/list.d.ts +18 -0
  14. package/dist/commands/am/clients/list.js +139 -0
  15. package/dist/commands/am/clients/list.js.map +1 -0
  16. package/dist/commands/am/clients/password.d.ts +16 -0
  17. package/dist/commands/am/clients/password.js +51 -0
  18. package/dist/commands/am/clients/password.js.map +1 -0
  19. package/dist/commands/am/clients/update.d.ts +34 -0
  20. package/dist/commands/am/clients/update.js +146 -0
  21. package/dist/commands/am/clients/update.js.map +1 -0
  22. package/dist/commands/am/orgs/get.d.ts +23 -0
  23. package/dist/commands/am/orgs/get.js +175 -0
  24. package/dist/commands/am/orgs/get.js.map +1 -0
  25. package/dist/commands/am/orgs/list.d.ts +18 -0
  26. package/dist/commands/am/orgs/list.js +149 -0
  27. package/dist/commands/am/orgs/list.js.map +1 -0
  28. package/dist/commands/am/roles/get.d.ts +15 -0
  29. package/dist/commands/am/roles/get.js +63 -0
  30. package/dist/commands/am/roles/get.js.map +1 -0
  31. package/dist/commands/am/roles/grant.d.ts +18 -0
  32. package/dist/commands/am/roles/grant.js +72 -0
  33. package/dist/commands/am/roles/grant.js.map +1 -0
  34. package/dist/commands/am/roles/list.d.ts +22 -0
  35. package/dist/commands/am/roles/list.js +142 -0
  36. package/dist/commands/am/roles/list.js.map +1 -0
  37. package/dist/commands/am/roles/revoke.d.ts +18 -0
  38. package/dist/commands/am/roles/revoke.js +72 -0
  39. package/dist/commands/am/roles/revoke.js.map +1 -0
  40. package/dist/commands/am/users/create.d.ts +17 -0
  41. package/dist/commands/am/users/create.js +67 -0
  42. package/dist/commands/am/users/create.js.map +1 -0
  43. package/dist/commands/am/users/delete.d.ts +16 -0
  44. package/dist/commands/am/users/delete.js +63 -0
  45. package/dist/commands/am/users/delete.js.map +1 -0
  46. package/dist/commands/am/users/get.d.ts +18 -0
  47. package/dist/commands/am/users/get.js +96 -0
  48. package/dist/commands/am/users/get.js.map +1 -0
  49. package/dist/commands/am/users/list.d.ts +21 -0
  50. package/dist/commands/am/users/list.js +162 -0
  51. package/dist/commands/am/users/list.js.map +1 -0
  52. package/dist/commands/am/users/reset.d.ts +13 -0
  53. package/dist/commands/am/users/reset.js +43 -0
  54. package/dist/commands/am/users/reset.js.map +1 -0
  55. package/dist/commands/am/users/update.d.ts +18 -0
  56. package/dist/commands/am/users/update.js +63 -0
  57. package/dist/commands/am/users/update.js.map +1 -0
  58. package/dist/commands/auth/token.js +1 -1
  59. package/dist/commands/auth/token.js.map +1 -1
  60. package/dist/commands/code/activate.d.ts +2 -1
  61. package/dist/commands/code/delete.d.ts +2 -1
  62. package/dist/commands/code/deploy.d.ts +2 -1
  63. package/dist/commands/code/watch.d.ts +2 -1
  64. package/dist/commands/content/export.d.ts +57 -0
  65. package/dist/commands/content/export.js +217 -0
  66. package/dist/commands/content/export.js.map +1 -0
  67. package/dist/commands/content/list.d.ts +56 -0
  68. package/dist/commands/content/list.js +133 -0
  69. package/dist/commands/content/list.js.map +1 -0
  70. package/dist/commands/docs/download.d.ts +2 -1
  71. package/dist/commands/ecdn/cache/purge.d.ts +2 -1
  72. package/dist/commands/ecdn/certificates/add.d.ts +2 -1
  73. package/dist/commands/ecdn/certificates/delete.d.ts +2 -1
  74. package/dist/commands/ecdn/certificates/list.d.ts +2 -1
  75. package/dist/commands/ecdn/certificates/update.d.ts +2 -1
  76. package/dist/commands/ecdn/certificates/validate.d.ts +2 -1
  77. package/dist/commands/ecdn/cipher-suites/get.d.ts +2 -1
  78. package/dist/commands/ecdn/cipher-suites/update.d.ts +2 -1
  79. package/dist/commands/ecdn/logpush/jobs/create.d.ts +2 -1
  80. package/dist/commands/ecdn/logpush/jobs/delete.d.ts +2 -1
  81. package/dist/commands/ecdn/logpush/jobs/get.d.ts +2 -1
  82. package/dist/commands/ecdn/logpush/jobs/list.d.ts +2 -1
  83. package/dist/commands/ecdn/logpush/jobs/update.d.ts +2 -1
  84. package/dist/commands/ecdn/logpush/ownership.d.ts +2 -1
  85. package/dist/commands/ecdn/mrt-rules/create.d.ts +2 -1
  86. package/dist/commands/ecdn/mrt-rules/delete.d.ts +2 -1
  87. package/dist/commands/ecdn/mrt-rules/get.d.ts +2 -1
  88. package/dist/commands/ecdn/mrt-rules/rules/delete.d.ts +2 -1
  89. package/dist/commands/ecdn/mrt-rules/rules/update.d.ts +2 -1
  90. package/dist/commands/ecdn/mrt-rules/update.d.ts +2 -1
  91. package/dist/commands/ecdn/mtls/create.d.ts +2 -1
  92. package/dist/commands/ecdn/mtls/delete.d.ts +2 -1
  93. package/dist/commands/ecdn/mtls/get.d.ts +2 -1
  94. package/dist/commands/ecdn/mtls/list.d.ts +2 -1
  95. package/dist/commands/ecdn/origin-headers/delete.d.ts +2 -1
  96. package/dist/commands/ecdn/origin-headers/get.d.ts +2 -1
  97. package/dist/commands/ecdn/origin-headers/set.d.ts +2 -1
  98. package/dist/commands/ecdn/page-shield/notifications/create.d.ts +2 -1
  99. package/dist/commands/ecdn/page-shield/notifications/delete.d.ts +2 -1
  100. package/dist/commands/ecdn/page-shield/notifications/list.d.ts +2 -1
  101. package/dist/commands/ecdn/page-shield/policies/create.d.ts +2 -1
  102. package/dist/commands/ecdn/page-shield/policies/delete.d.ts +2 -1
  103. package/dist/commands/ecdn/page-shield/policies/get.d.ts +2 -1
  104. package/dist/commands/ecdn/page-shield/policies/list.d.ts +2 -1
  105. package/dist/commands/ecdn/page-shield/policies/update.d.ts +2 -1
  106. package/dist/commands/ecdn/page-shield/scripts/get.d.ts +2 -1
  107. package/dist/commands/ecdn/page-shield/scripts/list.d.ts +2 -1
  108. package/dist/commands/ecdn/security/get.d.ts +2 -1
  109. package/dist/commands/ecdn/security/update.d.ts +2 -1
  110. package/dist/commands/ecdn/speed/get.d.ts +2 -1
  111. package/dist/commands/ecdn/speed/update.d.ts +2 -1
  112. package/dist/commands/ecdn/waf/groups/list.d.ts +2 -1
  113. package/dist/commands/ecdn/waf/groups/update.d.ts +2 -1
  114. package/dist/commands/ecdn/waf/managed-rules/list.d.ts +2 -1
  115. package/dist/commands/ecdn/waf/managed-rules/update.d.ts +2 -1
  116. package/dist/commands/ecdn/waf/migrate.d.ts +2 -1
  117. package/dist/commands/ecdn/waf/owasp/get.d.ts +2 -1
  118. package/dist/commands/ecdn/waf/owasp/update.d.ts +2 -1
  119. package/dist/commands/ecdn/waf/rules/get.d.ts +2 -1
  120. package/dist/commands/ecdn/waf/rules/list.d.ts +2 -1
  121. package/dist/commands/ecdn/waf/rules/update.d.ts +2 -1
  122. package/dist/commands/ecdn/waf/rulesets/list.d.ts +2 -1
  123. package/dist/commands/ecdn/waf/rulesets/update.d.ts +2 -1
  124. package/dist/commands/ecdn/zones/create.d.ts +2 -1
  125. package/dist/commands/ecdn/zones/list.d.ts +2 -1
  126. package/dist/commands/job/export.d.ts +2 -1
  127. package/dist/commands/job/import.d.ts +2 -1
  128. package/dist/commands/job/run.d.ts +2 -1
  129. package/dist/commands/job/search.d.ts +2 -1
  130. package/dist/commands/job/wait.d.ts +2 -1
  131. package/dist/commands/logs/get.d.ts +2 -1
  132. package/dist/commands/logs/list.d.ts +2 -1
  133. package/dist/commands/logs/tail.d.ts +2 -1
  134. package/dist/commands/mrt/bundle/deploy.js +24 -4
  135. package/dist/commands/mrt/bundle/deploy.js.map +1 -1
  136. package/dist/commands/mrt/tail-logs.d.ts +27 -0
  137. package/dist/commands/mrt/tail-logs.js +137 -0
  138. package/dist/commands/mrt/tail-logs.js.map +1 -0
  139. package/dist/commands/{ods → sandbox}/create.d.ts +8 -14
  140. package/dist/commands/{ods → sandbox}/create.js +112 -102
  141. package/dist/commands/sandbox/create.js.map +1 -0
  142. package/dist/commands/sandbox/delete.d.ts +19 -0
  143. package/dist/commands/sandbox/delete.js +141 -0
  144. package/dist/commands/sandbox/delete.js.map +1 -0
  145. package/dist/commands/{ods → sandbox}/get.d.ts +2 -1
  146. package/dist/commands/{ods → sandbox}/get.js +5 -4
  147. package/dist/commands/sandbox/get.js.map +1 -0
  148. package/dist/commands/{ods → sandbox}/info.d.ts +2 -1
  149. package/dist/commands/{ods → sandbox}/info.js +6 -5
  150. package/dist/commands/sandbox/info.js.map +1 -0
  151. package/dist/commands/{ods → sandbox}/list.d.ts +2 -1
  152. package/dist/commands/{ods → sandbox}/list.js +6 -5
  153. package/dist/commands/sandbox/list.js.map +1 -0
  154. package/dist/commands/{ods → sandbox}/restart.d.ts +7 -1
  155. package/dist/commands/sandbox/restart.js +107 -0
  156. package/dist/commands/sandbox/restart.js.map +1 -0
  157. package/dist/commands/{ods → sandbox}/start.d.ts +7 -1
  158. package/dist/commands/sandbox/start.js +108 -0
  159. package/dist/commands/sandbox/start.js.map +1 -0
  160. package/dist/commands/{ods → sandbox}/stop.d.ts +7 -1
  161. package/dist/commands/sandbox/stop.js +107 -0
  162. package/dist/commands/sandbox/stop.js.map +1 -0
  163. package/dist/commands/scaffold/generate.d.ts +22 -0
  164. package/dist/commands/scaffold/generate.js +74 -0
  165. package/dist/commands/scaffold/generate.js.map +1 -0
  166. package/dist/commands/scaffold/index.d.ts +24 -0
  167. package/dist/commands/scaffold/index.js +80 -0
  168. package/dist/commands/scaffold/index.js.map +1 -0
  169. package/dist/commands/scaffold/info.d.ts +24 -0
  170. package/dist/commands/scaffold/info.js +89 -0
  171. package/dist/commands/scaffold/info.js.map +1 -0
  172. package/dist/commands/scaffold/init.d.ts +29 -0
  173. package/dist/commands/scaffold/init.js +221 -0
  174. package/dist/commands/scaffold/init.js.map +1 -0
  175. package/dist/commands/scaffold/list.d.ts +38 -0
  176. package/dist/commands/scaffold/list.js +131 -0
  177. package/dist/commands/scaffold/list.js.map +1 -0
  178. package/dist/commands/scaffold/search.d.ts +32 -0
  179. package/dist/commands/scaffold/search.js +97 -0
  180. package/dist/commands/scaffold/search.js.map +1 -0
  181. package/dist/commands/scaffold/validate.d.ts +24 -0
  182. package/dist/commands/scaffold/validate.js +74 -0
  183. package/dist/commands/scaffold/validate.js.map +1 -0
  184. package/dist/commands/scapi/custom/status.d.ts +2 -1
  185. package/dist/commands/scapi/schemas/get.d.ts +2 -1
  186. package/dist/commands/scapi/schemas/list.d.ts +2 -1
  187. package/dist/commands/setup/index.d.ts +12 -0
  188. package/dist/commands/setup/index.js +34 -0
  189. package/dist/commands/setup/index.js.map +1 -0
  190. package/dist/commands/setup/{config.d.ts → inspect.d.ts} +5 -4
  191. package/dist/commands/setup/{config.js → inspect.js} +5 -3
  192. package/dist/commands/setup/inspect.js.map +1 -0
  193. package/dist/commands/setup/instance/create.d.ts +43 -0
  194. package/dist/commands/setup/instance/create.js +269 -0
  195. package/dist/commands/setup/instance/create.js.map +1 -0
  196. package/dist/commands/setup/instance/index.d.ts +9 -0
  197. package/dist/commands/setup/instance/index.js +22 -0
  198. package/dist/commands/setup/instance/index.js.map +1 -0
  199. package/dist/commands/setup/instance/list.d.ts +31 -0
  200. package/dist/commands/setup/instance/list.js +68 -0
  201. package/dist/commands/setup/instance/list.js.map +1 -0
  202. package/dist/commands/setup/instance/remove.d.ts +34 -0
  203. package/dist/commands/setup/instance/remove.js +75 -0
  204. package/dist/commands/setup/instance/remove.js.map +1 -0
  205. package/dist/commands/setup/instance/set-active.d.ts +33 -0
  206. package/dist/commands/setup/instance/set-active.js +78 -0
  207. package/dist/commands/setup/instance/set-active.js.map +1 -0
  208. package/dist/commands/slas/client/create.d.ts +2 -1
  209. package/dist/commands/slas/client/create.js +1 -0
  210. package/dist/commands/slas/client/create.js.map +1 -1
  211. package/dist/commands/slas/client/delete.d.ts +2 -1
  212. package/dist/commands/slas/client/get.d.ts +2 -1
  213. package/dist/commands/slas/client/list.d.ts +2 -1
  214. package/dist/commands/slas/client/list.js +8 -3
  215. package/dist/commands/slas/client/list.js.map +1 -1
  216. package/dist/commands/slas/client/update.d.ts +2 -1
  217. package/dist/commands/webdav/get.d.ts +2 -1
  218. package/dist/commands/webdav/rm.d.ts +2 -1
  219. package/dist/i18n/locales/en.d.ts +42 -0
  220. package/dist/i18n/locales/en.js +42 -0
  221. package/dist/i18n/locales/en.js.map +1 -1
  222. package/dist/i18n/locales/index.d.ts +42 -0
  223. package/dist/lib/scaffold/generate-helper.d.ts +47 -0
  224. package/dist/lib/scaffold/generate-helper.js +271 -0
  225. package/dist/lib/scaffold/generate-helper.js.map +1 -0
  226. package/dist/lib/scaffold/source-resolver.d.ts +25 -0
  227. package/dist/lib/scaffold/source-resolver.js +37 -0
  228. package/dist/lib/scaffold/source-resolver.js.map +1 -0
  229. package/dist/utils/am/resolve-org.d.ts +11 -0
  230. package/dist/utils/am/resolve-org.js +15 -0
  231. package/dist/utils/am/resolve-org.js.map +1 -0
  232. package/dist/utils/am/user-display.d.ts +5 -0
  233. package/dist/utils/am/user-display.js +100 -0
  234. package/dist/utils/am/user-display.js.map +1 -0
  235. package/dist/utils/ecdn/zone-command.d.ts +2 -1
  236. package/dist/utils/mrt-logs/format.d.ts +28 -0
  237. package/dist/utils/mrt-logs/format.js +90 -0
  238. package/dist/utils/mrt-logs/format.js.map +1 -0
  239. package/dist/utils/mrt-logs/index.d.ts +1 -0
  240. package/dist/utils/mrt-logs/index.js +7 -0
  241. package/dist/utils/mrt-logs/index.js.map +1 -0
  242. package/dist/utils/slas/client.d.ts +7 -0
  243. package/dist/utils/slas/client.js +26 -13
  244. package/dist/utils/slas/client.js.map +1 -1
  245. package/oclif.manifest.json +14039 -5107
  246. package/package.json +61 -19
  247. package/dist/commands/ods/create.js.map +0 -1
  248. package/dist/commands/ods/delete.d.ts +0 -15
  249. package/dist/commands/ods/delete.js +0 -86
  250. package/dist/commands/ods/delete.js.map +0 -1
  251. package/dist/commands/ods/get.js.map +0 -1
  252. package/dist/commands/ods/info.js.map +0 -1
  253. package/dist/commands/ods/list.js.map +0 -1
  254. package/dist/commands/ods/restart.js +0 -51
  255. package/dist/commands/ods/restart.js.map +0 -1
  256. package/dist/commands/ods/start.js +0 -51
  257. package/dist/commands/ods/start.js.map +0 -1
  258. package/dist/commands/ods/stop.js +0 -51
  259. package/dist/commands/ods/stop.js.map +0 -1
  260. package/dist/commands/setup/config.js.map +0 -1
@@ -0,0 +1,269 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { Args, Flags, ux } from '@oclif/core';
7
+ import { input, password, confirm, select } from '@inquirer/prompts';
8
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
9
+ import { DwJsonSource, createInstanceFromConfig } from '@salesforce/b2c-tooling-sdk/config';
10
+ import { getActiveCodeVersion } from '@salesforce/b2c-tooling-sdk/operations/code';
11
+ import { withDocs } from '../../../i18n/index.js';
12
+ /**
13
+ * Extract the hostname from a URL or return the input as-is if it's already a hostname.
14
+ */
15
+ function parseHostname(input) {
16
+ const trimmed = input.trim();
17
+ try {
18
+ const url = new URL(trimmed);
19
+ return url.hostname;
20
+ }
21
+ catch {
22
+ return trimmed;
23
+ }
24
+ }
25
+ /**
26
+ * Create a new B2C Commerce instance configuration.
27
+ */
28
+ export default class SetupInstanceCreate extends BaseCommand {
29
+ static args = {
30
+ name: Args.string({
31
+ description: 'Instance name',
32
+ }),
33
+ };
34
+ static description = withDocs('Create a new B2C Commerce instance configuration', '/cli/setup.html#b2c-setup-instance-create');
35
+ static enableJsonFlag = true;
36
+ static examples = [
37
+ '<%= config.bin %> <%= command.id %> staging',
38
+ '<%= config.bin %> <%= command.id %> staging --hostname staging.example.com',
39
+ '<%= config.bin %> <%= command.id %> staging --hostname staging.example.com --active',
40
+ '<%= config.bin %> <%= command.id %> staging --hostname staging.example.com --username admin --force',
41
+ ];
42
+ static flags = {
43
+ ...BaseCommand.baseFlags,
44
+ hostname: Flags.string({
45
+ char: 's',
46
+ description: 'B2C instance hostname',
47
+ }),
48
+ username: Flags.string({
49
+ description: 'WebDAV username',
50
+ }),
51
+ password: Flags.string({
52
+ description: 'WebDAV password',
53
+ }),
54
+ 'client-id': Flags.string({
55
+ description: 'OAuth client ID',
56
+ }),
57
+ 'client-secret': Flags.string({
58
+ description: 'OAuth client secret',
59
+ }),
60
+ 'code-version': Flags.string({
61
+ description: 'Code version',
62
+ }),
63
+ active: Flags.boolean({
64
+ description: 'Set as active instance',
65
+ default: false,
66
+ }),
67
+ force: Flags.boolean({
68
+ description: 'Non-interactive mode (fail if required flags missing)',
69
+ default: false,
70
+ }),
71
+ };
72
+ async run() {
73
+ const source = new DwJsonSource();
74
+ const force = this.flags.force;
75
+ if (!force) {
76
+ ux.stdout('Create a new B2C Commerce instance configuration.');
77
+ ux.stdout('For more information on configuration, see:');
78
+ ux.stdout(' https://salesforcecommercecloud.github.io/b2c-developer-tooling/guide/configuration.html');
79
+ ux.stdout('');
80
+ }
81
+ // Get or prompt for instance name
82
+ let name = this.args.name;
83
+ if (!name) {
84
+ if (force) {
85
+ this.error('Instance name is required in non-interactive mode. Provide as argument.');
86
+ }
87
+ name = await input({
88
+ message: 'Enter instance name:',
89
+ validate: (v) => (v.trim() ? true : 'Instance name is required'),
90
+ });
91
+ }
92
+ // Check if instance already exists
93
+ const existingInstances = source.listInstances({ configPath: this.flags.config });
94
+ if (existingInstances.some((i) => i.name === name)) {
95
+ this.error(`Instance "${name}" already exists. Use a different name.`);
96
+ }
97
+ // Get or prompt for hostname (accepts a URL or plain hostname)
98
+ let hostname = this.flags.hostname;
99
+ if (!hostname) {
100
+ if (force) {
101
+ this.error('Hostname is required in non-interactive mode. Use --hostname flag.');
102
+ }
103
+ hostname = await input({
104
+ message: 'Enter B2C instance hostname or URL:',
105
+ validate: (v) => (v.trim() ? true : 'Hostname is required'),
106
+ });
107
+ }
108
+ hostname = parseHostname(hostname);
109
+ // Build config
110
+ const config = {
111
+ hostname,
112
+ };
113
+ // Handle authentication - in non-interactive mode, use provided flags
114
+ if (force) {
115
+ // Basic auth
116
+ if (this.flags.username) {
117
+ config.username = this.flags.username;
118
+ if (!this.flags.password) {
119
+ this.error('Password is required when username is provided in non-interactive mode.');
120
+ }
121
+ config.password = this.flags.password;
122
+ }
123
+ // OAuth
124
+ if (this.flags['client-id']) {
125
+ config.clientId = this.flags['client-id'];
126
+ if (this.flags['client-secret']) {
127
+ config.clientSecret = this.flags['client-secret'];
128
+ }
129
+ }
130
+ }
131
+ else {
132
+ // Interactive mode - prompt for auth type and credentials
133
+ const authType = await select({
134
+ message: 'Configure authentication:',
135
+ choices: [
136
+ { name: 'WebDAV (username/password or access key)', value: 'basic' },
137
+ { name: 'API Client (OAuth client credentials)', value: 'oauth' },
138
+ { name: 'Both', value: 'both' },
139
+ { name: 'Skip for now', value: 'none' },
140
+ ],
141
+ });
142
+ // Basic auth
143
+ if (authType === 'basic' || authType === 'both') {
144
+ config.username =
145
+ this.flags.username ||
146
+ (await input({
147
+ message: 'Enter WebDAV username:',
148
+ validate: (v) => (v.trim() ? true : 'Username is required'),
149
+ }));
150
+ const accessKeyUrl = `https://${hostname}/on/demandware.store/Sites-Site/default/ViewAccessKeys-List`;
151
+ config.password =
152
+ this.flags.password ||
153
+ (await password({
154
+ message: `Enter WebDAV password or access key (${accessKeyUrl}):`,
155
+ validate: (v) => (v.trim() ? true : 'Password or access key is required'),
156
+ }));
157
+ }
158
+ // OAuth
159
+ if (authType === 'oauth' || authType === 'both') {
160
+ config.clientId =
161
+ this.flags['client-id'] ||
162
+ (await input({
163
+ message: 'Enter OAuth client ID:',
164
+ validate: (v) => (v.trim() ? true : 'Client ID is required'),
165
+ }));
166
+ const clientSecret = this.flags['client-secret'] ||
167
+ (await password({
168
+ message: 'Enter OAuth client secret (leave blank for user auth):',
169
+ }));
170
+ if (clientSecret.trim()) {
171
+ config.clientSecret = clientSecret.trim();
172
+ }
173
+ }
174
+ }
175
+ // Code version - use flag, or try to detect via OCAPI if OAuth credentials are available
176
+ if (this.flags['code-version']) {
177
+ config.codeVersion = this.flags['code-version'];
178
+ }
179
+ else if (!force) {
180
+ let detectedVersion;
181
+ if (config.clientId) {
182
+ try {
183
+ const tempInstance = createInstanceFromConfig({
184
+ hostname,
185
+ clientId: config.clientId,
186
+ clientSecret: config.clientSecret,
187
+ });
188
+ const activeVersion = await getActiveCodeVersion(tempInstance);
189
+ detectedVersion = activeVersion?.id;
190
+ }
191
+ catch {
192
+ // Detection failed - continue without a default
193
+ }
194
+ }
195
+ const codeVersion = await input({
196
+ message: 'Enter code version:',
197
+ default: detectedVersion,
198
+ });
199
+ if (codeVersion.trim()) {
200
+ config.codeVersion = codeVersion.trim();
201
+ }
202
+ }
203
+ // Determine if this should be the active instance
204
+ let setActive = this.flags.active;
205
+ if (!force && !setActive && existingInstances.length > 0) {
206
+ setActive = await confirm({
207
+ message: 'Set as active instance?',
208
+ default: false,
209
+ });
210
+ }
211
+ else if (existingInstances.length === 0) {
212
+ // If this is the first instance, make it active by default
213
+ setActive = true;
214
+ }
215
+ // Show summary and confirm in interactive mode
216
+ if (!force) {
217
+ ux.stdout('');
218
+ ux.stdout('Instance configuration:');
219
+ ux.stdout(` Name: ${name}`);
220
+ ux.stdout(` Hostname: ${hostname}`);
221
+ if (config.codeVersion) {
222
+ ux.stdout(` Code Version: ${config.codeVersion}`);
223
+ }
224
+ if (config.username) {
225
+ ux.stdout(` Auth: Basic (${config.username})`);
226
+ }
227
+ if (config.clientId) {
228
+ ux.stdout(` Auth: OAuth (${config.clientId})`);
229
+ }
230
+ if (setActive) {
231
+ ux.stdout(' Active: Yes');
232
+ }
233
+ ux.stdout('');
234
+ const proceed = await confirm({
235
+ message: 'Create this instance?',
236
+ default: true,
237
+ });
238
+ if (!proceed) {
239
+ ux.stdout('Instance creation cancelled.');
240
+ return {
241
+ name,
242
+ hostname,
243
+ created: false,
244
+ };
245
+ }
246
+ }
247
+ // Create the instance
248
+ source.createInstance({
249
+ name,
250
+ config,
251
+ setActive,
252
+ configPath: this.flags.config,
253
+ });
254
+ const result = {
255
+ name,
256
+ hostname,
257
+ created: true,
258
+ active: setActive,
259
+ };
260
+ if (!this.jsonEnabled()) {
261
+ ux.stdout(`Instance "${name}" created successfully.`);
262
+ if (setActive) {
263
+ ux.stdout(`"${name}" is now the active instance.`);
264
+ }
265
+ }
266
+ return result;
267
+ }
268
+ }
269
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/setup/instance/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ /**
3
+ * Default instance command - shows topic help for instance subcommands.
4
+ */
5
+ export default class SetupInstanceIndex extends BaseCommand<typeof SetupInstanceIndex> {
6
+ static description: string;
7
+ static examples: string[];
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,22 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
7
+ import { withDocs } from '../../../i18n/index.js';
8
+ /**
9
+ * Default instance command - shows topic help for instance subcommands.
10
+ */
11
+ export default class SetupInstanceIndex extends BaseCommand {
12
+ static description = withDocs('Create, list, and manage B2C Commerce instance configurations', '/cli/setup.html#b2c-setup-instance');
13
+ static examples = [
14
+ '<%= config.bin %> setup instance create',
15
+ '<%= config.bin %> setup instance list',
16
+ '<%= config.bin %> setup instance set-active',
17
+ ];
18
+ async run() {
19
+ await this.config.runCommand('help', ['setup', 'instance']);
20
+ }
21
+ }
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/setup/instance/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,WAAW,EAAC,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAsC;IACpF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAC3B,+DAA+D,EAC/D,oCAAoC,CACrC,CAAC;IAEF,MAAM,CAAC,QAAQ,GAAG;QAChB,yCAAyC;QACzC,uCAAuC;QACvC,6CAA6C;KAC9C,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ import { type InstanceInfo } from '@salesforce/b2c-tooling-sdk/config';
3
+ /**
4
+ * JSON output structure for the list command.
5
+ */
6
+ interface InstanceListResponse {
7
+ instances: InstanceInfo[];
8
+ count: number;
9
+ }
10
+ /**
11
+ * List all configured B2C Commerce instances.
12
+ */
13
+ export default class SetupInstanceList extends BaseCommand<typeof SetupInstanceList> {
14
+ static description: string;
15
+ static enableJsonFlag: boolean;
16
+ static examples: string[];
17
+ static flags: {
18
+ 'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
+ lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ 'working-directory': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ 'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ 'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
+ 'extra-headers': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ };
29
+ run(): Promise<InstanceListResponse>;
30
+ }
31
+ export {};
@@ -0,0 +1,68 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { ux } from '@oclif/core';
7
+ import { BaseCommand, createTable } from '@salesforce/b2c-tooling-sdk/cli';
8
+ import { DwJsonSource } from '@salesforce/b2c-tooling-sdk/config';
9
+ import { withDocs } from '../../../i18n/index.js';
10
+ /**
11
+ * Table columns for instance listing.
12
+ */
13
+ const COLUMNS = {
14
+ name: {
15
+ header: 'Name',
16
+ get: (i) => i.name,
17
+ },
18
+ hostname: {
19
+ header: 'Hostname',
20
+ get: (i) => i.hostname || '-',
21
+ },
22
+ source: {
23
+ header: 'Source',
24
+ get: (i) => i.source,
25
+ },
26
+ active: {
27
+ header: 'Active',
28
+ get: (i) => (i.active ? '✓' : ''),
29
+ },
30
+ };
31
+ const DEFAULT_COLUMNS = ['name', 'hostname', 'source', 'active'];
32
+ /**
33
+ * List all configured B2C Commerce instances.
34
+ */
35
+ export default class SetupInstanceList extends BaseCommand {
36
+ static description = withDocs('List configured B2C Commerce instances', '/cli/setup.html#b2c-setup-instance-list');
37
+ static enableJsonFlag = true;
38
+ static examples = ['<%= config.bin %> <%= command.id %>', '<%= config.bin %> <%= command.id %> --json'];
39
+ static flags = {
40
+ ...BaseCommand.baseFlags,
41
+ };
42
+ async run() {
43
+ // Get instances from all sources that support listing
44
+ const source = new DwJsonSource();
45
+ const instances = source.listInstances({
46
+ configPath: this.flags.config,
47
+ });
48
+ const result = {
49
+ instances,
50
+ count: instances.length,
51
+ };
52
+ // In JSON mode, just return the data
53
+ if (this.jsonEnabled()) {
54
+ return result;
55
+ }
56
+ // Human-readable table output
57
+ if (instances.length === 0) {
58
+ ux.stdout('No instances configured. Use `b2c setup instance create` to add one.');
59
+ return result;
60
+ }
61
+ ux.stdout('');
62
+ ux.stdout('Instances');
63
+ ux.stdout('─'.repeat(60));
64
+ createTable(COLUMNS).render(instances, DEFAULT_COLUMNS);
65
+ return result;
66
+ }
67
+ }
68
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/setup/instance/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAC/B,OAAO,EAAC,WAAW,EAAE,WAAW,EAAiB,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAC,YAAY,EAAoB,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,GAA4C;IACvD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;KACnB;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,UAAU;QAClB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG;KAC9B;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;KACrB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC;CACF,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAUjE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,WAAqC;IAClF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,wCAAwC,EAAE,yCAAyC,CAAC,CAAC;IAEnH,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAE7B,MAAM,CAAC,QAAQ,GAAG,CAAC,qCAAqC,EAAE,4CAA4C,CAAC,CAAC;IAExG,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,sDAAsD;QACtD,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC;YACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SAC9B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAyB;YACnC,SAAS;YACT,KAAK,EAAE,SAAS,CAAC,MAAM;SACxB,CAAC;QAEF,qCAAqC;QACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,8BAA8B;QAC9B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,sEAAsE,CAAC,CAAC;YAClF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1B,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAExD,OAAO,MAAM,CAAC;IAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ /**
3
+ * JSON output structure for the remove command.
4
+ */
5
+ interface InstanceRemoveResponse {
6
+ name: string;
7
+ removed: boolean;
8
+ }
9
+ /**
10
+ * Remove a B2C Commerce instance configuration.
11
+ */
12
+ export default class SetupInstanceRemove extends BaseCommand<typeof SetupInstanceRemove> {
13
+ static args: {
14
+ name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
15
+ };
16
+ static description: string;
17
+ static enableJsonFlag: boolean;
18
+ static examples: string[];
19
+ static flags: {
20
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
+ 'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
24
+ lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
+ 'working-directory': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ 'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
+ 'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
30
+ 'extra-headers': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
31
+ };
32
+ run(): Promise<InstanceRemoveResponse>;
33
+ }
34
+ export {};
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { Args, Flags, ux } from '@oclif/core';
7
+ import { confirm } from '@inquirer/prompts';
8
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
9
+ import { DwJsonSource } from '@salesforce/b2c-tooling-sdk/config';
10
+ import { withDocs } from '../../../i18n/index.js';
11
+ /**
12
+ * Remove a B2C Commerce instance configuration.
13
+ */
14
+ export default class SetupInstanceRemove extends BaseCommand {
15
+ static args = {
16
+ name: Args.string({
17
+ description: 'Instance name to remove',
18
+ required: true,
19
+ }),
20
+ };
21
+ static description = withDocs('Remove a B2C Commerce instance configuration', '/cli/setup.html#b2c-setup-instance-remove');
22
+ static enableJsonFlag = true;
23
+ static examples = [
24
+ '<%= config.bin %> <%= command.id %> staging',
25
+ '<%= config.bin %> <%= command.id %> staging --force',
26
+ ];
27
+ static flags = {
28
+ ...BaseCommand.baseFlags,
29
+ force: Flags.boolean({
30
+ description: 'Skip confirmation prompt',
31
+ default: false,
32
+ }),
33
+ };
34
+ async run() {
35
+ const source = new DwJsonSource();
36
+ const name = this.args.name;
37
+ // Check if instance exists
38
+ const instances = source.listInstances({ configPath: this.flags.config });
39
+ const instance = instances.find((i) => i.name === name);
40
+ if (!instance) {
41
+ const availableNames = instances.map((i) => i.name).join(', ');
42
+ if (availableNames) {
43
+ this.error(`Instance "${name}" not found. Available instances: ${availableNames}`);
44
+ }
45
+ else {
46
+ this.error(`Instance "${name}" not found. No instances are configured.`);
47
+ }
48
+ }
49
+ // Confirm removal
50
+ if (!this.flags.force) {
51
+ const proceed = await confirm({
52
+ message: `Remove instance "${name}"? This cannot be undone.`,
53
+ default: false,
54
+ });
55
+ if (!proceed) {
56
+ ux.stdout('Instance removal cancelled.');
57
+ return {
58
+ name,
59
+ removed: false,
60
+ };
61
+ }
62
+ }
63
+ // Remove the instance
64
+ source.removeInstance(name, { configPath: this.flags.config });
65
+ const result = {
66
+ name,
67
+ removed: true,
68
+ };
69
+ if (!this.jsonEnabled()) {
70
+ ux.stdout(`Instance "${name}" removed successfully.`);
71
+ }
72
+ return result;
73
+ }
74
+ }
75
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../../src/commands/setup/instance/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ /**
3
+ * JSON output structure for the set-active command.
4
+ */
5
+ interface InstanceSetActiveResponse {
6
+ name: string;
7
+ active: boolean;
8
+ }
9
+ /**
10
+ * Set a B2C Commerce instance as the default (active) instance.
11
+ */
12
+ export default class SetupInstanceSetActive extends BaseCommand<typeof SetupInstanceSetActive> {
13
+ static args: {
14
+ name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
15
+ };
16
+ static description: string;
17
+ static enableJsonFlag: boolean;
18
+ static examples: string[];
19
+ static flags: {
20
+ 'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
22
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
+ lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ 'working-directory': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
+ 'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ 'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
+ 'extra-headers': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
30
+ };
31
+ run(): Promise<InstanceSetActiveResponse>;
32
+ }
33
+ export {};
@@ -0,0 +1,78 @@
1
+ /*
2
+ * Copyright (c) 2025, Salesforce, Inc.
3
+ * SPDX-License-Identifier: Apache-2
4
+ * For full license text, see the license.txt file in the repo root or http://www.apache.org/licenses/LICENSE-2.0
5
+ */
6
+ import { Args, ux } from '@oclif/core';
7
+ import { search } from '@inquirer/prompts';
8
+ import { BaseCommand } from '@salesforce/b2c-tooling-sdk/cli';
9
+ import { DwJsonSource } from '@salesforce/b2c-tooling-sdk/config';
10
+ import { withDocs } from '../../../i18n/index.js';
11
+ /**
12
+ * Set a B2C Commerce instance as the default (active) instance.
13
+ */
14
+ export default class SetupInstanceSetActive extends BaseCommand {
15
+ static args = {
16
+ name: Args.string({
17
+ description: 'Instance name to set as active',
18
+ }),
19
+ };
20
+ static description = withDocs('Set a B2C Commerce instance as the default (active) instance', '/cli/setup.html#b2c-setup-instance-set-active');
21
+ static enableJsonFlag = true;
22
+ static examples = ['<%= config.bin %> <%= command.id %> staging', '<%= config.bin %> <%= command.id %> production'];
23
+ static flags = {
24
+ ...BaseCommand.baseFlags,
25
+ };
26
+ async run() {
27
+ const source = new DwJsonSource();
28
+ const instances = source.listInstances({ configPath: this.flags.config });
29
+ let name = this.args.name;
30
+ if (!name) {
31
+ if (instances.length === 0) {
32
+ this.error('No instances are configured. Use `b2c setup instance create` to add one.');
33
+ }
34
+ name = await search({
35
+ message: 'Select instance:',
36
+ source(term) {
37
+ const filtered = term ? instances.filter((i) => i.name.includes(term)) : instances;
38
+ const sorted = [...filtered].sort((a, b) => (a.active === b.active ? 0 : a.active ? -1 : 1));
39
+ return sorted.map((i) => ({
40
+ name: `${i.name}${i.hostname ? ` (${i.hostname})` : ''}${i.active ? ' [active]' : ''}`,
41
+ value: i.name,
42
+ }));
43
+ },
44
+ });
45
+ }
46
+ const instance = instances.find((i) => i.name === name);
47
+ if (!instance) {
48
+ const availableNames = instances.map((i) => i.name).join(', ');
49
+ if (availableNames) {
50
+ this.error(`Instance "${name}" not found. Available instances: ${availableNames}`);
51
+ }
52
+ else {
53
+ this.error(`Instance "${name}" not found. No instances are configured.`);
54
+ }
55
+ }
56
+ // Check if already active
57
+ if (instance.active) {
58
+ if (!this.jsonEnabled()) {
59
+ ux.stdout(`Instance "${name}" is already the active instance.`);
60
+ }
61
+ return {
62
+ name,
63
+ active: true,
64
+ };
65
+ }
66
+ // Set as active
67
+ source.setActiveInstance(name, { configPath: this.flags.config });
68
+ const result = {
69
+ name,
70
+ active: true,
71
+ };
72
+ if (!this.jsonEnabled()) {
73
+ ux.stdout(`Instance "${name}" is now the active instance.`);
74
+ }
75
+ return result;
76
+ }
77
+ }
78
+ //# sourceMappingURL=set-active.js.map