cdk-nextjs-standalone
Version:
Deploy a NextJS app to AWS using CDK and OpenNext.
92 lines • 14.6 kB
JavaScript
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=
;