@salesforce/b2c-cli 1.3.2 → 1.4.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.
- package/dist/commands/job/import.d.ts +2 -0
- package/dist/commands/job/import.js +27 -6
- package/dist/commands/job/import.js.map +1 -1
- package/dist/commands/mrt/env/var/push.d.ts +46 -0
- package/dist/commands/mrt/env/var/push.js +154 -0
- package/dist/commands/mrt/env/var/push.js.map +1 -0
- package/dist/utils/mrt/env-var-diff.d.ts +46 -0
- package/dist/utils/mrt/env-var-diff.js +104 -0
- package/dist/utils/mrt/env-var-diff.js.map +1 -0
- package/oclif.manifest.json +4777 -4544
- package/package.json +2 -2
|
@@ -8,9 +8,11 @@ export default class JobImport extends JobCommand<typeof JobImport> {
|
|
|
8
8
|
static enableJsonFlag: boolean;
|
|
9
9
|
static examples: string[];
|
|
10
10
|
static flags: {
|
|
11
|
+
wait: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
12
|
'keep-archive': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
13
|
remote: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
14
|
timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
'poll-interval': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
16
|
'show-log': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
17
|
server: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
18
|
'webdav-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -24,6 +24,12 @@ export default class JobImport extends JobCommand {
|
|
|
24
24
|
];
|
|
25
25
|
static flags = {
|
|
26
26
|
...JobCommand.baseFlags,
|
|
27
|
+
wait: Flags.boolean({
|
|
28
|
+
char: 'w',
|
|
29
|
+
description: 'Wait for import job to complete',
|
|
30
|
+
default: true,
|
|
31
|
+
allowNo: true,
|
|
32
|
+
}),
|
|
27
33
|
'keep-archive': Flags.boolean({
|
|
28
34
|
char: 'k',
|
|
29
35
|
description: 'Keep archive on instance after import',
|
|
@@ -38,6 +44,11 @@ export default class JobImport extends JobCommand {
|
|
|
38
44
|
char: 't',
|
|
39
45
|
description: 'Timeout in seconds (default: no timeout)',
|
|
40
46
|
}),
|
|
47
|
+
'poll-interval': Flags.integer({
|
|
48
|
+
description: 'Polling interval in seconds when using --wait',
|
|
49
|
+
default: 3,
|
|
50
|
+
dependsOn: ['wait'],
|
|
51
|
+
}),
|
|
41
52
|
'show-log': Flags.boolean({
|
|
42
53
|
description: 'Show job log on failure',
|
|
43
54
|
default: true,
|
|
@@ -50,7 +61,7 @@ export default class JobImport extends JobCommand {
|
|
|
50
61
|
this.requireOAuthCredentials();
|
|
51
62
|
this.requireWebDavCredentials();
|
|
52
63
|
const { target } = this.args;
|
|
53
|
-
const { 'keep-archive': keepArchive, remote, timeout, 'show-log': showLog = true } = this.flags;
|
|
64
|
+
const { wait, 'keep-archive': keepArchive, remote, timeout, 'poll-interval': pollInterval, 'show-log': showLog = true, } = this.flags;
|
|
54
65
|
const hostname = this.resolvedConfig.values.hostname;
|
|
55
66
|
// Safety evaluation — check rules for import job before executing.
|
|
56
67
|
// Command-level rules are already evaluated generically in BaseCommand.init().
|
|
@@ -103,8 +114,10 @@ export default class JobImport extends JobCommand {
|
|
|
103
114
|
const importTarget = remote ? { remoteFilename: target } : target;
|
|
104
115
|
const result = await this.operations.siteArchiveImport(this.instance, importTarget, {
|
|
105
116
|
keepArchive,
|
|
117
|
+
wait,
|
|
106
118
|
waitOptions: {
|
|
107
119
|
timeoutSeconds: timeout,
|
|
120
|
+
pollIntervalSeconds: pollInterval,
|
|
108
121
|
onPoll: (info) => {
|
|
109
122
|
if (!this.jsonEnabled()) {
|
|
110
123
|
this.log(t('commands.job.import.progress', ' Status: {{status}} ({{elapsed}}s elapsed)', {
|
|
@@ -115,11 +128,19 @@ export default class JobImport extends JobCommand {
|
|
|
115
128
|
},
|
|
116
129
|
},
|
|
117
130
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
if (wait) {
|
|
132
|
+
const durationSec = result.execution.duration ? (result.execution.duration / 1000).toFixed(1) : 'N/A';
|
|
133
|
+
this.log(t('commands.job.import.completed', 'Import completed: {{status}} (duration: {{duration}}s)', {
|
|
134
|
+
status: result.execution.exit_status?.code || result.execution.execution_status,
|
|
135
|
+
duration: durationSec,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.log(t('commands.job.import.started', 'Import job started: {{executionId}} (status: {{status}})', {
|
|
140
|
+
executionId: result.execution.id,
|
|
141
|
+
status: result.execution.execution_status,
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
123
144
|
if (result.archiveKept) {
|
|
124
145
|
this.log(t('commands.job.import.archiveKept', 'Archive kept at: Impex/src/instance/{{filename}}', {
|
|
125
146
|
filename: result.archiveFilename,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/commands/job/import.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,IAAI,EAAE,KAAK,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,EAAC,UAAU,EAAC,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAC,CAAC,EAAE,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,UAA4B;IACjE,MAAM,CAAC,IAAI,GAAG;QACZ,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAC3B,CAAC,CACC,iCAAiC,EACjC,qFAAqF,CACtF,EACD,+BAA+B,CAChC,CAAC;IAEF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;IAE7B,MAAM,CAAC,QAAQ,GAAG;QAChB,oDAAoD;QACpD,kDAAkD;QAClD,mEAAmE;QACnE,mEAAmE;KACpE,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,UAAU,CAAC,SAAS;QACvB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;YAC5B,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,uCAAuC;YACpD,OAAO,EAAE,KAAK;SACf,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;YACpB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,uEAAuE;YACpF,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0CAA0C;SACxD,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;YACxB,WAAW,EAAE,yBAAyB;YACtC,OAAO,EAAE,IAAI;SACd,CAAC;KACH,CAAC;IAEQ,UAAU,GAAG;QACrB,iBAAiB;KAClB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/commands/job/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MrtCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
2
|
+
import { listEnvVars, setEnvVar, setEnvVars } from '@salesforce/b2c-tooling-sdk/operations/mrt';
|
|
3
|
+
/**
|
|
4
|
+
* Push local .env file variables to an MRT project environment.
|
|
5
|
+
*
|
|
6
|
+
* Environment variables read:
|
|
7
|
+
* MRT_PROJECT (optional) - MRT project slug, overridden by --project flag
|
|
8
|
+
* MRT_ENVIRONMENT (optional) - MRT environment, overridden by --environment flag
|
|
9
|
+
*/
|
|
10
|
+
export default class MrtEnvVarPush extends MrtCommand<typeof MrtEnvVarPush> {
|
|
11
|
+
static description: string;
|
|
12
|
+
static enableJsonFlag: boolean;
|
|
13
|
+
static examples: string[];
|
|
14
|
+
static flags: {
|
|
15
|
+
file: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
'exclude-prefix': import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
+
'api-key': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
project: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
+
environment: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
21
|
+
'cloud-origin': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
22
|
+
'credentials-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
23
|
+
'log-level': import("@oclif/core/interfaces").OptionFlag<"trace" | "debug" | "info" | "warn" | "error" | "silent" | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
24
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
25
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
26
|
+
jsonl: 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
|
+
'project-directory': import("@oclif/core/interfaces").OptionFlag<string, 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
|
+
protected operations: {
|
|
36
|
+
listEnvVars: typeof listEnvVars;
|
|
37
|
+
setEnvVar: typeof setEnvVar;
|
|
38
|
+
setEnvVars: typeof setEnvVars;
|
|
39
|
+
readEnvFile: (path: string) => string;
|
|
40
|
+
};
|
|
41
|
+
run(): Promise<{
|
|
42
|
+
pushed: number;
|
|
43
|
+
failed: number;
|
|
44
|
+
skipped: number;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
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 { readFileSync } from 'node:fs';
|
|
7
|
+
import { resolve } from 'node:path';
|
|
8
|
+
import { parseEnv } from 'node:util';
|
|
9
|
+
import { Flags, ux } from '@oclif/core';
|
|
10
|
+
import { confirm } from '@inquirer/prompts';
|
|
11
|
+
import { MrtCommand } from '@salesforce/b2c-tooling-sdk/cli';
|
|
12
|
+
import { listEnvVars, setEnvVar, setEnvVars } from '@salesforce/b2c-tooling-sdk/operations/mrt';
|
|
13
|
+
import { t, withDocs } from '../../../../i18n/index.js';
|
|
14
|
+
import { filterByPrefix, computeEnvVarDiff, formatEnvVarDiffSummary } from '../../../../utils/mrt/env-var-diff.js';
|
|
15
|
+
/**
|
|
16
|
+
* Push local .env file variables to an MRT project environment.
|
|
17
|
+
*
|
|
18
|
+
* Environment variables read:
|
|
19
|
+
* MRT_PROJECT (optional) - MRT project slug, overridden by --project flag
|
|
20
|
+
* MRT_ENVIRONMENT (optional) - MRT environment, overridden by --environment flag
|
|
21
|
+
*/
|
|
22
|
+
export default class MrtEnvVarPush extends MrtCommand {
|
|
23
|
+
static description = withDocs(t('commands.mrt.env.var.push.description', 'Push local .env file variables to a Managed Runtime environment'), '/cli/mrt.html#b2c-mrt-env-var-push');
|
|
24
|
+
static enableJsonFlag = true;
|
|
25
|
+
static examples = [
|
|
26
|
+
'<%= config.bin %> <%= command.id %> --project acme-storefront --environment production',
|
|
27
|
+
'<%= config.bin %> <%= command.id %> -p my-project -e staging --yes',
|
|
28
|
+
'<%= config.bin %> <%= command.id %> --file config/.env --exclude-prefix INTERNAL_ -p my-project -e staging',
|
|
29
|
+
];
|
|
30
|
+
static flags = {
|
|
31
|
+
...MrtCommand.baseFlags,
|
|
32
|
+
file: Flags.string({
|
|
33
|
+
char: 'f',
|
|
34
|
+
description: t('commands.mrt.env.var.push.fileFlag', 'Path to the .env file to push'),
|
|
35
|
+
default: '.env',
|
|
36
|
+
}),
|
|
37
|
+
'exclude-prefix': Flags.string({
|
|
38
|
+
description: t('commands.mrt.env.var.push.excludePrefixFlag', 'Exclude variables whose keys start with this prefix (repeatable)'),
|
|
39
|
+
multiple: true,
|
|
40
|
+
default: ['MRT_'],
|
|
41
|
+
}),
|
|
42
|
+
yes: Flags.boolean({
|
|
43
|
+
char: 'y',
|
|
44
|
+
description: t('commands.mrt.env.var.push.yesFlag', 'Skip confirmation prompt'),
|
|
45
|
+
default: false,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
operations = {
|
|
49
|
+
listEnvVars,
|
|
50
|
+
setEnvVar,
|
|
51
|
+
setEnvVars,
|
|
52
|
+
readEnvFile: (path) => readFileSync(path, 'utf8'),
|
|
53
|
+
};
|
|
54
|
+
async run() {
|
|
55
|
+
const { flags } = await this.parse(MrtEnvVarPush);
|
|
56
|
+
const envFilePath = resolve(flags.file);
|
|
57
|
+
// Step 1: Read and parse .env file
|
|
58
|
+
let rawContent;
|
|
59
|
+
try {
|
|
60
|
+
rawContent = this.operations.readEnvFile(envFilePath);
|
|
61
|
+
}
|
|
62
|
+
catch (error_) {
|
|
63
|
+
const error = error_;
|
|
64
|
+
if (error.code === 'ENOENT') {
|
|
65
|
+
this.error(t('commands.mrt.env.var.push.fileNotFound', '.env file not found: {{path}}', { path: envFilePath }));
|
|
66
|
+
}
|
|
67
|
+
throw error_;
|
|
68
|
+
}
|
|
69
|
+
const parsed = parseEnv(rawContent);
|
|
70
|
+
// Step 2: Filter out excluded prefixes
|
|
71
|
+
const localVars = filterByPrefix(new Map(Object.entries(parsed).filter((e) => e[1] !== undefined)), flags['exclude-prefix']);
|
|
72
|
+
// Step 3: Validate MRT target
|
|
73
|
+
const { mrtProject: project, mrtEnvironment: environment } = this.resolvedConfig.values;
|
|
74
|
+
if (!project) {
|
|
75
|
+
this.error(t('commands.mrt.env.var.push.missingProject', 'MRT project is required. Provide --project flag, set MRT_PROJECT, or set mrtProject in dw.json.'));
|
|
76
|
+
}
|
|
77
|
+
if (!environment) {
|
|
78
|
+
this.error(t('commands.mrt.env.var.push.missingEnvironment', 'MRT environment is required. Provide --environment flag, set MRT_ENVIRONMENT, or set mrtEnvironment in dw.json.'));
|
|
79
|
+
}
|
|
80
|
+
// Step 4: Fetch current remote env vars
|
|
81
|
+
this.requireMrtCredentials();
|
|
82
|
+
const { mrtOrigin: origin } = this.resolvedConfig.values;
|
|
83
|
+
const auth = this.getMrtAuth();
|
|
84
|
+
ux.stdout(t('commands.mrt.env.var.push.fetching', 'Fetching remote env vars for {{project}}/{{environment}}...', {
|
|
85
|
+
project,
|
|
86
|
+
environment,
|
|
87
|
+
}));
|
|
88
|
+
const { variables: remoteVariables } = await this.operations.listEnvVars({ projectSlug: project, environment, origin }, auth);
|
|
89
|
+
const remoteVars = new Map(remoteVariables.map((v) => [v.name, v.value]));
|
|
90
|
+
// Step 5: Compute diff
|
|
91
|
+
const diff = computeEnvVarDiff(localVars, remoteVars);
|
|
92
|
+
const toSync = [...diff.add, ...diff.update];
|
|
93
|
+
// Step 6: Display summary
|
|
94
|
+
ux.stdout('');
|
|
95
|
+
ux.stdout(formatEnvVarDiffSummary(diff));
|
|
96
|
+
if (toSync.length === 0) {
|
|
97
|
+
return { pushed: 0, failed: 0, skipped: diff.remoteOnly.length };
|
|
98
|
+
}
|
|
99
|
+
// Step 7: Confirm unless --yes
|
|
100
|
+
if (!flags.yes) {
|
|
101
|
+
const message = t('commands.mrt.env.var.push.confirm', 'Push {{count}} variable(s) ({{add}} new, {{update}} updated) to {{project}}/{{environment}}?', {
|
|
102
|
+
count: toSync.length,
|
|
103
|
+
add: diff.add.length,
|
|
104
|
+
update: diff.update.length,
|
|
105
|
+
project,
|
|
106
|
+
environment,
|
|
107
|
+
});
|
|
108
|
+
const confirmed = await confirm({ message, default: false });
|
|
109
|
+
if (!confirmed) {
|
|
110
|
+
ux.stdout(t('commands.mrt.env.var.push.aborted', 'Aborted.'));
|
|
111
|
+
return { pushed: 0, failed: 0, skipped: diff.remoteOnly.length };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Step 8: Push variables — try batch first, fall back to individual calls
|
|
115
|
+
let pushed = 0;
|
|
116
|
+
let failed = 0;
|
|
117
|
+
const baseParams = { projectSlug: project, environment, origin };
|
|
118
|
+
try {
|
|
119
|
+
const variables = Object.fromEntries(toSync.map(({ key, value }) => [key, value]));
|
|
120
|
+
await this.operations.setEnvVars({ ...baseParams, variables }, auth);
|
|
121
|
+
for (const { key } of toSync) {
|
|
122
|
+
ux.stdout(t('commands.mrt.env.var.push.varSuccess', ' ✓ {{key}}', { key }));
|
|
123
|
+
}
|
|
124
|
+
pushed = toSync.length;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
this.warn(t('commands.mrt.env.var.push.batchFailed', 'Batch push failed, retrying variables individually...'));
|
|
128
|
+
const results = await Promise.allSettled(toSync.map(({ key, value }) => this.operations.setEnvVar({ ...baseParams, key, value }, auth)));
|
|
129
|
+
for (const [index, result] of results.entries()) {
|
|
130
|
+
const { key } = toSync[index];
|
|
131
|
+
if (result.status === 'fulfilled') {
|
|
132
|
+
ux.stdout(t('commands.mrt.env.var.push.varSuccess', ' ✓ {{key}}', { key }));
|
|
133
|
+
pushed++;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.warn(t('commands.mrt.env.var.push.varFailed', ' ✗ {{key}}: {{message}}', {
|
|
137
|
+
key,
|
|
138
|
+
message: result.reason.message,
|
|
139
|
+
}));
|
|
140
|
+
failed++;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Step 9: Summary
|
|
145
|
+
ux.stdout('');
|
|
146
|
+
ux.stdout(t('commands.mrt.env.var.push.summary', 'Summary: {{pushed}} pushed, {{failed}} failed, {{skipped}} remote-only (not deleted)', {
|
|
147
|
+
pushed,
|
|
148
|
+
failed,
|
|
149
|
+
skipped: diff.remoteOnly.length,
|
|
150
|
+
}));
|
|
151
|
+
return { pushed, failed, skipped: diff.remoteOnly.length };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../../../src/commands/mrt/env/var/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An entry in the "add" or "unchanged" category of a diff.
|
|
3
|
+
*/
|
|
4
|
+
export interface EnvVarEntry {
|
|
5
|
+
key: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* An entry in the "update" category of a diff, showing both old and new values.
|
|
10
|
+
*/
|
|
11
|
+
export interface EnvVarUpdateEntry extends EnvVarEntry {
|
|
12
|
+
oldValue: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The result of comparing local env vars against remote MRT env vars.
|
|
16
|
+
*/
|
|
17
|
+
export interface EnvVarDiff {
|
|
18
|
+
/** Variables present locally but not in MRT — will be added. */
|
|
19
|
+
add: EnvVarEntry[];
|
|
20
|
+
/** Variables present in both with differing values — will be updated. */
|
|
21
|
+
update: EnvVarUpdateEntry[];
|
|
22
|
+
/** Variables present in both with identical values — no action needed. */
|
|
23
|
+
unchanged: EnvVarEntry[];
|
|
24
|
+
/** Variables present in MRT but not locally — will NOT be deleted. */
|
|
25
|
+
remoteOnly: EnvVarEntry[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns a new Map excluding entries whose keys start with any of the given prefixes.
|
|
29
|
+
*
|
|
30
|
+
* @param vars - Map of environment variable key-value pairs
|
|
31
|
+
* @param excludePrefixes - Prefixes to exclude (e.g. ['MRT_', 'SFCC_'])
|
|
32
|
+
*/
|
|
33
|
+
export declare function filterByPrefix(vars: Map<string, string>, excludePrefixes: string[]): Map<string, string>;
|
|
34
|
+
/**
|
|
35
|
+
* Computes the diff between local env vars and remote MRT env vars.
|
|
36
|
+
*
|
|
37
|
+
* @param local - Local env vars (already filtered)
|
|
38
|
+
* @param remote - Remote MRT env vars
|
|
39
|
+
*/
|
|
40
|
+
export declare function computeEnvVarDiff(local: Map<string, string>, remote: Map<string, string>): EnvVarDiff;
|
|
41
|
+
/**
|
|
42
|
+
* Formats a human-readable diff summary using ASCII markers.
|
|
43
|
+
*
|
|
44
|
+
* @param diff - The diff to format
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatEnvVarDiffSummary(diff: EnvVarDiff): string;
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
/**
|
|
7
|
+
* Returns a new Map excluding entries whose keys start with any of the given prefixes.
|
|
8
|
+
*
|
|
9
|
+
* @param vars - Map of environment variable key-value pairs
|
|
10
|
+
* @param excludePrefixes - Prefixes to exclude (e.g. ['MRT_', 'SFCC_'])
|
|
11
|
+
*/
|
|
12
|
+
export function filterByPrefix(vars, excludePrefixes) {
|
|
13
|
+
const result = new Map();
|
|
14
|
+
for (const [key, value] of vars) {
|
|
15
|
+
if (!excludePrefixes.some((prefix) => key.startsWith(prefix))) {
|
|
16
|
+
result.set(key, value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Computes the diff between local env vars and remote MRT env vars.
|
|
23
|
+
*
|
|
24
|
+
* @param local - Local env vars (already filtered)
|
|
25
|
+
* @param remote - Remote MRT env vars
|
|
26
|
+
*/
|
|
27
|
+
export function computeEnvVarDiff(local, remote) {
|
|
28
|
+
const add = [];
|
|
29
|
+
const update = [];
|
|
30
|
+
const unchanged = [];
|
|
31
|
+
const remoteOnly = [];
|
|
32
|
+
for (const [key, value] of local) {
|
|
33
|
+
if (remote.has(key)) {
|
|
34
|
+
const remoteValue = remote.get(key);
|
|
35
|
+
if (remoteValue === value) {
|
|
36
|
+
unchanged.push({ key, value });
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
update.push({ key, value, oldValue: remoteValue });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
add.push({ key, value });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const [key, value] of remote) {
|
|
47
|
+
if (!local.has(key)) {
|
|
48
|
+
remoteOnly.push({ key, value });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { add, update, unchanged, remoteOnly };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Formats a human-readable diff summary using ASCII markers.
|
|
55
|
+
*
|
|
56
|
+
* @param diff - The diff to format
|
|
57
|
+
*/
|
|
58
|
+
export function formatEnvVarDiffSummary(diff) {
|
|
59
|
+
const { add, update, unchanged, remoteOnly } = diff;
|
|
60
|
+
const lines = [];
|
|
61
|
+
if (add.length === 0 && update.length === 0) {
|
|
62
|
+
lines.push('Nothing to sync — all variables are up-to-date.');
|
|
63
|
+
if (unchanged.length > 0) {
|
|
64
|
+
lines.push('', ` ${unchanged.length} variable(s) unchanged`);
|
|
65
|
+
}
|
|
66
|
+
if (remoteOnly.length > 0) {
|
|
67
|
+
lines.push('', ` ${remoteOnly.length} remote-only variable(s) (not in local file):`);
|
|
68
|
+
for (const { key, value } of remoteOnly) {
|
|
69
|
+
lines.push(` * ${key} = ${value}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
74
|
+
if (add.length > 0) {
|
|
75
|
+
lines.push(`+ Add (${add.length}):`);
|
|
76
|
+
for (const { key, value } of add) {
|
|
77
|
+
lines.push(` + ${key} = ${value}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push('');
|
|
80
|
+
}
|
|
81
|
+
if (update.length > 0) {
|
|
82
|
+
lines.push(`~ Update (${update.length}):`);
|
|
83
|
+
for (const { key, value, oldValue } of update) {
|
|
84
|
+
lines.push(` ~ ${key}: ${oldValue} → ${value}`);
|
|
85
|
+
}
|
|
86
|
+
lines.push('');
|
|
87
|
+
}
|
|
88
|
+
if (unchanged.length > 0) {
|
|
89
|
+
lines.push(` Unchanged (${unchanged.length}):`);
|
|
90
|
+
for (const { key } of unchanged) {
|
|
91
|
+
lines.push(` = ${key}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
if (remoteOnly.length > 0) {
|
|
96
|
+
lines.push(` Remote-only (${remoteOnly.length}, not deleted):`);
|
|
97
|
+
for (const { key, value } of remoteOnly) {
|
|
98
|
+
lines.push(` * ${key} = ${value}`);
|
|
99
|
+
}
|
|
100
|
+
lines.push('');
|
|
101
|
+
}
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=env-var-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-var-diff.js","sourceRoot":"","sources":["../../../src/utils/mrt/env-var-diff.ts"],"names":[],"mappings":"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"}
|