cdk-nextjs-standalone
Version:
Deploy a NextJS app to AWS using CDK and OpenNext.
189 lines • 23.8 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NextjsBuild = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const child_process_1 = require("child_process");
const fs = require("fs");
const path = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const constants_1 = require("./constants");
const NextjsBucketDeployment_1 = require("./NextjsBucketDeployment");
const list_directories_1 = require("./utils/list-directories");
/**
* Build Next.js app.
*/
class NextjsBuild extends constructs_1.Construct {
/**
* Contains server code and dependencies.
*/
get nextServerFnDir() {
const dir = path.join(this.getNextBuildDir(), constants_1.NEXTJS_BUILD_SERVER_FN_DIR);
this.warnIfMissing(dir);
return dir;
}
/**
* Contains function for processessing image requests.
* Should be arm64.
*/
get nextImageFnDir() {
const fnPath = path.join(this.getNextBuildDir(), constants_1.NEXTJS_BUILD_IMAGE_FN_DIR);
this.warnIfMissing(fnPath);
return fnPath;
}
/**
* Contains function for processing items from revalidation queue.
*/
get nextRevalidateFnDir() {
const fnPath = path.join(this.getNextBuildDir(), constants_1.NEXTJS_BUILD_REVALIDATE_FN_DIR);
this.warnIfMissing(fnPath);
return fnPath;
}
/**
* Contains function for inserting revalidation items into the table.
*/
get nextRevalidateDynamoDBProviderFnDir() {
const fnPath = path.join(this.getNextBuildDir(), constants_1.NEXTJS_BUILD_DYNAMODB_PROVIDER_FN_DIR);
this.warnIfMissing(fnPath);
return fnPath;
}
/**
* Static files containing client-side code.
*/
get nextStaticDir() {
const dir = path.join(this.getNextBuildDir(), constants_1.NEXTJS_STATIC_DIR);
this.warnIfMissing(dir);
return dir;
}
/**
* Cache directory for generated data.
*/
get nextCacheDir() {
const dir = path.join(this.getNextBuildDir(), constants_1.NEXTJS_CACHE_DIR);
this.warnIfMissing(dir);
return dir;
}
constructor(scope, id, props) {
super(scope, id);
this.props = props;
this.validatePaths();
const bundlingRequired = aws_cdk_lib_1.Stack.of(this).bundlingRequired;
const skipBuild = this.props.skipBuild;
// for more info see docs/code-deployment-flow.md Conditional Build Logic section
if (bundlingRequired) {
// deploy/synth
if (skipBuild) {
this.assertBuildDirExists(true);
}
else {
this.build();
}
}
else {
// destroy
this.mockNextBuildDir();
}
}
/**
* Validate required paths/files for NextjsBuild
*/
validatePaths() {
const nextjsPath = this.props.nextjsPath;
// validate site path exists
if (!fs.existsSync(nextjsPath)) {
throw new Error(`Invalid nextjsPath ${nextjsPath} - directory does not exist at "${path.resolve(nextjsPath)}"`);
}
// Ensure that the site has a build script defined
if (!fs.existsSync(path.join(nextjsPath, 'package.json'))) {
throw new Error(`No package.json found at "${nextjsPath}".`);
}
const packageJson = JSON.parse(fs.readFileSync(path.join(nextjsPath, 'package.json'), 'utf8'));
if (!packageJson.scripts || !packageJson.scripts.build) {
throw new Error(`No "build" script found within package.json in "${nextjsPath}".`);
}
}
build() {
const buildPath = this.props.buildPath ?? this.props.nextjsPath;
const buildCommand = this.props.buildCommand ?? `npx /aws@^3 build`;
// run build
if (!this.props.quiet) {
console.debug(`Running "${buildCommand}" in`, buildPath);
}
// will throw if build fails - which is desired
(0, child_process_1.execSync)(buildCommand, {
cwd: buildPath,
stdio: this.props.quiet ? 'ignore' : 'inherit',
env: this.getBuildEnvVars(),
});
}
/**
* Gets environment variables for build time (when `open-next build` is called).
* Unresolved tokens are replace with placeholders like {{ TOKEN_NAME }} and
* will be resolved later in `NextjsBucketDeployment` custom resource.
*/
getBuildEnvVars() {
const env = {};
for (const [k, v] of Object.entries(process.env)) {
if (v) {
env[k] = v;
}
}
for (const [k, v] of Object.entries(this.props.environment || {})) {
// don't replace server only env vars for static assets
if (aws_cdk_lib_1.Token.isUnresolved(v) && k.startsWith('NEXT_PUBLIC_')) {
env[k] = NextjsBucketDeployment_1.NextjsBucketDeployment.getSubstitutionValue(k);
}
else {
env[k] = v;
}
}
return env;
}
readPublicFileList() {
if (!fs.existsSync(this.nextStaticDir))
return [];
return (0, list_directories_1.listDirectory)(this.nextStaticDir).map((file) => path.join('/', path.relative(this.nextStaticDir, file)));
}
assertBuildDirExists(throwIfMissing = true) {
const dir = this.getNextBuildDir();
if (!fs.existsSync(dir)) {
if (throwIfMissing) {
throw new Error(`Build directory "${dir}" does not exist. Try removing skipBuild: true option.`);
}
return false;
}
return true;
}
getNextBuildDir() {
const dir = path.resolve(this.props.nextjsPath, constants_1.NEXTJS_BUILD_DIR);
this.warnIfMissing(dir);
return dir;
}
warnIfMissing(dir) {
if (!fs.existsSync(dir)) {
console.warn(`Warning: ${dir} does not exist.`);
}
}
mockNextBuildDir() {
function createMockDirAndFile(dir) {
fs.mkdirSync(dir, { recursive: true });
fs.writeFileSync(path.join(dir, 'package.json'), '{}', 'utf8');
}
const buildDirExists = this.assertBuildDirExists(false);
if (!buildDirExists) {
// mock .open-next
createMockDirAndFile(this.getNextBuildDir());
createMockDirAndFile(this.nextServerFnDir);
createMockDirAndFile(this.nextImageFnDir);
createMockDirAndFile(this.nextRevalidateFnDir);
createMockDirAndFile(this.nextRevalidateDynamoDBProviderFnDir);
createMockDirAndFile(this.nextStaticDir);
createMockDirAndFile(this.nextCacheDir);
}
}
}
exports.NextjsBuild = NextjsBuild;
_a = JSII_RTTI_SYMBOL_1;
NextjsBuild[_a] = { fqn: "cdk-nextjs-standalone.NextjsBuild", version: "4.3.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzQnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvTmV4dGpzQnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBeUM7QUFDekMseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2Q0FBMkM7QUFDM0MsMkNBQXVDO0FBQ3ZDLDJDQVFxQjtBQUVyQixxRUFBa0U7QUFDbEUsK0RBQXlEO0FBaUN6RDs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBQ3hDOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLHNDQUEwQixDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRDs7O09BR0c7SUFDSCxJQUFXLGNBQWM7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUscUNBQXlCLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRDs7T0FFRztJQUNILElBQVcsbUJBQW1CO1FBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLDBDQUE4QixDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0Q7O09BRUc7SUFDSCxJQUFXLG1DQUFtQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFB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Q0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixTQUFTLG9CQUFvQixDQUFDLEdBQVc7WUFDdkMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2QyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixrQkFBa0I7WUFDbEIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDN0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzNDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMvQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUMvRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDOztBQWpMSCxrQ0FrTEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgTkVYVEpTX0JVSUxEX0RJUixcbiAgTkVYVEpTX0JVSUxEX0RZTkFNT0RCX1BST1ZJREVSX0ZOX0RJUixcbiAgTkVYVEpTX0JVSUxEX0lNQUdFX0ZOX0RJUixcbiAgTkVYVEpTX0JVSUxEX1JFVkFMSURBVEVfRk5fRElSLFxuICBORVhUSlNfQlVJTERfU0VSVkVSX0ZOX0RJUixcbiAgTkVYVEpTX0NBQ0hFX0RJUixcbiAgTkVYVEpTX1NUQVRJQ19ESVIsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHsgTmV4dGpzUHJvcHMgfSBmcm9tICcuL05leHRqcyc7XG5pbXBvcnQgeyBOZXh0anNCdWNrZXREZXBsb3ltZW50IH0gZnJvbSAnLi9OZXh0anNCdWNrZXREZXBsb3ltZW50JztcbmltcG9ydCB7IGxpc3REaXJlY3RvcnkgfSBmcm9tICcuL3V0aWxzL2xpc3QtZGlyZWN0b3JpZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzUHJvcHMuYnVpbGRDb21tYW5kfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kPzogTmV4dGpzUHJvcHNbJ2J1aWxkQ29tbWFuZCddO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzUHJvcHMuYnVpbGRQYXRofVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRQYXRoPzogTmV4dGpzUHJvcHNbJ2J1aWxkUGF0aCddO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzUHJvcHMuZW52aXJvbm1lbnR9XG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IE5leHRqc1Byb3BzWydlbnZpcm9ubWVudCddO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzUHJvcHMubmV4dGpzUGF0aH1cbiAgICovXG4gIHJlYWRvbmx5IG5leHRqc1BhdGg6IE5leHRqc1Byb3BzWyduZXh0anNQYXRoJ107XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNQcm9wcy5xdWlldH1cbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogTmV4dGpzUHJvcHNbJ3F1aWV0J107XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNQcm9wcy5za2lwQnVpbGR9XG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBOZXh0anNQcm9wc1snc2tpcEJ1aWxkJ107XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNQcm9wcy5zdHJlYW1pbmd9XG4gICAqL1xuICByZWFkb25seSBzdHJlYW1pbmc/OiBOZXh0anNQcm9wc1snc3RyZWFtaW5nJ107XG59XG5cbi8qKlxuICogQnVpbGQgTmV4dC5qcyBhcHAuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDb250YWlucyBzZXJ2ZXIgY29kZSBhbmQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHVibGljIGdldCBuZXh0U2VydmVyRm5EaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4odGhpcy5nZXROZXh0QnVpbGREaXIoKSwgTkVYVEpTX0JVSUxEX1NFUlZFUl9GTl9ESVIpO1xuICAgIHRoaXMud2FybklmTWlzc2luZyhkaXIpO1xuICAgIHJldHVybiBkaXI7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRhaW5zIGZ1bmN0aW9uIGZvciBwcm9jZXNzZXNzaW5nIGltYWdlIHJlcXVlc3RzLlxuICAgKiBTaG91bGQgYmUgYXJtNjQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRJbWFnZUZuRGlyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZm5QYXRoID0gcGF0aC5qb2luKHRoaXMuZ2V0TmV4dEJ1aWxkRGlyKCksIE5FWFRKU19CVUlMRF9JTUFHRV9GTl9ESVIpO1xuICAgIHRoaXMud2FybklmTWlzc2luZyhmblBhdGgpO1xuICAgIHJldHVybiBmblBhdGg7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRhaW5zIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGl0ZW1zIGZyb20gcmV2YWxpZGF0aW9uIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBuZXh0UmV2YWxpZGF0ZUZuRGlyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZm5QYXRoID0gcGF0aC5qb2luKHRoaXMuZ2V0TmV4dEJ1aWxkRGlyKCksIE5FWFRKU19CVUlMRF9SRVZBTElEQVRFX0ZOX0RJUik7XG4gICAgdGhpcy53YXJuSWZNaXNzaW5nKGZuUGF0aCk7XG4gICAgcmV0dXJuIGZuUGF0aDtcbiAgfVxuICAvKipcbiAgICogQ29udGFpbnMgZnVuY3Rpb24gZm9yIGluc2VydGluZyByZXZhbGlkYXRpb24gaXRlbXMgaW50byB0aGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRSZXZhbGlkYXRlRHluYW1vREJQcm92aWRlckZuRGlyKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZm5QYXRoID0gcGF0aC5qb2luKHRoaXMuZ2V0TmV4dEJ1aWxkRGlyKCksIE5FWFRKU19CVUlMRF9EWU5BTU9EQl9QUk9WSURFUl9GTl9ESVIpO1xuICAgIHRoaXMud2FybklmTWlzc2luZyhmblBhdGgpO1xuICAgIHJldHVybiBmblBhdGg7XG4gIH1cbiAgLyoqXG4gICAqIFN0YXRpYyBmaWxlcyBjb250YWluaW5nIGNsaWVudC1zaWRlIGNvZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRTdGF0aWNEaXIoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4odGhpcy5nZXROZXh0QnVpbGREaXIoKSwgTkVYVEpTX1NUQVRJQ19ESVIpO1xuICAgIHRoaXMud2FybklmTWlzc2luZyhkaXIpO1xuICAgIHJldHVybiBkaXI7XG4gIH1cbiAgLyoqXG4gICAqIENhY2hlIGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRDYWNoZURpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpciA9IHBhdGguam9pbih0aGlzLmdldE5leHRCdWlsZERpcigpLCBORVhUSlNfQ0FDSEVfRElSKTtcbiAgICB0aGlzLndhcm5JZk1pc3NpbmcoZGlyKTtcbiAgICByZXR1cm4gZGlyO1xuICB9XG5cbiAgcHVibGljIHByb3BzOiBOZXh0anNCdWlsZFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy52YWxpZGF0ZVBhdGhzKCk7XG5cbiAgICBjb25zdCBidW5kbGluZ1JlcXVpcmVkID0gU3RhY2sub2YodGhpcykuYnVuZGxpbmdSZXF1aXJlZDtcbiAgICBjb25zdCBza2lwQnVpbGQgPSB0aGlzLnByb3BzLnNraXBCdWlsZDtcblxuICAgIC8vIGZvciBtb3JlIGluZm8gc2VlIGRvY3MvY29kZS1kZXBsb3ltZW50LWZsb3cubWQgQ29uZGl0aW9uYWwgQnVpbGQgTG9naWMgc2VjdGlvblxuICAgIGlmIChidW5kbGluZ1JlcXVpcmVkKSB7XG4gICAgICAvLyBkZXBsb3kvc3ludGhcbiAgICAgIGlmIChza2lwQnVpbGQpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCdWlsZERpckV4aXN0cyh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVzdHJveVxuICAgICAgdGhpcy5tb2NrTmV4dEJ1aWxkRGlyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHJlcXVpcmVkIHBhdGhzL2ZpbGVzIGZvciBOZXh0anNCdWlsZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhdGhzKCkge1xuICAgIGNvbnN0IG5leHRqc1BhdGggPSB0aGlzLnByb3BzLm5leHRqc1BhdGg7XG4gICAgLy8gdmFsaWRhdGUgc2l0ZSBwYXRoIGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhuZXh0anNQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHRqc1BhdGggJHtuZXh0anNQYXRofSAtIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBhdCBcIiR7cGF0aC5yZXNvbHZlKG5leHRqc1BhdGgpfVwiYCk7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzaXRlIGhhcyBhIGJ1aWxkIHNjcmlwdCBkZWZpbmVkXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihuZXh0anNQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhY2thZ2UuanNvbiBmb3VuZCBhdCBcIiR7bmV4dGpzUGF0aH1cIi5gKTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4obmV4dGpzUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcbiAgICBpZiAoIXBhY2thZ2VKc29uLnNjcmlwdHMgfHwgIXBhY2thZ2VKc29uLnNjcmlwdHMuYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gXCJidWlsZFwiIHNjcmlwdCBmb3VuZCB3aXRoaW4gcGFja2FnZS5qc29uIGluIFwiJHtuZXh0anNQYXRofVwiLmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGQoKSB7XG4gICAgY29uc3QgYnVpbGRQYXRoID0gdGhpcy5wcm9wcy5idWlsZFBhdGggPz8gdGhpcy5wcm9wcy5uZXh0anNQYXRoO1xuICAgIGNvbnN0IGJ1aWxkQ29tbWFuZCA9IHRoaXMucHJvcHMuYnVpbGRDb21tYW5kID8/IGBucHggQG9wZW5uZXh0anMvYXdzQF4zIGJ1aWxkYDtcbiAgICAvLyBydW4gYnVpbGRcbiAgICBpZiAoIXRoaXMucHJvcHMucXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFJ1bm5pbmcgXCIke2J1aWxkQ29tbWFuZH1cIiBpbmAsIGJ1aWxkUGF0aCk7XG4gICAgfVxuICAgIC8vIHdpbGwgdGhyb3cgaWYgYnVpbGQgZmFpbHMgLSB3aGljaCBpcyBkZXNpcmVkXG4gICAgZXhlY1N5bmMoYnVpbGRDb21tYW5kLCB7XG4gICAgICBjd2Q6IGJ1aWxkUGF0aCxcbiAgICAgIHN0ZGlvOiB0aGlzLnByb3BzLnF1aWV0ID8gJ2lnbm9yZScgOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHRoaXMuZ2V0QnVpbGRFbnZWYXJzKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkIHRpbWUgKHdoZW4gYG9wZW4tbmV4dCBidWlsZGAgaXMgY2FsbGVkKS5cbiAgICogVW5yZXNvbHZlZCB0b2tlbnMgYXJlIHJlcGxhY2Ugd2l0aCBwbGFjZWhvbGRlcnMgbGlrZSB7eyBUT0tFTl9OQU1FIH19IGFuZFxuICAgKiB3aWxsIGJlIHJlc29sdmVkIGxhdGVyIGluIGBOZXh0anNCdWNrZXREZXBsb3ltZW50YCBjdXN0b20gcmVzb3VyY2UuXG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWxkRW52VmFycygpIHtcbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIGVudltrXSA9IHY7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJvcHMuZW52aXJvbm1lbnQgfHwge30pKSB7XG4gICAgICAvLyBkb24ndCByZXBsYWNlIHNlcnZlciBvbmx5IGVudiB2YXJzIGZvciBzdGF0aWMgYXNzZXRzXG4gICAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHYpICYmIGsuc3RhcnRzV2l0aCgnTkVYVF9QVUJMSUNfJykpIHtcbiAgICAgICAgZW52W2tdID0gTmV4dGpzQnVja2V0RGVwbG95bWVudC5nZXRTdWJzdGl0dXRpb25WYWx1ZShrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudltrXSA9IHY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnY7XG4gIH1cblxuICByZWFkUHVibGljRmlsZUxpc3QoKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMubmV4dFN0YXRpY0RpcikpIHJldHVybiBbXTtcbiAgICByZXR1cm4gbGlzdERpcmVjdG9yeSh0aGlzLm5leHRTdGF0aWNEaXIpLm1hcCgoZmlsZSkgPT4gcGF0aC5qb2luKCcvJywgcGF0aC5yZWxhdGl2ZSh0aGlzLm5leHRTdGF0aWNEaXIsIGZpbGUpKSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydEJ1aWxkRGlyRXhpc3RzKHRocm93SWZNaXNzaW5nID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRpciA9IHRoaXMuZ2V0TmV4dEJ1aWxkRGlyKCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHtcbiAgICAgIGlmICh0aHJvd0lmTWlzc2luZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1aWxkIGRpcmVjdG9yeSBcIiR7ZGlyfVwiIGRvZXMgbm90IGV4aXN0LiBUcnkgcmVtb3Zpbmcgc2tpcEJ1aWxkOiB0cnVlIG9wdGlvbi5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRCdWlsZERpcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZSh0aGlzLnByb3BzLm5leHRqc1BhdGgsIE5FWFRKU19CVUlMRF9ESVIpO1xuICAgIHRoaXMud2FybklmTWlzc2luZyhkaXIpO1xuICAgIHJldHVybiBkaXI7XG4gIH1cblxuICBwcml2YXRlIHdhcm5JZk1pc3NpbmcoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiAke2Rpcn0gZG9lcyBub3QgZXhpc3QuYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb2NrTmV4dEJ1aWxkRGlyKCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU1vY2tEaXJBbmRGaWxlKGRpcjogc3RyaW5nKSB7XG4gICAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLCAne30nLCAndXRmOCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkRGlyRXhpc3RzID0gdGhpcy5hc3NlcnRCdWlsZERpckV4aXN0cyhmYWxzZSk7XG4gICAgaWYgKCFidWlsZERpckV4aXN0cykge1xuICAgICAgLy8gbW9jayAub3Blbi1uZXh0XG4gICAgICBjcmVhdGVNb2NrRGlyQW5kRmlsZSh0aGlzLmdldE5leHRCdWlsZERpcigpKTtcbiAgICAgIGNyZWF0ZU1vY2tEaXJBbmRGaWxlKHRoaXMubmV4dFNlcnZlckZuRGlyKTtcbiAgICAgIGNyZWF0ZU1vY2tEaXJBbmRGaWxlKHRoaXMubmV4dEltYWdlRm5EaXIpO1xuICAgICAgY3JlYXRlTW9ja0RpckFuZEZpbGUodGhpcy5uZXh0UmV2YWxpZGF0ZUZuRGlyKTtcbiAgICAgIGNyZWF0ZU1vY2tEaXJBbmRGaWxlKHRoaXMubmV4dFJldmFsaWRhdGVEeW5hbW9EQlByb3ZpZGVyRm5EaXIpO1xuICAgICAgY3JlYXRlTW9ja0RpckFuZEZpbGUodGhpcy5uZXh0U3RhdGljRGlyKTtcbiAgICAgIGNyZWF0ZU1vY2tEaXJBbmRGaWxlKHRoaXMubmV4dENhY2hlRGlyKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==