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.
- package/lib/functions/assets_cleanup/index.d.ts +1 -0
- package/lib/functions/assets_cleanup/index.js +82 -0
- package/lib/stack/app-stack-props.d.ts +6 -0
- package/lib/stack/app-stack-props.js +3 -0
- package/lib/stack/nuxt-app-assets-cleanup-stack.d.ts +22 -0
- package/lib/stack/nuxt-app-assets-cleanup-stack.js +68 -0
- package/lib/stack/nuxt-app-stack.d.ts +46 -0
- package/lib/stack/nuxt-app-stack.js +223 -0
- package/lib/stack/nuxt-app-static-assets.d.ts +10 -0
- package/lib/stack/nuxt-app-static-assets.js +98 -0
- package/package.json +1 -1
- package/dist/index.js +0 -7
- package/lib/index.ts +0 -2
|
@@ -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,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
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