@flxbl-io/sfp
Version:
sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model
93 lines • 7.83 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ProjectConfig_1 = __importDefault(require("./core/project/ProjectConfig"));
const ajv_1 = __importDefault(require("ajv"));
const path = require("path");
const fs = __importStar(require("fs-extra"));
const SfpPackage_1 = require("./core/package/SfpPackage");
const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger"));
class ProjectValidation {
constructor() {
this.projectConfig = ProjectConfig_1.default.getSFDXProjectConfig(null);
this.ajv = new ajv_1.default({ allErrors: true });
this.resourcesDir = path.join(__dirname, '..', 'resources', 'schemas');
}
validateSFDXProjectJSON() {
let schema = fs.readJSONSync(path.join(this.resourcesDir, `sfdx-project.schema.json`), { encoding: 'UTF-8' });
let validator = this.ajv.compile(schema);
let isSchemaValid = validator(this.projectConfig);
if (!isSchemaValid) {
let errorMsg = `The sfdx-project.json is invalid, Please fix the following errors\n`;
validator.errors.forEach((error, errorNum) => {
errorMsg += `\n${errorNum + 1}: ${error.instancePath}: ${error.message} ${JSON.stringify(error.params, null, 4)}`;
});
sfp_logger_1.default.log(`The following attributes are not recognized by sfp, You might need to remove them`, sfp_logger_1.LoggerLevel.WARN);
sfp_logger_1.default.log(errorMsg, sfp_logger_1.LoggerLevel.WARN);
}
}
validatePackageNames() {
ProjectConfig_1.default.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
let name = pkg.package;
if (name.length > 38) {
throw new Error('sfdx-project.json validation failed for package "' +
pkg['package'] +
'".' +
`Package name exceed maximum length of 38 characters.`);
}
else if (name.match(/^[a-zA-Z0-9-._~]+$/) === null) {
throw new Error('sfdx-project.json validation failed for package "' +
pkg['package'] +
'".' +
`Package names can only contain alphanumeric characters and the symbols - . _ ~.`);
}
});
}
validatePackageBuildNumbers() {
ProjectConfig_1.default.getAllPackageDirectoriesFromConfig(this.projectConfig).forEach((pkg) => {
let packageType = ProjectConfig_1.default.getPackageType(this.projectConfig, pkg.package);
let pattern = /NEXT$|LATEST$/i;
if (pkg.versionNumber.match(pattern) &&
(packageType === SfpPackage_1.PackageType.Source || packageType === SfpPackage_1.PackageType.Data)) {
throw new Error('sfdx-project.json validation failed for package "' +
pkg['package'] +
'".' +
' Build-number keywords "NEXT" & "LATEST" are not supported for ' +
packageType +
' packages.' +
'\nTry the following:' +
'\n - If package should be built as a ' +
packageType +
' package, use 0 instead of NEXT/LATEST' +
'\n - If package should be built as an Unlocked package, ensure the package has been created in the Devhub and the ID included in packageAliases of sfdx-project.json');
}
});
}
}
exports.default = ProjectValidation;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvamVjdFZhbGlkYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUHJvamVjdFZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlGQUF5RDtBQUN6RCw4Q0FBc0I7QUFDdEIsNkJBQThCO0FBQzlCLDZDQUErQjtBQUMvQiwwREFBd0Q7QUFDeEQsbUVBQThEO0FBRTlELE1BQXFCLGlCQUFpQjtJQUtsQztRQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsdUJBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksYUFBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSx1QkFBdUI7UUFDMUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsMEJBQTBCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlHLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2pCLElBQUksUUFBUSxHQUFXLHFFQUFxRSxDQUFDO1lBRTdGLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN6QyxRQUFRLElBQUksS0FBSyxRQUFRLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUNwRixLQUFLLENBQUMsTUFBTSxFQUNaLElBQUksRUFDSixDQUFDLENBQ0osRUFBRSxDQUFDO1lBQ1IsQ0FBQyxDQUFDLENBQUM7WUFHTCxvQkFBUyxDQUFDLEdBQUcsQ0FBQyxtRkFBbUYsRUFBQyx3QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ25ILG9CQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSx3QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRU0sb0JBQW9CO1FBQ3ZCLHVCQUFhLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pGLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdkIsSUFBSyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUNYLG1EQUFtRDtvQkFDbkQsR0FBRyxDQUFDLFNBQVMsQ0FBQztvQkFDVixJQUFJO29CQUNSLHNEQUFzRCxDQUN6RCxDQUFBO1lBQ0wsQ0FBQztpQkFBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFBbUQ7b0JBQ25ELEdBQUcsQ0FBQyxTQUFTLENBQUM7b0JBQ1YsSUFBSTtvQkFDUixpRkFBaUYsQ0FDcEYsQ0FBQTtZQUNMLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFHTSwyQkFBMkI7UUFDOUIsdUJBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakYsSUFBSSxXQUFXLEdBQUcsdUJBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFaEYsSUFBSSxPQUFPLEdBQVcsZ0JBQWdCLENBQUM7WUFDdkMsSUFDSSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ2hDLENBQUMsV0FBVyxLQUFLLHdCQUFXLENBQUMsTUFBTSxJQUFJLFdBQVcsS0FBSyx3QkFBVyxDQUFDLElBQUksQ0FBQyxFQUMxRSxDQUFDO2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQ1gsbURBQW1EO29CQUMvQyxHQUFHLENBQUMsU0FBUyxDQUFDO29CQUNkLElBQUk7b0JBQ0osaUVBQWlFO29CQUNqRSxXQUFXO29CQUNYLFlBQVk7b0JBQ1osc0JBQXNCO29CQUN0Qix1Q0FBdUM7b0JBQ3ZDLFdBQVc7b0JBQ1gsd0NBQXdDO29CQUN4QyxzS0FBc0ssQ0FDN0ssQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQS9FRCxvQ0ErRUMifQ==