@jterrats/smart-deployment 1.2.6 → 1.3.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.
- package/README.md +31 -1
- package/lib/analysis/project-analysis-service.d.ts +5 -0
- package/lib/analysis/project-analysis-service.js +18 -0
- package/lib/analysis/project-analysis-service.js.map +1 -1
- package/lib/commands/ci/preset.d.ts +25 -0
- package/lib/commands/ci/preset.js +125 -0
- package/lib/commands/ci/preset.js.map +1 -0
- package/lib/commands/graph/export.d.ts +20 -0
- package/lib/commands/graph/export.js +107 -0
- package/lib/commands/graph/export.js.map +1 -0
- package/lib/commands/impact.d.ts +18 -0
- package/lib/commands/impact.js +105 -0
- package/lib/commands/impact.js.map +1 -0
- package/lib/commands/init.d.ts +19 -0
- package/lib/commands/init.js +83 -0
- package/lib/commands/init.js.map +1 -0
- package/lib/commands/plan/explain.d.ts +14 -0
- package/lib/commands/plan/explain.js +134 -0
- package/lib/commands/plan/explain.js.map +1 -0
- package/lib/commands/resume.d.ts +1 -0
- package/lib/commands/resume.js +17 -3
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/retrieve.d.ts +20 -0
- package/lib/commands/retrieve.js +111 -0
- package/lib/commands/retrieve.js.map +1 -0
- package/lib/commands/start.d.ts +21 -0
- package/lib/commands/start.js +124 -14
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.d.ts +1 -0
- package/lib/commands/status.js +15 -3
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.d.ts +8 -0
- package/lib/commands/validate.js +14 -0
- package/lib/commands/validate.js.map +1 -1
- package/lib/config/init-config-generation-service.d.ts +27 -0
- package/lib/config/init-config-generation-service.js +88 -0
- package/lib/config/init-config-generation-service.js.map +1 -0
- package/lib/config/repo-config.d.ts +25 -0
- package/lib/config/repo-config.js.map +1 -1
- package/lib/dependencies/impact-analysis-service.d.ts +77 -0
- package/lib/dependencies/impact-analysis-service.js +234 -0
- package/lib/dependencies/impact-analysis-service.js.map +1 -0
- package/lib/deployment/ci-preset-service.d.ts +44 -0
- package/lib/deployment/ci-preset-service.js +65 -0
- package/lib/deployment/ci-preset-service.js.map +1 -0
- package/lib/deployment/commit-scope-service.d.ts +43 -0
- package/lib/deployment/commit-scope-service.js +209 -0
- package/lib/deployment/commit-scope-service.js.map +1 -0
- package/lib/deployment/deployment-context-service.d.ts +3 -0
- package/lib/deployment/deployment-context-service.js +1 -0
- package/lib/deployment/deployment-context-service.js.map +1 -1
- package/lib/deployment/deployment-error-diagnostics.d.ts +11 -0
- package/lib/deployment/deployment-error-diagnostics.js +187 -0
- package/lib/deployment/deployment-error-diagnostics.js.map +1 -0
- package/lib/deployment/deployment-runner.d.ts +1 -0
- package/lib/deployment/deployment-runner.js +35 -15
- package/lib/deployment/deployment-runner.js.map +1 -1
- package/lib/deployment/deployment-status-service.d.ts +9 -2
- package/lib/deployment/deployment-status-service.js +56 -3
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.d.ts +3 -0
- package/lib/deployment/deployment-validation-service.js +32 -4
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/plan-explain-service.d.ts +88 -0
- package/lib/deployment/plan-explain-service.js +171 -0
- package/lib/deployment/plan-explain-service.js.map +1 -0
- package/lib/deployment/resume-deployment-service.d.ts +6 -2
- package/lib/deployment/resume-deployment-service.js +27 -3
- package/lib/deployment/resume-deployment-service.js.map +1 -1
- package/lib/deployment/retrieve-forceignore-service.d.ts +51 -0
- package/lib/deployment/retrieve-forceignore-service.js +139 -0
- package/lib/deployment/retrieve-forceignore-service.js.map +1 -0
- package/lib/deployment/rollback-planning-service.d.ts +49 -0
- package/lib/deployment/rollback-planning-service.js +178 -0
- package/lib/deployment/rollback-planning-service.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +4 -0
- package/lib/deployment/sf-cli-integration.js +22 -2
- package/lib/deployment/sf-cli-integration.js.map +1 -1
- package/lib/deployment/start-execution-service.d.ts +1 -0
- package/lib/deployment/start-execution-service.js +14 -8
- package/lib/deployment/start-execution-service.js.map +1 -1
- package/lib/deployment/wave-manifest-service.d.ts +8 -0
- package/lib/deployment/wave-manifest-service.js +39 -20
- package/lib/deployment/wave-manifest-service.js.map +1 -1
- package/lib/presentation/plan-explain-presenter.d.ts +9 -0
- package/lib/presentation/plan-explain-presenter.js +40 -0
- package/lib/presentation/plan-explain-presenter.js.map +1 -0
- package/lib/presentation/start-command-presenter.d.ts +4 -0
- package/lib/presentation/start-command-presenter.js +4 -0
- package/lib/presentation/start-command-presenter.js.map +1 -1
- package/lib/reports/deployment-plan-report-service.d.ts +76 -0
- package/lib/reports/deployment-plan-report-service.js +234 -0
- package/lib/reports/deployment-plan-report-service.js.map +1 -0
- package/lib/reports/graph-export-service.d.ts +85 -0
- package/lib/reports/graph-export-service.js +296 -0
- package/lib/reports/graph-export-service.js.map +1 -0
- package/lib/services/metadata-scanner-service.js +4 -2
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +1 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js +39 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -1
- package/messages/ci.preset.json +22 -0
- package/messages/graph.export.json +20 -0
- package/messages/impact.json +18 -0
- package/messages/init.json +16 -0
- package/messages/plan.explain.json +20 -0
- package/messages/resume.json +1 -0
- package/messages/retrieve.json +26 -0
- package/messages/start.json +16 -2
- package/messages/status.json +1 -0
- package/messages/validate.json +3 -1
- package/npm-shrinkwrap.json +45 -70
- package/oclif.lock +44 -41
- package/oclif.manifest.json +801 -25
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-context-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-context-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAGvB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment-context-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-context-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAGvB,MAAM,yCAAyC,CAAC;AA2BjD,MAAM,OAAO,wBAAwB;IAClB,sBAAsB,CAAyB;IAEhE,YAAmB,eAAqD,EAAE;QACxE,IAAI,CAAC,sBAAsB,GAAG,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAAyC,EAAE;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1E,OAAO;YACL,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type DeploymentDiagnosticCategory = 'missing-field' | 'missing-object' | 'duplicate-metadata' | 'permission' | 'invalid-reference' | 'source-tracking-conflict' | 'unknown';
|
|
2
|
+
export type DeploymentDiagnostic = {
|
|
3
|
+
component: string;
|
|
4
|
+
problem: string;
|
|
5
|
+
probableCause: string;
|
|
6
|
+
remediation: string;
|
|
7
|
+
rawDetails: string;
|
|
8
|
+
category: DeploymentDiagnosticCategory;
|
|
9
|
+
};
|
|
10
|
+
export declare function normalizeDeploymentDiagnostics(output: string): DeploymentDiagnostic[];
|
|
11
|
+
export declare function formatDeploymentDiagnostics(diagnostics: readonly DeploymentDiagnostic[]): string;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const UNKNOWN_COMPONENT = 'Unknown component';
|
|
2
|
+
const UNKNOWN_NEXT_STEP = 'Review the raw Salesforce deploy output, confirm the metadata exists in the target org, and retry with a focused validation for the affected component.';
|
|
3
|
+
export function normalizeDeploymentDiagnostics(output) {
|
|
4
|
+
const records = extractFailureRecords(output);
|
|
5
|
+
const sourceRecords = records.length > 0
|
|
6
|
+
? records
|
|
7
|
+
: [
|
|
8
|
+
{
|
|
9
|
+
component: UNKNOWN_COMPONENT,
|
|
10
|
+
problem: output.trim() || 'Salesforce deployment failed without a detailed error message.',
|
|
11
|
+
rawDetails: output,
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
return sourceRecords.map((record) => classifyFailure(record));
|
|
15
|
+
}
|
|
16
|
+
export function formatDeploymentDiagnostics(diagnostics) {
|
|
17
|
+
if (diagnostics.length === 0) {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
return diagnostics
|
|
21
|
+
.map((item, index) => [
|
|
22
|
+
`Diagnostic ${index + 1}: ${item.component}`,
|
|
23
|
+
`Problem: ${item.problem}`,
|
|
24
|
+
`Probable cause: ${item.probableCause}`,
|
|
25
|
+
`Remediation: ${item.remediation}`,
|
|
26
|
+
].join('\n'))
|
|
27
|
+
.join('\n\n');
|
|
28
|
+
}
|
|
29
|
+
function extractFailureRecords(output) {
|
|
30
|
+
const parsed = parseJsonObject(output);
|
|
31
|
+
if (parsed === undefined) {
|
|
32
|
+
return extractTextFailureRecords(output);
|
|
33
|
+
}
|
|
34
|
+
const failures = [
|
|
35
|
+
...asArray(readPath(parsed, ['result', 'details', 'componentFailures'])),
|
|
36
|
+
...asArray(readPath(parsed, ['result', 'details', 'runTestResult', 'failures'])),
|
|
37
|
+
...asArray(readPath(parsed, ['result', 'componentFailures'])),
|
|
38
|
+
];
|
|
39
|
+
return failures
|
|
40
|
+
.map((failure) => buildFailureRecord(failure))
|
|
41
|
+
.filter((record) => record !== undefined);
|
|
42
|
+
}
|
|
43
|
+
function parseJsonObject(output) {
|
|
44
|
+
const jsonMatch = output.match(/\{[\s\S]*\}/);
|
|
45
|
+
if (!jsonMatch) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
50
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function readPath(value, path) {
|
|
57
|
+
return path.reduce((current, key) => (isRecord(current) ? current[key] : undefined), value);
|
|
58
|
+
}
|
|
59
|
+
function asArray(value) {
|
|
60
|
+
if (Array.isArray(value)) {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
return value === undefined || value === null ? [] : [value];
|
|
64
|
+
}
|
|
65
|
+
function buildFailureRecord(value) {
|
|
66
|
+
if (!isRecord(value)) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const failure = value;
|
|
70
|
+
const problem = stringValue(failure.problem);
|
|
71
|
+
if (problem === undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const componentParts = [
|
|
75
|
+
stringValue(failure.componentType),
|
|
76
|
+
stringValue(failure.fullName),
|
|
77
|
+
stringValue(failure.fileName),
|
|
78
|
+
].filter((part) => part !== undefined && part.length > 0);
|
|
79
|
+
const location = [numberValue(failure.lineNumber), numberValue(failure.columnNumber)]
|
|
80
|
+
.filter((part) => part !== undefined)
|
|
81
|
+
.join(':');
|
|
82
|
+
return {
|
|
83
|
+
component: componentParts.length > 0 ? componentParts.join(':') : UNKNOWN_COMPONENT,
|
|
84
|
+
problem,
|
|
85
|
+
rawDetails: JSON.stringify({ ...value, location: location || undefined }),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function extractTextFailureRecords(output) {
|
|
89
|
+
const trimmed = output.trim();
|
|
90
|
+
if (trimmed.length === 0) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
return trimmed
|
|
94
|
+
.split(/\r?\n/)
|
|
95
|
+
.map((line) => line.trim())
|
|
96
|
+
.filter((line) => line.length > 0)
|
|
97
|
+
.map((line) => ({
|
|
98
|
+
component: inferComponentFromText(line),
|
|
99
|
+
problem: line,
|
|
100
|
+
rawDetails: line,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
function classifyFailure(record) {
|
|
104
|
+
const normalized = record.problem.toLowerCase();
|
|
105
|
+
if (matchesMissingField(normalized)) {
|
|
106
|
+
return diagnostic(record, 'missing-field', {
|
|
107
|
+
probableCause: 'A referenced field is not present in the target org or is deployed in a later wave.',
|
|
108
|
+
remediation: 'Deploy the missing CustomField before this component, add it to the same or earlier wave, or remove the stale field reference.',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (matchesMissingObject(normalized)) {
|
|
112
|
+
return diagnostic(record, 'missing-object', {
|
|
113
|
+
probableCause: 'A referenced object is not present in the target org or the object metadata is missing from the package.',
|
|
114
|
+
remediation: 'Deploy the CustomObject before dependent metadata, include the object in the manifest, or correct the object API name.',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (matchesDuplicateMetadata(normalized)) {
|
|
118
|
+
return diagnostic(record, 'duplicate-metadata', {
|
|
119
|
+
probableCause: 'The package contains duplicate metadata members or a component conflicts with metadata already owned elsewhere.',
|
|
120
|
+
remediation: 'Remove duplicate package entries, consolidate the metadata source, then rerun validation with one authoritative component path.',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (matchesPermission(normalized)) {
|
|
124
|
+
return diagnostic(record, 'permission', {
|
|
125
|
+
probableCause: 'The deployment user lacks metadata, object, field, Apex, or setup permissions required for this change.',
|
|
126
|
+
remediation: 'Grant the deployment user the required permission set or org permission, then validate again with the same target org.',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (matchesSourceTrackingConflict(normalized)) {
|
|
130
|
+
return diagnostic(record, 'source-tracking-conflict', {
|
|
131
|
+
probableCause: 'Local source tracking is out of sync with the target org or conflicts with remote changes.',
|
|
132
|
+
remediation: 'Pull or reset source tracking for the org, reconcile conflicts, then rerun the deployment validation.',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (matchesInvalidReference(normalized)) {
|
|
136
|
+
return diagnostic(record, 'invalid-reference', {
|
|
137
|
+
probableCause: 'The metadata references a component, value, label, class, flow, layout, or relationship that cannot be resolved.',
|
|
138
|
+
remediation: 'Deploy the referenced component first, correct the API name, or remove the stale reference from this metadata.',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return diagnostic(record, 'unknown', {
|
|
142
|
+
probableCause: 'Salesforce returned an error that does not match a known smart-deployment diagnostic pattern.',
|
|
143
|
+
remediation: UNKNOWN_NEXT_STEP,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function diagnostic(record, category, details) {
|
|
147
|
+
return {
|
|
148
|
+
component: record.component ?? UNKNOWN_COMPONENT,
|
|
149
|
+
problem: record.problem,
|
|
150
|
+
rawDetails: record.rawDetails,
|
|
151
|
+
category,
|
|
152
|
+
...details,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function matchesMissingField(problem) {
|
|
156
|
+
return (/no such column|invalid field|field .* does not exist|unknown field|could not resolve standard field/i.test(problem) || /in field: field - no customfield named/i.test(problem));
|
|
157
|
+
}
|
|
158
|
+
function matchesMissingObject(problem) {
|
|
159
|
+
return (/entity is not org-accessible|invalid type|sobject type .* is not supported|no customobject named/i.test(problem) ||
|
|
160
|
+
/reference to undefined object|object .* does not exist/i.test(problem));
|
|
161
|
+
}
|
|
162
|
+
function matchesDuplicateMetadata(problem) {
|
|
163
|
+
return /duplicate value|duplicate name|duplicate full name|already exists|more than one/i.test(problem);
|
|
164
|
+
}
|
|
165
|
+
function matchesPermission(problem) {
|
|
166
|
+
return /insufficient access|insufficient privileges|not authorized|required permission|permission denied|invalid cross reference id/i.test(problem);
|
|
167
|
+
}
|
|
168
|
+
function matchesInvalidReference(problem) {
|
|
169
|
+
return /invalid reference|invalid relationship|invalid definition|not found|does not exist|unknown user permission|invalid value/i.test(problem);
|
|
170
|
+
}
|
|
171
|
+
function matchesSourceTrackingConflict(problem) {
|
|
172
|
+
return /source tracking|conflict|sync.*source|source.*out of sync|tracking.*reset/i.test(problem);
|
|
173
|
+
}
|
|
174
|
+
function inferComponentFromText(line) {
|
|
175
|
+
const match = line.match(/(?:component|file|entity|object|field)\s+['"]?([A-Za-z0-9_.:-]+)['"]?/i);
|
|
176
|
+
return match?.[1] ?? UNKNOWN_COMPONENT;
|
|
177
|
+
}
|
|
178
|
+
function stringValue(value) {
|
|
179
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
180
|
+
}
|
|
181
|
+
function numberValue(value) {
|
|
182
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
183
|
+
}
|
|
184
|
+
function isRecord(value) {
|
|
185
|
+
return typeof value === 'object' && value !== null;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=deployment-error-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-error-diagnostics.js","sourceRoot":"","sources":["../../src/deployment/deployment-error-diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TestPlanService } from './test-plan-service.js';
|
|
2
2
|
import { WaveManifestService } from './wave-manifest-service.js';
|
|
3
3
|
import { ForceIgnoreStagingService } from './forceignore-staging-service.js';
|
|
4
|
+
import { formatDeploymentDiagnostics } from './deployment-error-diagnostics.js';
|
|
4
5
|
import { buildPersistedWaveGraphContext } from './wave-graph-state.js';
|
|
5
6
|
export class DeploymentRunner {
|
|
6
7
|
testPlanService;
|
|
@@ -12,24 +13,39 @@ export class DeploymentRunner {
|
|
|
12
13
|
this.forceIgnoreStagingService = dependencies.forceIgnoreStagingService ?? new ForceIgnoreStagingService();
|
|
13
14
|
}
|
|
14
15
|
async execute(params) {
|
|
15
|
-
const { deploymentId, targetOrg, sourcePath, orderedWaves, dependencyGraph, componentMap, apiVersion, skipTests, testExecutor, tracker, stateManager, sfCli, aiContext, log, } = params;
|
|
16
|
+
const { deploymentId, targetOrg, sourcePath, orderedWaves, dependencyGraph, componentMap, apiVersion, skipTests, testExecutor, tracker, stateManager, sfCli, aiContext, mode = 'deploy', log, } = params;
|
|
16
17
|
await this.forEachSequentially(orderedWaves, async (wave) => {
|
|
17
|
-
|
|
18
|
+
const destructive = mode === 'destructive';
|
|
19
|
+
log(`\n🌊 ${destructive ? 'Deleting' : 'Deploying'} Wave ${wave.number}/${orderedWaves.length} (${wave.components.length} components)...`);
|
|
18
20
|
const workspace = await this.forceIgnoreStagingService.prepare({
|
|
19
21
|
projectRoot: sourcePath ?? process.cwd(),
|
|
20
22
|
});
|
|
21
23
|
try {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
const manifest = destructive
|
|
25
|
+
? await this.waveManifestService.generateDestructiveManifest({
|
|
26
|
+
baseDir: workspace.projectRoot,
|
|
27
|
+
waveNumber: wave.number,
|
|
28
|
+
components: wave.components,
|
|
29
|
+
componentMap,
|
|
30
|
+
apiVersion,
|
|
31
|
+
})
|
|
32
|
+
: {
|
|
33
|
+
packagePath: await this.waveManifestService.generateManifest({
|
|
34
|
+
baseDir: workspace.projectRoot,
|
|
35
|
+
waveNumber: wave.number,
|
|
36
|
+
components: wave.components,
|
|
37
|
+
componentMap,
|
|
38
|
+
apiVersion,
|
|
39
|
+
}),
|
|
40
|
+
destructiveChangesPath: undefined,
|
|
41
|
+
};
|
|
42
|
+
const testPlan = destructive
|
|
43
|
+
? { testLevel: 'NoTestRun', tests: [] }
|
|
44
|
+
: this.testPlanService.resolveTestPlan(wave, skipTests, testExecutor);
|
|
30
45
|
tracker.startTracking(deploymentId, wave.number, orderedWaves.length);
|
|
31
46
|
const result = await sfCli.deploy({
|
|
32
|
-
manifestPath,
|
|
47
|
+
manifestPath: manifest.packagePath,
|
|
48
|
+
postDestructiveChangesPath: manifest.destructiveChangesPath,
|
|
33
49
|
targetOrg,
|
|
34
50
|
workingDirectory: workspace.projectRoot,
|
|
35
51
|
testLevel: testPlan.testLevel,
|
|
@@ -37,6 +53,9 @@ export class DeploymentRunner {
|
|
|
37
53
|
});
|
|
38
54
|
tracker.updateProgress(deploymentId, result);
|
|
39
55
|
if (!result.success) {
|
|
56
|
+
const diagnostics = result.diagnostics ?? [];
|
|
57
|
+
const formattedDiagnostics = formatDeploymentDiagnostics(diagnostics);
|
|
58
|
+
const failureMessage = formattedDiagnostics ? `${result.output}\n\n${formattedDiagnostics}` : result.output;
|
|
40
59
|
await stateManager.saveState({
|
|
41
60
|
deploymentId,
|
|
42
61
|
targetOrg,
|
|
@@ -46,7 +65,7 @@ export class DeploymentRunner {
|
|
|
46
65
|
currentWave: wave.number,
|
|
47
66
|
failedWave: {
|
|
48
67
|
waveNumber: wave.number,
|
|
49
|
-
error:
|
|
68
|
+
error: failureMessage,
|
|
50
69
|
timestamp: new Date().toISOString(),
|
|
51
70
|
},
|
|
52
71
|
metadata: {
|
|
@@ -54,11 +73,12 @@ export class DeploymentRunner {
|
|
|
54
73
|
testsRun: result.testsRun,
|
|
55
74
|
testFailures: result.testFailures,
|
|
56
75
|
testLevel: testPlan.testLevel,
|
|
76
|
+
diagnostics,
|
|
57
77
|
waveGraphContext: buildPersistedWaveGraphContext(orderedWaves, dependencyGraph),
|
|
58
78
|
...this.buildAIMetadata(aiContext),
|
|
59
79
|
},
|
|
60
80
|
});
|
|
61
|
-
throw new Error(`Wave ${wave.number} failed: ${
|
|
81
|
+
throw new Error(`Wave ${wave.number} failed: ${failureMessage}`);
|
|
62
82
|
}
|
|
63
83
|
await stateManager.saveState({
|
|
64
84
|
deploymentId,
|
|
@@ -76,14 +96,14 @@ export class DeploymentRunner {
|
|
|
76
96
|
...this.buildAIMetadata(aiContext),
|
|
77
97
|
},
|
|
78
98
|
});
|
|
79
|
-
log(`✅ Wave ${wave.number} deployed successfully`);
|
|
99
|
+
log(`✅ Wave ${wave.number} ${destructive ? 'deleted' : 'deployed'} successfully`);
|
|
80
100
|
}
|
|
81
101
|
finally {
|
|
82
102
|
await workspace.cleanup();
|
|
83
103
|
}
|
|
84
104
|
});
|
|
85
105
|
await stateManager.clearState();
|
|
86
|
-
log(
|
|
106
|
+
log(`\n✅ All waves ${mode === 'destructive' ? 'deleted' : 'deployed'} successfully!`);
|
|
87
107
|
}
|
|
88
108
|
buildAIMetadata(aiContext) {
|
|
89
109
|
if (aiContext === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-runner.js","sourceRoot":"","sources":["../../src/deployment/deployment-runner.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment-runner.js","sourceRoot":"","sources":["../../src/deployment/deployment-runner.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AA0BvE,MAAM,OAAO,gBAAgB;IACV,eAAe,CAAkB;IACjC,mBAAmB,CAAsB;IACzC,yBAAyB,CAA4B;IAEtE,YAAmB,eAA6C,EAAE;QAChE,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC,eAAe,IAAI,IAAI,eAAe,EAAE,CAAC;QAC7E,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACzF,IAAI,CAAC,yBAAyB,GAAG,YAAY,CAAC,yBAAyB,IAAI,IAAI,yBAAyB,EAAE,CAAC;IAC7G,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,MAA8B;QACjD,MAAM,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,KAAK,EACL,SAAS,EACT,IAAI,GAAG,QAAQ,EACf,GAAG,GACJ,GAAG,MAAM,CAAC;QAEX,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1D,MAAM,WAAW,GAAG,IAAI,KAAK,aAAa,CAAC;YAC3C,GAAG,CACD,QAAQ,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,SAAS,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,KACvF,IAAI,CAAC,UAAU,CAAC,MAClB,iBAAiB,CAClB,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;gBAC7D,WAAW,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE;aACzC,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,WAAW;oBAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,CAAC;wBACzD,OAAO,EAAE,SAAS,CAAC,WAAW;wBAC9B,UAAU,EAAE,IAAI,CAAC,MAAM;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,YAAY;wBACZ,UAAU;qBACX,CAAC;oBACJ,CAAC,CAAC;wBACE,WAAW,EAAE,MAAM,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;4BAC3D,OAAO,EAAE,SAAS,CAAC,WAAW;4BAC9B,UAAU,EAAE,IAAI,CAAC,MAAM;4BACvB,UAAU,EAAE,IAAI,CAAC,UAAU;4BAC3B,YAAY;4BACZ,UAAU;yBACX,CAAC;wBACF,sBAAsB,EAAE,SAAS;qBAClC,CAAC;gBACN,MAAM,QAAQ,GAAG,WAAW;oBAC1B,CAAC,CAAC,EAAE,SAAS,EAAE,WAAoB,EAAE,KAAK,EAAE,EAAE,EAAE;oBAChD,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;gBAExE,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;oBAChC,YAAY,EAAE,QAAQ,CAAC,WAAW;oBAClC,0BAA0B,EAAE,QAAQ,CAAC,sBAAsB;oBAC3D,SAAS;oBACT,gBAAgB,EAAE,SAAS,CAAC,WAAW;oBACvC,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,KAAK,EAAE,QAAQ,CAAC,SAAS,KAAK,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBAC/E,CAAC,CAAC;gBACH,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBAE7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;oBAC7C,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;oBACtE,MAAM,cAAc,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,oBAAoB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;oBAE5G,MAAM,YAAY,CAAC,SAAS,CAAC;wBAC3B,YAAY;wBACZ,SAAS;wBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACnC,UAAU,EAAE,YAAY,CAAC,MAAM;wBAC/B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;wBACrF,WAAW,EAAE,IAAI,CAAC,MAAM;wBACxB,UAAU,EAAE;4BACV,UAAU,EAAE,IAAI,CAAC,MAAM;4BACvB,KAAK,EAAE,cAAc;4BACrB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;yBACpC;wBACD,QAAQ,EAAE;4BACR,eAAe,EAAE,MAAM,CAAC,MAAM;4BAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,YAAY,EAAE,MAAM,CAAC,YAAY;4BACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;4BAC7B,WAAW;4BACX,gBAAgB,EAAE,8BAA8B,CAAC,YAAY,EAAE,eAAe,CAAC;4BAC/E,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;yBACnC;qBACF,CAAC,CAAC;oBACH,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,YAAY,cAAc,EAAE,CAAC,CAAC;gBACnE,CAAC;gBAED,MAAM,YAAY,CAAC,SAAS,CAAC;oBAC3B,YAAY;oBACZ,SAAS;oBACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,UAAU,EAAE,YAAY,CAAC,MAAM;oBAC/B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;oBACpE,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,QAAQ,EAAE;wBACR,eAAe,EAAE,MAAM,CAAC,MAAM;wBAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;wBACjC,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,gBAAgB,EAAE,8BAA8B,CAAC,YAAY,EAAE,eAAe,CAAC;wBAC/E,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;qBACnC;iBACF,CAAC,CAAC;gBAEH,GAAG,CAAC,UAAU,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,eAAe,CAAC,CAAC;YACpF,CAAC;oBAAS,CAAC;gBACT,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAChC,GAAG,CAAC,iBAAiB,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,gBAAgB,CAAC,CAAC;IACxF,CAAC;IAEO,eAAe,CAAC,SAA+B;QACrD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,SAAS,CAAC,QAAQ;YAC9B,OAAO,EAAE,SAAS,CAAC,KAAK;YACxB,UAAU,EAAE,SAAS,CAAC,QAAQ;YAC9B,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,cAAc,EAAE,SAAS,CAAC,YAAY;YACtC,mBAAmB,EAAE,SAAS,CAAC,iBAAiB;YAChD,sBAAsB,EAAE,SAAS,CAAC,oBAAoB;SACvD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,KAAmB,EACnB,QAAmD;QAEnD,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACd,CAAC;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WaveGraph } from '../waves/wave-graph.js';
|
|
2
2
|
import { type CycleRemediationStatusSummary } from './deployment-state-summary.js';
|
|
3
3
|
import { StateManager } from './state-manager.js';
|
|
4
|
+
import { SfCliIntegration } from './sf-cli-integration.js';
|
|
4
5
|
export type DeploymentStatusSummary = {
|
|
5
6
|
hasState: boolean;
|
|
6
7
|
status: 'not-started' | 'in-progress' | 'failed' | 'completed';
|
|
@@ -31,10 +32,16 @@ export type ResumeSummary = {
|
|
|
31
32
|
};
|
|
32
33
|
export declare class DeploymentStatusService {
|
|
33
34
|
private readonly stateManager;
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
private readonly sfCli;
|
|
36
|
+
constructor(stateManager?: StateManager, sfCli?: Pick<SfCliIntegration, 'checkDeploymentStatus'>);
|
|
37
|
+
getStatus(options?: {
|
|
38
|
+
targetOrg?: string;
|
|
39
|
+
}): Promise<DeploymentStatusSummary>;
|
|
36
40
|
getResumeSummary(): Promise<ResumeSummary>;
|
|
37
41
|
formatStatus(summary: DeploymentStatusSummary): string;
|
|
42
|
+
private refreshRemoteState;
|
|
43
|
+
private applyRemoteResult;
|
|
44
|
+
private isFailedRemoteStatus;
|
|
38
45
|
private expandRemainingWaves;
|
|
39
46
|
private normalizeStatus;
|
|
40
47
|
private normalizeTestStatus;
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { getLogger } from '../utils/logger.js';
|
|
2
2
|
import { formatDeploymentStatus, summarizeDeploymentState, } from './deployment-state-summary.js';
|
|
3
3
|
import { StateManager } from './state-manager.js';
|
|
4
|
+
import { SfCliIntegration } from './sf-cli-integration.js';
|
|
4
5
|
import { buildWaveGraphFromState } from './wave-graph-state.js';
|
|
5
6
|
const logger = getLogger('DeploymentStatusService');
|
|
6
7
|
export class DeploymentStatusService {
|
|
7
8
|
stateManager;
|
|
8
|
-
|
|
9
|
+
sfCli;
|
|
10
|
+
constructor(stateManager = new StateManager(), sfCli = new SfCliIntegration()) {
|
|
9
11
|
this.stateManager = stateManager;
|
|
12
|
+
this.sfCli = sfCli;
|
|
10
13
|
}
|
|
11
|
-
async getStatus() {
|
|
12
|
-
const
|
|
14
|
+
async getStatus(options = {}) {
|
|
15
|
+
const loadedState = await this.stateManager.loadState();
|
|
16
|
+
const state = loadedState && options.targetOrg ? await this.refreshRemoteState(loadedState, options.targetOrg) : loadedState;
|
|
13
17
|
if (!state) {
|
|
14
18
|
return {
|
|
15
19
|
hasState: false,
|
|
@@ -101,6 +105,55 @@ export class DeploymentStatusService {
|
|
|
101
105
|
cycleRemediation: summary.cycleRemediation,
|
|
102
106
|
}).join('\n');
|
|
103
107
|
}
|
|
108
|
+
async refreshRemoteState(state, targetOrg) {
|
|
109
|
+
const remoteResult = await this.sfCli.checkDeploymentStatus(state.deploymentId, targetOrg);
|
|
110
|
+
const updatedState = this.applyRemoteResult(state, targetOrg, remoteResult);
|
|
111
|
+
await this.stateManager.saveState(updatedState);
|
|
112
|
+
return updatedState;
|
|
113
|
+
}
|
|
114
|
+
applyRemoteResult(state, targetOrg, result) {
|
|
115
|
+
const metadata = {
|
|
116
|
+
...(state.metadata ?? {}),
|
|
117
|
+
lastKnownStatus: result.status,
|
|
118
|
+
remoteStatus: result.status,
|
|
119
|
+
remoteStatusCheckedAt: new Date().toISOString(),
|
|
120
|
+
remoteComponentSuccesses: result.componentSuccesses,
|
|
121
|
+
remoteComponentFailures: result.componentFailures,
|
|
122
|
+
remoteTestsRun: result.testsRun,
|
|
123
|
+
remoteTestFailures: result.testFailures,
|
|
124
|
+
};
|
|
125
|
+
if (result.status === 'Succeeded' || result.status === 'Success') {
|
|
126
|
+
return {
|
|
127
|
+
...state,
|
|
128
|
+
targetOrg,
|
|
129
|
+
completedWaves: Array.from({ length: state.totalWaves }, (_, index) => index + 1),
|
|
130
|
+
currentWave: state.totalWaves,
|
|
131
|
+
failedWave: undefined,
|
|
132
|
+
metadata,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (this.isFailedRemoteStatus(result.status)) {
|
|
136
|
+
return {
|
|
137
|
+
...state,
|
|
138
|
+
targetOrg,
|
|
139
|
+
failedWave: state.failedWave ?? {
|
|
140
|
+
waveNumber: state.currentWave ?? 1,
|
|
141
|
+
error: result.output,
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
},
|
|
144
|
+
metadata,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
...state,
|
|
149
|
+
targetOrg,
|
|
150
|
+
failedWave: undefined,
|
|
151
|
+
metadata,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
isFailedRemoteStatus(status) {
|
|
155
|
+
return ['Failed', 'Canceled', 'Error'].includes(status);
|
|
156
|
+
}
|
|
104
157
|
expandRemainingWaves(currentWave, remainingCount, totalWaves) {
|
|
105
158
|
return Array.from({ length: remainingCount }, (_, index) => currentWave + index).filter((wave) => wave <= totalWaves);
|
|
106
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-status-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-status-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAEL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"deployment-status-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-status-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAEL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,MAAM,GAAG,SAAS,CAAC,yBAAyB,CAAC,CAAC;AAgCpD,MAAM,OAAO,uBAAuB;IAEf;IACA;IAFnB,YACmB,eAA6B,IAAI,YAAY,EAAE,EAC/C,QAAyD,IAAI,gBAAgB,EAAE;QAD/E,iBAAY,GAAZ,YAAY,CAAmC;QAC/C,UAAK,GAAL,KAAK,CAA0E;IAC/F,CAAC;IAEG,KAAK,CAAC,SAAS,CAAC,UAAkC,EAAE;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACxD,MAAM,KAAK,GACT,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAEjH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,EAAE;gBAClB,cAAc,EAAE,EAAE;gBAClB,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,SAAS;gBACrB,cAAc,EAAE,aAAa;gBAC7B,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;aACpD,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC;YAC1G,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,eAAe,EAAE,OAAO,CAAC,aAAa;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC;YACxD,cAAc,EAAE,OAAO,CAAC,UAAU;YAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,SAAS,EAAE,uBAAuB,CAAC,KAAK,CAAC;YACzC,SAAS,EAAE,OAAO,CAAC,WAAW;YAC9B,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;SACpD,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,gBAAgB;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEvC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,qCAAqC;gBAC7C,cAAc,EAAE,EAAE;gBAClB,cAAc,EAAE,EAAE;aACnB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,2CAA2C;gBACnD,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;aACnC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,OAAO,CAAC,gBAAgB;YACpC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC;IACJ,CAAC;IAEM,YAAY,CAAC,OAAgC;QAClD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,4BAA4B,EAAE,wBAAwB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,sBAAsB,CAAC;YAC5B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,SAAS;YAC/C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;YACzC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM;YAC7C,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC;YACtD,UAAU,EAAE,OAAO,CAAC,cAAc;YAClC,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;YAC3C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,aAAa,EAAE,OAAO,CAAC,eAAe;YACtC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAAsB,EAAE,SAAiB;QACxE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,iBAAiB,CAAC,KAAsB,EAAE,SAAiB,EAAE,MAAwB;QAC3F,MAAM,QAAQ,GAAG;YACf,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzB,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,qBAAqB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC/C,wBAAwB,EAAE,MAAM,CAAC,kBAAkB;YACnD,uBAAuB,EAAE,MAAM,CAAC,iBAAiB;YACjD,cAAc,EAAE,MAAM,CAAC,QAAQ;YAC/B,kBAAkB,EAAE,MAAM,CAAC,YAAY;SACxC,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS;gBACT,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;gBACjF,WAAW,EAAE,KAAK,CAAC,UAAU;gBAC7B,UAAU,EAAE,SAAS;gBACrB,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS;gBACT,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI;oBAC9B,UAAU,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC;oBAClC,KAAK,EAAE,MAAM,CAAC,MAAM;oBACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC;gBACD,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,KAAK;YACR,SAAS;YACT,UAAU,EAAE,SAAS;YACrB,QAAQ;SACT,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAAC,MAAc;QACzC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAEO,oBAAoB,CAAC,WAAmB,EAAE,cAAsB,EAAE,UAAkB;QAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CACrF,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,UAAU,CAC7B,CAAC;IACJ,CAAC;IAEO,eAAe,CACrB,MAA8D;QAE9D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,aAAa;gBAChB,OAAO,aAAa,CAAC;YACvB,KAAK,aAAa;gBAChB,OAAO,aAAa,CAAC;YACvB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;YAClB;gBACE,OAAO,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,UAAkB;QAC5C,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnG,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,eAAe,CACrB,MAAyC;QAEzC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,aAAa;gBAChB,OAAO,aAAa,CAAC;YACvB,KAAK,aAAa;gBAChB,OAAO,aAAa,CAAC;YACvB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;YAClB;gBACE,OAAO,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,4BAA4B,CAAC,OAAgC;QACnE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;QACrD,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,cAAc,GAAG,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { MetadataDependencyKind } from '../types/metadata.js';
|
|
2
|
+
import type { CommitScopeOptions, CommitScopeSummary } from './commit-scope-service.js';
|
|
2
3
|
export type DeploymentValidationIssue = {
|
|
3
4
|
severity: 'error' | 'warning';
|
|
4
5
|
message: string;
|
|
@@ -19,12 +20,14 @@ export type DeploymentValidationSummary = {
|
|
|
19
20
|
aiProvider?: string;
|
|
20
21
|
aiModel?: string;
|
|
21
22
|
aiFallback?: boolean;
|
|
23
|
+
commitScope?: CommitScopeSummary;
|
|
22
24
|
};
|
|
23
25
|
export declare class DeploymentValidationService {
|
|
24
26
|
private readonly projectAnalysisService;
|
|
25
27
|
private readonly xmlValidator;
|
|
26
28
|
validateProject(sourcePath?: string, options?: {
|
|
27
29
|
useAI?: boolean;
|
|
30
|
+
commitScope?: CommitScopeOptions;
|
|
28
31
|
}): Promise<DeploymentValidationSummary>;
|
|
29
32
|
private createWaveDependencyRiskIssues;
|
|
30
33
|
private findXmlMetadataFiles;
|
|
@@ -10,7 +10,11 @@ export class DeploymentValidationService {
|
|
|
10
10
|
projectAnalysisService = new ProjectAnalysisService();
|
|
11
11
|
xmlValidator = new XmlMetadataValidator();
|
|
12
12
|
async validateProject(sourcePath, options = {}) {
|
|
13
|
-
const analysis = await this.projectAnalysisService.buildAnalysis({
|
|
13
|
+
const analysis = await this.projectAnalysisService.buildAnalysis({
|
|
14
|
+
sourcePath,
|
|
15
|
+
useAI: options.useAI,
|
|
16
|
+
commitScope: options.commitScope,
|
|
17
|
+
});
|
|
14
18
|
const { scanResult, waveResult } = analysis;
|
|
15
19
|
const issues = [];
|
|
16
20
|
const dependencyBreakdown = scanResult.dependencyResult.edges.reduce((accumulator, edge) => ({
|
|
@@ -41,7 +45,7 @@ export class DeploymentValidationService {
|
|
|
41
45
|
});
|
|
42
46
|
}
|
|
43
47
|
issues.push(...this.createWaveDependencyRiskIssues(scanResult.dependencyResult.edges, waveResult.waves));
|
|
44
|
-
const xmlFiles = await this.findXmlMetadataFiles(scanResult.projectRoot);
|
|
48
|
+
const xmlFiles = await this.findXmlMetadataFiles(scanResult.projectRoot, analysis.commitScope?.enabled ? scanResult.components : undefined);
|
|
45
49
|
const xmlResults = await this.xmlValidator.validateFiles(xmlFiles);
|
|
46
50
|
for (const result of xmlResults) {
|
|
47
51
|
for (const error of result.errors) {
|
|
@@ -112,6 +116,7 @@ export class DeploymentValidationService {
|
|
|
112
116
|
aiProvider,
|
|
113
117
|
aiModel,
|
|
114
118
|
aiFallback,
|
|
119
|
+
commitScope: analysis.commitScope,
|
|
115
120
|
};
|
|
116
121
|
}
|
|
117
122
|
createWaveDependencyRiskIssues(edges, waves) {
|
|
@@ -149,16 +154,39 @@ export class DeploymentValidationService {
|
|
|
149
154
|
];
|
|
150
155
|
});
|
|
151
156
|
}
|
|
152
|
-
async findXmlMetadataFiles(projectRoot) {
|
|
157
|
+
async findXmlMetadataFiles(projectRoot, scopedComponents) {
|
|
153
158
|
const files = await globAsync('**/*-meta.xml', {
|
|
154
159
|
cwd: projectRoot,
|
|
155
160
|
absolute: true,
|
|
156
161
|
ignore: ['**/node_modules/**', '**/.git/**'],
|
|
157
162
|
});
|
|
163
|
+
const scopedPaths = scopedComponents ? createScopedXmlPathMatcher(projectRoot, scopedComponents) : undefined;
|
|
158
164
|
return files.filter((filePath) => {
|
|
159
165
|
const normalized = filePath.split(path.sep).join('/');
|
|
160
|
-
return !normalized.includes('/node_modules/') &&
|
|
166
|
+
return (!normalized.includes('/node_modules/') &&
|
|
167
|
+
!normalized.includes('/.git/') &&
|
|
168
|
+
(!scopedPaths || scopedPaths(filePath)));
|
|
161
169
|
});
|
|
162
170
|
}
|
|
163
171
|
}
|
|
172
|
+
function createScopedXmlPathMatcher(projectRoot, components) {
|
|
173
|
+
const exactPaths = new Set();
|
|
174
|
+
const directoryPrefixes = [];
|
|
175
|
+
for (const component of components) {
|
|
176
|
+
const relativePath = normalizeRelativePath(projectRoot, component.filePath);
|
|
177
|
+
exactPaths.add(relativePath);
|
|
178
|
+
exactPaths.add(`${relativePath}-meta.xml`);
|
|
179
|
+
if (component.type === 'LightningComponentBundle' || component.type === 'AuraDefinitionBundle') {
|
|
180
|
+
directoryPrefixes.push(`${relativePath}/`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return (filePath) => {
|
|
184
|
+
const relativePath = normalizeRelativePath(projectRoot, filePath);
|
|
185
|
+
return exactPaths.has(relativePath) || directoryPrefixes.some((prefix) => relativePath.startsWith(prefix));
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function normalizeRelativePath(projectRoot, filePath) {
|
|
189
|
+
const relativePath = path.isAbsolute(filePath) ? path.relative(projectRoot, filePath) : filePath;
|
|
190
|
+
return relativePath.split(path.sep).join('/');
|
|
191
|
+
}
|
|
164
192
|
//# sourceMappingURL=deployment-validation-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-validation-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-validation-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"deployment-validation-service.js","sourceRoot":"","sources":["../../src/deployment/deployment-validation-service.ts"],"names":[],"mappings":"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"}
|