cdk-nuxt 0.2.10 → 0.3.2

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.
package/README.md CHANGED
@@ -1,14 +1,5 @@
1
- # Welcome to your CDK TypeScript project!
1
+ # Easy Nuxt deployments on AWS via CDK
2
2
 
3
- This is a blank project for TypeScript development with CDK.
3
+ This package allows deployments of Nuxt applications via CDK on AWS by using Route53, API Gateway, Cloudfront, Lambda and S3.
4
4
 
5
- The `cdk.json` file tells the CDK Toolkit how to execute your app.
6
-
7
- ## Useful commands
8
-
9
- * `npm run build` compile typescript to js
10
- * `npm run watch` watch for changes and compile
11
- * `npm run test` perform the jest unit tests
12
- * `cdk deploy` deploy this stack to your default AWS account/region
13
- * `cdk diff` compare deployed stack with current state
14
- * `cdk synth` emits the synthesized CloudFormation template
5
+ This package is currently in development and will be published with a full Readme shortly.
package/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
+ export { AppStackProps } from "./lib/stack/app-stack-props";
1
2
  export { NuxtAppStack, NuxtAppStackProps } from "./lib/stack/nuxt-app-stack";
2
3
  export { NuxtAppAssetsCleanupStack, NuxtAppAssetsCleanupProps } from "./lib/stack/nuxt-app-assets-cleanup-stack";
package/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NuxtAppAssetsCleanupStack = exports.NuxtAppStack = void 0;
3
4
  var nuxt_app_stack_1 = require("./lib/stack/nuxt-app-stack");
4
5
  Object.defineProperty(exports, "NuxtAppStack", { enumerable: true, get: function () { return nuxt_app_stack_1.NuxtAppStack; } });
5
6
  var nuxt_app_assets_cleanup_stack_1 = require("./lib/stack/nuxt-app-assets-cleanup-stack");
6
7
  Object.defineProperty(exports, "NuxtAppAssetsCleanupStack", { enumerable: true, get: function () { return nuxt_app_assets_cleanup_stack_1.NuxtAppAssetsCleanupStack; } });
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZEQUEwRTtBQUFsRSw4R0FBQSxZQUFZLE9BQUE7QUFDcEIsMkZBQThHO0FBQXRHLDBJQUFBLHlCQUF5QixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtOdXh0QXBwU3RhY2ssIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9saWIvc3RhY2svbnV4dC1hcHAtc3RhY2tcIlxuZXhwb3J0IHtOdXh0QXBwQXNzZXRzQ2xlYW51cFN0YWNrLCBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzfSBmcm9tIFwiLi9saWIvc3RhY2svbnV4dC1hcHAtYXNzZXRzLWNsZWFudXAtc3RhY2tcIiJdfQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBMEU7QUFBbEUsOEdBQUEsWUFBWSxPQUFBO0FBQ3BCLDJGQUE4RztBQUF0RywwSUFBQSx5QkFBeUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7QXBwU3RhY2tQcm9wc30gZnJvbSBcIi4vbGliL3N0YWNrL2FwcC1zdGFjay1wcm9wc1wiXG5leHBvcnQge051eHRBcHBTdGFjaywgTnV4dEFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL2xpYi9zdGFjay9udXh0LWFwcC1zdGFja1wiXG5leHBvcnQge051eHRBcHBBc3NldHNDbGVhbnVwU3RhY2ssIE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHN9IGZyb20gXCIuL2xpYi9zdGFjay9udXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFja1wiIl19
package/lib/cli/deploy.js CHANGED
@@ -3,54 +3,71 @@
3
3
  const shell = require("shelljs");
4
4
  const path = require("path");
5
5
 
6
+ const logPrefix = 'Nuxt Deployment';
7
+
8
+ shell.echo(`${logPrefix}: Starting deployment...`);
9
+
6
10
  const deploymentFolder = '.nuxt/cdk-deployment';
7
11
  const deploymentSourceFolder = `${deploymentFolder}/src`;
8
12
  const deploymentLayerFolder = `${deploymentFolder}/layer/nodejs`;
13
+ const rootFolder = process.cwd();
9
14
 
10
- // Refresh the deployment folder to a clean state
11
- shell.echo('Refreshing deployment folder...');
15
+ // Refresh the cdk output folder to have a clean state and prevent persisting outdated outputs
16
+ shell.echo(`${logPrefix}: Deleting outdated CDK files...`);
17
+ shell.rm('-rf', 'cdk.out');
18
+
19
+ // Refresh the deployment folder to have a clean state
20
+ shell.echo(`${logPrefix}: Refreshing deployment folder [${deploymentFolder}]...`);
12
21
  shell.rm('-rf', deploymentFolder);
13
22
  shell.mkdir('-p', `${deploymentSourceFolder}/.nuxt/dist`);
14
23
  shell.mkdir('-p', deploymentLayerFolder);
15
24
 
16
25
  // Preparing the assets cleanup lambda function
17
- shell.echo('Preparing the assets cleanup lambda function...');
26
+ shell.echo(`${logPrefix}: Installing the assets cleanup lambda function...`);
18
27
  shell.cd(path.join(__dirname, '../functions/assets_cleanup'));
19
28
  if (shell.exec('yarn install --frozen-lockfile && yarn install-layer').code !== 0) {
20
- shell.echo('Error: Installation of assets cleanup lambda function failed.');
29
+ shell.echo(`${logPrefix} Error: Installation of assets cleanup lambda function failed.`);
21
30
  shell.exit(1);
22
31
  }
32
+ shell.echo(`${logPrefix}: Building the assets cleanup lambda function...`);
23
33
  if (shell.exec('yarn build').code !== 0) {
24
- shell.echo('Error: Build of assets cleanup lambda function failed.');
34
+ shell.echo(`${logPrefix} Error: Build of assets cleanup lambda function failed.`);
25
35
  shell.exit(1);
26
36
  }
27
- shell.cd('../../../../..');
37
+ shell.cd(rootFolder);
28
38
 
29
39
  // Copy our files required for SSR
30
- shell.echo('Copying ssr files for Nuxt app...');
40
+ shell.echo(`${logPrefix}: Copying ssr files to deployment folder...`);
31
41
  shell.cp('-r', '.nuxt/dist/server', `${deploymentSourceFolder}/.nuxt/dist`);
32
42
  shell.cp(path.join(__dirname, '../functions/app/index.js'), deploymentSourceFolder);
33
43
 
44
+ // Copy the config files
45
+ shell.echo(`${logPrefix}: Copying config files to deployment folder...`);
46
+ shell.cp('.env', deploymentSourceFolder);
47
+ shell.cp('nuxt.config.js', deploymentSourceFolder);
48
+
34
49
  // Prepare the Lambda layer for the node_modules required for SSR of the Nuxt app
35
- shell.echo('Preparing the lambda layer for Nuxt app...');
50
+ shell.echo(`${logPrefix}: Preparing the node_modules lambda layer in deployment folder...`);
36
51
  shell.cp('package.json', deploymentLayerFolder);
37
52
  shell.cp('yarn.lock', deploymentLayerFolder);
53
+ shell.cp('.yarnclean', deploymentLayerFolder);
38
54
  shell.cd(deploymentLayerFolder);
55
+
56
+ // We do not want to install any dependencies listed under 'devDendencies'
57
+ // Usually the --production flag should do the trick but somehow still installs more dependencies as required
58
+ shell.exec('sed -i \'\' \'/\\"devDependencies\\"/,/}/ d\' package.json')
39
59
  if (shell.exec('yarn install --production --frozen-lockfile').code !== 0) {
40
- shell.echo('Error: Installation of lambda layer failed.');
60
+ shell.echo(`${logPrefix} Error: Installation of lambda layer failed.`);
41
61
  shell.exit(1);
42
62
  }
43
- shell.cd('../../../..');
44
-
45
- // Copy the config files
46
- shell.echo('Copying config files...');
47
- shell.cp('.env', deploymentSourceFolder);
48
- shell.cp('nuxt.config.js', deploymentSourceFolder);
63
+ shell.cd(rootFolder);
49
64
 
50
65
  // Run the deployment
66
+ shell.echo(`${logPrefix}: Running deployment to AWS via CDK...`);
51
67
  if (shell.exec('yarn cdk deploy --require-approval never --all --app="yarn ts-node stack/index.ts"').code !== 0) {
52
- shell.echo('Error: CDK deployment failed.');
68
+ shell.echo(`${logPrefix} Error: CDK deployment failed.`);
53
69
  shell.exit(1);
54
70
  }
55
71
 
56
- shell.echo('CDK deployment succeeded.');
72
+ shell.echo(`${logPrefix}: CDK deployment successful.`);
73
+
@@ -15,7 +15,7 @@ exports.handler = async (event, context) => {
15
15
  // As we don't have hundreds of deployments per week, there's no need for pagination
16
16
  const deploymentFolders = await client.send(new client_s3_1.ListObjectsV2Command({
17
17
  Bucket: bucketName,
18
- Delimiter: '/',
18
+ Delimiter: '/', // Only retrieve the top level folders
19
19
  }));
20
20
  // The result is a list of objects containing the keys with a trailing slash
21
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); });
@@ -79,4 +79,4 @@ exports.handler = async (event, context) => {
79
79
  console.error('### unexpected runtime error ###', error);
80
80
  }
81
81
  };
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUF3RjtBQUV4RixNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFekQsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBVSxFQUFFLE9BQVksRUFBRSxFQUFFOztJQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFFdEUsSUFBSTtRQUNBLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHdCQUF3QixDQUFDLENBQUM7UUFFeEUsb0ZBQW9GO1FBQ3BGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUN2QyxJQUFJLGdDQUFvQixDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1NBQ2pCLENBQUMsQ0FDTCxDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLE1BQU0sV0FBVyxTQUFHLGlCQUFpQixDQUFDLGNBQWMsMENBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLHdCQUFDLE1BQU0sQ0FBQyxNQUFNLDBDQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUMsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FB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QUMsT0FBTyxLQUFLLEVBQUU7UUFDWixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVEO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZWxldGVPYmplY3RzQ29tbWFuZCwgTGlzdE9iamVjdHNWMkNvbW1hbmQsIFMzQ2xpZW50fSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5cbmNvbnN0IE9ORV9XRUVLX0lOX01JTExJU0VDT05EUyA9IDEwMDAgKiA2MCAqIDYwICogMjQgKiA3O1xuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIGNsZWFudXAgb2Ygc3RhdGljIGFzc2V0cyBvbGRlciB0aGFuIDEgd2Vlay4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtyZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT059KTtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IHByb2Nlc3MuZW52LlNUQVRJQ19BU1NFVFNfQlVDS0VUO1xuXG4gICAgICAgIGlmICghYnVja2V0TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RhdGljIGFzc2V0J3MgYnVja2V0IG5hbWUgbm90IHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWxldGVPbGRlclRoYW4gPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gT05FX1dFRUtfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgICAgICAvLyBBcyB3ZSBkb24ndCBoYXZlIGh1bmRyZWRzIG9mIGRlcGxveW1lbnRzIHBlciB3ZWVrLCB0aGVyZSdzIG5vIG5lZWQgZm9yIHBhZ2luYXRpb25cbiAgICAgICAgY29uc3QgZGVwbG95bWVudEZvbGRlcnMgPSBhd2FpdCBjbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgIERlbGltaXRlcjogJy8nLCAvLyBPbmx5IHJldHJpZXZlIHRoZSB0b3AgbGV2ZWwgZm9sZGVyc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUaGUgcmVzdWx0IGlzIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGtleXMgd2l0aCBhIHRyYWlsaW5nIHNsYXNoXG4gICAgICAgIGNvbnN0IGZvbGRlck5hbWVzID0gZGVwbG95bWVudEZvbGRlcnMuQ29tbW9uUHJlZml4ZXM/Lm1hcChmb2xkZXIgPT4gZm9sZGVyLlByZWZpeD8uc2xpY2UoMCwgLTEpKVxuICAgICAgICBpZiAoIWZvbGRlck5hbWVzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FuY2VsZWQgc3RhdGljIGFzc2V0cyBjbGVhbnVwIGFzIGZvbGRlciBpcyBlbXB0eS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHNvcnQgdGhlIGZvbGRlcnMgYnkgdGhlaXIgY3JlYXRpb24gZGF0YSBhbmQgcmVtb3ZlIHRoZSBsYXRlc3Qgb25lIGFzIHRoaXMgaXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgb25lIHVzZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICBjb25zdCBsZWdhY3lGb2xkZXJOYW1lcyA9IGZvbGRlck5hbWVzLnNvcnQoKGEsYikgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY3JlYXRpb25EYXRlQSA9IG5ldyBEYXRlKGEpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgY3JlYXRpb25EYXRlQiA9IG5ldyBEYXRlKGIpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlQS5nZXRUaW1lKCkgPCBjcmVhdGlvbkRhdGVCLmdldFRpbWUoKSA/IC0xIDogMTtcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgYWN0aXZlRm9sZGVyTmFtZSA9IGxlZ2FjeUZvbGRlck5hbWVzLnBvcCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgRGV0ZWN0ZWQgYXNzZXRzIGZvbGRlciBcIiR7YWN0aXZlRm9sZGVyTmFtZX1cIiBhcyBjdXJyZW50IHByb2R1Y3Rpb24gZm9sZGVyLi4uYCk7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBnZXQgYWxsIG91dGRhdGVkIGZvbGRlcnMgb2Ygb3VyIGxlZ2FjeSAobm90IHByb2R1Y3RpdmVseSB1c2VkKSBmb2xkZXJzIGZvciBkZWxldGlvblxuICAgICAgICBjb25zdCBvdXRkYXRlZEZvbGRlck5hbWVzID0gbGVnYWN5Rm9sZGVyTmFtZXMuZmlsdGVyKGZvbGRlck5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZShmb2xkZXJOYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlLmdldFRpbWUoKSA8IGRlbGV0ZU9sZGVyVGhhbi5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFvdXRkYXRlZEZvbGRlck5hbWVzIHx8IG91dGRhdGVkRm9sZGVyTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gb3V0ZGF0ZWQgYXNzZXQgZm9sZGVycyBmb3VuZC4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyAke291dGRhdGVkRm9sZGVyTmFtZXMubGVuZ3RofSBvdXRkYXRlZCBmb2xkZXJzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQncyBub3QgcG9zc2libGUgdG8gZGVsZXRlIGZvbGRlcnMgcmVjdXJzaXZlbHkg8J+ZhFxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBxdWVyeSBhbGwgdGhlIGNvbnRlbnRzIGluIG9yZGVyIHRvIGRlbGV0ZSB0aGVtXG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nUHJvbWlzZXMgPSBvdXRkYXRlZEZvbGRlck5hbWVzLm1hcChmb2xkZXJOYW1lID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50XG4gICAgICAgICAgICAgICAgICAgIC5zZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4OiBmb2xkZXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihvdXRkYXRlZEFzc2V0cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LnNlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdHM6IG91dGRhdGVkQXNzZXRzLkNvbnRlbnRzPy5tYXAob3V0ZGF0ZWRBc3NldCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtLZXk6IG91dGRhdGVkQXNzZXQuS2V5fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocGVuZGluZ1Byb21pc2VzKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRXJyb3JzICYmIHJlc3VsdC5FcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ0ZhaWxlZCB0byBkZWxldGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cy4nO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTXNnLCByZXN1bHQuRXJyb3JzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdDbGVhbnVwIG9mIG9sZCBzdGF0aWMgYXNzZXRzIGZpbmlzaGVkLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyMjIyB1bmV4cGVjdGVkIHJ1bnRpbWUgZXJyb3IgIyMjJywgZXJyb3IpO1xuICAgIH1cbn07Il19
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUF3RjtBQUV4RixNQUFNLHdCQUF3QixHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFekQsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBVSxFQUFFLE9BQVksRUFBRSxFQUFFOztJQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFFdEUsSUFBSTtRQUNBLE1BQU0sTUFBTSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLHdCQUF3QixDQUFDLENBQUM7UUFFeEUsb0ZBQW9GO1FBQ3BGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUN2QyxJQUFJLGdDQUFvQixDQUFDO1lBQ3JCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFNBQVMsRUFBRSxHQUFHLEVBQUUsc0NBQXNDO1NBQ3pELENBQUMsQ0FDTCxDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLE1BQU0sV0FBVyxHQUFHLE1BQUEsaUJBQWlCLENBQUMsY0FBYywwQ0FBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBQyxPQUFBLE1BQUEsTUFBTSxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FB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LENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7S0FDekQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDNUQ7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlbGV0ZU9iamVjdHNDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUzNDbGllbnR9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcblxuY29uc3QgT05FX1dFRUtfSU5fTUlMTElTRUNPTkRTID0gMTAwMCAqIDYwICogNjAgKiAyNCAqIDc7XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY2xlYW51cCBvZiBzdGF0aWMgYXNzZXRzIG9sZGVyIHRoYW4gMSB3ZWVrLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgUzNDbGllbnQoe3JlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTn0pO1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gcHJvY2Vzcy5lbnYuU1RBVElDX0FTU0VUU19CVUNLRVQ7XG5cbiAgICAgICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdGF0aWMgYXNzZXQncyBidWNrZXQgbmFtZSBub3Qgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGV0ZU9sZGVyVGhhbiA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBPTkVfV0VFS19JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICAgIC8vIEFzIHdlIGRvbid0IGhhdmUgaHVuZHJlZHMgb2YgZGVwbG95bWVudHMgcGVyIHdlZWssIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBkZXBsb3ltZW50Rm9sZGVycyA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRGVsaW1pdGVyOiAnLycsIC8vIE9ubHkgcmV0cmlldmUgdGhlIHRvcCBsZXZlbCBmb2xkZXJzXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIG9iamVjdHMgY29udGFpbmluZyB0aGUga2V5cyB3aXRoIGEgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgY29uc3QgZm9sZGVyTmFtZXMgPSBkZXBsb3ltZW50Rm9sZGVycy5Db21tb25QcmVmaXhlcz8ubWFwKGZvbGRlciA9PiBmb2xkZXIuUHJlZml4Py5zbGljZSgwLCAtMSkpXG4gICAgICAgIGlmICghZm9sZGVyTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5jZWxlZCBzdGF0aWMgYXNzZXRzIGNsZWFudXAgYXMgZm9sZGVyIGlzIGVtcHR5LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugc29ydCB0aGUgZm9sZGVycyBieSB0aGVpciBjcmVhdGlvbiBkYXRhIGFuZCByZW1vdmUgdGhlIGxhdGVzdCBvbmUgYXMgdGhpcyBpcyB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgdXNlZCBpbiBwcm9kdWN0aW9uXG4gICAgICAgIGNvbnN0IGxlZ2FjeUZvbGRlck5hbWVzID0gZm9sZGVyTmFtZXMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGVBID0gbmV3IERhdGUoYSk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBjcmVhdGlvbkRhdGVCID0gbmV3IERhdGUoYik7XG5cbiAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGVBLmdldFRpbWUoKSA8IGNyZWF0aW9uRGF0ZUIuZ2V0VGltZSgpID8gLTEgOiAxO1xuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RpdmVGb2xkZXJOYW1lID0gbGVnYWN5Rm9sZGVyTmFtZXMucG9wKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZXRlY3RlZCBhc3NldHMgZm9sZGVyIFwiJHthY3RpdmVGb2xkZXJOYW1lfVwiIGFzIGN1cnJlbnQgcHJvZHVjdGlvbiBmb2xkZXIuLi5gKTtcblxuICAgICAgICAvLyBXZSB3YW50IHRvIGdldCBhbGwgb3V0ZGF0ZWQgZm9sZGVycyBvZiBvdXIgbGVnYWN5IChub3QgcHJvZHVjdGl2ZWx5IHVzZWQpIGZvbGRlcnMgZm9yIGRlbGV0aW9uXG4gICAgICAgIGNvbnN0IG91dGRhdGVkRm9sZGVyTmFtZXMgPSBsZWdhY3lGb2xkZXJOYW1lcy5maWx0ZXIoZm9sZGVyTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKGZvbGRlck5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGUuZ2V0VGltZSgpIDwgZGVsZXRlT2xkZXJUaGFuLmdldFRpbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIW91dGRhdGVkRm9sZGVyTmFtZXMgfHwgb3V0ZGF0ZWRGb2xkZXJOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBvdXRkYXRlZCBhc3NldCBmb2xkZXJzIGZvdW5kLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nICR7b3V0ZGF0ZWRGb2xkZXJOYW1lcy5sZW5ndGh9IG91dGRhdGVkIGZvbGRlcnMuLi5gKTtcblxuICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWxldGUgZm9sZGVycyByZWN1cnNpdmVseSDwn5mEXG4gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHF1ZXJ5IGFsbCB0aGUgY29udGVudHMgaW4gb3JkZXIgdG8gZGVsZXRlIHRoZW1cbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IG91dGRhdGVkRm9sZGVyTmFtZXMubWFwKGZvbGRlck5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLnNlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVmaXg6IGZvbGRlck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKG91dGRhdGVkQXNzZXRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0czogb3V0ZGF0ZWRBc3NldHMuQ29udGVudHM/Lm1hcChvdXRkYXRlZEFzc2V0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge0tleTogb3V0ZGF0ZWRBc3NldC5LZXl9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nUHJvbWlzZXMpO1xuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5FcnJvcnMgJiYgcmVzdWx0LkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSAnRmFpbGVkIHRvIGRlbGV0ZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzLic7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNc2csIHJlc3VsdC5FcnJvcnMpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0NsZWFudXAgb2Ygb2xkIHN0YXRpYyBhc3NldHMgZmluaXNoZWQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignIyMjIHVuZXhwZWN0ZWQgcnVudGltZSBlcnJvciAjIyMnLCBlcnJvcik7XG4gICAgfVxufTsiXX0=
@@ -10,8 +10,8 @@
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^16.11.0",
13
- "ts-node": "^10.3.0",
14
- "typescript": "^4.4.0"
13
+ "ts-node": "^10.5.0",
14
+ "typescript": "^4.5.5"
15
15
  },
16
16
  "dependencies": {
17
17
  "@aws-sdk/client-s3": "^3.37.0"
@@ -909,7 +909,7 @@ make-error@^1.1.1:
909
909
  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
910
910
  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
911
911
 
912
- ts-node@^10.3.0:
912
+ ts-node@^10.5.0:
913
913
  version "10.5.0"
914
914
  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9"
915
915
  integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw==
@@ -938,7 +938,7 @@ tslib@^2.3.0:
938
938
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
939
939
  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
940
940
 
941
- typescript@^4.4.0:
941
+ typescript@^4.5.5:
942
942
  version "4.5.5"
943
943
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
944
944
  integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
@@ -1,6 +1,22 @@
1
1
  import { StackProps } from "aws-cdk-lib";
2
+ /**
3
+ * Defines the common props required for the individual stacks
4
+ * of our Nuxt CDK app.
5
+ */
2
6
  export interface AppStackProps extends StackProps {
7
+ /**
8
+ * A string identifier for the project the Nuxt app is part of.
9
+ * A project might have multiple different services.
10
+ */
3
11
  readonly project: string;
12
+ /**
13
+ * A string identifier for the project's service the Nuxt app is created for.
14
+ * This can be seen as the name of the Nuxt app.
15
+ */
4
16
  readonly service: string;
17
+ /**
18
+ * A string to identify the environment of the Nuxt app. This enables us
19
+ * to deploy multiple different environments of the same Nuxt app, e.g., production and development.
20
+ */
5
21
  readonly environment: string;
6
22
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWNrLXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLXN0YWNrLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YWNrUHJvcHN9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGVudmlyb25tZW50OiBzdHJpbmc7XG59Il19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWNrLXByb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLXN0YWNrLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YWNrUHJvcHN9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGNvbW1vbiBwcm9wcyByZXF1aXJlZCBmb3IgdGhlIGluZGl2aWR1YWwgc3RhY2tzXG4gKiBvZiBvdXIgTnV4dCBDREsgYXBwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0IHRoZSBOdXh0IGFwcCBpcyBwYXJ0IG9mLlxuICAgICAqIEEgcHJvamVjdCBtaWdodCBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBzZXJ2aWNlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdCdzIHNlcnZpY2UgdGhlIE51eHQgYXBwIGlzIGNyZWF0ZWQgZm9yLlxuICAgICAqIFRoaXMgY2FuIGJlIHNlZW4gYXMgdGhlIG5hbWUgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgTnV4dCBhcHAuIFRoaXMgZW5hYmxlcyB1c1xuICAgICAqIHRvIGRlcGxveSBtdWx0aXBsZSBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIG9mIHRoZSBzYW1lIE51eHQgYXBwLCBlLmcuLCBwcm9kdWN0aW9uIGFuZCBkZXZlbG9wbWVudC5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nO1xufSJdfQ==
@@ -1,7 +1,26 @@
1
1
  import {StackProps} from "aws-cdk-lib";
2
2
 
3
+ /**
4
+ * Defines the common props required for the individual stacks
5
+ * of our Nuxt CDK app.
6
+ */
3
7
  export interface AppStackProps extends StackProps {
8
+
9
+ /**
10
+ * A string identifier for the project the Nuxt app is part of.
11
+ * A project might have multiple different services.
12
+ */
4
13
  readonly project: string;
14
+
15
+ /**
16
+ * A string identifier for the project's service the Nuxt app is created for.
17
+ * This can be seen as the name of the Nuxt app.
18
+ */
5
19
  readonly service: string;
20
+
21
+ /**
22
+ * A string to identify the environment of the Nuxt app. This enables us
23
+ * to deploy multiple different environments of the same Nuxt app, e.g., production and development.
24
+ */
6
25
  readonly environment: string;
7
26
  }
@@ -2,21 +2,52 @@ import { IBucket } from "aws-cdk-lib/aws-s3";
2
2
  import { Stack } from "aws-cdk-lib";
3
3
  import { AppStackProps } from "./app-stack-props";
4
4
  import { Construct } from "constructs";
5
+ /**
6
+ * Defines the props required for the {@see NuxtAppAssetsCleanupStack}.
7
+ */
5
8
  export interface NuxtAppAssetsCleanupProps extends AppStackProps {
9
+ /**
10
+ * The S3 bucket where the static assets of the Nuxt app are located.
11
+ */
6
12
  readonly staticAssetsBucket: IBucket;
7
- readonly sentryDsn: string;
8
13
  }
9
14
  /**
10
- * Contains a scheduled lambda function, that deletes outdated static assets of the PWA from S3.
15
+ * Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
16
+ * to keep it nice without any outdated files that aren't used anymore.
11
17
  */
12
18
  export declare class NuxtAppAssetsCleanupStack extends Stack {
19
+ /**
20
+ * The identifier prefix of the resources created by the stack.
21
+ *
22
+ * @private
23
+ */
13
24
  private readonly resourceIdPrefix;
14
- private staticAssetsBucket;
15
- private readonly layer;
25
+ /**
26
+ * A reference to the created lambda function that cleanups the outdated static assets of the Nuxt app.
27
+ *
28
+ * @private
29
+ */
16
30
  private readonly lambdaFunction;
17
- private scheduledRule;
18
31
  constructor(scope: Construct, id: string, props: NuxtAppAssetsCleanupProps);
19
- private createLayer;
32
+ /**
33
+ * Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
34
+ *
35
+ * @param props
36
+ * @private
37
+ */
20
38
  private createLambdaFunction;
39
+ /**
40
+ * Creates a lambda layer for the cleanup function that holds the required node_modules.
41
+ *
42
+ * @private
43
+ */
44
+ private createNodeModulesLayer;
45
+ /**
46
+ * Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
47
+ * our cleanup lamda function.
48
+ *
49
+ * @param props
50
+ * @private
51
+ */
21
52
  private createRule;
22
53
  }
@@ -8,58 +8,71 @@ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
8
8
  const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
9
9
  const path = require("path");
10
10
  /**
11
- * Contains a scheduled lambda function, that deletes outdated static assets of the PWA from S3.
11
+ * Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
12
+ * to keep it nice without any outdated files that aren't used anymore.
12
13
  */
13
14
  class NuxtAppAssetsCleanupStack extends aws_cdk_lib_1.Stack {
14
15
  constructor(scope, id, props) {
15
16
  super(scope, id, props);
16
- // Note, that this stack can't be tagged independently of the NuxtAppStack, as both are sharing the
17
- // same scope (CDK App). This would overwrite previous set tags for the CDK App (last one wins).
18
17
  this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
19
- this.staticAssetsBucket = props.staticAssetsBucket;
20
- this.layer = this.createLayer();
21
18
  this.lambdaFunction = this.createLambdaFunction(props);
22
- this.scheduledRule = this.createRule(props);
23
- }
24
- createLayer() {
25
- const layerName = `${this.resourceIdPrefix}-layer`;
26
- return new aws_lambda_1.LayerVersion(this, layerName, {
27
- layerVersionName: layerName,
28
- code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
29
- compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_14_X],
30
- });
19
+ this.createRule(props);
31
20
  }
21
+ /**
22
+ * Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
23
+ *
24
+ * @param props
25
+ * @private
26
+ */
32
27
  createLambdaFunction(props) {
33
28
  const functionName = `${this.resourceIdPrefix}-function`;
34
29
  const result = new aws_lambda_1.Function(this, functionName, {
35
30
  functionName: functionName,
31
+ description: `Auto-deletes the outdated static assets in the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
36
32
  runtime: aws_lambda_1.Runtime.NODEJS_14_X,
37
33
  architecture: aws_lambda_1.Architecture.ARM_64,
38
- layers: [this.layer],
34
+ layers: [this.createNodeModulesLayer()],
39
35
  handler: 'index.handler',
40
36
  code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/app')),
41
37
  timeout: aws_cdk_lib_1.Duration.minutes(1),
42
38
  memorySize: 128,
43
39
  logRetention: aws_logs_1.RetentionDays.TWO_WEEKS,
44
40
  environment: {
45
- STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
46
- SENTRY_DSN: props.sentryDsn,
41
+ STATIC_ASSETS_BUCKET: props.staticAssetsBucket.bucketName,
47
42
  ENVIRONMENT: props.environment,
48
43
  AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
49
44
  NODE_OPTIONS: '--enable-source-maps',
50
45
  },
51
46
  });
52
47
  // grant function access to S3 bucket
53
- this.staticAssetsBucket.grantRead(result);
54
- this.staticAssetsBucket.grantDelete(result);
48
+ props.staticAssetsBucket.grantRead(result);
49
+ props.staticAssetsBucket.grantDelete(result);
55
50
  return result;
56
51
  }
52
+ /**
53
+ * Creates a lambda layer for the cleanup function that holds the required node_modules.
54
+ *
55
+ * @private
56
+ */
57
+ createNodeModulesLayer() {
58
+ return new aws_lambda_1.LayerVersion(this, `${this.resourceIdPrefix}-layer`, {
59
+ layerVersionName: `${this.resourceIdPrefix}-layer`,
60
+ code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
61
+ compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_14_X],
62
+ description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
63
+ });
64
+ }
65
+ /**
66
+ * Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
67
+ * our cleanup lamda function.
68
+ *
69
+ * @param props
70
+ * @private
71
+ */
57
72
  createRule(props) {
58
- const ruleName = `${this.resourceIdPrefix}-scheduled-rule`;
59
- // Schedule every tuesday at 03:30 AM GMT
60
- return new aws_events_1.Rule(this, ruleName, {
61
- ruleName,
62
- description: `Triggers a cleanup of outdated static assets of the ${props.project} app.`,
73
+ new aws_events_1.Rule(this, `${this.resourceIdPrefix}-scheduler-rule`, {
74
+ ruleName: `${this.resourceIdPrefix}-scheduler`,
75
+ description: `Triggers a cleanup of the outdated static assets at the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
63
76
  enabled: true,
64
77
  schedule: aws_events_1.Schedule.cron({ weekDay: '3', hour: '3', minute: '30' }),
65
78
  targets: [new aws_events_targets_1.LambdaFunction(this.lambdaFunction)],
@@ -67,4 +80,4 @@ class NuxtAppAssetsCleanupStack extends aws_cdk_lib_1.Stack {
67
80
  }
68
81
  }
69
82
  exports.NuxtAppAssetsCleanupStack = NuxtAppAssetsCleanupStack;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtYXNzZXRzLWNsZWFudXAtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBNEM7QUFFNUMsdURBQTJGO0FBQzNGLHVEQUFzRDtBQUV0RCxtREFBbUQ7QUFDbkQsdUVBQThEO0FBQzlELDZCQUE2QjtBQU83Qjs7R0FFRztBQUNILE1BQWEseUJBQTBCLFNBQVEsbUJBQUs7SUFRaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixtR0FBbUc7UUFDbkcsZ0dBQWdHO1FBRWhHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLFdBQVc7UUFDZixNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsUUFBUSxDQUFDO1FBRW5ELE9BQU8sSUFBSSx5QkFBWSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDckMsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUNyRixrQkFBa0IsRUFBRSxDQUFDLG9CQUFPLENBQUMsV0FBVyxDQUFDO1NBQzVDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxLQUFnQztRQUN6RCxNQUFNLFlBQVksR0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDO1FBRWpFLE1BQU0sTUFBTSxHQUFhLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3RELFlBQVksRUFBRSxZQUFZO1lBQzFCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsWUFBWSxFQUFFLHlCQUFZLENBQUMsTUFBTTtZQUNqQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsVUFBVSxFQUFFLEdBQUc7WUFDZixZQUFZLEVBQUUsd0JBQWEsQ0FBQyxTQUFTO1lBQ3JDLFdBQVcsRUFBRTtnQkFDVCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVTtnQkFDeEQsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMzQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLG1DQUFtQyxFQUFFLEdBQUc7Z0JBQ3hDLFlBQVksRUFBRSxzQkFBc0I7YUFDdkM7U0FDSixDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBZ0M7UUFDL0MsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDO1FBRTNELHlDQUF5QztRQUN6QyxPQUFPLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQzVCLFFBQVE7WUFDUixXQUFXLEVBQUUsdURBQXVELEtBQUssQ0FBQyxPQUFPLE9BQU87WUFDeEYsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUscUJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDckQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBeEVELDhEQXdFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SUJ1Y2tldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtEdXJhdGlvbiwgU3RhY2t9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9hcHAtc3RhY2stcHJvcHNcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIEZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtSdWxlLCBTY2hlZHVsZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7TGFtYmRhRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzIGV4dGVuZHMgQXBwU3RhY2tQcm9wcyB7XG4gICAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAgIHJlYWRvbmx5IHNlbnRyeURzbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGEgc2NoZWR1bGVkIGxhbWJkYSBmdW5jdGlvbiwgdGhhdCBkZWxldGVzIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIFBXQSBmcm9tIFMzLlxuICovXG5leHBvcnQgY2xhc3MgTnV4dEFwcEFzc2V0c0NsZWFudXBTdGFjayBleHRlbmRzIFN0YWNrIHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5ZXI6IExheWVyVmVyc2lvbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIHNjaGVkdWxlZFJ1bGU6IFJ1bGU7XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgICAgICAvLyBOb3RlLCB0aGF0IHRoaXMgc3RhY2sgY2FuJ3QgYmUgdGFnZ2VkIGluZGVwZW5kZW50bHkgb2YgdGhlIE51eHRBcHBTdGFjaywgYXMgYm90aCBhcmUgc2hhcmluZyB0aGVcbiAgICAgICAgLy8gc2FtZSBzY29wZSAoQ0RLIEFwcCkuIFRoaXMgd291bGQgb3ZlcndyaXRlIHByZXZpb3VzIHNldCB0YWdzIGZvciB0aGUgQ0RLIEFwcCAobGFzdCBvbmUgd2lucykuXG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0O1xuICAgICAgICB0aGlzLmxheWVyID0gdGhpcy5jcmVhdGVMYXllcigpO1xuICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVkUnVsZSA9IHRoaXMuY3JlYXRlUnVsZShwcm9wcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllck5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWxheWVyYDtcblxuICAgICAgICByZXR1cm4gbmV3IExheWVyVmVyc2lvbih0aGlzLCBsYXllck5hbWUsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGxheWVyTmFtZSxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9mdW5jdGlvbnMvYXNzZXRzX2NsZWFudXAvYnVpbGQvbGF5ZXInKSksXG4gICAgICAgICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtSdW50aW1lLk5PREVKU18xNF9YXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWZ1bmN0aW9uYDtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgbGF5ZXJzOiBbdGhpcy5sYXllcl0sXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL2Fzc2V0c19jbGVhbnVwL2J1aWxkL2FwcCcpKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBTRU5UUllfRFNOOiBwcm9wcy5zZW50cnlEc24sXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWQocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnREZWxldGUocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUnVsZShwcm9wczogTnV4dEFwcEFzc2V0c0NsZWFudXBQcm9wcyk6IFJ1bGUge1xuICAgICAgICBjb25zdCBydWxlTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVkLXJ1bGVgO1xuXG4gICAgICAgIC8vIFNjaGVkdWxlIGV2ZXJ5IHR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UXG4gICAgICAgIHJldHVybiBuZXcgUnVsZSh0aGlzLCBydWxlTmFtZSwge1xuICAgICAgICAgICAgcnVsZU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSAke3Byb3BzLnByb2plY3R9IGFwcC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMycsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMubGFtYmRhRnVuY3Rpb24pXSxcbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnV4dC1hcHAtYXNzZXRzLWNsZWFudXAtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJudXh0LWFwcC1hc3NldHMtY2xlYW51cC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBNEM7QUFFNUMsdURBQTJGO0FBQzNGLHVEQUFzRDtBQUV0RCxtREFBbUQ7QUFDbkQsdUVBQThEO0FBQzlELDZCQUE2QjtBQVk3Qjs7O0dBR0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLG1CQUFLO0lBZ0JoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakYsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxvQkFBb0IsQ0FBQyxLQUFnQztRQUN6RCxNQUFNLFlBQVksR0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDO1FBRWpFLE1BQU0sTUFBTSxHQUFhLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ3RELFlBQVksRUFBRSxZQUFZO1lBQzFCLFdBQVcsRUFBRSxrREFBa0QsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsYUFBYTtZQUMvRyxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDdkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDbkYsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM1QixVQUFVLEVBQUUsR0FBRztZQUNmLFlBQVksRUFBRSx3QkFBYSxDQUFDLFNBQVM7WUFDckMsV0FBVyxFQUFFO2dCQUNULG9CQUFvQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVO2dCQUN6RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQzlCLG1DQUFtQyxFQUFFLEdBQUc7Z0JBQ3hDLFlBQVksRUFBRSxzQkFBc0I7YUFDdkM7U0FDSixDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCO1FBQzFCLE9BQU8sSUFBSSx5QkFBWSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsUUFBUSxFQUFFO1lBQzVELGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixRQUFRO1lBQ2xELElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1lBQ3JGLGtCQUFrQixFQUFFLENBQUMsb0JBQU8sQ0FBQyxXQUFXLENBQUM7WUFDekMsV0FBVyxFQUFFLDhDQUE4QyxJQUFJLENBQUMsZ0JBQWdCLG1CQUFtQjtTQUN0RyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssVUFBVSxDQUFDLEtBQWdDO1FBQy9DLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGlCQUFpQixFQUFFO1lBQ3RELFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsWUFBWTtZQUM5QyxXQUFXLEVBQUUsMkRBQTJELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLGFBQWE7WUFDeEgsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUscUJBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1lBQ2hFLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDckQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBekZELDhEQXlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SUJ1Y2tldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtEdXJhdGlvbiwgU3RhY2t9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9hcHAtc3RhY2stcHJvcHNcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIEZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtSdWxlLCBTY2hlZHVsZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7TGFtYmRhRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBwcm9wcyByZXF1aXJlZCBmb3IgdGhlIHtAc2VlIE51eHRBcHBBc3NldHNDbGVhbnVwU3RhY2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHMgZXh0ZW5kcyBBcHBTdGFja1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcmUgbG9jYXRlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNjaGVkdWxlZCBsYW1iZGEgZnVuY3Rpb24gdGhhdCBkZWxldGVzIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGZyb20gUzNcbiAqIHRvIGtlZXAgaXQgbmljZSB3aXRob3V0IGFueSBvdXRkYXRlZCBmaWxlcyB0aGF0IGFyZW4ndCB1c2VkIGFueW1vcmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0QXBwQXNzZXRzQ2xlYW51cFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgICAgIHRoaXMucmVzb3VyY2VJZFByZWZpeCA9IGAke3Byb3BzLnByb2plY3R9LSR7cHJvcHMuc2VydmljZX0tJHtwcm9wcy5lbnZpcm9ubWVudH1gO1xuICAgICAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlUnVsZShwcm9wcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUxhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0QXBwQXNzZXRzQ2xlYW51cFByb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWU6IHN0cmluZyA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZnVuY3Rpb25gO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3Byb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBsYXllcnM6IFt0aGlzLmNyZWF0ZU5vZGVNb2R1bGVzTGF5ZXIoKV0sXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vZnVuY3Rpb25zL2Fzc2V0c19jbGVhbnVwL2J1aWxkL2FwcCcpKSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgRU5WSVJPTk1FTlQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgZnVuY3Rpb24gYWNjZXNzIHRvIFMzIGJ1Y2tldFxuICAgICAgICBwcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKHJlc3VsdCk7XG4gICAgICAgIHByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhbWJkYSBsYXllciBmb3IgdGhlIGNsZWFudXAgZnVuY3Rpb24gdGhhdCBob2xkcyB0aGUgcmVxdWlyZWQgbm9kZV9tb2R1bGVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU5vZGVNb2R1bGVzTGF5ZXIoKTogTGF5ZXJWZXJzaW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXllclZlcnNpb24odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1sYXllcmAsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGF5ZXJgLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2Z1bmN0aW9ucy9hc3NldHNfY2xlYW51cC9idWlsZC9sYXllcicpKSxcbiAgICAgICAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1J1bnRpbWUuTk9ERUpTXzE0X1hdLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQcm92aWRlcyB0aGUgbm9kZV9tb2R1bGVzIHJlcXVpcmVkIGZvciB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGxhbWJkYSBmdW5jdGlvbi5gXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0aGF0IHJ1bnMgZXZlcnkgdHVlc2RheSBhdCAwMzozMCBBTSBHTVQgdG8gdHJpZ2dlclxuICAgICAqIG91ciBjbGVhbnVwIGxhbWRhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVJ1bGUocHJvcHM6IE51eHRBcHBBc3NldHNDbGVhbnVwUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFRyaWdnZXJzIGEgY2xlYW51cCBvZiB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBhdCB0aGUgJHtwcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe3dlZWtEYXk6ICczJywgaG91cjogJzMnLCBtaW51dGU6ICczMCd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5sYW1iZGFGdW5jdGlvbildLFxuICAgICAgICB9KTtcbiAgICB9XG59Il19
@@ -8,61 +8,66 @@ import {RetentionDays} from "aws-cdk-lib/aws-logs";
8
8
  import {LambdaFunction} from "aws-cdk-lib/aws-events-targets";
9
9
  import * as path from "path";
10
10
 
11
+ /**
12
+ * Defines the props required for the {@see NuxtAppAssetsCleanupStack}.
13
+ */
11
14
  export interface NuxtAppAssetsCleanupProps extends AppStackProps {
15
+ /**
16
+ * The S3 bucket where the static assets of the Nuxt app are located.
17
+ */
12
18
  readonly staticAssetsBucket: IBucket;
13
- readonly sentryDsn: string;
14
19
  }
15
20
 
16
21
  /**
17
- * Contains a scheduled lambda function, that deletes outdated static assets of the PWA from S3.
22
+ * Creates a scheduled lambda function that deletes outdated static assets of the Nuxt app from S3
23
+ * to keep it nice without any outdated files that aren't used anymore.
18
24
  */
19
25
  export class NuxtAppAssetsCleanupStack extends Stack {
20
26
 
27
+ /**
28
+ * The identifier prefix of the resources created by the stack.
29
+ *
30
+ * @private
31
+ */
21
32
  private readonly resourceIdPrefix: string;
22
- private staticAssetsBucket: IBucket;
23
- private readonly layer: LayerVersion;
33
+
34
+ /**
35
+ * A reference to the created lambda function that cleanups the outdated static assets of the Nuxt app.
36
+ *
37
+ * @private
38
+ */
24
39
  private readonly lambdaFunction: Function;
25
- private scheduledRule: Rule;
26
40
 
27
41
  constructor(scope: Construct, id: string, props: NuxtAppAssetsCleanupProps) {
28
42
  super(scope, id, props);
29
43
 
30
- // Note, that this stack can't be tagged independently of the NuxtAppStack, as both are sharing the
31
- // same scope (CDK App). This would overwrite previous set tags for the CDK App (last one wins).
32
-
33
44
  this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
34
- this.staticAssetsBucket = props.staticAssetsBucket;
35
- this.layer = this.createLayer();
36
45
  this.lambdaFunction = this.createLambdaFunction(props);
37
- this.scheduledRule = this.createRule(props);
38
- }
39
-
40
- private createLayer(): LayerVersion {
41
- const layerName = `${this.resourceIdPrefix}-layer`;
42
-
43
- return new LayerVersion(this, layerName, {
44
- layerVersionName: layerName,
45
- code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
46
- compatibleRuntimes: [Runtime.NODEJS_14_X],
47
- });
46
+ this.createRule(props);
48
47
  }
49
48
 
49
+ /**
50
+ * Creates the lambda function that cleanups the outdated static assets of the Nuxt app.
51
+ *
52
+ * @param props
53
+ * @private
54
+ */
50
55
  private createLambdaFunction(props: NuxtAppAssetsCleanupProps): Function {
51
56
  const functionName: string = `${this.resourceIdPrefix}-function`;
52
57
 
53
58
  const result: Function = new Function(this, functionName, {
54
59
  functionName: functionName,
60
+ description: `Auto-deletes the outdated static assets in the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
55
61
  runtime: Runtime.NODEJS_14_X,
56
62
  architecture: Architecture.ARM_64,
57
- layers: [this.layer],
63
+ layers: [this.createNodeModulesLayer()],
58
64
  handler: 'index.handler',
59
65
  code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/app')),
60
66
  timeout: Duration.minutes(1),
61
67
  memorySize: 128,
62
68
  logRetention: RetentionDays.TWO_WEEKS,
63
69
  environment: {
64
- STATIC_ASSETS_BUCKET: this.staticAssetsBucket.bucketName,
65
- SENTRY_DSN: props.sentryDsn,
70
+ STATIC_ASSETS_BUCKET: props.staticAssetsBucket.bucketName,
66
71
  ENVIRONMENT: props.environment,
67
72
  AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
68
73
  NODE_OPTIONS: '--enable-source-maps',
@@ -70,19 +75,37 @@ export class NuxtAppAssetsCleanupStack extends Stack {
70
75
  });
71
76
 
72
77
  // grant function access to S3 bucket
73
- this.staticAssetsBucket.grantRead(result);
74
- this.staticAssetsBucket.grantDelete(result);
78
+ props.staticAssetsBucket.grantRead(result);
79
+ props.staticAssetsBucket.grantDelete(result);
75
80
 
76
81
  return result;
77
82
  }
78
83
 
79
- private createRule(props: NuxtAppAssetsCleanupProps): Rule {
80
- const ruleName = `${this.resourceIdPrefix}-scheduled-rule`;
84
+ /**
85
+ * Creates a lambda layer for the cleanup function that holds the required node_modules.
86
+ *
87
+ * @private
88
+ */
89
+ private createNodeModulesLayer(): LayerVersion {
90
+ return new LayerVersion(this, `${this.resourceIdPrefix}-layer`, {
91
+ layerVersionName: `${this.resourceIdPrefix}-layer`,
92
+ code: Code.fromAsset(path.join(__dirname, '../functions/assets_cleanup/build/layer')),
93
+ compatibleRuntimes: [Runtime.NODEJS_14_X],
94
+ description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
95
+ });
96
+ }
81
97
 
82
- // Schedule every tuesday at 03:30 AM GMT
83
- return new Rule(this, ruleName, {
84
- ruleName,
85
- description: `Triggers a cleanup of outdated static assets of the ${props.project} app.`,
98
+ /**
99
+ * Creates a scheduled rule that runs every tuesday at 03:30 AM GMT to trigger
100
+ * our cleanup lamda function.
101
+ *
102
+ * @param props
103
+ * @private
104
+ */
105
+ private createRule(props: NuxtAppAssetsCleanupProps): void {
106
+ new Rule(this, `${this.resourceIdPrefix}-scheduler-rule`, {
107
+ ruleName: `${this.resourceIdPrefix}-scheduler`,
108
+ description: `Triggers a cleanup of the outdated static assets at the ${props.staticAssetsBucket.bucketName} S3 bucket.`,
86
109
  enabled: true,
87
110
  schedule: Schedule.cron({weekDay: '3', hour: '3', minute: '30'}),
88
111
  targets: [new LambdaFunction(this.lambdaFunction)],