UNPKG

cdk-nextjs-standalone

Version:

Deploy a NextJS app to AWS using CDK and OpenNext.

122 lines 22 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Nextjs = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const constructs_1 = require("constructs"); const NextjsBuild_1 = require("./NextjsBuild"); const NextjsDistribution_1 = require("./NextjsDistribution"); const NextjsDomain_1 = require("./NextjsDomain"); const NextjsImage_1 = require("./NextjsImage"); const NextjsInvalidation_1 = require("./NextjsInvalidation"); const NextjsRevalidation_1 = require("./NextjsRevalidation"); const NextjsServer_1 = require("./NextjsServer"); const NextjsStaticAssets_1 = require("./NextjsStaticAssets"); /** * The `Nextjs` construct is a higher level construct that makes it easy to create a NextJS app. * * Your standalone server application will be bundled using o(utput tracing and will be deployed to a Lambda function. * Static assets will be deployed to an S3 bucket and served via CloudFront. * You must use Next.js 10.3.0 or newer. * * Please provide a `nextjsPath` to the Next.js app inside your project. * * @example * new Nextjs(this, "Web", { * nextjsPath: path.resolve("packages/web"), * }) */ class Nextjs extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.props = props; // build nextjs app this.nextBuild = new NextjsBuild_1.NextjsBuild(this, 'Build', { nextjsPath: props.nextjsPath, buildCommand: props.buildCommand, buildPath: props.buildPath, environment: props.environment, quiet: props.quiet, skipBuild: props.skipBuild, streaming: props.streaming, ...props.overrides?.nextjs?.nextjsBuildProps, }); // deploy nextjs static assets to s3 this.staticAssets = new NextjsStaticAssets_1.NextjsStaticAssets(this, 'StaticAssets', { basePath: props.basePath, environment: props.environment, nextBuild: this.nextBuild, overrides: props.overrides?.nextjsStaticAssets, ...props.overrides?.nextjs?.nextjsStaticAssetsProps, }); this.serverFunction = new NextjsServer_1.NextjsServer(this, 'Server', { environment: props.environment, nextBuild: this.nextBuild, staticAssetBucket: this.staticAssets.bucket, overrides: props.overrides?.nextjsServer, ...props.overrides?.nextjs?.nextjsServerProps, }); // build image optimization this.imageOptimizationFunction = new NextjsImage_1.NextjsImage(this, 'Image', { bucket: props.imageOptimizationBucket || this.bucket, nextBuild: this.nextBuild, overrides: props.overrides?.nextjsImage, ...props.overrides?.nextjs?.nextjsImageProps, }); // build revalidation queue and handler function this.revalidation = new NextjsRevalidation_1.NextjsRevalidation(this, 'Revalidation', { nextBuild: this.nextBuild, serverFunction: this.serverFunction, overrides: props.overrides?.nextjsRevalidation, ...props.overrides?.nextjs?.nextjsRevalidationProps, }); if (this.props.domainProps) { this.domain = new NextjsDomain_1.NextjsDomain(this, 'Domain', { ...this.props.domainProps, overrides: props.overrides?.nextjsDomain, ...props.overrides?.nextjs?.nextjsDomainProps, }); } this.distribution = new NextjsDistribution_1.NextjsDistribution(this, 'Distribution', { nextjsPath: props.nextjsPath, basePath: props.basePath, distribution: props.distribution, streaming: props.streaming, staticAssetsBucket: this.staticAssets.bucket, nextBuild: this.nextBuild, nextDomain: this.domain, serverFunction: this.serverFunction.lambdaFunction, imageOptFunction: this.imageOptimizationFunction, overrides: props.overrides?.nextjsDistribution, ...props.overrides?.nextjs?.nextjsDistributionProps, }); if (this.domain) { this.domain.createDnsRecords(this.distribution.distribution); } if (!this.props.skipFullInvalidation) { new NextjsInvalidation_1.NextjsInvalidation(this, 'Invalidation', { distribution: this.distribution.distribution, dependencies: [], // [this.staticAssets, this.serverFunction, this.imageOptimizationFunction] overrides: props.overrides?.nextjsInvalidation, ...props.overrides?.nextjs?.nextjsInvalidationProps, }); } } /** * URL of Next.js App. */ get url() { const customDomain = this.props.domainProps?.domainName; return customDomain ? `https://${customDomain}` : this.distribution.url; } /** * Convenience method to access `Nextjs.staticAssets.bucket`. */ get bucket() { return this.staticAssets.bucket; } } exports.Nextjs = Nextjs; _a = JSII_RTTI_SYMBOL_1; Nextjs[_a] = { fqn: "cdk-nextjs-standalone.Nextjs", version: "4.2.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLDJDQUF1QztBQVd2QywrQ0FBNEM7QUFDNUMsNkRBQTBEO0FBQzFELGlEQUFpRTtBQUNqRSwrQ0FBNEM7QUFDNUMsNkRBQTBEO0FBRTFELDZEQUEwRDtBQUMxRCxpREFBOEM7QUFDOUMsNkRBQTBEO0FBdUYxRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsc0JBQVM7SUFpQ25DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQVksS0FBa0I7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQURpQyxVQUFLLEdBQUwsS0FBSyxDQUFhO1FBR3BFLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQzlDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1lBQzFCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLGdCQUFnQjtTQUM3QyxDQUFDLENBQUM7UUFFSCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHVDQUFrQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDL0QsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNB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QyxJQUFJLHVDQUFrQixDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7Z0JBQzNDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVk7Z0JBQzVDLFlBQVksRUFBRSxFQUFFLEVBQUUsMkVBQTJFO2dCQUM3RixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxrQkFBa0I7Z0JBQzlDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsdUJBQXVCO2FBQ3BELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLEdBQUc7UUFDWixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUM7UUFDeEQsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQzs7QUEvSEgsd0JBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlzdHJpYnV0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbiAgT3B0aW9uYWxOZXh0anNEb21haW5Qcm9wcyxcbiAgT3B0aW9uYWxOZXh0anNJbWFnZVByb3BzLFxuICBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzLFxuICBPcHRpb25hbE5leHRqc1JldmFsaWRhdGlvblByb3BzLFxuICBPcHRpb25hbE5leHRqc1NlcnZlclByb3BzLFxuICBPcHRpb25hbE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzLFxufSBmcm9tICcuL2dlbmVyYXRlZC1zdHJ1Y3RzJztcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcyB9IGZyb20gJy4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzJztcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSAnLi9OZXh0anNCdWlsZCc7XG5pbXBvcnQgeyBOZXh0anNEaXN0cmlidXRpb24gfSBmcm9tICcuL05leHRqc0Rpc3RyaWJ1dGlvbic7XG5pbXBvcnQgeyBOZXh0anNEb21haW4sIE5leHRqc0RvbWFpblByb3BzIH0gZnJvbSAnLi9OZXh0anNEb21haW4nO1xuaW1wb3J0IHsgTmV4dGpzSW1hZ2UgfSBmcm9tICcuL05leHRqc0ltYWdlJztcbmltcG9ydCB7IE5leHRqc0ludmFsaWRhdGlvbiB9IGZyb20gJy4vTmV4dGpzSW52YWxpZGF0aW9uJztcbmltcG9ydCB7IE5leHRqc092ZXJyaWRlcyB9IGZyb20gJy4vTmV4dGpzT3ZlcnJpZGVzJztcbmltcG9ydCB7IE5leHRqc1JldmFsaWRhdGlvbiB9IGZyb20gJy4vTmV4dGpzUmV2YWxpZGF0aW9uJztcbmltcG9ydCB7IE5leHRqc1NlcnZlciB9IGZyb20gJy4vTmV4dGpzU2VydmVyJztcbmltcG9ydCB7IE5leHRqc1N0YXRpY0Fzc2V0cyB9IGZyb20gJy4vTmV4dGpzU3RhdGljQXNzZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNCdWlsZFByb3BzPzogT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHNQcm9wcz86IE9wdGlvbmFsTmV4dGpzU3RhdGljQXNzZXRzUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc1NlcnZlclByb3BzPzogT3B0aW9uYWxOZXh0anNTZXJ2ZXJQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzSW1hZ2VQcm9wcz86IE9wdGlvbmFsTmV4dGpzSW1hZ2VQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzUmV2YWxpZGF0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc1JldmFsaWRhdGlvblByb3BzO1xuICByZWFkb25seSBuZXh0anNEb21haW5Qcm9wcz86IE9wdGlvbmFsTmV4dGpzRG9tYWluUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvblByb3BzPzogT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzSW52YWxpZGF0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1Byb3BzIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHZhbHVlIHRvIHByZWZpeCB0aGUgTmV4dC5qcyBzaXRlIHVuZGVyIGEgL3ByZWZpeCBwYXRoIG9uIENsb3VkRnJvbnQuXG4gICAqIFVzdWFsbHkgdXNlZCB3aGVuIHlvdSBkZXBsb3kgbXVsdGlwbGUgTmV4dC5qcyBzaXRlcyBvbiBzYW1lIGRvbWFpbiB1c2luZyAvc3ViLXBhdGhcbiAgICpcbiAgICogTm90ZSwgeW91J2xsIG5lZWQgdG8gc2V0IFtiYXNlUGF0aF0oaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvYmFzZVBhdGgpXG4gICAqIGluIHlvdXIgYG5leHQuY29uZmlnLnRzYCB0byB0aGlzIHZhbHVlIGFuZCBlbnN1cmUgYW55IGZpbGVzIGluIGBwdWJsaWNgXG4gICAqIGZvbGRlciBoYXZlIGNvcnJlY3QgcHJlZml4LlxuICAgKiBAZXhhbXBsZSBcIi9teS1iYXNlLXBhdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBidWlsZCBjb21tYW5kIG92ZXJyaWRlIHZhbHVlLlxuICAgKiBAZGVmYXVsdCAnbnB4IEBvcGVubmV4dGpzL2F3c0BeMyBidWlsZCdcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgdG8gZXhlY3V0ZSBgbnBtIHJ1biBidWlsZGAgZnJvbS4gQnkgZGVmYXVsdCwgaXQgaXMgYG5leHRqc1BhdGhgLlxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiwgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgbW9ub3JlcG9zIHdoZXJlIGBidWlsZGAgaXMgZXhwZWN0ZWQgdG8gcnVuXG4gICAqIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gY3JlYXRlZCBvdXRzaWRlIG9mIHRoaXMgY29uc3RydWN0IHRoYXQgd2lsbFxuICAgKiBiZSB1c2VkIHRvIGFkZCBOZXh0LmpzIGJlaGF2aW9ycyBhbmQgb3JpZ2lucyBvbnRvLiBVc2VmdWwgd2l0aCBgYmFzZVBhdGhgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogUHJvcHMgdG8gY29uZmlndXJlIHtAbGluayBOZXh0anNEb21haW59LiBTZWUgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGF0XG4gICAqIHtAbGluayBOZXh0anNEb21haW5Qcm9wc31cbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpblByb3BzPzogTmV4dGpzRG9tYWluUHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIE5leHRKUyBidWlsZCAqKmFuZCoqIHJ1bnRpbWUuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBTMyBCdWNrZXQgdG8gdXNlLCBkZWZhdWx0cyB0byBhc3NldHMgYnVja2V0XG4gICAqL1xuICByZWFkb25seSBpbWFnZU9wdGltaXphdGlvbkJ1Y2tldD86IHMzLklCdWNrZXQ7XG4gIC8qKlxuICAgKiBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHRKUyBwcm9qZWN0IGlzIGxvY2F0ZWQuXG4gICAqIENhbiBiZSB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QgKGAuYCkgb3IgYSBzdWJkaXJlY3RvcnkgKGBwYWNrYWdlcy93ZWJgKS5cbiAgICovXG4gIHJlYWRvbmx5IG5leHRqc1BhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuIEVuYWJsZXMgZGVlcCBjdXN0b21pemF0aW9uLiBVc2Ugd2l0aCBjYXV0aW9uIGFzXG4gICAqIHlvdSBjYW4gb3ZlcnJpZGUgYWxsIHByb3BzLiBSZWNvbW1lbmQgcmV2aWV3aW5nIHNvdXJjZSBjb2RlIHRvIHNlZSBwcm9wc1xuICAgKiB5b3UnbGwgYmUgb3ZlcnJpZGluZyBiZWZvcmUgdXNpbmcuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBMZXNzIGJ1aWxkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNraXBzIHJ1bm5pbmcgTmV4dC5qcyBidWlsZC4gVXNlZnVsIGlmIHlvdSB3YW50IHRvIGRlcGxveSBgTmV4dGpzYCBidXRcbiAgICogaGF2ZW4ndCBtYWRlIGFueSBjaGFuZ2VzIHRvIE5leHQuanMgYXBwIGNvZGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQnkgZGVmYXVsdCBhbGwgQ2xvdWRGcm9udCBjYWNoZSB3aWxsIGJlIGludmFsaWRhdGVkIG9uIGRlcGxveW1lbnQuXG4gICAqIFRoaXMgY2FuIGJlIHNldCB0byB0cnVlIHRvIHNraXAgdGhlIGZ1bGwgY2FjaGUgaW52YWxpZGF0aW9uLCB3aGljaFxuICAgKiBjb3VsZCBiZSBpbXBvcnRhbnQgZm9yIHNvbWUgdXNlcnMuXG4gICAqL1xuICByZWFkb25seSBza2lwRnVsbEludmFsaWRhdGlvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHJlYW1pbmcgYWxsb3dzIHlvdSB0byBzZW5kIGRhdGEgdG8gdGhlIGNsaWVudCBhcyBpdCdzIGdlbmVyYXRlZFxuICAgKiBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBlbnRpcmUgcmVzcG9uc2UgdG8gYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgYE5leHRqc2AgY29uc3RydWN0IGlzIGEgaGlnaGVyIGxldmVsIGNvbnN0cnVjdCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gY3JlYXRlIGEgTmV4dEpTIGFwcC5cbiAqXG4gKiBZb3VyIHN0YW5kYWxvbmUgc2VydmVyIGFwcGxpY2F0aW9uIHdpbGwgYmUgYnVuZGxlZCB1c2luZyBvKHV0cHV0IHRyYWNpbmcgYW5kIHdpbGwgYmUgZGVwbG95ZWQgdG8gYSBMYW1iZGEgZnVuY3Rpb24uXG4gKiBTdGF0aWMgYXNzZXRzIHdpbGwgYmUgZGVwbG95ZWQgdG8gYW4gUzMgYnVja2V0IGFuZCBzZXJ2ZWQgdmlhIENsb3VkRnJvbnQuXG4gKiBZb3UgbXVzdCB1c2UgTmV4dC5qcyAxMC4zLjAgb3IgbmV3ZXIuXG4gKlxuICogUGxlYXNlIHByb3ZpZGUgYSBgbmV4dGpzUGF0aGAgdG8gdGhlIE5leHQuanMgYXBwIGluc2lkZSB5b3VyIHByb2plY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIG5ldyBOZXh0anModGhpcywgXCJXZWJcIiwge1xuICogICBuZXh0anNQYXRoOiBwYXRoLnJlc29sdmUoXCJwYWNrYWdlcy93ZWJcIiksXG4gKiB9KVxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBtYWluIE5leHRKUyBzZXJ2ZXIgaGFuZGxlciBsYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgc2VydmVyRnVuY3Rpb246IE5leHRqc1NlcnZlcjtcbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBvcHRpbWl6YXRpb24gaGFuZGxlciBsYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgaW1hZ2VPcHRpbWl6YXRpb25GdW5jdGlvbjogTmV4dGpzSW1hZ2U7XG4gIC8qKlxuICAgKiBCdWlsdCBOZXh0SlMgcHJvamVjdCBvdXRwdXQuXG4gICAqL1xuICBwdWJsaWMgbmV4dEJ1aWxkOiBOZXh0anNCdWlsZDtcbiAgLyoqXG4gICAqIEFzc2V0IGRlcGxveW1lbnQgdG8gUzMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljQXNzZXRzOiBOZXh0anNTdGF0aWNBc3NldHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBSb3V0ZTUzIEhvc3RlZCBab25lLCBBQ00gQ2VydGlmaWNhdGUsIGFuZCBSb3V0ZTUzIEROUyBSZWNvcmRzXG4gICAqL1xuICBwdWJsaWMgZG9tYWluPzogTmV4dGpzRG9tYWluO1xuICAvKipcbiAgICogQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICBwdWJsaWMgZGlzdHJpYnV0aW9uOiBOZXh0anNEaXN0cmlidXRpb247XG4gIC8qKlxuICAgKiBSZXZhbGlkYXRpb24gaGFuZGxlciBhbmQgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgcmV2YWxpZGF0aW9uOiBOZXh0anNSZXZhbGlkYXRpb247XG5cbiAgcHVibGljIGxhbWJkYUZ1bmN0aW9uVXJsITogbGFtYmRhLkZ1bmN0aW9uVXJsO1xuICBwdWJsaWMgaW1hZ2VPcHRpbWl6YXRpb25MYW1iZGFGdW5jdGlvblVybCE6IGxhbWJkYS5GdW5jdGlvblVybDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm90ZWN0ZWQgcHJvcHM6IE5leHRqc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIGJ1aWxkIG5leHRqcyBhcHBcbiAgICB0aGlzLm5leHRCdWlsZCA9IG5ldyBOZXh0anNCdWlsZCh0aGlzLCAnQnVpbGQnLCB7XG4gICAgICBuZXh0anNQYXRoOiBwcm9wcy5uZXh0anNQYXRoLFxuICAgICAgYnVpbGRDb21tYW5kOiBwcm9wcy5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZFBhdGg6IHByb3BzLmJ1aWxkUGF0aCxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIHF1aWV0OiBwcm9wcy5xdWlldCxcbiAgICAgIHNraXBCdWlsZDogcHJvcHMuc2tpcEJ1aWxkLFxuICAgICAgc3RyZWFtaW5nOiBwcm9wcy5zdHJlYW1pbmcsXG4gICAgICAuLi5wcm9wcy5vdmVycmlkZXM/Lm5leHRqcz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcblxuICAgIC8vIGRlcGxveSBuZXh0anMgc3RhdGljIGFzc2V0cyB0byBzM1xuICAgIHRoaXMuc3RhdGljQXNzZXRzID0gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyh0aGlzLCAnU3RhdGljQXNzZXRzJywge1xuICAgICAgYmFzZVBhdGg6IHByb3BzLmJhc2VQYXRoLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgbmV4dEJ1aWxkOiB0aGlzLm5leHRCdWlsZCxcbiAgICAgIG92ZXJyaWRlczogcHJvcHMub3ZlcnJpZGVzPy5uZXh0anNTdGF0aWNBc3NldHMsXG4gICAgICAuLi5wcm9wcy5vdmVycmlkZXM/Lm5leHRqcz8ubmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNlcnZlckZ1bmN0aW9uID0gbmV3IE5leHRqc1NlcnZlcih0aGlzLCAnU2VydmVyJywge1xuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgbmV4dEJ1aWxkOiB0aGlzLm5leHRCdWlsZCxcbiAgICAgIHN0YXRpY0Fzc2V0QnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBvdmVycmlkZXM6IHByb3BzLm92ZXJyaWRlcz8ubmV4dGpzU2VydmVyLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVzPy5uZXh0anM/Lm5leHRqc1NlcnZlclByb3BzLFxuICAgIH0pO1xuICAgIC8vIGJ1aWxkIGltYWdlIG9wdGltaXphdGlvblxuICAgIHRoaXMuaW1hZ2VPcHRpbWl6YXRpb25GdW5jdGlvbiA9IG5ldyBOZXh0anNJbWFnZSh0aGlzLCAnSW1hZ2UnLCB7XG4gICAgICBidWNrZXQ6IHByb3BzLmltYWdlT3B0aW1pemF0aW9uQnVja2V0IHx8IHRoaXMuYnVja2V0LFxuICAgICAgbmV4dEJ1aWxkOiB0aGlzLm5leHRCdWlsZCxcbiAgICAgIG92ZXJyaWRlczogcHJvcHMub3ZlcnJpZGVzPy5uZXh0anNJbWFnZSxcbiAgICAgIC4uLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzPy5uZXh0anNJbWFnZVByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gYnVpbGQgcmV2YWxpZGF0aW9uIHF1ZXVlIGFuZCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgdGhpcy5yZXZhbGlkYXRpb24gPSBuZXcgTmV4dGpzUmV2YWxpZGF0aW9uKHRoaXMsICdSZXZhbGlkYXRpb24nLCB7XG4gICAgICBuZXh0QnVpbGQ6IHRoaXMubmV4dEJ1aWxkLFxuICAgICAgc2VydmVyRnVuY3Rpb246IHRoaXMuc2VydmVyRnVuY3Rpb24sXG4gICAgICBvdmVycmlkZXM6IHByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmV2YWxpZGF0aW9uLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVzPy5uZXh0anM/Lm5leHRqc1JldmFsaWRhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZG9tYWluUHJvcHMpIHtcbiAgICAgIHRoaXMuZG9tYWluID0gbmV3IE5leHRqc0RvbWFpbih0aGlzLCAnRG9tYWluJywge1xuICAgICAgICAuLi50aGlzLnByb3BzLmRvbWFpblByb3BzLFxuICAgICAgICBvdmVycmlkZXM6IHByb3BzLm92ZXJyaWRlcz8ubmV4dGpzRG9tYWluLFxuICAgICAgICAuLi5wcm9wcy5vdmVycmlkZXM/Lm5leHRqcz8ubmV4dGpzRG9tYWluUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHRoaXMsICdEaXN0cmlidXRpb24nLCB7XG4gICAgICBuZXh0anNQYXRoOiBwcm9wcy5uZXh0anNQYXRoLFxuICAgICAgYmFzZVBhdGg6IHByb3BzLmJhc2VQYXRoLFxuICAgICAgZGlzdHJpYnV0aW9uOiBwcm9wcy5kaXN0cmlidXRpb24sXG4gICAgICBzdHJlYW1pbmc6IHByb3BzLnN0cmVhbWluZyxcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogdGhpcy5zdGF0aWNBc3NldHMuYnVja2V0LFxuICAgICAgbmV4dEJ1aWxkOiB0aGlzLm5leHRCdWlsZCxcbiAgICAgIG5leHREb21haW46IHRoaXMuZG9tYWluLFxuICAgICAgc2VydmVyRnVuY3Rpb246IHRoaXMuc2VydmVyRnVuY3Rpb24ubGFtYmRhRnVuY3Rpb24sXG4gICAgICBpbWFnZU9wdEZ1bmN0aW9uOiB0aGlzLmltYWdlT3B0aW1pemF0aW9uRnVuY3Rpb24sXG4gICAgICBvdmVycmlkZXM6IHByb3BzLm92ZXJyaWRlcz8ubmV4dGpzRGlzdHJpYnV0aW9uLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVzPy5uZXh0anM/Lm5leHRqc0Rpc3RyaWJ1dGlvblByb3BzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLmRvbWFpbikge1xuICAgICAgdGhpcy5kb21haW4uY3JlYXRlRG5zUmVjb3Jkcyh0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wcm9wcy5za2lwRnVsbEludmFsaWRhdGlvbikge1xuICAgICAgbmV3IE5leHRqc0ludmFsaWRhdGlvbih0aGlzLCAnSW52YWxpZGF0aW9uJywge1xuICAgICAgICBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBbXSwgLy8gW3RoaXMuc3RhdGljQXNzZXRzLCB0aGlzLnNlcnZlckZ1bmN0aW9uLCB0aGlzLmltYWdlT3B0aW1pemF0aW9uRnVuY3Rpb25dXG4gICAgICAgIG92ZXJyaWRlczogcHJvcHMub3ZlcnJpZGVzPy5uZXh0anNJbnZhbGlkYXRpb24sXG4gICAgICAgIC4uLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzPy5uZXh0anNJbnZhbGlkYXRpb25Qcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVUkwgb2YgTmV4dC5qcyBBcHAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IHRoaXMucHJvcHMuZG9tYWluUHJvcHM/LmRvbWFpbk5hbWU7XG4gICAgcmV0dXJuIGN1c3RvbURvbWFpbiA/IGBodHRwczovLyR7Y3VzdG9tRG9tYWlufWAgOiB0aGlzLmRpc3RyaWJ1dGlvbi51cmw7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFjY2VzcyBgTmV4dGpzLnN0YXRpY0Fzc2V0cy5idWNrZXRgLlxuICAgKi9cbiAgcHVibGljIGdldCBidWNrZXQoKTogczMuSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRzLmJ1Y2tldDtcbiAgfVxufVxuIl19