@salesforce/b2c-cli 0.0.0-nightly.20260119053920

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 (169) hide show
  1. package/README.md +222 -0
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +17 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +17 -0
  6. package/dist/commands/_test/index.d.ts +6 -0
  7. package/dist/commands/_test/index.js +39 -0
  8. package/dist/commands/_test/index.js.map +1 -0
  9. package/dist/commands/auth/token.d.ts +16 -0
  10. package/dist/commands/auth/token.js +35 -0
  11. package/dist/commands/auth/token.js.map +1 -0
  12. package/dist/commands/code/activate.d.ts +33 -0
  13. package/dist/commands/code/activate.js +83 -0
  14. package/dist/commands/code/activate.js.map +1 -0
  15. package/dist/commands/code/delete.d.ts +33 -0
  16. package/dist/commands/code/delete.js +67 -0
  17. package/dist/commands/code/delete.js.map +1 -0
  18. package/dist/commands/code/deploy.d.ts +38 -0
  19. package/dist/commands/code/deploy.js +141 -0
  20. package/dist/commands/code/deploy.js.map +1 -0
  21. package/dist/commands/code/list.d.ts +8 -0
  22. package/dist/commands/code/list.js +64 -0
  23. package/dist/commands/code/list.js.map +1 -0
  24. package/dist/commands/code/watch.d.ts +34 -0
  25. package/dist/commands/code/watch.js +70 -0
  26. package/dist/commands/code/watch.js.map +1 -0
  27. package/dist/commands/docs/download.d.ts +35 -0
  28. package/dist/commands/docs/download.js +58 -0
  29. package/dist/commands/docs/download.js.map +1 -0
  30. package/dist/commands/docs/read.d.ts +29 -0
  31. package/dist/commands/docs/read.js +70 -0
  32. package/dist/commands/docs/read.js.map +1 -0
  33. package/dist/commands/docs/schema.d.ts +32 -0
  34. package/dist/commands/docs/schema.js +68 -0
  35. package/dist/commands/docs/schema.js.map +1 -0
  36. package/dist/commands/docs/search.d.ts +33 -0
  37. package/dist/commands/docs/search.js +102 -0
  38. package/dist/commands/docs/search.js.map +1 -0
  39. package/dist/commands/job/export.d.ts +50 -0
  40. package/dist/commands/job/export.js +270 -0
  41. package/dist/commands/job/export.js.map +1 -0
  42. package/dist/commands/job/import.d.ts +38 -0
  43. package/dist/commands/job/import.js +143 -0
  44. package/dist/commands/job/import.js.map +1 -0
  45. package/dist/commands/job/run.d.ts +45 -0
  46. package/dist/commands/job/run.js +205 -0
  47. package/dist/commands/job/run.js.map +1 -0
  48. package/dist/commands/job/search.d.ts +37 -0
  49. package/dist/commands/job/search.js +102 -0
  50. package/dist/commands/job/search.js.map +1 -0
  51. package/dist/commands/job/wait.d.ts +38 -0
  52. package/dist/commands/job/wait.js +85 -0
  53. package/dist/commands/job/wait.js.map +1 -0
  54. package/dist/commands/mrt/env/create.d.ts +41 -0
  55. package/dist/commands/mrt/env/create.js +226 -0
  56. package/dist/commands/mrt/env/create.js.map +1 -0
  57. package/dist/commands/mrt/env/delete.d.ts +34 -0
  58. package/dist/commands/mrt/env/delete.js +94 -0
  59. package/dist/commands/mrt/env/delete.js.map +1 -0
  60. package/dist/commands/mrt/env/var/delete.d.ts +34 -0
  61. package/dist/commands/mrt/env/var/delete.js +53 -0
  62. package/dist/commands/mrt/env/var/delete.js.map +1 -0
  63. package/dist/commands/mrt/env/var/list.d.ts +28 -0
  64. package/dist/commands/mrt/env/var/list.js +71 -0
  65. package/dist/commands/mrt/env/var/list.js.map +1 -0
  66. package/dist/commands/mrt/env/var/set.d.ts +35 -0
  67. package/dist/commands/mrt/env/var/set.js +84 -0
  68. package/dist/commands/mrt/env/var/set.js.map +1 -0
  69. package/dist/commands/mrt/push.d.ts +37 -0
  70. package/dist/commands/mrt/push.js +122 -0
  71. package/dist/commands/mrt/push.js.map +1 -0
  72. package/dist/commands/ods/create.d.ts +42 -0
  73. package/dist/commands/ods/create.js +255 -0
  74. package/dist/commands/ods/create.js.map +1 -0
  75. package/dist/commands/ods/delete.d.ts +15 -0
  76. package/dist/commands/ods/delete.js +86 -0
  77. package/dist/commands/ods/delete.js.map +1 -0
  78. package/dist/commands/ods/get.d.ts +17 -0
  79. package/dist/commands/ods/get.js +99 -0
  80. package/dist/commands/ods/get.js.map +1 -0
  81. package/dist/commands/ods/info.d.ts +27 -0
  82. package/dist/commands/ods/info.js +109 -0
  83. package/dist/commands/ods/info.js.map +1 -0
  84. package/dist/commands/ods/list.d.ts +31 -0
  85. package/dist/commands/ods/list.js +166 -0
  86. package/dist/commands/ods/list.js.map +1 -0
  87. package/dist/commands/ods/restart.d.ts +16 -0
  88. package/dist/commands/ods/restart.js +51 -0
  89. package/dist/commands/ods/restart.js.map +1 -0
  90. package/dist/commands/ods/start.d.ts +16 -0
  91. package/dist/commands/ods/start.js +51 -0
  92. package/dist/commands/ods/start.js.map +1 -0
  93. package/dist/commands/ods/stop.d.ts +16 -0
  94. package/dist/commands/ods/stop.js +51 -0
  95. package/dist/commands/ods/stop.js.map +1 -0
  96. package/dist/commands/scapi/custom/status.d.ts +81 -0
  97. package/dist/commands/scapi/custom/status.js +321 -0
  98. package/dist/commands/scapi/custom/status.js.map +1 -0
  99. package/dist/commands/scapi/schemas/get.d.ts +86 -0
  100. package/dist/commands/scapi/schemas/get.js +317 -0
  101. package/dist/commands/scapi/schemas/get.js.map +1 -0
  102. package/dist/commands/scapi/schemas/list.d.ts +48 -0
  103. package/dist/commands/scapi/schemas/list.js +148 -0
  104. package/dist/commands/scapi/schemas/list.js.map +1 -0
  105. package/dist/commands/sites/list.d.ts +10 -0
  106. package/dist/commands/sites/list.js +56 -0
  107. package/dist/commands/sites/list.js.map +1 -0
  108. package/dist/commands/slas/client/create.d.ts +38 -0
  109. package/dist/commands/slas/client/create.js +168 -0
  110. package/dist/commands/slas/client/create.js.map +1 -0
  111. package/dist/commands/slas/client/delete.d.ts +34 -0
  112. package/dist/commands/slas/client/delete.js +54 -0
  113. package/dist/commands/slas/client/delete.js.map +1 -0
  114. package/dist/commands/slas/client/get.d.ts +29 -0
  115. package/dist/commands/slas/client/get.js +51 -0
  116. package/dist/commands/slas/client/get.js.map +1 -0
  117. package/dist/commands/slas/client/list.d.ts +30 -0
  118. package/dist/commands/slas/client/list.js +64 -0
  119. package/dist/commands/slas/client/list.js.map +1 -0
  120. package/dist/commands/slas/client/open.d.ts +25 -0
  121. package/dist/commands/slas/client/open.js +56 -0
  122. package/dist/commands/slas/client/open.js.map +1 -0
  123. package/dist/commands/slas/client/update.d.ts +60 -0
  124. package/dist/commands/slas/client/update.js +183 -0
  125. package/dist/commands/slas/client/update.js.map +1 -0
  126. package/dist/commands/webdav/get.d.ts +41 -0
  127. package/dist/commands/webdav/get.js +61 -0
  128. package/dist/commands/webdav/get.js.map +1 -0
  129. package/dist/commands/webdav/ls.d.ts +17 -0
  130. package/dist/commands/webdav/ls.js +101 -0
  131. package/dist/commands/webdav/ls.js.map +1 -0
  132. package/dist/commands/webdav/mkdir.d.ts +19 -0
  133. package/dist/commands/webdav/mkdir.js +48 -0
  134. package/dist/commands/webdav/mkdir.js.map +1 -0
  135. package/dist/commands/webdav/put.d.ts +23 -0
  136. package/dist/commands/webdav/put.js +107 -0
  137. package/dist/commands/webdav/put.js.map +1 -0
  138. package/dist/commands/webdav/rm.d.ts +40 -0
  139. package/dist/commands/webdav/rm.js +67 -0
  140. package/dist/commands/webdav/rm.js.map +1 -0
  141. package/dist/commands/webdav/unzip.d.ts +15 -0
  142. package/dist/commands/webdav/unzip.js +48 -0
  143. package/dist/commands/webdav/unzip.js.map +1 -0
  144. package/dist/commands/webdav/zip.d.ts +15 -0
  145. package/dist/commands/webdav/zip.js +47 -0
  146. package/dist/commands/webdav/zip.js.map +1 -0
  147. package/dist/i18n/index.d.ts +29 -0
  148. package/dist/i18n/index.js +43 -0
  149. package/dist/i18n/index.js.map +1 -0
  150. package/dist/i18n/locales/de.d.ts +51 -0
  151. package/dist/i18n/locales/de.js +57 -0
  152. package/dist/i18n/locales/de.js.map +1 -0
  153. package/dist/i18n/locales/en.d.ts +118 -0
  154. package/dist/i18n/locales/en.js +124 -0
  155. package/dist/i18n/locales/en.js.map +1 -0
  156. package/dist/i18n/locales/index.d.ts +177 -0
  157. package/dist/i18n/locales/index.js +26 -0
  158. package/dist/i18n/locales/index.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.js +13 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/utils/scapi/schemas.d.ts +40 -0
  163. package/dist/utils/scapi/schemas.js +49 -0
  164. package/dist/utils/scapi/schemas.js.map +1 -0
  165. package/dist/utils/slas/client.d.ts +65 -0
  166. package/dist/utils/slas/client.js +146 -0
  167. package/dist/utils/slas/client.js.map +1 -0
  168. package/oclif.manifest.json +10942 -0
  169. package/package.json +154 -0
@@ -0,0 +1,60 @@
1
+ import { SlasClientCommand, type ClientOutput } from '../../../utils/slas/client.js';
2
+ export default class SlasClientUpdate extends SlasClientCommand<typeof SlasClientUpdate> {
3
+ static args: {
4
+ clientId: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
5
+ };
6
+ static description: string;
7
+ static enableJsonFlag: boolean;
8
+ static examples: string[];
9
+ static flags: {
10
+ name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ secret: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ channels: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ scopes: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ 'redirect-uri': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'callback-uri': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ replace: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ 'tenant-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'client-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'client-secret': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ scope: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ 'short-code': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'auth-methods': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ 'account-manager-host': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ 'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
26
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
27
+ lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
+ instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
30
+ 'working-directory': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
31
+ 'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
32
+ 'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
33
+ 'extra-headers': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
34
+ };
35
+ run(): Promise<ClientOutput>;
36
+ /**
37
+ * Build the update request body with merged values.
38
+ */
39
+ private buildUpdateRequest;
40
+ /**
41
+ * Compute callback URI value, handling the special case where no new values means keeping existing.
42
+ */
43
+ private computeCallbackUri;
44
+ /**
45
+ * Merge array values, optionally replacing or appending with deduplication.
46
+ */
47
+ private mergeArrayValues;
48
+ /**
49
+ * Normalize callback URI from API response (comma-separated string).
50
+ */
51
+ private normalizeCallbackUri;
52
+ /**
53
+ * Normalize scopes from API response (may be space-separated string or array).
54
+ */
55
+ private normalizeScopes;
56
+ /**
57
+ * Normalize URI values from API response (may be pipe-delimited string or array).
58
+ */
59
+ private normalizeUriArray;
60
+ }
@@ -0,0 +1,183 @@
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 } from '@oclif/core';
7
+ import { SlasClientCommand, normalizeClientResponse, printClientDetails, formatApiError, } from '../../../utils/slas/client.js';
8
+ import { t } from '../../../i18n/index.js';
9
+ export default class SlasClientUpdate extends SlasClientCommand {
10
+ static args = {
11
+ clientId: Args.string({
12
+ description: 'SLAS client ID to update',
13
+ required: true,
14
+ }),
15
+ };
16
+ static description = t('commands.slas.client.update.description', 'Update a SLAS client');
17
+ static enableJsonFlag = true;
18
+ static examples = [
19
+ '<%= config.bin %> <%= command.id %> my-client-id --tenant-id abcd_123 --name "New Name"',
20
+ '<%= config.bin %> <%= command.id %> my-client-id --tenant-id abcd_123 --secret new-secret-value',
21
+ '<%= config.bin %> <%= command.id %> my-client-id --tenant-id abcd_123 --scopes sfcc.shopper-baskets',
22
+ '<%= config.bin %> <%= command.id %> my-client-id --tenant-id abcd_123 --scopes sfcc.shopper-baskets --replace',
23
+ '<%= config.bin %> <%= command.id %> my-client-id --tenant-id abcd_123 --channels RefArch,SiteGenesis --replace',
24
+ ];
25
+ static flags = {
26
+ ...SlasClientCommand.baseFlags,
27
+ name: Flags.string({
28
+ description: 'Display name for the client',
29
+ }),
30
+ secret: Flags.string({
31
+ description: 'New client secret (rotates the existing secret)',
32
+ }),
33
+ channels: Flags.string({
34
+ description: 'Site IDs/channels (comma-separated)',
35
+ multiple: true,
36
+ multipleNonGreedy: true,
37
+ delimiter: ',',
38
+ }),
39
+ scopes: Flags.string({
40
+ description: 'OAuth scopes for the client (comma-separated)',
41
+ multiple: true,
42
+ multipleNonGreedy: true,
43
+ delimiter: ',',
44
+ }),
45
+ 'redirect-uri': Flags.string({
46
+ description: 'Redirect URIs (comma-separated)',
47
+ multiple: true,
48
+ multipleNonGreedy: true,
49
+ delimiter: ',',
50
+ }),
51
+ 'callback-uri': Flags.string({
52
+ description: 'Callback URIs for passwordless login (comma-separated)',
53
+ multiple: true,
54
+ multipleNonGreedy: true,
55
+ delimiter: ',',
56
+ }),
57
+ replace: Flags.boolean({
58
+ description: 'Replace list values instead of appending (affects channels, scopes, redirect-uri, callback-uri)',
59
+ default: false,
60
+ }),
61
+ };
62
+ async run() {
63
+ this.requireOAuthCredentials();
64
+ const { 'tenant-id': tenantId, name, secret, channels, scopes, 'redirect-uri': redirectUri, 'callback-uri': callbackUri, replace, } = this.flags;
65
+ const { clientId } = this.args;
66
+ if (!this.jsonEnabled()) {
67
+ this.log(t('commands.slas.client.update.fetching', 'Fetching SLAS client {{clientId}}...', { clientId }));
68
+ }
69
+ const slasClient = this.getSlasClient();
70
+ // First, fetch the existing client
71
+ const { data: existingData, error: getError } = await slasClient.GET('/tenants/{tenantId}/clients/{clientId}', {
72
+ params: {
73
+ path: { tenantId, clientId },
74
+ },
75
+ });
76
+ if (getError) {
77
+ this.error(t('commands.slas.client.update.fetchError', 'Failed to fetch SLAS client: {{message}}', {
78
+ message: formatApiError(getError),
79
+ }));
80
+ }
81
+ const existing = existingData;
82
+ if (!this.jsonEnabled()) {
83
+ this.log(t('commands.slas.client.update.updating', 'Updating SLAS client {{clientId}}...', { clientId }));
84
+ }
85
+ // Build request body with merged values
86
+ const body = this.buildUpdateRequest(existing, {
87
+ clientId,
88
+ name,
89
+ secret,
90
+ channels: channels ?? [],
91
+ scopes: scopes ?? [],
92
+ redirectUri: redirectUri ?? [],
93
+ callbackUri: callbackUri ?? [],
94
+ replace,
95
+ });
96
+ // Update the client
97
+ const { data, error } = await slasClient.PUT('/tenants/{tenantId}/clients/{clientId}', {
98
+ params: {
99
+ path: { tenantId, clientId },
100
+ },
101
+ body: body,
102
+ });
103
+ if (error) {
104
+ this.error(t('commands.slas.client.update.error', 'Failed to update SLAS client: {{message}}', {
105
+ message: formatApiError(error),
106
+ }));
107
+ }
108
+ const output = normalizeClientResponse(data);
109
+ if (this.jsonEnabled()) {
110
+ return output;
111
+ }
112
+ this.log(t('commands.slas.client.update.success', 'SLAS client updated successfully.'));
113
+ // Show secret in output only if it was rotated
114
+ printClientDetails(output, Boolean(secret));
115
+ return output;
116
+ }
117
+ /**
118
+ * Build the update request body with merged values.
119
+ */
120
+ buildUpdateRequest(existing, updates) {
121
+ const existingScopes = this.normalizeScopes(existing.scopes);
122
+ const existingRedirectUri = this.normalizeUriArray(existing.redirectUri);
123
+ const existingCallbackUri = this.normalizeCallbackUri(existing.callbackUri);
124
+ // Determine merged values
125
+ const mergedChannels = this.mergeArrayValues(existing.channels ?? [], updates.channels, updates.replace);
126
+ const mergedScopes = this.mergeArrayValues(existingScopes, updates.scopes, updates.replace);
127
+ const mergedRedirectUri = this.mergeArrayValues(existingRedirectUri, updates.redirectUri, updates.replace);
128
+ const mergedCallbackUri = this.computeCallbackUri(existingCallbackUri, updates.callbackUri, updates.replace);
129
+ const body = {
130
+ clientId: updates.clientId,
131
+ name: updates.name ?? existing.name ?? '',
132
+ channels: updates.channels.length > 0 ? mergedChannels : (existing.channels ?? []),
133
+ scopes: updates.scopes.length > 0 ? mergedScopes : existingScopes,
134
+ redirectUri: updates.redirectUri.length > 0 ? mergedRedirectUri : existingRedirectUri,
135
+ callbackUri: mergedCallbackUri,
136
+ isPrivateClient: existing.isPrivateClient ?? true,
137
+ };
138
+ if (updates.secret) {
139
+ body.secret = updates.secret;
140
+ }
141
+ return body;
142
+ }
143
+ /**
144
+ * Compute callback URI value, handling the special case where no new values means keeping existing.
145
+ */
146
+ computeCallbackUri(existing, updated, replace) {
147
+ if (updated.length > 0) {
148
+ return this.mergeArrayValues(existing, updated, replace);
149
+ }
150
+ return existing.length > 0 ? existing : undefined;
151
+ }
152
+ /**
153
+ * Merge array values, optionally replacing or appending with deduplication.
154
+ */
155
+ mergeArrayValues(existing, updated, replace) {
156
+ return replace ? updated : [...new Set([...existing, ...updated])];
157
+ }
158
+ /**
159
+ * Normalize callback URI from API response (comma-separated string).
160
+ */
161
+ normalizeCallbackUri(value) {
162
+ return value ? value.split(',').map((s) => s.trim()) : [];
163
+ }
164
+ /**
165
+ * Normalize scopes from API response (may be space-separated string or array).
166
+ */
167
+ normalizeScopes(scopes) {
168
+ if (typeof scopes === 'string') {
169
+ return scopes.split(' ');
170
+ }
171
+ return Array.isArray(scopes) ? scopes : [];
172
+ }
173
+ /**
174
+ * Normalize URI values from API response (may be pipe-delimited string or array).
175
+ */
176
+ normalizeUriArray(value) {
177
+ if (Array.isArray(value)) {
178
+ return value.flatMap((uri) => (typeof uri === 'string' ? uri.split('|').map((s) => s.trim()) : []));
179
+ }
180
+ return typeof value === 'string' ? value.split('|').map((s) => s.trim()) : [];
181
+ }
182
+ }
183
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/slas/client/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ interface GetResult {
3
+ remotePath: string;
4
+ localPath: string;
5
+ size: number;
6
+ }
7
+ export default class WebDavGet extends WebDavCommand<typeof WebDavGet> {
8
+ static args: {
9
+ remote: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
10
+ };
11
+ static description: string;
12
+ static enableJsonFlag: boolean;
13
+ static examples: string[];
14
+ static flags: {
15
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ root: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
17
+ server: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'webdav-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'code-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ username: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ password: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'client-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ 'client-secret': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ scope: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ 'short-code': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ 'auth-methods': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
27
+ 'account-manager-host': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ 'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
29
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
30
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
31
+ lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
32
+ config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
33
+ instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
34
+ 'working-directory': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
35
+ 'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
36
+ 'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
37
+ 'extra-headers': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
38
+ };
39
+ run(): Promise<GetResult>;
40
+ }
41
+ export {};
@@ -0,0 +1,61 @@
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 * as fs from 'node:fs';
7
+ import { basename, resolve } from 'node:path';
8
+ import { Args, Flags } from '@oclif/core';
9
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
10
+ import { t } from '../../i18n/index.js';
11
+ export default class WebDavGet extends WebDavCommand {
12
+ static args = {
13
+ remote: Args.string({
14
+ description: 'Remote file path relative to root',
15
+ required: true,
16
+ }),
17
+ };
18
+ static description = t('commands.webdav.get.description', 'Download a file from WebDAV');
19
+ static enableJsonFlag = true;
20
+ static examples = [
21
+ '<%= config.bin %> <%= command.id %> src/instance/export.zip',
22
+ '<%= config.bin %> <%= command.id %> src/instance/export.zip -o ./downloads/export.zip',
23
+ '<%= config.bin %> <%= command.id %> --root=logs customerror.log',
24
+ '<%= config.bin %> <%= command.id %> --root=logs customerror.log -o -',
25
+ ];
26
+ static flags = {
27
+ ...WebDavCommand.baseFlags,
28
+ output: Flags.string({
29
+ char: 'o',
30
+ description: 'Output file path (use - for stdout, defaults to filename in current directory)',
31
+ }),
32
+ };
33
+ async run() {
34
+ this.ensureWebDavAuth();
35
+ const fullPath = this.buildPath(this.args.remote);
36
+ // Determine output path - default to filename in current directory
37
+ const outputPath = this.flags.output ?? basename(this.args.remote);
38
+ const isStdout = outputPath === '-';
39
+ if (!isStdout) {
40
+ this.log(t('commands.webdav.get.downloading', 'Downloading {{path}}...', { path: fullPath }));
41
+ }
42
+ const content = await this.instance.webdav.get(fullPath);
43
+ const buffer = Buffer.from(content);
44
+ if (isStdout) {
45
+ process.stdout.write(buffer);
46
+ }
47
+ else {
48
+ fs.writeFileSync(outputPath, buffer);
49
+ this.log(t('commands.webdav.get.success', 'Downloaded {{size}} bytes to {{path}}', {
50
+ size: buffer.length,
51
+ path: resolve(outputPath),
52
+ }));
53
+ }
54
+ return {
55
+ remotePath: fullPath,
56
+ localPath: isStdout ? '-' : resolve(outputPath),
57
+ size: buffer.length,
58
+ };
59
+ }
60
+ }
61
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/webdav/get.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAC,CAAC,EAAC,MAAM,qBAAqB,CAAC;AAQtC,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,aAA+B;IACpE,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,iCAAiC,EAAE,6BAA6B,CAAC,CAAC;IAEzF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAE7B,MAAM,CAAC,QAAQ,GAAG;QAChB,6DAA6D;QAC7D,uFAAuF;QACvF,iEAAiE;QACjE,sEAAsE;KACvE,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,aAAa,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,gFAAgF;SAC9F,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElD,mEAAmE;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,UAAU,KAAK,GAAG,CAAC;QAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC,EAAE,yBAAyB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CACN,CAAC,CAAC,6BAA6B,EAAE,uCAAuC,EAAE;gBACxE,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC;aAC1B,CAAC,CACH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,QAAQ;YACpB,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;YAC/C,IAAI,EAAE,MAAM,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ import type { PropfindEntry } from '@salesforce/b2c-tooling-sdk/clients';
3
+ interface LsResult {
4
+ path: string;
5
+ count: number;
6
+ entries: PropfindEntry[];
7
+ }
8
+ export default class WebDavLs extends WebDavCommand<typeof WebDavLs> {
9
+ static args: {
10
+ path: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
11
+ };
12
+ static description: string;
13
+ static enableJsonFlag: boolean;
14
+ static examples: string[];
15
+ run(): Promise<LsResult>;
16
+ }
17
+ export {};
@@ -0,0 +1,101 @@
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 } from '@oclif/core';
7
+ import { WebDavCommand, createTable } from '@salesforce/b2c-tooling-sdk/cli';
8
+ import { t } from '../../i18n/index.js';
9
+ /**
10
+ * Formats bytes into human-readable sizes.
11
+ */
12
+ function formatBytes(bytes) {
13
+ if (bytes === undefined || bytes === null)
14
+ return '-';
15
+ if (bytes === 0)
16
+ return '0 B';
17
+ const units = ['B', 'KB', 'MB', 'GB'];
18
+ const k = 1024;
19
+ const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1);
20
+ const value = bytes / k ** i;
21
+ return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
22
+ }
23
+ /**
24
+ * Extracts the display name from a PropfindEntry.
25
+ */
26
+ function getDisplayName(entry) {
27
+ if (entry.displayName) {
28
+ return entry.displayName;
29
+ }
30
+ // Extract filename from href
31
+ const parts = entry.href.split('/').filter(Boolean);
32
+ return parts.at(-1) || entry.href;
33
+ }
34
+ const COLUMNS = {
35
+ name: {
36
+ header: 'Name',
37
+ get: (e) => getDisplayName(e),
38
+ },
39
+ type: {
40
+ header: 'Type',
41
+ get: (e) => (e.isCollection ? 'dir' : 'file'),
42
+ },
43
+ size: {
44
+ header: 'Size',
45
+ get: (e) => formatBytes(e.contentLength),
46
+ },
47
+ modified: {
48
+ header: 'Modified',
49
+ get: (e) => (e.lastModified ? e.lastModified.toLocaleString() : '-'),
50
+ extended: true,
51
+ },
52
+ contentType: {
53
+ header: 'Content-Type',
54
+ get: (e) => e.contentType || '-',
55
+ extended: true,
56
+ },
57
+ };
58
+ const DEFAULT_COLUMNS = ['name', 'type', 'size'];
59
+ export default class WebDavLs extends WebDavCommand {
60
+ static args = {
61
+ path: Args.string({
62
+ description: 'Path relative to root (defaults to root directory)',
63
+ default: '',
64
+ }),
65
+ };
66
+ static description = t('commands.webdav.ls.description', 'List files and directories in a WebDAV location');
67
+ static enableJsonFlag = true;
68
+ static examples = [
69
+ '<%= config.bin %> <%= command.id %>',
70
+ '<%= config.bin %> <%= command.id %> src/instance',
71
+ '<%= config.bin %> <%= command.id %> --root=cartridges',
72
+ '<%= config.bin %> <%= command.id %> --root=logs --json',
73
+ ];
74
+ async run() {
75
+ this.ensureWebDavAuth();
76
+ const fullPath = this.buildPath(this.args.path);
77
+ this.log(t('commands.webdav.ls.listing', 'Listing {{path}}...', { path: fullPath }));
78
+ const entries = await this.instance.webdav.propfind(fullPath, '1');
79
+ // Filter out the parent directory itself (first entry is usually the queried path)
80
+ const filteredEntries = entries.filter((entry) => {
81
+ const entryPath = decodeURIComponent(entry.href);
82
+ const normalizedFullPath = fullPath.replace(/\/$/, '');
83
+ return !entryPath.endsWith(`/${normalizedFullPath}`) && !entryPath.endsWith(`/${normalizedFullPath}/`);
84
+ });
85
+ const result = {
86
+ path: fullPath,
87
+ count: filteredEntries.length,
88
+ entries: filteredEntries,
89
+ };
90
+ if (this.jsonEnabled()) {
91
+ return result;
92
+ }
93
+ if (filteredEntries.length === 0) {
94
+ this.log(t('commands.webdav.ls.empty', 'No files or directories found.'));
95
+ return result;
96
+ }
97
+ createTable(COLUMNS).render(filteredEntries, DEFAULT_COLUMNS);
98
+ return result;
99
+ }
100
+ }
101
+ //# sourceMappingURL=ls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/commands/webdav/ls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ interface MkdirResult {
3
+ path: string;
4
+ created: boolean;
5
+ }
6
+ export default class WebDavMkdir extends WebDavCommand<typeof WebDavMkdir> {
7
+ static args: {
8
+ path: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static description: string;
11
+ static enableJsonFlag: boolean;
12
+ static examples: string[];
13
+ run(): Promise<MkdirResult>;
14
+ /**
15
+ * Creates all directories in the path, similar to `mkdir -p`.
16
+ */
17
+ private createDirectoryPath;
18
+ }
19
+ export {};
@@ -0,0 +1,48 @@
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 } from '@oclif/core';
7
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
8
+ import { t } from '../../i18n/index.js';
9
+ export default class WebDavMkdir extends WebDavCommand {
10
+ static args = {
11
+ path: Args.string({
12
+ description: 'Directory path to create (relative to root)',
13
+ required: true,
14
+ }),
15
+ };
16
+ static description = t('commands.webdav.mkdir.description', 'Create a directory on WebDAV');
17
+ static enableJsonFlag = true;
18
+ static examples = [
19
+ '<%= config.bin %> <%= command.id %> src/instance/my-folder',
20
+ '<%= config.bin %> <%= command.id %> --root=temp my-temp-dir',
21
+ '<%= config.bin %> <%= command.id %> --root=cartridges new-cartridge',
22
+ ];
23
+ async run() {
24
+ this.ensureWebDavAuth();
25
+ const fullPath = this.buildPath(this.args.path);
26
+ // Create all parent directories and the target directory
27
+ await this.createDirectoryPath(fullPath);
28
+ const result = {
29
+ path: fullPath,
30
+ created: true,
31
+ };
32
+ this.log(t('commands.webdav.mkdir.success', 'Created: {{path}}', { path: fullPath }));
33
+ return result;
34
+ }
35
+ /**
36
+ * Creates all directories in the path, similar to `mkdir -p`.
37
+ */
38
+ async createDirectoryPath(fullPath) {
39
+ const parts = fullPath.split('/').filter(Boolean);
40
+ let currentPath = '';
41
+ for (const part of parts) {
42
+ currentPath = currentPath ? `${currentPath}/${part}` : part;
43
+ // eslint-disable-next-line no-await-in-loop
44
+ await this.instance.webdav.mkcol(currentPath);
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=mkdir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mkdir.js","sourceRoot":"","sources":["../../../src/commands/webdav/mkdir.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACjC,OAAO,EAAC,aAAa,EAAC,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAC,CAAC,EAAC,MAAM,qBAAqB,CAAC;AAOtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,aAAiC;IACxE,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,6CAA6C;YAC1D,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,mCAAmC,EAAE,8BAA8B,CAAC,CAAC;IAE5F,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAE7B,MAAM,CAAC,QAAQ,GAAG;QAChB,4DAA4D;QAC5D,6DAA6D;QAC7D,qEAAqE;KACtE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhD,yDAAyD;QACzD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,+BAA+B,EAAE,mBAAmB,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC;QAEpF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,4CAA4C;YAC5C,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { WebDavCommand } from '@salesforce/b2c-tooling-sdk/cli';
2
+ interface PutResult {
3
+ localPath: string;
4
+ remotePath: string;
5
+ size: number;
6
+ contentType?: string;
7
+ }
8
+ export default class WebDavPut extends WebDavCommand<typeof WebDavPut> {
9
+ static args: {
10
+ local: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
11
+ remote: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
12
+ };
13
+ static description: string;
14
+ static enableJsonFlag: boolean;
15
+ static examples: string[];
16
+ run(): Promise<PutResult>;
17
+ /**
18
+ * Ensures all parent directories exist for the given path.
19
+ * Note: Sequential await is required here as each directory depends on its parent existing.
20
+ */
21
+ private ensureParentDirectories;
22
+ }
23
+ export {};