@salesforce/packaging 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/constants.d.ts +3 -0
  2. package/lib/constants.js +4 -1
  3. package/lib/interfaces/packagingInterfacesAndType.d.ts +20 -13
  4. package/lib/interfaces/packagingSObjects.d.ts +1 -1
  5. package/lib/package/index.d.ts +1 -5
  6. package/lib/package/index.js +1 -10
  7. package/lib/package/package.d.ts +79 -32
  8. package/lib/package/package.js +159 -71
  9. package/lib/package/packageAncestry.d.ts +3 -1
  10. package/lib/package/packageAncestry.js +43 -25
  11. package/lib/package/packageConvert.js +2 -3
  12. package/lib/package/packageCreate.d.ts +2 -12
  13. package/lib/package/packageCreate.js +30 -53
  14. package/lib/package/packageDelete.js +4 -1
  15. package/lib/package/packageInstall.d.ts +7 -14
  16. package/lib/package/packageInstall.js +65 -148
  17. package/lib/package/packageInstalledList.js +8 -2
  18. package/lib/package/packageUninstall.d.ts +5 -1
  19. package/lib/package/packageUninstall.js +51 -41
  20. package/lib/package/packageVersion.d.ts +53 -6
  21. package/lib/package/packageVersion.js +139 -29
  22. package/lib/package/packageVersionCreate.d.ts +2 -2
  23. package/lib/package/packageVersionCreate.js +27 -25
  24. package/lib/package/packageVersionCreateRequest.js +15 -6
  25. package/lib/package/packageVersionCreateRequestReport.js +9 -3
  26. package/lib/package/packageVersionList.js +3 -1
  27. package/lib/package/packageVersionReport.js +1 -27
  28. package/lib/package/subscriberPackageVersion.d.ts +156 -0
  29. package/lib/package/subscriberPackageVersion.js +346 -0
  30. package/lib/utils/packageUtils.d.ts +10 -11
  31. package/lib/utils/packageUtils.js +35 -24
  32. package/messages/package.md +18 -2
  33. package/messages/package_version.md +12 -0
  34. package/messages/pkg_utils.md +5 -33
  35. package/messages/subscriber_package_version.md +19 -0
  36. package/package.json +3 -3
  37. package/lib/package/packageList.d.ts +0 -4
  38. package/lib/package/packageList.js +0 -19
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.packageInstalledList = void 0;
4
+ const utils_1 = require("../utils");
4
5
  async function packageInstalledList(conn) {
5
- const query = 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber FROM InstalledSubscriberPackage ORDER BY SubscriberPackageId';
6
- return (await conn.tooling.query(query)).records;
6
+ try {
7
+ const query = 'SELECT Id, SubscriberPackageId, SubscriberPackage.NamespacePrefix, SubscriberPackage.Name, SubscriberPackageVersion.Id, SubscriberPackageVersion.Name, SubscriberPackageVersion.MajorVersion, SubscriberPackageVersion.MinorVersion, SubscriberPackageVersion.PatchVersion, SubscriberPackageVersion.BuildNumber FROM InstalledSubscriberPackage ORDER BY SubscriberPackageId';
8
+ return (await conn.tooling.query(query)).records;
9
+ }
10
+ catch (err) {
11
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
12
+ }
7
13
  }
8
14
  exports.packageInstalledList = packageInstalledList;
9
15
  //# sourceMappingURL=packageInstalledList.js.map
@@ -2,5 +2,9 @@ import { Connection } from '@salesforce/core';
2
2
  import { Duration } from '@salesforce/kit';
3
3
  import { PackagingSObjects } from '../interfaces';
4
4
  declare type UninstallResult = PackagingSObjects.SubscriberPackageVersionUninstallRequest;
5
- export declare function uninstallPackage(id: string, conn: Connection, wait?: Duration): Promise<UninstallResult>;
5
+ export declare function getUninstallErrors(conn: Connection, id: string): Promise<Array<{
6
+ Message: string;
7
+ }>>;
8
+ export declare function pollUninstall(uninstallRequestId: string, conn: Connection, frequency: Duration, wait: Duration): Promise<UninstallResult>;
9
+ export declare function uninstallPackage(id: string, conn: Connection, frequency?: Duration, wait?: Duration): Promise<UninstallResult>;
6
10
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.uninstallPackage = void 0;
3
+ exports.uninstallPackage = exports.pollUninstall = exports.getUninstallErrors = void 0;
4
4
  /*
5
5
  * Copyright (c) 2020, salesforce.com, inc.
6
6
  * All rights reserved.
@@ -11,54 +11,64 @@ const os = require("os");
11
11
  const core_1 = require("@salesforce/core");
12
12
  const kit_1 = require("@salesforce/kit");
13
13
  const interfaces_1 = require("../interfaces");
14
+ const utils_1 = require("../utils");
14
15
  core_1.Messages.importMessagesDirectory(__dirname);
15
16
  const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_uninstall');
16
17
  const pkgMessages = core_1.Messages.loadMessages('@salesforce/packaging', 'package');
17
- async function poll(id, conn) {
18
- const uninstallRequest = await conn.tooling.sobject('SubscriberPackageVersionUninstallRequest').retrieve(id);
19
- switch (uninstallRequest.Status) {
20
- case 'Success': {
21
- return { completed: true, payload: uninstallRequest };
22
- }
23
- case 'InProgress':
24
- case 'Queued': {
25
- await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageEvents.uninstall, {
26
- ...uninstallRequest,
27
- });
28
- return { completed: false, payload: uninstallRequest };
29
- }
30
- default: {
31
- const err = pkgMessages.getMessage('defaultErrorMessage', [id, uninstallRequest.Id]);
32
- const errorQueryResult = await conn.tooling.query(`"SELECT Message FROM PackageVersionUninstallRequestError WHERE ParentRequest.Id = '${id}' ORDER BY Message"`);
33
- const errors = [];
34
- if (errorQueryResult.records.length) {
35
- errors.push('\n=== Errors\n');
36
- errorQueryResult.records.forEach((record) => {
37
- errors.push(`(${errors.length}) ${record.Message}${os.EOL}`);
18
+ async function getUninstallErrors(conn, id) {
19
+ const errorQueryResult = await conn.tooling.query(`"SELECT Message FROM PackageVersionUninstallRequestError WHERE ParentRequest.Id = '${id}' ORDER BY Message"`);
20
+ return errorQueryResult?.records || [];
21
+ }
22
+ exports.getUninstallErrors = getUninstallErrors;
23
+ async function pollUninstall(uninstallRequestId, conn, frequency, wait) {
24
+ const poll = async (id, conn) => {
25
+ const uninstallRequest = (await conn.tooling
26
+ .sobject('SubscriberPackageVersionUninstallRequest')
27
+ .retrieve(id));
28
+ switch (uninstallRequest.Status) {
29
+ case 'Success': {
30
+ return { completed: true, payload: uninstallRequest };
31
+ }
32
+ case 'InProgress':
33
+ case 'Queued': {
34
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageEvents.uninstall, {
35
+ ...uninstallRequest,
38
36
  });
37
+ return { completed: false, payload: uninstallRequest };
38
+ }
39
+ default: {
40
+ const err = pkgMessages.getMessage('defaultErrorMessage', [id, uninstallRequest.Id]);
41
+ const errorMessages = await getUninstallErrors(conn, id);
42
+ const errors = errorMessages.map((error, index) => `(${index + 1}) ${error.Message}${os.EOL}`);
43
+ const combinedErrors = errors.length ? `\n=== Errors\n${errors.join(os.EOL)}` : '';
44
+ throw new core_1.SfError(`${err}${combinedErrors}`, 'UNINSTALL_ERROR', [messages.getMessage('uninstallErrorAction')]);
39
45
  }
40
- throw new core_1.SfError(`${err}${errors.join(os.EOL)}`, 'UNINSTALL_ERROR', [
41
- messages.getMessage('uninstallErrorAction'),
42
- ]);
43
46
  }
44
- }
45
- }
46
- async function uninstallPackage(id, conn, wait = kit_1.Duration.seconds(0)) {
47
- const uninstallRequest = await conn.tooling.sobject('SubscriberPackageVersionUninstallRequest').create({
48
- SubscriberPackageVersionId: id,
47
+ };
48
+ const pollingClient = await core_1.PollingClient.create({
49
+ poll: () => poll(uninstallRequestId, conn),
50
+ frequency,
51
+ timeout: wait,
49
52
  });
50
- if (wait.seconds === 0) {
51
- return (await conn.tooling
52
- .sobject('SubscriberPackageVersionUninstallRequest')
53
- .retrieve(uninstallRequest.id));
54
- }
55
- else {
56
- const pollingClient = await core_1.PollingClient.create({
57
- poll: () => poll(uninstallRequest.id, conn),
58
- frequency: kit_1.Duration.seconds(5),
59
- timeout: wait,
53
+ return pollingClient.subscribe();
54
+ }
55
+ exports.pollUninstall = pollUninstall;
56
+ async function uninstallPackage(id, conn, frequency = kit_1.Duration.seconds(0), wait = kit_1.Duration.seconds(0)) {
57
+ try {
58
+ const uninstallRequest = await conn.tooling.sobject('SubscriberPackageVersionUninstallRequest').create({
59
+ SubscriberPackageVersionId: id,
60
60
  });
61
- return pollingClient.subscribe();
61
+ if (wait.seconds === 0) {
62
+ return (await conn.tooling
63
+ .sobject('SubscriberPackageVersionUninstallRequest')
64
+ .retrieve(uninstallRequest.id));
65
+ }
66
+ else {
67
+ return pollUninstall(uninstallRequest.id, conn, frequency, wait);
68
+ }
69
+ }
70
+ catch (err) {
71
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
62
72
  }
63
73
  }
64
74
  exports.uninstallPackage = uninstallPackage;
@@ -1,6 +1,6 @@
1
1
  import { Connection, SfProject } from '@salesforce/core';
2
2
  import { Duration } from '@salesforce/kit';
3
- import { PackageSaveResult, PackageVersionCreateOptions, PackageVersionCreateRequestQueryOptions, PackageVersionCreateRequestResult, PackageVersionListOptions, PackageVersionListResult, PackageVersionOptions, PackageVersionReportResult, PackageVersionUpdateOptions, PackagingSObjects } from '../interfaces';
3
+ import { PackageSaveResult, PackageType, PackageVersionCreateOptions, PackageVersionCreateRequestQueryOptions, PackageVersionCreateRequestResult, PackageVersionOptions, PackageVersionReportResult, PackageVersionUpdateOptions, PackagingSObjects } from '../interfaces';
4
4
  declare type Package2Version = PackagingSObjects.Package2Version;
5
5
  export declare const Package2VersionFields: string[];
6
6
  export declare class PackageVersion {
@@ -8,6 +8,7 @@ export declare class PackageVersion {
8
8
  private readonly project;
9
9
  private readonly connection;
10
10
  private data;
11
+ private packageType;
11
12
  constructor(options: PackageVersionOptions);
12
13
  /**
13
14
  * Sends a request to create a new package version and optionally polls for
@@ -26,6 +27,7 @@ export declare class PackageVersion {
26
27
  * Gets current state of a package version create request.
27
28
  *
28
29
  * @param createPackageRequestId
30
+ * @param connection
29
31
  */
30
32
  static getCreateStatus(createPackageRequestId: string, connection: Connection): Promise<PackageVersionCreateRequestResult>;
31
33
  /**
@@ -35,7 +37,7 @@ export declare class PackageVersion {
35
37
  * @param options PackageVersionCreateRequestQueryOptions
36
38
  * @returns the list of package version create requests.
37
39
  */
38
- static createdList(connection: Connection, options?: PackageVersionCreateRequestQueryOptions): Promise<PackageVersionCreateRequestResult[]>;
40
+ static getPackageVersionCreateRequests(connection: Connection, options?: PackageVersionCreateRequestQueryOptions): Promise<PackageVersionCreateRequestResult[]>;
39
41
  /**
40
42
  * Convenience function that will wait for a package version to be created.
41
43
  *
@@ -49,7 +51,28 @@ export declare class PackageVersion {
49
51
  frequency: Duration;
50
52
  timeout: Duration;
51
53
  }): Promise<PackageVersionCreateRequestResult>;
52
- static list(connection: Connection, project: SfProject, options: PackageVersionListOptions): Promise<PackageVersionListResult[]>;
54
+ /**
55
+ * Gets current state of a package version create request.
56
+ *
57
+ * @param createPackageRequestId
58
+ * @param connection
59
+ */
60
+ static getCreateVersionReport(createPackageRequestId: string, connection: Connection): Promise<PackageVersionCreateRequestResult>;
61
+ /**
62
+ * Convenience function that will wait for a package version to be created.
63
+ *
64
+ * This function emits LifeCycle events, "enqueued", "in-progress", "success", "error" and "timed-out" to
65
+ * progress and current status. Events also carry a payload of type PackageVersionCreateRequestResult.
66
+ *
67
+ * @param createPackageVersionRequestId
68
+ * @param project
69
+ * @param connection
70
+ * @param polling frequency and timeout Durations to be used in polling
71
+ * */
72
+ static waitForCreateVersion(createPackageVersionRequestId: string, project: SfProject, connection: Connection, polling: {
73
+ frequency: Duration;
74
+ timeout: Duration;
75
+ }): Promise<PackageVersionCreateRequestResult>;
53
76
  /**
54
77
  * Get the package version ID for this PackageVersion.
55
78
  *
@@ -62,13 +85,25 @@ export declare class PackageVersion {
62
85
  * @returns The SubscriberPackageVersionId (04t).
63
86
  */
64
87
  getSubscriberId(): Promise<string>;
88
+ /**
89
+ * Get the package Id for this PackageVersion.
90
+ *
91
+ * @returns The PackageId (0Ho).
92
+ */
93
+ getPackageId(): Promise<string>;
94
+ /**
95
+ * Get the package type for this PackageVersion.
96
+ *
97
+ * @returns The PackageType (Managed, Unlocked).
98
+ */
99
+ getPackageType(): Promise<PackageType>;
65
100
  /**
66
101
  * Get the Package2Version SObject data for this PackageVersion.
67
102
  *
68
103
  * @param force force a refresh of the package version data.
69
104
  * @returns Package2Version
70
105
  */
71
- getPackageVersionData(force?: boolean): Promise<Package2Version>;
106
+ getData(force?: boolean): Promise<Package2Version>;
72
107
  /**
73
108
  * Deletes this PackageVersion.
74
109
  */
@@ -83,11 +118,23 @@ export declare class PackageVersion {
83
118
  * @param verbose Whether to get a detailed version of the report, at the expense of performance.
84
119
  */
85
120
  report(verbose?: boolean): Promise<PackageVersionReportResult>;
86
- install(): Promise<void>;
87
- uninstall(): Promise<void>;
121
+ /**
122
+ * Promotes this PackageVersion to released state.
123
+ */
88
124
  promote(): Promise<PackageSaveResult>;
89
125
  update(options: PackageVersionUpdateOptions): Promise<PackageSaveResult>;
126
+ /**
127
+ * Creates a new package version.
128
+ *
129
+ * @param options
130
+ * @param polling frequency and timeout Durations to be used in polling
131
+ */
132
+ create(options: PackageVersionCreateOptions, polling?: {
133
+ frequency: Duration;
134
+ timeout: Duration;
135
+ }): Promise<Partial<PackageVersionCreateRequestResult>>;
90
136
  private updateDeprecation;
91
137
  private updateProjectWithPackageVersion;
138
+ private resolveId;
92
139
  }
93
140
  export {};
@@ -14,7 +14,6 @@ const utils_1 = require("../utils");
14
14
  const packageVersionCreate_1 = require("./packageVersionCreate");
15
15
  const packageVersionReport_1 = require("./packageVersionReport");
16
16
  const packageVersionCreateRequestReport_1 = require("./packageVersionCreateRequestReport");
17
- const packageVersionList_1 = require("./packageVersionList");
18
17
  const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
19
18
  core_1.Messages.importMessagesDirectory(__dirname);
20
19
  const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version');
@@ -56,7 +55,7 @@ class PackageVersion {
56
55
  this.connection = this.options.connection;
57
56
  this.project = this.options.project;
58
57
  this.data = {};
59
- const id = (0, utils_1.getPackageIdFromAlias)(this.options.idOrAlias, this.project);
58
+ const id = this.resolveId();
60
59
  // validate ID
61
60
  if (id.startsWith('04t')) {
62
61
  (0, utils_1.validateId)(utils_1.BY_LABEL.SUBSCRIBER_PACKAGE_VERSION_ID, id);
@@ -88,13 +87,14 @@ class PackageVersion {
88
87
  return await PackageVersion.pollCreateStatus(createResult.Id, options.connection, options.project, polling).catch((err) => {
89
88
  // TODO
90
89
  // until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
91
- throw (0, utils_1.applyErrorAction)(err);
90
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
92
91
  });
93
92
  }
94
93
  /**
95
94
  * Gets current state of a package version create request.
96
95
  *
97
96
  * @param createPackageRequestId
97
+ * @param connection
98
98
  */
99
99
  static async getCreateStatus(createPackageRequestId, connection) {
100
100
  return await (0, packageVersionCreateRequestReport_1.getCreatePackageVersionCreateRequestReport)({
@@ -103,7 +103,7 @@ class PackageVersion {
103
103
  }).catch((err) => {
104
104
  // TODO
105
105
  // until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
106
- throw (0, utils_1.applyErrorAction)(err);
106
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
107
107
  });
108
108
  }
109
109
  /**
@@ -113,7 +113,7 @@ class PackageVersion {
113
113
  * @param options PackageVersionCreateRequestQueryOptions
114
114
  * @returns the list of package version create requests.
115
115
  */
116
- static async createdList(connection, options) {
116
+ static async getPackageVersionCreateRequests(connection, options) {
117
117
  return (0, packageVersionCreateRequest_1.list)({ ...options, connection });
118
118
  }
119
119
  /**
@@ -183,21 +183,88 @@ class PackageVersion {
183
183
  throw (0, utils_1.applyErrorAction)(err);
184
184
  }
185
185
  }
186
- static async list(connection, project, options) {
187
- // resolve/verify packages
188
- const packages = options.packages.map((pkg) => {
189
- const id = (0, utils_1.getPackageIdFromAlias)(pkg, project);
190
- // validate ID
191
- if (id.startsWith('0Ho')) {
192
- (0, utils_1.validateId)(utils_1.BY_LABEL.PACKAGE_ID, id);
193
- return id;
194
- }
195
- else {
196
- throw messages.createError('errorInvalidPackageVersionId', [id]);
197
- }
186
+ /**
187
+ * Gets current state of a package version create request.
188
+ *
189
+ * @param createPackageRequestId
190
+ * @param connection
191
+ */
192
+ static async getCreateVersionReport(createPackageRequestId, connection) {
193
+ return await (0, packageVersionCreateRequestReport_1.getCreatePackageVersionCreateRequestReport)({
194
+ createPackageVersionRequestId: createPackageRequestId,
195
+ connection,
196
+ }).catch((err) => {
197
+ // TODO
198
+ // until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
199
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
200
+ });
201
+ }
202
+ /**
203
+ * Convenience function that will wait for a package version to be created.
204
+ *
205
+ * This function emits LifeCycle events, "enqueued", "in-progress", "success", "error" and "timed-out" to
206
+ * progress and current status. Events also carry a payload of type PackageVersionCreateRequestResult.
207
+ *
208
+ * @param createPackageVersionRequestId
209
+ * @param project
210
+ * @param connection
211
+ * @param polling frequency and timeout Durations to be used in polling
212
+ * */
213
+ static async waitForCreateVersion(createPackageVersionRequestId, project, connection, polling) {
214
+ if (polling.timeout?.milliseconds <= 0) {
215
+ return PackageVersion.getCreateVersionReport(createPackageVersionRequestId, connection);
216
+ }
217
+ let remainingWaitTime = polling.timeout;
218
+ let report;
219
+ const pollingClient = await core_1.PollingClient.create({
220
+ poll: async () => {
221
+ report = await this.getCreateVersionReport(createPackageVersionRequestId, connection);
222
+ switch (report.Status) {
223
+ case 'Queued':
224
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.enqueued, { ...report, remainingWaitTime });
225
+ remainingWaitTime = kit_1.Duration.seconds(remainingWaitTime.seconds - polling.frequency.seconds);
226
+ return {
227
+ completed: false,
228
+ payload: report,
229
+ };
230
+ case 'InProgress':
231
+ case 'Initializing':
232
+ case 'VerifyingFeaturesAndSettings':
233
+ case 'VerifyingDependencies':
234
+ case 'VerifyingMetadata':
235
+ case 'FinalizingPackageVersion':
236
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.progress, {
237
+ ...report,
238
+ remainingWaitTime,
239
+ });
240
+ remainingWaitTime = kit_1.Duration.seconds(remainingWaitTime.seconds - polling.frequency.seconds);
241
+ return {
242
+ completed: false,
243
+ payload: report,
244
+ };
245
+ case 'Success':
246
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.success, report);
247
+ await new PackageVersion({
248
+ idOrAlias: report.SubscriberPackageVersionId,
249
+ project,
250
+ connection,
251
+ }).updateProjectWithPackageVersion(report);
252
+ return { completed: true, payload: report };
253
+ case 'Error':
254
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create.error, report);
255
+ return { completed: true, payload: report };
256
+ }
257
+ },
258
+ frequency: polling.frequency,
259
+ timeout: polling.timeout,
198
260
  });
199
- options.packages = packages;
200
- return (await (0, packageVersionList_1.listPackageVersions)({ ...options, ...{ connection } })).records;
261
+ try {
262
+ return pollingClient.subscribe();
263
+ }
264
+ catch (err) {
265
+ await core_1.Lifecycle.getInstance().emit(interfaces_1.PackageVersionEvents.create['timed-out'], report);
266
+ throw (0, utils_1.applyErrorAction)(err);
267
+ }
201
268
  }
202
269
  /**
203
270
  * Get the package version ID for this PackageVersion.
@@ -206,7 +273,7 @@ class PackageVersion {
206
273
  */
207
274
  async getId() {
208
275
  if (!this.data.Id) {
209
- await this.getPackageVersionData();
276
+ await this.getData();
210
277
  }
211
278
  return this.data.Id;
212
279
  }
@@ -217,17 +284,39 @@ class PackageVersion {
217
284
  */
218
285
  async getSubscriberId() {
219
286
  if (!this.data.SubscriberPackageVersionId) {
220
- await this.getPackageVersionData();
287
+ await this.getData();
221
288
  }
222
289
  return this.data.SubscriberPackageVersionId;
223
290
  }
291
+ /**
292
+ * Get the package Id for this PackageVersion.
293
+ *
294
+ * @returns The PackageId (0Ho).
295
+ */
296
+ async getPackageId() {
297
+ if (!this.data.Package2Id) {
298
+ await this.getData();
299
+ }
300
+ return this.data.Package2Id;
301
+ }
302
+ /**
303
+ * Get the package type for this PackageVersion.
304
+ *
305
+ * @returns The PackageType (Managed, Unlocked).
306
+ */
307
+ async getPackageType() {
308
+ if (!this.packageType) {
309
+ this.packageType = (await this.connection.singleRecordQuery(`select ContainerOptions from Package2 where Id = '${await this.getPackageId()}' limit 1`, { tooling: true })).ContainerOptions;
310
+ }
311
+ return this.packageType;
312
+ }
224
313
  /**
225
314
  * Get the Package2Version SObject data for this PackageVersion.
226
315
  *
227
316
  * @param force force a refresh of the package version data.
228
317
  * @returns Package2Version
229
318
  */
230
- async getPackageVersionData(force = false) {
319
+ async getData(force = false) {
231
320
  if (!this.data.Name || force) {
232
321
  let queryConfig;
233
322
  if (this.data.Id) {
@@ -284,16 +373,13 @@ class PackageVersion {
284
373
  }).catch((err) => {
285
374
  // TODO
286
375
  // until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
287
- throw (0, utils_1.applyErrorAction)(err);
376
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
288
377
  });
289
378
  return results[0];
290
379
  }
291
- install() {
292
- return Promise.resolve(undefined);
293
- }
294
- uninstall() {
295
- return Promise.resolve(undefined);
296
- }
380
+ /**
381
+ * Promotes this PackageVersion to released state.
382
+ */
297
383
  async promote() {
298
384
  const id = await this.getId();
299
385
  return this.options.connection.tooling.update('Package2Version', { IsReleased: true, Id: id });
@@ -318,6 +404,27 @@ class PackageVersion {
318
404
  result.id = await this.getSubscriberId();
319
405
  return result;
320
406
  }
407
+ /**
408
+ * Creates a new package version.
409
+ *
410
+ * @param options
411
+ * @param polling frequency and timeout Durations to be used in polling
412
+ */
413
+ async create(options, polling = {
414
+ frequency: kit_1.Duration.seconds(0),
415
+ timeout: kit_1.Duration.seconds(0),
416
+ }) {
417
+ const pvc = new packageVersionCreate_1.PackageVersionCreate({ ...options, ...this.options });
418
+ const createResult = await pvc.createPackageVersion();
419
+ if (polling.timeout?.milliseconds > 0) {
420
+ return await PackageVersion.waitForCreateVersion(createResult.Id, this.project, this.connection, polling).catch((err) => {
421
+ // TODO
422
+ // until package2 is GA, wrap perm-based errors w/ 'contact sfdc' action (REMOVE once package2 is GA'd)
423
+ throw (0, utils_1.applyErrorAction)((0, utils_1.massageErrorMessage)(err));
424
+ });
425
+ }
426
+ return createResult;
427
+ }
321
428
  async updateDeprecation(isDeprecated) {
322
429
  const id = await this.getId();
323
430
  // setup the request
@@ -345,6 +452,9 @@ class PackageVersion {
345
452
  await this.project.getSfProjectJson().write();
346
453
  }
347
454
  }
455
+ resolveId() {
456
+ return (0, utils_1.getPackageIdFromAlias)(this.options.idOrAlias, this.project);
457
+ }
348
458
  }
349
459
  exports.PackageVersion = PackageVersion;
350
460
  //# sourceMappingURL=packageVersion.js.map
@@ -5,8 +5,8 @@ export declare class PackageVersionCreate {
5
5
  private readonly project;
6
6
  private readonly connection;
7
7
  private packageObject;
8
- private packageType;
9
8
  private packageId;
9
+ private pkg;
10
10
  private readonly logger;
11
11
  constructor(options: PackageVersionCreateOptions);
12
12
  createPackageVersion(): Promise<Partial<PackageVersionCreateRequestResult>>;
@@ -35,6 +35,7 @@ export declare class PackageVersionCreate {
35
35
  private resolveApexTestPermissions;
36
36
  private resolveUnpackagedMetadata;
37
37
  private packageVersionCreate;
38
+ private getPackageType;
38
39
  private resolveUserLicenses;
39
40
  private validateOptionsForPackageType;
40
41
  /**
@@ -47,7 +48,6 @@ export declare class PackageVersionCreate {
47
48
  private setPackageDescriptorJsonValues;
48
49
  private validateVersionNumber;
49
50
  private validatePatchVersion;
50
- private massageErrorMessage;
51
51
  private getAncestorId;
52
52
  private validateAncestorId;
53
53
  private getAncestorIdHighestRelease;
@@ -21,6 +21,7 @@ const interfaces_1 = require("../interfaces");
21
21
  const utils_2 = require("../utils");
22
22
  const packageProfileApi_1 = require("./packageProfileApi");
23
23
  const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
24
+ const package_1 = require("./package");
24
25
  core_1.Messages.importMessagesDirectory(__dirname);
25
26
  const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_create');
26
27
  const DESCRIPTOR_FILE = 'package2-descriptor.json';
@@ -36,7 +37,7 @@ class PackageVersionCreate {
36
37
  return this.packageVersionCreate();
37
38
  }
38
39
  catch (err) {
39
- throw pkgUtils.applyErrorAction(this.massageErrorMessage(err));
40
+ throw pkgUtils.applyErrorAction(pkgUtils.massageErrorMessage(err));
40
41
  }
41
42
  }
42
43
  // convert source to mdapi format and copy to tmp dir packaging up
@@ -68,7 +69,6 @@ class PackageVersionCreate {
68
69
  fs.rmdirSync(convertResult.packagePath, { recursive: true });
69
70
  }
70
71
  convertResult.packagePath = outputDirectory;
71
- return convertResult;
72
72
  }
73
73
  return convertResult;
74
74
  }
@@ -446,7 +446,7 @@ class PackageVersionCreate {
446
446
  this.packageObject = this.project.findPackage((pkg) => pkg.package === packageName || pkg.name === packageName);
447
447
  }
448
448
  else {
449
- // due to flag validation, we'll either have a package or path flag
449
+ // We'll either have a package ID or alias, or a directory path
450
450
  this.packageObject = this.project.getPackageFromPath(this.options.path);
451
451
  packageName = this.packageObject?.package;
452
452
  if (!packageName)
@@ -463,7 +463,17 @@ class PackageVersionCreate {
463
463
  // At this point, the packageIdFromAlias should have been resolved to an Id. Now, we
464
464
  // need to validate that the Id is correct.
465
465
  pkgUtils.validateId(pkgUtils.BY_LABEL.PACKAGE_ID, this.packageId);
466
- await this.validateOptionsForPackageType();
466
+ try {
467
+ await this.validateOptionsForPackageType();
468
+ }
469
+ catch (error) {
470
+ const err = error;
471
+ if (err.name === 'NOT_FOUND') {
472
+ // this means the 0Ho package was not found in the org. throw a better error.
473
+ throw messages.createError('errorNoIdInHub', [this.packageId]);
474
+ }
475
+ throw err;
476
+ }
467
477
  const request = await this.createPackageVersionCreateRequestFromOptions();
468
478
  const createResult = await this.connection.tooling.create('Package2VersionCreateRequest', request);
469
479
  if (!createResult.success) {
@@ -475,6 +485,17 @@ class PackageVersionCreate {
475
485
  }
476
486
  return (await (0, packageVersionCreateRequest_1.byId)(createResult.id, this.connection))[0];
477
487
  }
488
+ async getPackageType() {
489
+ // this.packageId should be an 0Ho package Id at this point
490
+ if (!this.pkg) {
491
+ this.pkg = new package_1.Package({
492
+ packageAliasOrId: this.packageId,
493
+ project: this.project,
494
+ connection: this.connection,
495
+ });
496
+ }
497
+ return this.pkg.getType();
498
+ }
478
499
  async resolveUserLicenses(includeUserLicenses) {
479
500
  const shouldGenerateProfileInformation = this.logger.shouldLog(core_1.LoggerLevel.INFO) || this.logger.shouldLog(core_1.LoggerLevel.DEBUG);
480
501
  return await packageProfileApi_1.PackageProfileApi.create({
@@ -484,8 +505,7 @@ class PackageVersionCreate {
484
505
  });
485
506
  }
486
507
  async validateOptionsForPackageType() {
487
- this.packageType = await pkgUtils.getPackageType(this.packageId, this.connection);
488
- if (this.packageType === 'Unlocked') {
508
+ if ((await this.getPackageType()) === 'Unlocked') {
489
509
  // Don't allow scripts in unlocked packages
490
510
  if (this.options.postinstallscript || this.options.uninstallscript) {
491
511
  throw messages.createError('errorScriptsNotApplicableToUnlockedPackage');
@@ -583,30 +603,12 @@ class PackageVersionCreate {
583
603
  }
584
604
  }
585
605
  }
586
- massageErrorMessage(err) {
587
- if (err.name === 'INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST') {
588
- err['message'] = messages.getMessage('invalidPackageTypeMessage');
589
- }
590
- if (err.name === 'MALFORMED_ID' &&
591
- (err.message.includes('Version ID') || err.message.includes('Version Definition ID'))) {
592
- err['message'] = messages.getMessage('malformedPackageVersionIdMessage');
593
- }
594
- if (err.name === 'MALFORMED_ID' && err.message.includes('Package2 ID')) {
595
- err['message'] = messages.getMessage('malformedPackageIdMessage');
596
- }
597
- // remove references to Second Generation
598
- if (err.message.includes('Second Generation ')) {
599
- err['message'] = err.message.replace('Second Generation ', '');
600
- }
601
- return err;
602
- }
603
606
  // eslint-disable-next-line complexity
604
607
  async getAncestorId(packageDescriptorJson, project, versionNumberString, skipAncestorCheck) {
605
608
  // If an id property is present, use it. Otherwise, look up the package id from the package property.
606
609
  const packageId = packageDescriptorJson.id ?? (0, utils_2.getPackageIdFromAlias)(packageDescriptorJson.package, project);
607
610
  // No need to proceed if Unlocked
608
- const packageType = await (0, utils_2.getPackageType)(packageId, this.connection);
609
- if (packageType === 'Unlocked') {
611
+ if ((await this.getPackageType()) === 'Unlocked') {
610
612
  return '';
611
613
  }
612
614
  let ancestorId = '';