solve publishing issues and monorepo-related dependency issues, start the prep work for static gh-pages deployments

This commit is contained in:
Egor 2020-07-11 12:31:06 -07:00
parent c3179ad702
commit 1f9426f799
19 changed files with 172 additions and 61 deletions

View file

@ -12,18 +12,22 @@ Effortless deployment for Next.js apps. 🚀
## Getting started ## Getting started
`yarn add --dev next-deploy`
[Make sure your environment is configured to deploy.](#Configuration) [Make sure your environment is configured to deploy.](#Configuration)
The one-liner: `npx next-deploy`
You can also install locally:
`yarn add --dev next-deploy`
`yarn next-deploy` `yarn next-deploy`
## Background ## Background
next-deploy started as a fork of [serverless-next.js](#https://github.com/serverless-nextjs/serverless-next.js) which itself is an orchestrator of various [serverless-components](#https://github.com/serverless-components/). Next Deploy started as a fork of [serverless-next.js](#https://github.com/serverless-nextjs/serverless-next.js) which itself is an orchestrator of various [serverless-components](#https://github.com/serverless-components/).
## Configuration ## Configuration
### AWS
To deploy to AWS you will need to set your credentials in your environment: To deploy to AWS you will need to set your credentials in your environment:
```bash ```bash
@ -31,11 +35,15 @@ AWS_ACCESS_KEY_ID=******
AWS_SECRET_ACCESS_KEY=****** AWS_SECRET_ACCESS_KEY=******
``` ```
If your account is restricted, [ensure that you enough permissions to deploy](docs/aws-permissions.md). If your account is restricted, [ensure that you have enough permissions to deploy](docs/aws-permissions.md).
### GitHub
TODO
## Advanced Configuration ## Advanced Configuration
The deployment configuration is to be provided through `next-deploy.config.js`, which will be automatically created for you the first time you run `yarn next-deploy`. The deployment configuration is to be provided through `next-deploy.config.js`, which will be automatically created for you the first time you run `next-deploy`.
```javascript ```javascript
module.exports = { module.exports = {
@ -44,24 +52,25 @@ module.exports = {
}; };
``` ```
A more advanced configuration that sets more [configurable options](#Options): A more advanced configuration that sets more [configurable options](#ConfigurationOptions):
```javascript ```javascript
module.exports = { module.exports = {
bucketName: process.env.BUCKET_NAME, engine: 'aws',
description: process.env.LAMBDA_DESCRIPTION,
name: {
defaultLambda: process.env.DEFAULT_LAMBDA_NAME,
apiLambda: process.env.API_LAMBDA_NAME,
},
domain: [process.env.SUBDOMAIN, process.env.DOMAIN],
onPreDeploy: () => console.log('⚡ Starting Deployment ⚡'), onPreDeploy: () => console.log('⚡ Starting Deployment ⚡'),
onPostDeploy: () => console.log('✅ Deployment Complete ✅'), onShutdown: () => console.log('⛔ Interrupted ⛔'),
onPostDeploy: () => console.log('🌟 Deployment Complete 🌟'),
debug: true, debug: true,
build: true,
bucketName: 'bucket-name',
description: 'lambda-description',
name: 'lambda-name',
domain: ['foobar', 'example.com'],
}; };
``` ```
Environment variables may be substituted from `process.env` to allow for more flexibility that one would need for CI/CD.
## Configuration Options ## Configuration Options
The next-deploy config varies by the provider (engine) that you're deploying to. All configuration options are optional and come with sensible defaults. The next-deploy config varies by the provider (engine) that you're deploying to. All configuration options are optional and come with sensible defaults.
@ -69,10 +78,11 @@ The next-deploy config varies by the provider (engine) that you're deploying to.
All engines support the basic options: All engines support the basic options:
| Name | Type | Default | Description | | Name | Type | Default | Description |
| :----------- | :-------------------- | :---------- | :------------------------------------------------------------------------- | | :----------- | :-------------------- | :---------- | :------------------------------------------------------------------------------------------------------- |
| engine | `"aws"` | `"aws"` | The deployment host. | | engine | `"aws" \| "github"` | `"aws"` | The platform to deploy to. |
| debug | `boolean` | `false` | Print helpful messages to | | debug | `boolean` | `false` | Print helpful messages to |
| onPreDeploy | `() => Promise<void>` | `undefined` | A callback to that gets called before the deployment. | | onPreDeploy | `() => Promise<void>` | `undefined` | A callback that gets called before the deployment. |
| onPostDeploy | `() => Promise<void>` | `undefined` | A callback to that gets called after the deployment successfully finishes. | | onPostDeploy | `() => Promise<void>` | `undefined` | A callback that gets called after the deployment successfully finishes. |
| onShutdown | `() => Promise<void>` | `undefined` | A callback that gets called after the deployment is shutdown by a INT/QUIT/TERM signal like from ctrl+c. |
TODO TODO

View file

@ -1,6 +1,6 @@
{ {
"name": "next-deploy", "name": "next-deploy",
"version": "0.0.5", "version": "0.1.0",
"description": "Effortless deployment for Next.js apps. 🚀", "description": "Effortless deployment for Next.js apps. 🚀",
"author": "Nidratech Ltd. <egor@nidratech.com>", "author": "Nidratech Ltd. <egor@nidratech.com>",
"keywords": [ "keywords": [
@ -16,7 +16,8 @@
"scripts": { "scripts": {
"dev": "lerna exec -- yarn build -w", "dev": "lerna exec -- yarn build -w",
"build": "lerna run build", "build": "lerna run build",
"setup": "lerna exec -- yarn", "clean": "lerna run clean",
"setup": "yarn && lerna exec -- yarn",
"prepack": "yarn build" "prepack": "yarn build"
}, },
"bin": { "bin": {
@ -32,19 +33,23 @@
}, },
"homepage": "https://github.com/nidratech/next-deploy#readme", "homepage": "https://github.com/nidratech/next-deploy#readme",
"dependencies": { "dependencies": {
"@next-deploy/aws-cloudfront": "link:./packages/aws-cloudfront", "@next-deploy/aws-cloudfront": "link:node_modules/next-deploy/packages/aws-cloudfront",
"@next-deploy/aws-component": "link:./packages/aws-component", "@next-deploy/aws-component": "link:node_modules/next-deploy/packages/aws-component",
"@next-deploy/aws-domain": "link:./packages/aws-domain", "@next-deploy/aws-domain": "link:node_modules/next-deploy/packages/aws-domain",
"@next-deploy/aws-lambda": "link:./packages/aws-lambda", "@next-deploy/aws-lambda": "link:node_modules/next-deploy/packages/aws-lambda",
"@next-deploy/aws-lambda-builder": "link:./packages/aws-lambda-builder", "@next-deploy/aws-lambda-builder": "link:node_modules/next-deploy/packages/aws-lambda-builder",
"@next-deploy/aws-s3": "link:./packages/aws-s3", "@next-deploy/aws-s3": "link:node_modules/next-deploy/packages/aws-s3",
"@next-deploy/github": "link:node_modules/next-deploy/packages/github",
"@serverless/aws-iam-role": "^1.0.0", "@serverless/aws-iam-role": "^1.0.0",
"@serverless/aws-lambda-layer": "^1.0.0", "@serverless/aws-lambda-layer": "^1.0.0",
"@serverless/core": "^1.1.2", "@serverless/core": "^1.1.2",
"@zeit/node-file-trace": "^0.7.0", "@zeit/node-file-trace": "^0.7.0",
"archiver": "^4.0.1", "ansi-escapes": "^4.3.1",
"archiver": "^4.0.2",
"aws-sdk": "^2.713.0", "aws-sdk": "^2.713.0",
"chalk": "^4.1.0",
"execa": "^4.0.3", "execa": "^4.0.3",
"figures": "^3.2.0",
"fs-extra": "^9.0.1", "fs-extra": "^9.0.1",
"globby": "^11.0.1", "globby": "^11.0.1",
"klaw": "^3.0.0", "klaw": "^3.0.0",
@ -56,7 +61,8 @@
"prettyoutput": "^1.2.0", "prettyoutput": "^1.2.0",
"ramda": "^0.27.0", "ramda": "^0.27.0",
"regex-parser": "^2.2.10", "regex-parser": "^2.2.10",
"s3-stream-upload": "^2.0.2" "s3-stream-upload": "^2.0.2",
"strip-ansi": "^6.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.10.4",

View file

@ -1,5 +1,6 @@
import { PublicDirectoryCache } from '@next-deploy/aws-s3/types'; import { PublicDirectoryCache } from '@next-deploy/aws-s3/types';
import { CloudFrontInputs } from '@next-deploy/aws-cloudfront/types'; import { CloudFrontInputs } from '@next-deploy/aws-cloudfront/types';
import { DomainType } from '@next-deploy/aws-domain/types';
type AwsComponentInputs = { type AwsComponentInputs = {
build?: BuildOptions | boolean; build?: BuildOptions | boolean;
@ -19,8 +20,6 @@ type AwsComponentInputs = {
cloudfront?: CloudFrontInputs; cloudfront?: CloudFrontInputs;
}; };
type DomainType = 'www' | 'apex' | 'both';
type BuildOptions = { type BuildOptions = {
cwd?: string; cwd?: string;
enabled?: boolean; enabled?: boolean;

View file

@ -10,6 +10,7 @@
"compile": "tsc -p tsconfig.build.json" "compile": "tsc -p tsconfig.build.json"
}, },
"devDependencies": { "devDependencies": {
"@next-deploy/aws-cloudfront": "link:../aws-cloudfront",
"typescript": "^3.9.6" "typescript": "^3.9.6"
} }
} }

View file

@ -2,8 +2,7 @@ import { Route53, ACM, CloudFront, Credentials } from 'aws-sdk';
import { utils } from '@serverless/core'; import { utils } from '@serverless/core';
import { PathPatternConfig } from '@next-deploy/aws-cloudfront/types'; import { PathPatternConfig } from '@next-deploy/aws-cloudfront/types';
import { DomainType } from '@next-deploy/aws-component/types'; import { AwsDomainInputs, SubDomain, DomainType } from '../types';
import { AwsDomainInputs, SubDomain } from '../types';
const DEFAULT_MINIMUM_PROTOCOL_VERSION = 'TLSv1.2_2018'; const DEFAULT_MINIMUM_PROTOCOL_VERSION = 'TLSv1.2_2018';
const HOSTED_ZONE_ID = 'Z2FDTNDATAQYW2'; // this is a constant that you can get from here https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html const HOSTED_ZONE_ID = 'Z2FDTNDATAQYW2'; // this is a constant that you can get from here https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html

View file

@ -1,4 +1,3 @@
import { DomainType } from '@next-deploy/aws-component/types';
import { PathPatternConfig } from '@next-deploy/aws-cloudfront/types'; import { PathPatternConfig } from '@next-deploy/aws-cloudfront/types';
type AwsDomainInputs = { type AwsDomainInputs = {
@ -19,3 +18,4 @@ type SubDomain = {
}; };
type SubDomainType = 'awsCloudFront' | 'awsS3Website' | 'awsApiGateway' | 'awsAppSync'; type SubDomainType = 'awsCloudFront' | 'awsS3Website' | 'awsApiGateway' | 'awsAppSync';
type DomainType = 'www' | 'apex' | 'both';

View file

@ -2,6 +2,10 @@
# yarn lockfile v1 # yarn lockfile v1
"@next-deploy/aws-cloudfront@link:../aws-cloudfront":
version "0.0.0"
uid ""
typescript@^3.9.6: typescript@^3.9.6:
version "3.9.6" version "3.9.6"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"

View file

@ -97,8 +97,9 @@ export const handler = async (
if (isHTMLPage || isPublicFile) { if (isHTMLPage || isPublicFile) {
s3Origin.path = isHTMLPage ? '/static-pages' : '/public'; s3Origin.path = isHTMLPage ? '/static-pages' : '/public';
if (isHTMLPage) {
addS3HostHeader(request, normalizedS3DomainName); addS3HostHeader(request, normalizedS3DomainName);
if (isHTMLPage) {
request.uri = `${uri}.html`; request.uri = `${uri}.html`;
} }

View file

@ -3,6 +3,17 @@ export const SUPPORTED_ENGINES = [
type: 'aws', type: 'aws',
component: '@next-deploy/aws-component', component: '@next-deploy/aws-component',
}, },
{
type: 'github',
component: '@next-deploy/github',
},
]; ];
export const DEFAULT_ENGINE = 'aws'; export const DEFAULT_ENGINE = 'aws';
export const DEPLOY_CONFIG_NAME = 'next-deploy.config.js'; export const DEPLOY_CONFIG_NAME = 'next-deploy.config.js';
export const METHOD_NAME_MAP = [
{ name: 'default', action: 'Deploying' },
{ name: 'build', action: 'Building' },
{ name: 'deploy', action: 'Deploying' },
{ name: 'remove', action: 'Removing' },
];
export const STATE_ROOT = '.next-deploy';

View file

@ -50,7 +50,7 @@ class Context {
process.stdout.write(ansiEscapes.cursorHide); process.stdout.write(ansiEscapes.cursorHide);
// Event Handler: Control + C // Event Handler: Control + C
process.on('SIGINT', async () => { process.on('SIGINT', () => {
if (this.isStatusEngineActive()) { if (this.isStatusEngineActive()) {
return this.statusEngineStop('cancel'); return this.statusEngineStop('cancel');
} }

View file

@ -1,26 +1,22 @@
import path from 'path'; import path from 'path';
import { BaseDeploymentOptions } from '../types'; import { BaseDeploymentOptions } from '../types';
import { DEFAULT_ENGINE, SUPPORTED_ENGINES } from './config'; import { DEFAULT_ENGINE, SUPPORTED_ENGINES, METHOD_NAME_MAP, STATE_ROOT } from './config';
import Context from './context'; import Context from './context';
const METHOD_NAME_MAP = [
{ name: 'default', action: 'Deploying' },
{ name: 'build', action: 'Building' },
{ name: 'deploy', action: 'Deploying' },
{ name: 'remove', action: 'Removing' },
];
const deploy = async (deployConfigPath: string, methodName = 'default'): Promise<void> => { const deploy = async (deployConfigPath: string, methodName = 'default'): Promise<void> => {
const { const {
debug = false, debug = false,
engine = DEFAULT_ENGINE, engine = DEFAULT_ENGINE,
onPreDeploy, onPreDeploy,
onPostDeploy, onPostDeploy,
onShutdown,
...componentOptions ...componentOptions
}: BaseDeploymentOptions = await import(deployConfigPath); }: BaseDeploymentOptions = await import(deployConfigPath);
const engineIndex = SUPPORTED_ENGINES.findIndex(({ type }) => type === engine); const engineIndex = SUPPORTED_ENGINES.findIndex(({ type }) => type === engine);
onShutdown && handleShutDown(onShutdown);
if (engineIndex === -1) { if (engineIndex === -1) {
throw new Error( throw new Error(
`Engine ${engine} is unsupported. Pick one of: ${SUPPORTED_ENGINES.map( `Engine ${engine} is unsupported. Pick one of: ${SUPPORTED_ENGINES.map(
@ -42,7 +38,7 @@ const deploy = async (deployConfigPath: string, methodName = 'default'): Promise
const context = new Context({ const context = new Context({
root: process.cwd(), root: process.cwd(),
stateRoot: path.join(process.cwd(), '.next-deploy'), stateRoot: path.join(process.cwd(), STATE_ROOT),
debug, debug,
entity: engine.toUpperCase(), entity: engine.toUpperCase(),
message: method.action, message: method.action,
@ -72,4 +68,15 @@ const deploy = async (deployConfigPath: string, methodName = 'default'): Promise
} }
}; };
function handleShutDown(onShutdown: () => Promise<void>) {
const doShutdown = async () => {
await onShutdown();
process.exit(1);
};
process.on('SIGINT', doShutdown);
process.on('SIGQUIT', doShutdown);
process.on('SIGTERM', doShutdown);
}
export default deploy; export default deploy;

View file

@ -1,8 +1,9 @@
export type BaseDeploymentOptions = { export type BaseDeploymentOptions = {
engine?: 'aws'; engine?: 'aws' | 'github';
debug?: boolean; debug?: boolean;
onPreDeploy?: () => Promise<void>; onPreDeploy?: () => Promise<void>;
onPostDeploy?: () => Promise<void>; onPostDeploy?: () => Promise<void>;
onShutdown?: () => Promise<void>;
}; };
type ContextConfig = { type ContextConfig = {

View file

@ -0,0 +1,15 @@
{
"name": "@next-deploy/github",
"version": "1.0.0",
"license": "MIT",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "yarn clean && yarn compile",
"clean": "rm -rf ./dist",
"compile": "tsc -p tsconfig.build.json"
},
"devDependencies": {
"typescript": "^3.9.6"
}
}

View file

@ -0,0 +1,3 @@
const component = require('./dist/component.js');
module.exports = component.default;

View file

@ -0,0 +1,25 @@
import { Component } from '@serverless/core';
import { GithubInputs, DeploymentResult } from '../types';
class GithubComponent extends Component {
async default(inputs: GithubInputs = {}): Promise<DeploymentResult> {
return this.deploy(inputs);
}
async build(inputs: GithubInputs = {}): Promise<void> {
// TODO
}
async deploy(inputs: GithubInputs = {}): Promise<DeploymentResult> {
// TODO
return {};
}
async remove(): Promise<void> {
// TODO
}
}
export default GithubComponent;

View file

@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"sourceMap": false,
"removeComments": true,
"outDir": "dist"
},
"include": ["./src/", "../../.d.ts"]
}

3
packages/github/types.d.ts vendored Normal file
View file

@ -0,0 +1,3 @@
export type GithubInputs = {};
type DeploymentResult = {};

View file

@ -0,0 +1,8 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
typescript@^3.9.6:
version "3.9.6"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a"
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==

View file

@ -1875,27 +1875,31 @@
call-me-maybe "^1.0.1" call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0" glob-to-regexp "^0.3.0"
"@next-deploy/aws-cloudfront@link:./packages/aws-cloudfront": "@next-deploy/aws-cloudfront@link:node_modules/next-deploy/packages/aws-cloudfront":
version "0.0.0" version "0.0.0"
uid "" uid ""
"@next-deploy/aws-component@link:./packages/aws-component": "@next-deploy/aws-component@link:node_modules/next-deploy/packages/aws-component":
version "0.0.0" version "0.0.0"
uid "" uid ""
"@next-deploy/aws-domain@link:./packages/aws-domain": "@next-deploy/aws-domain@link:node_modules/next-deploy/packages/aws-domain":
version "0.0.0" version "0.0.0"
uid "" uid ""
"@next-deploy/aws-lambda-builder@link:./packages/aws-lambda-builder": "@next-deploy/aws-lambda-builder@link:node_modules/next-deploy/packages/aws-lambda-builder":
version "0.0.0" version "0.0.0"
uid "" uid ""
"@next-deploy/aws-lambda@link:./packages/aws-lambda": "@next-deploy/aws-lambda@link:node_modules/next-deploy/packages/aws-lambda":
version "0.0.0" version "0.0.0"
uid "" uid ""
"@next-deploy/aws-s3@link:./packages/aws-s3": "@next-deploy/aws-s3@link:node_modules/next-deploy/packages/aws-s3":
version "0.0.0"
uid ""
"@next-deploy/github@link:node_modules/next-deploy/packages/github":
version "0.0.0" version "0.0.0"
uid "" uid ""
@ -2692,7 +2696,7 @@ ansi-escapes@^3.2.0:
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
ansi-escapes@^4.3.0: ansi-escapes@^4.3.0, ansi-escapes@^4.3.1:
version "4.3.1" version "4.3.1"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
@ -2799,13 +2803,13 @@ archiver@^3.0.0:
tar-stream "^2.1.0" tar-stream "^2.1.0"
zip-stream "^2.1.2" zip-stream "^2.1.2"
archiver@^4.0.1: archiver@^4.0.2:
version "4.0.1" version "4.0.2"
resolved "https://registry.yarnpkg.com/archiver/-/archiver-4.0.1.tgz#3f722b121777e361ca9fad374ecda38e77e63c7f" resolved "https://registry.yarnpkg.com/archiver/-/archiver-4.0.2.tgz#43c72865eadb4ddaaa2fb74852527b6a450d927c"
integrity sha512-/YV1pU4Nhpf/rJArM23W6GTUjT0l++VbjykrCRua1TSXrn+yM8Qs7XvtwSiRse0iCe49EPNf7ktXnPsWuSb91Q== integrity sha512-B9IZjlGwaxF33UN4oPbfBkyA4V1SxNLeIhR1qY8sRXSsbdUkEHrrOvwlYFPx+8uQeCe9M+FG6KgO+imDmQ79CQ==
dependencies: dependencies:
archiver-utils "^2.1.0" archiver-utils "^2.1.0"
async "^2.6.3" async "^3.2.0"
buffer-crc32 "^0.2.1" buffer-crc32 "^0.2.1"
glob "^7.1.6" glob "^7.1.6"
readable-stream "^3.6.0" readable-stream "^3.6.0"
@ -2962,6 +2966,11 @@ async@^2.6.3:
dependencies: dependencies:
lodash "^4.17.14" lodash "^4.17.14"
async@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
asynckit@^0.4.0: asynckit@^0.4.0:
version "0.4.0" version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -3507,7 +3516,7 @@ chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
chalk@^4.0.0: chalk@^4.0.0, chalk@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==