UNPKG

cdk-nextjs-standalone

Version:

Deploy a NextJS app to AWS using CDK and OpenNext.

92 lines 14.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.NextjsStaticAssets = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("node:fs"); const node_os_1 = require("node:os"); const node_path_1 = require("node:path"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const s3 = require("aws-cdk-lib/aws-s3"); const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets"); const constructs_1 = require("constructs"); const constants_1 = require("./constants"); const NextjsBucketDeployment_1 = require("./NextjsBucketDeployment"); /** * Uploads Nextjs built static and public files to S3. * * Will inject resolved environment variables that are unresolved at synthesis * in CloudFormation Custom Resource. */ class NextjsStaticAssets extends constructs_1.Construct { get buildEnvVars() { const buildEnvVars = {}; for (const [k, v] of Object.entries(this.props.environment || {})) { if (k.startsWith('NEXT_PUBLIC')) { buildEnvVars[k] = v; } } return buildEnvVars; } constructor(scope, id, props) { super(scope, id); this.props = props; this.bucket = this.createBucket(); // when `cdk deploy "NonNextjsStack" --exclusively` is run, don't bundle assets since they will not exist if (aws_cdk_lib_1.Stack.of(this).bundlingRequired) { const asset = this.createAsset(); this.createBucketDeployment(asset); } } createBucket() { return (this.props.bucket ?? new s3.Bucket(this, 'Bucket', { removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, autoDeleteObjects: true, enforceSSL: true, blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, encryption: s3.BucketEncryption.S3_MANAGED, ...this.props.overrides?.bucketProps, })); } createAsset() { // create temporary directory to join open-next's static output with cache output const tmpAssetsDir = fs.mkdtempSync((0, node_path_1.resolve)((0, node_os_1.tmpdir)(), 'cdk-nextjs-assets-')); fs.cpSync(this.props.nextBuild.nextStaticDir, tmpAssetsDir, { recursive: true }); fs.cpSync(this.props.nextBuild.nextCacheDir, (0, node_path_1.resolve)(tmpAssetsDir, constants_1.CACHE_BUCKET_KEY_PREFIX), { recursive: true }); const asset = new aws_s3_assets_1.Asset(this, 'Asset', { path: tmpAssetsDir, ...this.props.overrides?.assetProps, }); fs.rmSync(tmpAssetsDir, { recursive: true }); return asset; } createBucketDeployment(asset) { const basePath = this.props.basePath?.replace(/^\//, ''); // remove leading slash (if present) const allFiles = basePath ? `${basePath}/**/*` : '**/*'; const staticFiles = basePath ? `${basePath}/_next/static/**/*'` : '_next/static/**/*'; return new NextjsBucketDeployment_1.NextjsBucketDeployment(this, 'BucketDeployment', { asset, destinationBucket: this.bucket, destinationKeyPrefix: basePath, debug: true, // only put env vars that are placeholders in custom resource properties // to be replaced. other env vars were injected at build time. substitutionConfig: NextjsBucketDeployment_1.NextjsBucketDeployment.getSubstitutionConfig(this.buildEnvVars), prune: this.props.prune, // defaults to false putConfig: { [allFiles]: { CacheControl: 'public, max-age=0, must-revalidate', }, [staticFiles]: { CacheControl: 'public, max-age=31536000, immutable', }, }, ...this.props.overrides?.nextjsBucketDeploymentProps, }); } } exports.NextjsStaticAssets = NextjsStaticAssets; _a = JSII_RTTI_SYMBOL_1; NextjsStaticAssets[_a] = { fqn: "cdk-nextjs-standalone.NextjsStaticAssets", version: "4.2.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzU3RhdGljQXNzZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL05leHRqc1N0YXRpY0Fzc2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhCQUE4QjtBQUM5QixxQ0FBaUM7QUFDakMseUNBQW9DO0FBQ3BDLDZDQUFtRDtBQUNuRCx5Q0FBeUM7QUFDekMsNkRBQWtEO0FBQ2xELDJDQUF1QztBQUN2QywyQ0FBc0Q7QUFFdEQscUVBQWtFO0FBMkNsRTs7Ozs7R0FLRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFRL0MsSUFBWSxZQUFZO1FBQ3RCLE1BQU0sWUFBWSxHQUEyQixFQUFFLENBQUM7UUFDaEQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFbEMseUdBQXlHO1FBQ3pHLElBQUksbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakMsSUFBSSxD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RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDQUNIRV9CVUNLRVRfS0VZX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9wdGlvbmFsQXNzZXRQcm9wcywgT3B0aW9uYWxOZXh0anNCdWNrZXREZXBsb3ltZW50UHJvcHMgfSBmcm9tICcuL2dlbmVyYXRlZC1zdHJ1Y3RzJztcbmltcG9ydCB7IE5leHRqc0J1Y2tldERlcGxveW1lbnQgfSBmcm9tICcuL05leHRqc0J1Y2tldERlcGxveW1lbnQnO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tICcuL05leHRqc0J1aWxkJztcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNTdGF0aWNBc3NldE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldFByb3BzPzogczMuQnVja2V0UHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0J1Y2tldERlcGxveW1lbnRQcm9wcz86IE9wdGlvbmFsTmV4dGpzQnVja2V0RGVwbG95bWVudFByb3BzO1xuICByZWFkb25seSBhc3NldFByb3BzPzogT3B0aW9uYWxBc3NldFByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIHZhbHVlIHRvIHByZWZpeCB0aGUgTmV4dC5qcyBzaXRlIHVuZGVyIGEgL3ByZWZpeCBwYXRoIG9uIENsb3VkRnJvbnQuXG4gICAqIFVzdWFsbHkgdXNlZCB3aGVuIHlvdSBkZXBsb3kgbXVsdGlwbGUgTmV4dC5qcyBzaXRlcyBvbiBzYW1lIGRvbWFpbiB1c2luZyAvc3ViLXBhdGhcbiAgICpcbiAgICogTm90ZSwgeW91J2xsIG5lZWQgdG8gc2V0IFtiYXNlUGF0aF0oaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvYmFzZVBhdGgpXG4gICAqIGluIHlvdXIgYG5leHQuY29uZmlnLnRzYCB0byB0aGlzIHZhbHVlIGFuZCBlbnN1cmUgYW55IGZpbGVzIGluIGBwdWJsaWNgXG4gICAqIGZvbGRlciBoYXZlIGNvcnJlY3QgcHJlZml4LlxuICAgKiBAZXhhbXBsZSBcIi9teS1iYXNlLXBhdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZpbmUgeW91ciBvd24gYnVja2V0IHRvIHN0b3JlIHN0YXRpYyBhc3NldHMuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ/OiBzMy5JQnVja2V0IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQ3VzdG9tIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBOZXh0SlMgYnVpbGQgYW5kIHJ1bnRpbWUuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBUaGUgYE5leHRqc0J1aWxkYCBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGJ1aWx0IE5leHRqcyBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG5leHRCdWlsZDogTmV4dGpzQnVpbGQ7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBmb3IgZXZlcnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzU3RhdGljQXNzZXRPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAgKGRlZmF1bHQpLCB0aGVuIHJlbW92ZXMgb2xkIHN0YXRpYyBhc3NldHMgYWZ0ZXIgdXBsb2FkIG5ldyBzdGF0aWMgYXNzZXRzLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwcnVuZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXBsb2FkcyBOZXh0anMgYnVpbHQgc3RhdGljIGFuZCBwdWJsaWMgZmlsZXMgdG8gUzMuXG4gKlxuICogV2lsbCBpbmplY3QgcmVzb2x2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIHVucmVzb2x2ZWQgYXQgc3ludGhlc2lzXG4gKiBpbiBDbG91ZEZvcm1hdGlvbiBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNTdGF0aWNBc3NldHMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgYXNzZXRzLlxuICAgKi9cbiAgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIHByb3RlY3RlZCBwcm9wczogTmV4dGpzU3RhdGljQXNzZXRzUHJvcHM7XG5cbiAgcHJpdmF0ZSBnZXQgYnVpbGRFbnZWYXJzKCkge1xuICAgIGNvbnN0IGJ1aWxkRW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucHJvcHMuZW52aXJvbm1lbnQgfHwge30pKSB7XG4gICAgICBpZiAoay5zdGFydHNXaXRoKCdORVhUX1BVQkxJQycpKSB7XG4gICAgICAgIGJ1aWxkRW52VmFyc1trXSA9IHY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWlsZEVudlZhcnM7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzU3RhdGljQXNzZXRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMuYnVja2V0ID0gdGhpcy5jcmVhdGVCdWNrZXQoKTtcblxuICAgIC8vIHdoZW4gYGNkayBkZXBsb3kgXCJOb25OZXh0anNTdGFja1wiIC0tZXhjbHVzaXZlbHlgIGlzIHJ1biwgZG9uJ3QgYnVuZGxlIGFzc2V0cyBzaW5jZSB0aGV5IHdpbGwgbm90IGV4aXN0XG4gICAgaWYgKFN0YWNrLm9mKHRoaXMpLmJ1bmRsaW5nUmVxdWlyZWQpIHtcbiAgICAgIGNvbnN0IGFzc2V0ID0gdGhpcy5jcmVhdGVBc3NldCgpO1xuICAgICAgdGhpcy5jcmVhdGVCdWNrZXREZXBsb3ltZW50KGFzc2V0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJ1Y2tldCgpOiBzMy5JQnVja2V0IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wcy5idWNrZXQgPz9cbiAgICAgIG5ldyBzMy5CdWNrZXQodGhpcywgJ0J1Y2tldCcsIHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHMzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uYnVja2V0UHJvcHMsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFzc2V0KCk6IEFzc2V0IHtcbiAgICAvLyBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byBqb2luIG9wZW4tbmV4dCdzIHN0YXRpYyBvdXRwdXQgd2l0aCBjYWNoZSBvdXRwdXRcbiAgICBjb25zdCB0bXBBc3NldHNEaXIgPSBmcy5ta2R0ZW1wU3luYyhyZXNvbHZlKHRtcGRpcigpLCAnY2RrLW5leHRqcy1hc3NldHMtJykpO1xuICAgIGZzLmNwU3luYyh0aGlzLnByb3BzLm5leHRCdWlsZC5uZXh0U3RhdGljRGlyLCB0bXBBc3NldHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLmNwU3luYyh0aGlzLnByb3BzLm5leHRCdWlsZC5uZXh0Q2FjaGVEaXIsIHJlc29sdmUodG1wQXNzZXRzRGlyLCBDQUNIRV9CVUNLRVRfS0VZX1BSRUZJWCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGFzc2V0ID0gbmV3IEFzc2V0KHRoaXMsICdBc3NldCcsIHtcbiAgICAgIHBhdGg6IHRtcEFzc2V0c0RpcixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5hc3NldFByb3BzLFxuICAgIH0pO1xuICAgIGZzLnJtU3luYyh0bXBBc3NldHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiBhc3NldDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnVja2V0RGVwbG95bWVudChhc3NldDogQXNzZXQpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMucHJvcHMuYmFzZVBhdGg/LnJlcGxhY2UoL15cXC8vLCAnJyk7IC8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIChpZiBwcmVzZW50KVxuICAgIGNvbnN0IGFsbEZpbGVzID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0vKiovKmAgOiAnKiovKic7XG4gICAgY29uc3Qgc3RhdGljRmlsZXMgPSBiYXNlUGF0aCA/IGAke2Jhc2VQYXRofS9fbmV4dC9zdGF0aWMvKiovKidgIDogJ19uZXh0L3N0YXRpYy8qKi8qJztcblxuICAgIHJldHVybiBuZXcgTmV4dGpzQnVja2V0RGVwbG95bWVudCh0aGlzLCAnQnVja2V0RGVwbG95bWVudCcsIHtcbiAgICAgIGFzc2V0LFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGJhc2VQYXRoLFxuICAgICAgZGVidWc6IHRydWUsXG4gICAgICAvLyBvbmx5IHB1dCBlbnYgdmFycyB0aGF0IGFyZSBwbGFjZWhvbGRlcnMgaW4gY3VzdG9tIHJlc291cmNlIHByb3BlcnRpZXNcbiAgICAgIC8vIHRvIGJlIHJlcGxhY2VkLiBvdGhlciBlbnYgdmFycyB3ZXJlIGluamVjdGVkIGF0IGJ1aWxkIHRpbWUuXG4gICAgICBzdWJzdGl0dXRpb25Db25maWc6IE5leHRqc0J1Y2tldERlcGxveW1lbnQuZ2V0U3Vic3RpdHV0aW9uQ29uZmlnKHRoaXMuYnVpbGRFbnZWYXJzKSxcbiAgICAgIHBydW5lOiB0aGlzLnByb3BzLnBydW5lLCAvLyBkZWZhdWx0cyB0byBmYWxzZVxuICAgICAgcHV0Q29uZmlnOiB7XG4gICAgICAgIFthbGxGaWxlc106IHtcbiAgICAgICAgICBDYWNoZUNvbnRyb2w6ICdwdWJsaWMsIG1heC1hZ2U9MCwgbXVzdC1yZXZhbGlkYXRlJyxcbiAgICAgICAgfSxcbiAgICAgICAgW3N0YXRpY0ZpbGVzXToge1xuICAgICAgICAgIENhY2hlQ29udHJvbDogJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCwgaW1tdXRhYmxlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQnVja2V0RGVwbG95bWVudFByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=