@simplysf/simply-cicd-core 0.4.0 → 0.9.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.
@@ -13,27 +13,28 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import { Duration } from '@salesforce/kit';
16
17
  import { execa } from 'execa';
17
18
  import { isSubscriberPackageVersionId } from '@simplysf/simply-core';
19
+ import { installPackageVersion } from '@simplysf/simply-package-core';
18
20
  import { logger } from '../logger.js';
21
+ import { getOrgConnection } from '../sfOrg.js';
19
22
  import { runDeployStage } from './runDeployStage.js';
20
23
  import { installDeployPackageDependencies, printDeploymentSummary, runDeployApexTests, runDeploymentSteps, } from './deployCommon.js';
21
24
  async function installPackageById(packageId, alias, upgradeType) {
22
- await execa('sf', [
23
- 'package',
24
- 'install',
25
- '--apex-compile',
26
- 'package',
27
- '--package',
28
- packageId,
29
- '--target-org',
30
- alias ?? '',
31
- '--wait',
32
- '120',
33
- '--upgrade-type',
25
+ // An empty alias means the default target org, as `sf package install --target-org ''` did.
26
+ const targetOrgConnection = await getOrgConnection(alias === '' ? undefined : alias);
27
+ const { status, request } = await installPackageVersion({
28
+ targetOrgConnection,
29
+ aliasOrId: packageId,
30
+ apexCompile: 'package',
34
31
  upgradeType,
35
- '--no-prompt',
36
- ], { stdio: 'inherit' });
32
+ wait: Duration.minutes(120),
33
+ });
34
+ if (status === 'IN_PROGRESS') {
35
+ // `sf package install` reported this and exited 0, so the stage carried on; keep that, but say so.
36
+ logger.warn(`Package ${packageId} is still installing after 120 minutes (request ${request.Id}). Continuing; check the install in the org.`);
37
+ }
37
38
  }
38
39
  async function installProjectPackageFromSubscriberId(subscriberPackageVersionId, alias, upgradeType) {
39
40
  logger.info(`Installing package version from --subscriber-package-version-id: ${subscriberPackageVersionId}`);
@@ -1 +1 @@
1
- {"version":3,"file":"deployProject.js","sourceRoot":"","sources":["../../src/deploy/deployProject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deployProject.js","sourceRoot":"","sources":["../../src/deploy/deployProject.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from './logger.js';
6
6
  export * from './sfApex.js';
7
7
  export * from './sfAuth.js';
8
8
  export * from './sfConfig.js';
9
+ export * from './sfDeploy.js';
9
10
  export * from './sfOrg.js';
10
11
  export * from './sfPackages.js';
11
12
  export * from './sfPlugins.js';
package/lib/index.js CHANGED
@@ -32,6 +32,7 @@ export * from './logger.js';
32
32
  export * from './sfApex.js';
33
33
  export * from './sfAuth.js';
34
34
  export * from './sfConfig.js';
35
+ export * from './sfDeploy.js';
35
36
  export * from './sfOrg.js';
36
37
  export * from './sfPackages.js';
37
38
  export * from './sfPlugins.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,mGAAmG;AACnG,iGAAiG;AACjG,qGAAqG;AACrG,qGAAqG;AACrG,wGAAwG;AACxG,6DAA6D;AAC7D,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,uEAAuE;AAEvE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,SAAS;AACT,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAE5C,UAAU;AACV,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AAErC,QAAQ;AACR,cAAc,iBAAiB,CAAC;AAEhC,SAAS;AACT,cAAc,gBAAgB,CAAC;AAE/B,aAAa;AACb,cAAc,qCAAqC,CAAC;AAEpD,UAAU;AACV,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AAEtC,WAAW;AACX,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,kBAAkB;AAClB,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,mGAAmG;AACnG,iGAAiG;AACjG,qGAAqG;AACrG,qGAAqG;AACrG,wGAAwG;AACxG,6DAA6D;AAC7D,EAAE;AACF,gGAAgG;AAChG,iGAAiG;AACjG,uEAAuE;AAEvE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,gBAAgB;AAChB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,SAAS;AACT,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAE5C,UAAU;AACV,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AAErC,QAAQ;AACR,cAAc,iBAAiB,CAAC;AAEhC,SAAS;AACT,cAAc,gBAAgB,CAAC;AAE/B,aAAa;AACb,cAAc,qCAAqC,CAAC;AAEpD,UAAU;AACV,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AAEtC,WAAW;AACX,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,kBAAkB;AAClB,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC"}
package/lib/sfApex.js CHANGED
@@ -15,10 +15,11 @@
15
15
  */
16
16
  import { promises as fs } from 'node:fs';
17
17
  import path from 'node:path';
18
- import { execa } from 'execa';
18
+ import { Duration } from '@salesforce/kit';
19
+ import { runApexTestsWithResults } from '@simplysf/simply-apex-core';
19
20
  import { readSfdxProject } from '@simplysf/simply-core';
20
- import { runSf } from './exec/sfCli.js';
21
21
  import { logger } from './logger.js';
22
+ import { getOrgConnection } from './sfOrg.js';
22
23
  /**
23
24
  * Checks if there are any Apex test classes defined in the package directories, by reading
24
25
  * `sfdx-project.json` to identify the package directories and searching each recursively
@@ -38,24 +39,40 @@ export async function hasApexTests(options) {
38
39
  for (const dir of packageDirs) {
39
40
  try {
40
41
  // eslint-disable-next-line no-await-in-loop -- stops at the first directory with a match
41
- await execa('grep', ['-q', '-r', '-i', '--include=*.cls', '@isTest\\b', dir]);
42
- return true;
42
+ if (await directoryHasApexTests(dir)) {
43
+ return true;
44
+ }
45
+ if (options?.debugMode) {
46
+ logger.log(`No Apex tests found in ${dir}.`);
47
+ }
43
48
  }
44
49
  catch (error) {
45
50
  if (options?.debugMode) {
46
- const err = error;
47
- logger.log(`No Apex tests found in ${dir} or an error occurred during search.`, err.shortMessage);
51
+ logger.log(`No Apex tests found in ${dir} or an error occurred during search.`, error.message);
52
+ }
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ /** What `grep -q -r -i --include=*.cls '@isTest\b' <dir>` checked, without depending on grep. */
58
+ async function directoryHasApexTests(dir) {
59
+ const entries = await fs.readdir(dir, { recursive: true, withFileTypes: true });
60
+ for (const entry of entries) {
61
+ if (entry.isFile() && entry.name.endsWith('.cls')) {
62
+ // eslint-disable-next-line no-await-in-loop -- stops at the first match
63
+ const source = await fs.readFile(path.join(entry.parentPath, entry.name), 'utf-8');
64
+ if (/@isTest\b/i.test(source)) {
65
+ return true;
48
66
  }
49
67
  }
50
68
  }
51
69
  return false;
52
70
  }
53
- /** Kicks off the `sf apex test run`, swallowing any failure so the run's artifacts (namely the
54
- * test run ID file) can still be inspected afterward to distinguish an execution failure from a
55
- * genuine test failure. */
56
- async function executeTestRun(args) {
71
+ /** Runs the tests, swallowing any failure so the run's artifacts (namely the test run ID file) can
72
+ * still be inspected afterward to distinguish an execution failure from a genuine test failure. */
73
+ async function executeTestRun(alias, options) {
57
74
  try {
58
- await runSf(args, { stdio: 'pipe' });
75
+ await runApexTestsWithResults({ ...options, connection: await getOrgConnection(alias) });
59
76
  return undefined;
60
77
  }
61
78
  catch (e) {
@@ -70,7 +87,7 @@ async function resolveTestRunId(testRunIdFile, execError) {
70
87
  }
71
88
  catch (readIdError) {
72
89
  if (execError) {
73
- logger.error('Apex test run failed.', execError.shortMessage);
90
+ logger.error('Apex test run failed.', execError.message);
74
91
  throw execError;
75
92
  }
76
93
  logger.error(`Failed to read test run ID from ${testRunIdFile}.`, readIdError.message);
@@ -134,28 +151,16 @@ export async function runApexTests(options) {
134
151
  logger.info('Running Apex tests...');
135
152
  const testResultsDir = './test-results/apex';
136
153
  await fs.mkdir(testResultsDir, { recursive: true });
137
- const args = [
138
- 'apex',
139
- 'test',
140
- 'run',
141
- '--code-coverage',
142
- '--result-format',
143
- 'junit',
144
- '--output-dir',
145
- testResultsDir,
146
- '--wait',
147
- wait,
148
- ];
149
- if (alias) {
150
- args.push('--target-org', alias);
151
- }
152
- if (testSuite) {
153
- args.push('--suite-names', testSuite);
154
- }
155
- else {
156
- args.push('--test-level', testLevel);
157
- }
158
- const execError = await executeTestRun(args);
154
+ // What `sf apex test run --code-coverage --result-format junit --output-dir <dir> --wait <wait>
155
+ // [--suite-names <suite> | --test-level <level>]` ran and wrote.
156
+ const execError = await executeTestRun(alias, {
157
+ codeCoverage: true,
158
+ outputDir: testResultsDir,
159
+ wait: Duration.minutes(Number(wait)),
160
+ ...(testSuite
161
+ ? { suiteNames: [testSuite] }
162
+ : { testLevel: testLevel }),
163
+ });
159
164
  const testRunId = await resolveTestRunId(path.join(testResultsDir, 'test-run-id.txt'), execError);
160
165
  let testRunOutcome;
161
166
  if (testRunId) {
package/lib/sfApex.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sfApex.js","sourceRoot":"","sources":["../src/sfApex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sfApex.js","sourceRoot":"","sources":["../src/sfApex.ts"],"names":[],"mappings":"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"}
package/lib/sfAuth.d.ts CHANGED
@@ -12,8 +12,15 @@ export type AuthenticateOrgOptions = {
12
12
  export type AuthenticateOrgResult = {
13
13
  success: boolean;
14
14
  username?: string;
15
+ /** The saved auth fields, as `sf org login … --json` returned them (tokens decrypted). */
15
16
  result?: unknown;
16
17
  message?: string;
17
18
  };
18
- /** Authenticates to a Salesforce organization using either a JWT flow or an SFDX auth URL. */
19
+ /**
20
+ * Authenticates to a Salesforce org using either a JWT flow or an SFDX auth URL, in-process via
21
+ * `@salesforce/core`. The auth, alias and default-org settings are written to the same `~/.sf`
22
+ * state `sf org login jwt` / `sf org login sfdx-url` write, so later `sf` processes see them.
23
+ *
24
+ * @throws If authentication fails; the failure is logged first.
25
+ */
19
26
  export declare function authenticateOrg(options: AuthenticateOrgOptions): Promise<AuthenticateOrgResult>;
package/lib/sfAuth.js CHANGED
@@ -13,61 +13,80 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { mkdtemp, writeFile } from 'node:fs/promises';
17
- import { tmpdir } from 'node:os';
18
- import { join } from 'node:path';
19
- import { runSf } from './exec/sfCli.js';
16
+ import { AuthInfo, AuthRemover, SfdcUrl, SfError, SfProject } from '@salesforce/core';
20
17
  import { logger } from './logger.js';
21
- /** Authenticates to a Salesforce organization using either a JWT flow or an SFDX auth URL. */
18
+ /**
19
+ * Where a JWT login goes: the given instance URL, else the project's `sfdcLoginUrl`, else
20
+ * production — the same resolution `sf org login jwt` applies, including its refusal of a
21
+ * Lightning domain (`*.lightning.force.com`), which can't serve OAuth.
22
+ */
23
+ async function resolveLoginUrl(instanceUrl) {
24
+ let loginUrl = instanceUrl;
25
+ if (!loginUrl) {
26
+ try {
27
+ const projectJson = await (await SfProject.resolve()).resolveProjectConfig();
28
+ loginUrl = typeof projectJson.sfdcLoginUrl === 'string' ? projectJson.sfdcLoginUrl : SfdcUrl.PRODUCTION;
29
+ }
30
+ catch {
31
+ loginUrl = SfdcUrl.PRODUCTION;
32
+ }
33
+ }
34
+ const url = new SfdcUrl(loginUrl);
35
+ if (url.isLightningDomain() || (url.isInternalUrl() && url.origin.includes('.lightning.'))) {
36
+ throw new SfError('Use the "My Domain" URL (.my.salesforce.com) as the instance URL, not the Lightning domain (.lightning.force.com).', 'LightningDomain');
37
+ }
38
+ return loginUrl;
39
+ }
40
+ /** JWT bearer login, as `sf org login jwt`: an existing auth file for the user is replaced. */
41
+ async function loginWithJwt(username, oauth2Options) {
42
+ try {
43
+ return await AuthInfo.create({ username, oauth2Options });
44
+ }
45
+ catch (error) {
46
+ if (error.name !== 'AuthInfoOverwriteError') {
47
+ throw error;
48
+ }
49
+ await (await AuthRemover.create()).removeAuth(username);
50
+ return AuthInfo.create({ username, oauth2Options });
51
+ }
52
+ }
53
+ /**
54
+ * Authenticates to a Salesforce org using either a JWT flow or an SFDX auth URL, in-process via
55
+ * `@salesforce/core`. The auth, alias and default-org settings are written to the same `~/.sf`
56
+ * state `sf org login jwt` / `sf org login sfdx-url` write, so later `sf` processes see them.
57
+ *
58
+ * @throws If authentication fails; the failure is logged first.
59
+ */
22
60
  export async function authenticateOrg(options) {
23
61
  const { alias, authUrl, clientId, instanceUrl, jwtKeyFile, username, setDefault, setDefaultDevHub, debug } = options;
24
62
  const authEntity = alias ?? username ?? 'unknown org';
25
63
  logger.info(`Authenticating to org: ${authEntity}`);
26
64
  try {
27
- let authArgs;
28
- if (authUrl) {
29
- const tempDir = await mkdtemp(join(tmpdir(), 'sfdx-auth-'));
30
- const authUrlFile = join(tempDir, 'auth-url.txt');
31
- await writeFile(authUrlFile, authUrl);
32
- authArgs = ['org', 'login', 'sfdx-url', '--sfdx-url-file', authUrlFile, '--json'];
33
- }
34
- else {
35
- authArgs = [
36
- 'login',
37
- 'org',
38
- 'jwt',
39
- '--username',
40
- username ?? '',
41
- '--jwt-key-file',
42
- jwtKeyFile ?? '',
43
- '--client-id',
44
- clientId ?? '',
45
- '--instance-url',
46
- instanceUrl ?? '',
47
- '--json',
48
- ];
49
- }
50
- if (alias) {
51
- authArgs.push('--alias', alias);
52
- }
53
- if (setDefault) {
54
- authArgs.push('--set-default');
55
- }
56
- if (setDefaultDevHub) {
57
- authArgs.push('--set-default-dev-hub');
58
- }
59
- const { stdout } = await runSf(authArgs);
65
+ const authInfo = authUrl
66
+ ? await AuthInfo.create({ oauth2Options: AuthInfo.parseSfdxAuthUrl(authUrl) })
67
+ : await loginWithJwt(username ?? '', {
68
+ clientId,
69
+ privateKeyFile: jwtKeyFile,
70
+ loginUrl: await resolveLoginUrl(instanceUrl),
71
+ });
72
+ await authInfo.save();
73
+ await authInfo.handleAliasAndDefaultSettings({
74
+ alias,
75
+ setDefault: setDefault ?? false,
76
+ setDefaultDevHub: setDefaultDevHub ?? false,
77
+ });
78
+ const fields = authUrl ? { clientSecret: '', ...authInfo.getFields(true) } : authInfo.getFields(true);
79
+ await AuthInfo.identifyPossibleScratchOrgs(fields, authInfo);
60
80
  if (debug) {
61
- logger.raw(stdout);
62
- }
63
- const authResult = JSON.parse(stdout);
64
- if (authResult.status > 0) {
65
- logger.error(`Authentication failed for ${authEntity}: ${authResult.message ?? 'unknown error'}`);
66
- // In cleanup, we don't want to exit the whole process.
67
- return { success: false, message: authResult.message, username };
81
+ // Only identifying fields: the CLI's --json output this used to print included live tokens.
82
+ logger.debug('Authenticated:', {
83
+ username: fields.username,
84
+ orgId: fields.orgId,
85
+ instanceUrl: fields.instanceUrl,
86
+ });
68
87
  }
69
88
  logger.success(`Successfully authenticated to org: ${authEntity}`);
70
- return { success: true, username, result: authResult.result };
89
+ return { success: true, username: fields.username ?? username, result: fields };
71
90
  }
72
91
  catch (error) {
73
92
  logger.error(`Authentication failed for ${authEntity}`);
package/lib/sfAuth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sfAuth.js","sourceRoot":"","sources":["../src/sfAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sfAuth.js","sourceRoot":"","sources":["../src/sfAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Duration } from '@salesforce/kit';
2
+ import { RequestStatus } from '@salesforce/source-deploy-retrieve';
3
+ export type DeployProjectSourceOptions = {
4
+ /** The org to deploy to. Omit to use the default target org. */
5
+ aliasOrUsername?: string;
6
+ /**
7
+ * Deploy these directories instead of the tracked local changes (`--source-dir`). Source tracking
8
+ * still records what was deployed.
9
+ */
10
+ sourceDirs?: string[];
11
+ /** `--ignore-warnings`: don't fail the deploy on warnings. */
12
+ ignoreWarnings?: boolean;
13
+ /** How long to wait for the deploy to finish. */
14
+ wait: Duration;
15
+ };
16
+ export type DeployProjectSourceResult = {
17
+ /** `undefined` when there were no local changes to deploy. */
18
+ deployId?: string;
19
+ status: RequestStatus | 'NothingToDeploy';
20
+ componentCount: number;
21
+ };
22
+ /**
23
+ * Deploys project source to an org with source tracking, as
24
+ * `sf project deploy start --ignore-conflicts [--source-dir …] [--ignore-warnings] --wait <wait>` does:
25
+ * without `sourceDirs`, it deploys the tracked local changes (deletes included), and nothing to
26
+ * deploy is not an error; with `sourceDirs`, it deploys those, and an empty set is.
27
+ *
28
+ * Remote conflicts are ignored and tracking is updated after the deploy, as `--ignore-conflicts`
29
+ * does. Anything short of a full success (partial success, failure, cancellation, or still running
30
+ * at `wait`) throws, as the CLI exits non-zero for each of them.
31
+ *
32
+ * @throws {SfError} `NothingToDeploy` for empty `sourceDirs`; `DeployFailed` for any non-success.
33
+ */
34
+ export declare function deployProjectSource(options: DeployProjectSourceOptions): Promise<DeployProjectSourceResult>;
@@ -0,0 +1,77 @@
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 { Org, SfError, SfProject } from '@salesforce/core';
17
+ import { ComponentSet, ComponentSetBuilder, ComponentStatus, RequestStatus } from '@salesforce/source-deploy-retrieve';
18
+ import { SourceTracking } from '@salesforce/source-tracking';
19
+ import { logger } from './logger.js';
20
+ /**
21
+ * Deploys project source to an org with source tracking, as
22
+ * `sf project deploy start --ignore-conflicts [--source-dir …] [--ignore-warnings] --wait <wait>` does:
23
+ * without `sourceDirs`, it deploys the tracked local changes (deletes included), and nothing to
24
+ * deploy is not an error; with `sourceDirs`, it deploys those, and an empty set is.
25
+ *
26
+ * Remote conflicts are ignored and tracking is updated after the deploy, as `--ignore-conflicts`
27
+ * does. Anything short of a full success (partial success, failure, cancellation, or still running
28
+ * at `wait`) throws, as the CLI exits non-zero for each of them.
29
+ *
30
+ * @throws {SfError} `NothingToDeploy` for empty `sourceDirs`; `DeployFailed` for any non-success.
31
+ */
32
+ export async function deployProjectSource(options) {
33
+ const { aliasOrUsername, sourceDirs, ignoreWarnings = false, wait } = options;
34
+ const org = await Org.create({ aliasOrUsername });
35
+ const project = await SfProject.resolve();
36
+ const tracking = await SourceTracking.create({ org, project, subscribeSDREvents: true, ignoreConflicts: true });
37
+ const componentSet = sourceDirs?.length
38
+ ? await ComponentSetBuilder.build({
39
+ sourcepath: sourceDirs,
40
+ sourceapiversion: project.getSfProjectJson().getContents().sourceApiVersion,
41
+ projectDir: tracking.projectPath,
42
+ })
43
+ : ((await tracking.localChangesAsComponentSet(false))[0] ?? new ComponentSet(undefined, tracking.registry));
44
+ if (componentSet.size === 0) {
45
+ if (sourceDirs?.length) {
46
+ throw new SfError(`No local changes to deploy in ${sourceDirs.join(', ')}.`, 'NothingToDeploy');
47
+ }
48
+ logger.info('No local changes to deploy.');
49
+ return { status: 'NothingToDeploy', componentCount: 0 };
50
+ }
51
+ logger.info(`Deploying ${componentSet.size} components...`);
52
+ const deploy = await componentSet.deploy({
53
+ usernameOrConnection: org.getConnection(),
54
+ apiOptions: { checkOnly: false, ignoreWarnings, rest: false, rollbackOnError: true, purgeOnDelete: false },
55
+ });
56
+ let lastProgress = '';
57
+ deploy.onUpdate((response) => {
58
+ const progress = `Deploy ${response.id}: ${response.status} (${response.numberComponentsDeployed}/${response.numberComponentsTotal} components, ${response.numberTestsCompleted}/${response.numberTestsTotal} tests)`;
59
+ if (progress !== lastProgress) {
60
+ lastProgress = progress;
61
+ logger.info(progress);
62
+ }
63
+ });
64
+ const result = await deploy.pollStatus({ timeout: wait });
65
+ const { status } = result.response;
66
+ if (status !== RequestStatus.Succeeded) {
67
+ const failures = result.getFileResponses().filter((file) => file.state === ComponentStatus.Failed);
68
+ for (const failure of failures) {
69
+ const reason = 'error' in failure ? failure.error : '';
70
+ logger.error(`${failure.type} ${failure.fullName}: ${reason}`);
71
+ }
72
+ const errorMessage = result.response.errorMessage ? ` ${result.response.errorMessage}` : '';
73
+ throw new SfError(`Deploy ${deploy.id ?? ''} finished with status ${status} (${failures.length} component failures).${errorMessage}`, 'DeployFailed');
74
+ }
75
+ return { deployId: deploy.id, status, componentCount: componentSet.size };
76
+ }
77
+ //# sourceMappingURL=sfDeploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sfDeploy.js","sourceRoot":"","sources":["../src/sfDeploy.ts"],"names":[],"mappings":"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"}
package/lib/sfOrg.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type Connection } from '@salesforce/core';
1
2
  /**
2
3
  * The org's instance URL, e.g. `https://my-domain.my.salesforce.com`.
3
4
  *
@@ -11,3 +12,75 @@ export declare function getOrgInstanceUrl(aliasOrUsername?: string): Promise<str
11
12
  * @param hubAliasOrUsername - The Dev Hub. Must already be authenticated.
12
13
  */
13
14
  export declare function getRemainingDailyScratchOrgs(hubAliasOrUsername: string): Promise<number | undefined>;
15
+ /**
16
+ * A connection to an authenticated org.
17
+ *
18
+ * @param aliasOrUsername - The org. Omit to use the default target org, as `sf` commands without
19
+ * `--target-org` do.
20
+ */
21
+ export declare function getOrgConnection(aliasOrUsername?: string): Promise<Connection>;
22
+ /** One failed assignment, shaped like the `failures` entries of `sf org assign … --json`. */
23
+ export type AssignmentFailure = {
24
+ name: string;
25
+ message: string;
26
+ };
27
+ /** Thrown when any assignment failed; `failures` lists each one. */
28
+ export declare class AssignmentError extends Error {
29
+ readonly failures: AssignmentFailure[];
30
+ constructor(message: string, failures: AssignmentFailure[]);
31
+ }
32
+ /**
33
+ * Assigns permission sets to an org's own user, one at a time: what `sf org assign permset --name …`
34
+ * does. An already-assigned permission set is a failure, as it is for the CLI.
35
+ *
36
+ * @param permissionSetNames - Permission set API names.
37
+ * @param aliasOrUsername - The org. Omit to use the default target org.
38
+ * @throws {AssignmentError} If any assignment failed; the others are still attempted.
39
+ */
40
+ export declare function assignPermissionSets(permissionSetNames: string[], aliasOrUsername?: string): Promise<void>;
41
+ /**
42
+ * Assigns permission set licenses to an org's own user: what `sf org assign permset-license --name …`
43
+ * does. A license is matched by `DeveloperName` or `MasterLabel`; one that is already assigned is
44
+ * a success (with a warning), as it is for the CLI.
45
+ *
46
+ * @param licenseNames - Permission set license developer names or labels.
47
+ * @param aliasOrUsername - The org. Omit to use the default target org.
48
+ * @throws {AssignmentError} If any assignment failed; the others are still attempted.
49
+ */
50
+ export declare function assignPermissionSetLicenses(licenseNames: string[], aliasOrUsername?: string): Promise<void>;
51
+ /** What `sf org create scratch --json` returns: the fields `SCRATCH_ORG_INFO.json` is written from. */
52
+ export type CreatedScratchOrg = {
53
+ username?: string;
54
+ scratchOrgInfo?: Record<string, unknown>;
55
+ authFields?: Record<string, unknown>;
56
+ warnings: string[];
57
+ orgId?: string;
58
+ };
59
+ export type CreateScratchOrgOnHubOptions = {
60
+ /** Path to the scratch org definition file. */
61
+ definitionFile: string;
62
+ durationDays: number;
63
+ /** Minutes to wait for the org to be ready. */
64
+ waitMinutes: number;
65
+ /** Make the new org the default target org (`--set-default`). */
66
+ setDefault?: boolean;
67
+ };
68
+ /**
69
+ * Creates a scratch org from a Dev Hub, as `sf org create scratch --definition-file … --json` does,
70
+ * and returns the same result shape. The org is authenticated and source tracking is enabled, as
71
+ * the CLI's defaults.
72
+ *
73
+ * @param hubAliasOrUsername - The Dev Hub. Must already be authenticated.
74
+ * @throws {SfError} If signup fails or doesn't finish within the wait.
75
+ */
76
+ export declare function createScratchOrgOnHub(hubAliasOrUsername: string, options: CreateScratchOrgOnHubOptions): Promise<CreatedScratchOrg>;
77
+ /**
78
+ * Deletes a scratch org, as `sf org delete scratch --no-prompt` does: refuses a non-scratch org,
79
+ * treats an already-deleted org as success, and removes the local auth for one whose domain no
80
+ * longer resolves.
81
+ *
82
+ * @param aliasOrUsername - The scratch org. Omit to use the default target org.
83
+ * @returns The deleted org's username.
84
+ * @throws {SfError} If the org isn't a scratch org, or the Dev Hub rejects the delete.
85
+ */
86
+ export declare function deleteTargetScratchOrg(aliasOrUsername?: string): Promise<string>;