From 90c72a4ce3c476b06fc026f12cafe1bfc267cc65 Mon Sep 17 00:00:00 2001 From: danielconde Date: Tue, 28 Apr 2020 22:44:06 +0100 Subject: [PATCH 01/24] initial commit --- packages/s3-static-assets/README.md | 0 .../s3-static-assets/__mocks__/aws-sdk.ts | 7 + packages/s3-static-assets/index.ts | 66 ++++++++ packages/s3-static-assets/package-lock.json | 149 ++++++++++++++++++ packages/s3-static-assets/package.json | 38 +++++ .../tests/upload-assets.test.ts | 41 +++++ packages/s3-static-assets/tsconfig.json | 15 ++ 7 files changed, 316 insertions(+) create mode 100644 packages/s3-static-assets/README.md create mode 100644 packages/s3-static-assets/__mocks__/aws-sdk.ts create mode 100644 packages/s3-static-assets/index.ts create mode 100644 packages/s3-static-assets/package-lock.json create mode 100644 packages/s3-static-assets/package.json create mode 100644 packages/s3-static-assets/tests/upload-assets.test.ts create mode 100644 packages/s3-static-assets/tsconfig.json diff --git a/packages/s3-static-assets/README.md b/packages/s3-static-assets/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/__mocks__/aws-sdk.ts b/packages/s3-static-assets/__mocks__/aws-sdk.ts new file mode 100644 index 0000000000..7651751693 --- /dev/null +++ b/packages/s3-static-assets/__mocks__/aws-sdk.ts @@ -0,0 +1,7 @@ +export const mockUpload = jest.fn(); + +export default { + S3: jest.fn(() => ({ + upload: mockUpload + })) +}; diff --git a/packages/s3-static-assets/index.ts b/packages/s3-static-assets/index.ts new file mode 100644 index 0000000000..48fd5fa7fc --- /dev/null +++ b/packages/s3-static-assets/index.ts @@ -0,0 +1,66 @@ +import path from "path"; +import fse from "fs-extra"; +import mime from "mime-types"; +import klaw, { Item } from "klaw"; +import AWS from "aws-sdk"; + +type UploadStaticAssetsOptions = { + bucketName: string; + nextAppDir: string; +}; + +const readDirectoryFiles = (directory: string): Promise> => { + const items: Item[] = []; + return new Promise((resolve, reject) => { + klaw(directory.trim()) + .on("data", item => items.push(item)) + .on("end", () => { + resolve(items); + }) + .on("error", reject); + }); +}; + +const uploadStaticAssets = async ( + options: UploadStaticAssetsOptions +): Promise => { + const { bucketName, nextAppDir } = options; + + const s3 = new AWS.S3(); + + const dotNextDirectory = path.join(nextAppDir, ".next"); + + const BUILD_ID = fse + .readFileSync(path.join(dotNextDirectory, "BUILD_ID")) + .toString("utf8"); + + const buildStaticFiles = await readDirectoryFiles( + path.join(dotNextDirectory, "static", BUILD_ID) + ); + + const uploadTasks = buildStaticFiles + .filter(item => !item.stats.isDirectory()) + .map(fileItem => { + return fse.readFile(fileItem.path).then(fileBodyStream => + s3 + .upload({ + Bucket: bucketName, + Key: fileItem.path, + Body: fileBodyStream, + ContentType: + mime.lookup(path.basename(fileItem.path)) || + "application/octet-stream", + CacheControl: "public, max-age=31536000, immutable" + }) + .promise() + ); + }); + + await Promise.all(uploadTasks); + // read public/ folder and upload files + // read static/ folder and upload files + // get HTML pages from pages manifest + // get JSON data files from prerender manifest +}; + +export default uploadStaticAssets; diff --git a/packages/s3-static-assets/package-lock.json b/packages/s3-static-assets/package-lock.json new file mode 100644 index 0000000000..fc3191e9d8 --- /dev/null +++ b/packages/s3-static-assets/package-lock.json @@ -0,0 +1,149 @@ +{ + "name": "@sls-next/s3-static-assets", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/klaw": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.1.tgz", + "integrity": "sha512-acnF3n9mYOr1aFJKFyvfNX0am9EtPUsYPq22QUCGdJE+MVt6UyAN1jwo+PmOPqXD4K7ZS9MtxDEp/un0lxFccA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", + "dev": true + }, + "aws-sdk": { + "version": "2.664.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.664.0.tgz", + "integrity": "sha512-Lkez6O9Y7WuN2pjd/5eCtZejZTgB7zAPBFXjmu6yJQwb6V+iR9UclFjYkcMgTnrhw+eNOQdV60X5EdKl64A45Q==", + "requires": { + "buffer": "4.9.1", + "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" + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } +} diff --git a/packages/s3-static-assets/package.json b/packages/s3-static-assets/package.json new file mode 100644 index 0000000000..d652a20711 --- /dev/null +++ b/packages/s3-static-assets/package.json @@ -0,0 +1,38 @@ +{ + "name": "@sls-next/s3-static-assets", + "version": "1.0.0", + "description": "Handles upload to S3 of next.js static assets", + "main": "dist/index.js", + "directories": { + "test": "tests" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/danielcondemarin/serverless-next.js.git", + "directory": "packages/s3-static-assets" + }, + "keywords": [ + "AWS", + "S3", + "Next.js", + "Serverless" + ], + "author": "Daniel Conde Marin ", + "license": "ISC", + "bugs": { + "url": "https://github.com/danielcondemarin/serverless-next.js/issues" + }, + "homepage": "https://github.com/danielcondemarin/serverless-next.js#readme", + "dependencies": { + "aws-sdk": "^2.664.0", + "klaw": "^3.0.0", + "mime-types": "^2.1.27" + }, + "devDependencies": { + "@types/klaw": "^3.0.1", + "@types/mime-types": "^2.1.0" + } +} diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts new file mode 100644 index 0000000000..3be3b40ce9 --- /dev/null +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -0,0 +1,41 @@ +import stream from "stream"; +import fse from "fs-extra"; +import path from "path"; +import uploadStaticAssets from "../index"; +import { mockUpload } from "aws-sdk"; + +declare module "aws-sdk" { + const mockUpload: jest.Mock; +} + +describe("Upload assets tests", () => { + it("uploads any contents inside build directory specified in BUILD_ID", async () => { + await uploadStaticAssets({ + bucketName: "test-bucket-name", + nextAppDir: path.join(__dirname, "./fixtures/basic-next-app") + }); + + const mockedBodyStream = new stream.Readable(); + jest + .spyOn(fse, "readFile") + .mockResolvedValue(Promise.resolve(mockedBodyStream)); + + const expectedCacheControl = "public, max-age=31536000, immutable"; + + expect(mockUpload).toBeCalledWith({ + Bucket: "test-bucket-name", + Key: "_next/static/a_test_build_id/testFileOne.js", + Body: mockedBodyStream, + ContentType: "application/javascript", + CacheControl: expectedCacheControl + }); + + expect(mockUpload).toBeCalledWith({ + Bucket: "test-bucket-name", + Key: "_next/static/a_test_build_id/subdir/testFileTwo.js", + Body: mockedBodyStream, + ContentType: "application/javascript", + CacheControl: expectedCacheControl + }); + }); +}); diff --git a/packages/s3-static-assets/tsconfig.json b/packages/s3-static-assets/tsconfig.json new file mode 100644 index 0000000000..447ac6bf6a --- /dev/null +++ b/packages/s3-static-assets/tsconfig.json @@ -0,0 +1,15 @@ + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "declaration": true, + "target": "ES2015", + "module": "CommonJS", + "noImplicitAny": true, + "outDir": "dist", + "sourceMap": true, + "strict": true, + "allowJs": true + }, + "exclude": ["node_modules"], + "include": ["**/*.ts"] +} From 2924afda51f9b578aa5eedee253b36f6ab964201 Mon Sep 17 00:00:00 2001 From: danielconde Date: Wed, 29 Apr 2020 21:22:33 +0100 Subject: [PATCH 02/24] implementing upload of HTML pages --- package-lock.json | 747 +++++++++++++++++- package.json | 5 +- .../s3-static-assets/__mocks__/aws-sdk.ts | 15 +- packages/s3-static-assets/src/constants.ts | 2 + packages/s3-static-assets/{ => src}/index.ts | 37 +- .../tests/upload-assets.test.ts | 45 +- 6 files changed, 802 insertions(+), 49 deletions(-) create mode 100644 packages/s3-static-assets/src/constants.ts rename packages/s3-static-assets/{ => src}/index.ts (66%) diff --git a/package-lock.json b/package-lock.json index 7ce1302875..3bc5451cbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,6 +66,521 @@ "cross-fetch": "3.0.4" } }, + "@aws-sdk/abort-controller": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-0.1.0-preview.7.tgz", + "integrity": "sha512-UpAa0PQ4u1UdDYPU9ajO/vzfmSn3rTMjXQjlsd0Ue4oK/A2lffNN28+egMVuS+Ivs96pv1HAfA4t4tPw+U6wjA==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/apply-body-checksum-middleware": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/apply-body-checksum-middleware/-/apply-body-checksum-middleware-0.1.0-preview.8.tgz", + "integrity": "sha512-UoK128Kum26NYuOfnG1vVjfFfYBy7m8bIkBYlORwrGYLHawUwaxan8MTCrk4P/XSlYm0NsyAicAVDvAeGWSZXA==", + "requires": { + "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/bucket-endpoint-middleware": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/bucket-endpoint-middleware/-/bucket-endpoint-middleware-0.1.0-preview.7.tgz", + "integrity": "sha512-XUrR/fKADNTXgW5wfp0U2K2WD+4NiY/njne7rR0YTNZHE0eWD0q0YvRx4LXj6HFraAUqZ8liPG2k/BjzdT8M0Q==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/client-s3-node": { + "version": "0.1.0-preview.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-node/-/client-s3-node-0.1.0-preview.2.tgz", + "integrity": "sha512-sQj8KnijskzIijl/ETJpoygcN4o0AKBtZtXp6eiJjhLZf1RAX33Bd1QzSgScfElY/XVAMgntzWWvBm8VhUu+cQ==", + "requires": { + "@aws-sdk/apply-body-checksum-middleware": "^0.1.0-preview.4", + "@aws-sdk/bucket-endpoint-middleware": "^0.1.0-preview.4", + "@aws-sdk/config-resolver": "^0.1.0-preview.4", + "@aws-sdk/core-handler": "^0.1.0-preview.4", + "@aws-sdk/credential-provider-node": "^0.1.0-preview.5", + "@aws-sdk/hash-node": "^0.1.0-preview.4", + "@aws-sdk/hash-stream-node": "^0.1.0-preview.5", + "@aws-sdk/location-constraint-middleware": "^0.1.0-preview.4", + "@aws-sdk/middleware-content-length": "^0.1.0-preview.4", + "@aws-sdk/middleware-expect-continue": "^0.1.0-preview.4", + "@aws-sdk/middleware-header-default": "^0.1.0-preview.4", + "@aws-sdk/middleware-serializer": "^0.1.0-preview.4", + "@aws-sdk/middleware-stack": "^0.1.0-preview.5", + "@aws-sdk/node-http-handler": "^0.1.0-preview.5", + "@aws-sdk/protocol-rest": "^0.1.0-preview.6", + "@aws-sdk/query-error-unmarshaller": "^0.1.0-preview.5", + "@aws-sdk/region-provider": "^0.1.0-preview.4", + "@aws-sdk/retry-middleware": "^0.1.0-preview.4", + "@aws-sdk/s3-error-unmarshaller": "^0.1.0-preview.2", + "@aws-sdk/signature-v4": "^0.1.0-preview.5", + "@aws-sdk/signing-middleware": "^0.1.0-preview.5", + "@aws-sdk/ssec-middleware": "^0.1.0-preview.4", + "@aws-sdk/stream-collector-node": "^0.1.0-preview.4", + "@aws-sdk/types": "^0.1.0-preview.4", + "@aws-sdk/url-parser-node": "^0.1.0-preview.4", + "@aws-sdk/util-base64-node": "^0.1.0-preview.2", + "@aws-sdk/util-body-length-node": "^0.1.0-preview.3", + "@aws-sdk/util-user-agent-node": "^0.1.0-preview.5", + "@aws-sdk/util-utf8-node": "^0.1.0-preview.2", + "@aws-sdk/xml-body-builder": "^0.1.0-preview.4", + "@aws-sdk/xml-body-parser": "^0.1.0-preview.5", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/config-resolver": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-0.1.0-preview.7.tgz", + "integrity": "sha512-clP/NFkGyIJzCPPZ9y9vc4rQD2O8euuEVtYDlHNPfe+791uo43I1/qhw20v31mPY1OH0dScf5Jn/n4Ed9YO1VA==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/core-handler": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/core-handler/-/core-handler-0.1.0-preview.7.tgz", + "integrity": "sha512-F+BAYmcPGbbK2w6Y9i4RgK9f8ojUuQKoZuFCxiYoujLGoak/p81gACTz3dQyV9/NiY46EvmdpyaGQeLtpfuriQ==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-0.1.0-preview.8.tgz", + "integrity": "sha512-wW2XRalzx8jAIsVSdOM4cDP3hgbvPy6UJhQwpn9N3kfb22G5FPEry6hlJKHAVzQ15tkTNd0C6SyRlXgC5zEzmA==", + "requires": { + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-0.1.0-preview.8.tgz", + "integrity": "sha512-l6qudUcrpfG8wGOCyOea1oZ42AF+m0h27m/BDvWA8KIclW6XjfJ0TAcQWNVYbDX91sBx3YWidqlNBuzs/bZfKw==", + "requires": { + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-0.1.0-preview.7.tgz", + "integrity": "sha512-iIVGZonHwy08RJgW9AZURKAbRTcBtwZw9wWSkO1YgtFVKYHH81E+C/k3o9ljCD9TK+XfvB2dv5alPkS71EufIQ==", + "requires": { + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "0.1.0-preview.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-0.1.0-preview.10.tgz", + "integrity": "sha512-UWw89x1kCTiawc2MWYjavChk1bwy4dlp8WZyYeM/a4MqYacXPbcIOXEDVVL72PpCOqtxk0/RXnkLO2b7sUI0vg==", + "requires": { + "@aws-sdk/credential-provider-env": "^0.1.0-preview.8", + "@aws-sdk/credential-provider-imds": "^0.1.0-preview.8", + "@aws-sdk/credential-provider-ini": "^0.1.0-preview.7", + "@aws-sdk/credential-provider-process": "^0.1.0-preview.5", + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "0.1.0-preview.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-0.1.0-preview.5.tgz", + "integrity": "sha512-OIBmuaul/aF3w3oCc1zIw+jE5tlhacrhCD/LXf0DornF8Bfp4oaYA5qJ4Lttu/Q25s2qW5+YEuFlDsnqpIQUyw==", + "requires": { + "@aws-sdk/credential-provider-ini": "^0.1.0-preview.7", + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-node": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-0.1.0-preview.8.tgz", + "integrity": "sha512-tYBKE5ggAfw7oCLj3/jVJomruUMXhFOL+yH7xnKbgEjCi2m/jsSClCwjUbco2d5eFeC75t74RsFuyCREm9o+nw==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/hash-stream-node": { + "version": "0.1.0-preview.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-0.1.0-preview.9.tgz", + "integrity": "sha512-XV8vQgwrDV7VGoL94ry/HZsaw4wA6NDKynpsctr4yQfgWy3hunrMunngnIs3jybBlkyCuhmw2SssjEjSugpvFg==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-0.1.0-preview.3.tgz", + "integrity": "sha512-8SM7kBGkwH6JCKA6K1w4Jrj+EABFOPQkbPvwaf6BILYiUMUbgJvjOPjNQE2MrvRxJz50WAcZDHnlwhstuwIRnw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/is-iterable": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-iterable/-/is-iterable-0.1.0-preview.3.tgz", + "integrity": "sha512-dmqXKd7BlAGAaOz1dvmBw5MeOy/94LOxIRv4i8I76JPyTJsxFKjzJIHeRMnQ/5WJ3/POhmb6ZjBW/GwS/upaFw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/location-constraint-middleware": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/location-constraint-middleware/-/location-constraint-middleware-0.1.0-preview.7.tgz", + "integrity": "sha512-K7EZ77oSVqyrTDZKJ8OQ7m1/EAEoRFUknE0HsiTRImhRHqxPhR+sP6brWU+gdywgYbDVaXJox30GUMNAOqhs9Q==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-0.1.0-preview.7.tgz", + "integrity": "sha512-6ZI+dY8VgWmKL48tBtFGFgllwdhKgqNztscLtYPmHl38zrz4sITJnyGwbYDGLW+xLIGDOQhyFd/6kWTqT9QyKQ==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-0.1.0-preview.8.tgz", + "integrity": "sha512-+aWGX+pwNys/a2ysFOdjmyP0iSSrmaJO2JkcvO8wjaJ6CLFqjnP7W9YN5HSEr8C+AGHN4z3Pg+W4xLNWCyzjZg==", + "requires": { + "@aws-sdk/middleware-header-default": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-header-default": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-0.1.0-preview.7.tgz", + "integrity": "sha512-hf7+YMiPnyzRKzmcZZ5v2NKkC6CKgo8nnckJ1A1OlvWYGq3hLMF1gKDMzdkEFjWJmDWv6AVNyHjw5qe4AV8LVA==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-serializer": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serializer/-/middleware-serializer-0.1.0-preview.7.tgz", + "integrity": "sha512-mc5xBnrdDM9k3a78cbTSw+VWTadpDQQBObSuAy4fCxrkPZa+APqRY+y9MMDQ0uWI80e6Ab1pt9wTx1/OM1uMWQ==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/middleware-stack": { + "version": "0.1.0-preview.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-0.1.0-preview.9.tgz", + "integrity": "sha512-UZPTIUL8df6bxhoRFmbE278mR5VkBgUakZ+g0+W7QP7yk7yOcA/PSNAoUQMXmyncTfrv9PS2RqByIqBGJ9nHRw==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/node-http-handler": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-0.1.0-preview.8.tgz", + "integrity": "sha512-D3hISgch64L2rG8RQDi361ywoSgsyH/5Yj4ZF05ZCo8UZ8TjU1CtiLPKy1is0XLqojhLlDAQ65lNna44xoArcw==", + "requires": { + "@aws-sdk/abort-controller": "^0.1.0-preview.7", + "@aws-sdk/querystring-builder": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/property-provider": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-0.1.0-preview.7.tgz", + "integrity": "sha512-8yKkR78XC3fvdd+ePohfLuZHKBL7e3k+t82JL775phiXO94WHiz/hlvm6tGhNz5zKzz72yLrJPCyoQAZLrxrTg==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/protocol-rest": { + "version": "0.1.0-preview.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-rest/-/protocol-rest-0.1.0-preview.10.tgz", + "integrity": "sha512-wzQV8h+rxWOOKkpwZpgx/glPz2mrH3nGZG7JyqxzEdveRmCMKSS27tqTc2XGlf8x1lGfTBZVg3XTWYrPTBHvlw==", + "requires": { + "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", + "@aws-sdk/is-iterable": "^0.1.0-preview.3", + "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", + "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.8", + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/util-error-constructor": "^0.1.0-preview.7", + "@aws-sdk/util-uri-escape": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/protocol-timestamp": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-timestamp/-/protocol-timestamp-0.1.0-preview.7.tgz", + "integrity": "sha512-ObO202v456/S6Ckhlu844KBXN9toFTPt8zzrJpESzntVXIaidDECetd120/xToycYmICinvAYH9o1E2l6VlCRQ==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/query-error-unmarshaller": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/query-error-unmarshaller/-/query-error-unmarshaller-0.1.0-preview.8.tgz", + "integrity": "sha512-41lNT9delFhOss5H3eoi/2wYLYFuVqLXutRb5ZM5VvdhE4ZG+L8oE8HM0LSwQBttQFHaZcjdx3x3n9EVatSuCw==", + "requires": { + "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.8", + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/util-error-constructor": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/querystring-builder": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-0.1.0-preview.7.tgz", + "integrity": "sha512-U2d9CYTwnF4/Qc8XXFmCdRzcApTmwEXLyHUcjK2/GaOHKkHDAeIC94+cuP+H3nDjCjb3TdKV2xrl/wzuP0YBrg==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/util-uri-escape": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/querystring-parser": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-0.1.0-preview.7.tgz", + "integrity": "sha512-r72E/wZYrhTXTK950Ld/L2Loso/HDqExQkIuCn1Pu8Rx0+uC3Y8fQTx+JZd5M5kOniCpGKdHWGc7y/bH/tjH4A==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/region-provider": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-provider/-/region-provider-0.1.0-preview.7.tgz", + "integrity": "sha512-n+LeuQYPYbCyfCboz9mmYqcPPKdmdd60KPbPeRqSdJYr9QZz9hWU962oCOl5EtLYIsUzy7Fm33APv6toEcAPVw==", + "requires": { + "@aws-sdk/property-provider": "^0.1.0-preview.7", + "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/response-metadata-extractor": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/response-metadata-extractor/-/response-metadata-extractor-0.1.0-preview.8.tgz", + "integrity": "sha512-c5aJGYDiEwWqYpsROCqrmR60d0yeVdvRtzMptcpCI95BvIizS3hTc+PfuOq3Gcz7L+EQysbzQyqZutCJ/zLbew==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/retry-middleware": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/retry-middleware/-/retry-middleware-0.1.0-preview.7.tgz", + "integrity": "sha512-ULiq+dffOPurjyHm95PYWi1Cy27LQg9jPwLz5tiL7oIla/j9b5bcclZE3n0RtqbHDUvWJL5kxmYw0Kjrggr5iw==", + "requires": { + "@aws-sdk/service-error-classification": "^0.1.0-preview.3", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/s3-error-unmarshaller": { + "version": "0.1.0-preview.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-error-unmarshaller/-/s3-error-unmarshaller-0.1.0-preview.2.tgz", + "integrity": "sha512-3A6FUzFwGe34+1l8daxXaiTymZmb1LvVXNM+aapfJqRCM80vfbTEf+pzefIHCJAOhTCaSyhtkrs07iOpj3L1nw==", + "requires": { + "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.5", + "@aws-sdk/types": "^0.1.0-preview.4", + "@aws-sdk/util-error-constructor": "^0.1.0-preview.4", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/service-error-classification": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-0.1.0-preview.3.tgz", + "integrity": "sha512-3TXwADJL+HGOWyqdwx+pOdwr8L8LGbdxwHR0D05PP3skY+TP34F3ye2DJlyCll4S9vYzf9GlSbwJWviN9Sujrw==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-0.1.0-preview.3.tgz", + "integrity": "sha512-1wuV2YpZm+sW4AZa7CBD3A3b7+vSHX0DWBgGaENYdqC+MUEl6lD57ZOUGLryPq5xv/tQfy8BC7QT+qDNHElcuw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/signature-v4": { + "version": "0.1.0-preview.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-0.1.0-preview.10.tgz", + "integrity": "sha512-cehCmWlWc16d1mn1tdG1cLdLUiKWHSVSAIiDRCyUS/ryZNduFHivYMyARvuQKEBXILlQari0e6RRuzTFXaAjlA==", + "requires": { + "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", + "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/util-hex-encoding": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/signing-middleware": { + "version": "0.1.0-preview.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/signing-middleware/-/signing-middleware-0.1.0-preview.10.tgz", + "integrity": "sha512-aKyPNr41JuOhl3QGqGp+XSerwPRbkG/TzBHiNsRX/0EeB1ZyxZ2cckhssswL3k4lvEBPQS0SqnGi2FHXozyOvw==", + "requires": { + "@aws-sdk/signature-v4": "^0.1.0-preview.10", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/ssec-middleware": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/ssec-middleware/-/ssec-middleware-0.1.0-preview.8.tgz", + "integrity": "sha512-vDxnda94Wp2M1RXQXPJYedDwNt9sAN2j+N6QvDpwOZ2G2qEVLOvkPPTEz2GwzU6dTQY3HSd/Psomz+9OeamWtA==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/stream-collector-node": { + "version": "0.1.0-preview.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/stream-collector-node/-/stream-collector-node-0.1.0-preview.9.tgz", + "integrity": "sha512-aXVMbx9lMd+AsmTpn4egsIJ/ZAkd6cWkhv8y3sL/Fwlyl0U7tfV4EzTEDZFvAta+MG+wB8fPhz9d7bfyQOk/xQ==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/types": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-0.1.0-preview.7.tgz", + "integrity": "sha512-gpyU8N9XEs8diE4uW9B6/hjKDrB/c4a1GF4ICwkaGYpXrbJy9QLrEU8Hk4rC6P1l++YYyJKMl7RjMmTyBtNOzw==" + }, + "@aws-sdk/url-parser-node": { + "version": "0.1.0-preview.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-node/-/url-parser-node-0.1.0-preview.8.tgz", + "integrity": "sha512-h8YwL+mLTBPNzryREkLChhtRSdz70tOR9y/UB6PATGKoJbMUFoTsDY1jbJ4WWBfdKjphZy9xVWTyxoCkP07tQQ==", + "requires": { + "@aws-sdk/querystring-parser": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-base64-node": { + "version": "0.1.0-preview.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-0.1.0-preview.4.tgz", + "integrity": "sha512-L9O3lMWB7y2xVIgg/nSJ7xZLVFmxMCk1maaup3CoL5USLqB7n7ngpf/WAH2LyhaGo8Og8TrAKt4BizpxbZU7wg==", + "requires": { + "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "0.1.0-preview.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-0.1.0-preview.5.tgz", + "integrity": "sha512-ZmqB7E/RizTe8ajxLyXdshoyzQg47CAkbnCK7yRE4A9N7XMEUgzyFVXuKT08DmbAwYSYWI5jaUwm3jpMKqG+bw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-0.1.0-preview.3.tgz", + "integrity": "sha512-n78cUmI1SbluJgTgyqp24GgNQ3A5NUGB4rwRAoID7k7JpsiNJUWTXkijl3hxfNov2sEjMWvdQIGvAF6F/Q2mfw==", + "requires": { + "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-error-constructor": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-error-constructor/-/util-error-constructor-0.1.0-preview.7.tgz", + "integrity": "sha512-sb8gruiOadl0YXG2yn0EMBkB/Oy/7y4mt8Wfl7G3crvWXcHtD7flbW7wjbFiMcQU91vi5sTaZ56hwvDA9lu0ug==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-0.1.0-preview.3.tgz", + "integrity": "sha512-X/Qq5e2H4/EQ0WEwWUiSxGbFARk7IKZpa+E4pzQm49sxS2omVsvuphcr4yYJq4SZKEtuB2w2nHMr7NmGlWt4Xg==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-0.1.0-preview.3.tgz", + "integrity": "sha512-axArIOq8+2PKjY9Fz+LKfCY127rjWQD50F1DAhCC0BV3mrG0OlhcQ8uKaNfMXVrveTqT+QYvrpTsrziHYjjTQw==", + "requires": { + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "0.1.0-preview.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-0.1.0-preview.10.tgz", + "integrity": "sha512-hYL9XCLkxDEG60XbwXG2fvIYwi9vFHw9Em6OPMz3sh3Y4er7KJxOwuCYJV+kccREY35e1TGblbOARFczwD7U0w==", + "requires": { + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "0.1.0-preview.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-0.1.0-preview.4.tgz", + "integrity": "sha512-FxIWpC4LdKiJgJgiaLWMdZY/DbreSIRgVGO9cOlV5fI59KdN+2Aqb6sLnlp7yVbo2hiL0Hlcv7fcf4MEtELn0g==", + "requires": { + "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/xml-body-builder": { + "version": "0.1.0-preview.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-body-builder/-/xml-body-builder-0.1.0-preview.7.tgz", + "integrity": "sha512-4LNn5CONVhIWq3+wUWwfsSOncs9Ges8NKD9cf6pTN/VaqBcVGiFo3L0PoHLk143RTBxIsqmkY2VhVlNl5XsQSA==", + "requires": { + "@aws-sdk/is-iterable": "^0.1.0-preview.3", + "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "@aws-sdk/xml-builder": "^0.1.0-preview.3", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/xml-body-parser": { + "version": "0.1.0-preview.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-body-parser/-/xml-body-parser-0.1.0-preview.9.tgz", + "integrity": "sha512-MdRXPxuK27258zlPmfSFgLZ5ljTC7AvMq+J8Hkr6/s4iFeQJjzxXHCmRJ7r/9maUQ0LV8VXDw6khxIQdHKMWAA==", + "requires": { + "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", + "@aws-sdk/types": "^0.1.0-preview.7", + "tslib": "^1.8.0" + } + }, + "@aws-sdk/xml-builder": { + "version": "0.1.0-preview.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-0.1.0-preview.3.tgz", + "integrity": "sha512-TwahSQDyO0yjiY2GXSDw2f4FP6lgj8LaR/MtmjAHZeP6M8dw5ma08R2pLI5CV+paNIACnnnmRuSW2Dmj0c/jOQ==", + "requires": { + "tslib": "^1.8.0" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -2065,6 +2580,19 @@ "npmlog": "^4.1.2", "pify": "^4.0.1", "semver": "^6.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/create": { @@ -2093,6 +2621,17 @@ "whatwg-url": "^7.0.0" }, "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -2110,6 +2649,19 @@ "@zkochan/cmd-shim": "^3.1.0", "fs-extra": "^8.1.0", "npmlog": "^4.1.2" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/describe-ref": { @@ -2191,6 +2743,19 @@ "fs-extra": "^8.1.0", "ssri": "^6.0.1", "tar": "^4.4.8" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/github-client": { @@ -2247,6 +2812,19 @@ "dedent": "^0.7.0", "fs-extra": "^8.1.0", "p-map-series": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/info": { @@ -2271,6 +2849,19 @@ "fs-extra": "^8.1.0", "p-map": "^2.1.0", "write-json-file": "^3.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/link": { @@ -2365,6 +2956,19 @@ "npmlog": "^4.1.2", "signal-exit": "^3.0.2", "write-pkg": "^3.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/npm-publish": { @@ -2382,6 +2986,19 @@ "npmlog": "^4.1.2", "pify": "^4.0.1", "read-package-json": "^2.0.13" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/npm-run-script": { @@ -2473,6 +3090,19 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "upath": "^1.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/project": { @@ -2652,6 +3282,19 @@ "p-map": "^2.1.0", "p-pipe": "^1.2.0", "semver": "^6.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/pulse-till-done": { @@ -2682,6 +3325,19 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "read-cmd-shim": "^1.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/rimraf-dir": { @@ -2754,6 +3410,19 @@ "@lerna/package": "3.16.0", "fs-extra": "^8.1.0", "p-map": "^2.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/symlink-dependencies": { @@ -2769,6 +3438,19 @@ "p-finally": "^1.0.0", "p-map": "^2.1.0", "p-map-series": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/timer": { @@ -3185,6 +3867,17 @@ "debug": "4" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -4053,6 +4746,15 @@ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, + "@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", @@ -4985,6 +5687,11 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -4998,9 +5705,9 @@ "dev": true }, "aws-sdk": { - "version": "2.658.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.658.0.tgz", - "integrity": "sha512-vb+CorOG2lod4ZztrVaE3hcSjTwnB9HhTOnD/2R9YJtIUGTJqL0CIDTwo0Q384GFROtDhp7j6SX7oKFwdzDEuA==", + "version": "2.663.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.663.0.tgz", + "integrity": "sha512-xPOszNOaSXTRs8VGXaMbhTKXdlq2TlDRfFRVEGxkZrtow87hEIVZGAUSUme2e3GHqHUDnySwcufrUpUPUizOKQ==", "dev": true, "requires": { "buffer": "4.9.1", @@ -9850,14 +10557,30 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + } } }, "fs-minipass": { @@ -10658,8 +11381,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "graceful-readlink": { "version": "1.0.1", @@ -20701,8 +21423,7 @@ "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", diff --git a/package.json b/package.json index 2fadcb993a..95085b5c23 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "homepage": "https://github.com/danielcondemarin/serverless-next.js#readme", "devDependencies": { "@babel/preset-typescript": "^7.9.0", + "@sls-next/lambda-at-edge": "file:packages/lambda-at-edge", + "@types/fs-extra": "^8.1.0", "@types/jest": "^25.2.1", "@typescript-eslint/eslint-plugin": "^2.28.0", "@typescript-eslint/parser": "^2.28.0", @@ -49,7 +51,6 @@ "lerna": "^3.16.4", "next": "^9.1.5", "next-aws-cloudfront": "file:packages/lambda-at-edge-compat", - "@sls-next/lambda-at-edge": "file:packages/lambda-at-edge", "prettier": "^1.17.1", "react": "^16.9.0", "react-dom": "^16.9.0", @@ -84,6 +85,8 @@ ] }, "dependencies": { + "@aws-sdk/client-s3-node": "0.1.0-preview.2", + "fs-extra": "^9.0.0", "opencollective-postinstall": "^2.0.2" }, "collective": { diff --git a/packages/s3-static-assets/__mocks__/aws-sdk.ts b/packages/s3-static-assets/__mocks__/aws-sdk.ts index 7651751693..f287efd074 100644 --- a/packages/s3-static-assets/__mocks__/aws-sdk.ts +++ b/packages/s3-static-assets/__mocks__/aws-sdk.ts @@ -1,7 +1,16 @@ +const promisifyMock = (mockFn: jest.Mock): jest.Mock => { + const promise = jest.fn(); + mockFn.mockReturnValue({ promise }); + return promise; +}; + export const mockUpload = jest.fn(); +export const mockUploadPromise = promisifyMock(mockUpload); + +const MockS3 = jest.fn(() => ({ + upload: mockUpload +})); export default { - S3: jest.fn(() => ({ - upload: mockUpload - })) + S3: MockS3 }; diff --git a/packages/s3-static-assets/src/constants.ts b/packages/s3-static-assets/src/constants.ts new file mode 100644 index 0000000000..a20bdcbb35 --- /dev/null +++ b/packages/s3-static-assets/src/constants.ts @@ -0,0 +1,2 @@ +export const IMMUTABLE_CACHE_CONTROL_HEADER = + "public, max-age=31536000, immutable"; diff --git a/packages/s3-static-assets/index.ts b/packages/s3-static-assets/src/index.ts similarity index 66% rename from packages/s3-static-assets/index.ts rename to packages/s3-static-assets/src/index.ts index 48fd5fa7fc..3fc9d84aad 100644 --- a/packages/s3-static-assets/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -8,7 +8,12 @@ type UploadStaticAssetsOptions = { bucketName: string; nextAppDir: string; }; - +const filePathToS3Key = (filePath: string): string => { + const relevantFilePathPart = filePath.substring( + filePath.indexOf(".next" + path.sep) + ); + return relevantFilePathPart.replace(".next", "_next"); +}; const readDirectoryFiles = (directory: string): Promise> => { const items: Item[] = []; return new Promise((resolve, reject) => { @@ -40,20 +45,22 @@ const uploadStaticAssets = async ( const uploadTasks = buildStaticFiles .filter(item => !item.stats.isDirectory()) - .map(fileItem => { - return fse.readFile(fileItem.path).then(fileBodyStream => - s3 - .upload({ - Bucket: bucketName, - Key: fileItem.path, - Body: fileBodyStream, - ContentType: - mime.lookup(path.basename(fileItem.path)) || - "application/octet-stream", - CacheControl: "public, max-age=31536000, immutable" - }) - .promise() - ); + .map(async fileItem => { + const fileBody = await fse.readFile(fileItem.path); + + const s3Key = filePathToS3Key(fileItem.path); + + return s3 + .upload({ + Bucket: bucketName, + Key: s3Key, + Body: fileBody, + ContentType: + mime.lookup(path.basename(fileItem.path)) || + "application/octet-stream", + CacheControl: "public, max-age=31536000, immutable" + }) + .promise(); }); await Promise.all(uploadTasks); diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 3be3b40ce9..0b05be7176 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,7 +1,6 @@ -import stream from "stream"; -import fse from "fs-extra"; import path from "path"; -import uploadStaticAssets from "../index"; +import uploadStaticAssets from "../src/index"; +import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/constants"; import { mockUpload } from "aws-sdk"; declare module "aws-sdk" { @@ -9,33 +8,45 @@ declare module "aws-sdk" { } describe("Upload assets tests", () => { - it("uploads any contents inside build directory specified in BUILD_ID", async () => { + beforeEach(async () => { await uploadStaticAssets({ bucketName: "test-bucket-name", nextAppDir: path.join(__dirname, "./fixtures/basic-next-app") }); + }); - const mockedBodyStream = new stream.Readable(); - jest - .spyOn(fse, "readFile") - .mockResolvedValue(Promise.resolve(mockedBodyStream)); - - const expectedCacheControl = "public, max-age=31536000, immutable"; + it("uploads any contents inside build directory specified in BUILD_ID", async () => { + expect(mockUpload).toBeCalledTimes(2); expect(mockUpload).toBeCalledWith({ Bucket: "test-bucket-name", - Key: "_next/static/a_test_build_id/testFileOne.js", - Body: mockedBodyStream, + Key: "_next/static/a_test_build_id/two.js", + Body: expect.any(Buffer), ContentType: "application/javascript", - CacheControl: expectedCacheControl + CacheControl: IMMUTABLE_CACHE_CONTROL_HEADER }); expect(mockUpload).toBeCalledWith({ Bucket: "test-bucket-name", - Key: "_next/static/a_test_build_id/subdir/testFileTwo.js", - Body: mockedBodyStream, - ContentType: "application/javascript", - CacheControl: expectedCacheControl + Key: "_next/static/a_test_build_id/css/one.css", + Body: expect.any(Buffer), + ContentType: "text/css", + CacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }); + }); + + it("uploads prerendered HTML pages specified in pages manifest", async () => { + expect(mockUpload).toBeCalledWith({ + Key: "static-pages/todos/terms.html", + ContentType: "text/html", + CacheControl: undefined + }); + + expect(mockUpload).toBeCalledWith({ + Key: "static-pages/todos/terms/[section].html", + Body: expect.any(Buffer), + ContentType: "text/html", + CacheControl: undefined }); }); }); From 4f914cfcbcc5bef5469d2df3cd14f0e446a4db01 Mon Sep 17 00:00:00 2001 From: danielconde Date: Wed, 29 Apr 2020 22:41:41 +0100 Subject: [PATCH 03/24] html pages now upload --- packages/s3-static-assets/src/index.ts | 30 +++++++++++++++++-- .../tests/upload-assets.test.ts | 28 +++++++++-------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 3fc9d84aad..eb3a1bb7c2 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -6,7 +6,7 @@ import AWS from "aws-sdk"; type UploadStaticAssetsOptions = { bucketName: string; - nextAppDir: string; + nextConfigDir: string; }; const filePathToS3Key = (filePath: string): string => { const relevantFilePathPart = filePath.substring( @@ -29,11 +29,11 @@ const readDirectoryFiles = (directory: string): Promise> => { const uploadStaticAssets = async ( options: UploadStaticAssetsOptions ): Promise => { - const { bucketName, nextAppDir } = options; + const { bucketName, nextConfigDir } = options; const s3 = new AWS.S3(); - const dotNextDirectory = path.join(nextAppDir, ".next"); + const dotNextDirectory = path.join(nextConfigDir, ".next"); const BUILD_ID = fse .readFileSync(path.join(dotNextDirectory, "BUILD_ID")) @@ -63,6 +63,30 @@ const uploadStaticAssets = async ( .promise(); }); + const pagesManifest = await fse.readJSON( + path.join(dotNextDirectory, "serverless/pages-manifest.json") + ); + + const htmlPageUploadTasks = Object.values(pagesManifest) + .filter(pageFile => (pageFile as string).endsWith(".html")) + .map(async pageFile => { + const fileBody = await fse.readFile( + path.join(dotNextDirectory, `serverless/${pageFile}`) + ); + + return s3 + .upload({ + Bucket: bucketName, + Key: `static-pages/${(pageFile as string).replace(/^pages\//, "")}`, + Body: fileBody, + ContentType: "text/html", + CacheControl: undefined + }) + .promise(); + }); + + uploadTasks.concat(htmlPageUploadTasks); + await Promise.all(uploadTasks); // read public/ folder and upload files // read static/ folder and upload files diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 0b05be7176..22fbe628ee 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -11,7 +11,7 @@ describe("Upload assets tests", () => { beforeEach(async () => { await uploadStaticAssets({ bucketName: "test-bucket-name", - nextAppDir: path.join(__dirname, "./fixtures/basic-next-app") + nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app") }); }); @@ -36,17 +36,21 @@ describe("Upload assets tests", () => { }); it("uploads prerendered HTML pages specified in pages manifest", async () => { - expect(mockUpload).toBeCalledWith({ - Key: "static-pages/todos/terms.html", - ContentType: "text/html", - CacheControl: undefined - }); + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static-pages/todos/terms.html", + ContentType: "text/html", + CacheControl: undefined + }) + ); - expect(mockUpload).toBeCalledWith({ - Key: "static-pages/todos/terms/[section].html", - Body: expect.any(Buffer), - ContentType: "text/html", - CacheControl: undefined - }); + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static-pages/todos/terms/[section].html", + Body: expect.any(Buffer), + ContentType: "text/html", + CacheControl: undefined + }) + ); }); }); From ce41140b80912b11e21865bcec4685372f8ee55c Mon Sep 17 00:00:00 2001 From: danielconde Date: Wed, 29 Apr 2020 22:48:15 +0100 Subject: [PATCH 04/24] refactor --- packages/s3-static-assets/src/index.ts | 15 ++------------- .../s3-static-assets/src/{ => lib}/constants.ts | 0 .../src/lib/readDirectoryFiles.ts | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 13 deletions(-) rename packages/s3-static-assets/src/{ => lib}/constants.ts (100%) create mode 100644 packages/s3-static-assets/src/lib/readDirectoryFiles.ts diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index eb3a1bb7c2..38225d9844 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -1,30 +1,20 @@ import path from "path"; import fse from "fs-extra"; import mime from "mime-types"; -import klaw, { Item } from "klaw"; import AWS from "aws-sdk"; +import readDirectoryFiles from "./lib/readDirectoryFiles"; type UploadStaticAssetsOptions = { bucketName: string; nextConfigDir: string; }; + const filePathToS3Key = (filePath: string): string => { const relevantFilePathPart = filePath.substring( filePath.indexOf(".next" + path.sep) ); return relevantFilePathPart.replace(".next", "_next"); }; -const readDirectoryFiles = (directory: string): Promise> => { - const items: Item[] = []; - return new Promise((resolve, reject) => { - klaw(directory.trim()) - .on("data", item => items.push(item)) - .on("end", () => { - resolve(items); - }) - .on("error", reject); - }); -}; const uploadStaticAssets = async ( options: UploadStaticAssetsOptions @@ -90,7 +80,6 @@ const uploadStaticAssets = async ( await Promise.all(uploadTasks); // read public/ folder and upload files // read static/ folder and upload files - // get HTML pages from pages manifest // get JSON data files from prerender manifest }; diff --git a/packages/s3-static-assets/src/constants.ts b/packages/s3-static-assets/src/lib/constants.ts similarity index 100% rename from packages/s3-static-assets/src/constants.ts rename to packages/s3-static-assets/src/lib/constants.ts diff --git a/packages/s3-static-assets/src/lib/readDirectoryFiles.ts b/packages/s3-static-assets/src/lib/readDirectoryFiles.ts new file mode 100644 index 0000000000..1585245453 --- /dev/null +++ b/packages/s3-static-assets/src/lib/readDirectoryFiles.ts @@ -0,0 +1,15 @@ +import klaw, { Item } from "klaw"; + +const readDirectoryFiles = (directory: string): Promise> => { + const items: Item[] = []; + return new Promise((resolve, reject) => { + klaw(directory.trim()) + .on("data", item => items.push(item)) + .on("end", () => { + resolve(items); + }) + .on("error", reject); + }); +}; + +export default readDirectoryFiles; From 6f989d9fe99922565026978f5af2549b89c05ccc Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 15:57:04 +0100 Subject: [PATCH 05/24] all basic functionality done --- packages/s3-static-assets/src/index.ts | 95 +++++++++++-------- .../src/lib/filterOutDirectories.ts | 3 + .../s3-static-assets/src/lib/getMimeType.ts | 5 + packages/s3-static-assets/src/lib/s3.ts | 43 +++++++++ .../fixtures/basic-next-app/public/robots.txt | 0 .../public/scripts/test-script.js | 0 .../fixtures/basic-next-app/static/robots.txt | 0 .../static/scripts/test-script.js | 0 .../tests/upload-assets.test.ts | 41 +++++++- 9 files changed, 146 insertions(+), 41 deletions(-) create mode 100644 packages/s3-static-assets/src/lib/filterOutDirectories.ts create mode 100644 packages/s3-static-assets/src/lib/getMimeType.ts create mode 100644 packages/s3-static-assets/src/lib/s3.ts create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 38225d9844..fd80dbb083 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -1,14 +1,31 @@ +import AWS from "aws-sdk"; import path from "path"; import fse from "fs-extra"; -import mime from "mime-types"; -import AWS from "aws-sdk"; import readDirectoryFiles from "./lib/readDirectoryFiles"; +import filterOutDirectories from "./lib/filterOutDirectories"; +import { IMMUTABLE_CACHE_CONTROL_HEADER } from "./lib/constants"; +import S3ClientFactory, { S3Client } from "./lib/s3"; type UploadStaticAssetsOptions = { bucketName: string; nextConfigDir: string; }; +const uploadPublicOrStaticDirectory = async ( + s3: S3Client, + directory: "public" | "static", + nextConfigDir: string +): Promise[]> => { + const files = await readDirectoryFiles(path.join(nextConfigDir, directory)); + + return files.filter(filterOutDirectories).map(fileItem => + s3.uploadFile({ + filePath: fileItem.path, + s3Key: path.posix.relative(path.resolve(nextConfigDir), fileItem.path) + }) + ); +}; + const filePathToS3Key = (filePath: string): string => { const relevantFilePathPart = filePath.substring( filePath.indexOf(".next" + path.sep) @@ -18,10 +35,12 @@ const filePathToS3Key = (filePath: string): string => { const uploadStaticAssets = async ( options: UploadStaticAssetsOptions -): Promise => { +): Promise => { const { bucketName, nextConfigDir } = options; - const s3 = new AWS.S3(); + const s3 = S3ClientFactory({ + bucketName + }); const dotNextDirectory = path.join(nextConfigDir, ".next"); @@ -33,54 +52,56 @@ const uploadStaticAssets = async ( path.join(dotNextDirectory, "static", BUILD_ID) ); - const uploadTasks = buildStaticFiles - .filter(item => !item.stats.isDirectory()) + const nextBuildFileUploads = buildStaticFiles + .filter(filterOutDirectories) .map(async fileItem => { - const fileBody = await fse.readFile(fileItem.path); - const s3Key = filePathToS3Key(fileItem.path); - return s3 - .upload({ - Bucket: bucketName, - Key: s3Key, - Body: fileBody, - ContentType: - mime.lookup(path.basename(fileItem.path)) || - "application/octet-stream", - CacheControl: "public, max-age=31536000, immutable" - }) - .promise(); + return s3.uploadFile({ + s3Key, + filePath: fileItem.path, + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }); }); const pagesManifest = await fse.readJSON( path.join(dotNextDirectory, "serverless/pages-manifest.json") ); - const htmlPageUploadTasks = Object.values(pagesManifest) + const htmlPageUploads = Object.values(pagesManifest) .filter(pageFile => (pageFile as string).endsWith(".html")) - .map(async pageFile => { - const fileBody = await fse.readFile( - path.join(dotNextDirectory, `serverless/${pageFile}`) + .map(relativePageFilePath => { + const pageFilePath = path.join( + dotNextDirectory, + `serverless/${relativePageFilePath}` ); - return s3 - .upload({ - Bucket: bucketName, - Key: `static-pages/${(pageFile as string).replace(/^pages\//, "")}`, - Body: fileBody, - ContentType: "text/html", - CacheControl: undefined - }) - .promise(); + return s3.uploadFile({ + s3Key: `static-pages/${relativePageFilePath.replace(/^pages\//, "")}`, + filePath: pageFilePath + }); }); - uploadTasks.concat(htmlPageUploadTasks); + const publicDirUploads = await uploadPublicOrStaticDirectory( + s3, + "public", + nextConfigDir + ); + + const staticDirUploads = await uploadPublicOrStaticDirectory( + s3, + "static", + nextConfigDir + ); + + const allUploads = [ + ...nextBuildFileUploads, + ...htmlPageUploads, + ...publicDirUploads, + ...staticDirUploads + ]; - await Promise.all(uploadTasks); - // read public/ folder and upload files - // read static/ folder and upload files - // get JSON data files from prerender manifest + return Promise.all(allUploads); }; export default uploadStaticAssets; diff --git a/packages/s3-static-assets/src/lib/filterOutDirectories.ts b/packages/s3-static-assets/src/lib/filterOutDirectories.ts new file mode 100644 index 0000000000..82758286ef --- /dev/null +++ b/packages/s3-static-assets/src/lib/filterOutDirectories.ts @@ -0,0 +1,3 @@ +import { Item } from "klaw"; + +export default (fileItem: Item): boolean => !fileItem.stats.isDirectory(); diff --git a/packages/s3-static-assets/src/lib/getMimeType.ts b/packages/s3-static-assets/src/lib/getMimeType.ts new file mode 100644 index 0000000000..086bbaa284 --- /dev/null +++ b/packages/s3-static-assets/src/lib/getMimeType.ts @@ -0,0 +1,5 @@ +import mime from "mime-types"; +import path from "path"; + +export default (filePath: string): string => + mime.lookup(path.basename(filePath)) || "application/octet-stream"; diff --git a/packages/s3-static-assets/src/lib/s3.ts b/packages/s3-static-assets/src/lib/s3.ts new file mode 100644 index 0000000000..6a325eed6a --- /dev/null +++ b/packages/s3-static-assets/src/lib/s3.ts @@ -0,0 +1,43 @@ +import getMimeType from "./getMimeType"; +import fse from "fs-extra"; +import AWS from "aws-sdk"; + +type S3ClientFactoryOptions = { + bucketName: string; +}; + +type UploadFileOptions = { + filePath: string; + cacheControl?: string; + s3Key?: string; +}; + +export type S3Client = { + uploadFile: ( + options: UploadFileOptions + ) => Promise; +}; + +export default ({ bucketName }: S3ClientFactoryOptions): S3Client => { + const s3 = new AWS.S3(); + + return { + uploadFile: async ( + options: UploadFileOptions + ): Promise => { + const { filePath, cacheControl, s3Key } = options; + + const fileBody = await fse.readFile(filePath); + + return s3 + .upload({ + Bucket: bucketName, + Key: s3Key || filePath, + Body: fileBody, + ContentType: getMimeType(filePath), + CacheControl: cacheControl || undefined + }) + .promise(); + } + }; +}; diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt b/packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt b/packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 22fbe628ee..3faf92b819 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,6 +1,6 @@ import path from "path"; import uploadStaticAssets from "../src/index"; -import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/constants"; +import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/lib/constants"; import { mockUpload } from "aws-sdk"; declare module "aws-sdk" { @@ -16,8 +16,6 @@ describe("Upload assets tests", () => { }); it("uploads any contents inside build directory specified in BUILD_ID", async () => { - expect(mockUpload).toBeCalledTimes(2); - expect(mockUpload).toBeCalledWith({ Bucket: "test-bucket-name", Key: "_next/static/a_test_build_id/two.js", @@ -47,10 +45,45 @@ describe("Upload assets tests", () => { expect(mockUpload).toBeCalledWith( expect.objectContaining({ Key: "static-pages/todos/terms/[section].html", - Body: expect.any(Buffer), ContentType: "text/html", CacheControl: undefined }) ); }); + + it("uploads files in the public folder", async () => { + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "public/robots.txt", + ContentType: "text/plain", + CacheControl: undefined + }) + ); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "public/scripts/test-script.js", + ContentType: "application/javascript", + CacheControl: undefined + }) + ); + }); + + it("uploads files in the static folder", async () => { + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static/robots.txt", + ContentType: "text/plain", + CacheControl: undefined + }) + ); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static/scripts/test-script.js", + ContentType: "application/javascript", + CacheControl: undefined + }) + ); + }); }); From 2cff138c23e2d09490de7ad7492e056053b86fcd Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 15:57:04 +0100 Subject: [PATCH 06/24] all basic functionality done --- packages/s3-static-assets/src/index.ts | 95 +++++++++++-------- .../src/lib/filterOutDirectories.ts | 3 + .../s3-static-assets/src/lib/getMimeType.ts | 5 + packages/s3-static-assets/src/lib/s3.ts | 43 +++++++++ .../fixtures/basic-next-app/public/robots.txt | 0 .../public/scripts/test-script.js | 0 .../fixtures/basic-next-app/static/robots.txt | 0 .../static/scripts/test-script.js | 0 .../tests/upload-assets.test.ts | 41 +++++++- 9 files changed, 146 insertions(+), 41 deletions(-) create mode 100644 packages/s3-static-assets/src/lib/filterOutDirectories.ts create mode 100644 packages/s3-static-assets/src/lib/getMimeType.ts create mode 100644 packages/s3-static-assets/src/lib/s3.ts create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 38225d9844..fd80dbb083 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -1,14 +1,31 @@ +import AWS from "aws-sdk"; import path from "path"; import fse from "fs-extra"; -import mime from "mime-types"; -import AWS from "aws-sdk"; import readDirectoryFiles from "./lib/readDirectoryFiles"; +import filterOutDirectories from "./lib/filterOutDirectories"; +import { IMMUTABLE_CACHE_CONTROL_HEADER } from "./lib/constants"; +import S3ClientFactory, { S3Client } from "./lib/s3"; type UploadStaticAssetsOptions = { bucketName: string; nextConfigDir: string; }; +const uploadPublicOrStaticDirectory = async ( + s3: S3Client, + directory: "public" | "static", + nextConfigDir: string +): Promise[]> => { + const files = await readDirectoryFiles(path.join(nextConfigDir, directory)); + + return files.filter(filterOutDirectories).map(fileItem => + s3.uploadFile({ + filePath: fileItem.path, + s3Key: path.posix.relative(path.resolve(nextConfigDir), fileItem.path) + }) + ); +}; + const filePathToS3Key = (filePath: string): string => { const relevantFilePathPart = filePath.substring( filePath.indexOf(".next" + path.sep) @@ -18,10 +35,12 @@ const filePathToS3Key = (filePath: string): string => { const uploadStaticAssets = async ( options: UploadStaticAssetsOptions -): Promise => { +): Promise => { const { bucketName, nextConfigDir } = options; - const s3 = new AWS.S3(); + const s3 = S3ClientFactory({ + bucketName + }); const dotNextDirectory = path.join(nextConfigDir, ".next"); @@ -33,54 +52,56 @@ const uploadStaticAssets = async ( path.join(dotNextDirectory, "static", BUILD_ID) ); - const uploadTasks = buildStaticFiles - .filter(item => !item.stats.isDirectory()) + const nextBuildFileUploads = buildStaticFiles + .filter(filterOutDirectories) .map(async fileItem => { - const fileBody = await fse.readFile(fileItem.path); - const s3Key = filePathToS3Key(fileItem.path); - return s3 - .upload({ - Bucket: bucketName, - Key: s3Key, - Body: fileBody, - ContentType: - mime.lookup(path.basename(fileItem.path)) || - "application/octet-stream", - CacheControl: "public, max-age=31536000, immutable" - }) - .promise(); + return s3.uploadFile({ + s3Key, + filePath: fileItem.path, + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }); }); const pagesManifest = await fse.readJSON( path.join(dotNextDirectory, "serverless/pages-manifest.json") ); - const htmlPageUploadTasks = Object.values(pagesManifest) + const htmlPageUploads = Object.values(pagesManifest) .filter(pageFile => (pageFile as string).endsWith(".html")) - .map(async pageFile => { - const fileBody = await fse.readFile( - path.join(dotNextDirectory, `serverless/${pageFile}`) + .map(relativePageFilePath => { + const pageFilePath = path.join( + dotNextDirectory, + `serverless/${relativePageFilePath}` ); - return s3 - .upload({ - Bucket: bucketName, - Key: `static-pages/${(pageFile as string).replace(/^pages\//, "")}`, - Body: fileBody, - ContentType: "text/html", - CacheControl: undefined - }) - .promise(); + return s3.uploadFile({ + s3Key: `static-pages/${relativePageFilePath.replace(/^pages\//, "")}`, + filePath: pageFilePath + }); }); - uploadTasks.concat(htmlPageUploadTasks); + const publicDirUploads = await uploadPublicOrStaticDirectory( + s3, + "public", + nextConfigDir + ); + + const staticDirUploads = await uploadPublicOrStaticDirectory( + s3, + "static", + nextConfigDir + ); + + const allUploads = [ + ...nextBuildFileUploads, + ...htmlPageUploads, + ...publicDirUploads, + ...staticDirUploads + ]; - await Promise.all(uploadTasks); - // read public/ folder and upload files - // read static/ folder and upload files - // get JSON data files from prerender manifest + return Promise.all(allUploads); }; export default uploadStaticAssets; diff --git a/packages/s3-static-assets/src/lib/filterOutDirectories.ts b/packages/s3-static-assets/src/lib/filterOutDirectories.ts new file mode 100644 index 0000000000..82758286ef --- /dev/null +++ b/packages/s3-static-assets/src/lib/filterOutDirectories.ts @@ -0,0 +1,3 @@ +import { Item } from "klaw"; + +export default (fileItem: Item): boolean => !fileItem.stats.isDirectory(); diff --git a/packages/s3-static-assets/src/lib/getMimeType.ts b/packages/s3-static-assets/src/lib/getMimeType.ts new file mode 100644 index 0000000000..086bbaa284 --- /dev/null +++ b/packages/s3-static-assets/src/lib/getMimeType.ts @@ -0,0 +1,5 @@ +import mime from "mime-types"; +import path from "path"; + +export default (filePath: string): string => + mime.lookup(path.basename(filePath)) || "application/octet-stream"; diff --git a/packages/s3-static-assets/src/lib/s3.ts b/packages/s3-static-assets/src/lib/s3.ts new file mode 100644 index 0000000000..6a325eed6a --- /dev/null +++ b/packages/s3-static-assets/src/lib/s3.ts @@ -0,0 +1,43 @@ +import getMimeType from "./getMimeType"; +import fse from "fs-extra"; +import AWS from "aws-sdk"; + +type S3ClientFactoryOptions = { + bucketName: string; +}; + +type UploadFileOptions = { + filePath: string; + cacheControl?: string; + s3Key?: string; +}; + +export type S3Client = { + uploadFile: ( + options: UploadFileOptions + ) => Promise; +}; + +export default ({ bucketName }: S3ClientFactoryOptions): S3Client => { + const s3 = new AWS.S3(); + + return { + uploadFile: async ( + options: UploadFileOptions + ): Promise => { + const { filePath, cacheControl, s3Key } = options; + + const fileBody = await fse.readFile(filePath); + + return s3 + .upload({ + Bucket: bucketName, + Key: s3Key || filePath, + Body: fileBody, + ContentType: getMimeType(filePath), + CacheControl: cacheControl || undefined + }) + .promise(); + } + }; +}; diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt b/packages/s3-static-assets/tests/fixtures/basic-next-app/public/robots.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/public/scripts/test-script.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt b/packages/s3-static-assets/tests/fixtures/basic-next-app/static/robots.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/static/scripts/test-script.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 22fbe628ee..3faf92b819 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,6 +1,6 @@ import path from "path"; import uploadStaticAssets from "../src/index"; -import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/constants"; +import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/lib/constants"; import { mockUpload } from "aws-sdk"; declare module "aws-sdk" { @@ -16,8 +16,6 @@ describe("Upload assets tests", () => { }); it("uploads any contents inside build directory specified in BUILD_ID", async () => { - expect(mockUpload).toBeCalledTimes(2); - expect(mockUpload).toBeCalledWith({ Bucket: "test-bucket-name", Key: "_next/static/a_test_build_id/two.js", @@ -47,10 +45,45 @@ describe("Upload assets tests", () => { expect(mockUpload).toBeCalledWith( expect.objectContaining({ Key: "static-pages/todos/terms/[section].html", - Body: expect.any(Buffer), ContentType: "text/html", CacheControl: undefined }) ); }); + + it("uploads files in the public folder", async () => { + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "public/robots.txt", + ContentType: "text/plain", + CacheControl: undefined + }) + ); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "public/scripts/test-script.js", + ContentType: "application/javascript", + CacheControl: undefined + }) + ); + }); + + it("uploads files in the static folder", async () => { + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static/robots.txt", + ContentType: "text/plain", + CacheControl: undefined + }) + ); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "static/scripts/test-script.js", + ContentType: "application/javascript", + CacheControl: undefined + }) + ); + }); }); From 29c2e7aae98145c5ccd0f9fc0a1a8487f0a5ff50 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 18:37:37 +0100 Subject: [PATCH 07/24] fix tests on CI and refactor --- packages/s3-static-assets/src/index.ts | 59 ++++++++----------- packages/s3-static-assets/tests/.gitignore | 1 + .../fixtures/basic-next-app/.next/BUILD_ID | 1 + .../.next/serverless/pages-manifest.json | 4 ++ .../.next/serverless/pages/todos/terms.html | 0 .../pages/todos/terms/[section].html | 0 .../.next/static/a_test_build_id/css/one.css | 0 .../.next/static/a_test_build_id/two.js | 0 8 files changed, 29 insertions(+), 36 deletions(-) create mode 100644 packages/s3-static-assets/tests/.gitignore create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/BUILD_ID create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages-manifest.json create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms.html create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms/[section].html create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/css/one.css create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/two.js diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index fd80dbb083..a31de1546a 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -4,38 +4,16 @@ import fse from "fs-extra"; import readDirectoryFiles from "./lib/readDirectoryFiles"; import filterOutDirectories from "./lib/filterOutDirectories"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "./lib/constants"; -import S3ClientFactory, { S3Client } from "./lib/s3"; +import S3ClientFactory from "./lib/s3"; type UploadStaticAssetsOptions = { bucketName: string; nextConfigDir: string; }; -const uploadPublicOrStaticDirectory = async ( - s3: S3Client, - directory: "public" | "static", - nextConfigDir: string -): Promise[]> => { - const files = await readDirectoryFiles(path.join(nextConfigDir, directory)); - - return files.filter(filterOutDirectories).map(fileItem => - s3.uploadFile({ - filePath: fileItem.path, - s3Key: path.posix.relative(path.resolve(nextConfigDir), fileItem.path) - }) - ); -}; - -const filePathToS3Key = (filePath: string): string => { - const relevantFilePathPart = filePath.substring( - filePath.indexOf(".next" + path.sep) - ); - return relevantFilePathPart.replace(".next", "_next"); -}; - const uploadStaticAssets = async ( options: UploadStaticAssetsOptions -): Promise => { +): Promise => { const { bucketName, nextConfigDir } = options; const s3 = S3ClientFactory({ @@ -55,7 +33,9 @@ const uploadStaticAssets = async ( const nextBuildFileUploads = buildStaticFiles .filter(filterOutDirectories) .map(async fileItem => { - const s3Key = filePathToS3Key(fileItem.path); + const s3Key = path + .relative(path.resolve(nextConfigDir), fileItem.path) + .replace(/^.next/, "_next"); return s3.uploadFile({ s3Key, @@ -77,22 +57,29 @@ const uploadStaticAssets = async ( ); return s3.uploadFile({ - s3Key: `static-pages/${relativePageFilePath.replace(/^pages\//, "")}`, + s3Key: `static-pages/${(relativePageFilePath as string).replace( + /^pages\//, + "" + )}`, filePath: pageFilePath }); }); - const publicDirUploads = await uploadPublicOrStaticDirectory( - s3, - "public", - nextConfigDir - ); + const uploadPublicOrStaticDirectory = async ( + directory: "public" | "static" + ): Promise[]> => { + const files = await readDirectoryFiles(path.join(nextConfigDir, directory)); - const staticDirUploads = await uploadPublicOrStaticDirectory( - s3, - "static", - nextConfigDir - ); + return files.filter(filterOutDirectories).map(fileItem => + s3.uploadFile({ + filePath: fileItem.path, + s3Key: path.posix.relative(path.resolve(nextConfigDir), fileItem.path) + }) + ); + }; + + const publicDirUploads = await uploadPublicOrStaticDirectory("public"); + const staticDirUploads = await uploadPublicOrStaticDirectory("static"); const allUploads = [ ...nextBuildFileUploads, diff --git a/packages/s3-static-assets/tests/.gitignore b/packages/s3-static-assets/tests/.gitignore new file mode 100644 index 0000000000..8163ecc3f6 --- /dev/null +++ b/packages/s3-static-assets/tests/.gitignore @@ -0,0 +1 @@ +!fixtures/**/* diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/BUILD_ID b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/BUILD_ID new file mode 100644 index 0000000000..0543324046 --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/BUILD_ID @@ -0,0 +1 @@ +a_test_build_id diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages-manifest.json b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages-manifest.json new file mode 100644 index 0000000000..b5c611993a --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages-manifest.json @@ -0,0 +1,4 @@ +{ + "/todos/terms": "pages/todos/terms.html", + "/todos/terms/[section]": "pages/todos/terms/[section].html" +} diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms.html b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms/[section].html b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/serverless/pages/todos/terms/[section].html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/css/one.css b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/css/one.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/two.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/a_test_build_id/two.js new file mode 100644 index 0000000000..e69de29bb2 From 117176c6699f50e9443852a406b358485ea25a9f Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 18:40:00 +0100 Subject: [PATCH 08/24] update monorepo deps --- package-lock.json | 863 ++++++++++------------------------------------ package.json | 3 - 2 files changed, 177 insertions(+), 689 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bc5451cbf..ceca824ddf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,521 +66,6 @@ "cross-fetch": "3.0.4" } }, - "@aws-sdk/abort-controller": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-0.1.0-preview.7.tgz", - "integrity": "sha512-UpAa0PQ4u1UdDYPU9ajO/vzfmSn3rTMjXQjlsd0Ue4oK/A2lffNN28+egMVuS+Ivs96pv1HAfA4t4tPw+U6wjA==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/apply-body-checksum-middleware": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/apply-body-checksum-middleware/-/apply-body-checksum-middleware-0.1.0-preview.8.tgz", - "integrity": "sha512-UoK128Kum26NYuOfnG1vVjfFfYBy7m8bIkBYlORwrGYLHawUwaxan8MTCrk4P/XSlYm0NsyAicAVDvAeGWSZXA==", - "requires": { - "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/bucket-endpoint-middleware": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/bucket-endpoint-middleware/-/bucket-endpoint-middleware-0.1.0-preview.7.tgz", - "integrity": "sha512-XUrR/fKADNTXgW5wfp0U2K2WD+4NiY/njne7rR0YTNZHE0eWD0q0YvRx4LXj6HFraAUqZ8liPG2k/BjzdT8M0Q==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/client-s3-node": { - "version": "0.1.0-preview.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-node/-/client-s3-node-0.1.0-preview.2.tgz", - "integrity": "sha512-sQj8KnijskzIijl/ETJpoygcN4o0AKBtZtXp6eiJjhLZf1RAX33Bd1QzSgScfElY/XVAMgntzWWvBm8VhUu+cQ==", - "requires": { - "@aws-sdk/apply-body-checksum-middleware": "^0.1.0-preview.4", - "@aws-sdk/bucket-endpoint-middleware": "^0.1.0-preview.4", - "@aws-sdk/config-resolver": "^0.1.0-preview.4", - "@aws-sdk/core-handler": "^0.1.0-preview.4", - "@aws-sdk/credential-provider-node": "^0.1.0-preview.5", - "@aws-sdk/hash-node": "^0.1.0-preview.4", - "@aws-sdk/hash-stream-node": "^0.1.0-preview.5", - "@aws-sdk/location-constraint-middleware": "^0.1.0-preview.4", - "@aws-sdk/middleware-content-length": "^0.1.0-preview.4", - "@aws-sdk/middleware-expect-continue": "^0.1.0-preview.4", - "@aws-sdk/middleware-header-default": "^0.1.0-preview.4", - "@aws-sdk/middleware-serializer": "^0.1.0-preview.4", - "@aws-sdk/middleware-stack": "^0.1.0-preview.5", - "@aws-sdk/node-http-handler": "^0.1.0-preview.5", - "@aws-sdk/protocol-rest": "^0.1.0-preview.6", - "@aws-sdk/query-error-unmarshaller": "^0.1.0-preview.5", - "@aws-sdk/region-provider": "^0.1.0-preview.4", - "@aws-sdk/retry-middleware": "^0.1.0-preview.4", - "@aws-sdk/s3-error-unmarshaller": "^0.1.0-preview.2", - "@aws-sdk/signature-v4": "^0.1.0-preview.5", - "@aws-sdk/signing-middleware": "^0.1.0-preview.5", - "@aws-sdk/ssec-middleware": "^0.1.0-preview.4", - "@aws-sdk/stream-collector-node": "^0.1.0-preview.4", - "@aws-sdk/types": "^0.1.0-preview.4", - "@aws-sdk/url-parser-node": "^0.1.0-preview.4", - "@aws-sdk/util-base64-node": "^0.1.0-preview.2", - "@aws-sdk/util-body-length-node": "^0.1.0-preview.3", - "@aws-sdk/util-user-agent-node": "^0.1.0-preview.5", - "@aws-sdk/util-utf8-node": "^0.1.0-preview.2", - "@aws-sdk/xml-body-builder": "^0.1.0-preview.4", - "@aws-sdk/xml-body-parser": "^0.1.0-preview.5", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/config-resolver": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-0.1.0-preview.7.tgz", - "integrity": "sha512-clP/NFkGyIJzCPPZ9y9vc4rQD2O8euuEVtYDlHNPfe+791uo43I1/qhw20v31mPY1OH0dScf5Jn/n4Ed9YO1VA==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/core-handler": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/core-handler/-/core-handler-0.1.0-preview.7.tgz", - "integrity": "sha512-F+BAYmcPGbbK2w6Y9i4RgK9f8ojUuQKoZuFCxiYoujLGoak/p81gACTz3dQyV9/NiY46EvmdpyaGQeLtpfuriQ==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-0.1.0-preview.8.tgz", - "integrity": "sha512-wW2XRalzx8jAIsVSdOM4cDP3hgbvPy6UJhQwpn9N3kfb22G5FPEry6hlJKHAVzQ15tkTNd0C6SyRlXgC5zEzmA==", - "requires": { - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-imds": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-0.1.0-preview.8.tgz", - "integrity": "sha512-l6qudUcrpfG8wGOCyOea1oZ42AF+m0h27m/BDvWA8KIclW6XjfJ0TAcQWNVYbDX91sBx3YWidqlNBuzs/bZfKw==", - "requires": { - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-0.1.0-preview.7.tgz", - "integrity": "sha512-iIVGZonHwy08RJgW9AZURKAbRTcBtwZw9wWSkO1YgtFVKYHH81E+C/k3o9ljCD9TK+XfvB2dv5alPkS71EufIQ==", - "requires": { - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "0.1.0-preview.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-0.1.0-preview.10.tgz", - "integrity": "sha512-UWw89x1kCTiawc2MWYjavChk1bwy4dlp8WZyYeM/a4MqYacXPbcIOXEDVVL72PpCOqtxk0/RXnkLO2b7sUI0vg==", - "requires": { - "@aws-sdk/credential-provider-env": "^0.1.0-preview.8", - "@aws-sdk/credential-provider-imds": "^0.1.0-preview.8", - "@aws-sdk/credential-provider-ini": "^0.1.0-preview.7", - "@aws-sdk/credential-provider-process": "^0.1.0-preview.5", - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "0.1.0-preview.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-0.1.0-preview.5.tgz", - "integrity": "sha512-OIBmuaul/aF3w3oCc1zIw+jE5tlhacrhCD/LXf0DornF8Bfp4oaYA5qJ4Lttu/Q25s2qW5+YEuFlDsnqpIQUyw==", - "requires": { - "@aws-sdk/credential-provider-ini": "^0.1.0-preview.7", - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/hash-node": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-0.1.0-preview.8.tgz", - "integrity": "sha512-tYBKE5ggAfw7oCLj3/jVJomruUMXhFOL+yH7xnKbgEjCi2m/jsSClCwjUbco2d5eFeC75t74RsFuyCREm9o+nw==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/hash-stream-node": { - "version": "0.1.0-preview.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-0.1.0-preview.9.tgz", - "integrity": "sha512-XV8vQgwrDV7VGoL94ry/HZsaw4wA6NDKynpsctr4yQfgWy3hunrMunngnIs3jybBlkyCuhmw2SssjEjSugpvFg==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/is-array-buffer": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-0.1.0-preview.3.tgz", - "integrity": "sha512-8SM7kBGkwH6JCKA6K1w4Jrj+EABFOPQkbPvwaf6BILYiUMUbgJvjOPjNQE2MrvRxJz50WAcZDHnlwhstuwIRnw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/is-iterable": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-iterable/-/is-iterable-0.1.0-preview.3.tgz", - "integrity": "sha512-dmqXKd7BlAGAaOz1dvmBw5MeOy/94LOxIRv4i8I76JPyTJsxFKjzJIHeRMnQ/5WJ3/POhmb6ZjBW/GwS/upaFw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/location-constraint-middleware": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/location-constraint-middleware/-/location-constraint-middleware-0.1.0-preview.7.tgz", - "integrity": "sha512-K7EZ77oSVqyrTDZKJ8OQ7m1/EAEoRFUknE0HsiTRImhRHqxPhR+sP6brWU+gdywgYbDVaXJox30GUMNAOqhs9Q==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-content-length": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-0.1.0-preview.7.tgz", - "integrity": "sha512-6ZI+dY8VgWmKL48tBtFGFgllwdhKgqNztscLtYPmHl38zrz4sITJnyGwbYDGLW+xLIGDOQhyFd/6kWTqT9QyKQ==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-expect-continue": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-0.1.0-preview.8.tgz", - "integrity": "sha512-+aWGX+pwNys/a2ysFOdjmyP0iSSrmaJO2JkcvO8wjaJ6CLFqjnP7W9YN5HSEr8C+AGHN4z3Pg+W4xLNWCyzjZg==", - "requires": { - "@aws-sdk/middleware-header-default": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-header-default": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-0.1.0-preview.7.tgz", - "integrity": "sha512-hf7+YMiPnyzRKzmcZZ5v2NKkC6CKgo8nnckJ1A1OlvWYGq3hLMF1gKDMzdkEFjWJmDWv6AVNyHjw5qe4AV8LVA==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-serializer": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serializer/-/middleware-serializer-0.1.0-preview.7.tgz", - "integrity": "sha512-mc5xBnrdDM9k3a78cbTSw+VWTadpDQQBObSuAy4fCxrkPZa+APqRY+y9MMDQ0uWI80e6Ab1pt9wTx1/OM1uMWQ==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/middleware-stack": { - "version": "0.1.0-preview.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-0.1.0-preview.9.tgz", - "integrity": "sha512-UZPTIUL8df6bxhoRFmbE278mR5VkBgUakZ+g0+W7QP7yk7yOcA/PSNAoUQMXmyncTfrv9PS2RqByIqBGJ9nHRw==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/node-http-handler": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-0.1.0-preview.8.tgz", - "integrity": "sha512-D3hISgch64L2rG8RQDi361ywoSgsyH/5Yj4ZF05ZCo8UZ8TjU1CtiLPKy1is0XLqojhLlDAQ65lNna44xoArcw==", - "requires": { - "@aws-sdk/abort-controller": "^0.1.0-preview.7", - "@aws-sdk/querystring-builder": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/property-provider": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-0.1.0-preview.7.tgz", - "integrity": "sha512-8yKkR78XC3fvdd+ePohfLuZHKBL7e3k+t82JL775phiXO94WHiz/hlvm6tGhNz5zKzz72yLrJPCyoQAZLrxrTg==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/protocol-rest": { - "version": "0.1.0-preview.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-rest/-/protocol-rest-0.1.0-preview.10.tgz", - "integrity": "sha512-wzQV8h+rxWOOKkpwZpgx/glPz2mrH3nGZG7JyqxzEdveRmCMKSS27tqTc2XGlf8x1lGfTBZVg3XTWYrPTBHvlw==", - "requires": { - "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", - "@aws-sdk/is-iterable": "^0.1.0-preview.3", - "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", - "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.8", - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/util-error-constructor": "^0.1.0-preview.7", - "@aws-sdk/util-uri-escape": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/protocol-timestamp": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-timestamp/-/protocol-timestamp-0.1.0-preview.7.tgz", - "integrity": "sha512-ObO202v456/S6Ckhlu844KBXN9toFTPt8zzrJpESzntVXIaidDECetd120/xToycYmICinvAYH9o1E2l6VlCRQ==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/query-error-unmarshaller": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/query-error-unmarshaller/-/query-error-unmarshaller-0.1.0-preview.8.tgz", - "integrity": "sha512-41lNT9delFhOss5H3eoi/2wYLYFuVqLXutRb5ZM5VvdhE4ZG+L8oE8HM0LSwQBttQFHaZcjdx3x3n9EVatSuCw==", - "requires": { - "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.8", - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/util-error-constructor": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/querystring-builder": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-0.1.0-preview.7.tgz", - "integrity": "sha512-U2d9CYTwnF4/Qc8XXFmCdRzcApTmwEXLyHUcjK2/GaOHKkHDAeIC94+cuP+H3nDjCjb3TdKV2xrl/wzuP0YBrg==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/util-uri-escape": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/querystring-parser": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-0.1.0-preview.7.tgz", - "integrity": "sha512-r72E/wZYrhTXTK950Ld/L2Loso/HDqExQkIuCn1Pu8Rx0+uC3Y8fQTx+JZd5M5kOniCpGKdHWGc7y/bH/tjH4A==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/region-provider": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-provider/-/region-provider-0.1.0-preview.7.tgz", - "integrity": "sha512-n+LeuQYPYbCyfCboz9mmYqcPPKdmdd60KPbPeRqSdJYr9QZz9hWU962oCOl5EtLYIsUzy7Fm33APv6toEcAPVw==", - "requires": { - "@aws-sdk/property-provider": "^0.1.0-preview.7", - "@aws-sdk/shared-ini-file-loader": "^0.1.0-preview.3", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/response-metadata-extractor": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/response-metadata-extractor/-/response-metadata-extractor-0.1.0-preview.8.tgz", - "integrity": "sha512-c5aJGYDiEwWqYpsROCqrmR60d0yeVdvRtzMptcpCI95BvIizS3hTc+PfuOq3Gcz7L+EQysbzQyqZutCJ/zLbew==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/retry-middleware": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/retry-middleware/-/retry-middleware-0.1.0-preview.7.tgz", - "integrity": "sha512-ULiq+dffOPurjyHm95PYWi1Cy27LQg9jPwLz5tiL7oIla/j9b5bcclZE3n0RtqbHDUvWJL5kxmYw0Kjrggr5iw==", - "requires": { - "@aws-sdk/service-error-classification": "^0.1.0-preview.3", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/s3-error-unmarshaller": { - "version": "0.1.0-preview.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-error-unmarshaller/-/s3-error-unmarshaller-0.1.0-preview.2.tgz", - "integrity": "sha512-3A6FUzFwGe34+1l8daxXaiTymZmb1LvVXNM+aapfJqRCM80vfbTEf+pzefIHCJAOhTCaSyhtkrs07iOpj3L1nw==", - "requires": { - "@aws-sdk/response-metadata-extractor": "^0.1.0-preview.5", - "@aws-sdk/types": "^0.1.0-preview.4", - "@aws-sdk/util-error-constructor": "^0.1.0-preview.4", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/service-error-classification": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-0.1.0-preview.3.tgz", - "integrity": "sha512-3TXwADJL+HGOWyqdwx+pOdwr8L8LGbdxwHR0D05PP3skY+TP34F3ye2DJlyCll4S9vYzf9GlSbwJWviN9Sujrw==" - }, - "@aws-sdk/shared-ini-file-loader": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-0.1.0-preview.3.tgz", - "integrity": "sha512-1wuV2YpZm+sW4AZa7CBD3A3b7+vSHX0DWBgGaENYdqC+MUEl6lD57ZOUGLryPq5xv/tQfy8BC7QT+qDNHElcuw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/signature-v4": { - "version": "0.1.0-preview.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-0.1.0-preview.10.tgz", - "integrity": "sha512-cehCmWlWc16d1mn1tdG1cLdLUiKWHSVSAIiDRCyUS/ryZNduFHivYMyARvuQKEBXILlQari0e6RRuzTFXaAjlA==", - "requires": { - "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", - "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/util-hex-encoding": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/signing-middleware": { - "version": "0.1.0-preview.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/signing-middleware/-/signing-middleware-0.1.0-preview.10.tgz", - "integrity": "sha512-aKyPNr41JuOhl3QGqGp+XSerwPRbkG/TzBHiNsRX/0EeB1ZyxZ2cckhssswL3k4lvEBPQS0SqnGi2FHXozyOvw==", - "requires": { - "@aws-sdk/signature-v4": "^0.1.0-preview.10", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/ssec-middleware": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/ssec-middleware/-/ssec-middleware-0.1.0-preview.8.tgz", - "integrity": "sha512-vDxnda94Wp2M1RXQXPJYedDwNt9sAN2j+N6QvDpwOZ2G2qEVLOvkPPTEz2GwzU6dTQY3HSd/Psomz+9OeamWtA==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/stream-collector-node": { - "version": "0.1.0-preview.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/stream-collector-node/-/stream-collector-node-0.1.0-preview.9.tgz", - "integrity": "sha512-aXVMbx9lMd+AsmTpn4egsIJ/ZAkd6cWkhv8y3sL/Fwlyl0U7tfV4EzTEDZFvAta+MG+wB8fPhz9d7bfyQOk/xQ==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/types": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-0.1.0-preview.7.tgz", - "integrity": "sha512-gpyU8N9XEs8diE4uW9B6/hjKDrB/c4a1GF4ICwkaGYpXrbJy9QLrEU8Hk4rC6P1l++YYyJKMl7RjMmTyBtNOzw==" - }, - "@aws-sdk/url-parser-node": { - "version": "0.1.0-preview.8", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser-node/-/url-parser-node-0.1.0-preview.8.tgz", - "integrity": "sha512-h8YwL+mLTBPNzryREkLChhtRSdz70tOR9y/UB6PATGKoJbMUFoTsDY1jbJ4WWBfdKjphZy9xVWTyxoCkP07tQQ==", - "requires": { - "@aws-sdk/querystring-parser": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-base64-node": { - "version": "0.1.0-preview.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-0.1.0-preview.4.tgz", - "integrity": "sha512-L9O3lMWB7y2xVIgg/nSJ7xZLVFmxMCk1maaup3CoL5USLqB7n7ngpf/WAH2LyhaGo8Og8TrAKt4BizpxbZU7wg==", - "requires": { - "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-body-length-node": { - "version": "0.1.0-preview.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-0.1.0-preview.5.tgz", - "integrity": "sha512-ZmqB7E/RizTe8ajxLyXdshoyzQg47CAkbnCK7yRE4A9N7XMEUgzyFVXuKT08DmbAwYSYWI5jaUwm3jpMKqG+bw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-buffer-from": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-0.1.0-preview.3.tgz", - "integrity": "sha512-n78cUmI1SbluJgTgyqp24GgNQ3A5NUGB4rwRAoID7k7JpsiNJUWTXkijl3hxfNov2sEjMWvdQIGvAF6F/Q2mfw==", - "requires": { - "@aws-sdk/is-array-buffer": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-error-constructor": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-error-constructor/-/util-error-constructor-0.1.0-preview.7.tgz", - "integrity": "sha512-sb8gruiOadl0YXG2yn0EMBkB/Oy/7y4mt8Wfl7G3crvWXcHtD7flbW7wjbFiMcQU91vi5sTaZ56hwvDA9lu0ug==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-hex-encoding": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-0.1.0-preview.3.tgz", - "integrity": "sha512-X/Qq5e2H4/EQ0WEwWUiSxGbFARk7IKZpa+E4pzQm49sxS2omVsvuphcr4yYJq4SZKEtuB2w2nHMr7NmGlWt4Xg==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-uri-escape": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-0.1.0-preview.3.tgz", - "integrity": "sha512-axArIOq8+2PKjY9Fz+LKfCY127rjWQD50F1DAhCC0BV3mrG0OlhcQ8uKaNfMXVrveTqT+QYvrpTsrziHYjjTQw==", - "requires": { - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "0.1.0-preview.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-0.1.0-preview.10.tgz", - "integrity": "sha512-hYL9XCLkxDEG60XbwXG2fvIYwi9vFHw9Em6OPMz3sh3Y4er7KJxOwuCYJV+kccREY35e1TGblbOARFczwD7U0w==", - "requires": { - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/util-utf8-node": { - "version": "0.1.0-preview.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-0.1.0-preview.4.tgz", - "integrity": "sha512-FxIWpC4LdKiJgJgiaLWMdZY/DbreSIRgVGO9cOlV5fI59KdN+2Aqb6sLnlp7yVbo2hiL0Hlcv7fcf4MEtELn0g==", - "requires": { - "@aws-sdk/util-buffer-from": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/xml-body-builder": { - "version": "0.1.0-preview.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-body-builder/-/xml-body-builder-0.1.0-preview.7.tgz", - "integrity": "sha512-4LNn5CONVhIWq3+wUWwfsSOncs9Ges8NKD9cf6pTN/VaqBcVGiFo3L0PoHLk143RTBxIsqmkY2VhVlNl5XsQSA==", - "requires": { - "@aws-sdk/is-iterable": "^0.1.0-preview.3", - "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "@aws-sdk/xml-builder": "^0.1.0-preview.3", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/xml-body-parser": { - "version": "0.1.0-preview.9", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-body-parser/-/xml-body-parser-0.1.0-preview.9.tgz", - "integrity": "sha512-MdRXPxuK27258zlPmfSFgLZ5ljTC7AvMq+J8Hkr6/s4iFeQJjzxXHCmRJ7r/9maUQ0LV8VXDw6khxIQdHKMWAA==", - "requires": { - "@aws-sdk/protocol-timestamp": "^0.1.0-preview.7", - "@aws-sdk/types": "^0.1.0-preview.7", - "tslib": "^1.8.0" - } - }, - "@aws-sdk/xml-builder": { - "version": "0.1.0-preview.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-0.1.0-preview.3.tgz", - "integrity": "sha512-TwahSQDyO0yjiY2GXSDw2f4FP6lgj8LaR/MtmjAHZeP6M8dw5ma08R2pLI5CV+paNIACnnnmRuSW2Dmj0c/jOQ==", - "requires": { - "tslib": "^1.8.0" - } - }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -4007,7 +3492,7 @@ "integrity": "sha512-565LsU74rDQQJAN6y8dTJpDNktqGGs2EvafXXEX021F+YlN3fIJebXRASN2Mgj4XWmzY7DbqC3v2wXF9j3LsGg==", "dev": true, "requires": { - "@serverless/utils-china": "^0.1.6", + "@serverless/utils-china": "^0.1.7", "adm-zip": "^0.4.13", "axios": "^0.19.2", "dotenv": "^8.2.0", @@ -4021,6 +3506,23 @@ "ws": "^7.2.1" }, "dependencies": { + "@serverless/utils-china": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-0.1.7.tgz", + "integrity": "sha512-xpsokLjRK7PQtoNuA+1LxZ4whLlmAuJvtv9m9ARYtMaZhJkmlHD8cEh9Y0/uTcvzcA+pWtxRSHQ92TonpXqVow==", + "dev": true, + "requires": { + "@tencent-sdk/capi": "^0.2.15-alpha.0", + "dijkstrajs": "^1.0.1", + "dot-qs": "0.2.0", + "duplexify": "^4.1.1", + "end-of-stream": "^1.4.4", + "https-proxy-agent": "^5.0.0", + "socket.io-client": "^2.3.0", + "socket.io-stream": "^0.9.1", + "winston": "^3.2.1" + } + }, "agent-base": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", @@ -4030,6 +3532,18 @@ "debug": "4" } }, + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "dev": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -4039,6 +3553,17 @@ "agent-base": "6", "debug": "4" } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } } } }, @@ -4120,67 +3645,6 @@ "traverse": "^0.6.6" } }, - "@serverless/utils-china": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-0.1.6.tgz", - "integrity": "sha512-BPaKkRJ47yKTIqRkwF62V5Z/SGdNDmNtinu3fK4988CG1gXBVG2yb3Cq34A98B4BAwZdKzxKCV2n9q4dl1zolw==", - "dev": true, - "requires": { - "@tencent-sdk/capi": "^0.2.15-alpha.0", - "dijkstrajs": "^1.0.1", - "dot-qs": "0.2.0", - "duplexify": "^4.1.1", - "end-of-stream": "^1.4.4", - "https-proxy-agent": "^5.0.0", - "socket.io-client": "^2.3.0", - "socket.io-stream": "^0.9.1", - "winston": "^3.2.1" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", - "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -4746,15 +4210,6 @@ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, - "@types/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", @@ -5687,11 +5142,6 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -10556,33 +10006,6 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, - "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "dependencies": { - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - } - } - }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -11381,7 +10804,8 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true }, "graceful-readlink": { "version": "1.0.1", @@ -21423,7 +20847,8 @@ "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true }, "tsutils": { "version": "3.17.1", @@ -22237,25 +21662,29 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -22265,13 +21694,15 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { @@ -22281,37 +21712,43 @@ }, "chownr": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { @@ -22320,25 +21757,29 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, "requires": { @@ -22347,13 +21788,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -22369,7 +21812,8 @@ }, "glob": { "version": "7.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, "requires": { @@ -22383,13 +21827,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": false, + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { @@ -22398,7 +21844,8 @@ }, "ignore-walk": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, "requires": { @@ -22407,7 +21854,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -22417,19 +21865,22 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { @@ -22438,13 +21889,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { @@ -22453,13 +21906,15 @@ }, "minimist": { "version": "1.2.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -22469,7 +21924,8 @@ }, "minizlib": { "version": "1.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, "requires": { @@ -22478,7 +21934,8 @@ }, "mkdirp": { "version": "0.5.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "optional": true, "requires": { @@ -22487,13 +21944,15 @@ }, "ms": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", "dev": true, "optional": true, "requires": { @@ -22504,7 +21963,8 @@ }, "node-pre-gyp": { "version": "0.14.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, "requires": { @@ -22522,7 +21982,8 @@ }, "nopt": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "optional": true, "requires": { @@ -22532,7 +21993,8 @@ }, "npm-bundled": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, "requires": { @@ -22541,13 +22003,15 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "optional": true, "requires": { @@ -22558,7 +22022,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -22570,19 +22035,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { @@ -22591,19 +22059,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -22613,19 +22084,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { @@ -22637,7 +22111,8 @@ }, "readable-stream": { "version": "2.3.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "optional": true, "requires": { @@ -22652,7 +22127,8 @@ }, "rimraf": { "version": "2.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, "requires": { @@ -22661,43 +22137,50 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { @@ -22708,7 +22191,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -22717,7 +22201,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { @@ -22726,13 +22211,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "bundled": true, + "resolved": false, + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { @@ -22747,13 +22234,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { @@ -22762,13 +22251,15 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true } diff --git a/package.json b/package.json index 95085b5c23..acfad473db 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "devDependencies": { "@babel/preset-typescript": "^7.9.0", "@sls-next/lambda-at-edge": "file:packages/lambda-at-edge", - "@types/fs-extra": "^8.1.0", "@types/jest": "^25.2.1", "@typescript-eslint/eslint-plugin": "^2.28.0", "@typescript-eslint/parser": "^2.28.0", @@ -85,8 +84,6 @@ ] }, "dependencies": { - "@aws-sdk/client-s3-node": "0.1.0-preview.2", - "fs-extra": "^9.0.0", "opencollective-postinstall": "^2.0.2" }, "collective": { From c6a00d7095db1f850901bbb787840dcb50135fc8 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 18:42:30 +0100 Subject: [PATCH 09/24] update deps --- packages/s3-static-assets/package-lock.json | 39 +++++++++++++++++++++ packages/s3-static-assets/package.json | 7 ++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/packages/s3-static-assets/package-lock.json b/packages/s3-static-assets/package-lock.json index fc3191e9d8..d9462ce32f 100644 --- a/packages/s3-static-assets/package-lock.json +++ b/packages/s3-static-assets/package-lock.json @@ -4,6 +4,15 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/klaw": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.1.tgz", @@ -25,6 +34,11 @@ "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "aws-sdk": { "version": "2.664.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.664.0.tgz", @@ -61,6 +75,17 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -81,6 +106,15 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, "klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -117,6 +151,11 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", diff --git a/packages/s3-static-assets/package.json b/packages/s3-static-assets/package.json index d652a20711..8ebe50acbb 100644 --- a/packages/s3-static-assets/package.json +++ b/packages/s3-static-assets/package.json @@ -4,10 +4,7 @@ "description": "Handles upload to S3 of next.js static assets", "main": "dist/index.js", "directories": { - "test": "tests" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "dist": "dist" }, "repository": { "type": "git", @@ -28,10 +25,12 @@ "homepage": "https://github.com/danielcondemarin/serverless-next.js#readme", "dependencies": { "aws-sdk": "^2.664.0", + "fs-extra": "^9.0.0", "klaw": "^3.0.0", "mime-types": "^2.1.27" }, "devDependencies": { + "@types/fs-extra": "^8.1.0", "@types/klaw": "^3.0.1", "@types/mime-types": "^2.1.0" } From 9ff3e8ca54b5a5959d95ce1853da326d543f1e96 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 19:04:31 +0100 Subject: [PATCH 10/24] test for credentials --- packages/s3-static-assets/src/index.ts | 6 ++++-- packages/s3-static-assets/src/lib/s3.ts | 14 ++++++++++++-- .../s3-static-assets/tests/upload-assets.test.ts | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index a31de1546a..4d480c23f8 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -4,11 +4,12 @@ import fse from "fs-extra"; import readDirectoryFiles from "./lib/readDirectoryFiles"; import filterOutDirectories from "./lib/filterOutDirectories"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "./lib/constants"; -import S3ClientFactory from "./lib/s3"; +import S3ClientFactory, { Credentials } from "./lib/s3"; type UploadStaticAssetsOptions = { bucketName: string; nextConfigDir: string; + credentials: Credentials; }; const uploadStaticAssets = async ( @@ -17,7 +18,8 @@ const uploadStaticAssets = async ( const { bucketName, nextConfigDir } = options; const s3 = S3ClientFactory({ - bucketName + bucketName, + credentials: options.credentials }); const dotNextDirectory = path.join(nextConfigDir, ".next"); diff --git a/packages/s3-static-assets/src/lib/s3.ts b/packages/s3-static-assets/src/lib/s3.ts index 6a325eed6a..41d1ca7557 100644 --- a/packages/s3-static-assets/src/lib/s3.ts +++ b/packages/s3-static-assets/src/lib/s3.ts @@ -4,6 +4,7 @@ import AWS from "aws-sdk"; type S3ClientFactoryOptions = { bucketName: string; + credentials: Credentials; }; type UploadFileOptions = { @@ -18,8 +19,17 @@ export type S3Client = { ) => Promise; }; -export default ({ bucketName }: S3ClientFactoryOptions): S3Client => { - const s3 = new AWS.S3(); +export type Credentials = { + accessKeyId: string; + secretAccessKey: string; + sessionToken?: string; +}; + +export default ({ + bucketName, + credentials +}: S3ClientFactoryOptions): S3Client => { + const s3 = new AWS.S3({ ...credentials }); return { uploadFile: async ( diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 3faf92b819..b330a8845c 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,3 +1,4 @@ +import AWS from "aws-sdk"; import path from "path"; import uploadStaticAssets from "../src/index"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/lib/constants"; @@ -11,7 +12,20 @@ describe("Upload assets tests", () => { beforeEach(async () => { await uploadStaticAssets({ bucketName: "test-bucket-name", - nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app") + nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app"), + credentials: { + accessKeyId: "fake-access-key", + secretAccessKey: "fake-secret-key", + sessionToken: "fake-session-token" + } + }); + }); + + it("passes credentials to S3 client", () => { + expect(AWS.S3).toBeCalledWith({ + accessKeyId: "fake-access-key", + secretAccessKey: "fake-secret-key", + sessionToken: "fake-session-token" }); }); From 5e474775f1d2eccaaac44687a20c53d7d4b07192 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 22:03:24 +0100 Subject: [PATCH 11/24] handle bucket acceleration --- .../s3-static-assets/__mocks__/aws-sdk.ts | 14 +++- packages/s3-static-assets/src/index.ts | 2 +- packages/s3-static-assets/src/lib/s3.ts | 22 +++++- .../tests/upload-assets.test.ts | 78 ++++++++++++++----- packages/s3-static-assets/tsconfig.json | 1 + 5 files changed, 93 insertions(+), 24 deletions(-) diff --git a/packages/s3-static-assets/__mocks__/aws-sdk.ts b/packages/s3-static-assets/__mocks__/aws-sdk.ts index f287efd074..131a3f75d4 100644 --- a/packages/s3-static-assets/__mocks__/aws-sdk.ts +++ b/packages/s3-static-assets/__mocks__/aws-sdk.ts @@ -1,14 +1,26 @@ +declare module "aws-sdk" { + const mockUpload: jest.Mock; + const mockGetBucketAccelerateConfiguration: jest.Mock; +} + const promisifyMock = (mockFn: jest.Mock): jest.Mock => { const promise = jest.fn(); mockFn.mockReturnValue({ promise }); return promise; }; +export const mockGetBucketAccelerateConfiguration = jest.fn(); export const mockUpload = jest.fn(); export const mockUploadPromise = promisifyMock(mockUpload); +export const mockGetBucketAccelerateConfigurationPromise = promisifyMock( + mockGetBucketAccelerateConfiguration +).mockImplementation(() => ({ + Status: "Suspended" +})); const MockS3 = jest.fn(() => ({ - upload: mockUpload + upload: mockUpload, + getBucketAccelerateConfiguration: mockGetBucketAccelerateConfiguration })); export default { diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 4d480c23f8..4abc5a61d9 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -17,7 +17,7 @@ const uploadStaticAssets = async ( ): Promise => { const { bucketName, nextConfigDir } = options; - const s3 = S3ClientFactory({ + const s3 = await S3ClientFactory({ bucketName, credentials: options.credentials }); diff --git a/packages/s3-static-assets/src/lib/s3.ts b/packages/s3-static-assets/src/lib/s3.ts index 41d1ca7557..fa2479467d 100644 --- a/packages/s3-static-assets/src/lib/s3.ts +++ b/packages/s3-static-assets/src/lib/s3.ts @@ -25,11 +25,27 @@ export type Credentials = { sessionToken?: string; }; -export default ({ +export default async ({ bucketName, credentials -}: S3ClientFactoryOptions): S3Client => { - const s3 = new AWS.S3({ ...credentials }); +}: S3ClientFactoryOptions): Promise => { + let s3 = new AWS.S3({ ...credentials }); + + try { + const { Status } = await s3 + .getBucketAccelerateConfiguration({ + Bucket: bucketName + }) + .promise(); + + if (Status === "Enabled") { + s3 = new AWS.S3({ ...credentials, useAccelerateEndpoint: true }); + } + } catch (err) { + console.warn( + "Checking for bucket acceleration failed, falling back to non-accelerated S3 client" + ); + } return { uploadFile: async ( diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index b330a8845c..05308667a7 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,27 +1,25 @@ -import AWS from "aws-sdk"; import path from "path"; import uploadStaticAssets from "../src/index"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/lib/constants"; -import { mockUpload } from "aws-sdk"; - -declare module "aws-sdk" { - const mockUpload: jest.Mock; -} - -describe("Upload assets tests", () => { - beforeEach(async () => { - await uploadStaticAssets({ - bucketName: "test-bucket-name", - nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app"), - credentials: { - accessKeyId: "fake-access-key", - secretAccessKey: "fake-secret-key", - sessionToken: "fake-session-token" - } - }); +import AWS, { mockGetBucketAccelerateConfiguration, mockUpload } from "aws-sdk"; +import { mockGetBucketAccelerateConfigurationPromise } from "../__mocks__/aws-sdk"; + +const upload = (): Promise => { + return uploadStaticAssets({ + bucketName: "test-bucket-name", + nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app"), + credentials: { + accessKeyId: "fake-access-key", + secretAccessKey: "fake-secret-key", + sessionToken: "fake-session-token" + } }); +}; + +describe("Upload tests", () => { + it("passes credentials to S3 client", async () => { + await upload(); - it("passes credentials to S3 client", () => { expect(AWS.S3).toBeCalledWith({ accessKeyId: "fake-access-key", secretAccessKey: "fake-secret-key", @@ -29,7 +27,43 @@ describe("Upload assets tests", () => { }); }); + it("uses accelerated bucket option if available", async () => { + mockGetBucketAccelerateConfigurationPromise.mockResolvedValueOnce({ + Status: "Enabled" + }); + + await upload(); + + expect(AWS.S3).toBeCalledTimes(2); + expect(AWS.S3).toBeCalledWith({ + accessKeyId: "fake-access-key", + secretAccessKey: "fake-secret-key", + sessionToken: "fake-session-token", + useAccelerateEndpoint: true + }); + expect(mockGetBucketAccelerateConfiguration).toBeCalledWith({ + Bucket: "test-bucket-name" + }); + }); + + it("falls back to non accelerated client if checking for bucket acceleration throws an error", async () => { + const warnSpy = jest.spyOn(console, "warn").mockReturnValueOnce(); + + mockGetBucketAccelerateConfigurationPromise.mockRejectedValueOnce( + new Error("Unexpected error!") + ); + + await upload(); + + expect(warnSpy).toBeCalledWith(expect.stringContaining("falling back")); + expect(AWS.S3).toBeCalledTimes(1); + + warnSpy.mockRestore(); + }); + it("uploads any contents inside build directory specified in BUILD_ID", async () => { + await upload(); + expect(mockUpload).toBeCalledWith({ Bucket: "test-bucket-name", Key: "_next/static/a_test_build_id/two.js", @@ -48,6 +82,8 @@ describe("Upload assets tests", () => { }); it("uploads prerendered HTML pages specified in pages manifest", async () => { + await upload(); + expect(mockUpload).toBeCalledWith( expect.objectContaining({ Key: "static-pages/todos/terms.html", @@ -66,6 +102,8 @@ describe("Upload assets tests", () => { }); it("uploads files in the public folder", async () => { + await upload(); + expect(mockUpload).toBeCalledWith( expect.objectContaining({ Key: "public/robots.txt", @@ -84,6 +122,8 @@ describe("Upload assets tests", () => { }); it("uploads files in the static folder", async () => { + await upload(); + expect(mockUpload).toBeCalledWith( expect.objectContaining({ Key: "static/robots.txt", diff --git a/packages/s3-static-assets/tsconfig.json b/packages/s3-static-assets/tsconfig.json index 447ac6bf6a..1b5d6d6743 100644 --- a/packages/s3-static-assets/tsconfig.json +++ b/packages/s3-static-assets/tsconfig.json @@ -1,3 +1,4 @@ +{ "compilerOptions": { "resolveJsonModule": true, "esModuleInterop": true, From b35d6e6760f7a880580aaa89586f12eb0c5434a3 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 22:16:31 +0100 Subject: [PATCH 12/24] fix windows specific issues with s3 keys not being posix --- packages/s3-static-assets/src/index.ts | 14 ++++++++------ packages/s3-static-assets/src/lib/pathToPosix.ts | 2 ++ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 packages/s3-static-assets/src/lib/pathToPosix.ts diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 4abc5a61d9..835fe7e6e9 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -5,6 +5,7 @@ import readDirectoryFiles from "./lib/readDirectoryFiles"; import filterOutDirectories from "./lib/filterOutDirectories"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "./lib/constants"; import S3ClientFactory, { Credentials } from "./lib/s3"; +import pathToPosix from "./lib/pathToPosix"; type UploadStaticAssetsOptions = { bucketName: string; @@ -35,9 +36,11 @@ const uploadStaticAssets = async ( const nextBuildFileUploads = buildStaticFiles .filter(filterOutDirectories) .map(async fileItem => { - const s3Key = path - .relative(path.resolve(nextConfigDir), fileItem.path) - .replace(/^.next/, "_next"); + const s3Key = pathToPosix( + path + .relative(path.resolve(nextConfigDir), fileItem.path) + .replace(/^.next/, "_next") + ); return s3.uploadFile({ s3Key, @@ -53,9 +56,8 @@ const uploadStaticAssets = async ( const htmlPageUploads = Object.values(pagesManifest) .filter(pageFile => (pageFile as string).endsWith(".html")) .map(relativePageFilePath => { - const pageFilePath = path.join( - dotNextDirectory, - `serverless/${relativePageFilePath}` + const pageFilePath = pathToPosix( + path.join(dotNextDirectory, `serverless/${relativePageFilePath}`) ); return s3.uploadFile({ diff --git a/packages/s3-static-assets/src/lib/pathToPosix.ts b/packages/s3-static-assets/src/lib/pathToPosix.ts new file mode 100644 index 0000000000..db9780b6bc --- /dev/null +++ b/packages/s3-static-assets/src/lib/pathToPosix.ts @@ -0,0 +1,2 @@ +const pathToPosix = (path: string): string => path.replace(/\\/g, "/"); +export default pathToPosix; From df3e09e8cbbcc7a8ea907087a646534290071f95 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 22:23:42 +0100 Subject: [PATCH 13/24] move console warn spy to be / ae --- .../tests/upload-assets.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 05308667a7..8c6dc415e7 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -17,6 +17,16 @@ const upload = (): Promise => { }; describe("Upload tests", () => { + let consoleWarnSpy: jest.SpyInstance; + + beforeEach(() => { + consoleWarnSpy = jest.spyOn(console, "warn").mockReturnValue(); + }); + + afterEach(() => { + consoleWarnSpy.mockRestore(); + }); + it("passes credentials to S3 client", async () => { await upload(); @@ -47,18 +57,16 @@ describe("Upload tests", () => { }); it("falls back to non accelerated client if checking for bucket acceleration throws an error", async () => { - const warnSpy = jest.spyOn(console, "warn").mockReturnValueOnce(); - mockGetBucketAccelerateConfigurationPromise.mockRejectedValueOnce( new Error("Unexpected error!") ); await upload(); - expect(warnSpy).toBeCalledWith(expect.stringContaining("falling back")); + expect(consoleWarnSpy).toBeCalledWith( + expect.stringContaining("falling back") + ); expect(AWS.S3).toBeCalledTimes(1); - - warnSpy.mockRestore(); }); it("uploads any contents inside build directory specified in BUILD_ID", async () => { From 63ef13094e8442855139cea71c3bd643c6c6406c Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 22:25:24 +0100 Subject: [PATCH 14/24] add a bit more info to warn --- packages/s3-static-assets/src/lib/s3.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/s3-static-assets/src/lib/s3.ts b/packages/s3-static-assets/src/lib/s3.ts index fa2479467d..e541f4fe41 100644 --- a/packages/s3-static-assets/src/lib/s3.ts +++ b/packages/s3-static-assets/src/lib/s3.ts @@ -43,7 +43,7 @@ export default async ({ } } catch (err) { console.warn( - "Checking for bucket acceleration failed, falling back to non-accelerated S3 client" + `Checking for bucket acceleration failed, falling back to non-accelerated S3 client. Err: ${err.message}` ); } From 8e57a2e6d910c951b874a870ace635aea1826fed Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 22:29:08 +0100 Subject: [PATCH 15/24] add build scripts --- packages/s3-static-assets/package.json | 4 ++++ packages/s3-static-assets/tsconfig.build.json | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 packages/s3-static-assets/tsconfig.build.json diff --git a/packages/s3-static-assets/package.json b/packages/s3-static-assets/package.json index 8ebe50acbb..c4d187f14d 100644 --- a/packages/s3-static-assets/package.json +++ b/packages/s3-static-assets/package.json @@ -11,6 +11,10 @@ "url": "git+https://github.com/danielcondemarin/serverless-next.js.git", "directory": "packages/s3-static-assets" }, + "scripts": { + "prepare": "npm run build", + "build": "tsc -p tsconfig.build.json" + }, "keywords": [ "AWS", "S3", diff --git a/packages/s3-static-assets/tsconfig.build.json b/packages/s3-static-assets/tsconfig.build.json new file mode 100644 index 0000000000..e72163e6d4 --- /dev/null +++ b/packages/s3-static-assets/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "sourceMap": false, + "removeComments": true + }, + "include": ["./src/"] +} From a8fef99fb3c468d16dc74affd51192d521659f39 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sat, 2 May 2020 23:55:05 +0100 Subject: [PATCH 16/24] fix issue around aws sdk manual mocks --- .../{__mocks__/aws-sdk.ts => tests/aws-sdk.mock.ts} | 1 + .../s3-static-assets/tests/upload-assets.test.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) rename packages/s3-static-assets/{__mocks__/aws-sdk.ts => tests/aws-sdk.mock.ts} (92%) diff --git a/packages/s3-static-assets/__mocks__/aws-sdk.ts b/packages/s3-static-assets/tests/aws-sdk.mock.ts similarity index 92% rename from packages/s3-static-assets/__mocks__/aws-sdk.ts rename to packages/s3-static-assets/tests/aws-sdk.mock.ts index 131a3f75d4..7c1c6197c6 100644 --- a/packages/s3-static-assets/__mocks__/aws-sdk.ts +++ b/packages/s3-static-assets/tests/aws-sdk.mock.ts @@ -1,6 +1,7 @@ declare module "aws-sdk" { const mockUpload: jest.Mock; const mockGetBucketAccelerateConfiguration: jest.Mock; + const mockGetBucketAccelerateConfigurationPromise: jest.Mock; } const promisifyMock = (mockFn: jest.Mock): jest.Mock => { diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 8c6dc415e7..41e3826d34 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -1,8 +1,16 @@ import path from "path"; import uploadStaticAssets from "../src/index"; import { IMMUTABLE_CACHE_CONTROL_HEADER } from "../src/lib/constants"; -import AWS, { mockGetBucketAccelerateConfiguration, mockUpload } from "aws-sdk"; -import { mockGetBucketAccelerateConfigurationPromise } from "../__mocks__/aws-sdk"; +import AWS, { + mockGetBucketAccelerateConfigurationPromise, + mockGetBucketAccelerateConfiguration, + mockUpload +} from "aws-sdk"; + +// unfortunately can't use __mocks__ because aws-sdk is being mocked in other +// packages in the monorepo +// https://github.com/facebook/jest/issues/2070 +jest.mock("aws-sdk", () => require("./aws-sdk.mock")); const upload = (): Promise => { return uploadStaticAssets({ From 7f94c4b6865c09dab5a0b033ebcc92c7f62aaffb Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 00:14:33 +0100 Subject: [PATCH 17/24] missing posix fix --- packages/s3-static-assets/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 835fe7e6e9..123c6da5aa 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -77,7 +77,10 @@ const uploadStaticAssets = async ( return files.filter(filterOutDirectories).map(fileItem => s3.uploadFile({ filePath: fileItem.path, - s3Key: path.posix.relative(path.resolve(nextConfigDir), fileItem.path) + s3Key: path.posix.relative( + path.posix.resolve(nextConfigDir), + fileItem.path + ) }) ); }; From 4027b18c2a31ebf84bc2d856f567f7eda4f469ef Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 00:26:37 +0100 Subject: [PATCH 18/24] fix windows specific issues with s3 keys not being posix (2) --- packages/s3-static-assets/src/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 123c6da5aa..a2d42108a9 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -77,9 +77,8 @@ const uploadStaticAssets = async ( return files.filter(filterOutDirectories).map(fileItem => s3.uploadFile({ filePath: fileItem.path, - s3Key: path.posix.relative( - path.posix.resolve(nextConfigDir), - fileItem.path + s3Key: pathToPosix( + path.relative(path.resolve(nextConfigDir), fileItem.path) ) }) ); From 2b74304dd5d669caed399221e9cd7de0f4fbb0bc Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 10:58:56 +0100 Subject: [PATCH 19/24] use new s3 upload package in serverless component --- package-lock.json | 1797 ++++++++--------- packages/lambda-at-edge/package-lock.json | 6 + packages/lambda-at-edge/package.json | 3 +- packages/s3-static-assets/dist/index.d.ts | 9 + packages/s3-static-assets/dist/index.js | 76 + .../s3-static-assets/dist/lib/constants.d.ts | 1 + .../s3-static-assets/dist/lib/constants.js | 3 + .../dist/lib/filterOutDirectories.d.ts | 3 + .../dist/lib/filterOutDirectories.js | 3 + .../dist/lib/getMimeType.d.ts | 2 + .../s3-static-assets/dist/lib/getMimeType.js | 8 + .../dist/lib/pathToPosix.d.ts | 2 + .../s3-static-assets/dist/lib/pathToPosix.js | 4 + .../dist/lib/readDirectoryFiles.d.ts | 3 + .../dist/lib/readDirectoryFiles.js | 18 + packages/s3-static-assets/dist/lib/s3.d.ts | 20 + packages/s3-static-assets/dist/lib/s3.js | 48 + packages/s3-static-assets/package-lock.json | 6 + packages/s3-static-assets/package.json | 4 +- packages/s3-static-assets/src/index.ts | 8 +- .../fixtures/app-no-public-dir/.next/BUILD_ID | 1 + .../.next/serverless/pages-manifest.json | 4 + .../.next/serverless/pages/todos}/terms.html | 0 .../pages/todos/terms/[section].html} | 0 .../.next/static/a_test_build_id/css/one.css} | 0 .../.next/static/a_test_build_id/two.js} | 0 .../static/static/a_test_build_id/css/one.css | 0 .../static/static/a_test_build_id/two.js | 0 .../tests/upload-assets.test.ts | 8 +- .../__tests__/assets.test.js | 103 - .../__tests__/custom-inputs.test.js | 9 + .../__tests__/deploy.test.js | 4 + .../.next/serverless/pages-manifest.json | 14 - .../fixtures/generic-fixture/.next/BUILD_ID | 1 + .../.next/static/test-build-id/placeholder.js | 0 .../fixtures/simple-app/.next/BUILD_ID | 1 + .../.next/serverless/pages/blog/[post].html | 0 .../.next/static/test-build-id/placeholder.js | 0 .../serverless-component/package-lock.json | 377 +++- packages/serverless-component/package.json | 1 + packages/serverless-component/serverless.js | 61 +- 41 files changed, 1487 insertions(+), 1121 deletions(-) create mode 100644 packages/s3-static-assets/dist/index.d.ts create mode 100644 packages/s3-static-assets/dist/index.js create mode 100644 packages/s3-static-assets/dist/lib/constants.d.ts create mode 100644 packages/s3-static-assets/dist/lib/constants.js create mode 100644 packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts create mode 100644 packages/s3-static-assets/dist/lib/filterOutDirectories.js create mode 100644 packages/s3-static-assets/dist/lib/getMimeType.d.ts create mode 100644 packages/s3-static-assets/dist/lib/getMimeType.js create mode 100644 packages/s3-static-assets/dist/lib/pathToPosix.d.ts create mode 100644 packages/s3-static-assets/dist/lib/pathToPosix.js create mode 100644 packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts create mode 100644 packages/s3-static-assets/dist/lib/readDirectoryFiles.js create mode 100644 packages/s3-static-assets/dist/lib/s3.d.ts create mode 100644 packages/s3-static-assets/dist/lib/s3.js create mode 100644 packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/BUILD_ID create mode 100644 packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages-manifest.json rename packages/{serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages => s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos}/terms.html (100%) rename packages/{serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/about.html => s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos/terms/[section].html} (100%) rename packages/{serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/blog.js => s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/css/one.css} (100%) rename packages/{serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/customers/[post].js => s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/two.js} (100%) create mode 100644 packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/css/one.css create mode 100644 packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/two.js delete mode 100644 packages/serverless-component/__tests__/assets.test.js delete mode 100644 packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages-manifest.json create mode 100644 packages/serverless-component/__tests__/fixtures/generic-fixture/.next/BUILD_ID create mode 100644 packages/serverless-component/__tests__/fixtures/generic-fixture/.next/static/test-build-id/placeholder.js create mode 100644 packages/serverless-component/__tests__/fixtures/simple-app/.next/BUILD_ID create mode 100644 packages/serverless-component/__tests__/fixtures/simple-app/.next/serverless/pages/blog/[post].html create mode 100644 packages/serverless-component/__tests__/fixtures/simple-app/.next/static/test-build-id/placeholder.js diff --git a/package-lock.json b/package-lock.json index ceca824ddf..a2e6d9acb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,19 +76,19 @@ } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", + "@babel/generator": "^7.9.6", "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -108,12 +108,12 @@ } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", "dev": true, "requires": { - "@babel/types": "^7.9.5", + "@babel/types": "^7.9.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -160,16 +160,16 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.5.tgz", - "integrity": "sha512-IipaxGaQmW4TfWoXdqjY0TzoXQ1HRS0kPpEgvjosb3u7Uedcq297xFqDQiCcQtRRwzIMif+N1MLVI8C5a4/PAA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz", + "integrity": "sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow==", "dev": true, "requires": { "@babel/helper-function-name": "^7.9.5", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-replace-supers": "^7.9.6", "@babel/helper-split-export-declaration": "^7.8.3" } }, @@ -305,15 +305,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/helper-simple-access": { @@ -354,14 +354,14 @@ } }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" } }, "@babel/highlight": { @@ -376,9 +376,9 @@ } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -759,14 +759,14 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", - "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz", + "integrity": "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { @@ -782,15 +782,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", - "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz", + "integrity": "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.8.3", "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { @@ -977,12 +977,12 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", - "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz", + "integrity": "sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-create-class-features-plugin": "^7.9.6", "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-typescript": "^7.8.3" } @@ -1121,26 +1121,26 @@ } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", + "@babel/generator": "^7.9.6", "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.5", @@ -1303,15 +1303,15 @@ "dev": true }, "@jest/console": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", - "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-message-util": "^25.4.0", - "jest-util": "^25.4.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" }, "dependencies": { @@ -1368,33 +1368,33 @@ } }, "@jest/core": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", - "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", + "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/reporters": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/reporters": "^25.5.1", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.4.0", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^25.5.0", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-resolve-dependencies": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", - "jest-watcher": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-resolve-dependencies": "^25.5.4", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "jest-watcher": "^25.5.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", @@ -1474,53 +1474,65 @@ } }, "@jest/environment": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.4.0.tgz", - "integrity": "sha512-KDctiak4mu7b4J6BIoN/+LUL3pscBzoUCP+EtSPd2tK9fqyDY5OF+CmkBywkFWezS9tyH5ACOQNtpjtueEDH6Q==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" } }, "@jest/fake-timers": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.4.0.tgz", - "integrity": "sha512-lI9z+VOmVX4dPPFzyj0vm+UtaB8dCJJ852lcDnY0uCPRvZAaVGnMwBBc1wxtf+h7Vz6KszoOvKAt4QijDnHDkg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "lolex": "^5.0.0" } }, + "@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + } + }, "@jest/reporters": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", - "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", + "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", + "graceful-fs": "^4.2.4", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "jest-haste-map": "^25.5.1", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -1588,13 +1600,13 @@ } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { @@ -1607,45 +1619,46 @@ } }, "@jest/test-result": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", - "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.4.0.tgz", - "integrity": "sha512-240cI+nsM3attx2bMp9uGjjHrwrpvxxrZi8Tyqp/cfOzl98oZXVakXBgxODGyBYAy/UGXPKXLvNc2GaqItrsJg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-runner": "^25.4.0", - "jest-runtime": "^25.4.0" + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" } }, "@jest/transform": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", - "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.4.0", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", @@ -1713,9 +1726,9 @@ } }, "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -2065,19 +2078,6 @@ "npmlog": "^4.1.2", "pify": "^4.0.1", "semver": "^6.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/create": { @@ -2106,17 +2106,6 @@ "whatwg-url": "^7.0.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -2134,19 +2123,6 @@ "@zkochan/cmd-shim": "^3.1.0", "fs-extra": "^8.1.0", "npmlog": "^4.1.2" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/describe-ref": { @@ -2228,19 +2204,6 @@ "fs-extra": "^8.1.0", "ssri": "^6.0.1", "tar": "^4.4.8" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/github-client": { @@ -2297,19 +2260,6 @@ "dedent": "^0.7.0", "fs-extra": "^8.1.0", "p-map-series": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/info": { @@ -2334,19 +2284,6 @@ "fs-extra": "^8.1.0", "p-map": "^2.1.0", "write-json-file": "^3.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/link": { @@ -2441,19 +2378,6 @@ "npmlog": "^4.1.2", "signal-exit": "^3.0.2", "write-pkg": "^3.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/npm-publish": { @@ -2471,19 +2395,6 @@ "npmlog": "^4.1.2", "pify": "^4.0.1", "read-package-json": "^2.0.13" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/npm-run-script": { @@ -2575,19 +2486,6 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "upath": "^1.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/project": { @@ -2767,19 +2665,6 @@ "p-map": "^2.1.0", "p-pipe": "^1.2.0", "semver": "^6.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/pulse-till-done": { @@ -2810,19 +2695,6 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "read-cmd-shim": "^1.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/rimraf-dir": { @@ -2895,19 +2767,6 @@ "@lerna/package": "3.16.0", "fs-extra": "^8.1.0", "p-map": "^2.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/symlink-dependencies": { @@ -2923,19 +2782,6 @@ "p-finally": "^1.0.0", "p-map": "^2.1.0", "p-map-series": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "@lerna/timer": { @@ -3028,6 +2874,12 @@ "glob-to-regexp": "^0.3.0" } }, + "@next/react-refresh-utils": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-9.3.6.tgz", + "integrity": "sha512-XgxPc3WAkNpzD9xYtN4bd3wpV39WhnHYSwXGovVVcImXY6yn1as6hDgwkbuLADY/SHLIu2AI6CTVq0JDoTC/+g==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -3228,9 +3080,9 @@ } }, "@octokit/types": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.11.1.tgz", - "integrity": "sha512-QaLoLkmFdfoNbk3eOzPv7vKrUY0nRJIYmZDoz/pTer4ICpqu80aSQTVHnnUxEFuURCiidig76CcxUOYC/bY3RQ==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.12.2.tgz", + "integrity": "sha512-1GHLI/Jll3j6F0GbYyZPFTcHZMGjAiRfkTEoRUyaVVk2IWbDdwEiClAJvXzfXCDayuGSNCqAUH8lpjZtqW9GDw==", "dev": true, "requires": { "@types/node": ">= 8" @@ -3291,13 +3143,13 @@ } }, "@serverless/enterprise-plugin": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-3.6.6.tgz", - "integrity": "sha512-ZkzHp8WVOQv2opdXSYES39uorZV3m61+QDPK5W2PtV6InddYlYNTVuhH8vIynNYFrK8tZ95ZjpPi0BQkQ8q2EQ==", + "version": "3.6.9", + "resolved": "https://registry.npmjs.org/@serverless/enterprise-plugin/-/enterprise-plugin-3.6.9.tgz", + "integrity": "sha512-ZiZlRbqGerqMuR/OmrJTjDzuccfpdS6YV+VbKu+DM/9tEA9z87n7VrtjZ320C0V20wC+vFNnHl2EE26lCePyxg==", "dev": true, "requires": { "@serverless/event-mocks": "^1.1.1", - "@serverless/platform-client": "^0.24.0", + "@serverless/platform-client": "^0.25.6", "@serverless/platform-sdk": "^2.3.0", "chalk": "^2.4.2", "child-process-ext": "^2.1.0", @@ -3324,55 +3176,6 @@ "update-notifier": "^2.5.0", "uuid": "^3.4.0", "yamljs": "^0.3.0" - }, - "dependencies": { - "@serverless/platform-client": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-0.24.0.tgz", - "integrity": "sha512-ppxR5wONzzxNSmt/9agfSzC0F4yrkHZWAR5IPLm4yj+dMxb+768XrbqBU6vnOfCcmjb89OX5Bk0GvyQh+T5gLw==", - "dev": true, - "requires": { - "adm-zip": "^0.4.13", - "axios": "^0.19.2", - "https-proxy-agent": "^5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.13.1", - "jwt-decode": "^2.2.0", - "querystring": "^0.2.0", - "traverse": "^0.6.6", - "ws": "^7.2.1" - } - }, - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - } } }, "@serverless/event-mocks": { @@ -3449,9 +3252,9 @@ } }, "@serverless/platform-client": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-0.25.5.tgz", - "integrity": "sha512-29JV8XpJPTUSWgDwxhvZZ9fi9/5jCn1x5IeT+xEiEkpuXZU79wXlSfMfc8XtptOsDouZnOhBpKEZrItGp67CFw==", + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-0.25.7.tgz", + "integrity": "sha512-ZOKgT49qQPGjv0tDN46INO0gkc5syL2y5t0pau5ljQPtQpJzHrUL87xRlDj3BD+4Y9QFZV1UXXNsOQZsyCBsPw==", "dev": true, "requires": { "adm-zip": "^0.4.13", @@ -3460,6 +3263,7 @@ "isomorphic-ws": "^4.0.1", "js-yaml": "^3.13.1", "jwt-decode": "^2.2.0", + "minimatch": "^3.0.4", "querystring": "^0.2.0", "traverse": "^0.6.6", "ws": "^7.2.1" @@ -3487,9 +3291,9 @@ } }, "@serverless/platform-client-china": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-1.0.6.tgz", - "integrity": "sha512-565LsU74rDQQJAN6y8dTJpDNktqGGs2EvafXXEX021F+YlN3fIJebXRASN2Mgj4XWmzY7DbqC3v2wXF9j3LsGg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-1.0.9.tgz", + "integrity": "sha512-P2OXDa3S9meOOGJm2i4/d/9HlEjg8FwwfWl4Vq7jjJlA12cJaJnXy/mKgx16eA/YSYNtfW7i4NGyeADvIGNzmg==", "dev": true, "requires": { "@serverless/utils-china": "^0.1.7", @@ -3500,29 +3304,13 @@ "isomorphic-ws": "^4.0.1", "js-yaml": "^3.13.1", "jwt-decode": "^2.2.0", + "minimatch": "^3.0.4", "querystring": "^0.2.0", "traverse": "^0.6.6", "urlencode": "^1.1.0", "ws": "^7.2.1" }, "dependencies": { - "@serverless/utils-china": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-0.1.7.tgz", - "integrity": "sha512-xpsokLjRK7PQtoNuA+1LxZ4whLlmAuJvtv9m9ARYtMaZhJkmlHD8cEh9Y0/uTcvzcA+pWtxRSHQ92TonpXqVow==", - "dev": true, - "requires": { - "@tencent-sdk/capi": "^0.2.15-alpha.0", - "dijkstrajs": "^1.0.1", - "dot-qs": "0.2.0", - "duplexify": "^4.1.1", - "end-of-stream": "^1.4.4", - "https-proxy-agent": "^5.0.0", - "socket.io-client": "^2.3.0", - "socket.io-stream": "^0.9.1", - "winston": "^3.2.1" - } - }, "agent-base": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", @@ -3532,18 +3320,6 @@ "debug": "4" } }, - "duplexify": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", - "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", - "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -3553,17 +3329,6 @@ "agent-base": "6", "debug": "4" } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } } } }, @@ -3605,6 +3370,12 @@ "debug": "4" } }, + "is-docker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", + "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", + "dev": true + }, "ramda": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", @@ -3645,6 +3416,67 @@ "traverse": "^0.6.6" } }, + "@serverless/utils-china": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-0.1.7.tgz", + "integrity": "sha512-xpsokLjRK7PQtoNuA+1LxZ4whLlmAuJvtv9m9ARYtMaZhJkmlHD8cEh9Y0/uTcvzcA+pWtxRSHQ92TonpXqVow==", + "dev": true, + "requires": { + "@tencent-sdk/capi": "^0.2.15-alpha.0", + "dijkstrajs": "^1.0.1", + "dot-qs": "0.2.0", + "duplexify": "^4.1.1", + "end-of-stream": "^1.4.4", + "https-proxy-agent": "^5.0.0", + "socket.io-client": "^2.3.0", + "socket.io-stream": "^0.9.1", + "winston": "^3.2.1" + }, + "dependencies": { + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "dev": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -4184,9 +4016,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.10.tgz", - "integrity": "sha512-74fNdUGrWsgIB/V9kTO5FGHPWYY6Eqn+3Z7L6Hc4e/BxjYV7puvBqp5HwsVYYfLm6iURYBNCx4Ut37OF9yitCw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -4221,6 +4053,15 @@ "@types/node": "*" } }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -4275,9 +4116,9 @@ "dev": true }, "@types/node": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.0.tgz", - "integrity": "sha512-WE4IOAC6r/yBZss1oQGM5zs2D7RuKR6Q+w+X2SouPofnWn+LbCqClRyhO3ZE7Ix8nmFgo/oVuuE01cJT2XB13A==", + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", "dev": true }, "@types/normalize-package-data": { @@ -4320,45 +4161,45 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.28.0.tgz", - "integrity": "sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.30.0.tgz", + "integrity": "sha512-PGejii0qIZ9Q40RB2jIHyUpRWs1GJuHP1pkoCiaeicfwO9z7Fx03NQzupuyzAmv+q9/gFNHu7lo1ByMXe8PNyg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.28.0", + "@typescript-eslint/experimental-utils": "2.30.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.28.0.tgz", - "integrity": "sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.30.0.tgz", + "integrity": "sha512-L3/tS9t+hAHksy8xuorhOzhdefN0ERPDWmR9CclsIGOUqGKy6tqc/P+SoXeJRye5gazkuPO0cK9MQRnolykzkA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.28.0", + "@typescript-eslint/typescript-estree": "2.30.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.28.0.tgz", - "integrity": "sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.30.0.tgz", + "integrity": "sha512-9kDOxzp0K85UnpmPJqUzdWaCNorYYgk1yZmf4IKzpeTlSAclnFsrLjfwD9mQExctLoLoGAUXq1co+fbr+3HeFw==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.28.0", - "@typescript-eslint/typescript-estree": "2.28.0", + "@typescript-eslint/experimental-utils": "2.30.0", + "@typescript-eslint/typescript-estree": "2.30.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.28.0.tgz", - "integrity": "sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.30.0.tgz", + "integrity": "sha512-nI5WOechrA0qAhnr+DzqwmqHsx7Ulr/+0H7bWCcClDhhWkSyZR5BmTvnBEyONwJCTWHfc5PAQExX24VD26IAVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -5155,9 +4996,9 @@ "dev": true }, "aws-sdk": { - "version": "2.663.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.663.0.tgz", - "integrity": "sha512-xPOszNOaSXTRs8VGXaMbhTKXdlq2TlDRfFRVEGxkZrtow87hEIVZGAUSUme2e3GHqHUDnySwcufrUpUPUizOKQ==", + "version": "2.668.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.668.0.tgz", + "integrity": "sha512-mmZJmeenNM9hRR4k+JAStBhYFym2+VCPTRWv0Vn2oqqXIaIaNVdNf9xag/WMG8b8M80R3XXfVHKmDPST0/EfHA==", "dev": true, "requires": { "buffer": "4.9.1", @@ -5305,17 +5146,18 @@ } }, "babel-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.4.0.tgz", - "integrity": "sha512-p+epx4K0ypmHuCnd8BapfyOwWwosNCYhedetQey1awddtfmEX0MmdxctGl956uwUmjwXR5VSS5xJcGX9DvdIog==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", "dev": true, "requires": { - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.4.0", + "babel-preset-jest": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" }, "dependencies": { @@ -5372,9 +5214,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { "object.assign": "^4.1.0" @@ -5394,11 +5236,13 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.4.0.tgz", - "integrity": "sha512-M3a10JCtTyKevb0MjuH6tU+cP/NVQZ82QPADqI1RQYY1OphztsCeIeQmTsHmF/NS6m0E51Zl4QNsI3odXSQF5w==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", "@types/babel__traverse": "^7.0.6" } }, @@ -5443,12 +5287,12 @@ } }, "babel-preset-jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.4.0.tgz", - "integrity": "sha512-PwFiEWflHdu3JCeTr0Pb9NcHHE34qWFnPQRVPvqQITx4CsDCzs6o05923I10XvLvn9nNsRHuiVgB72wG/90ZHQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.4.0", + "babel-plugin-jest-hoist": "^25.5.0", "babel-preset-current-node-syntax": "^0.1.2" } }, @@ -5611,6 +5455,12 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "dev": true + }, "boom": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", @@ -6131,9 +5981,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001043", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001043.tgz", - "integrity": "sha512-MrBDRPJPDBYwACtSQvxg9+fkna5jPXhJlKmuxenl/ml9uf8LHKlDmLpElu+zTW/bEz7lC1m0wTDD7jiIB+hgFg==", + "version": "1.0.30001048", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", + "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==", "dev": true }, "capture-exit": { @@ -6267,9 +6117,9 @@ } }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -6279,7 +6129,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.4.0" } }, "chownr": { @@ -7213,6 +7063,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true + }, "core-js-compat": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", @@ -7224,13 +7080,13 @@ }, "dependencies": { "browserslist": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", - "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001038", - "electron-to-chromium": "^1.3.390", + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", "node-releases": "^1.1.53", "pkg-up": "^2.0.0" } @@ -7290,16 +7146,16 @@ } }, "coveralls": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.11.tgz", - "integrity": "sha512-LZPWPR2NyGKyaABnc49dR0fpeP6UqhvGq4B5nUrTQ1UBy55z96+ga7r+/ChMdMJUwBgyJDXBi88UBgz2rs9IiQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", "dev": true, "requires": { "js-yaml": "^3.13.1", "lcov-parse": "^1.0.0", "log-driver": "^1.2.7", "minimist": "^1.2.5", - "request": "^2.88.0" + "request": "^2.88.2" } }, "crc": { @@ -7481,9 +7337,9 @@ } }, "css-loader": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.3.0.tgz", - "integrity": "sha512-x9Y1vvHe5RR+4tzwFdWExPueK00uqFTCw7mZy+9aE/X1SKWOArm5luaOrtJ4d05IpOwJ6S86b/tVcIdhw1Bu4A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", + "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -7491,13 +7347,14 @@ "icss-utils": "^4.1.1", "loader-utils": "^1.2.3", "normalize-path": "^3.0.0", - "postcss": "^7.0.23", + "postcss": "^7.0.27", "postcss-modules-extract-imports": "^2.0.0", "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.1", + "postcss-modules-scope": "^2.2.0", "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.2", - "schema-utils": "^2.6.0" + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.6", + "semver": "^6.3.0" }, "dependencies": { "json5": { @@ -7699,9 +7556,9 @@ "dev": true }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" @@ -7776,9 +7633,9 @@ "dev": true }, "dayjs": { - "version": "1.8.24", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.24.tgz", - "integrity": "sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw==", + "version": "1.8.26", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.26.tgz", + "integrity": "sha512-KqtAuIfdNfZR5sJY1Dixr2Is4ZvcCqhb0dZpCOt5dGEFiMzoIbjkTSzUb4QKTCsP+WNpGwUjAFIZrnZvUxxkhw==", "dev": true }, "debug": { @@ -8119,6 +7976,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, "detective-amd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.0.0.tgz", @@ -8581,9 +8444,9 @@ } }, "electron-to-chromium": { - "version": "1.3.413", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.413.tgz", - "integrity": "sha512-Jm1Rrd3siqYHO3jftZwDljL2LYQafj3Kki5r+udqE58d0i91SkjItVJ5RwlJn9yko8i7MOcoidVKjQlgSdd1hg==", + "version": "1.3.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", + "integrity": "sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A==", "dev": true }, "elliptic": { @@ -8731,9 +8594,9 @@ "dev": true }, "envinfo": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", - "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==", "dev": true }, "err-code": { @@ -8801,6 +8664,12 @@ "next-tick": "~1.0.0" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -8974,9 +8843,9 @@ } }, "eslint-config-prettier": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", - "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -9197,16 +9066,16 @@ } }, "expect": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.4.0.tgz", - "integrity": "sha512-7BDIX99BTi12/sNGJXA9KMRcby4iAmu1xccBOhyKCyEhjcVKS3hPmHdA/4nSI9QGIOkUropKqr3vv7WMDM5lvQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6" }, "dependencies": { @@ -10006,6 +9875,17 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -10034,18 +9914,18 @@ "dev": true }, "fs2": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.7.tgz", - "integrity": "sha512-fwfd9MBI/fnXtR/ClVTyeuPXJ+oI5WNyXvBQPmc4btgqLYTKOuBRTRUVjmVpDUri0C88HLwMlc5ESg48fEAGjw==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.8.tgz", + "integrity": "sha512-HxOTRiFS3PqwAOmlp1mTwLA+xhQBdaP82b5aBamc/rHKFVyn4qL8YpngaAleD52PNMzBm6TsGOoU/Hq+bAfBhA==", "dev": true, "requires": { "d": "^1.0.1", "deferred": "^0.7.11", - "es5-ext": "^0.10.51", + "es5-ext": "^0.10.53", "event-emitter": "^0.3.5", "ignore": "^5.1.4", "memoizee": "^0.4.14", - "type": "^1.2.0" + "type": "^2.0.0" }, "dependencies": { "ignore": { @@ -10053,13 +9933,19 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true + }, + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true } } }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, @@ -10734,6 +10620,29 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global-agent": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", + "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "dev": true, + "requires": { + "boolean": "^3.0.0", + "core-js": "^3.6.4", + "es6-error": "^4.1.1", + "matcher": "^2.1.0", + "roarr": "^2.15.2", + "semver": "^7.1.2", + "serialize-error": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -10749,6 +10658,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", @@ -10802,9 +10720,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "graceful-readlink": { @@ -11109,13 +11027,27 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "hash.js": { @@ -11755,9 +11687,9 @@ "dev": true }, "is-docker": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", - "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", "dev": true }, "is-extendable": { @@ -11864,9 +11796,9 @@ } }, "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, "is-redirect": { @@ -11975,10 +11907,13 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -12139,14 +12074,14 @@ "dev": true }, "jest": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", - "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.5.4.tgz", + "integrity": "sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==", "dev": true, "requires": { - "@jest/core": "^25.4.0", + "@jest/core": "^25.5.4", "import-local": "^3.0.2", - "jest-cli": "^25.4.0" + "jest-cli": "^25.5.4" }, "dependencies": { "ansi-styles": { @@ -12191,21 +12126,22 @@ "dev": true }, "jest-cli": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", - "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", + "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", "dev": true, "requires": { - "@jest/core": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/core": "^25.5.4", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-config": "^25.5.4", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "prompts": "^2.0.1", "realpath-native": "^2.0.0", "yargs": "^15.3.1" @@ -12223,12 +12159,12 @@ } }, "jest-changed-files": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.4.0.tgz", - "integrity": "sha512-VR/rfJsEs4BVMkwOTuStRyS630fidFVekdw/lBaBQjx9KK3VZFOZ2c0fsom2fRp8pMCrCTP6LGna00o/DXGlqA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "execa": "^3.2.0", "throat": "^5.0.0" }, @@ -12325,28 +12261,29 @@ } }, "jest-config": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.4.0.tgz", - "integrity": "sha512-egT9aKYxMyMSQV1aqTgam0SkI5/I2P9qrKexN5r2uuM2+68ypnc+zPGmfUxK7p1UhE7dYH9SLBS7yb+TtmT1AA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.4.0", - "@jest/types": "^25.4.0", - "babel-jest": "^25.4.0", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.4.0", - "jest-environment-node": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.4.0", + "jest-jasmine2": "^25.5.4", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "micromatch": "^4.0.2", - "pretty-format": "^25.4.0", + "pretty-format": "^25.5.0", "realpath-native": "^2.0.0" }, "dependencies": { @@ -12403,15 +12340,15 @@ } }, "jest-diff": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.4.0.tgz", - "integrity": "sha512-kklLbJVXW0y8UKOWOdYhI6TH5MG6QAxrWiBMgQaPIuhj3dNFGirKCd+/xfplBXICQ7fI+3QcqHm9p9lWu1N6ug==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, "requires": { "chalk": "^3.0.0", "diff-sequences": "^25.2.6", "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" }, "dependencies": { "ansi-styles": { @@ -12476,16 +12413,16 @@ } }, "jest-each": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.4.0.tgz", - "integrity": "sha512-lwRIJ8/vQU/6vq3nnSSUw1Y3nz5tkYSFIywGCZpUBd6WcRgpn8NmJoQICojbpZmsJOJNHm0BKdyuJ6Xdx+eDQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0" + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" }, "dependencies": { "ansi-styles": { @@ -12541,30 +12478,30 @@ } }, "jest-environment-jsdom": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", - "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", "dev": true, "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.4.0.tgz", - "integrity": "sha512-wryZ18vsxEAKFH7Z74zi/y/SyI1j6UkVZ6QsllBuT/bWlahNfQjLNwFsgh/5u7O957dYFoXj4yfma4n4X6kU9A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", "dev": true, "requires": { - "@jest/environment": "^25.4.0", - "@jest/fake-timers": "^25.4.0", - "@jest/types": "^25.4.0", - "jest-mock": "^25.4.0", - "jest-util": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "semver": "^6.3.0" } }, @@ -12575,19 +12512,20 @@ "dev": true }, "jest-haste-map": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", - "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", @@ -12606,27 +12544,27 @@ } }, "jest-jasmine2": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.4.0.tgz", - "integrity": "sha512-QccxnozujVKYNEhMQ1vREiz859fPN/XklOzfQjm2j9IGytAkUbSwjFRBtQbHaNZ88cItMpw02JnHGsIdfdpwxQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.4.0", + "expect": "^25.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.4.0", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "pretty-format": "^25.4.0", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", "throat": "^5.0.0" }, "dependencies": { @@ -12683,25 +12621,25 @@ } }, "jest-leak-detector": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.4.0.tgz", - "integrity": "sha512-7Y6Bqfv2xWsB+7w44dvZuLs5SQ//fzhETgOGG7Gq3TTGFdYvAgXGwV8z159RFZ6fXiCPm/szQ90CyfVos9JIFQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", "dev": true, "requires": { "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" } }, "jest-matcher-utils": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.4.0.tgz", - "integrity": "sha512-yPMdtj7YDgXhnGbc66bowk8AkQ0YwClbbwk3Kzhn5GVDrciiCr27U4NJRbrqXbTdtxjImONITg2LiRIw650k5A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.4.0", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" }, "dependencies": { "ansi-styles": { @@ -12757,15 +12695,16 @@ } }, "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" @@ -12824,12 +12763,12 @@ } }, "jest-mock": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.4.0.tgz", - "integrity": "sha512-MdazSfcYAUjJjuVTTnusLPzE0pE4VXpOUzWdj8sbM+q6abUjm3bATVPXFqTXrxSieR8ocpvQ9v/QaQCftioQFg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.4.0" + "@jest/types": "^25.5.0" } }, "jest-pnp-resolver": { @@ -12845,18 +12784,19 @@ "dev": true }, "jest-resolve": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.4.0.tgz", - "integrity": "sha512-wOsKqVDFWUiv8BtLMCC6uAJ/pHZkfFgoBTgPtmYlsprAjkxrr2U++ZnB3l5ykBMd2O24lXvf30SMAjJIW6k2aA==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.1", "read-pkg-up": "^7.0.1", "realpath-native": "^2.0.0", - "resolve": "^1.15.1", + "resolve": "^1.17.0", "slash": "^3.0.0" }, "dependencies": { @@ -12913,39 +12853,39 @@ } }, "jest-resolve-dependencies": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz", - "integrity": "sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.4.0" + "jest-snapshot": "^25.5.1" } }, "jest-runner": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.4.0.tgz", - "integrity": "sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.4.0", - "jest-jasmine2": "^25.4.0", - "jest-leak-detector": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", - "jest-runtime": "^25.4.0", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, @@ -13003,32 +12943,33 @@ } }, "jest-runtime": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.4.0.tgz", - "integrity": "sha512-lgNJlCDULtXu9FumnwCyWlOub8iytijwsPNa30BKrSNtgoT6NUMXOPrZvsH06U6v0wgD/Igwz13nKA2wEKU2VA==", - "dev": true, - "requires": { - "@jest/console": "^25.4.0", - "@jest/environment": "^25.4.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.4.0", - "@jest/transform": "^25.4.0", - "@jest/types": "^25.4.0", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.4.0", - "jest-haste-map": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-mock": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.4.0", - "jest-snapshot": "^25.4.0", - "jest-util": "^25.4.0", - "jest-validate": "^25.4.0", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", @@ -13088,30 +13029,34 @@ } }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-snapshot": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.4.0.tgz", - "integrity": "sha512-J4CJ0X2SaGheYRZdLz9CRHn9jUknVmlks4UBeu270hPAvdsauFXOhx9SQP2JtRzhnR3cvro/9N9KP83/uvFfRg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.4.0", - "jest-diff": "^25.4.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.4.0", - "jest-message-util": "^25.4.0", - "jest-resolve": "^25.4.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.4.0", + "pretty-format": "^25.5.0", "semver": "^6.3.0" }, "dependencies": { @@ -13168,13 +13113,14 @@ } }, "jest-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.4.0.tgz", - "integrity": "sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" }, @@ -13232,17 +13178,17 @@ } }, "jest-validate": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.4.0.tgz", - "integrity": "sha512-hvjmes/EFVJSoeP1yOl8qR8mAtMR3ToBkZeXrD/ZS9VxRyWDqQ/E1C5ucMTeSmEOGLipvdlyipiGbHJ+R1MQ0g==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "camelcase": "^5.3.1", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.4.0" + "pretty-format": "^25.5.0" }, "dependencies": { "ansi-styles": { @@ -13298,16 +13244,16 @@ } }, "jest-watcher": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.4.0.tgz", - "integrity": "sha512-36IUfOSRELsKLB7k25j/wutx0aVuHFN6wO94gPNjQtQqFPa2rkOymmx9rM5EzbF3XBZZ2oqD9xbRVoYa2w86gw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", "dev": true, "requires": { - "@jest/test-result": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.4.0", + "jest-util": "^25.5.0", "string-length": "^3.1.0" }, "dependencies": { @@ -13634,9 +13580,9 @@ } }, "jest-worker": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", - "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -13857,9 +13803,9 @@ } }, "jsonata": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.2.tgz", - "integrity": "sha512-ma5F/Bs47dZfJfDZ0Dt37eIbzVBVKZIDqsZSqdCCAPNHxKn+s3+CfMA6ahVVlf8Y1hyIjXkVLFU7yv4XxRfihA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-1.8.3.tgz", + "integrity": "sha512-r6ztI6ohbpRo77AxBm6vMs3aHZi2L2PaakW7TCPwSkeGcuAZ/SxXGLWH2Npwqq5+YBM/fg/g0EXg/pI9HvXQ8Q==", "dev": true }, "jsonfile": { @@ -14505,9 +14451,9 @@ "dev": true }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -14562,6 +14508,23 @@ "object-visit": "^1.0.0" } }, + "matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -14794,18 +14757,18 @@ "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -15048,9 +15011,9 @@ } }, "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.1.tgz", + "integrity": "sha512-nRKMf9wDS4Fkyd0C9LXh2FFXinD+iwbJ5p/lh3CHitW9kZbRbJ8hCruiadiIXZVbeAqKZzqcTvHnK3mRhFjb6w==", "dev": true }, "move-concurrently": { @@ -15141,9 +15104,9 @@ } }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, "optional": true }, @@ -15230,9 +15193,9 @@ "dev": true }, "next": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/next/-/next-9.3.5.tgz", - "integrity": "sha512-vJKGUK2nMsveYZTZH5Oz9L+cDYcCsuWLUXfWJejvhdQ3jLgVhZVa+7TQ45Kt0PA1ea7jqlDUN22DtzmPFi981w==", + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/next/-/next-9.3.6.tgz", + "integrity": "sha512-b46i+qw2SYMVTOObc7GqUizt1zH1fB3T5qcOiCpl9utD7/LcWZkSxSPe7ZJtpAdFnl8V/7A58ADSvU1oxDDWug==", "dev": true, "requires": { "@ampproject/toolbox-optimizer": "2.2.0", @@ -15251,12 +15214,12 @@ "@babel/preset-react": "7.7.0", "@babel/preset-typescript": "7.7.2", "@babel/runtime": "7.7.2", - "@babel/types": "7.7.4", + "@next/react-refresh-utils": "9.3.6", "babel-plugin-syntax-jsx": "6.18.0", "babel-plugin-transform-define": "2.0.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "browserslist": "4.8.3", - "css-loader": "3.3.0", + "css-loader": "3.5.3", "find-cache-dir": "3.3.1", "fork-ts-checker-webpack-plugin": "3.1.1", "jest-worker": "24.9.0", @@ -15269,13 +15232,14 @@ "prop-types": "15.7.2", "prop-types-exact": "1.2.0", "react-is": "16.8.6", + "react-refresh": "0.8.1", "resolve-url-loader": "3.1.1", "sass-loader": "8.0.2", - "style-loader": "1.0.0", + "style-loader": "1.2.0", "styled-jsx": "3.2.5", "use-subscription": "1.1.1", "watchpack": "2.0.0-beta.13", - "webpack": "4.42.1", + "webpack": "4.43.0", "webpack-sources": "1.4.3" }, "dependencies": { @@ -15311,17 +15275,6 @@ "@babel/plugin-transform-typescript": "^7.7.2" } }, - "@babel/types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", - "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "jest-worker": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", @@ -15905,14 +15858,6 @@ "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true - } } }, "opencollective-postinstall": { @@ -17074,9 +17019,9 @@ } }, "postcss-value-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", - "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, "postcss-values-parser": { @@ -17139,12 +17084,12 @@ } }, "pretty-format": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.4.0.tgz", - "integrity": "sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -17516,6 +17461,12 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "react-refresh": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.1.tgz", + "integrity": "sha512-xZIKi49RtLUUSAZ4a4ut2xr+zr4+glOD5v0L413B55MPvlg4EQ6Ctx8PD4CmjlPGoAWmSCTmmkY59TErizNsow==", + "dev": true + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -17625,12 +17576,12 @@ } }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "realpath-native": { @@ -17687,9 +17638,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -17903,9 +17854,9 @@ } }, "resolve": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.16.1.tgz", - "integrity": "sha512-rmAglCSqWWMrrBv/XM6sW0NuRFiKViw/W4d9EbC4pt+49H8JwHy+mcGmALTEg504AUDcLTvb1T2q3E9AnmY+ig==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -18110,6 +18061,28 @@ "inherits": "^2.0.1" } }, + "roarr": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", + "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", + "dev": true, + "requires": { + "boolean": "^3.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -18117,13 +18090,10 @@ "dev": true }, "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-parallel": { "version": "1.1.9", @@ -18423,6 +18393,12 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", @@ -18446,6 +18422,15 @@ "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", "dev": true }, + "serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "dev": true, + "requires": { + "type-fest": "^0.8.0" + } + }, "serialize-javascript": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", @@ -18453,17 +18438,17 @@ "dev": true }, "serverless": { - "version": "1.67.3", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.67.3.tgz", - "integrity": "sha512-GELorbWZI0iLroPAwuHBDF7xlTAlSfhkcSjsb0CBdBgKz8EU8eqhalzl8dU+C+hOM5j/LJK/ATwaIxJXndqwCw==", + "version": "1.69.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-1.69.0.tgz", + "integrity": "sha512-af4gBZeto9JCkObSErzSXI+UcxoGNxUP4oQq7b/+QoCFa0NYjO4lCtW66MD6ONYg0YxDEukTQwzgkbD9VmunWg==", "dev": true, "requires": { "@serverless/cli": "^1.4.0", - "@serverless/components": "^2.29.0", - "@serverless/enterprise-plugin": "^3.6.3", + "@serverless/components": "^2.30.2", + "@serverless/enterprise-plugin": "^3.6.8", "archiver": "^1.3.0", "async": "^1.5.2", - "aws-sdk": "^2.655.0", + "aws-sdk": "^2.665.0", "bluebird": "^3.7.2", "boxen": "^3.2.0", "cachedir": "^2.3.0", @@ -18471,7 +18456,7 @@ "child-process-ext": "^2.1.1", "ci-info": "^1.6.0", "d": "^1.0.1", - "dayjs": "^1.8.23", + "dayjs": "^1.8.25", "decompress": "^4.2.1", "download": "^7.1.0", "essentials": "^1.1.1", @@ -18480,7 +18465,7 @@ "fs-extra": "^0.30.0", "get-stdin": "^5.0.1", "globby": "^6.1.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "https-proxy-agent": "^4.0.0", "inquirer": "^6.5.2", "is-docker": "^1.1.0", @@ -18488,11 +18473,10 @@ "js-yaml": "^3.13.1", "json-cycle": "^1.3.0", "json-refs": "^2.1.7", - "jszip": "^3.3.0", "jwt-decode": "^2.2.0", "lodash": "^4.17.15", "memoizee": "^0.4.14", - "mkdirp": "^0.5.3", + "mkdirp": "^0.5.4", "nanomatch": "^1.2.13", "ncjsm": "^4.0.1", "node-fetch": "^1.7.3", @@ -18521,14 +18505,14 @@ "dev": true }, "@serverless/components": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/@serverless/components/-/components-2.29.3.tgz", - "integrity": "sha512-Qrucf/k4QStcVLIvumGvf3oJlotxrcIswO0LnTu6WosPQHrVXy6uMTd2QF5raNMi4UTnOA86ZM//XXYkgGbDnw==", + "version": "2.30.5", + "resolved": "https://registry.npmjs.org/@serverless/components/-/components-2.30.5.tgz", + "integrity": "sha512-c/d60iqzS2NlmRGgIU0S4i6EryjXVwEWcW0bzJ04CwFDQBlvi5kSk8Q59lv0pQ5MwHk+Fw2zMnmMtBQbJxu2vw==", "dev": true, "requires": { "@serverless/inquirer": "^1.1.0", - "@serverless/platform-client": "^0.25.4", - "@serverless/platform-client-china": "^1.0.5", + "@serverless/platform-client": "^0.25.7", + "@serverless/platform-client-china": "^1.0.9", "@serverless/platform-sdk": "^2.3.0", "adm-zip": "^0.4.14", "ansi-escapes": "^4.3.1", @@ -18538,7 +18522,10 @@ "dotenv": "^8.2.0", "figures": "^3.2.0", "fs-extra": "^8.1.0", + "global-agent": "^2.1.8", "globby": "^10.0.2", + "graphlib": "^2.1.8", + "ini": "^1.3.5", "js-yaml": "^3.13.1", "minimist": "^1.2.5", "moment": "^2.24.0", @@ -18750,6 +18737,12 @@ } } }, + "is-docker": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-1.1.0.tgz", + "integrity": "sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -19390,9 +19383,9 @@ } }, "source-map-support": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.17.tgz", - "integrity": "sha512-bwdKOBZ5L0gFRh4KOxNap/J/MpvX9Yxsq9lFDx65s3o7F/NiHy7JRaGIS8MwW6tZPAq9UXE207Il0cfcb5yu/Q==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -19424,9 +19417,9 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { @@ -19860,35 +19853,13 @@ } }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.0.tgz", + "integrity": "sha512-HC8WcGnjwNrKji7HSBqFOhGNUSt7UDU/jHxT6bA83Gk+JWJBmgitWlGihc0V1w6ZvwlzcX5LJOsofZzSP7b1tQ==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" } }, "styled-jsx": { @@ -20929,9 +20900,9 @@ "dev": true }, "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.2.tgz", + "integrity": "sha512-zGVwKslUAD/EeqOrD1nQaBmXIHl1Vw371we8cvS8I6mYK9rmgX5tv8AAeJdfsQ3Kk5mGax2SVV/AizxdNGhl7Q==", "dev": true, "optional": true, "requires": { @@ -20951,9 +20922,9 @@ "dev": true }, "unbzip2-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.1.tgz", - "integrity": "sha512-sgDYfSDPMsA4Hr2/w7vOlrJBlwzmyakk1+hW8ObLvxSp0LA36LcL2XItGvOT3OSblohSdevMuT8FQjLsqyy4sA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz", + "integrity": "sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg==", "dev": true, "requires": { "buffer": "^5.2.1", @@ -21503,16 +21474,16 @@ "dev": true }, "webpack": { - "version": "4.42.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", - "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/wasm-edit": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.2.1", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", @@ -21529,7 +21500,7 @@ "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.6.1", "webpack-sources": "^1.4.1" }, "dependencies": { @@ -21662,29 +21633,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21694,15 +21661,13 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "bundled": true, "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21712,43 +21677,37 @@ }, "chownr": { "version": "1.1.4", - "resolved": false, - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "bundled": true, "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "bundled": true, "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bundled": true, "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "bundled": true, "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": false, - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21757,29 +21716,25 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "bundled": true, "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bundled": true, "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": false, - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21788,15 +21743,13 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21812,8 +21765,7 @@ }, "glob": { "version": "7.1.6", - "resolved": false, - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21827,15 +21779,13 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21844,8 +21794,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": false, - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21854,8 +21803,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21865,22 +21813,19 @@ }, "inherits": { "version": "2.0.4", - "resolved": false, - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "bundled": true, "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21889,15 +21834,13 @@ }, "isarray": { "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21906,15 +21849,13 @@ }, "minimist": { "version": "1.2.5", - "resolved": false, - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "bundled": true, "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": false, - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21924,8 +21865,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": false, - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21934,8 +21874,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": false, - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21944,15 +21883,13 @@ }, "ms": { "version": "2.1.2", - "resolved": false, - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "bundled": true, "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": false, - "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21963,8 +21900,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": false, - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21982,8 +21918,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": false, - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -21993,8 +21928,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22003,15 +21937,13 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": false, - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "bundled": true, "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": false, - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22022,8 +21954,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22035,22 +21966,19 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "bundled": true, "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22059,22 +21987,19 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22084,22 +22009,19 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "resolved": false, - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "bundled": true, "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22111,8 +22033,7 @@ }, "readable-stream": { "version": "2.3.7", - "resolved": false, - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22127,8 +22048,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": false, - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22137,50 +22057,43 @@ }, "safe-buffer": { "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "bundled": true, "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true, "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "bundled": true, "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": false, - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bundled": true, "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22191,8 +22104,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22201,8 +22113,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22211,15 +22122,13 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "bundled": true, "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": false, - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22234,15 +22143,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -22251,15 +22158,13 @@ }, "wrappy": { "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": false, - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "bundled": true, "dev": true, "optional": true } @@ -22835,9 +22740,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", "dev": true }, "xdg-basedir": { diff --git a/packages/lambda-at-edge/package-lock.json b/packages/lambda-at-edge/package-lock.json index e06cacef7b..a485e67a6e 100644 --- a/packages/lambda-at-edge/package-lock.json +++ b/packages/lambda-at-edge/package-lock.json @@ -464,6 +464,12 @@ "semver": "^6.0.0" } }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", diff --git a/packages/lambda-at-edge/package.json b/packages/lambda-at-edge/package.json index 0a47c580be..2ad9837514 100644 --- a/packages/lambda-at-edge/package.json +++ b/packages/lambda-at-edge/package.json @@ -36,7 +36,8 @@ "@types/fs-extra": "^8.1.0", "@types/node": "^13.13.0", "@types/path-to-regexp": "^1.7.0", - "ts-loader": "^7.0.0" + "ts-loader": "^7.0.0", + "typescript": "^3.8.3" }, "peerDependencies": { "next-aws-cloudfront": "file:../cloudfront-lambda@edge-compat" diff --git a/packages/s3-static-assets/dist/index.d.ts b/packages/s3-static-assets/dist/index.d.ts new file mode 100644 index 0000000000..41b3a4868f --- /dev/null +++ b/packages/s3-static-assets/dist/index.d.ts @@ -0,0 +1,9 @@ +import AWS from "aws-sdk"; +import { Credentials } from "./lib/s3"; +declare type UploadStaticAssetsOptions = { + bucketName: string; + nextConfigDir: string; + credentials: Credentials; +}; +declare const uploadStaticAssets: (options: UploadStaticAssetsOptions) => Promise; +export default uploadStaticAssets; diff --git a/packages/s3-static-assets/dist/index.js b/packages/s3-static-assets/dist/index.js new file mode 100644 index 0000000000..294730707f --- /dev/null +++ b/packages/s3-static-assets/dist/index.js @@ -0,0 +1,76 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = __importDefault(require("path")); +const fs_extra_1 = __importDefault(require("fs-extra")); +const readDirectoryFiles_1 = __importDefault(require("./lib/readDirectoryFiles")); +const filterOutDirectories_1 = __importDefault(require("./lib/filterOutDirectories")); +const constants_1 = require("./lib/constants"); +const s3_1 = __importDefault(require("./lib/s3")); +const pathToPosix_1 = __importDefault(require("./lib/pathToPosix")); +const uploadStaticAssets = (options) => __awaiter(void 0, void 0, void 0, function* () { + const { bucketName, nextConfigDir } = options; + const s3 = yield s3_1.default({ + bucketName, + credentials: options.credentials + }); + const dotNextDirectory = path_1.default.join(nextConfigDir, ".next"); + const BUILD_ID = fs_extra_1.default + .readFileSync(path_1.default.join(dotNextDirectory, "BUILD_ID")) + .toString("utf8"); + const buildStaticFiles = yield readDirectoryFiles_1.default(path_1.default.join(dotNextDirectory, "static", BUILD_ID)); + const nextBuildFileUploads = buildStaticFiles + .filter(filterOutDirectories_1.default) + .map((fileItem) => __awaiter(void 0, void 0, void 0, function* () { + const s3Key = pathToPosix_1.default(path_1.default + .relative(path_1.default.resolve(nextConfigDir), fileItem.path) + .replace(/^.next/, "_next")); + return s3.uploadFile({ + s3Key, + filePath: fileItem.path, + cacheControl: constants_1.IMMUTABLE_CACHE_CONTROL_HEADER + }); + })); + const pagesManifest = yield fs_extra_1.default.readJSON(path_1.default.join(dotNextDirectory, "serverless/pages-manifest.json")); + const htmlPageUploads = Object.values(pagesManifest) + .filter(pageFile => pageFile.endsWith(".html")) + .map(relativePageFilePath => { + const pageFilePath = pathToPosix_1.default(path_1.default.join(dotNextDirectory, `serverless/${relativePageFilePath}`)); + return s3.uploadFile({ + s3Key: `static-pages/${relativePageFilePath.replace(/^pages\//, "")}`, + filePath: pageFilePath + }); + }); + const uploadPublicOrStaticDirectory = (directory) => __awaiter(void 0, void 0, void 0, function* () { + const directoryPath = path_1.default.join(nextConfigDir, directory); + if (!(yield fs_extra_1.default.pathExists(directoryPath))) { + return Promise.resolve([]); + } + const files = yield readDirectoryFiles_1.default(directoryPath); + return files.filter(filterOutDirectories_1.default).map(fileItem => s3.uploadFile({ + filePath: fileItem.path, + s3Key: pathToPosix_1.default(path_1.default.relative(path_1.default.resolve(nextConfigDir), fileItem.path)) + })); + }); + const publicDirUploads = yield uploadPublicOrStaticDirectory("public"); + const staticDirUploads = yield uploadPublicOrStaticDirectory("static"); + const allUploads = [ + ...nextBuildFileUploads, + ...htmlPageUploads, + ...publicDirUploads, + ...staticDirUploads + ]; + return Promise.all(allUploads); +}); +exports.default = uploadStaticAssets; diff --git a/packages/s3-static-assets/dist/lib/constants.d.ts b/packages/s3-static-assets/dist/lib/constants.d.ts new file mode 100644 index 0000000000..a5209d3541 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/constants.d.ts @@ -0,0 +1 @@ +export declare const IMMUTABLE_CACHE_CONTROL_HEADER = "public, max-age=31536000, immutable"; diff --git a/packages/s3-static-assets/dist/lib/constants.js b/packages/s3-static-assets/dist/lib/constants.js new file mode 100644 index 0000000000..ab26ab934c --- /dev/null +++ b/packages/s3-static-assets/dist/lib/constants.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IMMUTABLE_CACHE_CONTROL_HEADER = "public, max-age=31536000, immutable"; diff --git a/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts b/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts new file mode 100644 index 0000000000..8b96dd4813 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts @@ -0,0 +1,3 @@ +import { Item } from "klaw"; +declare const _default: (fileItem: Item) => boolean; +export default _default; diff --git a/packages/s3-static-assets/dist/lib/filterOutDirectories.js b/packages/s3-static-assets/dist/lib/filterOutDirectories.js new file mode 100644 index 0000000000..9c4abe8f44 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/filterOutDirectories.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = (fileItem) => !fileItem.stats.isDirectory(); diff --git a/packages/s3-static-assets/dist/lib/getMimeType.d.ts b/packages/s3-static-assets/dist/lib/getMimeType.d.ts new file mode 100644 index 0000000000..b2aec94339 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/getMimeType.d.ts @@ -0,0 +1,2 @@ +declare const _default: (filePath: string) => string; +export default _default; diff --git a/packages/s3-static-assets/dist/lib/getMimeType.js b/packages/s3-static-assets/dist/lib/getMimeType.js new file mode 100644 index 0000000000..221b6c7753 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/getMimeType.js @@ -0,0 +1,8 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const mime_types_1 = __importDefault(require("mime-types")); +const path_1 = __importDefault(require("path")); +exports.default = (filePath) => mime_types_1.default.lookup(path_1.default.basename(filePath)) || "application/octet-stream"; diff --git a/packages/s3-static-assets/dist/lib/pathToPosix.d.ts b/packages/s3-static-assets/dist/lib/pathToPosix.d.ts new file mode 100644 index 0000000000..bd78f7cc04 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/pathToPosix.d.ts @@ -0,0 +1,2 @@ +declare const pathToPosix: (path: string) => string; +export default pathToPosix; diff --git a/packages/s3-static-assets/dist/lib/pathToPosix.js b/packages/s3-static-assets/dist/lib/pathToPosix.js new file mode 100644 index 0000000000..c22d3d5e73 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/pathToPosix.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const pathToPosix = (path) => path.replace(/\\/g, "/"); +exports.default = pathToPosix; diff --git a/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts b/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts new file mode 100644 index 0000000000..602176f322 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts @@ -0,0 +1,3 @@ +import klaw from "klaw"; +declare const readDirectoryFiles: (directory: string) => Promise; +export default readDirectoryFiles; diff --git a/packages/s3-static-assets/dist/lib/readDirectoryFiles.js b/packages/s3-static-assets/dist/lib/readDirectoryFiles.js new file mode 100644 index 0000000000..4e5a0520e3 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/readDirectoryFiles.js @@ -0,0 +1,18 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const klaw_1 = __importDefault(require("klaw")); +const readDirectoryFiles = (directory) => { + const items = []; + return new Promise((resolve, reject) => { + klaw_1.default(directory.trim()) + .on("data", item => items.push(item)) + .on("end", () => { + resolve(items); + }) + .on("error", reject); + }); +}; +exports.default = readDirectoryFiles; diff --git a/packages/s3-static-assets/dist/lib/s3.d.ts b/packages/s3-static-assets/dist/lib/s3.d.ts new file mode 100644 index 0000000000..a48084b4a7 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/s3.d.ts @@ -0,0 +1,20 @@ +import AWS from "aws-sdk"; +declare type S3ClientFactoryOptions = { + bucketName: string; + credentials: Credentials; +}; +declare type UploadFileOptions = { + filePath: string; + cacheControl?: string; + s3Key?: string; +}; +export declare type S3Client = { + uploadFile: (options: UploadFileOptions) => Promise; +}; +export declare type Credentials = { + accessKeyId: string; + secretAccessKey: string; + sessionToken?: string; +}; +declare const _default: ({ bucketName, credentials }: S3ClientFactoryOptions) => Promise; +export default _default; diff --git a/packages/s3-static-assets/dist/lib/s3.js b/packages/s3-static-assets/dist/lib/s3.js new file mode 100644 index 0000000000..8188415174 --- /dev/null +++ b/packages/s3-static-assets/dist/lib/s3.js @@ -0,0 +1,48 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const getMimeType_1 = __importDefault(require("./getMimeType")); +const fs_extra_1 = __importDefault(require("fs-extra")); +const aws_sdk_1 = __importDefault(require("aws-sdk")); +exports.default = ({ bucketName, credentials }) => __awaiter(void 0, void 0, void 0, function* () { + let s3 = new aws_sdk_1.default.S3(Object.assign({}, credentials)); + try { + const { Status } = yield s3 + .getBucketAccelerateConfiguration({ + Bucket: bucketName + }) + .promise(); + if (Status === "Enabled") { + s3 = new aws_sdk_1.default.S3(Object.assign(Object.assign({}, credentials), { useAccelerateEndpoint: true })); + } + } + catch (err) { + console.warn(`Checking for bucket acceleration failed, falling back to non-accelerated S3 client. Err: ${err.message}`); + } + return { + uploadFile: (options) => __awaiter(void 0, void 0, void 0, function* () { + const { filePath, cacheControl, s3Key } = options; + const fileBody = yield fs_extra_1.default.readFile(filePath); + return s3 + .upload({ + Bucket: bucketName, + Key: s3Key || filePath, + Body: fileBody, + ContentType: getMimeType_1.default(filePath), + CacheControl: cacheControl || undefined + }) + .promise(); + }) + }; +}); diff --git a/packages/s3-static-assets/package-lock.json b/packages/s3-static-assets/package-lock.json index d9462ce32f..c194b31eb5 100644 --- a/packages/s3-static-assets/package-lock.json +++ b/packages/s3-static-assets/package-lock.json @@ -151,6 +151,12 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", diff --git a/packages/s3-static-assets/package.json b/packages/s3-static-assets/package.json index c4d187f14d..7d081eda18 100644 --- a/packages/s3-static-assets/package.json +++ b/packages/s3-static-assets/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "description": "Handles upload to S3 of next.js static assets", "main": "dist/index.js", + "types": "dist/index.d.ts", "directories": { "dist": "dist" }, @@ -36,6 +37,7 @@ "devDependencies": { "@types/fs-extra": "^8.1.0", "@types/klaw": "^3.0.1", - "@types/mime-types": "^2.1.0" + "@types/mime-types": "^2.1.0", + "typescript": "^3.8.3" } } diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index a2d42108a9..04e9851d95 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -72,7 +72,13 @@ const uploadStaticAssets = async ( const uploadPublicOrStaticDirectory = async ( directory: "public" | "static" ): Promise[]> => { - const files = await readDirectoryFiles(path.join(nextConfigDir, directory)); + const directoryPath = path.join(nextConfigDir, directory); + + if (!(await fse.pathExists(directoryPath))) { + return Promise.resolve([]); + } + + const files = await readDirectoryFiles(directoryPath); return files.filter(filterOutDirectories).map(fileItem => s3.uploadFile({ diff --git a/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/BUILD_ID b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/BUILD_ID new file mode 100644 index 0000000000..0543324046 --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/BUILD_ID @@ -0,0 +1 @@ +a_test_build_id diff --git a/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages-manifest.json b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages-manifest.json new file mode 100644 index 0000000000..b5c611993a --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages-manifest.json @@ -0,0 +1,4 @@ +{ + "/todos/terms": "pages/todos/terms.html", + "/todos/terms/[section]": "pages/todos/terms/[section].html" +} diff --git a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/terms.html b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos/terms.html similarity index 100% rename from packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/terms.html rename to packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos/terms.html diff --git a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/about.html b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos/terms/[section].html similarity index 100% rename from packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/about.html rename to packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/serverless/pages/todos/terms/[section].html diff --git a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/blog.js b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/css/one.css similarity index 100% rename from packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/blog.js rename to packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/css/one.css diff --git a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/customers/[post].js b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/two.js similarity index 100% rename from packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages/customers/[post].js rename to packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/a_test_build_id/two.js diff --git a/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/css/one.css b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/css/one.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/two.js b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/static/static/a_test_build_id/two.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index 41e3826d34..a51b777f51 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -12,10 +12,10 @@ import AWS, { // https://github.com/facebook/jest/issues/2070 jest.mock("aws-sdk", () => require("./aws-sdk.mock")); -const upload = (): Promise => { +const upload = (fixture?: string): Promise => { return uploadStaticAssets({ bucketName: "test-bucket-name", - nextConfigDir: path.join(__dirname, "./fixtures/basic-next-app"), + nextConfigDir: path.join(__dirname, fixture || "./fixtures/basic-next-app"), credentials: { accessKeyId: "fake-access-key", secretAccessKey: "fake-secret-key", @@ -156,4 +156,8 @@ describe("Upload tests", () => { }) ); }); + + describe("when no public or static directory exists", () => { + it("upload does not crash", () => upload("./fixtures/app-no-public-dir")); + }); }); diff --git a/packages/serverless-component/__tests__/assets.test.js b/packages/serverless-component/__tests__/assets.test.js deleted file mode 100644 index 364c65c7cd..0000000000 --- a/packages/serverless-component/__tests__/assets.test.js +++ /dev/null @@ -1,103 +0,0 @@ -const path = require("path"); -const NextjsComponent = require("../serverless"); -const { mockS3, mockS3Upload } = require("@serverless/aws-s3"); -const { mockCloudFront } = require("@serverless/aws-cloudfront"); -const { mockLambda, mockLambdaPublish } = require("@serverless/aws-lambda"); -const { cleanupFixtureDirectory } = require("../lib/test-utils"); - -describe("Assets Tests", () => { - beforeEach(() => { - mockS3.mockResolvedValue({ - name: "bucket-xyz" - }); - mockLambda.mockResolvedValue({ - arn: "arn:aws:lambda:us-east-1:123456789012:function:my-func" - }); - mockLambdaPublish.mockResolvedValue({ - version: "v1" - }); - mockCloudFront.mockResolvedValueOnce({ - url: "https://cloudfrontdistrib.amazonaws.com" - }); - }); - - describe("When public and static directories exist", () => { - const fixturePath = path.join(__dirname, "./fixtures/simple-app"); - - beforeEach(async () => { - const tmpCwd = process.cwd(); - process.chdir(fixturePath); - - const component = new NextjsComponent(); - await component.default(); - - process.chdir(tmpCwd); - }); - - afterAll(cleanupFixtureDirectory(fixturePath)); - - it("uploads client build assets", () => { - expect(mockS3Upload).toBeCalledWith({ - dir: path.join(fixturePath, ".next/static"), - cacheControl: "public, max-age=31536000, immutable", - keyPrefix: "_next/static" - }); - }); - - it("uploads user static directory", () => { - expect(mockS3Upload).toBeCalledWith({ - dir: path.join(fixturePath, "static"), - keyPrefix: "static" - }); - }); - - it("uploads user public directory", () => { - expect(mockS3Upload).toBeCalledWith({ - dir: path.join(fixturePath, "public"), - keyPrefix: "public" - }); - }); - - it("uploads html pages to S3", () => { - ["terms.html", "about.html"].forEach(page => { - expect(mockS3Upload).toBeCalledWith({ - file: path.join(fixturePath, ".next/serverless/pages", page), - key: `static-pages/${page}` - }); - }); - }); - }); - - describe("When public and static directories do not exist", () => { - const fixturePath = path.join( - __dirname, - "./fixtures/app-with-no-static-or-public-directory" - ); - - beforeEach(async () => { - const tmpCwd = process.cwd(); - process.chdir(fixturePath); - - const component = new NextjsComponent(); - await component.default(); - - process.chdir(tmpCwd); - }); - - afterAll(cleanupFixtureDirectory(fixturePath)); - - it("does not upload user static directory", () => { - expect(mockS3Upload).not.toBeCalledWith({ - dir: "./static", - keyPrefix: "static" - }); - }); - - it("does not upload user public directory", () => { - expect(mockS3Upload).not.toBeCalledWith({ - dir: "./public", - keyPrefix: "public" - }); - }); - }); -}); diff --git a/packages/serverless-component/__tests__/custom-inputs.test.js b/packages/serverless-component/__tests__/custom-inputs.test.js index 0a0fc37c61..73725bbdaf 100644 --- a/packages/serverless-component/__tests__/custom-inputs.test.js +++ b/packages/serverless-component/__tests__/custom-inputs.test.js @@ -13,6 +13,15 @@ const { describe("Custom inputs", () => { let tmpCwd; let componentOutputs; + let consoleWarnSpy; + + beforeEach(() => { + consoleWarnSpy = jest.spyOn(console, "warn").mockReturnValue(); + }); + + afterEach(() => { + consoleWarnSpy.mockRestore(); + }); describe.each([ [["dev", "example.com"], "https://dev.example.com"], diff --git a/packages/serverless-component/__tests__/deploy.test.js b/packages/serverless-component/__tests__/deploy.test.js index 33dcdcbf9a..bce31f69d4 100644 --- a/packages/serverless-component/__tests__/deploy.test.js +++ b/packages/serverless-component/__tests__/deploy.test.js @@ -13,10 +13,13 @@ const { cleanupFixtureDirectory } = require("../lib/test-utils"); describe("deploy tests", () => { let tmpCwd; let componentOutputs; + let consoleWarnSpy; const fixturePath = path.join(__dirname, "./fixtures/simple-app"); beforeEach(async () => { + consoleWarnSpy = jest.spyOn(console, "warn").mockReturnValue(); + tmpCwd = process.cwd(); process.chdir(fixturePath); @@ -46,6 +49,7 @@ describe("deploy tests", () => { }); afterEach(() => { + consoleWarnSpy.mockRestore(); process.chdir(tmpCwd); }); diff --git a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages-manifest.json b/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages-manifest.json deleted file mode 100644 index aa925a8982..0000000000 --- a/packages/serverless-component/__tests__/fixtures/app-with-no-static-or-public-directory/.next/serverless/pages-manifest.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "/[root]": "pages/[root].js", - "/blog/[id]": "pages/blog/[id].js", - "/customers/[customer]": "pages/customers/[customer].js", - "/customers/[customer]/[post]": "pages/customers/[customer]/[post].js", - "/customers/new": "pages/customers/new.js", - "/customers/[customer]/profile": "pages/customers/[customer]/profile.js", - "/terms": "pages/terms.html", - "/about": "pages/about.html", - "/": "pages/index.js", - "/_app": "pages/_app.js", - "/_document": "pages/_document.js", - "/404": "pages/404.js" -} diff --git a/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/BUILD_ID b/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/BUILD_ID new file mode 100644 index 0000000000..d7dd5f1246 --- /dev/null +++ b/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/BUILD_ID @@ -0,0 +1 @@ +test-build-id diff --git a/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/static/test-build-id/placeholder.js b/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/static/test-build-id/placeholder.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/serverless-component/__tests__/fixtures/simple-app/.next/BUILD_ID b/packages/serverless-component/__tests__/fixtures/simple-app/.next/BUILD_ID new file mode 100644 index 0000000000..d7dd5f1246 --- /dev/null +++ b/packages/serverless-component/__tests__/fixtures/simple-app/.next/BUILD_ID @@ -0,0 +1 @@ +test-build-id diff --git a/packages/serverless-component/__tests__/fixtures/simple-app/.next/serverless/pages/blog/[post].html b/packages/serverless-component/__tests__/fixtures/simple-app/.next/serverless/pages/blog/[post].html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/serverless-component/__tests__/fixtures/simple-app/.next/static/test-build-id/placeholder.js b/packages/serverless-component/__tests__/fixtures/simple-app/.next/static/test-build-id/placeholder.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/serverless-component/package-lock.json b/packages/serverless-component/package-lock.json index 291b4ef638..26c81652dd 100644 --- a/packages/serverless-component/package-lock.json +++ b/packages/serverless-component/package-lock.json @@ -188,7 +188,382 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@sls-next/lambda-at-edge": { - "version": "file:../lambda-at-edge" + "version": "file:../lambda-at-edge", + "requires": { + "execa": "^4.0.0", + "fs-extra": "^9.0.0", + "path-to-regexp": "^6.1.0" + }, + "dependencies": { + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "requires": { + "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" + } + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } + }, + "@sls-next/s3-static-assets": { + "version": "file:../s3-static-assets", + "requires": { + "aws-sdk": "^2.664.0", + "fs-extra": "^9.0.0", + "klaw": "^3.0.0", + "mime-types": "^2.1.27" + }, + "dependencies": { + "@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "requires": { + "@types/node": "*" + } + }, + "@types/klaw": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.1.tgz", + "integrity": "sha512-acnF3n9mYOr1aFJKFyvfNX0am9EtPUsYPq22QUCGdJE+MVt6UyAN1jwo+PmOPqXD4K7ZS9MtxDEp/un0lxFccA==", + "requires": { + "@types/node": "*" + } + }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=" + }, + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "aws-sdk": { + "version": "2.664.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.664.0.tgz", + "integrity": "sha512-Lkez6O9Y7WuN2pjd/5eCtZejZTgB7zAPBFXjmu6yJQwb6V+iR9UclFjYkcMgTnrhw+eNOQdV60X5EdKl64A45Q==", + "requires": { + "buffer": "4.9.1", + "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" + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "jsonfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } }, "@szmarczak/http-timer": { "version": "1.1.2", diff --git a/packages/serverless-component/package.json b/packages/serverless-component/package.json index 8e2b2005e9..792e7a4cff 100644 --- a/packages/serverless-component/package.json +++ b/packages/serverless-component/package.json @@ -29,6 +29,7 @@ "@serverless/core": "^1.0.0", "@serverless/domain": "^6.1.0", "@sls-next/lambda-at-edge": "file:../lambda-at-edge", + "@sls-next/s3-static-assets": "file:../s3-static-assets", "fs-extra": "^8.1.0", "next-aws-cloudfront": "file:../lambda-at-edge-compat" } diff --git a/packages/serverless-component/serverless.js b/packages/serverless-component/serverless.js index b7ab39ca0a..24c5996a4a 100644 --- a/packages/serverless-component/serverless.js +++ b/packages/serverless-component/serverless.js @@ -2,11 +2,11 @@ const { Component } = require("@serverless/core"); const fse = require("fs-extra"); const path = require("path"); const { Builder } = require("@sls-next/lambda-at-edge"); +const uploadAssetsToS3 = require("@sls-next/s3-static-assets"); const obtainDomains = require("./lib/obtainDomains"); const { DEFAULT_LAMBDA_CODE_DIR, API_LAMBDA_CODE_DIR } = require("./constants"); const join = path.join; -const emptyDir = fse.emptyDir; class NextjsComponent extends Component { async default(inputs = {}) { @@ -71,8 +71,6 @@ class NextjsComponent extends Component { const nextConfigPath = inputs.nextConfigDir ? path.resolve(inputs.nextConfigDir) : process.cwd(); - const nextStaticPath = inputs.nextStaticDir || ""; - const staticPath = nextStaticPath || nextConfigPath; const [defaultBuildManifest, apiBuildManifest] = await Promise.all([ this.readDefaultBuildManifest(nextConfigPath), @@ -96,55 +94,11 @@ class NextjsComponent extends Component { name: inputs.bucketName }); - const nonDynamicHtmlPages = Object.values( - defaultBuildManifest.pages.html.nonDynamic - ); - - const dynamicHtmlPages = Object.values( - defaultBuildManifest.pages.html.dynamic - ).map(x => x.file); - - const uploadHtmlPages = [...nonDynamicHtmlPages, ...dynamicHtmlPages].map( - page => - bucket.upload({ - file: join(nextConfigPath, ".next/serverless", page), - key: `static-pages/${page.replace("pages/", "")}` - }) - ); - - const assetsUpload = [ - bucket.upload({ - dir: join(nextConfigPath, ".next/static"), - keyPrefix: "_next/static", - cacheControl: "public, max-age=31536000, immutable" - }), - ...uploadHtmlPages - ]; - - const [publicDirExists, staticDirExists] = await Promise.all([ - fse.exists(join(staticPath, "public")), - fse.exists(join(staticPath, "static")) - ]); - - if (publicDirExists) { - assetsUpload.push( - bucket.upload({ - dir: join(staticPath, "public"), - keyPrefix: "public" - }) - ); - } - - if (staticDirExists) { - assetsUpload.push( - bucket.upload({ - dir: join(staticPath, "static"), - keyPrefix: "static" - }) - ); - } - - await Promise.all(assetsUpload); + await uploadAssetsToS3.default({ + bucketName: bucketOutputs.name, + nextConfigDir: nextConfigPath, + credentials: this.context.credentials + }); defaultBuildManifest.cloudFrontOrigins = { staticOrigin: { @@ -170,6 +124,7 @@ class NextjsComponent extends Component { }; } }; + // // Parse origins from inputs const inputOrigins = ( (inputs.cloudfront && inputs.cloudfront.origins) || @@ -290,6 +245,8 @@ class NextjsComponent extends Component { allowedHttpMethods: ["HEAD", "GET"], ...defaultCloudfrontInputs, forward: { + cookies: "all", + queryString: true, cookies: "all", queryString: true, ...defaultCloudfrontInputs.forward From 062b968c62778eee4e8c741b495b31a5b87a733a Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 11:42:49 +0100 Subject: [PATCH 20/24] upload chunks and runtime build files --- packages/s3-static-assets/dist/index.js | 13 ++++++++ packages/s3-static-assets/src/index.ts | 31 ++++++++++++++++--- .../.next/build-manifest.json | 3 ++ .../basic-next-app/.next/build-manifest.json | 6 ++++ .../.next/static/chunks/chunk1.js | 0 .../.next/static/runtime/runtime1.js | 0 .../tests/upload-assets.test.ts | 18 +++++++++++ .../generic-fixture/.next/build-manifest.json | 3 ++ .../simple-app/.next/build-manifest.json | 3 ++ 9 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/build-manifest.json create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/build-manifest.json create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/chunks/chunk1.js create mode 100644 packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/runtime/runtime1.js create mode 100644 packages/serverless-component/__tests__/fixtures/generic-fixture/.next/build-manifest.json create mode 100644 packages/serverless-component/__tests__/fixtures/simple-app/.next/build-manifest.json diff --git a/packages/s3-static-assets/dist/index.js b/packages/s3-static-assets/dist/index.js index 294730707f..b0c1a50dff 100644 --- a/packages/s3-static-assets/dist/index.js +++ b/packages/s3-static-assets/dist/index.js @@ -42,6 +42,18 @@ const uploadStaticAssets = (options) => __awaiter(void 0, void 0, void 0, functi cacheControl: constants_1.IMMUTABLE_CACHE_CONTROL_HEADER }); })); + const buildManifest = yield fs_extra_1.default.readJson(path_1.default.join(dotNextDirectory, "build-manifest.json")); + const buildManifestFileUploads = Object.values(buildManifest.pages) + .reduce((acc, pageBuildFiles) => { + return acc.concat(pageBuildFiles); + }, []) + .map(relativeFilePath => { + return s3.uploadFile({ + s3Key: `_next/${relativeFilePath}`, + filePath: path_1.default.join(dotNextDirectory, relativeFilePath), + cacheControl: constants_1.IMMUTABLE_CACHE_CONTROL_HEADER + }); + }); const pagesManifest = yield fs_extra_1.default.readJSON(path_1.default.join(dotNextDirectory, "serverless/pages-manifest.json")); const htmlPageUploads = Object.values(pagesManifest) .filter(pageFile => pageFile.endsWith(".html")) @@ -67,6 +79,7 @@ const uploadStaticAssets = (options) => __awaiter(void 0, void 0, void 0, functi const staticDirUploads = yield uploadPublicOrStaticDirectory("static"); const allUploads = [ ...nextBuildFileUploads, + ...buildManifestFileUploads, ...htmlPageUploads, ...publicDirUploads, ...staticDirUploads diff --git a/packages/s3-static-assets/src/index.ts b/packages/s3-static-assets/src/index.ts index 04e9851d95..3729ac2249 100644 --- a/packages/s3-static-assets/src/index.ts +++ b/packages/s3-static-assets/src/index.ts @@ -13,6 +13,12 @@ type UploadStaticAssetsOptions = { credentials: Credentials; }; +type NextBuildManifest = { + pages: { + [pageRoute: string]: string[]; + }; +}; + const uploadStaticAssets = async ( options: UploadStaticAssetsOptions ): Promise => { @@ -49,6 +55,22 @@ const uploadStaticAssets = async ( }); }); + const buildManifest: NextBuildManifest = await fse.readJson( + path.join(dotNextDirectory, "build-manifest.json") + ); + + const buildManifestFileUploads = Object.values(buildManifest.pages) + .reduce((acc, pageBuildFiles) => { + return acc.concat(pageBuildFiles); + }, []) + .map(relativeFilePath => { + return s3.uploadFile({ + s3Key: `_next/${relativeFilePath}`, + filePath: path.join(dotNextDirectory, relativeFilePath), + cacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }); + }); + const pagesManifest = await fse.readJSON( path.join(dotNextDirectory, "serverless/pages-manifest.json") ); @@ -94,10 +116,11 @@ const uploadStaticAssets = async ( const staticDirUploads = await uploadPublicOrStaticDirectory("static"); const allUploads = [ - ...nextBuildFileUploads, - ...htmlPageUploads, - ...publicDirUploads, - ...staticDirUploads + ...nextBuildFileUploads, // .next/static/BUILD_ID/* + ...buildManifestFileUploads, // .next/static/runtime/x.js, //.next/static/chunks/y.js ... as specified in build-manifest.json + ...htmlPageUploads, // prerendered HTML pages + ...publicDirUploads, // app public dir + ...staticDirUploads // app static dir ]; return Promise.all(allUploads); diff --git a/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/build-manifest.json b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/build-manifest.json new file mode 100644 index 0000000000..bf517e5366 --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/app-no-public-dir/.next/build-manifest.json @@ -0,0 +1,3 @@ +{ + "pages": {} +} diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/build-manifest.json b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/build-manifest.json new file mode 100644 index 0000000000..826924d579 --- /dev/null +++ b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/build-manifest.json @@ -0,0 +1,6 @@ +{ + "pages": { + "/": ["static/runtime/runtime1.js"], + "/foo": ["static/chunks/chunk1.js"] + } +} diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/chunks/chunk1.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/chunks/chunk1.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/runtime/runtime1.js b/packages/s3-static-assets/tests/fixtures/basic-next-app/.next/static/runtime/runtime1.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/s3-static-assets/tests/upload-assets.test.ts b/packages/s3-static-assets/tests/upload-assets.test.ts index a51b777f51..a31e88ae01 100644 --- a/packages/s3-static-assets/tests/upload-assets.test.ts +++ b/packages/s3-static-assets/tests/upload-assets.test.ts @@ -157,6 +157,24 @@ describe("Upload tests", () => { ); }); + it("uploads files specified in the build-manifest.json", async () => { + await upload(); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "_next/static/chunks/chunk1.js", + CacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }) + ); + + expect(mockUpload).toBeCalledWith( + expect.objectContaining({ + Key: "_next/static/runtime/runtime1.js", + CacheControl: IMMUTABLE_CACHE_CONTROL_HEADER + }) + ); + }); + describe("when no public or static directory exists", () => { it("upload does not crash", () => upload("./fixtures/app-no-public-dir")); }); diff --git a/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/build-manifest.json b/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/build-manifest.json new file mode 100644 index 0000000000..bf517e5366 --- /dev/null +++ b/packages/serverless-component/__tests__/fixtures/generic-fixture/.next/build-manifest.json @@ -0,0 +1,3 @@ +{ + "pages": {} +} diff --git a/packages/serverless-component/__tests__/fixtures/simple-app/.next/build-manifest.json b/packages/serverless-component/__tests__/fixtures/simple-app/.next/build-manifest.json new file mode 100644 index 0000000000..bf517e5366 --- /dev/null +++ b/packages/serverless-component/__tests__/fixtures/simple-app/.next/build-manifest.json @@ -0,0 +1,3 @@ +{ + "pages": {} +} From 9b4e4d9aef996b3cefbdd1ef4e8876de533236ba Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 11:43:51 +0100 Subject: [PATCH 21/24] remove dist from source control --- packages/s3-static-assets/dist/index.d.ts | 9 -- packages/s3-static-assets/dist/index.js | 89 ------------------- .../s3-static-assets/dist/lib/constants.d.ts | 1 - .../s3-static-assets/dist/lib/constants.js | 3 - .../dist/lib/filterOutDirectories.d.ts | 3 - .../dist/lib/filterOutDirectories.js | 3 - .../dist/lib/getMimeType.d.ts | 2 - .../s3-static-assets/dist/lib/getMimeType.js | 8 -- .../dist/lib/pathToPosix.d.ts | 2 - .../s3-static-assets/dist/lib/pathToPosix.js | 4 - .../dist/lib/readDirectoryFiles.d.ts | 3 - .../dist/lib/readDirectoryFiles.js | 18 ---- packages/s3-static-assets/dist/lib/s3.d.ts | 20 ----- packages/s3-static-assets/dist/lib/s3.js | 48 ---------- 14 files changed, 213 deletions(-) delete mode 100644 packages/s3-static-assets/dist/index.d.ts delete mode 100644 packages/s3-static-assets/dist/index.js delete mode 100644 packages/s3-static-assets/dist/lib/constants.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/constants.js delete mode 100644 packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/filterOutDirectories.js delete mode 100644 packages/s3-static-assets/dist/lib/getMimeType.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/getMimeType.js delete mode 100644 packages/s3-static-assets/dist/lib/pathToPosix.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/pathToPosix.js delete mode 100644 packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/readDirectoryFiles.js delete mode 100644 packages/s3-static-assets/dist/lib/s3.d.ts delete mode 100644 packages/s3-static-assets/dist/lib/s3.js diff --git a/packages/s3-static-assets/dist/index.d.ts b/packages/s3-static-assets/dist/index.d.ts deleted file mode 100644 index 41b3a4868f..0000000000 --- a/packages/s3-static-assets/dist/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import AWS from "aws-sdk"; -import { Credentials } from "./lib/s3"; -declare type UploadStaticAssetsOptions = { - bucketName: string; - nextConfigDir: string; - credentials: Credentials; -}; -declare const uploadStaticAssets: (options: UploadStaticAssetsOptions) => Promise; -export default uploadStaticAssets; diff --git a/packages/s3-static-assets/dist/index.js b/packages/s3-static-assets/dist/index.js deleted file mode 100644 index b0c1a50dff..0000000000 --- a/packages/s3-static-assets/dist/index.js +++ /dev/null @@ -1,89 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const path_1 = __importDefault(require("path")); -const fs_extra_1 = __importDefault(require("fs-extra")); -const readDirectoryFiles_1 = __importDefault(require("./lib/readDirectoryFiles")); -const filterOutDirectories_1 = __importDefault(require("./lib/filterOutDirectories")); -const constants_1 = require("./lib/constants"); -const s3_1 = __importDefault(require("./lib/s3")); -const pathToPosix_1 = __importDefault(require("./lib/pathToPosix")); -const uploadStaticAssets = (options) => __awaiter(void 0, void 0, void 0, function* () { - const { bucketName, nextConfigDir } = options; - const s3 = yield s3_1.default({ - bucketName, - credentials: options.credentials - }); - const dotNextDirectory = path_1.default.join(nextConfigDir, ".next"); - const BUILD_ID = fs_extra_1.default - .readFileSync(path_1.default.join(dotNextDirectory, "BUILD_ID")) - .toString("utf8"); - const buildStaticFiles = yield readDirectoryFiles_1.default(path_1.default.join(dotNextDirectory, "static", BUILD_ID)); - const nextBuildFileUploads = buildStaticFiles - .filter(filterOutDirectories_1.default) - .map((fileItem) => __awaiter(void 0, void 0, void 0, function* () { - const s3Key = pathToPosix_1.default(path_1.default - .relative(path_1.default.resolve(nextConfigDir), fileItem.path) - .replace(/^.next/, "_next")); - return s3.uploadFile({ - s3Key, - filePath: fileItem.path, - cacheControl: constants_1.IMMUTABLE_CACHE_CONTROL_HEADER - }); - })); - const buildManifest = yield fs_extra_1.default.readJson(path_1.default.join(dotNextDirectory, "build-manifest.json")); - const buildManifestFileUploads = Object.values(buildManifest.pages) - .reduce((acc, pageBuildFiles) => { - return acc.concat(pageBuildFiles); - }, []) - .map(relativeFilePath => { - return s3.uploadFile({ - s3Key: `_next/${relativeFilePath}`, - filePath: path_1.default.join(dotNextDirectory, relativeFilePath), - cacheControl: constants_1.IMMUTABLE_CACHE_CONTROL_HEADER - }); - }); - const pagesManifest = yield fs_extra_1.default.readJSON(path_1.default.join(dotNextDirectory, "serverless/pages-manifest.json")); - const htmlPageUploads = Object.values(pagesManifest) - .filter(pageFile => pageFile.endsWith(".html")) - .map(relativePageFilePath => { - const pageFilePath = pathToPosix_1.default(path_1.default.join(dotNextDirectory, `serverless/${relativePageFilePath}`)); - return s3.uploadFile({ - s3Key: `static-pages/${relativePageFilePath.replace(/^pages\//, "")}`, - filePath: pageFilePath - }); - }); - const uploadPublicOrStaticDirectory = (directory) => __awaiter(void 0, void 0, void 0, function* () { - const directoryPath = path_1.default.join(nextConfigDir, directory); - if (!(yield fs_extra_1.default.pathExists(directoryPath))) { - return Promise.resolve([]); - } - const files = yield readDirectoryFiles_1.default(directoryPath); - return files.filter(filterOutDirectories_1.default).map(fileItem => s3.uploadFile({ - filePath: fileItem.path, - s3Key: pathToPosix_1.default(path_1.default.relative(path_1.default.resolve(nextConfigDir), fileItem.path)) - })); - }); - const publicDirUploads = yield uploadPublicOrStaticDirectory("public"); - const staticDirUploads = yield uploadPublicOrStaticDirectory("static"); - const allUploads = [ - ...nextBuildFileUploads, - ...buildManifestFileUploads, - ...htmlPageUploads, - ...publicDirUploads, - ...staticDirUploads - ]; - return Promise.all(allUploads); -}); -exports.default = uploadStaticAssets; diff --git a/packages/s3-static-assets/dist/lib/constants.d.ts b/packages/s3-static-assets/dist/lib/constants.d.ts deleted file mode 100644 index a5209d3541..0000000000 --- a/packages/s3-static-assets/dist/lib/constants.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare const IMMUTABLE_CACHE_CONTROL_HEADER = "public, max-age=31536000, immutable"; diff --git a/packages/s3-static-assets/dist/lib/constants.js b/packages/s3-static-assets/dist/lib/constants.js deleted file mode 100644 index ab26ab934c..0000000000 --- a/packages/s3-static-assets/dist/lib/constants.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.IMMUTABLE_CACHE_CONTROL_HEADER = "public, max-age=31536000, immutable"; diff --git a/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts b/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts deleted file mode 100644 index 8b96dd4813..0000000000 --- a/packages/s3-static-assets/dist/lib/filterOutDirectories.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Item } from "klaw"; -declare const _default: (fileItem: Item) => boolean; -export default _default; diff --git a/packages/s3-static-assets/dist/lib/filterOutDirectories.js b/packages/s3-static-assets/dist/lib/filterOutDirectories.js deleted file mode 100644 index 9c4abe8f44..0000000000 --- a/packages/s3-static-assets/dist/lib/filterOutDirectories.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = (fileItem) => !fileItem.stats.isDirectory(); diff --git a/packages/s3-static-assets/dist/lib/getMimeType.d.ts b/packages/s3-static-assets/dist/lib/getMimeType.d.ts deleted file mode 100644 index b2aec94339..0000000000 --- a/packages/s3-static-assets/dist/lib/getMimeType.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const _default: (filePath: string) => string; -export default _default; diff --git a/packages/s3-static-assets/dist/lib/getMimeType.js b/packages/s3-static-assets/dist/lib/getMimeType.js deleted file mode 100644 index 221b6c7753..0000000000 --- a/packages/s3-static-assets/dist/lib/getMimeType.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const mime_types_1 = __importDefault(require("mime-types")); -const path_1 = __importDefault(require("path")); -exports.default = (filePath) => mime_types_1.default.lookup(path_1.default.basename(filePath)) || "application/octet-stream"; diff --git a/packages/s3-static-assets/dist/lib/pathToPosix.d.ts b/packages/s3-static-assets/dist/lib/pathToPosix.d.ts deleted file mode 100644 index bd78f7cc04..0000000000 --- a/packages/s3-static-assets/dist/lib/pathToPosix.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const pathToPosix: (path: string) => string; -export default pathToPosix; diff --git a/packages/s3-static-assets/dist/lib/pathToPosix.js b/packages/s3-static-assets/dist/lib/pathToPosix.js deleted file mode 100644 index c22d3d5e73..0000000000 --- a/packages/s3-static-assets/dist/lib/pathToPosix.js +++ /dev/null @@ -1,4 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const pathToPosix = (path) => path.replace(/\\/g, "/"); -exports.default = pathToPosix; diff --git a/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts b/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts deleted file mode 100644 index 602176f322..0000000000 --- a/packages/s3-static-assets/dist/lib/readDirectoryFiles.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import klaw from "klaw"; -declare const readDirectoryFiles: (directory: string) => Promise; -export default readDirectoryFiles; diff --git a/packages/s3-static-assets/dist/lib/readDirectoryFiles.js b/packages/s3-static-assets/dist/lib/readDirectoryFiles.js deleted file mode 100644 index 4e5a0520e3..0000000000 --- a/packages/s3-static-assets/dist/lib/readDirectoryFiles.js +++ /dev/null @@ -1,18 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const klaw_1 = __importDefault(require("klaw")); -const readDirectoryFiles = (directory) => { - const items = []; - return new Promise((resolve, reject) => { - klaw_1.default(directory.trim()) - .on("data", item => items.push(item)) - .on("end", () => { - resolve(items); - }) - .on("error", reject); - }); -}; -exports.default = readDirectoryFiles; diff --git a/packages/s3-static-assets/dist/lib/s3.d.ts b/packages/s3-static-assets/dist/lib/s3.d.ts deleted file mode 100644 index a48084b4a7..0000000000 --- a/packages/s3-static-assets/dist/lib/s3.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import AWS from "aws-sdk"; -declare type S3ClientFactoryOptions = { - bucketName: string; - credentials: Credentials; -}; -declare type UploadFileOptions = { - filePath: string; - cacheControl?: string; - s3Key?: string; -}; -export declare type S3Client = { - uploadFile: (options: UploadFileOptions) => Promise; -}; -export declare type Credentials = { - accessKeyId: string; - secretAccessKey: string; - sessionToken?: string; -}; -declare const _default: ({ bucketName, credentials }: S3ClientFactoryOptions) => Promise; -export default _default; diff --git a/packages/s3-static-assets/dist/lib/s3.js b/packages/s3-static-assets/dist/lib/s3.js deleted file mode 100644 index 8188415174..0000000000 --- a/packages/s3-static-assets/dist/lib/s3.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const getMimeType_1 = __importDefault(require("./getMimeType")); -const fs_extra_1 = __importDefault(require("fs-extra")); -const aws_sdk_1 = __importDefault(require("aws-sdk")); -exports.default = ({ bucketName, credentials }) => __awaiter(void 0, void 0, void 0, function* () { - let s3 = new aws_sdk_1.default.S3(Object.assign({}, credentials)); - try { - const { Status } = yield s3 - .getBucketAccelerateConfiguration({ - Bucket: bucketName - }) - .promise(); - if (Status === "Enabled") { - s3 = new aws_sdk_1.default.S3(Object.assign(Object.assign({}, credentials), { useAccelerateEndpoint: true })); - } - } - catch (err) { - console.warn(`Checking for bucket acceleration failed, falling back to non-accelerated S3 client. Err: ${err.message}`); - } - return { - uploadFile: (options) => __awaiter(void 0, void 0, void 0, function* () { - const { filePath, cacheControl, s3Key } = options; - const fileBody = yield fs_extra_1.default.readFile(filePath); - return s3 - .upload({ - Bucket: bucketName, - Key: s3Key || filePath, - Body: fileBody, - ContentType: getMimeType_1.default(filePath), - CacheControl: cacheControl || undefined - }) - .promise(); - }) - }; -}); From 3d4810af9dc6ea3b67b4d1412371cd57b541f1b4 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 11:44:48 +0100 Subject: [PATCH 22/24] ignore dists --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e264b09d39..31598a0966 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ sls-next-build **/examples/**/package-lock.json .DS_Store yarn.lock +dist From 72610eb334f4395af4c9eb4639f1f0cdfda2b719 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 12:27:42 +0100 Subject: [PATCH 23/24] fix credentials and refactor tests --- .../__tests__/custom-inputs.test.js | 28 +++++++++++++++---- .../__tests__/deploy.test.js | 6 ++++ packages/serverless-component/serverless.js | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/serverless-component/__tests__/custom-inputs.test.js b/packages/serverless-component/__tests__/custom-inputs.test.js index 73725bbdaf..7581294cc7 100644 --- a/packages/serverless-component/__tests__/custom-inputs.test.js +++ b/packages/serverless-component/__tests__/custom-inputs.test.js @@ -10,6 +10,17 @@ const { API_LAMBDA_CODE_DIR } = require("../constants"); +const createNextComponent = inputs => { + const component = new NextjsComponent(inputs); + component.context.credentials = { + aws: { + accessKeyId: "123", + secretAccessKey: "456" + } + }; + return component; +}; + describe("Custom inputs", () => { let tmpCwd; let componentOutputs; @@ -52,7 +63,8 @@ describe("Custom inputs", () => { domains: [expectedDomain] }); - const component = new NextjsComponent(); + const component = createNextComponent(); + componentOutputs = await component.default({ policy: "arn:aws:iam::aws:policy/CustomRole", domain: inputDomains, @@ -116,7 +128,10 @@ describe("Custom inputs", () => { url: "https://cloudfrontdistrib.amazonaws.com" }); - const component = new NextjsComponent(); + const component = createNextComponent({ + memory: inputMemory + }); + componentOutputs = await component.default({ memory: inputMemory }); @@ -164,7 +179,8 @@ describe("Custom inputs", () => { url: "https://cloudfrontdistrib.amazonaws.com" }); - const component = new NextjsComponent(); + const component = createNextComponent(); + componentOutputs = await component.default({ timeout: inputTimeout }); @@ -221,7 +237,8 @@ describe("Custom inputs", () => { url: "https://cloudfrontdistrib.amazonaws.com" }); - const component = new NextjsComponent(); + const component = createNextComponent(); + componentOutputs = await component.default({ name: inputName }); @@ -341,7 +358,8 @@ describe("Custom inputs", () => { url: "https://cloudfrontdistrib.amazonaws.com" }); - const component = new NextjsComponent(); + const component = createNextComponent(); + componentOutputs = await component.default({ cloudfront: inputCloudfrontConfig }); diff --git a/packages/serverless-component/__tests__/deploy.test.js b/packages/serverless-component/__tests__/deploy.test.js index bce31f69d4..a70dbe2b85 100644 --- a/packages/serverless-component/__tests__/deploy.test.js +++ b/packages/serverless-component/__tests__/deploy.test.js @@ -42,6 +42,12 @@ describe("deploy tests", () => { }); const component = new NextjsComponent(); + component.context.credentials = { + aws: { + accessKeyId: "123", + secretAccessKey: "456" + } + }; await component.build(); diff --git a/packages/serverless-component/serverless.js b/packages/serverless-component/serverless.js index 24c5996a4a..a3af53b4f4 100644 --- a/packages/serverless-component/serverless.js +++ b/packages/serverless-component/serverless.js @@ -97,7 +97,7 @@ class NextjsComponent extends Component { await uploadAssetsToS3.default({ bucketName: bucketOutputs.name, nextConfigDir: nextConfigPath, - credentials: this.context.credentials + credentials: this.context.credentials.aws }); defaultBuildManifest.cloudFrontOrigins = { From dfd41e193a027aea6b7eaca3caf94a13c58ec6f1 Mon Sep 17 00:00:00 2001 From: danielconde Date: Sun, 3 May 2020 12:50:30 +0100 Subject: [PATCH 24/24] add publish config to s3 package --- packages/s3-static-assets/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/s3-static-assets/package.json b/packages/s3-static-assets/package.json index 7d081eda18..91cc0681f2 100644 --- a/packages/s3-static-assets/package.json +++ b/packages/s3-static-assets/package.json @@ -2,6 +2,9 @@ "name": "@sls-next/s3-static-assets", "version": "1.0.0", "description": "Handles upload to S3 of next.js static assets", + "publishConfig": { + "access": "public" + }, "main": "dist/index.js", "types": "dist/index.d.ts", "directories": {