UNPKG

projen

Version:

CDK for software projects

125 lines • 21.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.LambdaExtension = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const path_1 = require("path"); const case_1 = require("case"); const internal_1 = require("./internal"); const lambda_function_1 = require("./lambda-function"); const component_1 = require("../component"); const javascript_1 = require("../javascript"); const source_code_1 = require("../source-code"); /** * Create a Lambda Extension */ class LambdaExtension extends component_1.Component { constructor(project, options) { super(project); const basePath = (0, path_1.join)((0, path_1.dirname)(options.entrypoint), (0, path_1.basename)(options.entrypoint, internal_1.TYPESCRIPT_LAMBDA_EXTENSION_EXT)); const name = options.name ?? (0, path_1.basename)(basePath); const bundler = javascript_1.Bundler.of(project); if (!bundler) { throw new Error("No bundler found. Please add a Bundler component to your project."); } const compatibleRuntimes = options.compatibleRuntimes ?? [ lambda_function_1.LambdaRuntime.NODEJS_22_X, lambda_function_1.LambdaRuntime.NODEJS_20_X, lambda_function_1.LambdaRuntime.NODEJS_18_X, lambda_function_1.LambdaRuntime.NODEJS_16_X, lambda_function_1.LambdaRuntime.NODEJS_14_X, lambda_function_1.LambdaRuntime.NODEJS_12_X, ]; if (compatibleRuntimes.length === 0) { throw new Error("Compatible runtimes must include at least one runtime"); } // Use the lowest runtime version to bundle const [bundlerRuntime] = compatibleRuntimes.sort((a, b) => a.functionRuntime.localeCompare(b.functionRuntime)); // Allow extension code to import dev-deps since they are only needed // during bundling const eslint = javascript_1.Eslint.of(project); eslint?.allowDevDeps(options.entrypoint); const bundle = bundler.addBundle(options.entrypoint, { platform: bundlerRuntime.esbuildPlatform, target: bundlerRuntime.esbuildTarget, externals: bundlerRuntime.defaultExternals, outfile: `extensions/${name}`, // Make the output executable because Lambda expects to run // extensions as stand-alone programs alongside the main lambda // process. executable: true, ...options.bundlingOptions, }); const constructFile = options.constructFile ?? `${basePath}-layer-version.ts`; new LambdaLayerConstruct(project, { constructFile: constructFile, constructName: options.constructName, assetDir: bundle.outdir, compatibleRuntimes: compatibleRuntimes, description: `Provides a Lambda Extension \`${name}\` from ${(0, internal_1.convertToPosixPath)(options.entrypoint)}`, cdkDeps: options.cdkDeps, }); } } exports.LambdaExtension = LambdaExtension; _a = JSII_RTTI_SYMBOL_1; LambdaExtension[_a] = { fqn: "projen.awscdk.LambdaExtension", version: "0.99.51" }; class LambdaLayerConstruct extends source_code_1.SourceCode { constructor(project, options) { super(project, options.constructFile); const src = this; const cdkDeps = options.cdkDeps; const constructName = options.constructName ?? (0, case_1.pascal)((0, path_1.basename)(options.constructFile, ".ts")); const propsType = `${constructName}Props`; const assetDir = (0, path_1.relative)((0, path_1.dirname)(options.constructFile), options.assetDir); if (src.marker) { src.line(`// ${src.marker}`); } src.line("import * as path from 'path';"); if (cdkDeps.cdkMajorVersion === 1) { src.line("import * as lambda from '@aws-cdk/aws-lambda';"); src.line("import { Construct } from '@aws-cdk/core';"); cdkDeps.addV1Dependencies("@aws-cdk/aws-lambda"); cdkDeps.addV1Dependencies("@aws-cdk/core"); } else { src.line("import * as lambda from 'aws-cdk-lib/aws-lambda';"); src.line("import { Construct } from 'constructs';"); } src.line(); src.line("/**"); src.line(` * Props for ${constructName}`); src.line(" */"); src.open(`export interface ${propsType} extends lambda.LayerVersionOptions {`); src.close("}"); src.line(); src.line("/**"); src.line(` * ${options.description}`); src.line(" */"); src.open(`export class ${constructName} extends lambda.LayerVersion {`); src.open(`constructor(scope: Construct, id: string, props?: ${propsType}) {`); src.open("super(scope, id, {"); src.line(`description: ${encodeCodeString(options.description)},`); src.line("...props,"); src.open("compatibleRuntimes: ["); for (const runtime of options.compatibleRuntimes) { src.line(`new lambda.Runtime('${runtime.functionRuntime}', lambda.RuntimeFamily.NODEJS),`); } src.close("],"); src.open(`code: lambda.Code.fromAsset(path.join(__dirname,`); src.line(`${encodeCodeString((0, internal_1.convertToPosixPath)(assetDir))})),`); src.close(); src.close("});"); src.close("}"); src.close("}"); } } /** * Encodes a string for embedding in source code. */ function encodeCodeString(value) { const json = JSON.stringify(value); const escapedString = json.substring(1, json.length - 1).replace(/'/g, "\\'"); return `'${escapedString}'`; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWV4dGVuc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3NjZGsvbGFtYmRhLWV4dGVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUF5RDtBQUN6RCwrQkFBOEI7QUFFOUIseUNBR29CO0FBQ3BCLHVEQUFrRDtBQUNsRCw0Q0FBeUM7QUFFekMsOENBQWdEO0FBRWhELGdEQUE0QztBQWtFNUM7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEscUJBQVM7SUFDNUMsWUFBWSxPQUFnQixFQUFFLE9BQStCO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLE1BQU0sUUFBUSxHQUFHLElBQUEsV0FBSSxFQUNuQixJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQzNCLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsMENBQStCLENBQUMsQ0FDOUQsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBQSxlQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxPQUFPLEdBQUcsb0JBQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDYixtRUFBbUUsQ0FDcEUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSTtZQUN2RCwrQkFBYSxDQUFDLFdBQVc7WUFDekIsK0JBQWEsQ0FBQyxXQUFXO1lBQ3pCLCtCQUFhLENBQUMsV0FBVztZQUN6QiwrQkFBYSxDQUFDLFdBQVc7WUFDekIsK0JBQWEsQ0FBQyxXQUFXO1lBQ3pCLCtCQUFhLENBQUMsV0FBVztTQUMxQixDQUFDO1FBRUYsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFF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a0IsRUFBRSxDQUFDO1lBQ2pELEdBQUcsQ0FBQyxJQUFJLENBQ04sdUJBQXVCLE9BQU8sQ0FBQyxlQUFlLGtDQUFrQyxDQUNqRixDQUFDO1FBQ0osQ0FBQztRQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEIsR0FBRyxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQzdELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFBLDZCQUFrQixFQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNaLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUUsT0FBTyxJQUFJLGFBQWEsR0FBRyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGFzY2FsIH0gZnJvbSBcImNhc2VcIjtcbmltcG9ydCB0eXBlIHsgQXdzQ2RrRGVwcyB9IGZyb20gXCIuL2F3c2Nkay1kZXBzXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0VG9Qb3NpeFBhdGgsXG4gIFRZUEVTQ1JJUFRfTEFNQkRBX0VYVEVOU0lPTl9FWFQsXG59IGZyb20gXCIuL2ludGVybmFsXCI7XG5pbXBvcnQgeyBMYW1iZGFSdW50aW1lIH0gZnJvbSBcIi4vbGFtYmRhLWZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJ1bmRsaW5nT3B0aW9ucyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBCdW5kbGVyLCBFc2xpbnQgfSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IFNvdXJjZUNvZGUgfSBmcm9tIFwiLi4vc291cmNlLWNvZGVcIjtcblxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGFtYmRhIGV4dGVuc2lvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRXh0ZW5zaW9uQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZW5zaW9uJ3MgY29tcGF0aWJsZSBydW50aW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhdGlibGVSdW50aW1lcz86IExhbWJkYVJ1bnRpbWVbXTtcblxuICAvKipcbiAgICogQnVuZGxpbmcgb3B0aW9ucyBmb3IgdGhpcyBBV1MgTGFtYmRhIGV4dGVuc2lvbi5cbiAgICpcbiAgICogSWYgbm90IHNwZWNpZmllZCB0aGUgZGVmYXVsdCBidW5kbGluZyBvcHRpb25zIHNwZWNpZmllZCBmb3IgdGhlIHByb2plY3RcbiAgICogYEJ1bmRsZXJgIGluc3RhbmNlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgYnVuZGxpbmdPcHRpb25zPzogQnVuZGxpbmdPcHRpb25zO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGxhbWJkYSBleHRlbnNpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUV4dGVuc2lvbk9wdGlvbnMgZXh0ZW5kcyBMYW1iZGFFeHRlbnNpb25Db21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGV4dGVuc2lvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIERlcml2ZWQgZnJvbSB0aGUgZW50cnlwb2ludCBmaWxlbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IHRvIGEgVHlwZVNjcmlwdCBmaWxlIHdoaWNoIGNvbnRhaW5zXG4gICAqIHRoZSBBV1MgTGFtYmRhIGV4dGVuc2lvbiBlbnRyeXBvaW50IChzdGFuZC1hbG9uZSBzY3JpcHQpLlxuICAgKlxuICAgKiBUaGlzIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdC5cbiAgICpcbiAgICogQGV4YW1wbGUgXCJzcmMvc3ViZGlyL2Zvby5sYW1iZGEtZXh0ZW5zaW9uLnRzXCJcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIENESyBkZXBlbmRlbmN5IG1hbmFnZXIuXG4gICAqL1xuICByZWFkb25seSBjZGtEZXBzOiBBd3NDZGtEZXBzO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgc291cmNlIGZpbGUuIFRoaXMgZmlsZSBzaG91bGQgYWxzbyBiZVxuICAgKiB1bmRlciB0aGUgc291cmNlIHRyZWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5hbWUgb2YgdGhlIGVudHJ5cG9pbnQgZmlsZSwgd2l0aCB0aGUgYC1sYXllci12ZXJzaW9uLnRzYFxuICAgKiBzdWZmaXggaW5zdGVhZCBvZiBgLmxhbWJkYS1leHRlbnNpb24udHNgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBgbGFtYmRhLkxheWVyVmVyc2lvbmAgc3ViY2xhc3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBwYXNjYWwgY2FzZWQgdmVyc2lvbiBvZiB0aGUgbmFtZSBvZiB0aGUgZW50cnlwb2ludCBmaWxlLCB3aXRoXG4gICAqIHRoZSBleHRlbnNpb24gYExheWVyVmVyc2lvbmAgKGUuZy4gYEFwcENvbmZpZ0xheWVyVmVyc2lvbmApLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBMYW1iZGEgRXh0ZW5zaW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFFeHRlbnNpb24gZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBMYW1iZGFFeHRlbnNpb25PcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IGpvaW4oXG4gICAgICBkaXJuYW1lKG9wdGlvbnMuZW50cnlwb2ludCksXG4gICAgICBiYXNlbmFtZShvcHRpb25zLmVudHJ5cG9pbnQsIFRZUEVTQ1JJUFRfTEFNQkRBX0VYVEVOU0lPTl9FWFQpLFxuICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5uYW1lID8/IGJhc2VuYW1lKGJhc2VQYXRoKTtcblxuICAgIGNvbnN0IGJ1bmRsZXIgPSBCdW5kbGVyLm9mKHByb2plY3QpO1xuICAgIGlmICghYnVuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk5vIGJ1bmRsZXIgZm91bmQuIFBsZWFzZSBhZGQgYSBCdW5kbGVyIGNvbXBvbmVudCB0byB5b3VyIHByb2plY3QuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBhdGlibGVSdW50aW1lcyA9IG9wdGlvbnMuY29tcGF0aWJsZVJ1bnRpbWVzID8/IFtcbiAgICAgIExhbWJkYVJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBMYW1iZGFSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgTGFtYmRhUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIExhbWJkYVJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICBMYW1iZGFSdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgTGFtYmRhUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICBdO1xuXG4gICAgaWYgKGNvbXBhdGlibGVSdW50aW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbXBhdGlibGUgcnVudGltZXMgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBydW50aW1lXCIpO1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgbG93ZXN0IHJ1bnRpbWUgdmVyc2lvbiB0byBidW5kbGVcbiAgICBjb25zdCBbYnVuZGxlclJ1bnRpbWVdID0gY29tcGF0aWJsZVJ1bnRpbWVzLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLmZ1bmN0aW9uUnVudGltZS5sb2NhbGVDb21wYXJlKGIuZnVuY3Rpb25SdW50aW1lKSxcbiAgICApO1xuXG4gICAgLy8gQWxsb3cgZXh0ZW5zaW9uIGNvZGUgdG8gaW1wb3J0IGRldi1kZXBzIHNpbmNlIHRoZXkgYXJlIG9ubHkgbmVlZGVkXG4gICAgLy8gZHVyaW5nIGJ1bmRsaW5nXG4gICAgY29uc3QgZXNsaW50ID0gRXNsaW50Lm9mKHByb2plY3QpO1xuICAgIGVzbGludD8uYWxsb3dEZXZEZXBzKG9wdGlvbnMuZW50cnlwb2ludCk7XG5cbiAgICBjb25zdCBidW5kbGUgPSBidW5kbGVyLmFkZEJ1bmRsZShvcHRpb25zLmVudHJ5cG9pbnQsIHtcbiAgICAgIHBsYXRmb3JtOiBidW5kbGVyUnVudGltZS5lc2J1aWxkUGxhdGZvcm0sXG4gICAgICB0YXJnZXQ6IGJ1bmRsZXJSdW50aW1lLmVzYnVpbGRUYXJnZXQsXG4gICAgICBleHRlcm5hbHM6IGJ1bmRsZXJSdW50aW1lLmRlZmF1bHRFeHRlcm5hbHMsXG4gICAgICBvdXRmaWxlOiBgZXh0ZW5zaW9ucy8ke25hbWV9YCxcbiAgICAgIC8vIE1ha2UgdGhlIG91dHB1dCBleGVjdXRhYmxlIGJlY2F1c2UgTGFtYmRhIGV4cGVjdHMgdG8gcnVuXG4gICAgICAvLyBleHRlbnNpb25zIGFzIHN0YW5kLWFsb25lIHByb2dyYW1zIGFsb25nc2lkZSB0aGUgbWFpbiBsYW1iZGFcbiAgICAgIC8vIHByb2Nlc3MuXG4gICAgICBleGVjdXRhYmxlOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucy5idW5kbGluZ09wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25zdHJ1Y3RGaWxlID1cbiAgICAgIG9wdGlvbnMuY29uc3RydWN0RmlsZSA/PyBgJHtiYXNlUGF0aH0tbGF5ZXItdmVyc2lvbi50c2A7XG5cbiAgICBuZXcgTGFtYmRhTGF5ZXJDb25zdHJ1Y3QocHJvamVjdCwge1xuICAgICAgY29uc3RydWN0RmlsZTogY29uc3RydWN0RmlsZSxcbiAgICAgIGNvbnN0cnVjdE5hbWU6IG9wdGlvbnMuY29uc3RydWN0TmFtZSxcbiAgICAgIGFzc2V0RGlyOiBidW5kbGUub3V0ZGlyLFxuICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBjb21wYXRpYmxlUnVudGltZXMsXG4gICAgICBkZXNjcmlwdGlvbjogYFByb3ZpZGVzIGEgTGFtYmRhIEV4dGVuc2lvbiBcXGAke25hbWV9XFxgIGZyb20gJHtjb252ZXJ0VG9Qb3NpeFBhdGgoXG4gICAgICAgIG9wdGlvbnMuZW50cnlwb2ludCxcbiAgICAgICl9YCxcbiAgICAgIGNka0RlcHM6IG9wdGlvbnMuY2RrRGVwcyxcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTGFtYmRhTGF5ZXJDb25zdHJ1Y3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgYXNzZXREaXI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29tcGF0aWJsZVJ1bnRpbWVzOiBMYW1iZGFSdW50aW1lW107XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnN0cnVjdEZpbGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY29uc3RydWN0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY2RrRGVwczogQXdzQ2RrRGVwcztcbn1cblxuY2xhc3MgTGFtYmRhTGF5ZXJDb25zdHJ1Y3QgZXh0ZW5kcyBTb3VyY2VDb2RlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTGFtYmRhTGF5ZXJDb25zdHJ1Y3RPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgb3B0aW9ucy5jb25zdHJ1Y3RGaWxlKTtcblxuICAgIGNvbnN0IHNyYyA9IHRoaXM7XG4gICAgY29uc3QgY2RrRGVwcyA9IG9wdGlvbnMuY2RrRGVwcztcblxuICAgIGNvbnN0IGNvbnN0cnVjdE5hbWUgPVxuICAgICAgb3B0aW9ucy5jb25zdHJ1Y3ROYW1lID8/IHBhc2NhbChiYXNlbmFtZShvcHRpb25zLmNvbnN0cnVjdEZpbGUsIFwiLnRzXCIpKTtcbiAgICBjb25zdCBwcm9wc1R5cGUgPSBgJHtjb25zdHJ1Y3ROYW1lfVByb3BzYDtcblxuICAgIGNvbnN0IGFzc2V0RGlyID0gcmVsYXRpdmUoZGlybmFtZShvcHRpb25zLmNvbnN0cnVjdEZpbGUpLCBvcHRpb25zLmFzc2V0RGlyKTtcblxuICAgIGlmIChzcmMubWFya2VyKSB7XG4gICAgICBzcmMubGluZShgLy8gJHtzcmMubWFya2VyfWApO1xuICAgIH1cbiAgICBzcmMubGluZShcImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XCIpO1xuXG4gICAgaWYgKGNka0RlcHMuY2RrTWFqb3JWZXJzaW9uID09PSAxKSB7XG4gICAgICBzcmMubGluZShcImltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcIik7XG4gICAgICBzcmMubGluZShcImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1wiKTtcbiAgICAgIGNka0RlcHMuYWRkVjFEZXBlbmRlbmNpZXMoXCJAYXdzLWNkay9hd3MtbGFtYmRhXCIpO1xuICAgICAgY2RrRGVwcy5hZGRWMURlcGVuZGVuY2llcyhcIkBhd3MtY2RrL2NvcmVcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNyYy5saW5lKFwiaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1wiKTtcbiAgICAgIHNyYy5saW5lKFwiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XCIpO1xuICAgIH1cblxuICAgIHNyYy5saW5lKCk7XG5cbiAgICBzcmMubGluZShcIi8qKlwiKTtcbiAgICBzcmMubGluZShgICogUHJvcHMgZm9yICR7Y29uc3RydWN0TmFtZX1gKTtcbiAgICBzcmMubGluZShcIiAqL1wiKTtcbiAgICBzcmMub3BlbihcbiAgICAgIGBleHBvcnQgaW50ZXJmYWNlICR7cHJvcHNUeXBlfSBleHRlbmRzIGxhbWJkYS5MYXllclZlcnNpb25PcHRpb25zIHtgLFxuICAgICk7XG4gICAgc3JjLmNsb3NlKFwifVwiKTtcbiAgICBzcmMubGluZSgpO1xuXG4gICAgc3JjLmxpbmUoXCIvKipcIik7XG4gICAgc3JjLmxpbmUoYCAqICR7b3B0aW9ucy5kZXNjcmlwdGlvbn1gKTtcbiAgICBzcmMubGluZShcIiAqL1wiKTtcbiAgICBzcmMub3BlbihgZXhwb3J0IGNsYXNzICR7Y29uc3RydWN0TmFtZX0gZXh0ZW5kcyBsYW1iZGEuTGF5ZXJWZXJzaW9uIHtgKTtcbiAgICBzcmMub3BlbihcbiAgICAgIGBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86ICR7cHJvcHNUeXBlfSkge2AsXG4gICAgKTtcblxuICAgIHNyYy5vcGVuKFwic3VwZXIoc2NvcGUsIGlkLCB7XCIpO1xuICAgIHNyYy5saW5lKGBkZXNjcmlwdGlvbjogJHtlbmNvZGVDb2RlU3RyaW5nKG9wdGlvbnMuZGVzY3JpcHRpb24pfSxgKTtcbiAgICBzcmMubGluZShcIi4uLnByb3BzLFwiKTtcblxuICAgIHNyYy5vcGVuKFwiY29tcGF0aWJsZVJ1bnRpbWVzOiBbXCIpO1xuICAgIGZvciAoY29uc3QgcnVudGltZSBvZiBvcHRpb25zLmNvbXBhdGlibGVSdW50aW1lcykge1xuICAgICAgc3JjLmxpbmUoXG4gICAgICAgIGBuZXcgbGFtYmRhLlJ1bnRpbWUoJyR7cnVudGltZS5mdW5jdGlvblJ1bnRpbWV9JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxgLFxuICAgICAgKTtcbiAgICB9XG4gICAgc3JjLmNsb3NlKFwiXSxcIik7XG5cbiAgICBzcmMub3BlbihgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsYCk7XG4gICAgc3JjLmxpbmUoYCR7ZW5jb2RlQ29kZVN0cmluZyhjb252ZXJ0VG9Qb3NpeFBhdGgoYXNzZXREaXIpKX0pKSxgKTtcbiAgICBzcmMuY2xvc2UoKTtcbiAgICBzcmMuY2xvc2UoXCJ9KTtcIik7XG5cbiAgICBzcmMuY2xvc2UoXCJ9XCIpO1xuICAgIHNyYy5jbG9zZShcIn1cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIGZvciBlbWJlZGRpbmcgaW4gc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUNvZGVTdHJpbmcodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICBjb25zdCBlc2NhcGVkU3RyaW5nID0ganNvbi5zdWJzdHJpbmcoMSwganNvbi5sZW5ndGggLSAxKS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIik7XG4gIHJldHVybiBgJyR7ZXNjYXBlZFN0cmluZ30nYDtcbn1cbiJdfQ==