cdk-nuxt 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_s3_1 = require("@aws-sdk/client-s3");
4
+ const ONE_WEEK_IN_MILLISECONDS = 1000 * 60 * 60 * 24 * 7;
5
+ exports.handler = async (event, context) => {
6
+ var _a;
7
+ console.log('Starting cleanup of static assets older than 1 week...');
8
+ try {
9
+ const client = new client_s3_1.S3Client({ region: process.env.AWS_REGION });
10
+ const bucketName = process.env.STATIC_ASSETS_BUCKET;
11
+ if (!bucketName) {
12
+ throw new Error("Static asset's bucket name not specified in environment!");
13
+ }
14
+ const deleteOlderThan = new Date(Date.now() - ONE_WEEK_IN_MILLISECONDS);
15
+ // As we don't have hundreds of deployments per week, there's no need for pagination
16
+ const deploymentFolders = await client.send(new client_s3_1.ListObjectsV2Command({
17
+ Bucket: bucketName,
18
+ Delimiter: '/',
19
+ }));
20
+ // The result is a list of objects containing the keys with a trailing slash
21
+ const folderNames = (_a = deploymentFolders.CommonPrefixes) === null || _a === void 0 ? void 0 : _a.map(folder => { var _a; return (_a = folder.Prefix) === null || _a === void 0 ? void 0 : _a.slice(0, -1); });
22
+ if (!folderNames) {
23
+ console.log('Canceled static assets cleanup as folder is empty.');
24
+ return;
25
+ }
26
+ // We sort the folders by their creation data and remove the latest one as this is the currently active one used in production
27
+ const legacyFolderNames = folderNames.sort((a, b) => {
28
+ // @ts-ignore
29
+ const creationDateA = new Date(a);
30
+ // @ts-ignore
31
+ const creationDateB = new Date(b);
32
+ return creationDateA.getTime() < creationDateB.getTime() ? -1 : 1;
33
+ });
34
+ const activeFolderName = legacyFolderNames.pop();
35
+ console.log(`Detected assets folder "${activeFolderName}" as current production folder...`);
36
+ // We want to get all outdated folders of our legacy (not productively used) folders for deletion
37
+ const outdatedFolderNames = legacyFolderNames.filter(folderName => {
38
+ // @ts-ignore
39
+ const creationDate = new Date(folderName);
40
+ return creationDate.getTime() < deleteOlderThan.getTime();
41
+ });
42
+ if (!outdatedFolderNames || outdatedFolderNames.length === 0) {
43
+ console.log('No outdated asset folders found.');
44
+ }
45
+ else {
46
+ console.log(`Deleting ${outdatedFolderNames.length} outdated folders...`);
47
+ // Unfortunately it's not possible to delete folders recursively 🙄
48
+ // so we need to query all the contents in order to delete them
49
+ const pendingPromises = outdatedFolderNames.map(folderName => {
50
+ return client
51
+ .send(new client_s3_1.ListObjectsV2Command({
52
+ Bucket: bucketName,
53
+ Prefix: folderName,
54
+ }))
55
+ .then(outdatedAssets => {
56
+ var _a;
57
+ return client.send(new client_s3_1.DeleteObjectsCommand({
58
+ Bucket: bucketName,
59
+ Delete: {
60
+ Objects: (_a = outdatedAssets.Contents) === null || _a === void 0 ? void 0 : _a.map(outdatedAsset => {
61
+ return { Key: outdatedAsset.Key };
62
+ }),
63
+ },
64
+ }));
65
+ });
66
+ });
67
+ const results = await Promise.all(pendingPromises);
68
+ results.forEach(result => {
69
+ if (result.Errors && result.Errors.length) {
70
+ const errorMsg = 'Failed to delete outdated static assets.';
71
+ console.error(errorMsg, result.Errors);
72
+ throw new Error(errorMsg);
73
+ }
74
+ });
75
+ }
76
+ console.log('Cleanup of old static assets finished.');
77
+ }
78
+ catch (error) {
79
+ console.error('### unexpected runtime error ###', error);
80
+ }
81
+ };
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUF3RjtBQUV4RixNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFekQsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBVSxFQUFFLE9BQVksRUFBRSxFQUFFOztJQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFFdEUsSUFBSTtRQUNBLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHdCQUF3QixDQUFDLENBQUM7UUFFeEUsb0ZBQW9GO1FBQ3BGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUN2QyxJQUFJLGdDQUFvQixDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1NBQ2pCLENBQUMsQ0FDTCxDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLE1BQU0sV0FBVyxTQUFHLGlCQUFpQixDQUFDLGNBQWMsMENBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLHdCQUFDLE1BQU0sQ0FBQyxNQUFNLDBDQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUMsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FB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QUMsT0FBTyxLQUFLLEVBQUU7UUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVEO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWxldGVPYmplY3RzQ29tbWFuZCwgTGlzdE9iamVjdHNWMkNvbW1hbmQsIFMzQ2xpZW50fSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5cbmNvbnN0IE9ORV9XRUVLX0lOX01JTExJU0VDT05EUyA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIGNsZWFudXAgb2Ygc3RhdGljIGFzc2V0cyBvbGRlciB0aGFuIDEgd2Vlay4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtyZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT059KTtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IHByb2Nlc3MuZW52LlNUQVRJQ19BU1NFVFNfQlVDS0VUO1xuXG4gICAgICAgIGlmICghYnVja2V0TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdGljIGFzc2V0J3MgYnVja2V0IG5hbWUgbm90IHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxldGVPbGRlclRoYW4gPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gT05FX1dFRUtfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgICAgICAvLyBBcyB3ZSBkb24ndCBoYXZlIGh1bmRyZWRzIG9mIGRlcGxveW1lbnRzIHBlciB3ZWVrLCB0aGVyZSdzIG5vIG5lZWQgZm9yIHBhZ2luYXRpb25cbiAgICAgICAgY29uc3QgZGVwbG95bWVudEZvbGRlcnMgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgIERlbGltaXRlcjogJy8nLCAvLyBPbmx5IHJldHJpZXZlIHRoZSB0b3AgbGV2ZWwgZm9sZGVyc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGtleXMgd2l0aCBhIHRyYWlsaW5nIHNsYXNoXG4gICAgICAgIGNvbnN0IGZvbGRlck5hbWVzID0gZGVwbG95bWVudEZvbGRlcnMuQ29tbW9uUHJlZml4ZXM/Lm1hcChmb2xkZXIgPT4gZm9sZGVyLlByZWZpeD8uc2xpY2UoMCwgLTEpKVxuICAgICAgICBpZiAoIWZvbGRlck5hbWVzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FuY2VsZWQgc3RhdGljIGFzc2V0cyBjbGVhbnVwIGFzIGZvbGRlciBpcyBlbXB0eS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHNvcnQgdGhlIGZvbGRlcnMgYnkgdGhlaXIgY3JlYXRpb24gZGF0YSBhbmQgcmVtb3ZlIHRoZSBsYXRlc3Qgb25lIGFzIHRoaXMgaXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lIHVzZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICBjb25zdCBsZWdhY3lGb2xkZXJOYW1lcyA9IGZvbGRlck5hbWVzLnNvcnQoKGEsYikgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY3JlYXRpb25EYXRlQSA9IG5ldyBEYXRlKGEpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY3JlYXRpb25EYXRlQiA9IG5ldyBEYXRlKGIpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlQS5nZXRUaW1lKCkgPCBjcmVhdGlvbkRhdGVCLmdldFRpbWUoKSA/IC0xIDogMTtcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgYWN0aXZlRm9sZGVyTmFtZSA9IGxlZ2FjeUZvbGRlck5hbWVzLnBvcCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgRGV0ZWN0ZWQgYXNzZXRzIGZvbGRlciBcIiR7YWN0aXZlRm9sZGVyTmFtZX1cIiBhcyBjdXJyZW50IHByb2R1Y3Rpb24gZm9sZGVyLi4uYCk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBnZXQgYWxsIG91dGRhdGVkIGZvbGRlcnMgb2Ygb3VyIGxlZ2FjeSAobm90IHByb2R1Y3RpdmVseSB1c2VkKSBmb2xkZXJzIGZvciBkZWxldGlvblxuICAgICAgICBjb25zdCBvdXRkYXRlZEZvbGRlck5hbWVzID0gbGVnYWN5Rm9sZGVyTmFtZXMuZmlsdGVyKGZvbGRlck5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZShmb2xkZXJOYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlLmdldFRpbWUoKSA8IGRlbGV0ZU9sZGVyVGhhbi5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFvdXRkYXRlZEZvbGRlck5hbWVzIHx8IG91dGRhdGVkRm9sZGVyTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gb3V0ZGF0ZWQgYXNzZXQgZm9sZGVycyBmb3VuZC4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyAke291dGRhdGVkRm9sZGVyTmFtZXMubGVuZ3RofSBvdXRkYXRlZCBmb2xkZXJzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQncyBub3QgcG9zc2libGUgdG8gZGVsZXRlIGZvbGRlcnMgcmVjdXJzaXZlbHkg8J+ZhFxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBxdWVyeSBhbGwgdGhlIGNvbnRlbnRzIGluIG9yZGVyIHRvIGRlbGV0ZSB0aGVtXG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nUHJvbWlzZXMgPSBvdXRkYXRlZEZvbGRlck5hbWVzLm1hcChmb2xkZXJOYW1lID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICAgICAgICAgICAgICAgIC5zZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4OiBmb2xkZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihvdXRkYXRlZEFzc2V0cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnNlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdHM6IG91dGRhdGVkQXNzZXRzLkNvbnRlbnRzPy5tYXAob3V0ZGF0ZWRBc3NldCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtLZXk6IG91dGRhdGVkQXNzZXQuS2V5fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocGVuZGluZ1Byb21pc2VzKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRXJyb3JzICYmIHJlc3VsdC5FcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cy4nO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTXNnLCByZXN1bHQuRXJyb3JzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdDbGVhbnVwIG9mIG9sZCBzdGF0aWMgYXNzZXRzIGZpbmlzaGVkLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyMjIyB1bmV4cGVjdGVkIHJ1bnRpbWUgZXJyb3IgIyMjJywgZXJyb3IpO1xuICAgIH1cbn07Il19
@@ -0,0 +1,6 @@
1
+ import { StackProps } from "aws-cdk-lib";
2
+ export interface AppStackProps extends StackProps {
3
+ readonly project: string;
4
+ readonly service: string;
5
+ readonly environment: string;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWNrLXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLXN0YWNrLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YWNrUHJvcHN9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50OiBzdHJpbmc7XG59Il19
@@ -0,0 +1,22 @@
1
+ import { IBucket } from "aws-cdk-lib/aws-s3";
2
+ import { Stack } from "aws-cdk-lib";
3
+ import { AppStackProps } from "./app-stack-props";
4
+ import { Construct } from "constructs";
5
+ export interface NuxtAppAssetsCleanupProps extends AppStackProps {
6
+ readonly staticAssetsBucket: IBucket;
7
+ readonly sentryDsn: string;
8
+ }
9
+ /**
10
+ * Contains a scheduled lambda function, that deletes outdated static assets of the PWA from S3.
11
+ */
12
+ export declare class NuxtAppAssetsCleanupStack extends Stack {
13
+ private readonly resourceIdPrefix;
14
+ private staticAssetsBucket;
15
+ private readonly layer;
16
+ private readonly lambdaFunction;
17
+ private scheduledRule;
18
+ constructor(scope: Construct, id: string, props: NuxtAppAssetsCleanupProps);
19
+ private createLayer;
20
+ private createLambdaFunction;
21
+ private createRule;
22
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NuxtAppAssetsCleanupStack = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ const aws_events_1 = require("aws-cdk-lib/aws-events");
7
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
8
+ const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
9
+ const path = require("path");
10
+ /**
11
+ * Contains a scheduled lambda function, that deletes outdated static assets of the PWA from S3.
12
+ */
13
+ class NuxtAppAssetsCleanupStack extends aws_cdk_lib_1.Stack {
14
+ constructor(scope, id, props) {
15
+ super(scope, id, props);
16
+ this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
17
+ this.staticAssetsBucket = props.staticAssetsBucket;
18
+ this.layer = this.createLayer();
19
+ this.lambdaFunction = this.createLambdaFunction(props);
20
+ this.scheduledRule = this.createRule(props);
21
+ }
22
+ createLayer() {
23
+ const layerName = `${this.resourceIdPrefix}-layer`;
24
+ return new aws_lambda_1.LayerVersion(this, layerName, {
25
+ layerVersionName: layerName,
26
+ code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
27
+ compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_14_X],
28
+ });
29
+ }
30
+ createLambdaFunction(props) {
31
+ const functionName = `${this.resourceIdPrefix}-function`;
32
+ const result = new aws_lambda_1.Function(this, functionName, {
33
+ functionName: functionName,
34
+ runtime: aws_lambda_1.Runtime.NODEJS_14_X,
35
+ architecture: aws_lambda_1.Architecture.ARM_64,
36
+ layers: [this.layer],
37
+ handler: `index.handler`,
38
+ code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/app')),
39
+ timeout: aws_cdk_lib_1.Duration.minutes(1),
40
+ memorySize: 128,
41
+ logRetention: aws_logs_1.RetentionDays.TWO_WEEKS,
42
+ environment: {
43
+ STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
44
+ SENTRY_DSN: props.sentryDsn,
45
+ ENVIRONMENT: props.environment,
46
+ AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
47
+ NODE_OPTIONS: '--enable-source-maps',
48
+ },
49
+ });
50
+ // grant function access to S3 bucket
51
+ this.staticAssetsBucket.grantRead(result);
52
+ this.staticAssetsBucket.grantDelete(result);
53
+ return result;
54
+ }
55
+ createRule(props) {
56
+ const ruleName = `${this.resourceIdPrefix}-scheduled-rule`;
57
+ // Schedule every tuesday at 03:30 AM GMT
58
+ return new aws_events_1.Rule(this, ruleName, {
59
+ ruleName,
60
+ description: `Triggers a cleanup of outdated static assets of the ${props.project} app.`,
61
+ enabled: true,
62
+ schedule: aws_events_1.Schedule.cron({ weekDay: '3', hour: '3', minute: '30' }),
63
+ targets: [new aws_events_targets_1.LambdaFunction(this.lambdaFunction)],
64
+ });
65
+ }
66
+ }
67
+ exports.NuxtAppAssetsCleanupStack = NuxtAppAssetsCleanupStack;
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtYXNzZXRzLWNsZWFudXAtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBNEM7QUFFNUMsdURBQTJGO0FBQzNGLHVEQUFzRDtBQUV0RCxtREFBbUQ7QUFDbkQsdUVBQThEO0FBQzlELDZCQUE2QjtBQU83Qjs7R0FFRztBQUNILE1BQWEseUJBQTBCLFNBQVEsbUJBQUs7SUFRaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxXQUFXO1FBQ2YsTUFBTSxTQUFTLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFFBQVEsQ0FBQztRQUVuRCxPQUFPLElBQUkseUJBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3JDLGdCQUFnQixFQUFFLFNBQVM7WUFDM0IsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDckYsa0JBQWtCLEVBQUUsQ0FBQyxvQkFBTyxDQUFDLFdBQVcsQ0FBQztTQUM1QyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBZ0M7UUFDekQsTUFBTSxZQUFZLEdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLFdBQVcsQ0FBQztRQUVqRSxNQUFNLE1BQU0sR0FBYSxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN0RCxZQUFZLEVBQUUsWUFBWTtZQUMxQixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUNuRixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsWUFBWSxFQUFFLHdCQUFhLENBQUMsU0FBUztZQUNyQyxXQUFXLEVBQUU7Z0JBQ1Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ3hELFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDM0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixtQ0FBbUMsRUFBRSxHQUFHO2dCQUN4QyxZQUFZLEVBQUUsc0JBQXNCO2FBQ3ZDO1NBQ0osQ0FBQyxDQUFDO1FBRUgscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU1QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQWdDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixpQkFBaUIsQ0FBQztRQUUzRCx5Q0FBeUM7UUFDekMsT0FBTyxJQUFJLGlCQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUM1QixRQUFRO1lBQ1IsV0FBVyxFQUFFLHVEQUF1RCxLQUFLLENBQUMsT0FBTyxPQUFPO1lBQ3hGLE9BQU8sRUFBRSxJQUFJO1lBQ2IsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQztZQUNoRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLG1DQUFjLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3JELENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSjtBQXJFRCw4REFxRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7RHVyYXRpb24sIFN0YWNrfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4vYXBwLXN0YWNrLXByb3BzXCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgTGF5ZXJWZXJzaW9uLCBSdW50aW1lLCBGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7UnVsZSwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcyBleHRlbmRzIEFwcFN0YWNrUHJvcHMge1xuICAgIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgICByZWFkb25seSBzZW50cnlEc246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb250YWlucyBhIHNjaGVkdWxlZCBsYW1iZGEgZnVuY3Rpb24sIHRoYXQgZGVsZXRlcyBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBQV0EgZnJvbSBTMy5cbiAqL1xuZXhwb3J0IGNsYXNzIE51eHRBcHBBc3NldHNDbGVhbnVwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlSWRQcmVmaXg6IHN0cmluZztcbiAgICBwcml2YXRlIHN0YXRpY0Fzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheWVyOiBMYXllclZlcnNpb247XG4gICAgcHJpdmF0ZSByZWFkb25seSBsYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBzY2hlZHVsZWRSdWxlOiBSdWxlO1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0O1xuICAgICAgICB0aGlzLmxheWVyID0gdGhpcy5jcmVhdGVMYXllcigpO1xuICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkUnVsZSA9IHRoaXMuY3JlYXRlUnVsZShwcm9wcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllck5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxheWVyYDtcblxuICAgICAgICByZXR1cm4gbmV3IExheWVyVmVyc2lvbih0aGlzLCBsYXllck5hbWUsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGxheWVyTmFtZSxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9mdW5jdGlvbnMvYXNzZXRzX2NsZWFudXAvYnVpbGQvbGF5ZXInKSksXG4gICAgICAgICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtSdW50aW1lLk5PREVKU18xNF9YXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWZ1bmN0aW9uYDtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgbGF5ZXJzOiBbdGhpcy5sYXllcl0sXG4gICAgICAgICAgICBoYW5kbGVyOiBgaW5kZXguaGFuZGxlcmAsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL2Fzc2V0c19jbGVhbnVwL2J1aWxkL2FwcCcpKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBTRU5UUllfRFNOOiBwcm9wcy5zZW50cnlEc24sXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnREZWxldGUocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUnVsZShwcm9wczogTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcyk6IFJ1bGUge1xuICAgICAgICBjb25zdCBydWxlTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVkLXJ1bGVgO1xuXG4gICAgICAgIC8vIFNjaGVkdWxlIGV2ZXJ5IHR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UXG4gICAgICAgIHJldHVybiBuZXcgUnVsZSh0aGlzLCBydWxlTmFtZSwge1xuICAgICAgICAgICAgcnVsZU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSAke3Byb3BzLnByb2plY3R9IGFwcC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMycsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMubGFtYmRhRnVuY3Rpb24pXSxcbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==
@@ -0,0 +1,46 @@
1
+ import { Stack } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ import { IBucket } from "aws-cdk-lib/aws-s3";
4
+ import { AppStackProps } from "./app-stack-props";
5
+ export interface NuxtAppStackProps extends AppStackProps {
6
+ readonly baseDomain: string;
7
+ readonly subDomain?: string;
8
+ readonly globalTlsCertificateArn: string;
9
+ readonly hostedZoneId: string;
10
+ }
11
+ export declare class NuxtAppStack extends Stack {
12
+ private readonly resourceIdPrefix;
13
+ private readonly deploymentRevision;
14
+ private readonly tlsCertificate;
15
+ private readonly cdnAccessIdentity;
16
+ staticAssetsBucket: IBucket;
17
+ private readonly layer;
18
+ private readonly lambdaFunction;
19
+ private apiGateway;
20
+ private readonly httpsForwardingBehavior;
21
+ private readonly cdn;
22
+ private readonly hostedZone;
23
+ constructor(scope: Construct, id: string, props: NuxtAppStackProps);
24
+ private findTlsCertificate;
25
+ private createCdnAccessIdentity;
26
+ private createStaticAssetsBucket;
27
+ private createSsrLambdaLayer;
28
+ private createLambdaFunction;
29
+ private createApiGateway;
30
+ private createHttpsForwardingBehavior;
31
+ /**
32
+ * Eventhough we don't want to cache SSR requests, we still have to create a cache policy, in order to
33
+ * forward required cookies, query params and headers. This doesn't make any sense, because if nothing
34
+ * is cached, one would expect, that anything would/could be forwarded, but anyway...
35
+ */
36
+ private createSsrCachePolicy;
37
+ private createCloudFrontDistribution;
38
+ private createStaticAssetBehaviors;
39
+ /**
40
+ * In order to enable a zero-downtime deployment, we use a new subdirectory (revision) for every deployment.
41
+ * The previous versions are retained to allow clients to continue to work with an older revision.
42
+ */
43
+ private configureDeployments;
44
+ private findHostedZone;
45
+ private createDnsRecords;
46
+ }
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NuxtAppStack = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
6
+ const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
7
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
+ const aws_route53_1 = require("aws-cdk-lib/aws-route53");
10
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
11
+ const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
12
+ const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
13
+ const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
14
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
15
+ const aws_apigatewayv2_integrations_alpha_1 = require("@aws-cdk/aws-apigatewayv2-integrations-alpha");
16
+ const aws_apigatewayv2_alpha_1 = require("@aws-cdk/aws-apigatewayv2-alpha");
17
+ const nuxt_app_static_assets_1 = require("./nuxt-app-static-assets");
18
+ const fs = require("fs");
19
+ class NuxtAppStack extends aws_cdk_lib_1.Stack {
20
+ constructor(scope, id, props) {
21
+ super(scope, id, props);
22
+ aws_cdk_lib_1.Tags.of(scope).add('project', props.project);
23
+ aws_cdk_lib_1.Tags.of(scope).add('domain', props.subDomain ? `${props.subDomain}.${props.baseDomain}` : props.baseDomain);
24
+ aws_cdk_lib_1.Tags.of(scope).add('service', props.service);
25
+ aws_cdk_lib_1.Tags.of(scope).add('environment', props.environment);
26
+ this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
27
+ this.deploymentRevision = new Date().toISOString();
28
+ this.tlsCertificate = this.findTlsCertificate(props);
29
+ this.cdnAccessIdentity = this.createCdnAccessIdentity();
30
+ this.staticAssetsBucket = this.createStaticAssetsBucket();
31
+ this.layer = this.createSsrLambdaLayer();
32
+ this.lambdaFunction = this.createLambdaFunction();
33
+ this.apiGateway = this.createApiGateway();
34
+ this.httpsForwardingBehavior = this.createHttpsForwardingBehavior();
35
+ this.cdn = this.createCloudFrontDistribution(props);
36
+ this.configureDeployments();
37
+ this.hostedZone = this.findHostedZone(props);
38
+ this.createDnsRecords(props);
39
+ }
40
+ findTlsCertificate(props) {
41
+ return aws_certificatemanager_1.Certificate.fromCertificateArn(this, `${this.resourceIdPrefix}-tls-certificate`, props.globalTlsCertificateArn);
42
+ }
43
+ createCdnAccessIdentity() {
44
+ const originAccessIdentityName = `${this.resourceIdPrefix}-cdn-s3-access`;
45
+ return new aws_cloudfront_1.OriginAccessIdentity(this, originAccessIdentityName);
46
+ }
47
+ createStaticAssetsBucket() {
48
+ const bucketName = `${this.resourceIdPrefix}-assets`;
49
+ const bucket = new aws_s3_1.Bucket(this, bucketName, {
50
+ accessControl: aws_s3_1.BucketAccessControl.AUTHENTICATED_READ,
51
+ blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
52
+ bucketName,
53
+ // the bucket and all of its objects can be deleted, because all the content is managed in this project
54
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
55
+ autoDeleteObjects: true,
56
+ });
57
+ bucket.grantReadWrite(this.cdnAccessIdentity);
58
+ return bucket;
59
+ }
60
+ createSsrLambdaLayer() {
61
+ const layerName = `${this.resourceIdPrefix}-ssr-layer`;
62
+ return new aws_lambda_1.LayerVersion(this, layerName, {
63
+ layerVersionName: layerName,
64
+ code: aws_lambda_1.Code.fromAsset('./server/layer'),
65
+ compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_12_X],
66
+ description: `Contains node_modules required for server-side of ${this.resourceIdPrefix}.`,
67
+ });
68
+ }
69
+ createLambdaFunction() {
70
+ const funcName = `${this.resourceIdPrefix}-function`;
71
+ return new aws_lambda_1.Function(this, funcName, {
72
+ functionName: funcName,
73
+ runtime: aws_lambda_1.Runtime.NODEJS_12_X,
74
+ architecture: aws_lambda_1.Architecture.ARM_64,
75
+ layers: [this.layer],
76
+ handler: 'lambda-handler.render',
77
+ code: aws_lambda_1.Code.fromAsset('.nuxt/cdk-deployment', {
78
+ exclude: ['**.svg', '**.ico', '**.png', '**.jpg', 'chunk.*.js*', 'bundle.*.js*', 'bundle.*.js*', 'sw.js*'],
79
+ }),
80
+ timeout: aws_cdk_lib_1.Duration.seconds(10),
81
+ memorySize: 512,
82
+ logRetention: aws_logs_1.RetentionDays.ONE_MONTH,
83
+ environment: {},
84
+ allowPublicSubnet: false
85
+ });
86
+ }
87
+ createApiGateway() {
88
+ const lambdaIntegration = new aws_apigatewayv2_integrations_alpha_1.HttpLambdaIntegration(`${this.resourceIdPrefix}-lambda-integration`, this.lambdaFunction);
89
+ const apiName = `${this.resourceIdPrefix}-api`;
90
+ const apiGateway = new aws_apigatewayv2_alpha_1.HttpApi(this, apiName, {
91
+ apiName,
92
+ // The app does not allow any cross-origin access by purpose: the app should not be embeddable anywhere
93
+ corsPreflight: undefined,
94
+ defaultIntegration: lambdaIntegration,
95
+ });
96
+ apiGateway.addRoutes({
97
+ integration: lambdaIntegration,
98
+ path: '/{proxy+}',
99
+ methods: [aws_stepfunctions_tasks_1.HttpMethod.GET, aws_stepfunctions_tasks_1.HttpMethod.HEAD],
100
+ });
101
+ return apiGateway;
102
+ }
103
+ createHttpsForwardingBehavior() {
104
+ return {
105
+ origin: new aws_cloudfront_origins_1.HttpOrigin(`${this.apiGateway.httpApiId}.execute-api.${this.region}.amazonaws.com`, {
106
+ connectionAttempts: 2,
107
+ connectionTimeout: aws_cdk_lib_1.Duration.seconds(2),
108
+ readTimeout: aws_cdk_lib_1.Duration.seconds(10),
109
+ protocolPolicy: aws_cloudfront_1.OriginProtocolPolicy.HTTPS_ONLY,
110
+ }),
111
+ allowedMethods: aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD,
112
+ compress: true,
113
+ viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
114
+ originRequestPolicy: undefined,
115
+ cachePolicy: this.createSsrCachePolicy(),
116
+ };
117
+ }
118
+ /**
119
+ * Eventhough we don't want to cache SSR requests, we still have to create a cache policy, in order to
120
+ * forward required cookies, query params and headers. This doesn't make any sense, because if nothing
121
+ * is cached, one would expect, that anything would/could be forwarded, but anyway...
122
+ */
123
+ createSsrCachePolicy() {
124
+ // The headers to pass to the app
125
+ const headers = [
126
+ 'User-Agent',
127
+ 'Authorization',
128
+ ];
129
+ return new aws_cloudfront_1.CachePolicy(this, `${this.resourceIdPrefix}-cache-policy`, {
130
+ cachePolicyName: `${this.resourceIdPrefix}-cdn-cache-policy`,
131
+ comment: `Passes all required request data to the ${this.resourceIdPrefix} origin.`,
132
+ defaultTtl: aws_cdk_lib_1.Duration.seconds(0),
133
+ minTtl: aws_cdk_lib_1.Duration.seconds(0),
134
+ maxTtl: aws_cdk_lib_1.Duration.seconds(1),
135
+ queryStringBehavior: aws_cloudfront_1.CacheQueryStringBehavior.all(),
136
+ headerBehavior: aws_cloudfront_1.CacheHeaderBehavior.allowList(...headers),
137
+ cookieBehavior: aws_cloudfront_1.CacheCookieBehavior.all(),
138
+ enableAcceptEncodingBrotli: true,
139
+ enableAcceptEncodingGzip: true,
140
+ });
141
+ }
142
+ createCloudFrontDistribution(props) {
143
+ const cdnName = `${this.resourceIdPrefix}-cdn`;
144
+ return new aws_cloudfront_1.Distribution(this, cdnName, {
145
+ domainNames: props.subDomain ? [`${props.subDomain}.${props.baseDomain}`] : [props.baseDomain, `*.${props.baseDomain}`],
146
+ comment: `${this.resourceIdPrefix}-redirect`,
147
+ minimumProtocolVersion: aws_cloudfront_1.SecurityPolicyProtocol.TLS_V1_2_2018,
148
+ certificate: this.tlsCertificate,
149
+ defaultBehavior: this.httpsForwardingBehavior,
150
+ additionalBehaviors: this.createStaticAssetBehaviors(),
151
+ priceClass: aws_cloudfront_1.PriceClass.PRICE_CLASS_100,
152
+ });
153
+ }
154
+ createStaticAssetBehaviors() {
155
+ const staticAssetsCacheConfig = {
156
+ origin: new aws_cloudfront_origins_1.S3Origin(this.staticAssetsBucket, {
157
+ connectionAttempts: 2,
158
+ connectionTimeout: aws_cdk_lib_1.Duration.seconds(3),
159
+ originAccessIdentity: this.cdnAccessIdentity,
160
+ originPath: this.deploymentRevision,
161
+ }),
162
+ compress: true,
163
+ allowedMethods: aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
164
+ cachedMethods: aws_cloudfront_1.CachedMethods.CACHE_GET_HEAD_OPTIONS,
165
+ cachePolicy: aws_cloudfront_1.CachePolicy.CACHING_OPTIMIZED,
166
+ viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
167
+ };
168
+ const rules = {};
169
+ nuxt_app_static_assets_1.NuxtAppStaticAssets.forEach(asset => {
170
+ rules[`${asset.target}${asset.pattern}`] = staticAssetsCacheConfig;
171
+ });
172
+ return rules;
173
+ }
174
+ /**
175
+ * In order to enable a zero-downtime deployment, we use a new subdirectory (revision) for every deployment.
176
+ * The previous versions are retained to allow clients to continue to work with an older revision.
177
+ */
178
+ configureDeployments() {
179
+ const defaultCacheConfig = [
180
+ aws_s3_deployment_1.CacheControl.setPublic(),
181
+ aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.days(365)),
182
+ aws_s3_deployment_1.CacheControl.fromString('immutable'),
183
+ ];
184
+ // Returns a deployment for every configured static asset type to respect the different cache settings
185
+ return nuxt_app_static_assets_1.NuxtAppStaticAssets.filter(asset => fs.existsSync(asset.source)).map((asset, assetIndex) => {
186
+ var _a;
187
+ return new aws_s3_deployment_1.BucketDeployment(this, `${this.resourceIdPrefix}-assets-deployment-${assetIndex}`, {
188
+ sources: [aws_s3_deployment_1.Source.asset(asset.source)],
189
+ destinationBucket: this.staticAssetsBucket,
190
+ destinationKeyPrefix: this.deploymentRevision + asset.target,
191
+ prune: false,
192
+ storageClass: aws_s3_deployment_1.StorageClass.STANDARD,
193
+ exclude: ['*'],
194
+ include: [asset.pattern],
195
+ cacheControl: (_a = asset.cacheControl) !== null && _a !== void 0 ? _a : defaultCacheConfig,
196
+ contentType: asset.contentType,
197
+ });
198
+ });
199
+ }
200
+ findHostedZone(props) {
201
+ return aws_route53_1.HostedZone.fromHostedZoneAttributes(this, `${this.resourceIdPrefix}-hosted-zone`, {
202
+ hostedZoneId: props.hostedZoneId,
203
+ zoneName: props.baseDomain,
204
+ });
205
+ }
206
+ createDnsRecords(props) {
207
+ const dnsTarget = aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(this.cdn));
208
+ // Create a record for IPv4
209
+ new aws_route53_1.ARecord(this, `${this.resourceIdPrefix}-ipv4-record`, {
210
+ recordName: props.subDomain ? `${props.subDomain}.${props.baseDomain}` : props.baseDomain,
211
+ zone: this.hostedZone,
212
+ target: dnsTarget,
213
+ });
214
+ // Create a record for IPv6
215
+ new aws_route53_1.AaaaRecord(this, `${this.resourceIdPrefix}-ipv6-record`, {
216
+ recordName: props.subDomain ? `${props.subDomain}.${props.baseDomain}` : props.baseDomain,
217
+ zone: this.hostedZone,
218
+ target: dnsTarget,
219
+ });
220
+ }
221
+ }
222
+ exports.NuxtAppStack = NuxtAppStack;
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBaUU7QUFFakUsK0VBQTZFO0FBQzdFLCtEQVNvQztBQUNwQyx1REFBMkY7QUFDM0YsK0NBQTJGO0FBQzNGLHlEQUFtRztBQUNuRyxxRUFBbUc7QUFDbkcsK0VBQXdFO0FBQ3hFLHlFQUFpRTtBQUNqRSxpRkFBK0Q7QUFDL0QsbURBQW1EO0FBQ25ELHNHQUFxRjtBQUNyRiw0RUFBd0Q7QUFDeEQscUVBQTZEO0FBRTdELHlCQUF5QjtBQVl6QixNQUFhLFlBQWEsU0FBUSxtQkFBSztJQWFyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdCO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLGtCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLGtCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVHLGtCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLGtCQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUss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WUFDckIsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGNBQWMsRUFBRTtZQUMzRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDekYsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhQRCxvQ0FnUEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0R1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgVGFnc30gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NlcnRpZmljYXRlLCBJQ2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLCBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLCBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSwgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBEaXN0cmlidXRpb24sIElDYWNoZVBvbGljeSxcbiAgSU9yaWdpbkFjY2Vzc0lkZW50aXR5LCBPcmlnaW5BY2Nlc3NJZGVudGl0eSwgT3JpZ2luUHJvdG9jb2xQb2xpY3ksIFByaWNlQ2xhc3MsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIExheWVyVmVyc2lvbiwgUnVudGltZSwgRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge0Jsb2NrUHVibGljQWNjZXNzLCBCdWNrZXQsIEJ1Y2tldEFjY2Vzc0NvbnRyb2wsIElCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QVJlY29yZCwgQWFhYVJlY29yZCwgSG9zdGVkWm9uZSwgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQge0J1Y2tldERlcGxveW1lbnQsIENhY2hlQ29udHJvbCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM09yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7SHR0cE1ldGhvZH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzXCI7XG5pbXBvcnQge1JldGVudGlvbkRheXN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHsgSHR0cExhbWJkYUludGVncmF0aW9uIH0gZnJvbSAnQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnMtYWxwaGEnO1xuaW1wb3J0IHtIdHRwQXBpfSBmcm9tIFwiQGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi1hbHBoYVwiO1xuaW1wb3J0IHtOdXh0QXBwU3RhdGljQXNzZXRzfSBmcm9tIFwiLi9udXh0LWFwcC1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQge0FwcFN0YWNrUHJvcHN9IGZyb20gXCIuL2FwcC1zdGFjay1wcm9wc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnV4dEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBBcHBTdGFja1Byb3BzIHtcbiAgcmVhZG9ubHkgYmFzZURvbWFpbjogc3RyaW5nO1xuICByZWFkb25seSBzdWJEb21haW4/OiBzdHJpbmc7XG5cbiAgLy8gVXNlZCBieSB0aGUgQ0ROLCBtdXN0IGJlIGlzc3VlZCBpbiB1cy1lYXN0LTEgKGdsb2JhbClcbiAgcmVhZG9ubHkgZ2xvYmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE51eHRBcHBTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGxzQ2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZG5BY2Nlc3NJZGVudGl0eTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IGxheWVyOiBMYXllclZlcnNpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuICBwcml2YXRlIGFwaUdhdGV3YXk6IEh0dHBBcGk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cHNGb3J3YXJkaW5nQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBob3N0ZWRab25lOiBJSG9zdGVkWm9uZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dEFwcFN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIFRhZ3Mub2Yoc2NvcGUpLmFkZCgncHJvamVjdCcsIHByb3BzLnByb2plY3QpO1xuICAgIFRhZ3Mub2Yoc2NvcGUpLmFkZCgnZG9tYWluJywgcHJvcHMuc3ViRG9tYWluID8gYCR7cHJvcHMuc3ViRG9tYWlufS4ke3Byb3BzLmJhc2VEb21haW59YCA6IHByb3BzLmJhc2VEb21haW4pO1xuICAgIFRhZ3Mub2Yoc2NvcGUpLmFkZCgnc2VydmljZScsIHByb3BzLnNlcnZpY2UpO1xuICAgIFRhZ3Mub2Yoc2NvcGUpLmFkZCgnZW52aXJvbm1lbnQnLCBwcm9wcy5lbnZpcm9ubWVudCk7XG5cbiAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcbiAgICB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICB0aGlzLnRsc0NlcnRpZmljYXRlID0gdGhpcy5maW5kVGxzQ2VydGlmaWNhdGUocHJvcHMpO1xuICAgIHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkgPSB0aGlzLmNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk7XG4gICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQgPSB0aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpO1xuICAgIHRoaXMubGF5ZXIgPSB0aGlzLmNyZWF0ZVNzckxhbWJkYUxheWVyKCk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlTGFtYmRhRnVuY3Rpb24oKTtcbiAgICB0aGlzLmFwaUdhdGV3YXkgPSB0aGlzLmNyZWF0ZUFwaUdhdGV3YXkoKTtcbiAgICB0aGlzLmh0dHBzRm9yd2FyZGluZ0JlaGF2aW9yID0gdGhpcy5jcmVhdGVIdHRwc0ZvcndhcmRpbmdCZWhhdmlvcigpO1xuICAgIHRoaXMuY2RuID0gdGhpcy5jcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzKTtcbiAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgdGhpcy5ob3N0ZWRab25lID0gdGhpcy5maW5kSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFRsc0NlcnRpZmljYXRlKHByb3BzOiBOdXh0QXBwU3RhY2tQcm9wcyk6IElDZXJ0aWZpY2F0ZSB7XG4gICAgcmV0dXJuIENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXRscy1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5IHtcbiAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgIHJldHVybiBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IElCdWNrZXQge1xuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0c2A7XG4gICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLkFVVEhFTlRJQ0FURURfUkVBRCxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBidWNrZXROYW1lLFxuICAgICAgLy8gdGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgfSk7XG5cbiAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICByZXR1cm4gYnVja2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTc3JMYW1iZGFMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgIGNvbnN0IGxheWVyTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc3NyLWxheWVyYDtcbiAgICByZXR1cm4gbmV3IExheWVyVmVyc2lvbih0aGlzLCBsYXllck5hbWUsIHtcbiAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGxheWVyTmFtZSxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KCcuL3NlcnZlci9sYXllcicpLFxuICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbUnVudGltZS5OT0RFSlNfMTJfWF0sXG4gICAgICBkZXNjcmlwdGlvbjogYENvbnRhaW5zIG5vZGVfbW9kdWxlcyByZXF1aXJlZCBmb3Igc2VydmVyLXNpZGUgb2YgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LmAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxhbWJkYUZ1bmN0aW9uKCk6IEZ1bmN0aW9uIHtcbiAgICBjb25zdCBmdW5jTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZnVuY3Rpb25gO1xuXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzEyX1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICBsYXllcnM6IFt0aGlzLmxheWVyXSxcbiAgICAgIGhhbmRsZXI6ICdsYW1iZGEtaGFuZGxlci5yZW5kZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoJy5udXh0L2Nkay1kZXBsb3ltZW50Jywge1xuICAgICAgICBleGNsdWRlOiBbJyoqLnN2ZycsICcqKi5pY28nLCAnKioucG5nJywgJyoqLmpwZycsICdjaHVuay4qLmpzKicsICdidW5kbGUuKi5qcyonLCAnYnVuZGxlLiouanMqJywgJ3N3LmpzKiddLFxuICAgICAgfSksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBlbnZpcm9ubWVudDoge30sXG4gICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheSgpOiBIdHRwQXBpIHtcbiAgICBjb25zdCBsYW1iZGFJbnRlZ3JhdGlvbiA9IG5ldyBIdHRwTGFtYmRhSW50ZWdyYXRpb24oYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYW1iZGEtaW50ZWdyYXRpb25gLCB0aGlzLmxhbWJkYUZ1bmN0aW9uKTtcbiAgICBjb25zdCBhcGlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcGlgO1xuICAgIGNvbnN0IGFwaUdhdGV3YXkgPSBuZXcgSHR0cEFwaSh0aGlzLCBhcGlOYW1lLCB7XG4gICAgICBhcGlOYW1lLFxuICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICB9KTtcblxuICAgIGFwaUdhdGV3YXkuYWRkUm91dGVzKHtcbiAgICAgIGludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgIHBhdGg6ICcve3Byb3h5K30nLFxuICAgICAgbWV0aG9kczogW0h0dHBNZXRob2QuR0VULCBIdHRwTWV0aG9kLkhFQURdLFxuICAgIH0pO1xuICAgIHJldHVybiBhcGlHYXRld2F5O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIdHRwc0ZvcndhcmRpbmdCZWhhdmlvcigpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW46IG5ldyBIdHRwT3JpZ2luKGAke3RoaXMuYXBpR2F0ZXdheS5odHRwQXBpSWR9LmV4ZWN1dGUtYXBpLiR7dGhpcy5yZWdpb259LmFtYXpvbmF3cy5jb21gLCB7XG4gICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICAgIHJlYWRUaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgcHJvdG9jb2xQb2xpY3k6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFksXG4gICAgICB9KSxcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuY3JlYXRlU3NyQ2FjaGVQb2xpY3koKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50aG91Z2ggd2UgZG9uJ3Qgd2FudCB0byBjYWNoZSBTU1IgcmVxdWVzdHMsIHdlIHN0aWxsIGhhdmUgdG8gY3JlYXRlIGEgY2FjaGUgcG9saWN5LCBpbiBvcmRlciB0b1xuICAgKiBmb3J3YXJkIHJlcXVpcmVkIGNvb2tpZXMsIHF1ZXJ5IHBhcmFtcyBhbmQgaGVhZGVycy4gVGhpcyBkb2Vzbid0IG1ha2UgYW55IHNlbnNlLCBiZWNhdXNlIGlmIG5vdGhpbmdcbiAgICogaXMgY2FjaGVkLCBvbmUgd291bGQgZXhwZWN0LCB0aGF0IGFueXRoaW5nIHdvdWxkL2NvdWxkIGJlIGZvcndhcmRlZCwgYnV0IGFueXdheS4uLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTc3JDYWNoZVBvbGljeSgpOiBJQ2FjaGVQb2xpY3kge1xuXG4gICAgLy8gVGhlIGhlYWRlcnMgdG8gcGFzcyB0byB0aGUgYXBwXG4gICAgY29uc3QgaGVhZGVycyA9IFtcbiAgICAgICdVc2VyLUFnZW50JywgLy8gUmVxdWlyZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtb2JpbGUgYW5kIGRlc2t0b3AgdGVtcGxhdGVcbiAgICAgICdBdXRob3JpemF0aW9uJywgLy8gRm9yIGF1dGhvcml6YXRpb25cbiAgICBdO1xuXG4gICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgIGNvbW1lbnQ6IGBQYXNzZXMgYWxsIHJlcXVpcmVkIHJlcXVlc3QgZGF0YSB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbi5gLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIG1pblR0bDogRHVyYXRpb24uc2Vjb25kcygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygxKSwgLy8gdGhlIG1heCBUVEwgbXVzdCBub3QgYmUgMCBmb3IgYSBjYWNoZSBwb2xpY3lcbiAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5oZWFkZXJzKSxcbiAgICAgIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbCgpLFxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICBjb25zdCBjZG5OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG5gO1xuXG4gICAgcmV0dXJuIG5ldyBEaXN0cmlidXRpb24odGhpcywgY2RuTmFtZSwge1xuICAgICAgZG9tYWluTmFtZXM6IHByb3BzLnN1YkRvbWFpbiA/IFtgJHtwcm9wcy5zdWJEb21haW59LiR7cHJvcHMuYmFzZURvbWFpbn1gXSA6IFtwcm9wcy5iYXNlRG9tYWluLCBgKi4ke3Byb3BzLmJhc2VEb21haW59YF0sXG4gICAgICBjb21tZW50OiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlZGlyZWN0YCxcbiAgICAgIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IFNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAxOCxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLnRsc0NlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB0aGlzLmh0dHBzRm9yd2FyZGluZ0JlaGF2aW9yLFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5jcmVhdGVTdGF0aWNBc3NldEJlaGF2aW9ycygpLFxuICAgICAgcHJpY2VDbGFzczogUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAsIC8vIFVzZSBvbmx5IE5vcnRoIEFtZXJpY2EgYW5kIEV1cm9wZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldEJlaGF2aW9ycygpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICBjb25zdCBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiBuZXcgUzNPcmlnaW4odGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsIHtcbiAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgIG9yaWdpblBhdGg6IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgfSksXG4gICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgIH07XG5cbiAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgIE51eHRBcHBTdGF0aWNBc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBydWxlc1tgJHthc3NldC50YXJnZXR9JHthc3NldC5wYXR0ZXJufWBdID0gc3RhdGljQXNzZXRzQ2FjaGVDb25maWdcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJ1bGVzXG4gIH1cblxuICAvKipcbiAgICogSW4gb3JkZXIgdG8gZW5hYmxlIGEgemVyby1kb3dudGltZSBkZXBsb3ltZW50LCB3ZSB1c2UgYSBuZXcgc3ViZGlyZWN0b3J5IChyZXZpc2lvbikgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqIFRoZSBwcmV2aW91cyB2ZXJzaW9ucyBhcmUgcmV0YWluZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggYW4gb2xkZXIgcmV2aXNpb24uXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveW1lbnRzKCk6IEJ1Y2tldERlcGxveW1lbnRbXSB7XG4gICAgY29uc3QgZGVmYXVsdENhY2hlQ29uZmlnID0gW1xuICAgICAgQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLFxuICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5kYXlzKDM2NSkpLFxuICAgICAgQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoJ2ltbXV0YWJsZScpLFxuICAgIF07XG5cbiAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICByZXR1cm4gTnV4dEFwcFN0YXRpY0Fzc2V0cy5maWx0ZXIoYXNzZXQgPT4gZnMuZXhpc3RzU3luYyhhc3NldC5zb3VyY2UpKS5tYXAoKGFzc2V0LCBhc3NldEluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC0ke2Fzc2V0SW5kZXh9YCwge1xuICAgICAgICBzb3VyY2VzOiBbU291cmNlLmFzc2V0KGFzc2V0LnNvdXJjZSldLFxuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbiArIGFzc2V0LnRhcmdldCxcbiAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgZXhjbHVkZTogWycqJ10sXG4gICAgICAgIGluY2x1ZGU6IFthc3NldC5wYXR0ZXJuXSxcbiAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wgPz8gZGVmYXVsdENhY2hlQ29uZmlnLFxuICAgICAgICBjb250ZW50VHlwZTogYXNzZXQuY29udGVudFR5cGUsXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kSG9zdGVkWm9uZShwcm9wczogTnV4dEFwcFN0YWNrUHJvcHMpOiBJSG9zdGVkWm9uZSB7XG4gICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taG9zdGVkLXpvbmVgLCB7XG4gICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCxcbiAgICAgIHpvbmVOYW1lOiBwcm9wcy5iYXNlRG9tYWluLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEbnNSZWNvcmRzKHByb3BzOiBOdXh0QXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IGRuc1RhcmdldCA9IFJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IENsb3VkRnJvbnRUYXJnZXQodGhpcy5jZG4pKTtcblxuICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NFxuICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5zdWJEb21haW4gPyBgJHtwcm9wcy5zdWJEb21haW59LiR7cHJvcHMuYmFzZURvbWFpbn1gIDogcHJvcHMuYmFzZURvbWFpbixcbiAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY2XG4gICAgbmV3IEFhYWFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY2LXJlY29yZGAsIHtcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLnN1YkRvbWFpbiA/IGAke3Byb3BzLnN1YkRvbWFpbn0uJHtwcm9wcy5iYXNlRG9tYWlufWAgOiBwcm9wcy5iYXNlRG9tYWluLFxuICAgICAgem9uZTogdGhpcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { CacheControl } from "aws-cdk-lib/aws-s3-deployment";
2
+ interface StaticAssetConfig {
3
+ pattern: string;
4
+ contentType: string;
5
+ source: string;
6
+ target: string;
7
+ cacheControl?: CacheControl[];
8
+ }
9
+ export declare const NuxtAppStaticAssets: StaticAssetConfig[];
10
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NuxtAppStaticAssets = void 0;
4
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const buildAssetsSourcePath = './.nuxt/dist/client';
7
+ const buildAssetsTargetPath = '/assets/'; // Must match 'build.publicPath' in nuxt.config.js
8
+ const customAssetsSourcePath = './src/static';
9
+ const customAssetsTargetPath = '/';
10
+ // Defines the paths with their cache settings that shall be public available in our app
11
+ // These should match the files in 'src/.nuxt/dist/client' and 'static'
12
+ exports.NuxtAppStaticAssets = [
13
+ // Build Assets
14
+ {
15
+ pattern: '*.js',
16
+ target: buildAssetsTargetPath,
17
+ source: buildAssetsSourcePath,
18
+ contentType: 'application/javascript; charset=UTF-8',
19
+ },
20
+ {
21
+ pattern: '*.js.map',
22
+ target: buildAssetsTargetPath,
23
+ source: buildAssetsSourcePath,
24
+ contentType: 'application/json; charset=UTF-8',
25
+ },
26
+ {
27
+ pattern: 'sw.js',
28
+ target: buildAssetsTargetPath,
29
+ source: buildAssetsSourcePath,
30
+ contentType: 'application/javascript; charset=UTF-8',
31
+ cacheControl: [aws_s3_deployment_1.CacheControl.setPublic(), aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.days(1))],
32
+ },
33
+ {
34
+ pattern: 'sw.js.map',
35
+ target: buildAssetsTargetPath,
36
+ source: buildAssetsSourcePath,
37
+ contentType: 'application/json; charset=UTF-8',
38
+ cacheControl: [aws_s3_deployment_1.CacheControl.setPublic(), aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.days(1))],
39
+ },
40
+ {
41
+ pattern: '*.svg',
42
+ target: buildAssetsTargetPath,
43
+ source: buildAssetsSourcePath,
44
+ contentType: 'image/svg+xml',
45
+ },
46
+ {
47
+ pattern: '*.eot',
48
+ target: buildAssetsTargetPath,
49
+ source: buildAssetsSourcePath,
50
+ contentType: 'application/vnd.ms-fontobject',
51
+ },
52
+ {
53
+ pattern: '*.ttf',
54
+ target: buildAssetsTargetPath,
55
+ source: buildAssetsSourcePath,
56
+ contentType: 'application/font-sfnt',
57
+ },
58
+ {
59
+ pattern: '*.woff',
60
+ target: buildAssetsTargetPath,
61
+ source: buildAssetsSourcePath,
62
+ contentType: 'font/woff',
63
+ },
64
+ {
65
+ pattern: '*.woff2',
66
+ target: buildAssetsTargetPath,
67
+ source: buildAssetsSourcePath,
68
+ contentType: 'font/woff2',
69
+ },
70
+ // Custom Static Assets
71
+ {
72
+ pattern: '*.png',
73
+ source: customAssetsSourcePath,
74
+ target: customAssetsTargetPath,
75
+ contentType: 'image/png',
76
+ },
77
+ {
78
+ pattern: '*.jpg',
79
+ source: customAssetsSourcePath,
80
+ target: customAssetsTargetPath,
81
+ contentType: 'image/jpg',
82
+ },
83
+ {
84
+ pattern: 'robots.txt',
85
+ source: customAssetsSourcePath,
86
+ target: customAssetsTargetPath,
87
+ contentType: 'text/plain; charset=UTF-8',
88
+ cacheControl: [aws_s3_deployment_1.CacheControl.setPublic(), aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.days(1))],
89
+ },
90
+ {
91
+ pattern: 'manifest.json',
92
+ source: customAssetsSourcePath,
93
+ target: customAssetsTargetPath,
94
+ contentType: 'application/json; charset=UTF-8',
95
+ cacheControl: [aws_s3_deployment_1.CacheControl.setPublic(), aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.days(2))],
96
+ },
97
+ ];
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtc3RhdGljLWFzc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm51eHQtYXBwLXN0YXRpYy1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTJEO0FBQzNELDZDQUFxQztBQVVyQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0scUJBQXFCLEdBQUcsVUFBVSxDQUFDLENBQUMsa0RBQWtEO0FBRTVGLE1BQU0sc0JBQXNCLEdBQUcsY0FBYyxDQUFDO0FBQzlDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBRW5DLHdGQUF3RjtBQUN4Rix1RUFBdUU7QUFDMUQsUUFBQSxtQkFBbUIsR0FBd0I7SUFFcEQsZUFBZTtJQUNmO1FBQ0ksT0FBTyxFQUFFLE1BQU07UUFDZixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsV0FBVyxFQUFFLHVDQUF1QztLQUN2RDtJQUNEO1FBQ0ksT0FBTyxFQUFFLFVBQVU7UUFDbkIsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLFdBQVcsRUFBRSxpQ0FBaUM7S0FDakQ7SUFDRDtRQUNJLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixXQUFXLEVBQUUsdUNBQXVDO1FBQ3BELFlBQVksRUFBRSxDQUFDLGdDQUFZLENBQUMsU0FBUyxFQUFFLEVBQUUsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsRjtJQUNEO1FBQ0ksT0FBTyxFQUFFLFdBQVc7UUFDcEIsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLFdBQVcsRUFBRSxpQ0FBaUM7UUFDOUMsWUFBWSxFQUFFLENBQUMsZ0NBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xGO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsV0FBVyxFQUFFLGVBQWU7S0FDL0I7SUFDRDtRQUNJLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixXQUFXLEVBQUUsK0JBQStCO0tBQy9DO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsV0FBVyxFQUFFLHVCQUF1QjtLQUN2QztJQUNEO1FBQ0ksT0FBTyxFQUFFLFFBQVE7UUFDakIsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLFdBQVcsRUFBRSxXQUFXO0tBQzNCO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsU0FBUztRQUNsQixNQUFNLEVBQUUscUJBQXFCO1FBQzdCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsV0FBVyxFQUFFLFlBQVk7S0FDNUI7SUFFRCx1QkFBdUI7SUFDdkI7UUFDSSxPQUFPLEVBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUsc0JBQXNCO1FBQzlCLE1BQU0sRUFBRSxzQkFBc0I7UUFDOUIsV0FBVyxFQUFFLFdBQVc7S0FDM0I7SUFDRDtRQUNJLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxzQkFBc0I7UUFDOUIsTUFBTSxFQUFFLHNCQUFzQjtRQUM5QixXQUFXLEVBQUUsV0FBVztLQUMzQjtJQUNEO1FBQ0ksT0FBTyxFQUFFLFlBQVk7UUFDckIsTUFBTSxFQUFFLHNCQUFzQjtRQUM5QixNQUFNLEVBQUUsc0JBQXNCO1FBQzlCLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsWUFBWSxFQUFFLENBQUMsZ0NBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2xGO0lBQ0Q7UUFDSSxPQUFPLEVBQUUsZUFBZTtRQUN4QixNQUFNLEVBQUUsc0JBQXNCO1FBQzlCLE1BQU0sRUFBRSxzQkFBc0I7UUFDOUIsV0FBVyxFQUFFLGlDQUFpQztRQUM5QyxZQUFZLEVBQUUsQ0FBQyxnQ0FBWSxDQUFDLFNBQVMsRUFBRSxFQUFFLGdDQUFZLENBQUMsTUFBTSxDQUFDLHNCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEY7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYWNoZUNvbnRyb2x9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmludGVyZmFjZSBTdGF0aWNBc3NldENvbmZpZyB7XG4gICAgcGF0dGVybjogc3RyaW5nLCAvLyBUaGUgcGF0dGVybiB0byB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgZmlsZXNcbiAgICBjb250ZW50VHlwZTogc3RyaW5nLCAvLyBUaGUgdHlwZSBvZiB0aGUgZmlsZXMgdG8gdXBsb2FkXG4gICAgc291cmNlOiBzdHJpbmcsIC8vIFRoZSBsb2NhbCBkaXJlY3RvcnkgdG8gdXBsb2FkIHRoZSBmaWxlcyBmcm9tXG4gICAgdGFyZ2V0OiBzdHJpbmcsIC8vIFRoZSByZW1vdGUgcGF0aCBhdCB3aGljaCB0byBtYWtlIHRoZSB1cGxvYWRlZCBmaWxlcyBhY2Nlc3NpYmxlXG4gICAgY2FjaGVDb250cm9sPzogQ2FjaGVDb250cm9sW10gLy8gVGhlIGN1c3RvbSBjYWNoZSBzZXR0aW5nc1xufVxuXG5jb25zdCBidWlsZEFzc2V0c1NvdXJjZVBhdGggPSAnLi8ubnV4dC9kaXN0L2NsaWVudCc7XG5jb25zdCBidWlsZEFzc2V0c1RhcmdldFBhdGggPSAnL2Fzc2V0cy8nOyAvLyBNdXN0IG1hdGNoICdidWlsZC5wdWJsaWNQYXRoJyBpbiBudXh0LmNvbmZpZy5qc1xuXG5jb25zdCBjdXN0b21Bc3NldHNTb3VyY2VQYXRoID0gJy4vc3JjL3N0YXRpYyc7XG5jb25zdCBjdXN0b21Bc3NldHNUYXJnZXRQYXRoID0gJy8nO1xuXG4vLyBEZWZpbmVzIHRoZSBwYXRocyB3aXRoIHRoZWlyIGNhY2hlIHNldHRpbmdzIHRoYXQgc2hhbGwgYmUgcHVibGljIGF2YWlsYWJsZSBpbiBvdXIgYXBwXG4vLyBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIGZpbGVzIGluICdzcmMvLm51eHQvZGlzdC9jbGllbnQnIGFuZCAnc3RhdGljJ1xuZXhwb3J0IGNvbnN0IE51eHRBcHBTdGF0aWNBc3NldHM6IFN0YXRpY0Fzc2V0Q29uZmlnW10gPSBbXG5cbiAgICAvLyBCdWlsZCBBc3NldHNcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICcqLmpzJyxcbiAgICAgICAgdGFyZ2V0OiBidWlsZEFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgIHNvdXJjZTogYnVpbGRBc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9VVRGLTgnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXR0ZXJuOiAnKi5qcy5tYXAnLFxuICAgICAgICB0YXJnZXQ6IGJ1aWxkQXNzZXRzVGFyZ2V0UGF0aCxcbiAgICAgICAgc291cmNlOiBidWlsZEFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCcsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICdzdy5qcycsXG4gICAgICAgIHRhcmdldDogYnVpbGRBc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBzb3VyY2U6IGJ1aWxkQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04JyxcbiAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLCBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLmRheXMoMSkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0dGVybjogJ3N3LmpzLm1hcCcsXG4gICAgICAgIHRhcmdldDogYnVpbGRBc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBzb3VyY2U6IGJ1aWxkQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04JyxcbiAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLCBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLmRheXMoMSkpXSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0dGVybjogJyouc3ZnJyxcbiAgICAgICAgdGFyZ2V0OiBidWlsZEFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgIHNvdXJjZTogYnVpbGRBc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICBjb250ZW50VHlwZTogJ2ltYWdlL3N2Zyt4bWwnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXR0ZXJuOiAnKi5lb3QnLFxuICAgICAgICB0YXJnZXQ6IGJ1aWxkQXNzZXRzVGFyZ2V0UGF0aCxcbiAgICAgICAgc291cmNlOiBidWlsZEFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXR0ZXJuOiAnKi50dGYnLFxuICAgICAgICB0YXJnZXQ6IGJ1aWxkQXNzZXRzVGFyZ2V0UGF0aCxcbiAgICAgICAgc291cmNlOiBidWlsZEFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vZm9udC1zZm50JyxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgcGF0dGVybjogJyoud29mZicsXG4gICAgICAgIHRhcmdldDogYnVpbGRBc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBzb3VyY2U6IGJ1aWxkQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgY29udGVudFR5cGU6ICdmb250L3dvZmYnLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwYXR0ZXJuOiAnKi53b2ZmMicsXG4gICAgICAgIHRhcmdldDogYnVpbGRBc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBzb3VyY2U6IGJ1aWxkQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgY29udGVudFR5cGU6ICdmb250L3dvZmYyJyxcbiAgICB9LFxuXG4gICAgLy8gQ3VzdG9tIFN0YXRpYyBBc3NldHNcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICcqLnBuZycsXG4gICAgICAgIHNvdXJjZTogY3VzdG9tQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBjb250ZW50VHlwZTogJ2ltYWdlL3BuZycsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICcqLmpwZycsXG4gICAgICAgIHNvdXJjZTogY3VzdG9tQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICBjb250ZW50VHlwZTogJ2ltYWdlL2pwZycsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICdyb2JvdHMudHh0JyxcbiAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcsXG4gICAgICAgIGNhY2hlQ29udHJvbDogW0NhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSwgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5kYXlzKDEpKV0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHBhdHRlcm46ICdtYW5pZmVzdC5qc29uJyxcbiAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCcsXG4gICAgICAgIGNhY2hlQ29udHJvbDogW0NhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSwgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5kYXlzKDIpKV0sXG4gICAgfSxcbl07Il19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdk-nuxt",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "lib"
package/dist/index.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- var nuxt_app_stack_1 = require("./stack/nuxt-app-stack");
4
- Object.defineProperty(exports, "NuxtAppStack", { enumerable: true, get: function () { return nuxt_app_stack_1.NuxtAppStack; } });
5
- var nuxt_app_assets_cleanup_stack_1 = require("./stack/nuxt-app-assets-cleanup-stack");
6
- Object.defineProperty(exports, "NuxtAppAssetsCleanupStack", { enumerable: true, get: function () { return nuxt_app_assets_cleanup_stack_1.NuxtAppAssetsCleanupStack; } });
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5REFBc0U7QUFBOUQsOEdBQUEsWUFBWSxPQUFBO0FBQ3BCLHVGQUEwRztBQUFsRywwSUFBQSx5QkFBeUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7TnV4dEFwcFN0YWNrLCBOdXh0QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4vc3RhY2svbnV4dC1hcHAtc3RhY2tcIlxuZXhwb3J0IHtOdXh0QXBwQXNzZXRzQ2xlYW51cFN0YWNrLCBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzfSBmcm9tIFwiLi9zdGFjay9udXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFja1wiIl19
package/lib/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export {NuxtAppStack, NuxtAppStackProps} from "./stack/nuxt-app-stack"
2
- export {NuxtAppAssetsCleanupStack, NuxtAppAssetsCleanupProps} from "./stack/nuxt-app-assets-cleanup-stack"