UNPKG

projen

Version:

CDK for software projects

74 lines 9.3 kB
"use strict"; 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