@serenity-js/core
Version:
The core Serenity/JS framework, providing the Screenplay Pattern interfaces, as well as the test reporting and integration infrastructure
52 lines • 3.12 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ClassDescriptionParser = void 0;
const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
const errors_1 = require("../../errors");
const format_1 = require("../format");
class ClassDescriptionParser {
static validClassNamePattern = /^[A-Za-z]\w+$/;
looksLikeClassDescription(candidate) {
const stringDescription = typeof candidate === 'string';
const tupleDescription = Array.isArray(candidate) && [1, 2].includes(candidate.length) && typeof candidate[0] === 'string';
return stringDescription || tupleDescription;
}
parse(classDescription) {
if (!this.looksLikeClassDescription(classDescription)) {
throw new errors_1.ConfigurationError((0, format_1.d) `${classDescription} is not a valid class description. Valid class description must be a string or an Array with 1-2 items, where the first item is a string.`);
}
const moduleIdAndClassDescription = Array.isArray(classDescription)
? classDescription[0]
: classDescription;
const [moduleId, desiredClassName, ...rest] = moduleIdAndClassDescription.split(':');
if (rest.length > 0) {
throw new errors_1.ConfigurationError(`${classDescription} is not a valid class description. Valid class description must be:\n` +
`- a module ID of a Node module providing a default export, e.g. "@serenity-js/serenity-bdd"\n` +
`- a module ID followed by a class name, e.g. "@serenity-js/core:StreamReporter"`);
}
if (desiredClassName === '') {
throw new errors_1.ConfigurationError(`Invalid class name in "${moduleIdAndClassDescription}". If you want to import the default export from a given module, please use the module ID.\n` +
`For example, valid class descriptions include "@serenity-js/serenity-bdd", "@serenity-js/serenity-bdd:default", "@serenity-js/serenity-bdd:SerenityBDD".`);
}
const className = desiredClassName ?? 'default';
if (!ClassDescriptionParser.validClassNamePattern.test(className)) {
throw new errors_1.ConfigurationError(`"${className}" doesn't seem like a valid JavaScript class name in "${moduleIdAndClassDescription}"`);
}
if (!moduleId.startsWith('./')) {
const result = (0, validate_npm_package_name_1.default)(moduleId);
if (!result.validForNewPackages) {
throw new errors_1.ConfigurationError(`"${moduleId}" doesn't seem like a valid module id:\n${result.errors.map(error => `- ${error}\n`)}`);
}
}
return {
moduleId,
className,
parameter: Array.isArray(classDescription) ? classDescription[1] : undefined,
};
}
}
exports.ClassDescriptionParser = ClassDescriptionParser;
//# sourceMappingURL=ClassDescriptionParser.js.map
;