diff --git a/README.md b/README.md index 84c98ada83..c07790c958 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Please review [features](https://github.com/serverless-nextjs/serverless-next.js - [AWS Permissions](#aws-permissions) - [Architecture](#architecture) - [Inputs](#inputs) +- [CDK Construct](#cdk-construct) - [FAQ](#faq) > :warning: This README reflects the latest changes on the `master` branch. It may or may not yet be published to the `latest` (stable) or `alpha` release in npm. Please go to [Releases](https://github.com/serverless-nextjs/serverless-next.js/releases), find the correct `@sls-next/serverless-component` version you are using, and open the README for that release for more accurate information. If a feature is listed in this README but not working, please first try upgrading to the most recent `alpha` release in npm. @@ -525,6 +526,14 @@ myNextApp: bucketName: my-bucket ``` +### CDK Construct + +> (experimental) - more work required to bring this construct up to speed and +> also to reuse some of the serverless logic. As a result the construct is +> likely to adapt/change accordingly. + +[Documentation can be found here.](https://serverless-nextjs.com/docs/cdkconstruct) + ### FAQ #### My component doesn't deploy @@ -681,10 +690,10 @@ It seems to be a bug in Serverless Components - it may be due to not using the l ```yml stage: ${env.STAGE} my-app: - component: '@sls-next/serverless-component@1.18.0' + component: "@sls-next/serverless-component@1.18.0" inputs: domain: - - '${stage}-front-end' + - "${stage}-front-end" - mydomain.com ``` diff --git a/documentation/docs/cdkconstruct.md b/documentation/docs/cdkconstruct.md new file mode 100644 index 0000000000..aa02303140 --- /dev/null +++ b/documentation/docs/cdkconstruct.md @@ -0,0 +1,98 @@ +--- +id: cdkconstruct +title: CDK Construct (experimental) +sidebar_label: CDK Construct +--- + +AWS CDK (Cloud Development Kit) makes it possible to write infrastructure in +code using familiar languages such as JavaScript or Python, and provision via +Cloudformation. The tool is growing in popularity and so it seems fitting to +enable Next.js users to be able to deploy their apps using it. The +`NextJSLambdaEdge` construct will provision the same infrastructure as the +`serverless-component`. + +It's simple to include the Next.js construct in your app, the following will +deploy your Next app using a Cloudfront domain: + +```ts +// stack.ts +import { NextJSLambdaEdge } from "@sls-next/cdk-construct"; +import * as cdk from "@aws-cdk/core"; + +export class MyStack extends cdk.Stack { + constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) { + super(scope, id, props); + new NextJSLambdaEdge(this, "NextJsApp", { + serverlessBuildOutDir: "./build" + }); + } +} + +// bin.ts +import * as cdk from "@aws-cdk/core"; +import { Builder } from "@sls-next/lambda-at-edge"; +import { MyStack } from "./stack"; + +// Run the serverless builder, this could be done elsewhere in your workflow +const builder = new Builder(".", "./build"); + +builder + .build() + .then(() => { + const app = new cdk.App(); + new MyStack(app, `MyStack`); + }) + .catch((e) => { + console.log(e); + process.exit(1); + }); +``` + +To deploy your stack, use the `cdk` CLI as normal. + +## Adding a Custom Domain + +Now you've deployed your app, you'll likely want to add a custom domain: + +```ts +new NextJSLambdaEdge(this, "NextJsApp", { + serverlessBuildOutDir: "./build", + // `Certificate.fromCertificateArn` & `HostedZone.fromHostedZoneAttributes` + // retrieve existing resources, however you could create a new ones in your + // stack via the relevant constructs + domain: { + domainName: "example.com", + hostedZone: HostedZone.fromHostedZoneAttributes(this, "Zone", { + hostedZoneId: "123ABC", + zoneName: "example.com" + }), + certificate: Certificate.fromCertificateArn(this, "Cert", "...arn...") + } +}); +``` + +## Available Props + +- `serverlessBuildOutDir` - the output directory of the `Builder`. +- `domain?: Object` - if you'd like to add a custom domain, provide the + following three fields on the `domain` object. + - `hostedZone: IHostedZone;` + - `certificate: ICertificate;` + - `domainName: string;` +- `memory?: number | Record` - configure memory on all lambdas + or individually. +- `timeout?: number | Record` - configure timeout on all lambdas + or individually. +- `name?: string | Record` - configure the name of all lambdas + or individually. +- `runtime?: lambda.Runtime | Record` - configure the runtime of all lambdas + or individually. +- `withLogging?: boolean` - set debug logging on the lambda. +- `whiteListedCookies?: string[]` - provide a list of cookies to forward to the + CloudFront origin. +- `defaultBehavior?: Partial` - provide overrides for the + default behavior +- `behaviours?: Array` - an array of Cloudfront + distribution behaviours. +- `invalidationPaths?: string[]` - an array of invalidation paths, by default we + invalidate all pages found in manifest diff --git a/documentation/sidebars.js b/documentation/sidebars.js index cc9b616989..20b83637f3 100644 --- a/documentation/sidebars.js +++ b/documentation/sidebars.js @@ -1,18 +1,25 @@ module.exports = { someSidebar: { - Introduction: ['basics', 'motivation', 'design', 'features', 'contributing'], - 'Getting Started': [ - 'installation', - 'customdomain', - 'customcloudfrontconfig', - 'staticpagecache', - 'publicdirectorycache', - 'awspermissions', - 'lambdaatedgeconfig', - 'architecture', - 'inputs', - 'faq', - 'examples' + Introduction: [ + "basics", + "motivation", + "design", + "features", + "contributing" + ], + "Getting Started": [ + "installation", + "customdomain", + "customcloudfrontconfig", + "staticpagecache", + "publicdirectorycache", + "awspermissions", + "lambdaatedgeconfig", + "architecture", + "inputs", + "faq", + "examples", + "cdkconstruct" ] - }, + } }; diff --git a/packages/libs/s3-static-assets/package.json b/packages/libs/s3-static-assets/package.json index f53496d4ea..bef19e05fa 100644 --- a/packages/libs/s3-static-assets/package.json +++ b/packages/libs/s3-static-assets/package.json @@ -33,13 +33,12 @@ "homepage": "https://github.com/serverless-nextjs/serverless-next.js#readme", "dependencies": { "aws-sdk": "2.728.0", + "fast-glob": "^3.2.5", "fs-extra": "^9.0.1", - "klaw": "^3.0.0", "mime-types": "^2.1.27", "regex-parser": "^2.2.10" }, "devDependencies": { - "@types/klaw": "^3.0.1", "@types/mime-types": "^2.1.0", "typescript": "^3.9.6" } diff --git a/packages/libs/s3-static-assets/src/index.ts b/packages/libs/s3-static-assets/src/index.ts index e2bcb84ba1..800abb12fa 100644 --- a/packages/libs/s3-static-assets/src/index.ts +++ b/packages/libs/s3-static-assets/src/index.ts @@ -1,8 +1,7 @@ import AWS from "aws-sdk"; -import path, { join } from "path"; +import path from "path"; import fse from "fs-extra"; import readDirectoryFiles from "./lib/readDirectoryFiles"; -import filterOutDirectories from "./lib/filterOutDirectories"; import { IMMUTABLE_CACHE_CONTROL_HEADER, SERVER_NO_CACHE_CACHE_CONTROL_HEADER, @@ -24,33 +23,32 @@ type UploadStaticAssetsOptions = { publicDirectoryCache?: PublicDirectoryCache; }; +type AssetDirectoryFileCachePoliciesOptions = { + basePath: string; + // The directory containing the build output. + // .i.e. by default .serverless_nextjs + serverlessBuildOutDir: string; + nextStaticDir?: string; + publicDirectoryCache?: PublicDirectoryCache; +}; + /** - * Uploads from built assets folder in .serverless_nextjs/assets to S3. - * This is used to decouple a build from deployment. - * Currently this works for Lambda@Edge deployment. + * Returns an array of files with with their relevant cache policies. */ -const uploadStaticAssetsFromBuild = async ( - options: UploadStaticAssetsOptions -): Promise => { - const { - bucketName, - credentials, - basePath, - publicDirectoryCache, - nextConfigDir - } = options; - const s3 = await S3ClientFactory({ - bucketName, - credentials: credentials - }); +const getAssetDirectoryFileCachePolicies = ( + options: AssetDirectoryFileCachePoliciesOptions +): Array<{ + cacheControl: string | undefined; + path: { + relative: string; + absolute: string; + }; +}> => { + const { basePath, publicDirectoryCache, serverlessBuildOutDir } = options; const normalizedBasePath = basePath ? basePath.slice(1) : ""; - const assetsOutputDirectory = path.join( - nextConfigDir, - ".serverless_nextjs", - "assets" - ); + const assetsOutputDirectory = path.join(serverlessBuildOutDir, "assets"); // Upload BUILD_ID file to represent the current build ID to be uploaded. This is for metadata and also used for deleting old versioned files. const buildIdPath = path.join( @@ -58,115 +56,127 @@ const uploadStaticAssetsFromBuild = async ( normalizedBasePath, "BUILD_ID" ); - const buildIdUpload = s3.uploadFile({ - s3Key: pathToPosix(path.join(normalizedBasePath, "BUILD_ID")), - filePath: buildIdPath - }); + + const buildIdUpload = { + path: buildIdPath, + cacheControl: undefined + }; // Upload Next.js static files - const nextStaticFiles = await readDirectoryFiles( + const nextStaticFiles = readDirectoryFiles( path.join(assetsOutputDirectory, normalizedBasePath, "_next", "static") ); - const nextStaticFilesUploads = nextStaticFiles - .filter(filterOutDirectories) - .map(async (fileItem) => { - const s3Key = pathToPosix( - path.relative(assetsOutputDirectory, fileItem.path) - ); - - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER - }); - }); + const nextStaticFilesUploads = nextStaticFiles.map((fileItem) => ({ + path: fileItem.path, + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + })); // Upload Next.js data files - const nextDataFiles = await readDirectoryFiles( + const nextDataFiles = readDirectoryFiles( path.join(assetsOutputDirectory, normalizedBasePath, "_next", "data") ); - const nextDataFilesUploads = nextDataFiles - .filter(filterOutDirectories) - .map(async (fileItem) => { - const s3Key = pathToPosix( - path.relative(assetsOutputDirectory, fileItem.path) - ); - - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: SERVER_CACHE_CONTROL_HEADER - }); - }); + const nextDataFilesUploads = nextDataFiles.map((fileItem) => ({ + path: fileItem.path, + cacheControl: SERVER_CACHE_CONTROL_HEADER + })); // Upload Next.js HTML pages - const htmlPages = await readDirectoryFiles( + const htmlPages = readDirectoryFiles( path.join(assetsOutputDirectory, normalizedBasePath, "static-pages") ); - const htmlPagesUploads = htmlPages - .filter(filterOutDirectories) - .map(async (fileItem) => { - const s3Key = pathToPosix( - path.relative(assetsOutputDirectory, fileItem.path) - ); - - // Dynamic fallback HTML pages should never be cached as it will override actual pages once generated and stored in S3. - const isDynamicFallback = /\[.*]/.test(s3Key); - if (isDynamicFallback) { - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: SERVER_NO_CACHE_CACHE_CONTROL_HEADER - }); - } else { - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: SERVER_CACHE_CONTROL_HEADER - }); - } - }); + const htmlPagesUploads = htmlPages.map((fileItem) => { + // Dynamic fallback HTML pages should never be cached as it will override actual pages once generated and stored in S3. + const isDynamicFallback = /\[.*]/.test(fileItem.path); + if (isDynamicFallback) { + return { + path: fileItem.path, + cacheControl: SERVER_NO_CACHE_CACHE_CONTROL_HEADER + }; + } else { + return { + path: fileItem.path, + cacheControl: SERVER_CACHE_CONTROL_HEADER + }; + } + }); // Upload user static and public files - const publicFiles = await readDirectoryFiles( + const publicFiles = readDirectoryFiles( path.join(assetsOutputDirectory, normalizedBasePath, "public") ); - const staticFiles = await readDirectoryFiles( + const staticFiles = readDirectoryFiles( path.join(assetsOutputDirectory, normalizedBasePath, "static") ); - const publicAndStaticUploads = [...publicFiles, ...staticFiles] - .filter(filterOutDirectories) - .map(async (fileItem) => { - const s3Key = pathToPosix( - path.relative(assetsOutputDirectory, fileItem.path) - ); - - return s3.uploadFile({ - filePath: fileItem.path, - s3Key: s3Key, - cacheControl: getPublicAssetCacheControl( - fileItem.path, - publicDirectoryCache - ) - }); - }); + const publicAndStaticUploads = [...publicFiles, ...staticFiles].map( + (fileItem) => ({ + path: fileItem.path, + cacheControl: getPublicAssetCacheControl( + fileItem.path, + publicDirectoryCache + ) + }) + ); - return Promise.all([ + return [ ...nextStaticFilesUploads, ...nextDataFilesUploads, ...htmlPagesUploads, ...publicAndStaticUploads, buildIdUpload - ]); + ].map(({ cacheControl, path: absolutePath }) => ({ + cacheControl, + path: { + // Path relative to the assets folder, used for the S3 upload key + relative: path.relative(assetsOutputDirectory, absolutePath), + // Absolute path of local asset + absolute: absolutePath + } + })); +}; + +/** + * Uploads from built assets folder in .serverless_nextjs/assets to S3. + * This is used to decouple a build from deployment. + * Currently this works for Lambda@Edge deployment. + */ +const uploadStaticAssetsFromBuild = async ( + options: UploadStaticAssetsOptions +): Promise => { + const { + bucketName, + credentials, + basePath, + publicDirectoryCache, + nextConfigDir + } = options; + const files = getAssetDirectoryFileCachePolicies({ + basePath, + publicDirectoryCache, + serverlessBuildOutDir: path.join(nextConfigDir, ".serverless_nextjs") + }); + const s3 = await S3ClientFactory({ + bucketName, + credentials: credentials + }); + + return Promise.all( + files.map((file) => + s3.uploadFile({ + s3Key: pathToPosix(file.path.relative), + filePath: file.path.absolute, + cacheControl: file.cacheControl + }) + ) + ); }; /** @@ -193,29 +203,27 @@ const uploadStaticAssets = async ( const s3BasePath = basePath ? basePath.slice(1) : ""; - const buildStaticFiles = await readDirectoryFiles( + const buildStaticFiles = readDirectoryFiles( path.join(dotNextDirectory, "static") ); const withBasePath = (key: string): string => path.join(s3BasePath, key); - const buildStaticFileUploads = buildStaticFiles - .filter(filterOutDirectories) - .map(async (fileItem) => { - const s3Key = pathToPosix( - withBasePath( - path - .relative(path.resolve(nextConfigDir), fileItem.path) - .replace(/^.next/, "_next") - ) - ); + const buildStaticFileUploads = buildStaticFiles.map(async (fileItem) => { + const s3Key = pathToPosix( + withBasePath( + path + .relative(path.resolve(nextConfigDir), fileItem.path) + .replace(/^.next/, "_next") + ) + ); - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER - }); + return s3.uploadFile({ + s3Key, + filePath: fileItem.path, + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER }); + }); const pagesManifest = await fse.readJSON( path.join(dotNextDirectory, "serverless/pages-manifest.json") @@ -317,9 +325,9 @@ const uploadStaticAssets = async ( return Promise.resolve([]); } - const files = await readDirectoryFiles(directoryPath); + const files = readDirectoryFiles(directoryPath); - return files.filter(filterOutDirectories).map((fileItem) => + return files.map((fileItem) => s3.uploadFile({ filePath: fileItem.path, s3Key: pathToPosix( @@ -381,7 +389,7 @@ const deleteOldStaticAssets = async ( }); // Get BUILD_ID file from S3 if it exists - let buildId = await s3.getFile({ + const buildId = await s3.getFile({ key: normalizedBasePathPrefix + "BUILD_ID" }); @@ -411,6 +419,7 @@ const deleteOldStaticAssets = async ( }; export { + getAssetDirectoryFileCachePolicies, deleteOldStaticAssets, uploadStaticAssetsFromBuild, uploadStaticAssets diff --git a/packages/libs/s3-static-assets/src/lib/filterOutDirectories.ts b/packages/libs/s3-static-assets/src/lib/filterOutDirectories.ts deleted file mode 100644 index 82758286ef..0000000000 --- a/packages/libs/s3-static-assets/src/lib/filterOutDirectories.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Item } from "klaw"; - -export default (fileItem: Item): boolean => !fileItem.stats.isDirectory(); diff --git a/packages/libs/s3-static-assets/src/lib/readDirectoryFiles.ts b/packages/libs/s3-static-assets/src/lib/readDirectoryFiles.ts index f2298f4940..5aff944053 100644 --- a/packages/libs/s3-static-assets/src/lib/readDirectoryFiles.ts +++ b/packages/libs/s3-static-assets/src/lib/readDirectoryFiles.ts @@ -1,21 +1,16 @@ -import klaw, { Item } from "klaw"; - import fse from "fs-extra"; +import path from "path"; +import glob, { Entry } from "fast-glob"; -const readDirectoryFiles = async (directory: string): Promise> => { - const directoryExists = await fse.pathExists(directory); +const readDirectoryFiles = (directory: string): Array => { + const directoryExists = fse.pathExistsSync(directory); if (!directoryExists) { - return Promise.resolve([]); + return []; } - const items: Item[] = []; - return new Promise((resolve, reject) => { - klaw(directory.trim()) - .on("data", (item) => items.push(item)) - .on("end", () => { - resolve(items); - }) - .on("error", reject); + return glob.sync(path.join(directory, "**/*"), { + onlyFiles: true, + stats: true }); }; diff --git a/packages/libs/s3-static-assets/tests/utils.test.ts b/packages/libs/s3-static-assets/tests/utils.test.ts new file mode 100644 index 0000000000..6372b33a40 --- /dev/null +++ b/packages/libs/s3-static-assets/tests/utils.test.ts @@ -0,0 +1,21 @@ +import readDirectoryFiles from "../src/lib/readDirectoryFiles"; +import * as path from "path"; + +describe("readDirectoryFiles", () => { + it("returns an empty array when the file is not found", () => { + const files = readDirectoryFiles("/this/path/does/not/exist"); + expect(files).toStrictEqual([]); + }); + + it("returns all files from fixture without directories", () => { + const files = readDirectoryFiles( + path.join(__dirname, "./fixtures/app-basic") + ); + expect(files.map((file) => file.path)).toStrictEqual([ + path.join(__dirname, "fixtures/app-basic/public/robots.txt"), + path.join(__dirname, "fixtures/app-basic/static/robots.txt"), + path.join(__dirname, "fixtures/app-basic/public/scripts/test-script.js"), + path.join(__dirname, "fixtures/app-basic/static/scripts/test-script.js") + ]); + }); +}); diff --git a/packages/libs/s3-static-assets/yarn.lock b/packages/libs/s3-static-assets/yarn.lock index 768327e368..a5305c42ad 100644 --- a/packages/libs/s3-static-assets/yarn.lock +++ b/packages/libs/s3-static-assets/yarn.lock @@ -2,23 +2,32 @@ # yarn lockfile v1 -"@types/klaw@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.1.tgz#29f90021c0234976aa4eb97efced9cb6db9fa8b3" - integrity sha512-acnF3n9mYOr1aFJKFyvfNX0am9EtPUsYPq22QUCGdJE+MVt6UyAN1jwo+PmOPqXD4K7ZS9MtxDEp/un0lxFccA== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@types/node" "*" + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" "@types/mime-types@^2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz#9ca52cda363f699c69466c2a6ccdaad913ea7a73" integrity sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM= -"@types/node@*": - version "14.0.27" - resolved "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -44,6 +53,13 @@ base64-js@^1.0.2: resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + buffer@4.9.2: version "4.9.2" resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" @@ -58,6 +74,32 @@ events@1.1.1: resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +fast-glob@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fastq@^1.6.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.0.tgz#74dbefccade964932cdf500473ef302719c652bb" + integrity sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + fs-extra@^9.0.1: version "9.0.1" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" @@ -68,7 +110,14 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.4" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== @@ -78,6 +127,23 @@ ieee754@1.1.13, ieee754@^1.1.4: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + isarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -97,12 +163,18 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== dependencies: - graceful-fs "^4.1.9" + braces "^3.0.1" + picomatch "^2.0.5" mime-db@1.44.0: version "1.44.0" @@ -116,6 +188,11 @@ mime-types@^2.1.27: dependencies: mime-db "1.44.0" +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + punycode@1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -131,6 +208,16 @@ regex-parser@^2.2.10: resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + sax@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" @@ -141,6 +228,13 @@ sax@>=0.6.0: resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + typescript@^3.9.6: version "3.9.7" resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" diff --git a/packages/serverless-components/nextjs-cdk-construct/README.md b/packages/serverless-components/nextjs-cdk-construct/README.md new file mode 100644 index 0000000000..53d389596c --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/README.md @@ -0,0 +1,4 @@ +# @sls-next/cdk-construct + +Deploy Next.js to AWS via CDK, documentation can be found +[here](https://serverless-nextjs.com/docs/cdkconstruct). diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/__snapshots__/snapshots.test.ts.snap b/packages/serverless-components/nextjs-cdk-construct/__tests__/__snapshots__/snapshots.test.ts.snap new file mode 100644 index 0000000000..cbb3b9c37d --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/__snapshots__/snapshots.test.ts.snap @@ -0,0 +1,2329 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CDK Construct Snapshots creates boilerplate next app 1`] = ` +Object { + "Parameters": Object { + "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748ArtifactHashE2D1074E": Object { + "Description": "Artifact hash for asset \\"25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748\\"", + "Type": "String", + }, + "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748S3Bucket1B468E6A": Object { + "Description": "S3 bucket for asset \\"25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748\\"", + "Type": "String", + }, + "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748S3VersionKeyA7CF013C": Object { + "Description": "S3 key for asset version \\"25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748\\"", + "Type": "String", + }, + "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392ArtifactHashE56CD69A": Object { + "Description": "Artifact hash for asset \\"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\\"", + "Type": "String", + }, + "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3BucketBF7A7F3F": Object { + "Description": "S3 bucket for asset \\"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\\"", + "Type": "String", + }, + "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3VersionKeyFAF93626": Object { + "Description": "S3 key for asset version \\"4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392\\"", + "Type": "String", + }, + "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24ArtifactHashBA91B77F": Object { + "Description": "Artifact hash for asset \\"67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24\\"", + "Type": "String", + }, + "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24S3Bucket4D46ABB5": Object { + "Description": "S3 bucket for asset \\"67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24\\"", + "Type": "String", + }, + "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24S3VersionKeyB0F28861": Object { + "Description": "S3 key for asset version \\"67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24\\"", + "Type": "String", + }, + "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3ArtifactHash62C7B2C0": Object { + "Description": "Artifact hash for asset \\"75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3\\"", + "Type": "String", + }, + "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3BucketF78D27D5": Object { + "Description": "S3 bucket for asset \\"75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3\\"", + "Type": "String", + }, + "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3VersionKeyDC7D66D8": Object { + "Description": "S3 key for asset version \\"75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3\\"", + "Type": "String", + }, + "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1ArtifactHash78F94626": Object { + "Description": "Artifact hash for asset \\"7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1\\"", + "Type": "String", + }, + "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3Bucket0004C4F2": Object { + "Description": "S3 bucket for asset \\"7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1\\"", + "Type": "String", + }, + "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3VersionKey684177A8": Object { + "Description": "S3 key for asset version \\"7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1\\"", + "Type": "String", + }, + "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6ArtifactHash5DD72BC7": Object { + "Description": "Artifact hash for asset \\"7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6\\"", + "Type": "String", + }, + "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6S3Bucket5C3E4ABA": Object { + "Description": "S3 bucket for asset \\"7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6\\"", + "Type": "String", + }, + "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6S3VersionKey96DFF457": Object { + "Description": "S3 key for asset version \\"7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6\\"", + "Type": "String", + }, + "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dArtifactHash2788C1DC": Object { + "Description": "Artifact hash for asset \\"aecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61d\\"", + "Type": "String", + }, + "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3Bucket09B7E9DC": Object { + "Description": "S3 bucket for asset \\"aecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61d\\"", + "Type": "String", + }, + "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3VersionKey99B046A5": Object { + "Description": "S3 key for asset version \\"aecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61d\\"", + "Type": "String", + }, + "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389ArtifactHashA466D3F1": Object { + "Description": "Artifact hash for asset \\"bc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389\\"", + "Type": "String", + }, + "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3Bucket33190633": Object { + "Description": "S3 bucket for asset \\"bc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389\\"", + "Type": "String", + }, + "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3VersionKey8DBC717C": Object { + "Description": "S3 key for asset version \\"bc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389\\"", + "Type": "String", + }, + "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfArtifactHash85F58E48": Object { + "Description": "Artifact hash for asset \\"c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf\\"", + "Type": "String", + }, + "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfS3Bucket55EFA30C": Object { + "Description": "S3 bucket for asset \\"c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf\\"", + "Type": "String", + }, + "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfS3VersionKey60329B70": Object { + "Description": "S3 key for asset version \\"c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf\\"", + "Type": "String", + }, + "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bArtifactHashC079BB46": Object { + "Description": "Artifact hash for asset \\"dab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6b\\"", + "Type": "String", + }, + "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bS3BucketB5EDC333": Object { + "Description": "S3 bucket for asset \\"dab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6b\\"", + "Type": "String", + }, + "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bS3VersionKeyAB92E59F": Object { + "Description": "S3 key for asset version \\"dab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6b\\"", + "Type": "String", + }, + "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68ArtifactHashD9A515C3": Object { + "Description": "Artifact hash for asset \\"e9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68\\"", + "Type": "String", + }, + "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7": Object { + "Description": "S3 bucket for asset \\"e9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68\\"", + "Type": "String", + }, + "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F": Object { + "Description": "S3 key for asset version \\"e9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68\\"", + "Type": "String", + }, + }, + "Resources": Object { + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": Object { + "DependsOn": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfS3Bucket55EFA30C", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfS3VersionKey60329B70", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfS3VersionKey60329B70", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Handler": "index.handler", + "Layers": Array [ + Object { + "Ref": "StackAssetDeploymentBuildIDAwsCliLayer055D8C68", + }, + ], + "Role": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + "Arn", + ], + }, + "Runtime": "python3.6", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3Bucket09B7E9DC", + }, + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3Bucket09B7E9DC", + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject*", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "cloudfront:GetInvalidation", + "cloudfront:CreateInvalidation", + ], + "Effect": "Allow", + "Resource": "*", + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3Bucket0004C4F2", + }, + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3Bucket0004C4F2", + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3Bucket33190633", + }, + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3Bucket33190633", + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3BucketF78D27D5", + }, + ], + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":s3:::", + Object { + "Ref": "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3BucketF78D27D5", + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", + "Roles": Array [ + Object { + "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": Object { + "DependsOn": Array [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3BucketBF7A7F3F", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3VersionKeyFAF93626", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters4cd61014b71160e8c66fe167e43710d5ba068b80b134e9bd84508cf9238b2392S3VersionKeyFAF93626", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Handler": "__entrypoint__.handler", + "MemorySize": 128, + "Role": Object { + "Fn::GetAtt": Array [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": Object { + "DependsOn": Array [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24S3Bucket4D46ABB5", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24S3VersionKeyB0F28861", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters67b7823b74bc135986aa72f889d6a8da058d0c4a20cbc2dfc6f78995fdd2fc24S3VersionKeyB0F28861", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Handler": "index.handler", + "Role": Object { + "Fn::GetAtt": Array [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + }, + "Type": "AWS::Lambda::Function", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": Array [ + "logs:PutRetentionPolicy", + "logs:DeleteRetentionPolicy", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", + "Roles": Array [ + Object { + "Ref": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "StackAssetDeploymentBuildIDAwsCliLayer055D8C68": Object { + "Properties": Object { + "Content": Object { + "S3Bucket": Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "StackAssetDeploymentBuildIDCustomResourceC7EB618F": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "DestinationBucketKeyPrefix": "/BUILD_ID", + "DestinationBucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "DistributionId": Object { + "Ref": "StackNextJSDistribution03A07E47", + }, + "DistributionPaths": Array [ + "/about", + "/", + "/404", + "/users/*", + "/users", + "/_error", + ], + "Prune": true, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": Array [ + Object { + "Ref": "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3Bucket09B7E9DC", + }, + ], + "SourceObjectKeys": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3VersionKey99B046A5", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersaecff88ec5fb6dcd1c5e3f1d6cf827ed17bd83a32dff1bcd10c08e335355d61dS3VersionKey99B046A5", + }, + ], + }, + ], + }, + ], + ], + }, + ], + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "StackAssetDeploymentnextDataAwsCliLayerC32F288B": Object { + "Properties": Object { + "Content": Object { + "S3Bucket": Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "StackAssetDeploymentnextDataCustomResource445B0AAE": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "DestinationBucketKeyPrefix": "_next/data", + "DestinationBucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "Prune": true, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": Array [ + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3Bucket0004C4F2", + }, + ], + "SourceObjectKeys": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3VersionKey684177A8", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3VersionKey684177A8", + }, + ], + }, + ], + }, + ], + ], + }, + ], + "SystemMetadata": Object { + "cache-control": "public, max-age=0, s-maxage=2678400, must-revalidate", + }, + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "StackAssetDeploymentnextStaticAwsCliLayerD5D627D4": Object { + "Properties": Object { + "Content": Object { + "S3Bucket": Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "StackAssetDeploymentnextStaticCustomResource9DCCD3BE": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "DestinationBucketKeyPrefix": "_next/static", + "DestinationBucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "Prune": true, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": Array [ + Object { + "Ref": "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3BucketF78D27D5", + }, + ], + "SourceObjectKeys": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3VersionKeyDC7D66D8", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters75747c01c8238f97cfebdb953d5cea88564b7e08ec0e4fe04619bc1df9792ce3S3VersionKeyDC7D66D8", + }, + ], + }, + ], + }, + ], + ], + }, + ], + "SystemMetadata": Object { + "cache-control": "public, max-age=31536000, immutable", + }, + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "StackAssetDeploymentpublicFilesAwsCliLayerB1EEF9A7": Object { + "Properties": Object { + "Content": Object { + "S3Bucket": Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "StackAssetDeploymentpublicFilesCustomResourceC1AC84CF": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "DestinationBucketKeyPrefix": "public", + "DestinationBucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "Prune": true, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": Array [ + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3Bucket0004C4F2", + }, + ], + "SourceObjectKeys": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3VersionKey684177A8", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7a6ed021656ddea4e87a6e7003efc985b39a2f5e1d5b23c50d9c84a27c2fbcc1S3VersionKey684177A8", + }, + ], + }, + ], + }, + ], + ], + }, + ], + "SystemMetadata": Object { + "cache-control": "public, max-age=31536000, must-revalidate", + }, + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "StackAssetDeploymentstaticPagesAwsCliLayerB0258334": Object { + "Properties": Object { + "Content": Object { + "S3Bucket": Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3VersionKeyE415415F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "StackAssetDeploymentstaticPagesCustomResource9BDB9A03": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "DestinationBucketKeyPrefix": "static-pages", + "DestinationBucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "Prune": true, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": Array [ + Object { + "Ref": "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3Bucket33190633", + }, + ], + "SourceObjectKeys": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3VersionKey8DBC717C", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersbc06ddb828947dc2686bc7343dbed188fb4da2daa22d29b27448869653e68389S3VersionKey8DBC717C", + }, + ], + }, + ], + }, + ], + ], + }, + ], + "SystemMetadata": Object { + "cache-control": "public, max-age=0, s-maxage=2678400, must-revalidate", + }, + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "StackImageOriginRequest30DFB17C": Object { + "Properties": Object { + "OriginRequestPolicyConfig": Object { + "CookiesConfig": Object { + "CookieBehavior": "none", + }, + "HeadersConfig": Object { + "HeaderBehavior": "none", + }, + "Name": "StackImageOriginRequestF06FCDA0", + "QueryStringsConfig": Object { + "QueryStringBehavior": "all", + }, + }, + }, + "Type": "AWS::CloudFront::OriginRequestPolicy", + }, + "StackNextApiLambda8BE78FBE": Object { + "DependsOn": Array [ + "StackNextEdgeLambdaRole02C429A6", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748S3Bucket1B468E6A", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748S3VersionKeyA7CF013C", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters25410cc84f19c90d1be36cf1ab651b490f5b65832cb03e0a63e1ae33d8fdf748S3VersionKeyA7CF013C", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "Default Lambda@Edge for Next API CloudFront distribution", + "FunctionName": "NextApiLambda", + "Handler": "index.handler", + "Role": Object { + "Fn::GetAtt": Array [ + "StackNextEdgeLambdaRole02C429A6", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + }, + "Type": "AWS::Lambda::Function", + }, + "StackNextApiLambdaCurrentVersion09578A6A5311a139e9fe82bc7d38dbc3c95c1c42": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextApiLambda8BE78FBE", + }, + }, + "Type": "AWS::Lambda::Version", + "UpdateReplacePolicy": "Delete", + }, + "StackNextApiLambdaCurrentVersionAliaslive8AA37EB3": Object { + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextApiLambda8BE78FBE", + }, + "FunctionVersion": Object { + "Fn::GetAtt": Array [ + "StackNextApiLambdaCurrentVersion09578A6A5311a139e9fe82bc7d38dbc3c95c1c42", + "Version", + ], + }, + "Name": "live", + }, + "Type": "AWS::Lambda::Alias", + }, + "StackNextApiLambdaCurrentVersionEventInvokeConfig473B707A": Object { + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextApiLambda8BE78FBE", + }, + "MaximumRetryAttempts": 1, + "Qualifier": Object { + "Fn::GetAtt": Array [ + "StackNextApiLambdaCurrentVersion09578A6A5311a139e9fe82bc7d38dbc3c95c1c42", + "Version", + ], + }, + }, + "Type": "AWS::Lambda::EventInvokeConfig", + }, + "StackNextApiLambdaLogRetention2569EAED": Object { + "Properties": Object { + "LogGroupName": Object { + "Fn::Join": Array [ + "", + Array [ + "/aws/lambda/", + Object { + "Ref": "StackNextApiLambda8BE78FBE", + }, + ], + ], + }, + "RetentionInDays": 3, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "StackNextEdgeLambdaRole02C429A6": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": Array [ + "lambda.amazonaws.com", + "edgelambda.amazonaws.com", + ], + }, + }, + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "edgelambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + }, + "Type": "AWS::IAM::Role", + }, + "StackNextImageCache169F453D": Object { + "Properties": Object { + "CachePolicyConfig": Object { + "DefaultTTL": 86400, + "MaxTTL": 31536000, + "MinTTL": 0, + "Name": "NextImageCache", + "ParametersInCacheKeyAndForwardedToOrigin": Object { + "CookiesConfig": Object { + "CookieBehavior": "none", + }, + "EnableAcceptEncodingBrotli": true, + "EnableAcceptEncodingGzip": true, + "HeadersConfig": Object { + "HeaderBehavior": "whitelist", + "Headers": Array [ + "Accept", + ], + }, + "QueryStringsConfig": Object { + "QueryStringBehavior": "all", + }, + }, + }, + }, + "Type": "AWS::CloudFront::CachePolicy", + }, + "StackNextImageLambda2847952D": Object { + "DependsOn": Array [ + "StackNextEdgeLambdaRole02C429A6", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6S3Bucket5C3E4ABA", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6S3VersionKey96DFF457", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters7df364fb64536fbb8d727d8a675a2751a56fe1308e5ad5fccc8fa3d3e4be7ae6S3VersionKey96DFF457", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "Default Lambda@Edge for Next Image CloudFront distribution", + "FunctionName": "NextImageLambda", + "Handler": "index.handler", + "Role": Object { + "Fn::GetAtt": Array [ + "StackNextEdgeLambdaRole02C429A6", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + }, + "Type": "AWS::Lambda::Function", + }, + "StackNextImageLambdaCurrentVersionAliasliveE4A66187": Object { + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextImageLambda2847952D", + }, + "FunctionVersion": Object { + "Fn::GetAtt": Array [ + "StackNextImageLambdaCurrentVersionDEC920BC1d56bfaed68119713790df6382d78f27", + "Version", + ], + }, + "Name": "live", + }, + "Type": "AWS::Lambda::Alias", + }, + "StackNextImageLambdaCurrentVersionDEC920BC1d56bfaed68119713790df6382d78f27": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextImageLambda2847952D", + }, + }, + "Type": "AWS::Lambda::Version", + "UpdateReplacePolicy": "Delete", + }, + "StackNextImageLambdaCurrentVersionEventInvokeConfig3F977EB2": Object { + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextImageLambda2847952D", + }, + "MaximumRetryAttempts": 1, + "Qualifier": Object { + "Fn::GetAtt": Array [ + "StackNextImageLambdaCurrentVersionDEC920BC1d56bfaed68119713790df6382d78f27", + "Version", + ], + }, + }, + "Type": "AWS::Lambda::EventInvokeConfig", + }, + "StackNextImageLambdaLogRetentionF781777A": Object { + "Properties": Object { + "LogGroupName": Object { + "Fn::Join": Array [ + "", + Array [ + "/aws/lambda/", + Object { + "Ref": "StackNextImageLambda2847952D", + }, + ], + ], + }, + "RetentionInDays": 3, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "StackNextJSDistribution03A07E47": Object { + "Properties": Object { + "DistributionConfig": Object { + "CacheBehaviors": Array [ + Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + "PUT", + "PATCH", + "POST", + "DELETE", + ], + "CachePolicyId": Object { + "Ref": "StackNextImageCache169F453D", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "LambdaFunctionAssociations": Array [ + Object { + "EventType": "origin-request", + "LambdaFunctionARN": Object { + "Ref": "StackNextImageLambdaCurrentVersionDEC920BC1d56bfaed68119713790df6382d78f27", + }, + }, + ], + "OriginRequestPolicyId": Object { + "Ref": "StackImageOriginRequest30DFB17C", + }, + "PathPattern": "_next/image*", + "TargetOriginId": "StackNextJSDistributionOrigin227291135", + "ViewerProtocolPolicy": "redirect-to-https", + }, + Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "CachePolicyId": Object { + "Ref": "StackNextLambdaCacheF214CEF2", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "LambdaFunctionAssociations": Array [ + Object { + "EventType": "origin-request", + "IncludeBody": true, + "LambdaFunctionARN": Object { + "Ref": "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f", + }, + }, + Object { + "EventType": "origin-response", + "LambdaFunctionARN": Object { + "Ref": "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f", + }, + }, + ], + "PathPattern": "_next/data/*", + "TargetOriginId": "StackNextJSDistributionOrigin33202980A", + "ViewerProtocolPolicy": "redirect-to-https", + }, + Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "CachePolicyId": Object { + "Ref": "StackNextStaticsCacheC4615915", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "PathPattern": "_next/*", + "TargetOriginId": "StackNextJSDistributionOrigin4BE563FB7", + "ViewerProtocolPolicy": "redirect-to-https", + }, + Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "CachePolicyId": Object { + "Ref": "StackNextStaticsCacheC4615915", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "PathPattern": "static/*", + "TargetOriginId": "StackNextJSDistributionOrigin5E99C79BE", + "ViewerProtocolPolicy": "redirect-to-https", + }, + Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + "PUT", + "PATCH", + "POST", + "DELETE", + ], + "CachePolicyId": Object { + "Ref": "StackNextLambdaCacheF214CEF2", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "LambdaFunctionAssociations": Array [ + Object { + "EventType": "origin-request", + "IncludeBody": true, + "LambdaFunctionARN": Object { + "Ref": "StackNextApiLambdaCurrentVersion09578A6A5311a139e9fe82bc7d38dbc3c95c1c42", + }, + }, + ], + "PathPattern": "api/*", + "TargetOriginId": "StackNextJSDistributionOrigin6F399DA4B", + "ViewerProtocolPolicy": "redirect-to-https", + }, + ], + "DefaultCacheBehavior": Object { + "AllowedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "CachePolicyId": Object { + "Ref": "StackNextLambdaCacheF214CEF2", + }, + "CachedMethods": Array [ + "GET", + "HEAD", + "OPTIONS", + ], + "Compress": true, + "LambdaFunctionAssociations": Array [ + Object { + "EventType": "origin-request", + "IncludeBody": true, + "LambdaFunctionARN": Object { + "Ref": "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f", + }, + }, + Object { + "EventType": "origin-response", + "LambdaFunctionARN": Object { + "Ref": "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f", + }, + }, + ], + "TargetOriginId": "StackNextJSDistributionOrigin164EFF789", + "ViewerProtocolPolicy": "redirect-to-https", + }, + "DefaultRootObject": "", + "Enabled": true, + "HttpVersion": "http2", + "IPV6Enabled": true, + "Origins": Array [ + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin164EFF789", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin1S3OriginE5C3C6BA", + }, + ], + ], + }, + }, + }, + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin227291135", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin2S3OriginBE3A92C1", + }, + ], + ], + }, + }, + }, + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin33202980A", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin3S3Origin815895A3", + }, + ], + ], + }, + }, + }, + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin4BE563FB7", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin4S3Origin25CF633C", + }, + ], + ], + }, + }, + }, + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin5E99C79BE", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin5S3OriginF7CEDF65", + }, + ], + ], + }, + }, + }, + Object { + "DomainName": Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "RegionalDomainName", + ], + }, + "Id": "StackNextJSDistributionOrigin6F399DA4B", + "S3OriginConfig": Object { + "OriginAccessIdentity": Object { + "Fn::Join": Array [ + "", + Array [ + "origin-access-identity/cloudfront/", + Object { + "Ref": "StackNextJSDistributionOrigin6S3Origin922D99DB", + }, + ], + ], + }, + }, + }, + ], + }, + }, + "Type": "AWS::CloudFront::Distribution", + }, + "StackNextJSDistributionOrigin1S3OriginE5C3C6BA": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin164EFF789", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextJSDistributionOrigin2S3OriginBE3A92C1": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin227291135", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextJSDistributionOrigin3S3Origin815895A3": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin33202980A", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextJSDistributionOrigin4S3Origin25CF633C": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin4BE563FB7", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextJSDistributionOrigin5S3OriginF7CEDF65": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin5E99C79BE", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextJSDistributionOrigin6S3Origin922D99DB": Object { + "Properties": Object { + "CloudFrontOriginAccessIdentityConfig": Object { + "Comment": "Identity for StackNextJSDistributionOrigin6F399DA4B", + }, + }, + "Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity", + }, + "StackNextLambdaCacheF214CEF2": Object { + "Properties": Object { + "CachePolicyConfig": Object { + "DefaultTTL": 0, + "MaxTTL": 31536000, + "MinTTL": 0, + "Name": "NextLambdaCache", + "ParametersInCacheKeyAndForwardedToOrigin": Object { + "CookiesConfig": Object { + "CookieBehavior": "all", + }, + "EnableAcceptEncodingBrotli": true, + "EnableAcceptEncodingGzip": true, + "HeadersConfig": Object { + "HeaderBehavior": "none", + }, + "QueryStringsConfig": Object { + "QueryStringBehavior": "all", + }, + }, + }, + }, + "Type": "AWS::CloudFront::CachePolicy", + }, + "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextLambdaF64DCE99", + }, + }, + "Type": "AWS::Lambda::Version", + "UpdateReplacePolicy": "Delete", + }, + "StackNextLambdaCurrentVersionAliasliveB07D2AA0": Object { + "Properties": Object { + "FunctionName": Object { + "Ref": "StackNextLambdaF64DCE99", + }, + "FunctionVersion": Object { + "Fn::GetAtt": Array [ + "StackNextLambdaCurrentVersion21F01F87b538799c93d1ce4981e01005070ac96f", + "Version", + ], + }, + "Name": "live", + }, + "Type": "AWS::Lambda::Alias", + }, + "StackNextLambdaF64DCE99": Object { + "DependsOn": Array [ + "StackNextEdgeLambdaRole02C429A6", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bS3BucketB5EDC333", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bS3VersionKeyAB92E59F", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParametersdab825e6eb19a7b4d78ffba5120b7f3449a9b68c41e7c8a102eb95fbfb194c6bS3VersionKeyAB92E59F", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "Description": "Default Lambda@Edge for Next CloudFront distribution", + "FunctionName": "NextDefaultLambda", + "Handler": "index.handler", + "Role": Object { + "Fn::GetAtt": Array [ + "StackNextEdgeLambdaRole02C429A6", + "Arn", + ], + }, + "Runtime": "nodejs12.x", + }, + "Type": "AWS::Lambda::Function", + }, + "StackNextLambdaLogRetention4645F5D1": Object { + "Properties": Object { + "LogGroupName": Object { + "Fn::Join": Array [ + "", + Array [ + "/aws/lambda/", + Object { + "Ref": "StackNextLambdaF64DCE99", + }, + ], + ], + }, + "RetentionInDays": 3, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "StackNextStaticsCacheC4615915": Object { + "Properties": Object { + "CachePolicyConfig": Object { + "DefaultTTL": 2592000, + "MaxTTL": 2592000, + "MinTTL": 2592000, + "Name": "NextStaticsCache", + "ParametersInCacheKeyAndForwardedToOrigin": Object { + "CookiesConfig": Object { + "CookieBehavior": "none", + }, + "EnableAcceptEncodingBrotli": true, + "EnableAcceptEncodingGzip": true, + "HeadersConfig": Object { + "HeaderBehavior": "none", + }, + "QueryStringsConfig": Object { + "QueryStringBehavior": "none", + }, + }, + }, + }, + "Type": "AWS::CloudFront::CachePolicy", + }, + "StackPublicAssets8F0F4FE8": Object { + "DeletionPolicy": "Delete", + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "StackPublicAssetsAutoDeleteObjectsCustomResource55D84E66": Object { + "DeletionPolicy": "Delete", + "DependsOn": Array [ + "StackPublicAssetsPolicy113B95FD", + ], + "Properties": Object { + "BucketName": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "ServiceToken": Object { + "Fn::GetAtt": Array [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "StackPublicAssetsPolicy113B95FD": Object { + "Properties": Object { + "Bucket": Object { + "Ref": "StackPublicAssets8F0F4FE8", + }, + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "s3:GetObject", + "Effect": "Allow", + "Principal": "*", + "Resource": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": Object { + "AWS": Object { + "Fn::GetAtt": Array [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin1S3OriginE5C3C6BA", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin2S3OriginBE3A92C1", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin3S3Origin815895A3", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin4S3Origin25CF633C", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin5S3OriginF7CEDF65", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Principal": Object { + "CanonicalUser": Object { + "Fn::GetAtt": Array [ + "StackNextJSDistributionOrigin6S3Origin922D99DB", + "S3CanonicalUserId", + ], + }, + }, + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "StackPublicAssets8F0F4FE8", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + }, +} +`; diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/construct.test.ts b/packages/serverless-components/nextjs-cdk-construct/__tests__/construct.test.ts new file mode 100644 index 0000000000..9ba209444d --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/construct.test.ts @@ -0,0 +1,169 @@ +import "@aws-cdk/assert/jest"; +import { SynthUtils } from "@aws-cdk/assert"; +import { Stack } from "@aws-cdk/core"; +import path from "path"; +import { NextJSLambdaEdge } from "../src"; +import { Runtime } from "@aws-cdk/aws-lambda"; +import { Certificate } from "@aws-cdk/aws-certificatemanager"; +import { HostedZone } from "@aws-cdk/aws-route53"; + +describe("CDK Construct", () => { + it("passes correct lambda options to underlying lambdas when single value passed", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate"), + runtime: Runtime.NODEJS_10_X + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextDefaultLambda", + Runtime: Runtime.NODEJS_10_X.name + }); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextApiLambda", + Runtime: Runtime.NODEJS_10_X.name + }); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextImageLambda", + Runtime: Runtime.NODEJS_10_X.name + }); + }); + + it("passes correct lambda options to underlying lambdas when object passed", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate"), + runtime: { + defaultLambda: Runtime.PYTHON_3_8, + apiLambda: Runtime.GO_1_X, + imageLambda: Runtime.JAVA_8_CORRETTO + } + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextDefaultLambda", + Runtime: Runtime.PYTHON_3_8.name + }); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextApiLambda", + Runtime: Runtime.GO_1_X.name + }); + expect(synthesizedStack).toHaveResourceLike("AWS::Lambda::Function", { + FunctionName: "NextImageLambda", + Runtime: Runtime.JAVA_8_CORRETTO.name + }); + }); + + it("lambda cache policy passes correct cookies to origin when specified", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate"), + whiteListedCookies: ["my-cookie"] + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toHaveResourceLike( + "AWS::CloudFront::CachePolicy", + { + CachePolicyConfig: { + Name: "NextLambdaCache", + ParametersInCacheKeyAndForwardedToOrigin: { + CookiesConfig: { + CookieBehavior: "whitelist", + Cookies: ["my-cookie"] + } + } + } + } + ); + }); + + it("lambda cache policy passes all cookies to origin when not specified", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate") + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toHaveResourceLike( + "AWS::CloudFront::CachePolicy", + { + CachePolicyConfig: { + Name: "NextLambdaCache", + ParametersInCacheKeyAndForwardedToOrigin: { + CookiesConfig: { + CookieBehavior: "all" + } + } + } + } + ); + }); + + it("creates resources required for a custom domain when specified", () => { + const stack = new Stack(); + const certificate = Certificate.fromCertificateArn( + stack, + "Cert", + "arn:partition:service:us-east-1:1234578:abc" + ); + const domainName = "domain.com"; + const hostedZone = HostedZone.fromHostedZoneAttributes(stack, "Zone", { + hostedZoneId: "123", + zoneName: domainName + }); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate"), + domain: { + certificate, + domainName, + hostedZone + } + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toHaveResourceLike( + "AWS::CloudFront::Distribution", + { + DistributionConfig: { + Aliases: ["domain.com"], + ViewerCertificate: { + AcmCertificateArn: "arn:partition:service:us-east-1:1234578:abc" + } + } + } + ); + + expect(synthesizedStack).toHaveResourceLike("AWS::Route53::RecordSet", { + Name: "domain.com.", + Type: "A", + AliasTarget: { + DNSName: { + "Fn::GetAtt": ["StackNextJSDistribution03A07E47", "DomainName"] + }, + HostedZoneId: { + "Fn::FindInMap": [ + "AWSCloudFrontPartitionHostedZoneIdMap", + { + Ref: "AWS::Partition" + }, + "zoneId" + ] + } + }, + HostedZoneId: "123" + }); + }); + + it("does not create Route53 records when no domain specified", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate") + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toCountResources("AWS::Route53::RecordSet", 0); + }); +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/index.js b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/index.js new file mode 100644 index 0000000000..a4da533215 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/index.js @@ -0,0 +1,3 @@ +exports.handler = async () => ({ + statusCode: 200 +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/manifest.json new file mode 100644 index 0000000000..64443e7037 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/manifest.json @@ -0,0 +1,10 @@ +{ + "apis": { + "dynamic": {}, + "nonDynamic": { + "/api/users": "pages/api/users.js" + } + }, + "domainRedirects": {}, + "enableHTTPCompression": false +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/pages/api/users.js b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/pages/api/users.js new file mode 100644 index 0000000000..a4da533215 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/pages/api/users.js @@ -0,0 +1,3 @@ +exports.handler = async () => ({ + statusCode: 200 +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/routes-manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/routes-manifest.json new file mode 100644 index 0000000000..1c38fb2ec7 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/api-lambda/routes-manifest.json @@ -0,0 +1,28 @@ +{ + "version": 3, + "pages404": true, + "basePath": "", + "redirects": [], + "rewrites": [], + "headers": [], + "dynamicRoutes": [ + { + "page": "/users/[id]", + "regex": "^/users/([^/]+?)(?:/)?$", + "routeKeys": { "id": "id" }, + "namedRegex": "^/users/(?[^/]+?)(?:/)?$" + } + ], + "dataRoutes": [ + { + "page": "/users", + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users.json$" + }, + { + "page": "/users/[id]", + "routeKeys": { "id": "id" }, + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/([^/]+?)\\.json$", + "namedDataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/(?[^/]+?)\\.json$" + } + ] +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/BUILD_ID b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/BUILD_ID new file mode 100644 index 0000000000..f24873cd5f --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/BUILD_ID @@ -0,0 +1 @@ +IOjzqKr7ylEZVL7Xy7FMd \ No newline at end of file diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/_next/data/stub.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/_next/data/stub.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/_next/static/stub.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/_next/static/stub.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/_next/static/stub.json @@ -0,0 +1 @@ +{} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/public/stub.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/public/stub.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/static-pages/stub.html b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/static-pages/stub.html new file mode 100644 index 0000000000..bed791c441 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/assets/static-pages/stub.html @@ -0,0 +1,11 @@ + + + + + + Stub + + +

Stub

+ + diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/index.js b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/index.js new file mode 100644 index 0000000000..a4da533215 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/index.js @@ -0,0 +1,3 @@ +exports.handler = async () => ({ + statusCode: 200 +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/manifest.json new file mode 100644 index 0000000000..3dc6a31aa9 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/manifest.json @@ -0,0 +1,32 @@ +{ + "buildId": "IOjzqKr7ylEZVL7Xy7FMd", + "logLambdaExecutionTimes": true, + "pages": { + "ssr": { + "dynamic": { + "/users/:id": { + "file": "pages/users/[id].js", + "regex": "^\\/users(?:\\/([^\\/#\\?]+?))[\\/#\\?]?$" + } + }, + "nonDynamic": { + "/users": "pages/users.js", + "/_error": "pages/_error.js" + } + }, + "html": { + "dynamic": {}, + "nonDynamic": { + "/about": "pages/about.html", + "/": "pages/index.html", + "/404": "pages/404.html" + } + } + }, + "publicFiles": { + "/planes.jpg": "planes.jpg" + }, + "trailingSlash": false, + "domainRedirects": {}, + "enableHTTPCompression": false +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/prerender-manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/prerender-manifest.json new file mode 100644 index 0000000000..8e497074bb --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/prerender-manifest.json @@ -0,0 +1,44 @@ +{ + "version": 2, + "routes": { + "/users": { + "initialRevalidateSeconds": false, + "srcRoute": null, + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users.json" + }, + "/users/101": { + "initialRevalidateSeconds": false, + "srcRoute": "/users/[id]", + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/101.json" + }, + "/users/102": { + "initialRevalidateSeconds": false, + "srcRoute": "/users/[id]", + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/102.json" + }, + "/users/103": { + "initialRevalidateSeconds": false, + "srcRoute": "/users/[id]", + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/103.json" + }, + "/users/104": { + "initialRevalidateSeconds": false, + "srcRoute": "/users/[id]", + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/104.json" + } + }, + "dynamicRoutes": { + "/users/[id]": { + "routeRegex": "^/users/([^/]+?)(?:/)?$", + "dataRoute": "/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/[id].json", + "fallback": false, + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/([^/]+?)\\.json$" + } + }, + "notFoundRoutes": [], + "preview": { + "previewModeId": "64a40f77826dd9cb91c1f640436433dd", + "previewModeSigningKey": "b362d55f91531d2c2a13bff0a008e47b4954b90ec8110e3607b6f810b174f8d1", + "previewModeEncryptionKey": "31bfd880a98a525f77d3edb3d7cc184b9ef10297f5b7db77d0b9a75057c84733" + } +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/routes-manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/routes-manifest.json new file mode 100644 index 0000000000..1c38fb2ec7 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/default-lambda/routes-manifest.json @@ -0,0 +1,28 @@ +{ + "version": 3, + "pages404": true, + "basePath": "", + "redirects": [], + "rewrites": [], + "headers": [], + "dynamicRoutes": [ + { + "page": "/users/[id]", + "regex": "^/users/([^/]+?)(?:/)?$", + "routeKeys": { "id": "id" }, + "namedRegex": "^/users/(?[^/]+?)(?:/)?$" + } + ], + "dataRoutes": [ + { + "page": "/users", + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users.json$" + }, + { + "page": "/users/[id]", + "routeKeys": { "id": "id" }, + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/([^/]+?)\\.json$", + "namedDataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/(?[^/]+?)\\.json$" + } + ] +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/images-manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/images-manifest.json new file mode 100644 index 0000000000..9b1a2ac3e7 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/images-manifest.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "images": { + "deviceSizes": [640, 750, 828, 1080, 1200, 1920, 2048, 3840], + "imageSizes": [16, 32, 48, 64, 96, 128, 256, 384], + "path": "/_next/image", + "loader": "default", + "domains": [], + "sizes": [ + 640, + 750, + 828, + 1080, + 1200, + 1920, + 2048, + 3840, + 16, + 32, + 48, + 64, + 96, + 128, + 256, + 384 + ] + } +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/index.js b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/index.js new file mode 100644 index 0000000000..a4da533215 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/index.js @@ -0,0 +1,3 @@ +exports.handler = async () => ({ + statusCode: 200 +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/manifest.json new file mode 100644 index 0000000000..21b66bd721 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/manifest.json @@ -0,0 +1,4 @@ +{ + "domainRedirects": {}, + "enableHTTPCompression": false +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/routes-manifest.json b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/routes-manifest.json new file mode 100644 index 0000000000..1c38fb2ec7 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/fixtures/next-boilerplate/image-lambda/routes-manifest.json @@ -0,0 +1,28 @@ +{ + "version": 3, + "pages404": true, + "basePath": "", + "redirects": [], + "rewrites": [], + "headers": [], + "dynamicRoutes": [ + { + "page": "/users/[id]", + "regex": "^/users/([^/]+?)(?:/)?$", + "routeKeys": { "id": "id" }, + "namedRegex": "^/users/(?[^/]+?)(?:/)?$" + } + ], + "dataRoutes": [ + { + "page": "/users", + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users.json$" + }, + { + "page": "/users/[id]", + "routeKeys": { "id": "id" }, + "dataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/([^/]+?)\\.json$", + "namedDataRouteRegex": "^/_next/data/IOjzqKr7ylEZVL7Xy7FMd/users/(?[^/]+?)\\.json$" + } + ] +} diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/snapshots.test.ts b/packages/serverless-components/nextjs-cdk-construct/__tests__/snapshots.test.ts new file mode 100644 index 0000000000..a4b4d1f985 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/snapshots.test.ts @@ -0,0 +1,16 @@ +import { SynthUtils } from "@aws-cdk/assert"; +import { Stack } from "@aws-cdk/core"; +import path from "path"; +import { NextJSLambdaEdge } from "../src"; + +describe("CDK Construct Snapshots", () => { + it("creates boilerplate next app", () => { + const stack = new Stack(); + new NextJSLambdaEdge(stack, "Stack", { + serverlessBuildOutDir: path.join(__dirname, "fixtures/next-boilerplate") + }); + + const synthesizedStack = SynthUtils.toCloudFormation(stack); + expect(synthesizedStack).toMatchSnapshot(); + }); +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/__tests__/utils.test.ts b/packages/serverless-components/nextjs-cdk-construct/__tests__/utils.test.ts new file mode 100644 index 0000000000..93b38b4d87 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/__tests__/utils.test.ts @@ -0,0 +1,77 @@ +import { toLambdaOption } from "../src/utils/toLambdaOption"; +import { readInvalidationPathsFromManifest } from "../src/utils/readInvalidationPathsFromManifest"; +import { OriginRequestDefaultHandlerManifest } from "@sls-next/lambda-at-edge"; +import { reduceInvalidationPaths } from "../src/utils/reduceInvalidationPaths"; + +describe("CDK Utils", () => { + test.each` + args | expectedReturn + ${["defaultLambda", { defaultLambda: 1 }]} | ${1} + ${["apiLambda", { defaultLambda: 1 }]} | ${undefined} + ${["apiLambda", 1]} | ${1} + ${["imageLambda", { imageLambda: { foo: "bar" } }]} | ${{ foo: "bar" }} + ${["defaultLambda"]} | ${undefined} + `("toLambdaOption", ({ args: [key, option], expectedReturn }) => { + expect(toLambdaOption(key, option)).toStrictEqual(expectedReturn); + }); + + const file = { file: "", regex: "" }; + const ssgRoute = { + dataRoute: "", + dataRouteRegex: "", + fallback: null, + routeRegex: "" + }; + const nonDynamicSsgRoute = { + dataRoute: "", + initialRevalidateSeconds: false, + srcRoute: "" + }; + test("readInvalidationPathsFromManifest", () => { + expect( + readInvalidationPathsFromManifest({ + pages: { + html: { + dynamic: { + "/:id": file, + "/:id/test": file, + "/test/:id/test": file + }, + nonDynamic: { "/id": "" } + }, + ssr: { + dynamic: { "/ssr/:id": file }, + nonDynamic: { "/ssr-page": "" } + }, + ssg: { + dynamic: { "/ssg/:id": ssgRoute }, + nonDynamic: { "/ssg-page": nonDynamicSsgRoute } + } + } as OriginRequestDefaultHandlerManifest["pages"] + } as any).sort() + ).toStrictEqual( + [ + "/*", // /:id + "/*", // /:id/test + "/test/*", // /test/:id/test + "/id", // /id + "/ssr/*", // /ssr/:id + "/ssr-page", // /ssr-page + "/ssg/*", // /ssg/:id + "/ssg-page" // /ssg-page + ].sort() + ); + }); + + test.each` + paths | expectedReturn + ${["/*", "/users", "/users/*"]} | ${["/*"]} + ${["/users", "/users/*"]} | ${["/users", "/users/*"]} + ${["/users", "/users/*", "/posts", "/posts/*"]} | ${["/users", "/users/*", "/posts", "/posts/*"]} + ${["/users", "/users/list", "/users/details/*", "/users/*"]} | ${["/users", "/users/*"]} + ${["/users", "/users/list", "/users/details/info", "/*"]} | ${["/*"]} + ${["/users*", "/users/*", "/users/test/*"]} | ${["/users*", "/users/*"]} + `("reduceInvalidationPaths", ({ paths, expectedReturn }) => { + expect(reduceInvalidationPaths(paths)).toStrictEqual(expectedReturn); + }); +}); diff --git a/packages/serverless-components/nextjs-cdk-construct/package.json b/packages/serverless-components/nextjs-cdk-construct/package.json new file mode 100644 index 0000000000..84714b627c --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/package.json @@ -0,0 +1,50 @@ +{ + "name": "@sls-next/cdk-construct", + "publishConfig": { + "access": "public" + }, + "description": "Serverless Next.js powered by AWS CDK", + "version": "1.19.0-alpha.27", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "author": "Henry Kirkness ", + "keywords": [ + "serverless", + "cdk", + "nextjs" + ], + "scripts": { + "prepare": "yarn build", + "build": "tsc -p tsconfig.json" + }, + "bugs": { + "url": "https://github.com/serverless-nextjs/serverless-next.js/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/serverless-nextjs/serverless-next.js.git", + "directory": "packages/serverless-components/nextjs-cdk-construct" + }, + "license": "MIT", + "dependencies": { + "@aws-cdk/aws-certificatemanager": "^1.75.0", + "@aws-cdk/aws-cloudfront": "^1.75.0", + "@aws-cdk/aws-cloudfront-origins": "^1.75.0", + "@aws-cdk/aws-iam": "^1.75.0", + "@aws-cdk/aws-lambda": "^1.75.0", + "@aws-cdk/aws-logs": "^1.75.0", + "@aws-cdk/aws-route53": "^1.75.0", + "@aws-cdk/aws-route53-targets": "^1.75.0", + "@aws-cdk/aws-s3": "^1.75.0", + "@aws-cdk/aws-s3-deployment": "^1.75.0", + "@aws-cdk/core": "^1.75.0", + "@sls-next/lambda-at-edge": "link:../../libs/lambda-at-edge", + "fs-extra": "^9.0.1", + "fast-glob": "^3.2.5" + }, + "devDependencies": { + "@aws-cdk/assert": "^1.75.0", + "@types/fs-extra": "^9.0.1", + "typescript": "^3.9.6" + } +} diff --git a/packages/serverless-components/nextjs-cdk-construct/src/index.ts b/packages/serverless-components/nextjs-cdk-construct/src/index.ts new file mode 100644 index 0000000000..65785ed2cb --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/index.ts @@ -0,0 +1,415 @@ +import * as cdk from "@aws-cdk/core"; +import * as lambda from "@aws-cdk/aws-lambda"; +import * as s3 from "@aws-cdk/aws-s3"; +import * as logs from "@aws-cdk/aws-logs"; +import * as s3Deploy from "@aws-cdk/aws-s3-deployment"; +import * as cloudfront from "@aws-cdk/aws-cloudfront"; +import * as origins from "@aws-cdk/aws-cloudfront-origins"; +import { ARecord, RecordTarget } from "@aws-cdk/aws-route53"; +import { + OriginRequestImageHandlerManifest, + OriginRequestApiHandlerManifest, + OriginRequestDefaultHandlerManifest, + RoutesManifest +} from "@sls-next/lambda-at-edge"; +import * as fs from "fs-extra"; +import * as path from "path"; +import { + Role, + ManagedPolicy, + ServicePrincipal, + CompositePrincipal +} from "@aws-cdk/aws-iam"; +import { Duration, RemovalPolicy } from "@aws-cdk/core"; +import { CloudFrontTarget } from "@aws-cdk/aws-route53-targets"; +import { OriginRequestQueryStringBehavior } from "@aws-cdk/aws-cloudfront"; +import { Props } from "./props"; +import { toLambdaOption } from "./utils/toLambdaOption"; +import { readAssetsDirectory } from "./utils/readAssetsDirectory"; +import { readInvalidationPathsFromManifest } from "./utils/readInvalidationPathsFromManifest"; +import { reduceInvalidationPaths } from "./utils/reduceInvalidationPaths"; + +export * from "./props"; + +export class NextJSLambdaEdge extends cdk.Construct { + private routesManifest: RoutesManifest | null; + + private apiBuildManifest: OriginRequestApiHandlerManifest | null; + + private imageManifest: OriginRequestImageHandlerManifest | null; + + private defaultManifest: OriginRequestDefaultHandlerManifest; + + public distribution: cloudfront.Distribution; + + public bucket: s3.Bucket; + + constructor(scope: cdk.Construct, id: string, private props: Props) { + super(scope, id); + this.apiBuildManifest = this.readApiBuildManifest(); + this.routesManifest = this.readRoutesManifest(); + this.imageManifest = this.readImageBuildManifest(); + this.defaultManifest = this.readDefaultManifest(); + this.bucket = new s3.Bucket(this, "PublicAssets", { + publicReadAccess: true, + + // Given this resource is created internally and also should only contain + // assets uploaded by this library we should be able to safely delete all + // contents along with the bucket its self upon stack deletion. + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY + }); + + const edgeLambdaRole = new Role(this, "NextEdgeLambdaRole", { + assumedBy: new CompositePrincipal( + new ServicePrincipal("lambda.amazonaws.com"), + new ServicePrincipal("edgelambda.amazonaws.com") + ), + managedPolicies: [ + ManagedPolicy.fromManagedPolicyArn( + this, + "NextApiLambdaPolicy", + "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ) + ] + }); + + const defaultNextLambda = new lambda.Function(this, "NextLambda", { + functionName: + toLambdaOption("defaultLambda", props.name) || "NextDefaultLambda", + description: `Default Lambda@Edge for Next CloudFront distribution`, + handler: "index.handler", + currentVersionOptions: { + removalPolicy: RemovalPolicy.DESTROY // destroy old versions + }, + logRetention: logs.RetentionDays.THREE_DAYS, + code: lambda.Code.fromAsset( + path.join(this.props.serverlessBuildOutDir, "default-lambda") + ), + role: edgeLambdaRole, + runtime: + toLambdaOption("defaultLambda", props.runtime) || + lambda.Runtime.NODEJS_12_X, + memorySize: toLambdaOption("defaultLambda", props.memory), + timeout: toLambdaOption("defaultLambda", props.timeout) + }); + + defaultNextLambda.currentVersion.addAlias("live"); + + const apis = this.apiBuildManifest?.apis; + const hasAPIPages = + apis && + (Object.keys(apis.nonDynamic).length > 0 || + Object.keys(apis.dynamic).length > 0); + + let nextApiLambda = null; + if (hasAPIPages) { + nextApiLambda = new lambda.Function(this, "NextApiLambda", { + functionName: + toLambdaOption("apiLambda", props.name) || "NextApiLambda", + description: `Default Lambda@Edge for Next API CloudFront distribution`, + handler: "index.handler", + currentVersionOptions: { + removalPolicy: RemovalPolicy.DESTROY, // destroy old versions + retryAttempts: 1 // async retry attempts + }, + logRetention: logs.RetentionDays.THREE_DAYS, + code: lambda.Code.fromAsset( + path.join(this.props.serverlessBuildOutDir, "api-lambda") + ), + role: edgeLambdaRole, + runtime: + toLambdaOption("apiLambda", props.runtime) || + lambda.Runtime.NODEJS_12_X, + memorySize: toLambdaOption("apiLambda", props.memory), + timeout: toLambdaOption("apiLambda", props.timeout) + }); + nextApiLambda.currentVersion.addAlias("live"); + } + + let nextImageLambda = null; + if (this.imageManifest) { + nextImageLambda = new lambda.Function(this, "NextImageLambda", { + functionName: + toLambdaOption("imageLambda", props.name) || "NextImageLambda", + description: `Default Lambda@Edge for Next Image CloudFront distribution`, + handler: "index.handler", + currentVersionOptions: { + removalPolicy: RemovalPolicy.DESTROY, // destroy old versions + retryAttempts: 1 // async retry attempts + }, + logRetention: logs.RetentionDays.THREE_DAYS, + code: lambda.Code.fromAsset( + path.join(this.props.serverlessBuildOutDir, "image-lambda") + ), + role: edgeLambdaRole, + runtime: + toLambdaOption("imageLambda", props.runtime) || + lambda.Runtime.NODEJS_12_X, + memorySize: toLambdaOption("imageLambda", props.memory), + timeout: toLambdaOption("imageLambda", props.timeout) + }); + nextImageLambda.currentVersion.addAlias("live"); + } + + const nextStaticsCachePolicy = new cloudfront.CachePolicy( + this, + "NextStaticsCache", + { + cachePolicyName: "NextStaticsCache", + queryStringBehavior: cloudfront.CacheQueryStringBehavior.none(), + headerBehavior: cloudfront.CacheHeaderBehavior.none(), + cookieBehavior: cloudfront.CacheCookieBehavior.none(), + defaultTtl: Duration.days(30), + maxTtl: Duration.days(30), + minTtl: Duration.days(30), + enableAcceptEncodingBrotli: true, + enableAcceptEncodingGzip: true + } + ); + + const nextImageCachePolicy = new cloudfront.CachePolicy( + this, + "NextImageCache", + { + cachePolicyName: "NextImageCache", + queryStringBehavior: cloudfront.CacheQueryStringBehavior.all(), + headerBehavior: cloudfront.CacheHeaderBehavior.allowList("Accept"), + cookieBehavior: cloudfront.CacheCookieBehavior.none(), + defaultTtl: Duration.days(1), + maxTtl: Duration.days(365), + minTtl: Duration.days(0), + enableAcceptEncodingBrotli: true, + enableAcceptEncodingGzip: true + } + ); + + const nextLambdaCachePolicy = new cloudfront.CachePolicy( + this, + "NextLambdaCache", + { + cachePolicyName: "NextLambdaCache", + queryStringBehavior: cloudfront.CacheQueryStringBehavior.all(), + headerBehavior: cloudfront.CacheHeaderBehavior.none(), + cookieBehavior: { + behavior: props.whiteListedCookies?.length ? "whitelist" : "all", + cookies: props.whiteListedCookies + }, + defaultTtl: Duration.seconds(0), + maxTtl: Duration.days(365), + minTtl: Duration.seconds(0), + enableAcceptEncodingBrotli: true, + enableAcceptEncodingGzip: true + } + ); + + const edgeLambdas = [ + { + includeBody: true, + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_REQUEST, + functionVersion: defaultNextLambda.currentVersion + }, + { + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE, + functionVersion: defaultNextLambda.currentVersion + } + ]; + + this.distribution = new cloudfront.Distribution( + this, + "NextJSDistribution", + { + enableLogging: props.withLogging ? true : undefined, + certificate: props.domain?.certificate, + domainNames: props.domain ? [props.domain.domainName] : undefined, + defaultRootObject: "", + defaultBehavior: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextLambdaCachePolicy, + edgeLambdas, + ...(props.defaultBehavior || {}) + }, + additionalBehaviors: { + ...(nextImageLambda + ? { + [this.pathPattern("_next/image*")]: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL, + cachedMethods: + cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextImageCachePolicy, + originRequestPolicy: new cloudfront.OriginRequestPolicy( + this, + "ImageOriginRequest", + { + queryStringBehavior: OriginRequestQueryStringBehavior.all() + } + ), + edgeLambdas: [ + { + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_REQUEST, + functionVersion: nextImageLambda.currentVersion + } + ] + } + } + : {}), + [this.pathPattern("_next/data/*")]: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextLambdaCachePolicy, + edgeLambdas + }, + [this.pathPattern("_next/*")]: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextStaticsCachePolicy + }, + [this.pathPattern("static/*")]: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS, + cachedMethods: cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextStaticsCachePolicy + }, + ...(nextApiLambda + ? { + [this.pathPattern("api/*")]: { + viewerProtocolPolicy: + cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, + origin: new origins.S3Origin(this.bucket), + allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL, + cachedMethods: + cloudfront.CachedMethods.CACHE_GET_HEAD_OPTIONS, + compress: true, + cachePolicy: nextLambdaCachePolicy, + edgeLambdas: [ + { + includeBody: true, + eventType: cloudfront.LambdaEdgeEventType.ORIGIN_REQUEST, + functionVersion: nextApiLambda.currentVersion + } + ] + } + } + : {}), + ...(props.behaviours || {}) + } + } + ); + + const assetsDirectory = path.join(props.serverlessBuildOutDir, "assets"); + const assets = readAssetsDirectory({ assetsDirectory }); + + // This `BucketDeployment` deploys just the BUILD_ID file. We don't actually + // use the BUILD_ID file at runtime, however in this case we use it as a + // file to allow us to create an invalidation of all the routes as evaluated + // in the function `readInvalidationPathsFromManifest`. + new s3Deploy.BucketDeployment(this, `AssetDeploymentBuildID`, { + destinationBucket: this.bucket, + sources: [ + s3Deploy.Source.asset(assetsDirectory, { exclude: ["**", "!BUILD_ID"] }) + ], + // This will actually cause the file to exist at BUILD_ID, we do this so + // that the prune will only prune /BUILD_ID/*, rather than all files fromm + // the root upwards. + destinationKeyPrefix: "/BUILD_ID", + distribution: this.distribution, + distributionPaths: + props.invalidationPaths || + reduceInvalidationPaths( + readInvalidationPathsFromManifest(this.defaultManifest) + ) + }); + + Object.keys(assets).forEach((key) => { + const { path: assetPath, cacheControl } = assets[key]; + new s3Deploy.BucketDeployment(this, `AssetDeployment_${key}`, { + destinationBucket: this.bucket, + sources: [s3Deploy.Source.asset(assetPath)], + cacheControl: [s3Deploy.CacheControl.fromString(cacheControl)], + + // The source contents will be unzipped to and loaded into the S3 bucket + // at the root '/', we don't want this, we want to maintain the same + // path on S3 as their local path. + destinationKeyPrefix: path.relative(assetsDirectory, assetPath), + + // Source directories are uploaded with `--sync` this means that any + // files that don't exist in the source directory, but do in the S3 + // bucket, will be removed. + prune: true + }); + }); + + if (props.domain) { + new ARecord(this, "AliasRecord", { + recordName: props.domain.domainName, + zone: props.domain.hostedZone, + target: RecordTarget.fromAlias(new CloudFrontTarget(this.distribution)) + }); + } + } + + private pathPattern(pattern: string): string { + const { basePath } = this.routesManifest || {}; + return basePath && basePath.length > 0 + ? `${basePath.slice(1)}/${pattern}` + : pattern; + } + + private readRoutesManifest(): RoutesManifest { + return fs.readJSONSync( + path.join( + this.props.serverlessBuildOutDir, + "default-lambda/routes-manifest.json" + ) + ); + } + + private readDefaultManifest(): OriginRequestDefaultHandlerManifest { + return fs.readJSONSync( + path.join( + this.props.serverlessBuildOutDir, + "default-lambda/manifest.json" + ) + ); + } + + private readApiBuildManifest(): OriginRequestApiHandlerManifest | null { + const apiPath = path.join( + this.props.serverlessBuildOutDir, + "api-lambda/manifest.json" + ); + if (!fs.existsSync(apiPath)) return null; + return fs.readJsonSync(apiPath); + } + + private readImageBuildManifest(): OriginRequestImageHandlerManifest | null { + const imageLambdaPath = path.join( + this.props.serverlessBuildOutDir, + "image-lambda/manifest.json" + ); + + return fs.existsSync(imageLambdaPath) + ? fs.readJSONSync(imageLambdaPath) + : null; + } +} diff --git a/packages/serverless-components/nextjs-cdk-construct/src/props.ts b/packages/serverless-components/nextjs-cdk-construct/src/props.ts new file mode 100644 index 0000000000..833b0c9612 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/props.ts @@ -0,0 +1,77 @@ +import { ICertificate } from "@aws-cdk/aws-certificatemanager"; +import { BehaviorOptions } from "@aws-cdk/aws-cloudfront"; +import { Runtime } from "@aws-cdk/aws-lambda"; +import { IHostedZone } from "@aws-cdk/aws-route53"; +import { Duration, StackProps } from "@aws-cdk/core"; + +export type LambdaOption = + | T + | { defaultLambda?: T; apiLambda?: T; imageLambda?: T }; + +export interface Props extends StackProps { + /** + * The directory that holds the output from the serverless builder. + * + * i.e. `serverlessBuildOutDir: new Builder(entry, outDir, {...}).outputDir` + */ + serverlessBuildOutDir: string; + /** + * Is you'd like a custom domain for your site, you'll need to pass in a + * `hostedZone`, `certificate` and full `domainName` + */ + domain?: { + hostedZone: IHostedZone; + certificate: ICertificate; + domainName: string; + }; + /** + * Lambda memory limit(s) + */ + memory?: LambdaOption; + /** + * Lambda timeout(s) + */ + timeout?: LambdaOption; + /** + * Lambda name(s) + */ + name?: LambdaOption; + /** + * Lambda runtimes(s) + */ + runtime?: LambdaOption; + /** + * Enable logging on the cloudfront distribution + */ + withLogging?: boolean; + /** + * Provide a list of cookies to forward to the CloudFront origin. + * + * This is useful if your SSR page is different based on the user requesting + * it, so you might for example cache based on the user's authentication token. + * + * .e.g ['my-apps-auth-token-cookie-key'] + */ + whiteListedCookies?: string[]; + /** + * Provide a subset (or all) of the props to override the CloudFront + * distributions default props. + */ + defaultBehavior?: Partial; + /** + * Optionally pass one or many custom CloudFront behaviours. + * + * This is handy if you want to adjust how certain assets are cached, or add + * another `lambda@edge` endpoint. + */ + behaviours?: Record; + /** + * Pass an array of invalidation paths. By default this construct will + * invalidate all paths found in your pages manifest. You can reduce the + * number of invalidations created by invalidating all paths using: + * ```ts + * invalidationPaths: ["/*"] + * ``` + */ + invalidationPaths?: string[]; +} diff --git a/packages/serverless-components/nextjs-cdk-construct/src/utils/readAssetsDirectory.ts b/packages/serverless-components/nextjs-cdk-construct/src/utils/readAssetsDirectory.ts new file mode 100644 index 0000000000..dc46cbe8e3 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/utils/readAssetsDirectory.ts @@ -0,0 +1,63 @@ +import path from "path"; +import fs from "fs-extra"; + +const IMMUTABLE_CACHE_CONTROL_HEADER = "public, max-age=31536000, immutable"; + +const SERVER_CACHE_CONTROL_HEADER = + "public, max-age=0, s-maxage=2678400, must-revalidate"; + +const DEFAULT_PUBLIC_DIR_CACHE_CONTROL = + "public, max-age=31536000, must-revalidate"; + +type CacheConfig = Record< + string, + { + cacheControl: string; + path: string; + } +>; + +const filterNonExistentPathKeys = (config: CacheConfig) => { + return Object.keys(config).reduce( + (newConfig, nextConfigKey) => ({ + ...newConfig, + ...(fs.pathExistsSync(config[nextConfigKey].path) + ? { [nextConfigKey]: config[nextConfigKey] } + : {}) + }), + {} as CacheConfig + ); +}; + +const readAssetsDirectory = (options: { + assetsDirectory: string; +}): CacheConfig => { + const { assetsDirectory } = options; + const publicFiles = path.join(assetsDirectory, "public"); + const staticFiles = path.join(assetsDirectory, "static"); + const staticPages = path.join(assetsDirectory, "static-pages"); + const nextData = path.join(assetsDirectory, "_next", "data"); + const nextStatic = path.join(assetsDirectory, "_next", "static"); + + return filterNonExistentPathKeys({ + publicFiles: { + path: publicFiles, + cacheControl: DEFAULT_PUBLIC_DIR_CACHE_CONTROL + }, + staticFiles: { + path: staticFiles, + cacheControl: DEFAULT_PUBLIC_DIR_CACHE_CONTROL + }, + staticPages: { + path: staticPages, + cacheControl: SERVER_CACHE_CONTROL_HEADER + }, + nextData: { path: nextData, cacheControl: SERVER_CACHE_CONTROL_HEADER }, + nextStatic: { + path: nextStatic, + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + } + }); +}; + +export { readAssetsDirectory }; diff --git a/packages/serverless-components/nextjs-cdk-construct/src/utils/readInvalidationPathsFromManifest.ts b/packages/serverless-components/nextjs-cdk-construct/src/utils/readInvalidationPathsFromManifest.ts new file mode 100644 index 0000000000..45a7ac2567 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/utils/readInvalidationPathsFromManifest.ts @@ -0,0 +1,26 @@ +import * as path from "path"; +import { OriginRequestDefaultHandlerManifest } from "@sls-next/lambda-at-edge"; + +const dynamicPathToInvalidationPath = (dynamicPath: string) => { + const [firstSegment] = dynamicPath.split("/:"); + return path.join(firstSegment || "/", "*"); +}; + +export const readInvalidationPathsFromManifest = ( + manifest: OriginRequestDefaultHandlerManifest +): string[] => { + return [ + ...Object.keys(manifest.pages.html.dynamic).map( + dynamicPathToInvalidationPath + ), + ...Object.keys(manifest.pages.html.nonDynamic), + ...Object.keys(manifest.pages.ssr.dynamic).map( + dynamicPathToInvalidationPath + ), + ...Object.keys(manifest.pages.ssr.nonDynamic), + ...Object.keys(manifest.pages.ssg?.dynamic || {}).map( + dynamicPathToInvalidationPath + ), + ...Object.keys(manifest.pages.ssg?.nonDynamic || {}) + ]; +}; diff --git a/packages/serverless-components/nextjs-cdk-construct/src/utils/reduceInvalidationPaths.ts b/packages/serverless-components/nextjs-cdk-construct/src/utils/reduceInvalidationPaths.ts new file mode 100644 index 0000000000..a16b0aedde --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/utils/reduceInvalidationPaths.ts @@ -0,0 +1,21 @@ +/** + * We don't need to invalidate sub paths if a parent has a wild card + * invalidation. i.e. if `/users/*` exists, we don't need to invalidate `/users/details/*` + */ +export const reduceInvalidationPaths = ( + invalidationPaths: string[] +): string[] => { + const wildCardDirectories = invalidationPaths + .filter((invalidationPath) => invalidationPath.endsWith("/*")) + .map((invalidationPath) => invalidationPath.replace("/*", "")); + + return invalidationPaths.filter((invalidationPath) => { + return !wildCardDirectories.some( + (wildCardDirectory) => + invalidationPath.startsWith(wildCardDirectory) && + invalidationPath !== `${wildCardDirectory}*` && + invalidationPath !== `${wildCardDirectory}/*` && + wildCardDirectory !== invalidationPath + ); + }); +}; diff --git a/packages/serverless-components/nextjs-cdk-construct/src/utils/toLambdaOption.ts b/packages/serverless-components/nextjs-cdk-construct/src/utils/toLambdaOption.ts new file mode 100644 index 0000000000..3fa7641f02 --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/src/utils/toLambdaOption.ts @@ -0,0 +1,18 @@ +import { LambdaOption } from "../props"; + +export const toLambdaOption = ( + key: "defaultLambda" | "apiLambda" | "imageLambda", + option?: LambdaOption +): T | undefined => { + if ( + typeof option !== "object" || + !( + "defaultLambda" in option || + "apiLambda" in option || + "imageLambda" in option + ) + ) { + return option as T | undefined; + } + return option[key]; +}; diff --git a/packages/serverless-components/nextjs-cdk-construct/tsconfig.json b/packages/serverless-components/nextjs-cdk-construct/tsconfig.json new file mode 100644 index 0000000000..a8c0e5df5b --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "declaration": true, + "target": "ES2015", + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "dist", + "sourceMap": true, + "strict": true, + "allowJs": true + }, + "exclude": ["node_modules"], + "include": ["./src"] +} diff --git a/packages/serverless-components/nextjs-cdk-construct/yarn.lock b/packages/serverless-components/nextjs-cdk-construct/yarn.lock new file mode 100644 index 0000000000..76d3de345a --- /dev/null +++ b/packages/serverless-components/nextjs-cdk-construct/yarn.lock @@ -0,0 +1,2563 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aws-cdk/assert@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/assert/-/assert-1.87.1.tgz#947f56c438e1f125e770c947d828372ee7ccb601" + integrity sha512-X1Cv1LBdkdHQXtgrw8rRSW2PuAmODq1mKUtnGVgyNf0hGGhHvU/N0Y//SG6Rw6iMxA4orj7IKQXUTiGchsqiSQ== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/cloudformation-diff" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/assets@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/assets/-/assets-1.87.1.tgz#c3d6fbd24bab54001998895636aa932798d92726" + integrity sha512-JPSJ+/Ofu6gLq/mHM8nV8LYqdHmXPVv46M1yOniY5i/s+hWHTBS4gPxZ/F69dVvfVlV2ibLsd1bXRvuLH2Zsfw== + dependencies: + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-apigateway@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigateway/-/aws-apigateway-1.87.1.tgz#1c174c9380b444f219babb98185f515c8a7384aa" + integrity sha512-QKhfBxxDEQNgiwv3JVckvrvJj+TPBfeuN/sCSM769EHMZZmyxYa4Ln6te1cKpcNv1aSxUeqBb45YsgiUJn8wOg== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-elasticloadbalancingv2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-logs" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-s3-assets" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-apigatewayv2@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-apigatewayv2/-/aws-apigatewayv2-1.87.1.tgz#a8b6f0f9fd42d0e0d57d2bac4950422eae9de928" + integrity sha512-/RHcoOojeTDm2d8cDOi+t9Co27MGW82J624IIwNgfAIMpyLMiFHjcZNnpHY7hEjlQf5PnTP4lMcZYAvWS0mFfA== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-applicationautoscaling@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-applicationautoscaling/-/aws-applicationautoscaling-1.87.1.tgz#43d476b384d790ad0a5f227675dcfc6998ff47c1" + integrity sha512-HqYMHYHDzGmYMR6yevHIjQlBzYPUy+kgfp43WsVn/uJQNirIlfGt+Qi9Q0pMnQqTNlwncKgYlI+IqRDeNtfNBg== + dependencies: + "@aws-cdk/aws-autoscaling-common" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-autoscaling-common@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-autoscaling-common/-/aws-autoscaling-common-1.87.1.tgz#650d17d3e335f47d690db87ef5e99469fe099bff" + integrity sha512-O9pHrIMtb64tFWPLUnSoatNA9RUwr4+vm6GcpJ0uWs1igkNtKn/lQg0etOVStQa01VQIF+Zs5n4Xo0QOXUQrZg== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-certificatemanager@1.87.1", "@aws-cdk/aws-certificatemanager@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-certificatemanager/-/aws-certificatemanager-1.87.1.tgz#70b962a25b312ff713954d13ce7932e62da3b29f" + integrity sha512-MD2tPosafkR2M/PjdwB+elkIUYNg3um8WLKhmv1OvXYPYRQi+/P0AH8DnjNY5bZWL0a3br1C0s5jPXEIHiGaMg== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-route53" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-cloudformation@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudformation/-/aws-cloudformation-1.87.1.tgz#e2a0a6d90db00781bdc67a188def4b1583cbe509" + integrity sha512-cN3MmAj7rf1btSanY3RArxYZH0eBhB5uQOWTsrre6CoKuS3qoiyn73lBB1JhTwz8t49tIFGLudIkI1fYdDNjlg== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-sns" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-cloudfront-origins@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudfront-origins/-/aws-cloudfront-origins-1.87.1.tgz#07b792e674a58188f04c2c36cb4e2c9e79edd4be" + integrity sha512-fCObnePlt66paLFYPefNZWgLlUPlr3NuxtSyAlMML6xZzBe1fJVfWDzd5lC5DOcVHGsPs9wzq8ObwgVIe6YvxQ== + dependencies: + "@aws-cdk/aws-cloudfront" "1.87.1" + "@aws-cdk/aws-elasticloadbalancingv2" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-cloudfront@1.87.1", "@aws-cdk/aws-cloudfront@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudfront/-/aws-cloudfront-1.87.1.tgz#31079797a790d1df0daca4f2d6e82f6cbbc184e6" + integrity sha512-snwBt1jus7+cpy+Kiiy7hVmbHkef6Oxaqz98OiLoPM3WHHGSO/VX5BHeRRRlbzPisHas/EscWUr6kh/G0Njttw== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-ssm" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-cloudwatch@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cloudwatch/-/aws-cloudwatch-1.87.1.tgz#6b4fe829ebdf257439e4798fe62fb23f65c9bd38" + integrity sha512-/d4cS5/99bQ5WNzFvPv9ap2trnj6Hb94n/vveICA23oaM1oE4kx9SnMT8EmftVEVfMp/oYXGVyZKBsN4ZdDh7g== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-codeguruprofiler@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-codeguruprofiler/-/aws-codeguruprofiler-1.87.1.tgz#8d634f800752ff4c4d5ab612d25ea45580f53aa9" + integrity sha512-38LuPRmB1J+NQ5ijA0/vGYJA07kVkWkZzKzWhIsKjWHAfCrumVQ36yWRQrZT3a+EhC61NtB/lO9au8sy6c3o3A== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-cognito@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-cognito/-/aws-cognito-1.87.1.tgz#f27e26937878818457594e3b0c23783abeb399f0" + integrity sha512-f9YBkDu8VdAsyKKlyfu4pRT3zX0pI10nffzYRR1lRXj41PGgXdJacJRm8Ng8jxlHTiK0Uum0Rg5QUvEYOxX5xQ== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/custom-resources" "1.87.1" + constructs "^3.2.0" + punycode "^2.1.1" + +"@aws-cdk/aws-ec2@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ec2/-/aws-ec2-1.87.1.tgz#2f2fc0ceff92918e37d50806afed3bdb616779de" + integrity sha512-HGIbxH3kwhtQiA+bCR0Pjfx1u3siNotRwPeakOeWtVsSB0mbcPHIpYDL8pHyILcSEjw6gLshP6GLmZJJOQ7cHg== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-logs" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-s3-assets" "1.87.1" + "@aws-cdk/aws-ssm" "1.87.1" + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + "@aws-cdk/region-info" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-ecr-assets@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr-assets/-/aws-ecr-assets-1.87.1.tgz#2dc645058ec5286ca5be974f2e4fff73a82a6f8c" + integrity sha512-+EdHkmJcddi4BtOjfaB01zwOJMXI1ZWM/N0y5uHm/EgGckVXbcSMS3lDDBASx/fY6vWblkABG6d+46vXmV9tAg== + dependencies: + "@aws-cdk/assets" "1.87.1" + "@aws-cdk/aws-ecr" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + minimatch "^3.0.4" + +"@aws-cdk/aws-ecr@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ecr/-/aws-ecr-1.87.1.tgz#7ec21cc74e9564f03bd1c2e415a77c0b0bf890cc" + integrity sha512-xFCVBoyvBsLKLudOkY4V8T3LDW8OGm/AKElgVar7OtmD75jjd8Y3QKAas+L27ONauPJ78ECyxcd2nzXRBigX7g== + dependencies: + "@aws-cdk/aws-events" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-efs@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-efs/-/aws-efs-1.87.1.tgz#af3aa7d29ae35fea3337ea2ca462c22d752931c9" + integrity sha512-RQq3qnSMsLJrFzUECBgpCDgOxPPe/6XLFtNDL749UUqpbRDHqcJQqSs0a1ecWLxQUafJ1bd/DCiIJ7SvRXJ+2A== + dependencies: + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-elasticloadbalancing@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancing/-/aws-elasticloadbalancing-1.87.1.tgz#09b03f6d4326b633289faaa5f0581f583a584f8f" + integrity sha512-UtWmJk3S5ciiou8KWdXTrM+Q3NhpZwMDlFhecdqc36+EZk1c+qFjaUwl1TRqhoYykY3ksfiewiqYRQ3tasnqWA== + dependencies: + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-elasticloadbalancingv2@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-elasticloadbalancingv2/-/aws-elasticloadbalancingv2-1.87.1.tgz#edad05188e40b5954df6f958d2482a648ca11a2a" + integrity sha512-AaoChHUrb1/NtPN8oJXTkxvttvefewF3TNCAb7L5BZuCdfIesC9Pi+NVqjR3uDTezSZLccemDO8d01dDagTqBA== + dependencies: + "@aws-cdk/aws-certificatemanager" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + "@aws-cdk/region-info" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-events@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-events/-/aws-events-1.87.1.tgz#7016acdf7a3f9a42fd28604752765208bbe2c93a" + integrity sha512-P2IJtCwX0tM7iz6YApK7iAWboPrbUmlzB7fnEbmhZ183TzWXZdFFOCn/ONHl9VDcAvqr2BfaCC+yi1fKVx+Kjg== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-iam@1.87.1", "@aws-cdk/aws-iam@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-iam/-/aws-iam-1.87.1.tgz#80d1d32c1e094cf964acddd7c2dbef27f9bb0657" + integrity sha512-wA0wdyQ3tgR/4db26gJF1STY5uzbo80OwK4RRnFAB0/vc26NlEg8cfuQUl8Ekuw+IzwFmsk8MP0t1yzBTZd+BA== + dependencies: + "@aws-cdk/core" "1.87.1" + "@aws-cdk/region-info" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-kms@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-kms/-/aws-kms-1.87.1.tgz#2702e9ac508e7d10bfac2e8e4f84701e65f3eb4c" + integrity sha512-mB7QRW43bCdITPqp2LOH/fd7bxZ6d1Xs3Mqkk8MifOqlWde6icTRVvvMSMdu46QYsh1fuD0eOJFj0OLHAhal8Q== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-lambda@1.87.1", "@aws-cdk/aws-lambda@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-lambda/-/aws-lambda-1.87.1.tgz#4637c7e14a77f110026ae2f40a54d40fcfcfe38b" + integrity sha512-i7KK+t6o9WhdbP6Tmb+KKcCMMPLUnJ2xxFMLARzznSH926Pv+nZ7R8EaznI9sBK8xRifYUMtCGy5hoOMNAiJdQ== + dependencies: + "@aws-cdk/aws-applicationautoscaling" "1.87.1" + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-codeguruprofiler" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-ecr" "1.87.1" + "@aws-cdk/aws-ecr-assets" "1.87.1" + "@aws-cdk/aws-efs" "1.87.1" + "@aws-cdk/aws-events" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-logs" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-s3-assets" "1.87.1" + "@aws-cdk/aws-sqs" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-logs@1.87.1", "@aws-cdk/aws-logs@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-logs/-/aws-logs-1.87.1.tgz#6a89248a132e60fa1a84df80ce9778643fc40e48" + integrity sha512-UqJWpKrGULPoGDfERfk2VUj8QjVUhrNern2zsJ3NOlQWlAu9DgVNPubyfOwPbL37ScbeduPzhu9atJVB72qUKA== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-s3-assets" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-route53-targets@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53-targets/-/aws-route53-targets-1.87.1.tgz#de7cb3747891bfbc227b016d3e61d0e8f87f06a3" + integrity sha512-uYwUh6A3LPko7yIwo3ARzB4aJFQlLY5ppT7N3ZCFvV8fLF3YZZv1vOdRYyT52xMM0RaftAf3dt2gwxg7Cvr12Q== + dependencies: + "@aws-cdk/aws-apigateway" "1.87.1" + "@aws-cdk/aws-apigatewayv2" "1.87.1" + "@aws-cdk/aws-cloudfront" "1.87.1" + "@aws-cdk/aws-cognito" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-elasticloadbalancing" "1.87.1" + "@aws-cdk/aws-elasticloadbalancingv2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-route53" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/region-info" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-route53@1.87.1", "@aws-cdk/aws-route53@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-route53/-/aws-route53-1.87.1.tgz#d0e22f619878119ebe9384181f01e97cf413d231" + integrity sha512-dYyYbExXfZ4LsGMRKKaQMBBnEfgiviDISMq9nH8q5XzsGSthQJdy9k9lehePPUlyo99B1wWSXvMjL66kouuulA== + dependencies: + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-logs" "1.87.1" + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/custom-resources" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-s3-assets@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3-assets/-/aws-s3-assets-1.87.1.tgz#a2f24499ab7ab93e78b9dc18dde3f2df396d17e2" + integrity sha512-t8EwLiLwbfEATG0jucX9LjCo0D+QbPmswLBMaVEeNb3BXdqv+WOhprl/7cR8IZlQZE/saMIFl0zUXBqzqOJUJA== + dependencies: + "@aws-cdk/assets" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-s3-deployment@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3-deployment/-/aws-s3-deployment-1.87.1.tgz#d0bf09d41dba8545e69bdd6e5c6533d2a3bc7c03" + integrity sha512-YiUuZoEhBxy/fwtD76KpAFj40O1IMUfnx5c4EBQvF99BqZs0vL6UzOwiUROO2RFuvJs6ulKSSb1xNJfn2k1aNA== + dependencies: + "@aws-cdk/aws-cloudfront" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-s3" "1.87.1" + "@aws-cdk/aws-s3-assets" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/lambda-layer-awscli" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-s3@1.87.1", "@aws-cdk/aws-s3@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-s3/-/aws-s3-1.87.1.tgz#f3cc4e71be1772001a1e27f81bc4e8cbf309ef11" + integrity sha512-ooNf3Afw5upEpickbqu7vflhXnY0CMdiTwuD3ko7u5KghU1TXzmtQAtuZZ/7GlDJR3HrvXULPte3WMKlJoGJDg== + dependencies: + "@aws-cdk/aws-events" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/core" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-sns@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sns/-/aws-sns-1.87.1.tgz#f0b25b5fb02b86568f7ecd3225e9357ed67d2cc5" + integrity sha512-4IXantX2x63ZryU7x5uvtdUmn5qPMGKm3QKxXRkYZ12aipwLE22bwhU7XFdgAfLiSCcSsXNjV4PgNYI+oXSWzw== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-events" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/aws-sqs" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-sqs@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-sqs/-/aws-sqs-1.87.1.tgz#722e268e501a47b78cfb448661f81389839d7b00" + integrity sha512-PCoToe/Q5ghzkfUm39RsifdcGD8cGGaMx3wptMIxIGeKqxeotGH6uihXFHHm6SPU7U+T6UCPL3SM2IrEFe6aBw== + dependencies: + "@aws-cdk/aws-cloudwatch" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/aws-ssm@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/aws-ssm/-/aws-ssm-1.87.1.tgz#ea962154334c9112bf8768165d6844b210f459ca" + integrity sha512-uQEBX6/yYVxKB8nDYe3bTnUDg6ACqZdFnn4gZFNL8hPtZnIRsOFkJefiV2l1DxXxHv3hupSaZZLo92H5xWoNiQ== + dependencies: + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-kms" "1.87.1" + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/cfnspec@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/cfnspec/-/cfnspec-1.87.1.tgz#86b26be37e00dde11187ae4ce7f8131f3906e018" + integrity sha512-7bD49ah8+2TT1/Jl/DF5YcSqXMn6qL6JMs+edmC2nx6drkXdmtKIT4K4uk7m81bljSreIgyuk1OoXASXoJ9VWw== + dependencies: + md5 "^2.3.0" + +"@aws-cdk/cloud-assembly-schema@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-1.87.1.tgz#9936941c0659781e42ca6fb9903e206db776dcea" + integrity sha512-v9OIifMbExngoJnKxQw7Fbnl3ykUPbTjoIkP52RrCP5QoD3fSdbZ6jQKTXIMzmgRf3RIolXWIzEZD8hKeE4GKg== + dependencies: + jsonschema "^1.4.0" + semver "^7.3.2" + +"@aws-cdk/cloudformation-diff@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloudformation-diff/-/cloudformation-diff-1.87.1.tgz#7078048e06672b56c97150d47989e0ce3dc485bc" + integrity sha512-qWuitGav73o4HX3ZaiE3jwG+x8FOJxZsYIZc7y0mXurDQQ/8TY/c10eemTyIGXRAfSNRcUJIfIkLrt051fV1zQ== + dependencies: + "@aws-cdk/cfnspec" "1.87.1" + colors "^1.4.0" + diff "^5.0.0" + fast-deep-equal "^3.1.3" + string-width "^4.2.0" + table "^6.0.7" + +"@aws-cdk/core@1.87.1", "@aws-cdk/core@^1.75.0": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/core/-/core-1.87.1.tgz#8b686b014edcfc117e06e2c9e03cefe3171c19ca" + integrity sha512-zfXl5AjRGxfXU23HfTxuxW+NNm9cLMy/NguLF6/prRGv9TBWHH5GTwNafMLbT3FyFjedL7IWVl9Af1XlMli4AA== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.87.1" + "@aws-cdk/cx-api" "1.87.1" + "@aws-cdk/region-info" "1.87.1" + "@balena/dockerignore" "^1.0.2" + constructs "^3.2.0" + fs-extra "^9.1.0" + ignore "^5.1.8" + minimatch "^3.0.4" + +"@aws-cdk/custom-resources@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/custom-resources/-/custom-resources-1.87.1.tgz#8520cf75d766b7dc2c249b3dd173414833d315b2" + integrity sha512-D0Esq65dCzYrlaCt459ZkPalK9xta1C5HZ6OJt72x2GOMo4xfPrSTeAKp+XT5hX8T4VV40+uIL0maHRBEN+6Nw== + dependencies: + "@aws-cdk/aws-cloudformation" "1.87.1" + "@aws-cdk/aws-ec2" "1.87.1" + "@aws-cdk/aws-iam" "1.87.1" + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/aws-logs" "1.87.1" + "@aws-cdk/aws-sns" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/cx-api@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/cx-api/-/cx-api-1.87.1.tgz#27be6f760332849149941af072f43809bd941b95" + integrity sha512-yZeo1rw/DUaw0EKwTq4VptWSNHZHgN+2fTFcbcSWdkNYC+yfXQ1FMAMkJKXDR1ZZsrB8M4f45HsM7LEoTPfZjQ== + dependencies: + "@aws-cdk/cloud-assembly-schema" "1.87.1" + semver "^7.3.2" + +"@aws-cdk/lambda-layer-awscli@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/lambda-layer-awscli/-/lambda-layer-awscli-1.87.1.tgz#a05c79874af919162e74fd43381f28c48fa3cda7" + integrity sha512-johSMuUYlFIxRumpY0KFTcu3xb4r5R+0oIqPQxD9lahnqPlrkji50SY9Y7A7e3/4Lr0qyRfKZB3Zyw8cQH6WJA== + dependencies: + "@aws-cdk/aws-lambda" "1.87.1" + "@aws-cdk/core" "1.87.1" + constructs "^3.2.0" + +"@aws-cdk/region-info@1.87.1": + version "1.87.1" + resolved "https://registry.yarnpkg.com/@aws-cdk/region-info/-/region-info-1.87.1.tgz#7a290e809c8cefc0d2573de70518603725ca6dd7" + integrity sha512-ZqDWZTtGNOx8SWtWsXM/CIMEzkkz2e3sC/UjIm8G1lS39rk/16IuNZR+YKilSdovzSQKiVBWxHXCuNFD3jikdA== + +"@aws-crypto/crc32@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-1.0.0.tgz#6a0164fd92bb365860ba6afb5dfef449701eb8ca" + integrity sha512-wr4EyCv3ZfLH3Sg7FErV6e/cLhpk9rUP/l5322y8PRgpQsItdieaLbtE4aDOR+dxl8U7BG9FIwWXH4TleTDZ9A== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/ie11-detection@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-1.0.0.tgz#d3a6af29ba7f15458f79c41d1cd8cac3925e726a" + integrity sha512-kCKVhCF1oDxFYgQrxXmIrS5oaWulkvRcPz+QBDMsUr2crbF4VGgGT6+uQhSwJFdUAQ2A//Vq+uT83eJrkzFgXA== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-1.1.0.tgz#20092cc6c08d8f04db0ed57b6f05cff150384f77" + integrity sha512-VIpuLRDonMAHgomrsm/zKbeXTnxpr4aHDQmS4pF+NcpvBp64l675yjGA9hyUYs/QJwBjUl8WqMjh9tIRgi85Sg== + dependencies: + "@aws-crypto/ie11-detection" "^1.0.0" + "@aws-crypto/sha256-js" "^1.1.0" + "@aws-crypto/supports-web-crypto" "^1.0.0" + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@^1.0.0", "@aws-crypto/sha256-js@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-1.1.0.tgz#a58386ad18186e392e0f1d98d18831261d27b071" + integrity sha512-VIhuqbPgXDVr8sZe2yhgQcDRRmzf4CI8fmC1A3bHiRfE6wlz1d8KpeemqbuoEHotz/Dch9yOxlshyQDNjNFeHA== + dependencies: + "@aws-sdk/types" "^3.1.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-1.0.0.tgz#c40901bc17ac1e875e248df16a2b47ad8bfd9a93" + integrity sha512-IHLfv+WmVH89EW4n6a5eE8/hUlz6qkWGMn/v4r5ZgzcXdTC5nolii2z3k46y01hWRiC2PPhOdeSLzMUCUMco7g== + dependencies: + tslib "^1.11.1" + +"@aws-sdk/abort-controller@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-1.0.0-rc.3.tgz#c4cde5f1a1c0d3b6e6c5ddc04a0e423cb8bcc1f1" + integrity sha512-+os/c2PDtDzaeAMqH3f03EDwMAesxy3O5lFcT2vr43iiQkXRnYwaWFD4QPwDQGzKDjksPKSa6iag4OjzGf0ezA== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/chunked-blob-reader-native@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-1.0.0-rc.3.tgz#5a863d61f84ca0ff32e440f4c214e1929af05978" + integrity sha512-ouuN4cBmwfVPVVQeBhKm18BHkBK/ZVn0VDE4WXVMqu3WjNBxulKYCvJ7mkxi1oWWzp+RGa1TwIQuancB1IHrdA== + dependencies: + "@aws-sdk/util-base64-browser" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/chunked-blob-reader@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-1.0.0-rc.3.tgz#f704a8c6133931bbde3ee015936dc136763dd992" + integrity sha512-d4B6mOYxZqo+y2op5BwEsG0wxewyNhVmyvfdQfhaJowNjhZpQ6vhYkh3umOarLwyC72dNScKBQYLnOsf5chtDg== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/client-s3@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-1.0.0-rc.3.tgz#88ba3fe10308ffc0fe9bdd334071130ccd43eae7" + integrity sha512-/IYV2zoGo8SIId0VsJ/lSI6hkP0nSNvibjQtTIOu/E0edoeHtotXtuJ3SLpsuwGGm8mZtMuq1R6W1q0G/o/DrA== + dependencies: + "@aws-crypto/sha256-browser" "^1.0.0" + "@aws-crypto/sha256-js" "^1.0.0" + "@aws-sdk/config-resolver" "1.0.0-rc.3" + "@aws-sdk/credential-provider-node" "1.0.0-rc.3" + "@aws-sdk/eventstream-serde-browser" "1.0.0-rc.3" + "@aws-sdk/eventstream-serde-config-resolver" "1.0.0-rc.3" + "@aws-sdk/eventstream-serde-node" "1.0.0-rc.3" + "@aws-sdk/fetch-http-handler" "1.0.0-rc.3" + "@aws-sdk/hash-blob-browser" "1.0.0-rc.3" + "@aws-sdk/hash-node" "1.0.0-rc.3" + "@aws-sdk/hash-stream-node" "1.0.0-rc.3" + "@aws-sdk/invalid-dependency" "1.0.0-rc.3" + "@aws-sdk/md5-js" "1.0.0-rc.3" + "@aws-sdk/middleware-apply-body-checksum" "1.0.0-rc.3" + "@aws-sdk/middleware-bucket-endpoint" "1.0.0-rc.3" + "@aws-sdk/middleware-content-length" "1.0.0-rc.3" + "@aws-sdk/middleware-expect-continue" "1.0.0-rc.3" + "@aws-sdk/middleware-host-header" "1.0.0-rc.3" + "@aws-sdk/middleware-location-constraint" "1.0.0-rc.3" + "@aws-sdk/middleware-logger" "1.0.0-rc.3" + "@aws-sdk/middleware-retry" "1.0.0-rc.3" + "@aws-sdk/middleware-sdk-s3" "1.0.0-rc.3" + "@aws-sdk/middleware-serde" "1.0.0-rc.3" + "@aws-sdk/middleware-signing" "1.0.0-rc.3" + "@aws-sdk/middleware-ssec" "1.0.0-rc.3" + "@aws-sdk/middleware-stack" "1.0.0-rc.3" + "@aws-sdk/middleware-user-agent" "1.0.0-rc.3" + "@aws-sdk/node-config-provider" "1.0.0-rc.3" + "@aws-sdk/node-http-handler" "1.0.0-rc.3" + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/smithy-client" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/url-parser-browser" "1.0.0-rc.3" + "@aws-sdk/url-parser-node" "1.0.0-rc.3" + "@aws-sdk/util-base64-browser" "1.0.0-rc.3" + "@aws-sdk/util-base64-node" "1.0.0-rc.3" + "@aws-sdk/util-body-length-browser" "1.0.0-rc.3" + "@aws-sdk/util-body-length-node" "1.0.0-rc.3" + "@aws-sdk/util-user-agent-browser" "1.0.0-rc.3" + "@aws-sdk/util-user-agent-node" "1.0.0-rc.3" + "@aws-sdk/util-utf8-browser" "1.0.0-rc.3" + "@aws-sdk/util-utf8-node" "1.0.0-rc.3" + "@aws-sdk/xml-builder" "1.0.0-rc.3" + fast-xml-parser "^3.16.0" + tslib "^2.0.0" + +"@aws-sdk/config-resolver@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-1.0.0-rc.3.tgz#0eb877cdabffb75ba3ed89f14e86301faeec12d2" + integrity sha512-twz204J+R5SFUOWe7VPYoF9yZA3HsMujnZKkm7QTunKUYRrrZcG1x6KeArIpk1mKFlrtm1tcab5BqUDUKgm23A== + dependencies: + "@aws-sdk/signature-v4" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/credential-provider-env@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-1.0.0-rc.3.tgz#9e7f21d1aa1d54e6a7f3f87626d2a46896ca7294" + integrity sha512-QG9YUDy1qjghL6MsXIE4wxXuTDeBsNWcXYIMpuvn5bJSVDmcSmXwVFMyCiYvDlN57zbomWaNvYiq9TS50aw0Ng== + dependencies: + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/credential-provider-imds@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-1.0.0-rc.3.tgz#d5709e1ef009b7c87387e0c377c8840a7a27b9db" + integrity sha512-vMRAlXdU4ZUeLGgtXh+MCzyZrdoXA8tJldR5n0glbODAym1Ap6ZQ9Y/apQvaHiMxyTd/PCcPg0cwSmhlnwdhTg== + dependencies: + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/credential-provider-ini@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-1.0.0-rc.3.tgz#23301a8cf39b004b4ba866d58469f766b819218e" + integrity sha512-3/dvnmtnjGSoBn9MSTtO6/Vpd0RxwA1oOeHlFhswr4ZDMI3Nn8almvUhjtC+wkKKSG+ushkEJaDDPy6P+7xqRA== + dependencies: + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/shared-ini-file-loader" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/credential-provider-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-1.0.0-rc.3.tgz#9f6ebecec5f1622ed1b9172c9ae43b147dbc75a9" + integrity sha512-UbtN7dMjyUgYyYKSQLAMmx1aGT9HD00bf0suvn9H4lo5piWuJ/30CoBqIl/l2l+6z0AdK2DcGoF5yuLyJSX0ww== + dependencies: + "@aws-sdk/credential-provider-env" "1.0.0-rc.3" + "@aws-sdk/credential-provider-imds" "1.0.0-rc.3" + "@aws-sdk/credential-provider-ini" "1.0.0-rc.3" + "@aws-sdk/credential-provider-process" "1.0.0-rc.3" + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/credential-provider-process@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-1.0.0-rc.3.tgz#8752ee9efb696d24c84cbd1da64ed76b93269820" + integrity sha512-gz98CXgAwtsW1CkK9F8SOW1EEHFFHsl3QCBs1i4CErYr08i/2sa1LHOjxyIJ9RMRM0WNPBCLH4btvpajOGtXBA== + dependencies: + "@aws-sdk/credential-provider-ini" "1.0.0-rc.3" + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/shared-ini-file-loader" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/eventstream-marshaller@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-1.0.0-rc.3.tgz#ce4a190365ae949f6ad0639ab2285ce21d28046e" + integrity sha512-LBWqTd+VRVBdmBYm/K3ueBHLNOCUlj0uLQOExfvKFTugQ1t3i5JoZKLYNbTJyid8sMmbyq1y/nfM+kAHXguwAQ== + dependencies: + "@aws-crypto/crc32" "^1.0.0" + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-hex-encoding" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/eventstream-serde-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-1.0.0-rc.3.tgz#ea9229e17317c457dd11206565a04dc1bbccb579" + integrity sha512-dMWtrnaOBLxEFvEtX7r66Pxh+XipRdDYHHNTSsg3Vaj+cDcCUkur2tplhKaBQY9bElfGB2Rb2R7XsfIxt9PZ0w== + dependencies: + "@aws-sdk/eventstream-marshaller" "1.0.0-rc.3" + "@aws-sdk/eventstream-serde-universal" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/eventstream-serde-config-resolver@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-1.0.0-rc.3.tgz#198f81974c4e5396d090c3d48826c6f5e2486819" + integrity sha512-hnp8DwEK64p2mwMDyBIgGq7yOaxDe3H1O7xoNmKb/owqQAcV8BxhhbrJYrsXNSeE/lO2zckPcL1imzuKHudTfA== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/eventstream-serde-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-1.0.0-rc.3.tgz#cb0d74f24b43cd14963a0ee8252cc47260ddf483" + integrity sha512-QTIygM8qoVfDv6paFTdyvuAdgUSm/VDFa36OZd+IXSgzoYYrI/psutpYCyt/27oiPH+rFPrOofs9A1mXIWWMhg== + dependencies: + "@aws-sdk/eventstream-marshaller" "1.0.0-rc.3" + "@aws-sdk/eventstream-serde-universal" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/eventstream-serde-universal@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-1.0.0-rc.3.tgz#b05d04171ae00b6f33ea1412979f78c1840ea410" + integrity sha512-YAQMuEI+J0LEf8tOISYSihkEiEH2YpQpvXkLlWyybmWEa1XjmGaZS5V1HP/xf5cA/HPtIsApCz2VYTY50A/Lxw== + dependencies: + "@aws-sdk/eventstream-marshaller" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/fetch-http-handler@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-1.0.0-rc.3.tgz#4ab211faf75c4b1d14dc36b85311519f4723fe97" + integrity sha512-1xd4DuW8Su7qHKg9wipVGhscvLsVRhZi9pRLxh13lIKEIt+ryxXzrex1YoxDUnDH3ZI7YhdeLhZIonlgaNT+Gw== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/querystring-builder" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-base64-browser" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/hash-blob-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-1.0.0-rc.3.tgz#2d1dcd1750b366817a0692424403edc808dc3cb8" + integrity sha512-2lgiclNMd3hiNBjoSh7UuzSY9ucpVF7Z6AmSmERWqN5Sm69u1q8p0RgyyWnKd0JZRelPlB8gBXk4EzxBPSTSLA== + dependencies: + "@aws-sdk/chunked-blob-reader" "1.0.0-rc.3" + "@aws-sdk/chunked-blob-reader-native" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/hash-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-1.0.0-rc.3.tgz#f46571f597dd8a301362dfef4c5dfd343116f9a4" + integrity sha512-Q3DikdeGA6pih2ftZajlNaHxsNUaKEXneZdxyoaSKyMppEni3eK2Z2ZjzyjDuXflYLkNtj4ylscure+uIKAApg== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-buffer-from" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/hash-stream-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-1.0.0-rc.3.tgz#8b4f668e5d482c509dfe402812b2a2f2a9e36b1b" + integrity sha512-ry78JhVXHIUdH/aokQ/YBxQ+26zC5VOgK2XLq9eDdxBTz2sefjwzk3Qs5eY1GZKfyUlKMwdRpCibo9FlPVPJeg== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/invalid-dependency@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-1.0.0-rc.3.tgz#857a44dcb666ec3be55ccde6f2912eff7dfddcad" + integrity sha512-Fl71S5Igd5Mi81QklxhhEWzwKbm+QP1kUYoc5nVK2sE+iLqdF9jwg7/ONBN8jISjTD8GPIW7NWL2SQNINNryMw== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/is-array-buffer@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-1.0.0-rc.3.tgz#47e47b7e5eb7e0ac9e7fa24f56a78550fbae63bc" + integrity sha512-tHFTBiXAgBZmAKaJIL2e2QPR9kA1tZTUJMqKaybWjhXckvb29EgUOLcdK+W2kMSqKIGqEINbAaV7S11ydBtYIg== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/md5-js@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-1.0.0-rc.3.tgz#c9ecabe2a7fccf017f6cfcb972c1cdb579da8f9c" + integrity sha512-UfHtEs5IWl39yU4X/95605bFMKErWRd+uPgtqEtCWDDGyw4uwUUrkyrhTfJKuUFvTj9ov0Lb03x5QPNDybAelQ== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-utf8-browser" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-apply-body-checksum@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-apply-body-checksum/-/middleware-apply-body-checksum-1.0.0-rc.3.tgz#1ba3053e65a06fa093b72c45bd28f6053d12028c" + integrity sha512-f8CMcb1mxPWHJvLxegpjF1fwoa/vFjIaRIrXgUoPMhFNICRZPGnzim2o2mGyjWcS39VkM6G7vpmosNv2zc4EJg== + dependencies: + "@aws-sdk/is-array-buffer" "1.0.0-rc.3" + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-bucket-endpoint@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-1.0.0-rc.3.tgz#3dc26338bb8b631adb93c2ef2bce4bdddf29e01d" + integrity sha512-bC7Fx78spMF+5sQhjncOHdjEamNGIIZx6KBWN5Z2JkTTfrEoN24VtM6wWXkNRn3EtN7usWBaGT1bCx3/Vk+R0A== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-arn-parser" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-content-length@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-1.0.0-rc.3.tgz#0410e78a508ec4ef8cb8987433ed621a7cfa7946" + integrity sha512-eQfeMwneYxxF6NMF5AokilQHm3HMUbtBVmybdrrM+vs027DRQBDqcZ2GXwVI93kcS4GaibNnzX804rG2xA2UwA== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-expect-continue@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-1.0.0-rc.3.tgz#54eb6e68b7e791febbee44fe107886ead02c47d0" + integrity sha512-rDs68vBn0sSWl3z1ecXSw7n+MeiSW//r6NSAWAmBE58BDjHSfwQ+aB3izpSHDGIiGZO4aasnwZAP7NjzYvxiWQ== + dependencies: + "@aws-sdk/middleware-header-default" "1.0.0-rc.3" + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-header-default@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-header-default/-/middleware-header-default-1.0.0-rc.3.tgz#3a6186aa0d0575626f07b92b774aa15b73b54230" + integrity sha512-h0zQFCaBzu7SoRRlKYws76C8q8hY/Ja7G6E69X7fGbrcmNFMjm4aZq0eipKvOIg7cGbrcFnyOnWqLlWaL76nwA== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-host-header@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-1.0.0-rc.3.tgz#d7dca9b683bacc0f985b4f1e86cef938d88ad52d" + integrity sha512-44aOjB9yd2TCDj8c9sr+8+rhQ63kkuIAcMdbt3P/fXKUWwTAW+bcvknaynya3hLa8B75tEQ112xVBb+HoDR//g== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-location-constraint@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-1.0.0-rc.3.tgz#22781315b246f426acde32e894acb3e59cb9d5bf" + integrity sha512-VdW0/g8SVckRQsz55DrPIzyrF+Qgat3qt+qE9c6Gk7u6XaF05BlG7rbjsStd3Eml+FsKG1KOO3RgDCWvgESmNw== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-logger@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-1.0.0-rc.3.tgz#a786bb90d3a5a184f9b8331ee90f05f3210b04b7" + integrity sha512-M1IfI6//hFgMKQXqXdXGNMf/qU4pkwzR9+Wz6TZ6iELtZaXce00ZzTK1szmO1pkWRVeXsCwr4fsbhj7OD4zZ8g== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-retry@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-1.0.0-rc.3.tgz#8b06fd8c49b3a3e7279551309e418533fac73d9b" + integrity sha512-Y8JhZPJM10H1KDobUP7aYM6ghBdVT4QM+04iAQBfYZPCc0ksyN+PKZLi97kxOrbg+a4HL593CG2UVnY4WI2tBQ== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/service-error-classification" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + react-native-get-random-values "^1.4.0" + tslib "^1.8.0" + uuid "^3.0.0" + +"@aws-sdk/middleware-sdk-s3@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-1.0.0-rc.3.tgz#1c9a26476887c464b5e52da116a752dc8975dddd" + integrity sha512-TDICHo5wONd4GUgLEtSjlygKRzXBfxkPQcNEGB2Mnbi+xbDa4FNd6XszkOrNMzxtmqD53ub/iDQewcBr9U9HJQ== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/util-arn-parser" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-serde@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-1.0.0-rc.3.tgz#81307310c51d50ec8425bee9fb08d35a7458dcfc" + integrity sha512-3IK4Hz8YV4+AIGJLjDu3QTKjfHGVIPrY5x4ubFzbGVc6EC9y69y+Yh3425ca3xeAVQFnORQn/707LiNKLlsD8g== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-signing@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-1.0.0-rc.3.tgz#34bad68f17052c298a09905728a35f8906fe55dc" + integrity sha512-RqIQwPaHvyY38rmIR+A9b3EwIaPPAKA4rmaTGAT1jeS7H65tXJeKc7aAXJWvDn9E1Fj56mOHTOd86FgP45MrUg== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/signature-v4" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-ssec@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-1.0.0-rc.3.tgz#45e77e8c1e998fe42bc290c7d4c65c84952e6f3b" + integrity sha512-sqv/TELHxAvpqOi7uhfCwLGVyOb1ihehfnSeqsyh2HPphg529ssmDUCF6jsi5maMc3lM/eHQ8LDPSXU9H58wwQ== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-stack@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-1.0.0-rc.3.tgz#e46193e696f15275e548e0cdbe1ca734e9e1c6b9" + integrity sha512-DV5RPf0rNsZVOtZA+nEDyWhfKUazUjWQppzXGjvCUSLaaPTINPUXf/go5M4S/62mn/9gxCftN5SShMP5yw1sNQ== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/middleware-user-agent@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-1.0.0-rc.3.tgz#de42837456482cd06596c0c5cebb80480d630e33" + integrity sha512-Zrp3kETrrWgJLlnjkSuetOH5cN5URqLd6WQmhZlEm0isvr+2RyDDOA4wP6JjmMhCmrG02/8/b4pMOPH/vUm/LQ== + dependencies: + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/node-config-provider@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-1.0.0-rc.3.tgz#b79fd5e95e4ca543b8d6aa2bf59b9ce2cc89c96a" + integrity sha512-1i0fjunUMYP479hAq7D8RugfMmC3KCUzvZA2xtjFQcE31d7YrlfGstwBq/kvNcIcw+yc3r7SC54KzwgqfSSvzA== + dependencies: + "@aws-sdk/property-provider" "1.0.0-rc.3" + "@aws-sdk/shared-ini-file-loader" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/node-http-handler@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-1.0.0-rc.3.tgz#da316daa5bcf536099e43d57cb136b8c2553a17f" + integrity sha512-hK0NM3PxGVCgKLZoAb8bXFQlOA1JGd2DwfjDdAn4XfIhEH4QfbuFZxjkQhNcDwkKIqzCmlYTbgJvWKRbbFkEXg== + dependencies: + "@aws-sdk/abort-controller" "1.0.0-rc.3" + "@aws-sdk/protocol-http" "1.0.0-rc.3" + "@aws-sdk/querystring-builder" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/property-provider@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-1.0.0-rc.3.tgz#4dce009bcc55d8779f721100462b8d6ac489606c" + integrity sha512-WrYlUVaq63k0fYdnIJziphfdTITaTlW0b1qrRzFsqKPRN1AnQenzFs27ZHaaecmFfGg3q1Y2fci3cpyNUBTruQ== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/protocol-http@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-1.0.0-rc.3.tgz#7759e6f96df292c01daaff42f2b921180df17c5d" + integrity sha512-paOSLmXvce84BRCx+JIYGpsVCtn3GCGvzLywaPCHeES2OekwD86PJQskCDAlshRPOy/LCdxYVdMt7FrEBuyQrg== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/querystring-builder@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-1.0.0-rc.3.tgz#d24135a0523a8d9645d874deeb0ba5a6f6c15428" + integrity sha512-PWTaV+0r/7FlPNjjKJQ/WyT4oRx4tG5efOuzQobb4/Bw2AFqVCzE2DMGx1V8YKqdq3QFckvRuoFDVqftyhF/Jw== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-uri-escape" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/querystring-parser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-1.0.0-rc.3.tgz#9fdd79eb0a06846f25da5f97477e8d8f1255785a" + integrity sha512-TkA/4wM76WzsiMOs0Lxqk33rP+J0YtCjmpGzS+x4oqNbdVYQBpYtbwqN+9nsrOeieCFRWq9QWl6QM4IyJT9gRA== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/service-error-classification@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-1.0.0-rc.3.tgz#711f6769cabc7fbdac9f0d5270968824762fa29f" + integrity sha512-qE/gPzAoQF3DJEPyQk5iQyTZEbVx53a41T+UHEYKYMaGXuAJfoBKnsucDNxgAYXSwcp+3Wp7XA1TUfcygEiZ/Q== + +"@aws-sdk/shared-ini-file-loader@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-1.0.0-rc.3.tgz#05aa96572d78f0c4c5edcc7f42ed14076d1b16ea" + integrity sha512-wynHRRZENIZUS714NX9cu9BDbxAL7DzOJvPYAj2tgC3bJNt0jkbQxNTePpolwWx7QNwFfQgDbK76LPkIo30dJQ== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/signature-v4@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-1.0.0-rc.3.tgz#7ccc61f17d8f083dcbce5e30843c60f8b0388d67" + integrity sha512-ARfmXLW4NMmQF5/3xGiasi6nrlvddZauJOgG9t2STTog8gijn+y+V7wh26A7e4vgv1hyE0RdonylbakUH1R4Nw== + dependencies: + "@aws-sdk/is-array-buffer" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + "@aws-sdk/util-hex-encoding" "1.0.0-rc.3" + "@aws-sdk/util-uri-escape" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/smithy-client@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-1.0.0-rc.3.tgz#b96e97fa6b8bb3de8ecd918d842b2fb972fa0ac6" + integrity sha512-mlzpr5NLkaoPdTVrr3HIxuNbVJtq9IIrgfVXjqCNixOqJDRG46qiXubfaSsf4giwP8CE6zK9cDkvVDKyV0dl8A== + dependencies: + "@aws-sdk/middleware-stack" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/types@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-1.0.0-rc.3.tgz#98466080e07244d8f7406cc61ae7918d02b339a2" + integrity sha512-pKKR2SXG8IHbWcmVgFwLUrHqqqFOEuf5JiQmP7dEBjUXqavzDnqFUY7g9PGuM8928IQqL7IXrRsK7R+VbLgodQ== + +"@aws-sdk/types@^3.1.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.4.0.tgz#614327d882e7de8db0338de7fc1a139908aead59" + integrity sha512-IXXnTujY2NtC/5vCz7+6Ks7uG+0FS+G4jggta6t4Yj/HWZleQe81wvix6NV1PGKiMMHYVu/yYgVGUs/2sq6ztw== + +"@aws-sdk/url-parser-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser-browser/-/url-parser-browser-1.0.0-rc.3.tgz#d9e1da2acdfb7f2486a68e951dd185dd7b0764e8" + integrity sha512-bTCB4K1nxX3juaOSRdjUC+nq1KZX1Ipy5pMQoDiRWYCgMgUAcqeWuxlclF3dc8vuhYUWa2A86D5lT3zrP0Gqag== + dependencies: + "@aws-sdk/querystring-parser" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/url-parser-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser-node/-/url-parser-node-1.0.0-rc.3.tgz#0cdd48fa068a1cf243b46b4eb4c927f38499f63d" + integrity sha512-W2No+drp3jCjkr1edSReGNLyXF+a34qHOcy8cJ6ZtPe5eLzCroZ33+w1gJ01r5UboWwzo8Qyz7QPxD5J0zPVzw== + dependencies: + "@aws-sdk/querystring-parser" "1.0.0-rc.3" + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + url "^0.11.0" + +"@aws-sdk/util-arn-parser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-1.0.0-rc.3.tgz#738e945d2dfd009d78c4c07e3773d41c1c525262" + integrity sha512-mIXiyBYDAQa9EdaKKU4oQsWAvSWVXAumCH89N5VQfrlRCuaqRUdmE83CJx69wcLFbrZCZmCJD2gcPVG5Ywa+NQ== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-base64-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-1.0.0-rc.3.tgz#49cb2a1c9f177327b66eb2a150e643334dd3ce0d" + integrity sha512-peqOSoOCTGlZVX9gC+4SxaSXQqSsjzNfKxKLZwcP/HhHIPU/I+tbnRbH4a2Cx29DsopTngu0GKLuPJEL67bvog== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-base64-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-1.0.0-rc.3.tgz#ef68e130e7b42b673f93af4a68b46c1542702e64" + integrity sha512-gz/JScFQ9MMdI59VdJTbgZrnNdTPXOJKesMwoEMH8nMb6/Wi3+KL2NH/GC92hxhuE/JbA1vdrelvCFOED8E1Jg== + dependencies: + "@aws-sdk/util-buffer-from" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/util-body-length-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-1.0.0-rc.3.tgz#f3052599445e06081002788693ada1fb99ea4a51" + integrity sha512-xvMrCo+5DshN4Fu3zar2RxaqPJ/QRAEOChyWEGUqjE+9/cow+uWsqBX3FdeY84mV6dkdcAJLQvP8aVH+v+w+lw== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-body-length-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-1.0.0-rc.3.tgz#e7068c9feff896a3720f71eab5ca44c76e587764" + integrity sha512-q7n3IP5s9TIMao9sK4an+xxBubHqWXoeqCQ5haeDmqQTBiZQYcyQQq61YJRghj2/53SH5MMS1ACncw3kvnO92g== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-buffer-from@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-1.0.0-rc.3.tgz#6a18955cb422b5649c9675d64bc2defa6e1175ac" + integrity sha512-43FzXSA3356C/QRCKZSmGTVwH4BgObNJDvF4z5dwwrfqU+tXjnUdnFo5hLsHq+fwjtWuXLkAyi+vz07x3MphvA== + dependencies: + "@aws-sdk/is-array-buffer" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/util-hex-encoding@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-1.0.0-rc.3.tgz#4229f2495f3a5ef32c8c7ada7ab14bd6f983d269" + integrity sha512-GXHBBGdAH2HPn18RFMsvXAvBtO8pG0I2PlGHfKhn+ym+UT1lHHYpCd3/PawUVUYnFZrqIj+j48IjFFJ3XMPXyQ== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.4.0.tgz#13ac23f00a03cef65bd02eadea45de262e85c04b" + integrity sha512-S2ngjd5ZaHEJYAJpbLpbszyJqweJ1NXRPxNIKGIZ+NWkKpKSIz35dRvh3cLMepFhBIxGwelhWnIPWuex3lsG6A== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-uri-escape@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-1.0.0-rc.3.tgz#53b7ba5c353cef31f0d1f10c06d8dfc2118a3371" + integrity sha512-PW1Uh5nJ32VKysV6DxyO40gONJR8s0QFeS55apyPUeCYCrdEjwsNvftDWbRJIcVpvkRSrbDezWc5CJC0S8WXjQ== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-user-agent-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-1.0.0-rc.3.tgz#2b8d7a79c7e79099fe9a41976d4eeb39f5d83c21" + integrity sha512-ev7bjF6QejDTi/UTvBLfiUETrXtuBf5sJl8ocWRUcrCnje5DW5lat2LaC7KWeRppQ4NA//ldavF5ngAxsn8TzA== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/util-user-agent-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-1.0.0-rc.3.tgz#f9a7337b80e4118a12c4cc4f83512e9b5e48cb4e" + integrity sha512-5ELevKFFsHcyPSOrQ3mgdaNZ+Fr1I4J+/8aKoOiBO1Pnp15/xlVS4GkRiE0uUmAvBbUh1sByMvTo7ITeOBvlxA== + dependencies: + "@aws-sdk/types" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/util-utf8-browser@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-1.0.0-rc.3.tgz#ca2f1ee3c3774203675455e6cf6a52256d40849d" + integrity sha512-ypEJ2zsfm844dPSnES5lvS80Jb6hQ7D9iu0TUKQfIVu0LernJaAiSM05UEbktN+bEAoQBi9S64l8JjHVKFWu1Q== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.4.0.tgz#e34e66b186f9df16de4d0fa6ad98c7e31de47b32" + integrity sha512-oQMCPYdn8+NA96c7PT6ZzvQ/TDpi2Q7wZ5cb8x14WFeGd7AnSR7o4KbSgdi2DE2cYBJbVz+fsHvscTaf6caOyw== + dependencies: + tslib "^1.8.0" + +"@aws-sdk/util-utf8-node@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-1.0.0-rc.3.tgz#d6841823b949f4209fdcc405c5ad5d4b483e6e60" + integrity sha512-80BWIgYzdw/cKxUrXf+7IKp07saLfCl7p4Q+zitcTrng9bSbPhjntXBS+dOFrBU2fBUynfI2K+9k5taJRKgOTQ== + dependencies: + "@aws-sdk/util-buffer-from" "1.0.0-rc.3" + tslib "^1.8.0" + +"@aws-sdk/xml-builder@1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-1.0.0-rc.3.tgz#2b0b6b4c182b96245889f4c8e2004eef847401f4" + integrity sha512-WdW/bZLVMNrEdG++m4B4QmZ6KnYsF3V68CDkZKg8IgDOMON4YOqUPBYDHNR8Wtdd1JQFLMDzrcqnXQqLb5dWgA== + dependencies: + tslib "^1.8.0" + +"@balena/dockerignore@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" + integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== + +"@hapi/accept@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10" + integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.1.tgz#89e6f0e01637c2a4228da0d113e8157c93677b04" + integrity sha512-VNR8eDbBrOxBgbkddRYIe7+8DZ+vSbV6qlmaN2x7eWjsUjy2VmQgChkOKcVZIeupEZYj+I0dqNg430OhwzagjA== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" + integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@sls-next/lambda-at-edge@link:../../libs/lambda-at-edge": + version "0.0.0" + uid "" + +"@sls-next/s3-static-assets@link:../../libs/s3-static-assets": + version "0.0.0" + uid "" + +"@types/fs-extra@^9.0.1": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.6.tgz#488e56b77299899a608b8269719c1d133027a6ab" + integrity sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "14.14.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" + integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== + +"@vercel/nft@^0.9.3": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@vercel/nft/-/nft-0.9.5.tgz#bf795944a4764ca49ca1a642f17ab32f9ac701d2" + integrity sha512-EhSFOYwqvH3KZyK1pKyFj/DRoCZ2KFu8sRaVaJ+KGlU4kroAWm8okeA2EtIY11+/fMX3YQkNno7kf5H4FZrDvg== + dependencies: + acorn "^7.1.1" + acorn-class-fields "^0.3.2" + acorn-export-ns-from "^0.1.0" + acorn-import-meta "^1.1.0" + acorn-numeric-separator "^0.3.0" + acorn-static-class-features "^0.2.1" + bindings "^1.4.0" + estree-walker "^0.6.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + micromatch "^4.0.2" + mkdirp "^0.5.1" + node-gyp-build "^4.2.2" + node-pre-gyp "^0.13.0" + resolve-from "^5.0.0" + rollup-pluginutils "^2.8.2" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-class-fields@^0.3.2: + version "0.3.7" + resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.3.7.tgz#a35122f3cc6ad2bb33b1857e79215677fcfdd720" + integrity sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ== + dependencies: + acorn-private-class-elements "^0.2.7" + +acorn-export-ns-from@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/acorn-export-ns-from/-/acorn-export-ns-from-0.1.0.tgz#192687869bba3bcb2ef1a1ba196486ea7e100e5c" + integrity sha512-QDQJBe2DfxNBIMxs+19XY2i/XXilJn+kPgX30HWNYK4IXoNj3ACNSWPU7szL0SzqjFyOG4zoZxG9P7JfNw5g7A== + +acorn-import-meta@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/acorn-import-meta/-/acorn-import-meta-1.1.0.tgz#c384423462ee7d4721d4de83231021a36cb09def" + integrity sha512-pshgiVR5mhpjFVdizKTN+kAGRqjJFUOEB3TvpQ6kiAutb1lvHrIVVcGoe5xzMpJkVNifCeymMG7/tsDkWn8CdQ== + +acorn-numeric-separator@^0.3.0: + version "0.3.6" + resolved "https://registry.yarnpkg.com/acorn-numeric-separator/-/acorn-numeric-separator-0.3.6.tgz#af7f0abaf8e74bd9ca1117602954d0a3b75804f3" + integrity sha512-jUr5esgChu4k7VzesH/Nww3EysuyGJJcTEEiXqILUFKpO96PNyEXmK21M6nE0TSqGA1PeEg1MzgqJaoFsn9JMw== + +acorn-private-class-elements@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz#b14902c705bcff267adede1c9f61c1a317ef95d2" + integrity sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA== + +acorn-static-class-features@^0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/acorn-static-class-features/-/acorn-static-class-features-0.2.4.tgz#a0f5261dd483f25196716854f2d7652a1deb39ee" + integrity sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA== + dependencies: + acorn-private-class-elements "^0.2.7" + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +ajv@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" + integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +aws-sdk@2.728.0: + version "2.728.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.728.0.tgz#381805dcac7835b5686694e9468d104595bfce42" + integrity sha512-pUVSxb+04urr6BMHg32Op+kT1IWGmwbelrQKMdLnvgcgysmBu1P4XbGBg8/SmAXWfuqqWjz8YnmFNY46VJE43A== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.15.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.3.2" + xml2js "0.4.19" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bindings@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constructs@^3.2.0: + version "3.2.117" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-3.2.117.tgz#d6f29d822f99530f4cb5c79089dc2e1bd0d0e9d3" + integrity sha512-zYDlALAHWdopUzMGr3aZPlPR8f+OEYr1+QZCkLqi/eyUjbOmlPQ6xwrlDoOaJNgpMf727T9Yo+hokCjIRsZweQ== + +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +execa@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-xml-parser@^3.16.0: + version "3.17.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-3.17.6.tgz#4f5df8cf927c3e59a10362abcfb7335c34bc5c5f" + integrity sha512-40WHI/5d2MOzf1sD2bSaTXlPn1lueJLAX6j1xH5dSAr6tNeut8B9ktEL6sjAK9yVON4uNj9//axOdBJUuruCzw== + +fastq@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" + integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== + dependencies: + reusify "^1.0.4" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +is-animated@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-animated/-/is-animated-2.0.1.tgz#e523efd5a0ef0e6ac78a7307a2c8f311eb5298bc" + integrity sha512-f61go8/mYdl6g7JOLbi6YtiJ1AKM9TFdNv2bVP7JlAHm5MPjnvveOkKPlm51beF9ulb5hsGeoqdSXrjJ7RNKHg== + +is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jmespath@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" + integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +md5@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + +mime-types@^2.1.27: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +needle@^2.2.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp-build@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +node-pre-gyp@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz#df9ab7b68dd6498137717838e4f92a33fc9daa42" + integrity sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-to-regexp@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" + integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== + +picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-native-get-random-values@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.5.1.tgz#f335a37c09a4892deaf40187e73a888e14e82d60" + integrity sha512-L76sTcz3jdFmc7Gn41SHOxCioYY3m4rtuWEUI6X8IeWVmkflHXrSyAObOW4eNTM5qytH+45pgMCVKJzfB/Ik4A== + dependencies: + fast-base64-decode "^1.0.0" + +readable-stream@^2.0.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +regex-parser@^2.2.10: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rollup-pluginutils@^2.8.2: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= + +sax@>=0.6.0, sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver@^5.3.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +send@^0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +table@^6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" + integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + dependencies: + ajv "^7.0.2" + lodash "^4.17.20" + slice-ansi "^4.0.0" + string-width "^4.2.0" + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tslib@^1.11.1, tslib@^1.8.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +typescript@^3.9.6: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==