projen
Version:
CDK for software projects
74 lines • 9.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.COMPONENT_SYMBOL = exports.PROJECT_SYMBOL = void 0;
exports.tryFindClosest = tryFindClosest;
exports.findClosestProject = findClosestProject;
exports.closestProjectMustBe = closestProjectMustBe;
exports.isProject = isProject;
exports.isComponent = isComponent;
exports.tagAsProject = tagAsProject;
exports.tagAsComponent = tagAsComponent;
exports.PROJECT_SYMBOL = Symbol.for("projen.Project");
exports.COMPONENT_SYMBOL = Symbol.for("projen.Component");
/**
* Create a function to find the closest construct matching a predicate
* @param predicate
* @returns A function to find the closest construct matching the predicate
*/
function tryFindClosest(predicate) {
return (construct) => construct?.node.scopes.reverse().find(predicate);
}
/**
* Find the closest project, searching upwards from a construct.
*
* @param construct the construct to start searching from
* @param constructInCreation the name of the construct being created
* @returns the closest project, if any
*/
function findClosestProject(construct, constructInCreation) {
if (isComponent(construct)) {
return construct.project;
}
const project = tryFindClosest(isProject)(construct);
if (!project) {
throw new Error(`${constructInCreation} at '${construct.node.path}' must be created in the scope of a Project, but no Project was found`);
}
return project;
}
/**
* Find the closest project of a given type, searching upwards from a construct.
*
* This function should be used within a class constructor.
* If not, you must provide a name as second argument or the call will fail.
*
* @param construct the construct to start searching from
* @param constructInCreation the name of the construct being created
* @returns the closest project of the expected type, if any
*/
function closestProjectMustBe(construct, projectType, constructInCreation) {
const project = tryFindClosest(isProject)(construct);
const error = `${constructInCreation} at '${construct.node.path}' must be created within a ${projectType.name}`;
if (!project) {
throw new Error(`${error}, but no Project was found`);
}
if (!(project instanceof projectType)) {
throw new Error(`${error}, but found: ${project.constructor.name}`);
}
return project;
}
function isProject(x) {
return x !== null && typeof x === "object" && exports.PROJECT_SYMBOL in x;
}
function isComponent(x) {
return x !== null && typeof x === "object" && exports.COMPONENT_SYMBOL in x;
}
function tagAs(scope, tag) {
Object.defineProperty(scope, tag, { value: true });
}
function tagAsProject(scope) {
tagAs(scope, exports.PROJECT_SYMBOL);
}
function tagAsComponent(scope) {
tagAs(scope, exports.COMPONENT_SYMBOL);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RydWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2NvbnN0cnVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsd0NBS0M7QUFTRCxnREFnQkM7QUFZRCxvREFlQztBQUVELDhCQUVDO0FBRUQsa0NBRUM7QUFNRCxvQ0FFQztBQUVELHdDQUVDO0FBckZZLFFBQUEsY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM5QyxRQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUUvRDs7OztHQUlHO0FBQ0gsU0FBZ0IsY0FBYyxDQUM1QixTQUE2QjtJQUU3QixPQUFPLENBQUMsU0FBc0IsRUFBRSxFQUFFLENBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2hDLFNBQXFCLEVBQ3JCLG1CQUEyQjtJQUUzQixJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxtQkFBbUIsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksdUVBQXVFLENBQ3pILENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxTQUFxQixFQUNyQixXQUFzQyxFQUN0QyxtQkFBMkI7SUFFM0IsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFHLEdBQUcsbUJBQW1CLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUE4QixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEgsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssNEJBQTRCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssZ0JBQWdCLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxDQUFVO0lBQ2xDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksc0JBQWMsSUFBSSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxDQUFVO0lBQ3BDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksd0JBQWdCLElBQUksQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxLQUFpQixFQUFFLEdBQVc7SUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxLQUFpQjtJQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLHNCQUFjLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEtBQWlCO0lBQzlDLEtBQUssQ0FBQyxLQUFLLEVBQUUsd0JBQWdCLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcblxuZXhwb3J0IGNvbnN0IFBST0pFQ1RfU1lNQk9MID0gU3ltYm9sLmZvcihcInByb2plbi5Qcm9qZWN0XCIpO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9TWU1CT0wgPSBTeW1ib2wuZm9yKFwicHJvamVuLkNvbXBvbmVudFwiKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjbG9zZXN0IGNvbnN0cnVjdCBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICogQHBhcmFtIHByZWRpY2F0ZVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjbG9zZXN0IGNvbnN0cnVjdCBtYXRjaGluZyB0aGUgcHJlZGljYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlGaW5kQ2xvc2VzdDxUIGV4dGVuZHMgSUNvbnN0cnVjdD4oXG4gIHByZWRpY2F0ZTogKHg6IGFueSkgPT4geCBpcyBULFxuKTogKGNvbnN0cnVjdD86IElDb25zdHJ1Y3QpID0+IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKGNvbnN0cnVjdD86IElDb25zdHJ1Y3QpID0+XG4gICAgY29uc3RydWN0Py5ub2RlLnNjb3Blcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGNsb3Nlc3QgcHJvamVjdCwgc2VhcmNoaW5nIHVwd2FyZHMgZnJvbSBhIGNvbnN0cnVjdC5cbiAqXG4gKiBAcGFyYW0gY29uc3RydWN0IHRoZSBjb25zdHJ1Y3QgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAqIEBwYXJhbSBjb25zdHJ1Y3RJbkNyZWF0aW9uIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3QgYmVpbmcgY3JlYXRlZFxuICogQHJldHVybnMgdGhlIGNsb3Nlc3QgcHJvamVjdCwgaWYgYW55XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdFByb2plY3QoXG4gIGNvbnN0cnVjdDogSUNvbnN0cnVjdCxcbiAgY29uc3RydWN0SW5DcmVhdGlvbjogc3RyaW5nLFxuKTogUHJvamVjdCB7XG4gIGlmIChpc0NvbXBvbmVudChjb25zdHJ1Y3QpKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdC5wcm9qZWN0O1xuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHRyeUZpbmRDbG9zZXN0KGlzUHJvamVjdCkoY29uc3RydWN0KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uc3RydWN0SW5DcmVhdGlvbn0gYXQgJyR7Y29uc3RydWN0Lm5vZGUucGF0aH0nIG11c3QgYmUgY3JlYXRlZCBpbiB0aGUgc2NvcGUgb2YgYSBQcm9qZWN0LCBidXQgbm8gUHJvamVjdCB3YXMgZm91bmRgLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcHJvamVjdDtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IHByb2plY3Qgb2YgYSBnaXZlbiB0eXBlLCBzZWFyY2hpbmcgdXB3YXJkcyBmcm9tIGEgY29uc3RydWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgY2xhc3MgY29uc3RydWN0b3IuXG4gKiBJZiBub3QsIHlvdSBtdXN0IHByb3ZpZGUgYSBuYW1lIGFzIHNlY29uZCBhcmd1bWVudCBvciB0aGUgY2FsbCB3aWxsIGZhaWwuXG4gKlxuICogQHBhcmFtIGNvbnN0cnVjdCB0aGUgY29uc3RydWN0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gKiBAcGFyYW0gY29uc3RydWN0SW5DcmVhdGlvbiB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0IGJlaW5nIGNyZWF0ZWRcbiAqIEByZXR1cm5zIHRoZSBjbG9zZXN0IHByb2plY3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUsIGlmIGFueVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VzdFByb2plY3RNdXN0QmU8VD4oXG4gIGNvbnN0cnVjdDogSUNvbnN0cnVjdCxcbiAgcHJvamVjdFR5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsXG4gIGNvbnN0cnVjdEluQ3JlYXRpb246IHN0cmluZyxcbik6IFQge1xuICBjb25zdCBwcm9qZWN0ID0gdHJ5RmluZENsb3Nlc3QoaXNQcm9qZWN0KShjb25zdHJ1Y3QpO1xuICBjb25zdCBlcnJvciA9IGAke2NvbnN0cnVjdEluQ3JlYXRpb259IGF0ICcke2NvbnN0cnVjdC5ub2RlLnBhdGh9JyBtdXN0IGJlIGNyZWF0ZWQgd2l0aGluIGEgJHtwcm9qZWN0VHlwZS5uYW1lfWA7XG4gIGlmICghcHJvamVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvcn0sIGJ1dCBubyBQcm9qZWN0IHdhcyBmb3VuZGApO1xuICB9XG4gIGlmICghKHByb2plY3QgaW5zdGFuY2VvZiBwcm9qZWN0VHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3J9LCBidXQgZm91bmQ6ICR7cHJvamVjdC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuICB9XG5cbiAgcmV0dXJuIHByb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb2plY3QoeDogdW5rbm93bik6IHggaXMgUHJvamVjdCB7XG4gIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIFBST0pFQ1RfU1lNQk9MIGluIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudCh4OiB1bmtub3duKTogeCBpcyBDb21wb25lbnQge1xuICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBDT01QT05FTlRfU1lNQk9MIGluIHg7XG59XG5cbmZ1bmN0aW9uIHRhZ0FzKHNjb3BlOiBJQ29uc3RydWN0LCB0YWc6IHN5bWJvbCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2NvcGUsIHRhZywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ0FzUHJvamVjdChzY29wZTogSUNvbnN0cnVjdCkge1xuICB0YWdBcyhzY29wZSwgUFJPSkVDVF9TWU1CT0wpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnQXNDb21wb25lbnQoc2NvcGU6IElDb25zdHJ1Y3QpIHtcbiAgdGFnQXMoc2NvcGUsIENPTVBPTkVOVF9TWU1CT0wpO1xufVxuIl19