@simplysf/simply-cicd-core 0.2.2 → 0.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 -3
- package/lib/build/checkPermissionSets.d.ts +22 -0
- package/lib/build/checkPermissionSets.js +102 -0
- package/lib/build/checkPermissionSets.js.map +1 -0
- package/lib/build/cleanupScratchOrgs.d.ts +6 -0
- package/lib/build/cleanupScratchOrgs.js +91 -0
- package/lib/build/cleanupScratchOrgs.js.map +1 -0
- package/lib/build/createFallbackTag.d.ts +24 -0
- package/lib/build/createFallbackTag.js +147 -0
- package/lib/build/createFallbackTag.js.map +1 -0
- package/lib/build/createPackageVersion.d.ts +42 -0
- package/lib/build/createPackageVersion.js +198 -0
- package/lib/build/createPackageVersion.js.map +1 -0
- package/lib/build/createScratchOrg.d.ts +14 -0
- package/lib/build/createScratchOrg.js +192 -0
- package/lib/build/createScratchOrg.js.map +1 -0
- package/lib/build/deleteScratchOrg.d.ts +13 -0
- package/lib/build/deleteScratchOrg.js +62 -0
- package/lib/build/deleteScratchOrg.js.map +1 -0
- package/lib/build/deltaRunner.d.ts +73 -0
- package/lib/build/deltaRunner.js +109 -0
- package/lib/build/deltaRunner.js.map +1 -0
- package/lib/build/determinePackageChanges.d.ts +11 -0
- package/lib/build/determinePackageChanges.js +90 -0
- package/lib/build/determinePackageChanges.js.map +1 -0
- package/lib/build/devHubs.d.ts +12 -0
- package/lib/build/devHubs.js +42 -0
- package/lib/build/devHubs.js.map +1 -0
- package/lib/build/flexipageDelta.d.ts +18 -0
- package/lib/build/flexipageDelta.js +35 -0
- package/lib/build/flexipageDelta.js.map +1 -0
- package/lib/build/flowDelta.d.ts +17 -0
- package/lib/build/flowDelta.js +34 -0
- package/lib/build/flowDelta.js.map +1 -0
- package/lib/build/installDependencies.d.ts +10 -0
- package/lib/build/installDependencies.js +39 -0
- package/lib/build/installDependencies.js.map +1 -0
- package/lib/build/lwcJest.d.ts +25 -0
- package/lib/build/lwcJest.js +126 -0
- package/lib/build/lwcJest.js.map +1 -0
- package/lib/build/publishUtamPageObjects.d.ts +50 -0
- package/lib/build/publishUtamPageObjects.js +283 -0
- package/lib/build/publishUtamPageObjects.js.map +1 -0
- package/lib/build/pushScratch.d.ts +9 -0
- package/lib/build/pushScratch.js +60 -0
- package/lib/build/pushScratch.js.map +1 -0
- package/lib/build/scratchOrgAuth.d.ts +18 -0
- package/lib/build/scratchOrgAuth.js +52 -0
- package/lib/build/scratchOrgAuth.js.map +1 -0
- package/lib/build/scratchOrgInfo.d.ts +14 -0
- package/lib/build/scratchOrgInfo.js +21 -0
- package/lib/build/scratchOrgInfo.js.map +1 -0
- package/lib/build/skipGuard.d.ts +8 -0
- package/lib/build/skipGuard.js +42 -0
- package/lib/build/skipGuard.js.map +1 -0
- package/lib/build/testScratch.d.ts +15 -0
- package/lib/build/testScratch.js +42 -0
- package/lib/build/testScratch.js.map +1 -0
- package/lib/build/utamPageObjects.d.ts +143 -0
- package/lib/build/utamPageObjects.js +258 -0
- package/lib/build/utamPageObjects.js.map +1 -0
- package/lib/build/versionTagFormat.d.ts +57 -0
- package/lib/build/versionTagFormat.js +194 -0
- package/lib/build/versionTagFormat.js.map +1 -0
- package/lib/config/defaultDeploymentPlugins.d.ts +2 -0
- package/lib/config/defaultDeploymentPlugins.js +18 -0
- package/lib/config/defaultDeploymentPlugins.js.map +1 -0
- package/lib/config/trustedPlugins.d.ts +2 -0
- package/lib/config/trustedPlugins.js +18 -0
- package/lib/config/trustedPlugins.js.map +1 -0
- package/lib/deploy/deployCommon.d.ts +105 -0
- package/lib/deploy/deployCommon.js +358 -0
- package/lib/deploy/deployCommon.js.map +1 -0
- package/lib/deploy/deployHappySoup.d.ts +56 -0
- package/lib/deploy/deployHappySoup.js +160 -0
- package/lib/deploy/deployHappySoup.js.map +1 -0
- package/lib/deploy/deployProject.d.ts +27 -0
- package/lib/deploy/deployProject.js +114 -0
- package/lib/deploy/deployProject.js.map +1 -0
- package/lib/deploy/runDeployStage.d.ts +16 -0
- package/lib/deploy/runDeployStage.js +65 -0
- package/lib/deploy/runDeployStage.js.map +1 -0
- package/lib/deploy/stageOptions.d.ts +49 -0
- package/lib/deploy/stageOptions.js +70 -0
- package/lib/deploy/stageOptions.js.map +1 -0
- package/lib/deploy/validate.d.ts +11 -0
- package/lib/deploy/validate.js +54 -0
- package/lib/deploy/validate.js.map +1 -0
- package/lib/env.d.ts +9 -0
- package/lib/env.js +47 -0
- package/lib/env.js.map +1 -0
- package/lib/exec/sfCli.d.ts +27 -0
- package/lib/exec/sfCli.js +50 -0
- package/lib/exec/sfCli.js.map +1 -0
- package/lib/flags/env.d.ts +44 -0
- package/lib/flags/env.js +81 -0
- package/lib/flags/env.js.map +1 -0
- package/lib/git.d.ts +32 -0
- package/lib/git.js +106 -0
- package/lib/git.js.map +1 -0
- package/lib/happySoup/resolveOriginProject.d.ts +22 -0
- package/lib/happySoup/resolveOriginProject.js +61 -0
- package/lib/happySoup/resolveOriginProject.js.map +1 -0
- package/lib/index.d.ts +51 -0
- package/lib/index.js +63 -2
- package/lib/index.js.map +1 -1
- package/lib/logger.d.ts +10 -0
- package/lib/logger.js +33 -0
- package/lib/logger.js.map +1 -0
- package/lib/notify/buildNotification.d.ts +53 -0
- package/lib/notify/buildNotification.js +176 -0
- package/lib/notify/buildNotification.js.map +1 -0
- package/lib/notify/getCommitStories.d.ts +30 -0
- package/lib/notify/getCommitStories.js +70 -0
- package/lib/notify/getCommitStories.js.map +1 -0
- package/lib/notify/getRemoteCommitStories.d.ts +10 -0
- package/lib/notify/getRemoteCommitStories.js +45 -0
- package/lib/notify/getRemoteCommitStories.js.map +1 -0
- package/lib/notify/happySoupNotification.d.ts +26 -0
- package/lib/notify/happySoupNotification.js +140 -0
- package/lib/notify/happySoupNotification.js.map +1 -0
- package/lib/notify/projectNotification.d.ts +46 -0
- package/lib/notify/projectNotification.js +177 -0
- package/lib/notify/projectNotification.js.map +1 -0
- package/lib/notify/renderTemplate.d.ts +3 -0
- package/lib/notify/renderTemplate.js +24 -0
- package/lib/notify/renderTemplate.js.map +1 -0
- package/lib/notify/sendNotification.d.ts +2 -0
- package/lib/notify/sendNotification.js +50 -0
- package/lib/notify/sendNotification.js.map +1 -0
- package/lib/notify/templates.d.ts +13 -0
- package/lib/notify/templates.js +118 -0
- package/lib/notify/templates.js.map +1 -0
- package/lib/schemas/deployConfig.d.ts +25 -0
- package/lib/schemas/deployConfig.js +55 -0
- package/lib/schemas/deployConfig.js.map +1 -0
- package/lib/schemas/deployProgress.d.ts +33 -0
- package/lib/schemas/deployProgress.js +46 -0
- package/lib/schemas/deployProgress.js.map +1 -0
- package/lib/schemas/deployRules.d.ts +34 -0
- package/lib/schemas/deployRules.js +40 -0
- package/lib/schemas/deployRules.js.map +1 -0
- package/lib/sfApex.d.ts +22 -0
- package/lib/sfApex.js +169 -0
- package/lib/sfApex.js.map +1 -0
- package/lib/sfAuth.d.ts +19 -0
- package/lib/sfAuth.js +78 -0
- package/lib/sfAuth.js.map +1 -0
- package/lib/sfConfig.d.ts +23 -0
- package/lib/sfConfig.js +82 -0
- package/lib/sfConfig.js.map +1 -0
- package/lib/sfPackages.d.ts +31 -0
- package/lib/sfPackages.js +143 -0
- package/lib/sfPackages.js.map +1 -0
- package/lib/sfPlugins.d.ts +11 -0
- package/lib/sfPlugins.js +134 -0
- package/lib/sfPlugins.js.map +1 -0
- package/lib/sfdxDependabot/dependabotRun.d.ts +95 -0
- package/lib/sfdxDependabot/dependabotRun.js +287 -0
- package/lib/sfdxDependabot/dependabotRun.js.map +1 -0
- package/lib/sfdxDependabot/updater.d.ts +14 -0
- package/lib/sfdxDependabot/updater.js +94 -0
- package/lib/sfdxDependabot/updater.js.map +1 -0
- package/package.json +15 -4
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, SimplySF.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { promises as fs } from 'node:fs';
|
|
17
|
+
import { execa } from 'execa';
|
|
18
|
+
import { getDefaultPackageDirectory, getPluginConfig, readSfdxProject } from '@simplysf/simply-core';
|
|
19
|
+
import { createVcsProvider } from '../vcs/index.js';
|
|
20
|
+
import { runSf } from '../exec/sfCli.js';
|
|
21
|
+
import { addGitRemote } from '../git.js';
|
|
22
|
+
import { logger } from '../logger.js';
|
|
23
|
+
import { VersionTagFormat } from './versionTagFormat.js';
|
|
24
|
+
/**
|
|
25
|
+
* Whether this build's ref is a release-branch build.
|
|
26
|
+
*
|
|
27
|
+
* Exported for `publishUtamPageObjects`, which derives its npm version from the same
|
|
28
|
+
* release-vs-feature-branch decision this module makes for the git tag.
|
|
29
|
+
*/
|
|
30
|
+
export function refIncludesPrefix(ciCommitRefName, packageReleaseBranchPrefix) {
|
|
31
|
+
return packageReleaseBranchPrefix !== undefined && ciCommitRefName.includes(packageReleaseBranchPrefix);
|
|
32
|
+
}
|
|
33
|
+
function determineBranchArgs(branchAttribute, ciCommitRefName, packageReleaseBranchPrefix) {
|
|
34
|
+
if (branchAttribute) {
|
|
35
|
+
return ['--branch', branchAttribute];
|
|
36
|
+
}
|
|
37
|
+
if (!refIncludesPrefix(ciCommitRefName, packageReleaseBranchPrefix)) {
|
|
38
|
+
return ['--branch', ciCommitRefName];
|
|
39
|
+
}
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The suffix appended to this build's version tag: the package's `branch` attribute, else the CI ref
|
|
44
|
+
* unless this is a release-branch build, which gets none. A build with neither a `branch` attribute
|
|
45
|
+
* nor a ref is treated like a release build, the only reading that doesn't produce a tag ending in
|
|
46
|
+
* `-undefined`.
|
|
47
|
+
*
|
|
48
|
+
* Exported because `publishUtamPageObjects` derives its npm version from the same suffix, so that
|
|
49
|
+
* the published page-object version reads like the tag rather than being a second, parallel rule.
|
|
50
|
+
*/
|
|
51
|
+
export function determineTagSuffix(branchAttribute, ciCommitRefName, packageReleaseBranchPrefix) {
|
|
52
|
+
if (branchAttribute) {
|
|
53
|
+
return branchAttribute;
|
|
54
|
+
}
|
|
55
|
+
if (!ciCommitRefName || refIncludesPrefix(ciCommitRefName, packageReleaseBranchPrefix)) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return ciCommitRefName;
|
|
59
|
+
}
|
|
60
|
+
function resolveMinimumCoverage(codeCoverageMinimum, sfdxProjectJson) {
|
|
61
|
+
let minCoverage = parseInt(codeCoverageMinimum ?? '75', 10);
|
|
62
|
+
if (Number.isNaN(minCoverage)) {
|
|
63
|
+
minCoverage = 75;
|
|
64
|
+
}
|
|
65
|
+
const projectMinCoverage = getPluginConfig(sfdxProjectJson, 'plugins.simply.coverageRequirement.minimumCoverageRequired');
|
|
66
|
+
if (projectMinCoverage) {
|
|
67
|
+
const parsedProjectMin = parseInt(projectMinCoverage, 10);
|
|
68
|
+
if (!Number.isNaN(parsedProjectMin)) {
|
|
69
|
+
minCoverage = parsedProjectMin;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return minCoverage;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Logs the package Id (`0Ho…`) recorded under `packageAliases` for the project's top-level `name`,
|
|
76
|
+
* warning rather than failing when either is missing — the Id is informational only.
|
|
77
|
+
*/
|
|
78
|
+
function logPackageId(sfdxProjectJson) {
|
|
79
|
+
// `name` isn't a declared SfdxProject property, so it arrives as `unknown` via the index signature.
|
|
80
|
+
const projectName = typeof sfdxProjectJson.name === 'string' ? sfdxProjectJson.name : undefined;
|
|
81
|
+
const packageId = projectName ? sfdxProjectJson.packageAliases?.[projectName] : undefined;
|
|
82
|
+
if (packageId) {
|
|
83
|
+
logger.info(`Package Id: ${packageId}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger.warn(`No package Id found in packageAliases for project name "${projectName ?? ''}" in sfdx-project.json`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function pollPackageVersionCreation(createRequestId, packagingDevhub) {
|
|
90
|
+
for (;;) {
|
|
91
|
+
// eslint-disable-next-line no-await-in-loop -- each poll must wait for the previous one's result before deciding to continue
|
|
92
|
+
const { stdout: reportStdout } = await runSf([
|
|
93
|
+
'package',
|
|
94
|
+
'version',
|
|
95
|
+
'create',
|
|
96
|
+
'report',
|
|
97
|
+
'--package-create-request-id',
|
|
98
|
+
createRequestId,
|
|
99
|
+
'--target-dev-hub',
|
|
100
|
+
packagingDevhub,
|
|
101
|
+
'--json',
|
|
102
|
+
]);
|
|
103
|
+
const report = JSON.parse(reportStdout).result[0];
|
|
104
|
+
logger.info(`Polling package creation status: ${report.Status}`);
|
|
105
|
+
if (report.Status === 'Error') {
|
|
106
|
+
throw new Error(`Package creation failed: ${report.Error ?? 'unknown error'}`);
|
|
107
|
+
}
|
|
108
|
+
if (report.Status === 'Success') {
|
|
109
|
+
const subscriberPackageVersionId = report.SubscriberPackageVersionId ?? '';
|
|
110
|
+
logger.success(`Package version created successfully: ${subscriberPackageVersionId}`);
|
|
111
|
+
return subscriberPackageVersionId;
|
|
112
|
+
}
|
|
113
|
+
// eslint-disable-next-line no-await-in-loop -- polling must space requests out; nothing else to do meanwhile
|
|
114
|
+
await new Promise((resolve) => {
|
|
115
|
+
setTimeout(resolve, 60_000);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Creates a new package version for the default package directory, verifies it meets minimum code
|
|
121
|
+
* coverage, and creates/pushes a version-tracking git tag. No-ops (without error) when the pipeline
|
|
122
|
+
* was triggered by a merge request, or when this isn't a release-branch build and
|
|
123
|
+
* `alwaysCreatePackage` wasn't requested.
|
|
124
|
+
*/
|
|
125
|
+
export async function createPackageVersion(options) {
|
|
126
|
+
if (options.ciPipelineSource === 'merge_request_event') {
|
|
127
|
+
logger.info('Not a release branch build. Skipping package creation.');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!options.alwaysCreatePackage && !refIncludesPrefix(options.ciCommitRefName, options.packageReleaseBranchPrefix)) {
|
|
131
|
+
logger.info('Not a release branch build and alwaysCreatePackage is not TRUE. Skipping package creation.');
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
logger.info('Creating new package version...');
|
|
135
|
+
const vcsProvider = createVcsProvider(options.vcsProvider, {
|
|
136
|
+
host: options.vcsHost,
|
|
137
|
+
token: options.projectAccessToken,
|
|
138
|
+
});
|
|
139
|
+
const remoteAlias = await addGitRemote(options.ciPipelineId, options.projectAccessToken, options.ciProjectPath, vcsProvider);
|
|
140
|
+
const sfdxProjectJson = await readSfdxProject();
|
|
141
|
+
const defaultPackageDir = getDefaultPackageDirectory(sfdxProjectJson);
|
|
142
|
+
const { definitionFile, package: packageAlias, branch: branchAttribute } = defaultPackageDir ?? {};
|
|
143
|
+
if (!definitionFile || !packageAlias) {
|
|
144
|
+
throw new Error('`package` and `definitionFile` must be specified in the default package directory in sfdx-project.json');
|
|
145
|
+
}
|
|
146
|
+
// Validated before `sf package version create`, so a bad format can't cost a package version
|
|
147
|
+
// whose tag then can't be written.
|
|
148
|
+
const versionTagFormat = VersionTagFormat.fromProject(sfdxProjectJson);
|
|
149
|
+
logPackageId(sfdxProjectJson);
|
|
150
|
+
const branchArgs = determineBranchArgs(branchAttribute, options.ciCommitRefName, options.packageReleaseBranchPrefix);
|
|
151
|
+
const { stdout: createStdout } = await runSf([
|
|
152
|
+
'package',
|
|
153
|
+
'version',
|
|
154
|
+
'create',
|
|
155
|
+
'--code-coverage',
|
|
156
|
+
'--package',
|
|
157
|
+
packageAlias,
|
|
158
|
+
'--definition-file',
|
|
159
|
+
definitionFile,
|
|
160
|
+
'--version-description',
|
|
161
|
+
options.ciPipelineUrl,
|
|
162
|
+
'--tag',
|
|
163
|
+
options.ciCommitSha,
|
|
164
|
+
'--target-dev-hub',
|
|
165
|
+
options.packagingDevhub,
|
|
166
|
+
...branchArgs,
|
|
167
|
+
'--installation-key-bypass',
|
|
168
|
+
'--wait',
|
|
169
|
+
'0',
|
|
170
|
+
'--json',
|
|
171
|
+
]);
|
|
172
|
+
const createRequestId = JSON.parse(createStdout).result.Id;
|
|
173
|
+
logger.info(`Package version creation requested. Request ID: ${createRequestId}`);
|
|
174
|
+
const subscriberPackageVersionId = await pollPackageVersionCreation(createRequestId, options.packagingDevhub);
|
|
175
|
+
await fs.writeFile('subscriberPackageVersionId.env', `SUBSCRIBER_PACKAGE_VERSION_ID=${subscriberPackageVersionId}`);
|
|
176
|
+
const { stdout: versionReportStdout } = await runSf([
|
|
177
|
+
'package',
|
|
178
|
+
'version',
|
|
179
|
+
'report',
|
|
180
|
+
'--package',
|
|
181
|
+
subscriberPackageVersionId,
|
|
182
|
+
'--target-dev-hub',
|
|
183
|
+
options.packagingDevhub,
|
|
184
|
+
'--json',
|
|
185
|
+
]);
|
|
186
|
+
const versionReport = JSON.parse(versionReportStdout).result;
|
|
187
|
+
const codeCoverage = versionReport.CodeCoverage.apexCodeCoveragePercentage;
|
|
188
|
+
const minCoverage = resolveMinimumCoverage(options.codeCoverageMinimum, sfdxProjectJson);
|
|
189
|
+
logger.info(`Actual code coverage: ${codeCoverage}%. Required minimum: ${minCoverage}%.`);
|
|
190
|
+
if (codeCoverage < minCoverage) {
|
|
191
|
+
throw new Error(`Code coverage of ${codeCoverage}% is less than the required minimum of ${minCoverage}%.`);
|
|
192
|
+
}
|
|
193
|
+
const versionTag = versionTagFormat.render(versionReport.Version, determineTagSuffix(branchAttribute, options.ciCommitRefName, options.packageReleaseBranchPrefix));
|
|
194
|
+
await execa('git', ['tag', '-a', versionTag, '-m', subscriberPackageVersionId]);
|
|
195
|
+
await execa('git', ['push', remoteAlias, versionTag]);
|
|
196
|
+
logger.success(`Successfully created and pushed git tag: ${versionTag}`);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=createPackageVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPackageVersion.js","sourceRoot":"","sources":["../../src/build/createPackageVersion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ScratchOrgCreateResult = Record<string, unknown>;
|
|
2
|
+
export type CreateScratchOrgOptions = {
|
|
3
|
+
debug?: boolean;
|
|
4
|
+
scratchDefinitionFile?: string;
|
|
5
|
+
scratchDurationDays?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Creates a scratch org, trying each Dev Hub in order until one has remaining daily capacity.
|
|
9
|
+
* Writes `SCRATCH_ORG_INFO.json`, best-effort sets a default country, and assigns permission
|
|
10
|
+
* sets/licenses declared in the default package directory's `packageMetadataAccess`.
|
|
11
|
+
*
|
|
12
|
+
* Every Dev Hub alias passed in must already be authenticated by the calling pipeline.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createScratchOrg(options: CreateScratchOrgOptions, devHubAliases: string[]): Promise<ScratchOrgCreateResult>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, SimplySF.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { promises as fs } from 'node:fs';
|
|
17
|
+
import { getDefaultPackageDirectory, readSfdxProject } from '@simplysf/simply-core';
|
|
18
|
+
import { runSf, runSfJson } from '../exec/sfCli.js';
|
|
19
|
+
import { logger } from '../logger.js';
|
|
20
|
+
import { resolveDevHubs } from './devHubs.js';
|
|
21
|
+
async function assignPermissionSets(permissionSets) {
|
|
22
|
+
if (permissionSets.length === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
logger.info('Assigning permission sets...');
|
|
26
|
+
const args = ['org', 'assign', 'permset', '--json', ...permissionSets.flatMap((ps) => ['--name', ps])];
|
|
27
|
+
try {
|
|
28
|
+
const result = await runSfJson(args);
|
|
29
|
+
if (result.status !== 0) {
|
|
30
|
+
throw new Error(`Permission set assignment failed: ${JSON.stringify(result.failures)}`);
|
|
31
|
+
}
|
|
32
|
+
logger.success('Permission sets assigned successfully.');
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
logger.error('Error assigning permission sets:', e.message);
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function assignPermissionSetLicenses(licenses) {
|
|
40
|
+
if (licenses.length === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
logger.info('Assigning permission set licenses...');
|
|
44
|
+
const args = ['org', 'assign', 'permset-license', '--json', ...licenses.flatMap((psl) => ['--name', psl])];
|
|
45
|
+
try {
|
|
46
|
+
const result = await runSfJson(args);
|
|
47
|
+
if (result.status !== 0) {
|
|
48
|
+
throw new Error(`Permission set license assignment failed: ${JSON.stringify(result.failures)}`);
|
|
49
|
+
}
|
|
50
|
+
logger.success('Permission set licenses assigned successfully.');
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
logger.error('Error assigning permission set licenses:', e.message);
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function assignPermissions(sfdxProjectJson) {
|
|
58
|
+
const defaultPackageDir = getDefaultPackageDirectory(sfdxProjectJson);
|
|
59
|
+
const access = defaultPackageDir?.packageMetadataAccess;
|
|
60
|
+
if (!access) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
await assignPermissionSets(access.permissionSets ?? []);
|
|
64
|
+
await assignPermissionSetLicenses(access.permissionSetLicenses ?? []);
|
|
65
|
+
}
|
|
66
|
+
async function checkHubRemainingScratchOrgs(hubUsername) {
|
|
67
|
+
const limits = await runSfJson([
|
|
68
|
+
'org',
|
|
69
|
+
'list',
|
|
70
|
+
'limits',
|
|
71
|
+
'--target-org',
|
|
72
|
+
hubUsername,
|
|
73
|
+
'--json',
|
|
74
|
+
]);
|
|
75
|
+
return limits.result.find((l) => l.name === 'DailyScratchOrgs')?.remaining;
|
|
76
|
+
}
|
|
77
|
+
async function trySetDefaultCountry() {
|
|
78
|
+
try {
|
|
79
|
+
await runSf(['data', 'query', '--query', 'SELECT CountryCode FROM User', '--json']);
|
|
80
|
+
logger.info('State/Country picklists detected. Setting default country for user...');
|
|
81
|
+
await runSf([
|
|
82
|
+
'data',
|
|
83
|
+
'update',
|
|
84
|
+
'record',
|
|
85
|
+
'--sobject',
|
|
86
|
+
'User',
|
|
87
|
+
'--where',
|
|
88
|
+
"Name='User User'",
|
|
89
|
+
'--values',
|
|
90
|
+
"CountryCode='US'",
|
|
91
|
+
]);
|
|
92
|
+
logger.success('Default country set.');
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
logger.info('State/Country picklists not detected. Skipping default country update.');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function attemptScratchOrgCreation(hub, definitionFile, duration) {
|
|
99
|
+
const remaining = await checkHubRemainingScratchOrgs(hub.username);
|
|
100
|
+
if (remaining === undefined || remaining <= 0) {
|
|
101
|
+
logger.warn(`Dev Hub ${hub.alias} has no remaining scratch orgs. Skipping.`);
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
logger.info(`Attempting to create scratch org with Dev Hub ${hub.alias} (${remaining} remaining).`);
|
|
105
|
+
const { stdout } = await runSf([
|
|
106
|
+
'org',
|
|
107
|
+
'create',
|
|
108
|
+
'scratch',
|
|
109
|
+
'--target-dev-hub',
|
|
110
|
+
hub.username,
|
|
111
|
+
'--duration-days',
|
|
112
|
+
duration,
|
|
113
|
+
'--definition-file',
|
|
114
|
+
definitionFile,
|
|
115
|
+
'--wait',
|
|
116
|
+
'20',
|
|
117
|
+
'--set-default',
|
|
118
|
+
'--json',
|
|
119
|
+
]);
|
|
120
|
+
const createResult = JSON.parse(stdout).result;
|
|
121
|
+
await fs.writeFile('SCRATCH_ORG_INFO.json', JSON.stringify(createResult, null, 2));
|
|
122
|
+
logger.success(`Scratch org created successfully using Dev Hub ${hub.alias}.`);
|
|
123
|
+
return createResult;
|
|
124
|
+
}
|
|
125
|
+
function isScratchOrgLimitError(message) {
|
|
126
|
+
return (message.includes('The signup request failed because this organization has reached its daily scratch org signup limit') || message.includes('LIMIT_EXCEEDED'));
|
|
127
|
+
}
|
|
128
|
+
function extractScratchOrgErrorMessage(error) {
|
|
129
|
+
const err = error;
|
|
130
|
+
let errorMessage = err.message;
|
|
131
|
+
if (err.stdout) {
|
|
132
|
+
try {
|
|
133
|
+
const errorResult = JSON.parse(err.stdout);
|
|
134
|
+
errorMessage = errorResult.message ?? errorMessage;
|
|
135
|
+
logger.error(errorMessage);
|
|
136
|
+
if (errorResult.stack) {
|
|
137
|
+
logger.error(errorResult.stack);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
logger.error(err.stdout);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
logger.error(err.message);
|
|
146
|
+
}
|
|
147
|
+
return errorMessage;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Creates a scratch org, trying each Dev Hub in order until one has remaining daily capacity.
|
|
151
|
+
* Writes `SCRATCH_ORG_INFO.json`, best-effort sets a default country, and assigns permission
|
|
152
|
+
* sets/licenses declared in the default package directory's `packageMetadataAccess`.
|
|
153
|
+
*
|
|
154
|
+
* Every Dev Hub alias passed in must already be authenticated by the calling pipeline.
|
|
155
|
+
*/
|
|
156
|
+
export async function createScratchOrg(options, devHubAliases) {
|
|
157
|
+
const devHubs = await resolveDevHubs(devHubAliases);
|
|
158
|
+
const sfdxProjectJson = await readSfdxProject();
|
|
159
|
+
const defaultPackageDir = getDefaultPackageDirectory(sfdxProjectJson);
|
|
160
|
+
const definitionFile = defaultPackageDir?.definitionFile ?? options.scratchDefinitionFile;
|
|
161
|
+
if (!definitionFile) {
|
|
162
|
+
throw new Error('You must specify a definitionFile in the default package directory in sfdx-project.json');
|
|
163
|
+
}
|
|
164
|
+
const duration = options.scratchDurationDays ?? '1';
|
|
165
|
+
for (const hub of devHubs) {
|
|
166
|
+
try {
|
|
167
|
+
// eslint-disable-next-line no-await-in-loop -- each Dev Hub is only attempted after the previous one is exhausted
|
|
168
|
+
const createResult = await attemptScratchOrgCreation(hub, definitionFile, duration);
|
|
169
|
+
if (!createResult) {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// eslint-disable-next-line no-await-in-loop
|
|
173
|
+
await trySetDefaultCountry();
|
|
174
|
+
// eslint-disable-next-line no-await-in-loop
|
|
175
|
+
await assignPermissions(sfdxProjectJson);
|
|
176
|
+
return createResult;
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
logger.error(`Scratch org creation failed with Dev Hub ${hub.alias}:`);
|
|
180
|
+
const errorMessage = extractScratchOrgErrorMessage(error);
|
|
181
|
+
if (isScratchOrgLimitError(errorMessage)) {
|
|
182
|
+
logger.warn(`Dev Hub ${hub.alias} reached its daily limit. Trying next Dev Hub...`);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
throw new Error(`Scratch org creation failed with a non-recoverable error using Dev Hub ${hub.alias}.`, {
|
|
186
|
+
cause: error,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
throw new Error('Scratch org creation failed for all available Dev Hubs.');
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=createScratchOrg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createScratchOrg.js","sourceRoot":"","sources":["../../src/build/createScratchOrg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DeleteScratchOrgOptions = {
|
|
2
|
+
/** Required only when the Dev Hub and/or scratch org were JWT-authenticated (no refresh token available). */
|
|
3
|
+
jwtKeyFile?: string;
|
|
4
|
+
debug?: boolean;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Authenticates to the Dev Hub that owns the scratch org and deletes it.
|
|
8
|
+
*
|
|
9
|
+
* `devHubAlias` must already be authenticated by the calling pipeline. Deletion failures are
|
|
10
|
+
* logged, not thrown, matching the original behavior: a scratch org that fails to delete just
|
|
11
|
+
* needs manual cleanup later, and shouldn't fail an otherwise-successful pipeline run.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deleteScratchOrg(options: DeleteScratchOrgOptions, devHubAlias: string): Promise<void>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, SimplySF.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { runSf } from '../exec/sfCli.js';
|
|
17
|
+
import { logger } from '../logger.js';
|
|
18
|
+
import { authenticateOrg } from '../sfAuth.js';
|
|
19
|
+
import { resolveDevHubs } from './devHubs.js';
|
|
20
|
+
import { ensureScratchOrgSession } from './scratchOrgAuth.js';
|
|
21
|
+
import { readScratchOrgInfo } from './scratchOrgInfo.js';
|
|
22
|
+
/**
|
|
23
|
+
* Authenticates to the Dev Hub that owns the scratch org and deletes it.
|
|
24
|
+
*
|
|
25
|
+
* `devHubAlias` must already be authenticated by the calling pipeline. Deletion failures are
|
|
26
|
+
* logged, not thrown, matching the original behavior: a scratch org that fails to delete just
|
|
27
|
+
* needs manual cleanup later, and shouldn't fail an otherwise-successful pipeline run.
|
|
28
|
+
*/
|
|
29
|
+
export async function deleteScratchOrg(options, devHubAlias) {
|
|
30
|
+
logger.info('Deleting scratch org...');
|
|
31
|
+
try {
|
|
32
|
+
const scratchOrgInfo = await readScratchOrgInfo();
|
|
33
|
+
const [hub] = await resolveDevHubs([devHubAlias]);
|
|
34
|
+
if (hub.username !== scratchOrgInfo.authFields.devHubUsername) {
|
|
35
|
+
throw new Error(`--dev-hub ${devHubAlias} (${hub.username}) does not match the Dev Hub that created this scratch org (${scratchOrgInfo.authFields.devHubUsername ?? 'unknown'}).`);
|
|
36
|
+
}
|
|
37
|
+
if (hub.privateKeyFile) {
|
|
38
|
+
// JWT-authenticated Dev Hub: no refresh token exists, so re-mint a session explicitly.
|
|
39
|
+
// A refresh-token-authenticated Dev Hub needs no action here — @salesforce/core refreshes
|
|
40
|
+
// its already-persisted session automatically.
|
|
41
|
+
await authenticateOrg({
|
|
42
|
+
username: hub.username,
|
|
43
|
+
clientId: hub.clientId,
|
|
44
|
+
instanceUrl: hub.instanceUrl,
|
|
45
|
+
jwtKeyFile: hub.privateKeyFile,
|
|
46
|
+
setDefaultDevHub: true,
|
|
47
|
+
debug: options.debug,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
await ensureScratchOrgSession(scratchOrgInfo.authFields, {
|
|
51
|
+
jwtKeyFile: options.jwtKeyFile,
|
|
52
|
+
setDefault: true,
|
|
53
|
+
debug: options.debug,
|
|
54
|
+
});
|
|
55
|
+
await runSf(['org', 'delete', 'scratch', '--no-prompt'], { stdio: 'inherit' });
|
|
56
|
+
logger.success('Scratch org deleted.');
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
logger.error('Failed to delete scratch org. It may need to be deleted manually.', e.message);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=deleteScratchOrg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteScratchOrg.js","sourceRoot":"","sources":["../../src/build/deleteScratchOrg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQzD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgC,EAAE,WAAmB;IAC1F,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,aAAa,WAAW,KAAK,GAAG,CAAC,QAAQ,+DAA+D,cAAc,CAAC,UAAU,CAAC,cAAc,IAAI,SAAS,IAAI,CAClK,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvB,uFAAuF;YACvF,0FAA0F;YAC1F,+CAA+C;YAC/C,MAAM,eAAe,CAAC;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,UAAU,EAAE,GAAG,CAAC,cAAc;gBAC9B,gBAAgB,EAAE,IAAI;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,uBAAuB,CAAC,cAAc,CAAC,UAAU,EAAE;YACvD,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,mEAAmE,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;IAC1G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type VcsProviderKind } from '../vcs/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* One of the upstream `@syntax-syllogism/flow-delta` diff tools. Each ships a diff binary plus one
|
|
4
|
+
* reporter binary per platform, named `<binary>-<provider kind>`.
|
|
5
|
+
*/
|
|
6
|
+
export type DeltaTool = {
|
|
7
|
+
/** The diff binary, e.g. `flow-delta`. */
|
|
8
|
+
binary: string;
|
|
9
|
+
/** Glob the diff binary scans. */
|
|
10
|
+
path: string;
|
|
11
|
+
/** Output directory used when the caller doesn't name one. */
|
|
12
|
+
defaultOut: string;
|
|
13
|
+
/** Sentence-case label for log lines, e.g. `Flow`. */
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const FLOW_DELTA: DeltaTool;
|
|
17
|
+
export declare const FLEXIPAGE_DELTA: DeltaTool;
|
|
18
|
+
/**
|
|
19
|
+
* Pipeline context handed to the reporter. Everything is optional: each reporter falls back to its
|
|
20
|
+
* platform's own CI environment variables, which the child process inherits, for anything we don't
|
|
21
|
+
* pass explicitly.
|
|
22
|
+
*/
|
|
23
|
+
export type DeltaReporterContext = {
|
|
24
|
+
/** Which platform's reporter to run. Defaults to `gitlab`. */
|
|
25
|
+
vcsProvider?: VcsProviderKind;
|
|
26
|
+
/** Hostname of the VCS instance, used to derive the reporter's `--api-url`. */
|
|
27
|
+
vcsHost?: string;
|
|
28
|
+
/** Token the reporter authenticates with when posting the diff. */
|
|
29
|
+
projectAccessToken?: string;
|
|
30
|
+
commitSha?: string;
|
|
31
|
+
/** GitLab: numeric project ID. */
|
|
32
|
+
ciProjectId?: string;
|
|
33
|
+
/** GitLab: merge request internal ID. */
|
|
34
|
+
ciMergeRequestIid?: string;
|
|
35
|
+
/** GitHub: `owner/repo`. */
|
|
36
|
+
ciRepository?: string;
|
|
37
|
+
/** GitHub: pull request number. */
|
|
38
|
+
ciPullRequestNumber?: string;
|
|
39
|
+
/** GitHub: Actions run ID, used to build artifact links. */
|
|
40
|
+
ciRunId?: string;
|
|
41
|
+
/** GitHub: server URL, for non-github.com instances. */
|
|
42
|
+
ciServerUrl?: string;
|
|
43
|
+
};
|
|
44
|
+
export type RunDeltaOptions = DeltaReporterContext & {
|
|
45
|
+
from: string;
|
|
46
|
+
to: string;
|
|
47
|
+
out?: string;
|
|
48
|
+
debug?: boolean;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Builds the reporter argv for the selected platform. The two reporters take different context
|
|
52
|
+
* flags — GitLab addresses a merge request by project ID and IID, GitHub a pull request by
|
|
53
|
+
* `owner/repo` and number — which is the whole reason this is routed through the VCS choice.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildReporterArgs(kind: VcsProviderKind, out: string, context: DeltaReporterContext): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Runs a delta tool: the diff binary over the `from..to` range, then the reporter binary for the
|
|
58
|
+
* selected platform to post the result back to the change request. Does not catch its own errors;
|
|
59
|
+
* callers decide how to handle them.
|
|
60
|
+
*/
|
|
61
|
+
export declare function runDelta(tool: DeltaTool, options: RunDeltaOptions): Promise<void>;
|
|
62
|
+
export type GenerateDiffOptions = RunDeltaOptions & {
|
|
63
|
+
disabled?: boolean;
|
|
64
|
+
};
|
|
65
|
+
export type GenerateDiffResult = {
|
|
66
|
+
skipped: boolean;
|
|
67
|
+
success: boolean;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Action-handler wrapper around `runDelta`: checks the job-level skip flag, then runs the delta and
|
|
71
|
+
* logs (rather than throws) on failure, since a diff-posting step shouldn't fail the build.
|
|
72
|
+
*/
|
|
73
|
+
export declare function generateDiff(tool: DeltaTool, options: GenerateDiffOptions): Promise<GenerateDiffResult>;
|