@salesforce/packaging 1.1.12 → 1.2.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/lib/interfaces/packagingInterfacesAndType.d.ts +3 -0
- package/lib/package/packageConvert.d.ts +1 -0
- package/lib/package/packageConvert.js +18 -2
- package/lib/package/packageVersionCreate.d.ts +16 -12
- package/lib/package/packageVersionCreate.js +86 -74
- package/messages/package_version_create.md +4 -0
- package/package.json +5 -5
|
@@ -119,6 +119,7 @@ export type PackageDescriptorJson = Partial<NamedPackageDir> & Partial<{
|
|
|
119
119
|
orgPreferences: string[];
|
|
120
120
|
snapshot: string;
|
|
121
121
|
unpackagedMetadata: NamedPackageDir;
|
|
122
|
+
seedMetadata: NamedPackageDir;
|
|
122
123
|
apexTestAccess: {
|
|
123
124
|
permissionSets: string[] | string;
|
|
124
125
|
permissionSetLicenses: string[] | string;
|
|
@@ -201,6 +202,7 @@ export type MDFolderForArtifactOptions = {
|
|
|
201
202
|
sourcePaths?: string[];
|
|
202
203
|
metadataPaths?: string[];
|
|
203
204
|
deploydir?: string;
|
|
205
|
+
sourceApiVersion?: string;
|
|
204
206
|
};
|
|
205
207
|
export type PackageVersionOptions = {
|
|
206
208
|
connection: Connection;
|
|
@@ -225,6 +227,7 @@ export type ConvertPackageOptions = {
|
|
|
225
227
|
wait: Duration;
|
|
226
228
|
buildInstance: string;
|
|
227
229
|
frequency?: Duration;
|
|
230
|
+
seedMetadata?: string;
|
|
228
231
|
};
|
|
229
232
|
export type PackageVersionCreateOptions = {
|
|
230
233
|
connection: Connection;
|
|
@@ -14,4 +14,5 @@ export declare function createPackageVersionCreateRequest(context: {
|
|
|
14
14
|
installationkey?: string;
|
|
15
15
|
definitionfile?: string;
|
|
16
16
|
buildinstance?: string;
|
|
17
|
+
seedmetadata?: string;
|
|
17
18
|
}, packageId: string, apiVersion: string): Promise<PackagingSObjects.Package2VersionCreateRequest>;
|
|
@@ -18,9 +18,17 @@ const interfaces_1 = require("../interfaces");
|
|
|
18
18
|
const packageUtils_1 = require("../utils/packageUtils");
|
|
19
19
|
const packageVersionCreateRequest_1 = require("./packageVersionCreateRequest");
|
|
20
20
|
const pvcr = require("./packageVersionCreateRequest");
|
|
21
|
+
const packageVersionCreate_1 = require("./packageVersionCreate");
|
|
21
22
|
var Package2VersionStatus = interfaces_1.PackagingSObjects.Package2VersionStatus;
|
|
22
23
|
core_1.Messages.importMessagesDirectory(__dirname);
|
|
23
24
|
const messages = core_1.Messages.loadMessages('@salesforce/packaging', 'package_version_create');
|
|
25
|
+
let logger;
|
|
26
|
+
const getLogger = () => {
|
|
27
|
+
if (!logger) {
|
|
28
|
+
logger = core_1.Logger.childFromRoot('packageConvert');
|
|
29
|
+
}
|
|
30
|
+
return logger;
|
|
31
|
+
};
|
|
24
32
|
async function findOrCreatePackage2(seedPackage, connection) {
|
|
25
33
|
const query = `SELECT Id FROM Package2 WHERE ConvertedFromPackageId = '${seedPackage}'`;
|
|
26
34
|
const queryResult = (await connection.tooling.query(query)).records;
|
|
@@ -69,6 +77,7 @@ async function convertPackage(pkg, connection, options, project) {
|
|
|
69
77
|
installationkey: options.installationKey,
|
|
70
78
|
definitionfile: options.definitionfile,
|
|
71
79
|
buildinstance: options.buildInstance,
|
|
80
|
+
seedmetadata: options.seedMetadata,
|
|
72
81
|
}, packageId, apiVersion);
|
|
73
82
|
// TODO: a lot of this is duplicated from PC, PVC, and PVCR.
|
|
74
83
|
const createResult = await connection.tooling.create('Package2VersionCreateRequest', request);
|
|
@@ -101,7 +110,9 @@ async function createPackageVersionCreateRequest(context, packageId, apiVersion)
|
|
|
101
110
|
const uniqueId = (0, packageUtils_1.uniqid)({ template: `${packageId}-%s` });
|
|
102
111
|
const packageVersTmpRoot = path.join(os.tmpdir(), uniqueId);
|
|
103
112
|
const packageVersMetadataFolder = path.join(packageVersTmpRoot, 'md-files');
|
|
113
|
+
const seedMetadataFolder = path.join(packageVersTmpRoot, 'seed-md-files');
|
|
104
114
|
const packageVersBlobDirectory = path.join(packageVersTmpRoot, 'package-version-info');
|
|
115
|
+
const seedMetadataZipFile = path.join(packageVersBlobDirectory, 'seed-metadata-package.zip');
|
|
105
116
|
const settingsZipFile = path.join(packageVersBlobDirectory, 'settings.zip');
|
|
106
117
|
const metadataZipFile = path.join(packageVersBlobDirectory, 'package.zip');
|
|
107
118
|
const packageVersBlobZipFile = path.join(packageVersTmpRoot, 'package-version-info.zip');
|
|
@@ -135,6 +146,12 @@ async function createPackageVersionCreateRequest(context, packageId, apiVersion)
|
|
|
135
146
|
await fs.promises.mkdir(packageVersTmpRoot, { recursive: true });
|
|
136
147
|
await fs.promises.mkdir(packageVersBlobDirectory, { recursive: true });
|
|
137
148
|
await fs.promises.mkdir(packageVersMetadataFolder, { recursive: true });
|
|
149
|
+
const hasSeedMetadata = await new packageVersionCreate_1.MetadataResolver().resolveMetadata(context.seedmetadata, seedMetadataFolder, 'seedMDDirectoryDoesNotExist', apiVersion);
|
|
150
|
+
if (hasSeedMetadata) {
|
|
151
|
+
// Zip the seedMetadataFolder folder and put the zip in {packageVersBlobDirectory}/{seedMetadataZipFile}
|
|
152
|
+
getLogger().debug(`Including metadata found in '${context.seedmetadata}'.`);
|
|
153
|
+
await pkgUtils.zipDir(seedMetadataFolder, seedMetadataZipFile);
|
|
154
|
+
}
|
|
138
155
|
await settingsGenerator.createDeploy();
|
|
139
156
|
await settingsGenerator.createDeployPackageContents(apiVersion);
|
|
140
157
|
await pkgUtils.zipDir(`${settingsGenerator.getDestinationPath()}${path.sep}${settingsGenerator.getShapeDirName()}`, settingsZipFile);
|
|
@@ -217,8 +234,7 @@ async function pollForStatusWithInterval(id, retries, packageId, branch, project
|
|
|
217
234
|
message: '',
|
|
218
235
|
timeRemaining: remainingTime,
|
|
219
236
|
});
|
|
220
|
-
|
|
221
|
-
logger.info(`Request in progress. Sleeping ${interval.seconds} seconds. Will wait a total of ${remainingTime.seconds} more seconds before timing out. Current Status='${(0, kit_1.camelCaseToTitleCase)(results[0]?.Status)}'`);
|
|
237
|
+
getLogger().info(`Request in progress. Sleeping ${interval.seconds} seconds. Will wait a total of ${remainingTime.seconds} more seconds before timing out. Current Status='${(0, kit_1.camelCaseToTitleCase)(results[0]?.Status)}'`);
|
|
222
238
|
remainingRetries--;
|
|
223
239
|
return { completed: false, payload: results[0] };
|
|
224
240
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConvertResult } from '@salesforce/source-deploy-retrieve';
|
|
2
|
+
import { MDFolderForArtifactOptions, PackageVersionCreateOptions, PackageVersionCreateRequestResult } from '../interfaces';
|
|
2
3
|
export declare class PackageVersionCreate {
|
|
3
4
|
private options;
|
|
4
5
|
private apiVersionFromPackageXml;
|
|
@@ -8,18 +9,9 @@ export declare class PackageVersionCreate {
|
|
|
8
9
|
private packageId;
|
|
9
10
|
private pkg;
|
|
10
11
|
private readonly logger;
|
|
12
|
+
private metadataResolver;
|
|
11
13
|
constructor(options: PackageVersionCreateOptions);
|
|
12
14
|
createPackageVersion(): Promise<Partial<PackageVersionCreateRequestResult>>;
|
|
13
|
-
/**
|
|
14
|
-
* Extracted into a method for UT purposes
|
|
15
|
-
*
|
|
16
|
-
* @param componentSet CS to convert
|
|
17
|
-
* @param outputDirectory where to place the converted MD
|
|
18
|
-
* @param packageName the packagename related to the CS
|
|
19
|
-
* @private
|
|
20
|
-
*/
|
|
21
|
-
private convertMetadata;
|
|
22
|
-
private generateMDFolderForArtifact;
|
|
23
15
|
private validateDependencyValues;
|
|
24
16
|
/**
|
|
25
17
|
* A dependency in the workspace config file may be specified using either a subscriber package version id (04t)
|
|
@@ -42,7 +34,6 @@ export declare class PackageVersionCreate {
|
|
|
42
34
|
private verifyHasSource;
|
|
43
35
|
private cleanGeneratedPackage;
|
|
44
36
|
private resolveApexTestPermissions;
|
|
45
|
-
private resolveUnpackagedMetadata;
|
|
46
37
|
private packageVersionCreate;
|
|
47
38
|
private getPackageDirFromId;
|
|
48
39
|
private getPackageType;
|
|
@@ -62,3 +53,16 @@ export declare class PackageVersionCreate {
|
|
|
62
53
|
private validateAncestorId;
|
|
63
54
|
private getAncestorIdHighestRelease;
|
|
64
55
|
}
|
|
56
|
+
export declare class MetadataResolver {
|
|
57
|
+
resolveMetadata(metadataRelativePath: string, metadataOutputPath: string, errorMessageLabel: string, sourceApiVersion?: string): Promise<boolean>;
|
|
58
|
+
generateMDFolderForArtifact(options: MDFolderForArtifactOptions): Promise<ConvertResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Extracted into a method for UT purposes
|
|
61
|
+
*
|
|
62
|
+
* @param componentSet CS to convert
|
|
63
|
+
* @param outputDirectory where to place the converted MD
|
|
64
|
+
* @param packageName the packagename related to the CS
|
|
65
|
+
* @private
|
|
66
|
+
*/
|
|
67
|
+
private convertMetadata;
|
|
68
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.PackageVersionCreate = void 0;
|
|
9
|
+
exports.MetadataResolver = exports.PackageVersionCreate = void 0;
|
|
10
10
|
const path = require("path");
|
|
11
11
|
const os = require("os");
|
|
12
12
|
const fs = require("fs");
|
|
@@ -31,6 +31,7 @@ class PackageVersionCreate {
|
|
|
31
31
|
this.connection = this.options.connection;
|
|
32
32
|
this.project = this.options.project;
|
|
33
33
|
this.logger = core_1.Logger.childFromRoot('packageVersionCreate');
|
|
34
|
+
this.metadataResolver = new MetadataResolver();
|
|
34
35
|
}
|
|
35
36
|
createPackageVersion() {
|
|
36
37
|
try {
|
|
@@ -40,50 +41,6 @@ class PackageVersionCreate {
|
|
|
40
41
|
throw pkgUtils.applyErrorAction(pkgUtils.massageErrorMessage(err));
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Extracted into a method for UT purposes
|
|
45
|
-
*
|
|
46
|
-
* @param componentSet CS to convert
|
|
47
|
-
* @param outputDirectory where to place the converted MD
|
|
48
|
-
* @param packageName the packagename related to the CS
|
|
49
|
-
* @private
|
|
50
|
-
*/
|
|
51
|
-
// eslint-disable-next-line class-methods-use-this
|
|
52
|
-
async convertMetadata(componentSet, outputDirectory, packageName) {
|
|
53
|
-
const converter = new source_deploy_retrieve_1.MetadataConverter();
|
|
54
|
-
return converter.convert(componentSet, 'metadata', {
|
|
55
|
-
type: 'directory',
|
|
56
|
-
outputDirectory,
|
|
57
|
-
packageName,
|
|
58
|
-
genUniqueDir: false,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
// convert source to mdapi format and copy to tmp dir packaging up
|
|
62
|
-
async generateMDFolderForArtifact(options) {
|
|
63
|
-
const sourcepath = options.sourcePaths ?? [options.sourceDir];
|
|
64
|
-
const componentSet = await source_deploy_retrieve_1.ComponentSetBuilder.build({
|
|
65
|
-
sourceapiversion: this.project.getSfProjectJson().get('sourceApiVersion'),
|
|
66
|
-
sourcepath,
|
|
67
|
-
});
|
|
68
|
-
const packageName = options.packageName;
|
|
69
|
-
const outputDirectory = path.resolve(options.deploydir);
|
|
70
|
-
const convertResult = await this.convertMetadata(componentSet, outputDirectory, packageName);
|
|
71
|
-
if (packageName) {
|
|
72
|
-
// SDR will build an output path like /output/directory/packageName/package.xml
|
|
73
|
-
// this was breaking from toolbelt, so to revert it we copy the directory up a level and delete the original
|
|
74
|
-
(0, packageUtils_1.copyDir)(convertResult.packagePath, outputDirectory);
|
|
75
|
-
try {
|
|
76
|
-
fs.rmSync(convertResult.packagePath, { recursive: true });
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
// rmdirSync is being deprecated and emits a warning
|
|
80
|
-
// but rmSync is introduced in node 14 so fall back to rmdirSync
|
|
81
|
-
fs.rmdirSync(convertResult.packagePath, { recursive: true });
|
|
82
|
-
}
|
|
83
|
-
convertResult.packagePath = outputDirectory;
|
|
84
|
-
}
|
|
85
|
-
return convertResult;
|
|
86
|
-
}
|
|
87
44
|
async validateDependencyValues(dependency) {
|
|
88
45
|
// If valid 04t package, just return it to be used straight away.
|
|
89
46
|
if (dependency.subscriberPackageVersionId) {
|
|
@@ -256,16 +213,19 @@ class PackageVersionCreate {
|
|
|
256
213
|
const packageVersTmpRoot = path.join(os.tmpdir(), `${uniqueHash}`);
|
|
257
214
|
const packageVersMetadataFolder = path.join(packageVersTmpRoot, 'md-files');
|
|
258
215
|
const unpackagedMetadataFolder = path.join(packageVersTmpRoot, 'unpackaged-md-files');
|
|
216
|
+
const seedMetadataFolder = path.join(packageVersTmpRoot, 'seed-md-files');
|
|
259
217
|
const packageVersProfileFolder = path.join(packageVersMetadataFolder, 'profiles');
|
|
260
218
|
const packageVersBlobDirectory = path.join(packageVersTmpRoot, 'package-version-info');
|
|
261
219
|
const metadataZipFile = path.join(packageVersBlobDirectory, 'package.zip');
|
|
262
220
|
const unpackagedMetadataZipFile = path.join(packageVersBlobDirectory, 'unpackaged-metadata-package.zip');
|
|
221
|
+
const seedMetadataZipFile = path.join(packageVersBlobDirectory, 'seed-metadata-package.zip');
|
|
263
222
|
const settingsZipFile = path.join(packageVersBlobDirectory, 'settings.zip');
|
|
264
223
|
const packageVersBlobZipFile = path.join(packageVersTmpRoot, 'package-version-info.zip');
|
|
265
224
|
const sourceBaseDir = path.join(this.project.getPath(), this.packageObject.path ?? '');
|
|
266
225
|
const mdOptions = {
|
|
267
226
|
deploydir: packageVersMetadataFolder,
|
|
268
227
|
sourceDir: sourceBaseDir,
|
|
228
|
+
sourceApiVersion: this.project?.getSfProjectJson()?.get('sourceApiVersion'),
|
|
269
229
|
};
|
|
270
230
|
// Stores any additional client side info that might be needed later on in the process
|
|
271
231
|
const clientSideInfo = new Map();
|
|
@@ -273,7 +233,7 @@ class PackageVersionCreate {
|
|
|
273
233
|
const settingsGenerator = new scratchOrgSettingsGenerator_1.default({ asDirectory: true });
|
|
274
234
|
const packageDescriptorJson = (0, kit_1.cloneJson)(this.packageObject);
|
|
275
235
|
// Copy all the metadata from the workspace to a tmp folder
|
|
276
|
-
const componentSet = await this.generateMDFolderForArtifact(mdOptions);
|
|
236
|
+
const componentSet = await this.metadataResolver.generateMDFolderForArtifact(mdOptions);
|
|
277
237
|
this.verifyHasSource(componentSet);
|
|
278
238
|
if (packageDescriptorJson.package) {
|
|
279
239
|
delete packageDescriptorJson.package;
|
|
@@ -329,15 +289,15 @@ class PackageVersionCreate {
|
|
|
329
289
|
}
|
|
330
290
|
packageDescriptorJson.ancestorId = ancestorId;
|
|
331
291
|
await fs.promises.writeFile(path.join(packageVersBlobDirectory, DESCRIPTOR_FILE), JSON.stringify(packageDescriptorJson), 'utf-8');
|
|
332
|
-
await this.cleanGeneratedPackage(packageVersMetadataFolder, packageVersProfileFolder, unpackagedMetadataFolder, metadataZipFile, settingsZipFile, packageVersBlobDirectory, packageVersBlobZipFile, unpackagedMetadataZipFile, clientSideInfo, settingsGenerator);
|
|
292
|
+
await this.cleanGeneratedPackage(packageVersMetadataFolder, packageVersProfileFolder, unpackagedMetadataFolder, seedMetadataFolder, metadataZipFile, settingsZipFile, packageVersBlobDirectory, packageVersBlobZipFile, unpackagedMetadataZipFile, seedMetadataZipFile, clientSideInfo, settingsGenerator);
|
|
333
293
|
return this.createRequestObject(preserveFiles, packageVersTmpRoot, packageVersBlobZipFile);
|
|
334
294
|
}
|
|
335
295
|
verifyHasSource(componentSet) {
|
|
336
|
-
if (componentSet
|
|
296
|
+
if (componentSet?.converted.length === 0) {
|
|
337
297
|
throw messages.createError('noSourceInRootDirectory', [this.packageObject.path ?? '<unknown>']);
|
|
338
298
|
}
|
|
339
299
|
}
|
|
340
|
-
async cleanGeneratedPackage(packageVersMetadataFolder, packageVersProfileFolder, unpackagedMetadataFolder, metadataZipFile, settingsZipFile, packageVersBlobDirectory, packageVersBlobZipFile, unpackagedMetadataZipFile, clientSideInfo, settingsGenerator) {
|
|
300
|
+
async cleanGeneratedPackage(packageVersMetadataFolder, packageVersProfileFolder, unpackagedMetadataFolder, seedMetadataFolder, metadataZipFile, settingsZipFile, packageVersBlobDirectory, packageVersBlobZipFile, unpackagedMetadataZipFile, seedMetadataZipFile, clientSideInfo, settingsGenerator) {
|
|
341
301
|
// As part of the source convert process, the package.xml has been written into the tmp metadata directory.
|
|
342
302
|
// The package.xml may need to be manipulated due to processing profiles in the workspace or additional
|
|
343
303
|
// metadata exclusions. If necessary, read the existing package.xml and then re-write it.
|
|
@@ -355,12 +315,16 @@ class PackageVersionCreate {
|
|
|
355
315
|
// Apply any necessary exclusions to typesArr.
|
|
356
316
|
let typesArr = packageJson.Package.types;
|
|
357
317
|
this.apiVersionFromPackageXml = packageJson.Package.version;
|
|
358
|
-
const
|
|
318
|
+
const sourceApiVersion = this.project?.getSfProjectJson()?.get('sourceApiVersion');
|
|
319
|
+
const hasSeedMetadata = await this.metadataResolver.resolveMetadata(this.packageObject.seedMetadata?.path, seedMetadataFolder, 'seedMDDirectoryDoesNotExist', sourceApiVersion);
|
|
320
|
+
let hasUnpackagedMetadata = false;
|
|
321
|
+
const unpackagedMetadataPath = this.packageObject.unpackagedMetadata?.path;
|
|
322
|
+
if (this.options.codecoverage) {
|
|
323
|
+
hasUnpackagedMetadata = await this.metadataResolver.resolveMetadata(unpackagedMetadataPath, unpackagedMetadataFolder, 'unpackagedMDDirectoryDoesNotExist', sourceApiVersion);
|
|
324
|
+
}
|
|
359
325
|
// if we're using unpackaged metadata, don't package the profiles located there
|
|
360
326
|
if (hasUnpackagedMetadata) {
|
|
361
|
-
typesArr = this.options.profileApi.filterAndGenerateProfilesForManifest(typesArr, [
|
|
362
|
-
clientSideInfo.get('UnpackagedMetadataPath'),
|
|
363
|
-
]);
|
|
327
|
+
typesArr = this.options.profileApi.filterAndGenerateProfilesForManifest(typesArr, [unpackagedMetadataPath]);
|
|
364
328
|
}
|
|
365
329
|
else {
|
|
366
330
|
typesArr = this.options.profileApi.filterAndGenerateProfilesForManifest(typesArr);
|
|
@@ -368,7 +332,7 @@ class PackageVersionCreate {
|
|
|
368
332
|
// Next generate profiles and retrieve any profiles that were excluded because they had no matching nodes.
|
|
369
333
|
const excludedProfiles = this.options.profileApi.generateProfiles(packageVersProfileFolder, {
|
|
370
334
|
Package: typesArr,
|
|
371
|
-
}, [
|
|
335
|
+
}, [unpackagedMetadataPath]);
|
|
372
336
|
if (excludedProfiles.length > 0) {
|
|
373
337
|
const profileIdx = typesArr.findIndex((e) => e.name[0] === 'Profile');
|
|
374
338
|
typesArr[profileIdx].members = typesArr[profileIdx].members.filter((e) => !excludedProfiles.includes(e));
|
|
@@ -392,6 +356,10 @@ class PackageVersionCreate {
|
|
|
392
356
|
await fs.promises.writeFile(path.join(packageVersMetadataFolder, 'package.xml'), xml, 'utf-8');
|
|
393
357
|
// Zip the packageVersMetadataFolder folder and put the zip in {packageVersBlobDirectory}/package.zip
|
|
394
358
|
await (0, packageUtils_1.zipDir)(packageVersMetadataFolder, metadataZipFile);
|
|
359
|
+
if (hasSeedMetadata) {
|
|
360
|
+
// Zip the seedMetadataFolder folder and put the zip in {packageVersBlobDirectory}/{seedMetadataZipFile}
|
|
361
|
+
await (0, packageUtils_1.zipDir)(seedMetadataFolder, seedMetadataZipFile);
|
|
362
|
+
}
|
|
395
363
|
if (hasUnpackagedMetadata) {
|
|
396
364
|
// Zip the unpackagedMetadataFolder folder and put the zip in {packageVersBlobDirectory}/{unpackagedMetadataZipFile}
|
|
397
365
|
await (0, packageUtils_1.zipDir)(unpackagedMetadataFolder, unpackagedMetadataZipFile);
|
|
@@ -427,26 +395,6 @@ class PackageVersionCreate {
|
|
|
427
395
|
}
|
|
428
396
|
delete packageDescriptorJson.apexTestAccess;
|
|
429
397
|
}
|
|
430
|
-
async resolveUnpackagedMetadata(packageDescriptorJson, unpackagedMetadataFolder, clientSideInfo, codeCoverage) {
|
|
431
|
-
// Add the Unpackaged Metadata, if any, to the output directory, only when code coverage is specified
|
|
432
|
-
if (codeCoverage && packageDescriptorJson.unpackagedMetadata?.path) {
|
|
433
|
-
const unpackagedPath = path.join(process.cwd(), packageDescriptorJson.unpackagedMetadata.path);
|
|
434
|
-
if (!fs.existsSync(unpackagedPath)) {
|
|
435
|
-
throw messages.createError('unpackagedMDDirectoryDoesNotExist', [
|
|
436
|
-
packageDescriptorJson.unpackagedMetadata.path,
|
|
437
|
-
]);
|
|
438
|
-
}
|
|
439
|
-
fs.mkdirSync(unpackagedMetadataFolder, { recursive: true });
|
|
440
|
-
await this.generateMDFolderForArtifact({
|
|
441
|
-
deploydir: unpackagedMetadataFolder,
|
|
442
|
-
sourceDir: unpackagedPath,
|
|
443
|
-
});
|
|
444
|
-
// Set which package is the "unpackaged" package
|
|
445
|
-
clientSideInfo.set('UnpackagedMetadataPath', packageDescriptorJson.unpackagedMetadata.path);
|
|
446
|
-
return true;
|
|
447
|
-
}
|
|
448
|
-
return false;
|
|
449
|
-
}
|
|
450
398
|
// eslint-disable-next-line complexity
|
|
451
399
|
async packageVersionCreate() {
|
|
452
400
|
// For the first rollout of validating sfdx-project.json data against schema, make it optional and defaulted
|
|
@@ -564,6 +512,7 @@ class PackageVersionCreate {
|
|
|
564
512
|
delete packageDescriptorJson.default; // for client-side use only, not needed
|
|
565
513
|
delete packageDescriptorJson.includeProfileUserLicenses; // for client-side use only, not needed
|
|
566
514
|
delete packageDescriptorJson.unpackagedMetadata; // for client-side use only, not needed
|
|
515
|
+
delete packageDescriptorJson.seedMetadata; // for client-side use only, not needed
|
|
567
516
|
delete packageDescriptorJson.branch; // for client-side use only, not needed
|
|
568
517
|
delete packageDescriptorJson.fullPath; // for client-side use only, not needed
|
|
569
518
|
delete packageDescriptorJson.name; // for client-side use only, not needed
|
|
@@ -808,4 +757,67 @@ class PackageVersionCreate {
|
|
|
808
757
|
}
|
|
809
758
|
}
|
|
810
759
|
exports.PackageVersionCreate = PackageVersionCreate;
|
|
760
|
+
class MetadataResolver {
|
|
761
|
+
async resolveMetadata(metadataRelativePath, metadataOutputPath, errorMessageLabel, sourceApiVersion) {
|
|
762
|
+
if (metadataRelativePath) {
|
|
763
|
+
const metadataFullPath = path.join(process.cwd(), metadataRelativePath);
|
|
764
|
+
if (!fs.existsSync(metadataFullPath)) {
|
|
765
|
+
throw messages.createError(errorMessageLabel, [metadataRelativePath]);
|
|
766
|
+
}
|
|
767
|
+
fs.mkdirSync(metadataOutputPath, { recursive: true });
|
|
768
|
+
await this.generateMDFolderForArtifact({
|
|
769
|
+
deploydir: metadataOutputPath,
|
|
770
|
+
sourceDir: metadataFullPath,
|
|
771
|
+
sourceApiVersion,
|
|
772
|
+
});
|
|
773
|
+
return true;
|
|
774
|
+
}
|
|
775
|
+
return false;
|
|
776
|
+
}
|
|
777
|
+
// convert source to mdapi format and copy to tmp dir packaging up
|
|
778
|
+
async generateMDFolderForArtifact(options) {
|
|
779
|
+
const sourcepath = options.sourcePaths ?? [options.sourceDir];
|
|
780
|
+
const componentSet = await source_deploy_retrieve_1.ComponentSetBuilder.build({
|
|
781
|
+
sourceapiversion: options.sourceApiVersion,
|
|
782
|
+
sourcepath,
|
|
783
|
+
});
|
|
784
|
+
const packageName = options.packageName;
|
|
785
|
+
const outputDirectory = path.resolve(options.deploydir);
|
|
786
|
+
const convertResult = await this.convertMetadata(componentSet, outputDirectory, packageName);
|
|
787
|
+
if (packageName) {
|
|
788
|
+
// SDR will build an output path like /output/directory/packageName/package.xml
|
|
789
|
+
// this was breaking from toolbelt, so to revert it we copy the directory up a level and delete the original
|
|
790
|
+
(0, packageUtils_1.copyDir)(convertResult.packagePath, outputDirectory);
|
|
791
|
+
try {
|
|
792
|
+
fs.rmSync(convertResult.packagePath, { recursive: true });
|
|
793
|
+
}
|
|
794
|
+
catch (e) {
|
|
795
|
+
// rmdirSync is being deprecated and emits a warning
|
|
796
|
+
// but rmSync is introduced in node 14 so fall back to rmdirSync
|
|
797
|
+
fs.rmdirSync(convertResult.packagePath, { recursive: true });
|
|
798
|
+
}
|
|
799
|
+
convertResult.packagePath = outputDirectory;
|
|
800
|
+
}
|
|
801
|
+
return convertResult;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Extracted into a method for UT purposes
|
|
805
|
+
*
|
|
806
|
+
* @param componentSet CS to convert
|
|
807
|
+
* @param outputDirectory where to place the converted MD
|
|
808
|
+
* @param packageName the packagename related to the CS
|
|
809
|
+
* @private
|
|
810
|
+
*/
|
|
811
|
+
// eslint-disable-next-line class-methods-use-this
|
|
812
|
+
async convertMetadata(componentSet, outputDirectory, packageName) {
|
|
813
|
+
const converter = new source_deploy_retrieve_1.MetadataConverter();
|
|
814
|
+
return converter.convert(componentSet, 'metadata', {
|
|
815
|
+
type: 'directory',
|
|
816
|
+
outputDirectory,
|
|
817
|
+
packageName,
|
|
818
|
+
genUniqueDir: false,
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
exports.MetadataResolver = MetadataResolver;
|
|
811
823
|
//# sourceMappingURL=packageVersionCreate.js.map
|
|
@@ -42,6 +42,10 @@ You cannot use 'settings' and 'orgPreferences' in your scratch definition file,
|
|
|
42
42
|
|
|
43
43
|
There was an error while reading or parsing the provided scratch definition file: %s
|
|
44
44
|
|
|
45
|
+
# seedMDDirectoryDoesNotExist
|
|
46
|
+
|
|
47
|
+
Seed metadata directory %s was specified but does not exist.
|
|
48
|
+
|
|
45
49
|
# unpackagedMDDirectoryDoesNotExist
|
|
46
50
|
|
|
47
51
|
Un-packaged metadata directory %s was specified but does not exist.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/packaging",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Packaging library for the Salesforce packaging platform",
|
|
5
5
|
"main": "lib/exported",
|
|
6
6
|
"types": "lib/exported.d.ts",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@oclif/core": "^1.25.0",
|
|
42
42
|
"@salesforce/core": "^3.32.11",
|
|
43
|
-
"@salesforce/kit": "^1.8.
|
|
44
|
-
"@salesforce/schemas": "^1.
|
|
43
|
+
"@salesforce/kit": "^1.8.3",
|
|
44
|
+
"@salesforce/schemas": "^1.5.0",
|
|
45
45
|
"@salesforce/source-deploy-retrieve": "^7.5.19",
|
|
46
46
|
"@salesforce/ts-types": "^1.7.1",
|
|
47
47
|
"@xmldom/xmldom": "^0.8.6",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"globby": "^11",
|
|
50
50
|
"graphology": "^0.25.1",
|
|
51
51
|
"graphology-traversal": "^0.3.1",
|
|
52
|
-
"graphology-types": "^0.24.
|
|
52
|
+
"graphology-types": "^0.24.7",
|
|
53
53
|
"js2xmlparser": "^4.0.2",
|
|
54
54
|
"jsforce": "2.0.0-beta.19",
|
|
55
55
|
"jszip": "^3.10.1",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"eslint-config-salesforce-license": "^0.1.6",
|
|
78
78
|
"eslint-config-salesforce-typescript": "^1.1.1",
|
|
79
79
|
"eslint-plugin-header": "3.1.1",
|
|
80
|
-
"eslint-plugin-import": "^2.
|
|
80
|
+
"eslint-plugin-import": "^2.27.5",
|
|
81
81
|
"eslint-plugin-jsdoc": "^39.6.7",
|
|
82
82
|
"husky": "^8.0.2",
|
|
83
83
|
"mocha": "^10.2.0",
|