├── .eslintrc ├── .github ├── FUNDING.yml └── workflows │ └── build_and_test.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .prettierignore ├── LICENSE ├── README.md ├── bin └── self-hosted-shared-dependencies-cli.js ├── lib ├── Dockerfile.ejs └── self-hosted-shared-dependencies.js ├── package.json ├── pnpm-lock.yaml ├── test └── happy-path │ └── conf.js └── tsconfig.json /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["node-important-stuff"], 3 | "parser": "@babel/eslint-parser", 4 | "parserOptions": { 5 | "requireConfigFile": false 6 | }, 7 | "rules": { 8 | "node/no-unsupported-features/es-syntax": "off" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: ["joeldenning"] 4 | patreon: singlespa 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/build_and_test.yml: -------------------------------------------------------------------------------- 1 | name: Build and Test 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v2 14 | with: 15 | node-version: "16" 16 | - uses: pnpm/action-setup@v2.0.1 17 | with: 18 | version: 6.13.0 19 | - run: pnpm install --frozen-lockfile 20 | - run: pnpm test 21 | - run: pnpm run check-format 22 | - run: pnpm run lint 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | npm 107 | 108 | types -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | pnpx pretty-quick --staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | npm -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 single-spa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # self-hosted-shared-dependencies 2 | 3 | A tool for self hosting shared dependencies from npm 4 | 5 | ## Motivation 6 | 7 | To share dependencies between microfrontends with SystemJS, you need a URL reachable by the browser for each shared dependency. Using popular CDNs such as jsdelivr.net, unpkg.com, and cdnjs.com is the easiest way to do this, but requires that you rely on a third party service. For some organizations, self-hosting the dependencies is required for security or other reasons. 8 | 9 | The self-hosted-shared-dependencies project generates a directory of static frontend assets that can be hosted on a server or CDN of your choosing. The assets are generated upfront, so that the server does not have to do anything more than serve static files. An advantage of generating all files upfront is improved performance, availability, and scalability, since global object stores (such as AWS S3, Digital Ocean Spaces, or GCP Storage) generally are really good at that. 10 | 11 | ## Comparison to other tools 12 | 13 | Bundlers like webpack, rollup, etc do not produce separate files for each dependency, by default. Additionally, they generally do not create separate files for different versions of dependencies. 14 | 15 | Tools like jspm, snowpack, and vite can do this but often convert the packages to ESM format which is not usable by SystemJS. 16 | 17 | [esm-bundle](https://github.com/esm-bundle) libraries produce SystemJS versions of npm packages, but there are only a few dozen libraries available. 18 | 19 | Using a forked version of unpkg generally requires running a live server in production which makes calls to the npm registry as it receives requests from users, which is nice because you don't have to specify which packages you're using but also potentially worse for availability, performance, and scalability. 20 | 21 | ## Installation 22 | 23 | ```sh 24 | npm install --save-dev self-hosted-shared-dependencies 25 | 26 | yarn add --dev self-hosted-shared-dependencies 27 | 28 | pnpm install --save-dev self-hosted-shared-dependencies 29 | 30 | # Global installation (optional) 31 | 32 | npm install --global self-hosted-shared-dependencies 33 | 34 | yarn global add self-hosted-shared-dependencies 35 | 36 | pnpm install --global self-hosted-shared-dependencies 37 | ``` 38 | 39 | ## Requirements 40 | 41 | self-hosted-shared-dependencies requires NodeJS@>=14 (uses ES modules and nullish coalescing operator) 42 | 43 | ## Usage 44 | 45 | It's recommended to run self-hosted-shared-dependencies during the CI/CD build and deploy process of a repository called `shared-dependencies` within your organization. It will generate a static directory of frontend assets, and optionally a Dockerfile for self-hosting the frontend assets. The easiest way to accomplish this is often to add to your npm-scripts in your project's package.json: 46 | 47 | ```json 48 | { 49 | "scripts": { 50 | "build-shared-deps": "shared-deps build shared-deps.conf.mjs" 51 | } 52 | } 53 | ``` 54 | 55 | ### package.json 56 | 57 | For simpler use cases, self-hosted-shared-dependencies can read the `"dependencies"` section of your project's package.json and determine which packages to download. The main limitation of this approach is that you cannot provide package and version specific configuration to control which folders are included in the final output. 58 | 59 | To build from package.json, add the `--usePackageJSON` CLI flag 60 | 61 | ```sh 62 | shared-deps build --usePackageJSON 63 | ``` 64 | 65 | ```js 66 | // Or if you're using an npm-script to build, add the flag to your package.json 67 | { 68 | "scripts": { 69 | "build-shared-deps": "shared-deps build --usePackageJSON" 70 | } 71 | } 72 | ``` 73 | 74 | Then the `"dependencies"` in your package.json will be used to determine which versions to include. For example, the code below will result in all React 17 versions being included: 75 | 76 | ```js 77 | // In your package.json 78 | { 79 | "dependencies": { 80 | "react": "^17.0.0" 81 | } 82 | } 83 | ``` 84 | 85 | When using the package.json, you do not need to create a shared-deps.conf.mjs file. However, you may combine `--usePackageJSON` with a config file, if desired, as long as you don't specify `packages` in the config file (as `packages` and `usePackageJSON` are mutually exclusive options). 86 | 87 | ### Config File 88 | 89 | For full configuration options, create a shared-deps.conf.mjs file: 90 | 91 | ```js 92 | // shared-deps.conf.mjs 93 | 94 | /** 95 | * @type {import('self-hosted-shared-dependencies').BuildOpts} 96 | */ 97 | const config = { 98 | // Required if not using package.json, a list of npm package versions to include in the output directory 99 | packages: [ 100 | { 101 | // Required. The name of the package to include 102 | name: "react", 103 | 104 | // Optional. A list of glob strings used to determine which files within 105 | // the package to include in the build. By default, all files are included. 106 | // See https://www.npmjs.com/package/micromatch for glob implementation 107 | // Note that package.json and LICENSE files are always included. 108 | include: ["umd/**"], 109 | 110 | // Optional. A list of glob strings used to determine which files within 111 | // the package to exclude from the build. By default, no files are excluded. 112 | // See https://www.npmjs.com/package/micromatch for glob implementation 113 | // Note that package.json and LICENSE files are always included. 114 | exclude: ["cjs/**"], 115 | 116 | // Required. A list of semver ranges that determine which versions of the 117 | // npm package should be included in the build. 118 | // See https://semver.npmjs.com/ for more details 119 | versions: [ 120 | // When the version is a string, the package's include and exclude lists 121 | // are applied 122 | ">= 17", 123 | 124 | // When the version is an object, the version's include and exclude lists 125 | // take priority over the package's include and exclude lists 126 | { 127 | version: "16.14.0", 128 | include: ["umd/**", "cjs/**"], 129 | }, 130 | ], 131 | }, 132 | ], 133 | 134 | // Optional, defaults to false 135 | // When true, will parse the package.json file and use the 136 | // dependencies as the package list 137 | usePackageJSON: false, 138 | 139 | // Optional, defaults to "npm" 140 | // Change the name of the output directory where the static assets 141 | // will be placed. The outputDir is resolved relative to the CWD 142 | outputDir: "npm", 143 | 144 | // Optional, defaults to false 145 | // When true, the outputDir will be deleted at the beginning of the build 146 | clean: false, 147 | 148 | // Optional, defaults to false. 149 | // When true, a Dockerfile will be created in your static directory. 150 | // The Dockerfile uses nginx:latest as its base image 151 | generateDockerfile: false, 152 | 153 | // Optional, defaults to building all packages (no skipping) 154 | // When provided, this allows you to do incremental builds where 155 | // the build first calls out to your live server hosting your 156 | // shared dependencies to decide whether it needs to rebuild 157 | // the package. This is a performance optimization that makes the 158 | // build faster. For each package version, it will check 159 | // /@/package.json to 160 | // see if it needs to build the package version or not 161 | skipPackagesAtUrl: "https://cdn.example.com/npm/", 162 | 163 | // Optional, defaults to {}. 164 | // When provided, this allows you to configure the behavior of npm-registry-fetch, 165 | // such as providing username, password, or token to access private npm packages. 166 | // See https://github.com/npm/npm-registry-fetch#-fetch-options for documentation 167 | registryFetchOptions: { 168 | username: "test", 169 | password: "test", 170 | token: "test", 171 | registry: "https://registry.npmjs.org/", 172 | }, 173 | 174 | // Optional, defaults to "debug". Must be one of "debug", "warn", or "fatal" 175 | // This changes the verbosity of the stdout logging 176 | logLevel: "warn", 177 | 178 | // Optional, defaults to true. This is a safeguard against the clean operation deleting important directories accidentally, by forcing them to be absolute paths. To disable that behavior, set to false. 179 | absoluteDir: true, 180 | }; 181 | 182 | export default config; 183 | ``` 184 | 185 | Now you can run `npm run build` to generate the output directory. 186 | 187 | Once you have the output directory, you can run `npx http-server npm` to start up a server that hosts the files. In CI processes, usually the output directory is uploaded to a live server as part of a deployment. 188 | 189 | ## Example output 190 | 191 | Here's an example showing the file structure created by running `shared-deps build` 192 | 193 | ```sh 194 | npm 195 | npm/Dockerfile 196 | npm/react@17.0.0 197 | npm/react@17.0.0/LICENSE 198 | npm/react@17.0.0/umd 199 | npm/react@17.0.0/umd/react.production.min.js 200 | npm/react@17.0.0/umd/react.development.js 201 | npm/react@17.0.0/umd/react.profiling.min.js 202 | npm/react@17.0.0/package.json 203 | npm/react@17.0.1 204 | npm/react@17.0.1/LICENSE 205 | npm/react@17.0.1/umd 206 | npm/react@17.0.1/umd/react.production.min.js 207 | npm/react@17.0.1/umd/react.development.js 208 | npm/react@17.0.1/umd/react.profiling.min.js 209 | npm/react@17.0.1/package.json 210 | npm/react@17.0.2 211 | npm/react@17.0.2/LICENSE 212 | npm/react@17.0.2/umd 213 | npm/react@17.0.2/umd/react.production.min.js 214 | npm/react@17.0.2/umd/react.development.js 215 | npm/react@17.0.2/umd/react.profiling.min.js 216 | npm/react@17.0.2/package.json 217 | npm/react-dom@17.0.1 218 | npm/react-dom@17.0.1/LICENSE 219 | npm/react-dom@17.0.1/umd 220 | npm/react-dom@17.0.1/umd/react-dom-server.browser.development.js 221 | npm/react-dom@17.0.1/umd/react-dom.production.min.js 222 | npm/react-dom@17.0.1/umd/react-dom.profiling.min.js 223 | npm/react-dom@17.0.1/umd/react-dom-test-utils.production.min.js 224 | npm/react-dom@17.0.1/umd/react-dom.development.js 225 | npm/react-dom@17.0.1/umd/react-dom-server.browser.production.min.js 226 | npm/react-dom@17.0.1/umd/react-dom-test-utils.development.js 227 | npm/react-dom@17.0.1/package.json 228 | ``` 229 | 230 | ## Docker 231 | 232 | To host the output directory in a server running in a docker container, set the `generateDockerfile` option to `true`. That will produce an `npm/Dockerfile` file which you can use to create an image and run containers. 233 | 234 | To test the docker container, run the following: 235 | 236 | ```sh 237 | # assumes that your outputDir is set to "npm" 238 | 239 | # build the image 240 | docker build npm -t shared-deps 241 | 242 | # run the image as a container, exposing it to your host computer's port 8080 243 | docker run --name shared-deps -d -p 8080:80 shared-deps 244 | 245 | # verify that you can retrieve one of the built files 246 | curl http://localhost:8080/npm/react@17.0.0/umd/react.production.min.js 247 | 248 | # shut down the container 249 | docker stop shared-deps 250 | ``` 251 | 252 | ## CLI 253 | 254 | The CLI has the following flags: 255 | 256 | ```sh 257 | shared-deps build shared-deps.conf.mjs --clean --outputDir npm --generateDockerfile --skipPackagesAtUrl https://cdn.example.com/npm/ --logLevel warn 258 | ``` 259 | 260 | ## Javascript API 261 | 262 | You may also use this project via javascript. Note that it is published as an ES module so you must use `import` or `import()` to use it, you cannot use `require()`. 263 | 264 | ```js 265 | import { build } from "self-hosted-shared-dependencies"; 266 | 267 | build({ 268 | // This object is the same as the object exported from the Config File above 269 | packages: [ 270 | { 271 | name: "react", 272 | include: ["umd/**"], 273 | exclude: ["cjs/**"], 274 | versions: [ 275 | ">= 17", 276 | { 277 | version: "16.14.0", 278 | include: ["umd/**", "cjs/**"], 279 | }, 280 | ], 281 | }, 282 | ], 283 | usePackageJSON: false, 284 | outputDir: "npm", 285 | clean: false, 286 | generateDockerfile: false, 287 | skipPackagesAtUrl: "https://cdn.example.com/npm/", 288 | logLevel: "warn", 289 | }).then( 290 | () => { 291 | console.log("Finished!"); 292 | }, 293 | (err) => { 294 | console.error(err); 295 | process.exit(1); 296 | } 297 | ); 298 | ``` 299 | -------------------------------------------------------------------------------- /bin/self-hosted-shared-dependencies-cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { build } from "../lib/self-hosted-shared-dependencies.js"; 4 | import path from "path"; 5 | import minimist from "minimist"; 6 | import url from "url"; 7 | import { existsSync } from "fs"; 8 | 9 | const argv = minimist(process.argv.slice(2)); 10 | 11 | const command = process.env.SHARED_DEPENDENCIES_CONFIG ?? argv._[0] ?? "build"; 12 | 13 | const configFile = argv._.length > 1 ? argv._[1] : "shared-deps.conf.js"; 14 | 15 | const configFilePath = path.resolve(process.cwd(), configFile); 16 | const hasConfigFile = existsSync(configFilePath); 17 | if (!hasConfigFile && !argv.usePackageJSON) { 18 | throw Error( 19 | "You must either use a config file or add the --usePackageJSON flag" 20 | ); 21 | } 22 | const configPromise = hasConfigFile 23 | ? import(url.pathToFileURL(configFilePath)) 24 | : Promise.resolve({ default: {} }); 25 | configPromise 26 | .then(async (configModule) => { 27 | switch (command) { 28 | case "build": 29 | await build(Object.assign(configModule.default, argv)); 30 | case "serve": 31 | break; 32 | default: 33 | console.error( 34 | `self-hosted-shared-dependencies: Invalid CLI command '${command}'` 35 | ); 36 | process.exit(1); 37 | } 38 | }) 39 | .catch((err) => { 40 | console.error(err); 41 | process.exit(1); 42 | }); 43 | -------------------------------------------------------------------------------- /lib/Dockerfile.ejs: -------------------------------------------------------------------------------- 1 | FROM nginx:latest 2 | COPY . /usr/share/nginx/html/<%- outputDir %> -------------------------------------------------------------------------------- /lib/self-hosted-shared-dependencies.js: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import _rimraf from "rimraf"; 3 | import util from "util"; 4 | import npmFetch from "npm-registry-fetch"; 5 | import semver from "semver"; 6 | import tar from "tar"; 7 | import fs from "fs/promises"; 8 | import mkdirp from "mkdirp"; 9 | import https from "https"; 10 | import http from "http"; 11 | import micromatch from "micromatch"; 12 | import url from "url"; 13 | import ejs from "ejs"; 14 | 15 | const rimraf = util.promisify(_rimraf); 16 | const renderFile = util.promisify(ejs.renderFile); 17 | 18 | const errPrefix = `self-hosted-shared-dependencies:`; 19 | 20 | const logLevels = { 21 | debug: 0, 22 | warn: 1, 23 | fatal: 2, 24 | }; 25 | 26 | /** 27 | * 28 | * @typedef {{ 29 | * version: string, 30 | * include?: string[] 31 | * exclude?: string[] 32 | * } | string} PackageVersion 33 | * 34 | * @typedef {{ 35 | * name: string, 36 | * versions: PackageVersion[] 37 | * include?: string[], 38 | * exclude?: string[], 39 | * }} PackageToBuild 40 | * 41 | * @typedef { import("npm-registry-fetch").Options } RegistryFetchOptions 42 | * 43 | * @typedef {{ 44 | * packages: PackageToBuild[], 45 | * outputDir?: string, 46 | * clean?: boolean, 47 | * logLevel?: 'debug' | 'warn' | 'fatal', 48 | * absoluteDir?: boolean, 49 | * skipPackagesAtUrl?: string, 50 | * generateDockerfile?: boolean, 51 | * usePackageJSON?: boolean, 52 | * registryFetchOptions?: RegistryFetchOptions, 53 | * }} BuildOpts 54 | * 55 | * @param {BuildOpts} opts 56 | */ 57 | export async function build({ 58 | clean, 59 | outputDir, 60 | packages: packagesConfig, 61 | usePackageJSON, 62 | logLevel, 63 | absoluteDir, 64 | skipPackagesAtUrl, 65 | generateDockerfile, 66 | registryFetchOptions, 67 | }) { 68 | const start = Date.now(); 69 | const packages = !usePackageJSON 70 | ? packagesConfig 71 | : await packageConfigFromPackageJson(); 72 | 73 | if (!outputDir) { 74 | outputDir = "npm"; 75 | } 76 | 77 | if (typeof outputDir !== "string") { 78 | throw Error(`${errPrefix} outputDir must be a string`); 79 | } 80 | 81 | if (!Array.isArray(packages)) { 82 | throw Error(`${errPrefix} Invalid packages option - must be array`); 83 | } 84 | 85 | if (typeof clean !== "undefined" && typeof clean !== "boolean") { 86 | throw Error(`${errPrefix} clean option must be a boolean`); 87 | } 88 | 89 | if (clean && path.isAbsolute(outputDir) && !absoluteDir) { 90 | throw Error( 91 | `${errPrefix} outputDir may not be an absolute path when clean is true, as a precaution against unintentional deletion of important directories. To bypass this precaution, set absoluteDir: true in your config` 92 | ); 93 | } 94 | 95 | if (logLevel && !["debug", "warn", "fatal"].includes(logLevel)) { 96 | throw Error( 97 | `${errPrefix} logLevel must be one of the following: "debug", "warn", "fatal"` 98 | ); 99 | } 100 | 101 | let logLevelInt; 102 | 103 | if (logLevels.hasOwnProperty(logLevel)) { 104 | logLevelInt = logLevels[logLevel]; 105 | } else { 106 | logLevelInt = 0; 107 | } 108 | 109 | if (skipPackagesAtUrl && typeof skipPackagesAtUrl !== "string") { 110 | throw Error(`${errPrefix} skipPackagesAtUrl must be a string`); 111 | } 112 | 113 | packages.forEach((p, i) => { 114 | if (typeof p !== "object" || !p) { 115 | throw Error( 116 | `${errPrefix} Invalid package at index ${i} - must be an object` 117 | ); 118 | } 119 | 120 | if (typeof p.name !== "string") { 121 | throw Error( 122 | `${errPrefix} Invalid package at index ${i} - package.name must be a string` 123 | ); 124 | } 125 | 126 | if (!Array.isArray(p.versions)) { 127 | throw Error( 128 | `${errPrefix} Invalid package ${p.name} at index ${i} - package.versions must be an array` 129 | ); 130 | } 131 | 132 | p.versions.forEach((version, j) => { 133 | if (typeof version !== "string") { 134 | if (typeof version !== "object" || !version) { 135 | throw Error( 136 | `${errPrefix} Invalid package ${p.name} at index ${i} - invalid version at index ${j} - must be a string or object` 137 | ); 138 | } 139 | 140 | if ( 141 | typeof version.version !== "string" || 142 | !semver.valid(version.version) 143 | ) { 144 | throw Error( 145 | `${errPrefix} Invalid package ${p.name} - packages[${i}].versions[${i}].version must be a valid semver string` 146 | ); 147 | } 148 | 149 | if ( 150 | version.hasOwnProperty("include") && 151 | (!Array.isArray(version.include) || 152 | version.include.some((k) => typeof k !== "string")) 153 | ) { 154 | throw Error( 155 | `${errPrefix} Invalid package ${p.name} - packages[${i}].versions[${i}].include must be an array of strings, if defined` 156 | ); 157 | } 158 | 159 | if ( 160 | version.hasOwnProperty("exclude") && 161 | (!Array.isArray(version.exclude) || 162 | version.exclude.some((k) => typeof k !== "string")) 163 | ) { 164 | throw Error( 165 | `${errPrefix} Invalid package ${p.name} - packages[${i}].versions[${i}].exclude must be an array of strings, if defined` 166 | ); 167 | } 168 | } 169 | }); 170 | 171 | if ( 172 | p.hasOwnProperty("include") && 173 | (!Array.isArray(p.include) || 174 | p.include.some((k) => typeof k !== "string")) 175 | ) { 176 | throw Error( 177 | `${errPrefix} Invalid package ${p.name} - packages[${i}].include must be an array of strings, if defined` 178 | ); 179 | } 180 | 181 | if ( 182 | p.hasOwnProperty("exclude") && 183 | (!Array.isArray(p.exclude) || 184 | p.exclude.some((k) => typeof k !== "string")) 185 | ) { 186 | throw Error( 187 | `${errPrefix} Invalid package ${p.name} - packages[${i}].exclude must be an array of strings, if defined` 188 | ); 189 | } 190 | }); 191 | 192 | const npmFetchOptions = getNpmFetchOptions(); 193 | 194 | if (clean) { 195 | await rimraf(outputDir); 196 | } 197 | 198 | warn( 199 | `Building ${packages.length.toLocaleString()} packages concurrently (with cache)` 200 | ); 201 | 202 | const packagePromises = packages.map(buildPackage); 203 | 204 | await mkdirp(outputDir); 205 | 206 | for (let packagePromise of packagePromises) { 207 | for await (let logValue of packagePromise) { 208 | log(...logValue); 209 | } 210 | } 211 | 212 | if (generateDockerfile) { 213 | warn(`Creating ${outputDir}/Dockerfile`); 214 | const Dockerfile = await renderFile( 215 | url.fileURLToPath(new url.URL("Dockerfile.ejs", import.meta.url)), 216 | { outputDir }, 217 | {} 218 | ); 219 | await fs.writeFile(path.resolve(outputDir, "Dockerfile"), Dockerfile); 220 | } 221 | 222 | warn(`Finished build in ${(Date.now() - start) / 1000} seconds`); 223 | 224 | /** 225 | * 226 | * @param {PackageToBuild} p 227 | */ 228 | async function* buildPackage(p) { 229 | let metadata; 230 | 231 | yield [logLevels.warn, `--> ${p.name}`]; 232 | 233 | try { 234 | metadata = await npmFetch.json(`/${p.name}`, { 235 | ...npmFetchOptions, 236 | // pass in spec so that npmFetch tries to resolve scoped registries 237 | spec: p.name, 238 | }); 239 | } catch (err) { 240 | yield [logLevels.warn, err]; 241 | return yield [ 242 | logLevels.fatal, 243 | `----> No package '${p.name}' found in the npm registry`, 244 | ]; 245 | } 246 | 247 | const matchedVersions = Object.keys(metadata.versions).filter((version) => 248 | p.versions 249 | .map((v) => (typeof v === "string" ? v : v.version)) 250 | .some((v) => semver.satisfies(version, v)) 251 | ); 252 | 253 | if (matchedVersions.length > 0) { 254 | yield [ 255 | logLevels.debug, 256 | `----> Matched versions: ${matchedVersions.join(", ")}`, 257 | ]; 258 | } else { 259 | return yield [logLevels.fatal, `----> No matching versions`]; 260 | } 261 | 262 | const versionLogs = matchedVersions.map(processVersion); 263 | 264 | for (let versionLog of versionLogs) { 265 | for await (let log of versionLog) { 266 | yield log; 267 | } 268 | } 269 | 270 | async function* processVersion(matchedVersion) { 271 | if (skipPackagesAtUrl) { 272 | const cacheCheckpath = new url.URL( 273 | `${p.name}@${matchedVersion}/package.json`, 274 | skipPackagesAtUrl 275 | ); 276 | const shouldSkip = await new Promise((resolve, reject) => { 277 | const stream = ( 278 | cacheCheckpath.href.startsWith("http://") ? http : https 279 | ).request(cacheCheckpath); 280 | stream.on("response", (response) => { 281 | resolve(response.statusCode >= 200 && response.statusCode < 300); 282 | }); 283 | stream.on("error", (err) => { 284 | reject(err); 285 | }); 286 | stream.end(); 287 | }); 288 | 289 | if (shouldSkip) { 290 | return yield [ 291 | logLevels.warn, 292 | `----> Skipping ${p.name}@${matchedVersion} because it is already available at URL ${cacheCheckpath.href}`, 293 | ]; 294 | } 295 | } 296 | 297 | const dir = path.resolve(outputDir, `${p.name}@${matchedVersion}`); 298 | 299 | yield [ 300 | logLevels.warn, 301 | `----> Downloading and extracting ${p.name}@${matchedVersion}`, 302 | ]; 303 | 304 | try { 305 | await fs.stat(dir); 306 | } catch { 307 | await fs.mkdir(dir, { recursive: true }); 308 | } 309 | 310 | const include = matchedVersion.include || p.include || []; 311 | const exclude = matchedVersion.exclude || p.exclude || []; 312 | 313 | let files = []; 314 | 315 | await new Promise((resolve, reject) => { 316 | const untarStream = tar.extract({ 317 | cwd: dir, 318 | filter(path) { 319 | const filePath = path.slice("package/".length); 320 | 321 | if (isLicense(filePath) || isPackageJson(filePath)) { 322 | files.push(filePath); 323 | return true; 324 | } 325 | 326 | const included = 327 | include.length > 0 ? micromatch.isMatch(filePath, include) : true; 328 | const excluded = 329 | exclude.length > 0 330 | ? micromatch.isMatch(filePath, exclude) 331 | : false; 332 | 333 | if (included && !excluded) { 334 | files.push(filePath); 335 | return true; 336 | } else { 337 | return false; 338 | } 339 | }, 340 | strip: 1, 341 | }); 342 | 343 | const tarballUrl = metadata.versions[matchedVersion].dist.tarball; 344 | 345 | npmFetch(tarballUrl, npmFetchOptions) 346 | .then((res) => res.body.pipe(untarStream)) 347 | .catch(reject); 348 | 349 | untarStream.on("end", () => { 350 | resolve(); 351 | }); 352 | 353 | untarStream.on("error", (err) => { 354 | reject(err); 355 | }); 356 | }); 357 | 358 | for (let file of files) { 359 | yield [logLevels.debug, `------> ${file}`]; 360 | } 361 | } 362 | } 363 | 364 | function getNpmFetchOptions() { 365 | const options = {}; 366 | 367 | if (registryFetchOptions) { 368 | Object.assign(options, registryFetchOptions); 369 | } 370 | 371 | return options; 372 | } 373 | 374 | function log(priority, msg) { 375 | if (priority === 0) { 376 | debug(msg); 377 | } else if (priority === 1) { 378 | warn(msg); 379 | } else if (priority === 2) { 380 | fatal(msg); 381 | } 382 | } 383 | 384 | function debug(msg) { 385 | if (logLevelInt < 1) { 386 | console.info(msg); 387 | } 388 | } 389 | 390 | function warn(msg) { 391 | if (logLevelInt < 2) { 392 | console.warn(msg); 393 | } 394 | } 395 | 396 | function fatal(msg) { 397 | console.error(msg); 398 | throw Error(msg); 399 | } 400 | } 401 | 402 | /** 403 | * 404 | * @param {string} filePath 405 | */ 406 | function isLicense(filePath) { 407 | const fileName = path.basename(filePath); 408 | return ["license", "license.md", "license.txt"].some( 409 | (candidate) => fileName.toLowerCase() === candidate 410 | ); 411 | } 412 | 413 | function isPackageJson(filePath) { 414 | return "package.json" === filePath.toLowerCase(); 415 | } 416 | 417 | async function packageConfigFromPackageJson() { 418 | const packageJson = JSON.parse( 419 | await fs.readFile(path.resolve(process.cwd(), "package.json"), "utf8") 420 | ); 421 | return Object.entries(packageJson.dependencies).map(([name, version]) => { 422 | return { 423 | name, 424 | versions: [version], 425 | }; 426 | }); 427 | } 428 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "name": "self-hosted-shared-dependencies", 4 | "version": "2.0.1", 5 | "description": "Self host npm dependencies", 6 | "main": "lib/self-hosted-shared-dependencies.js", 7 | "scripts": { 8 | "test": "node bin/self-hosted-shared-dependencies-cli.js build test/happy-path/conf.js --clean", 9 | "lint": "eslint lib bin", 10 | "format": "prettier --write .", 11 | "check-format": "prettier --check .", 12 | "postinstall": "husky install", 13 | "prepublishOnly": "pinst --disable && tsc", 14 | "postpublish": "pinst --enable" 15 | }, 16 | "bin": { 17 | "shared-deps": "bin/self-hosted-shared-dependencies-cli.js" 18 | }, 19 | "engines": { 20 | "node": ">=14" 21 | }, 22 | "files": [ 23 | "types", 24 | "lib", 25 | "bin" 26 | ], 27 | "types": "types/self-hosted-shared-dependencies.d.ts", 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/single-spa/self-hosted-shared-dependencies.git" 31 | }, 32 | "keywords": [ 33 | "single-spa", 34 | "microfrontends", 35 | "shared", 36 | "dependencies", 37 | "systemjs" 38 | ], 39 | "author": "Joel Denning", 40 | "license": "MIT", 41 | "bugs": { 42 | "url": "https://github.com/single-spa/self-hosted-shared-dependencies/issues" 43 | }, 44 | "homepage": "https://github.com/single-spa/self-hosted-shared-dependencies#readme", 45 | "dependencies": { 46 | "ejs": "^3.1.6", 47 | "micromatch": "^4.0.4", 48 | "minimist": "^1.2.5", 49 | "mkdirp": "^1.0.4", 50 | "npm-registry-fetch": "^10.1.0", 51 | "rimraf": "^3.0.2", 52 | "semver": "^7.3.5", 53 | "tar": "^6.1.0" 54 | }, 55 | "devDependencies": { 56 | "@babel/core": "^7.15.0", 57 | "@babel/eslint-parser": "^7.15.0", 58 | "eslint": "^7.32.0", 59 | "eslint-config-node-important-stuff": "^1.1.0", 60 | "husky": "^7.0.1", 61 | "pinst": "^2.1.6", 62 | "prettier": "^2.3.2", 63 | "pretty-quick": "^3.1.1", 64 | "typescript": "^4.2.4" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@babel/core': ^7.15.0 5 | '@babel/eslint-parser': ^7.15.0 6 | ejs: ^3.1.6 7 | eslint: ^7.32.0 8 | eslint-config-node-important-stuff: ^1.1.0 9 | husky: ^7.0.1 10 | micromatch: ^4.0.4 11 | minimist: ^1.2.5 12 | mkdirp: ^1.0.4 13 | npm-registry-fetch: ^10.1.0 14 | pinst: ^2.1.6 15 | prettier: ^2.3.2 16 | pretty-quick: ^3.1.1 17 | rimraf: ^3.0.2 18 | semver: ^7.3.5 19 | tar: ^6.1.0 20 | typescript: ^4.2.4 21 | 22 | dependencies: 23 | ejs: 3.1.6 24 | micromatch: 4.0.4 25 | minimist: 1.2.5 26 | mkdirp: 1.0.4 27 | npm-registry-fetch: 10.1.0 28 | rimraf: 3.0.2 29 | semver: 7.3.5 30 | tar: 6.1.0 31 | 32 | devDependencies: 33 | '@babel/core': 7.15.0 34 | '@babel/eslint-parser': 7.15.0_@babel+core@7.15.0+eslint@7.32.0 35 | eslint: 7.32.0 36 | eslint-config-node-important-stuff: 1.1.0_eslint@7.32.0 37 | husky: 7.0.1 38 | pinst: 2.1.6 39 | prettier: 2.3.2 40 | pretty-quick: 3.1.1_prettier@2.3.2 41 | typescript: 4.2.4 42 | 43 | packages: 44 | 45 | /@babel/code-frame/7.12.11: 46 | resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} 47 | dependencies: 48 | '@babel/highlight': 7.14.5 49 | dev: true 50 | 51 | /@babel/code-frame/7.14.5: 52 | resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==} 53 | engines: {node: '>=6.9.0'} 54 | dependencies: 55 | '@babel/highlight': 7.14.5 56 | dev: true 57 | 58 | /@babel/compat-data/7.15.0: 59 | resolution: {integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==} 60 | engines: {node: '>=6.9.0'} 61 | dev: true 62 | 63 | /@babel/core/7.15.0: 64 | resolution: {integrity: sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | '@babel/code-frame': 7.14.5 68 | '@babel/generator': 7.15.0 69 | '@babel/helper-compilation-targets': 7.15.0_@babel+core@7.15.0 70 | '@babel/helper-module-transforms': 7.15.0 71 | '@babel/helpers': 7.15.3 72 | '@babel/parser': 7.15.3 73 | '@babel/template': 7.14.5 74 | '@babel/traverse': 7.15.0 75 | '@babel/types': 7.15.0 76 | convert-source-map: 1.8.0 77 | debug: 4.3.1 78 | gensync: 1.0.0-beta.2 79 | json5: 2.2.0 80 | semver: 6.3.0 81 | source-map: 0.5.7 82 | transitivePeerDependencies: 83 | - supports-color 84 | dev: true 85 | 86 | /@babel/eslint-parser/7.15.0_@babel+core@7.15.0+eslint@7.32.0: 87 | resolution: {integrity: sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==} 88 | engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} 89 | peerDependencies: 90 | '@babel/core': '>=7.11.0' 91 | eslint: '>=7.5.0' 92 | dependencies: 93 | '@babel/core': 7.15.0 94 | eslint: 7.32.0 95 | eslint-scope: 5.1.1 96 | eslint-visitor-keys: 2.1.0 97 | semver: 6.3.0 98 | dev: true 99 | 100 | /@babel/generator/7.15.0: 101 | resolution: {integrity: sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==} 102 | engines: {node: '>=6.9.0'} 103 | dependencies: 104 | '@babel/types': 7.15.0 105 | jsesc: 2.5.2 106 | source-map: 0.5.7 107 | dev: true 108 | 109 | /@babel/helper-compilation-targets/7.15.0_@babel+core@7.15.0: 110 | resolution: {integrity: sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==} 111 | engines: {node: '>=6.9.0'} 112 | peerDependencies: 113 | '@babel/core': ^7.0.0 114 | dependencies: 115 | '@babel/compat-data': 7.15.0 116 | '@babel/core': 7.15.0 117 | '@babel/helper-validator-option': 7.14.5 118 | browserslist: 4.16.7 119 | semver: 6.3.0 120 | dev: true 121 | 122 | /@babel/helper-function-name/7.14.5: 123 | resolution: {integrity: sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==} 124 | engines: {node: '>=6.9.0'} 125 | dependencies: 126 | '@babel/helper-get-function-arity': 7.14.5 127 | '@babel/template': 7.14.5 128 | '@babel/types': 7.15.0 129 | dev: true 130 | 131 | /@babel/helper-get-function-arity/7.14.5: 132 | resolution: {integrity: sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==} 133 | engines: {node: '>=6.9.0'} 134 | dependencies: 135 | '@babel/types': 7.15.0 136 | dev: true 137 | 138 | /@babel/helper-hoist-variables/7.14.5: 139 | resolution: {integrity: sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==} 140 | engines: {node: '>=6.9.0'} 141 | dependencies: 142 | '@babel/types': 7.15.0 143 | dev: true 144 | 145 | /@babel/helper-member-expression-to-functions/7.15.0: 146 | resolution: {integrity: sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==} 147 | engines: {node: '>=6.9.0'} 148 | dependencies: 149 | '@babel/types': 7.15.0 150 | dev: true 151 | 152 | /@babel/helper-module-imports/7.14.5: 153 | resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==} 154 | engines: {node: '>=6.9.0'} 155 | dependencies: 156 | '@babel/types': 7.15.0 157 | dev: true 158 | 159 | /@babel/helper-module-transforms/7.15.0: 160 | resolution: {integrity: sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==} 161 | engines: {node: '>=6.9.0'} 162 | dependencies: 163 | '@babel/helper-module-imports': 7.14.5 164 | '@babel/helper-replace-supers': 7.15.0 165 | '@babel/helper-simple-access': 7.14.8 166 | '@babel/helper-split-export-declaration': 7.14.5 167 | '@babel/helper-validator-identifier': 7.14.9 168 | '@babel/template': 7.14.5 169 | '@babel/traverse': 7.15.0 170 | '@babel/types': 7.15.0 171 | transitivePeerDependencies: 172 | - supports-color 173 | dev: true 174 | 175 | /@babel/helper-optimise-call-expression/7.14.5: 176 | resolution: {integrity: sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==} 177 | engines: {node: '>=6.9.0'} 178 | dependencies: 179 | '@babel/types': 7.15.0 180 | dev: true 181 | 182 | /@babel/helper-replace-supers/7.15.0: 183 | resolution: {integrity: sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==} 184 | engines: {node: '>=6.9.0'} 185 | dependencies: 186 | '@babel/helper-member-expression-to-functions': 7.15.0 187 | '@babel/helper-optimise-call-expression': 7.14.5 188 | '@babel/traverse': 7.15.0 189 | '@babel/types': 7.15.0 190 | transitivePeerDependencies: 191 | - supports-color 192 | dev: true 193 | 194 | /@babel/helper-simple-access/7.14.8: 195 | resolution: {integrity: sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==} 196 | engines: {node: '>=6.9.0'} 197 | dependencies: 198 | '@babel/types': 7.15.0 199 | dev: true 200 | 201 | /@babel/helper-split-export-declaration/7.14.5: 202 | resolution: {integrity: sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==} 203 | engines: {node: '>=6.9.0'} 204 | dependencies: 205 | '@babel/types': 7.15.0 206 | dev: true 207 | 208 | /@babel/helper-validator-identifier/7.14.9: 209 | resolution: {integrity: sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==} 210 | engines: {node: '>=6.9.0'} 211 | dev: true 212 | 213 | /@babel/helper-validator-option/7.14.5: 214 | resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} 215 | engines: {node: '>=6.9.0'} 216 | dev: true 217 | 218 | /@babel/helpers/7.15.3: 219 | resolution: {integrity: sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==} 220 | engines: {node: '>=6.9.0'} 221 | dependencies: 222 | '@babel/template': 7.14.5 223 | '@babel/traverse': 7.15.0 224 | '@babel/types': 7.15.0 225 | transitivePeerDependencies: 226 | - supports-color 227 | dev: true 228 | 229 | /@babel/highlight/7.14.5: 230 | resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} 231 | engines: {node: '>=6.9.0'} 232 | dependencies: 233 | '@babel/helper-validator-identifier': 7.14.9 234 | chalk: 2.4.2 235 | js-tokens: 4.0.0 236 | dev: true 237 | 238 | /@babel/parser/7.15.3: 239 | resolution: {integrity: sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==} 240 | engines: {node: '>=6.0.0'} 241 | hasBin: true 242 | dev: true 243 | 244 | /@babel/template/7.14.5: 245 | resolution: {integrity: sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==} 246 | engines: {node: '>=6.9.0'} 247 | dependencies: 248 | '@babel/code-frame': 7.14.5 249 | '@babel/parser': 7.15.3 250 | '@babel/types': 7.15.0 251 | dev: true 252 | 253 | /@babel/traverse/7.15.0: 254 | resolution: {integrity: sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==} 255 | engines: {node: '>=6.9.0'} 256 | dependencies: 257 | '@babel/code-frame': 7.14.5 258 | '@babel/generator': 7.15.0 259 | '@babel/helper-function-name': 7.14.5 260 | '@babel/helper-hoist-variables': 7.14.5 261 | '@babel/helper-split-export-declaration': 7.14.5 262 | '@babel/parser': 7.15.3 263 | '@babel/types': 7.15.0 264 | debug: 4.3.1 265 | globals: 11.12.0 266 | transitivePeerDependencies: 267 | - supports-color 268 | dev: true 269 | 270 | /@babel/types/7.15.0: 271 | resolution: {integrity: sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==} 272 | engines: {node: '>=6.9.0'} 273 | dependencies: 274 | '@babel/helper-validator-identifier': 7.14.9 275 | to-fast-properties: 2.0.0 276 | dev: true 277 | 278 | /@eslint/eslintrc/0.4.3: 279 | resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} 280 | engines: {node: ^10.12.0 || >=12.0.0} 281 | dependencies: 282 | ajv: 6.12.6 283 | debug: 4.3.1 284 | espree: 7.3.1 285 | globals: 13.11.0 286 | ignore: 4.0.6 287 | import-fresh: 3.3.0 288 | js-yaml: 3.14.1 289 | minimatch: 3.0.4 290 | strip-json-comments: 3.1.1 291 | transitivePeerDependencies: 292 | - supports-color 293 | dev: true 294 | 295 | /@humanwhocodes/config-array/0.5.0: 296 | resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} 297 | engines: {node: '>=10.10.0'} 298 | dependencies: 299 | '@humanwhocodes/object-schema': 1.2.0 300 | debug: 4.3.1 301 | minimatch: 3.0.4 302 | transitivePeerDependencies: 303 | - supports-color 304 | dev: true 305 | 306 | /@humanwhocodes/object-schema/1.2.0: 307 | resolution: {integrity: sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==} 308 | dev: true 309 | 310 | /@npmcli/move-file/1.1.2: 311 | resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} 312 | engines: {node: '>=10'} 313 | dependencies: 314 | mkdirp: 1.0.4 315 | rimraf: 3.0.2 316 | dev: false 317 | 318 | /@tootallnate/once/1.1.2: 319 | resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 320 | engines: {node: '>= 6'} 321 | dev: false 322 | 323 | /@types/minimatch/3.0.4: 324 | resolution: {integrity: sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==} 325 | dev: true 326 | 327 | /acorn-jsx/5.3.2_acorn@7.4.1: 328 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 329 | peerDependencies: 330 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 331 | dependencies: 332 | acorn: 7.4.1 333 | dev: true 334 | 335 | /acorn/7.4.1: 336 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 337 | engines: {node: '>=0.4.0'} 338 | hasBin: true 339 | dev: true 340 | 341 | /agent-base/6.0.2: 342 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 343 | engines: {node: '>= 6.0.0'} 344 | dependencies: 345 | debug: 4.3.1 346 | transitivePeerDependencies: 347 | - supports-color 348 | dev: false 349 | 350 | /agentkeepalive/4.1.4: 351 | resolution: {integrity: sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==} 352 | engines: {node: '>= 8.0.0'} 353 | dependencies: 354 | debug: 4.3.1 355 | depd: 1.1.2 356 | humanize-ms: 1.2.1 357 | transitivePeerDependencies: 358 | - supports-color 359 | dev: false 360 | 361 | /aggregate-error/3.1.0: 362 | resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 363 | engines: {node: '>=8'} 364 | dependencies: 365 | clean-stack: 2.2.0 366 | indent-string: 4.0.0 367 | dev: false 368 | 369 | /ajv/6.12.6: 370 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 371 | dependencies: 372 | fast-deep-equal: 3.1.3 373 | fast-json-stable-stringify: 2.1.0 374 | json-schema-traverse: 0.4.1 375 | uri-js: 4.4.1 376 | dev: true 377 | 378 | /ajv/8.6.2: 379 | resolution: {integrity: sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==} 380 | dependencies: 381 | fast-deep-equal: 3.1.3 382 | json-schema-traverse: 1.0.0 383 | require-from-string: 2.0.2 384 | uri-js: 4.4.1 385 | dev: true 386 | 387 | /ansi-colors/4.1.1: 388 | resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} 389 | engines: {node: '>=6'} 390 | dev: true 391 | 392 | /ansi-regex/5.0.0: 393 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} 394 | engines: {node: '>=8'} 395 | dev: true 396 | 397 | /ansi-styles/3.2.1: 398 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 399 | engines: {node: '>=4'} 400 | dependencies: 401 | color-convert: 1.9.3 402 | 403 | /ansi-styles/4.3.0: 404 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 405 | engines: {node: '>=8'} 406 | dependencies: 407 | color-convert: 2.0.1 408 | dev: true 409 | 410 | /argparse/1.0.10: 411 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 412 | dependencies: 413 | sprintf-js: 1.0.3 414 | dev: true 415 | 416 | /array-differ/3.0.0: 417 | resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} 418 | engines: {node: '>=8'} 419 | dev: true 420 | 421 | /array-union/2.1.0: 422 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 423 | engines: {node: '>=8'} 424 | dev: true 425 | 426 | /arrify/2.0.1: 427 | resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} 428 | engines: {node: '>=8'} 429 | dev: true 430 | 431 | /astral-regex/2.0.0: 432 | resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} 433 | engines: {node: '>=8'} 434 | dev: true 435 | 436 | /async/0.9.2: 437 | resolution: {integrity: sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=} 438 | dev: false 439 | 440 | /balanced-match/1.0.2: 441 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 442 | 443 | /brace-expansion/1.1.11: 444 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 445 | dependencies: 446 | balanced-match: 1.0.2 447 | concat-map: 0.0.1 448 | 449 | /braces/3.0.2: 450 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 451 | engines: {node: '>=8'} 452 | dependencies: 453 | fill-range: 7.0.1 454 | dev: false 455 | 456 | /browserslist/4.16.7: 457 | resolution: {integrity: sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==} 458 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 459 | hasBin: true 460 | dependencies: 461 | caniuse-lite: 1.0.30001251 462 | colorette: 1.3.0 463 | electron-to-chromium: 1.3.805 464 | escalade: 3.1.1 465 | node-releases: 1.1.74 466 | dev: true 467 | 468 | /builtins/1.0.3: 469 | resolution: {integrity: sha1-y5T662HIaWRR2zZTThQi+U8K7og=} 470 | dev: false 471 | 472 | /cacache/15.0.6: 473 | resolution: {integrity: sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==} 474 | engines: {node: '>= 10'} 475 | dependencies: 476 | '@npmcli/move-file': 1.1.2 477 | chownr: 2.0.0 478 | fs-minipass: 2.1.0 479 | glob: 7.1.6 480 | infer-owner: 1.0.4 481 | lru-cache: 6.0.0 482 | minipass: 3.1.3 483 | minipass-collect: 1.0.2 484 | minipass-flush: 1.0.5 485 | minipass-pipeline: 1.2.4 486 | mkdirp: 1.0.4 487 | p-map: 4.0.0 488 | promise-inflight: 1.0.1 489 | rimraf: 3.0.2 490 | ssri: 8.0.1 491 | tar: 6.1.0 492 | unique-filename: 1.1.1 493 | dev: false 494 | 495 | /callsites/3.1.0: 496 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 497 | engines: {node: '>=6'} 498 | dev: true 499 | 500 | /caniuse-lite/1.0.30001251: 501 | resolution: {integrity: sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==} 502 | dev: true 503 | 504 | /chalk/2.4.2: 505 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 506 | engines: {node: '>=4'} 507 | dependencies: 508 | ansi-styles: 3.2.1 509 | escape-string-regexp: 1.0.5 510 | supports-color: 5.5.0 511 | 512 | /chalk/3.0.0: 513 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 514 | engines: {node: '>=8'} 515 | dependencies: 516 | ansi-styles: 4.3.0 517 | supports-color: 7.2.0 518 | dev: true 519 | 520 | /chalk/4.1.2: 521 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 522 | engines: {node: '>=10'} 523 | dependencies: 524 | ansi-styles: 4.3.0 525 | supports-color: 7.2.0 526 | dev: true 527 | 528 | /chownr/2.0.0: 529 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 530 | engines: {node: '>=10'} 531 | dev: false 532 | 533 | /clean-stack/2.2.0: 534 | resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 535 | engines: {node: '>=6'} 536 | dev: false 537 | 538 | /color-convert/1.9.3: 539 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 540 | dependencies: 541 | color-name: 1.1.3 542 | 543 | /color-convert/2.0.1: 544 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 545 | engines: {node: '>=7.0.0'} 546 | dependencies: 547 | color-name: 1.1.4 548 | dev: true 549 | 550 | /color-name/1.1.3: 551 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 552 | 553 | /color-name/1.1.4: 554 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 555 | dev: true 556 | 557 | /colorette/1.3.0: 558 | resolution: {integrity: sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==} 559 | dev: true 560 | 561 | /concat-map/0.0.1: 562 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 563 | 564 | /convert-source-map/1.8.0: 565 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 566 | dependencies: 567 | safe-buffer: 5.1.2 568 | dev: true 569 | 570 | /cross-spawn/7.0.3: 571 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 572 | engines: {node: '>= 8'} 573 | dependencies: 574 | path-key: 3.1.1 575 | shebang-command: 2.0.0 576 | which: 2.0.2 577 | dev: true 578 | 579 | /debug/4.3.1: 580 | resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} 581 | engines: {node: '>=6.0'} 582 | peerDependencies: 583 | supports-color: '*' 584 | peerDependenciesMeta: 585 | supports-color: 586 | optional: true 587 | dependencies: 588 | ms: 2.1.2 589 | 590 | /deep-is/0.1.3: 591 | resolution: {integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=} 592 | dev: true 593 | 594 | /depd/1.1.2: 595 | resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} 596 | engines: {node: '>= 0.6'} 597 | dev: false 598 | 599 | /doctrine/3.0.0: 600 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 601 | engines: {node: '>=6.0.0'} 602 | dependencies: 603 | esutils: 2.0.3 604 | dev: true 605 | 606 | /ejs/3.1.6: 607 | resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==} 608 | engines: {node: '>=0.10.0'} 609 | hasBin: true 610 | dependencies: 611 | jake: 10.8.2 612 | dev: false 613 | 614 | /electron-to-chromium/1.3.805: 615 | resolution: {integrity: sha512-uUJF59M6pNSRHQaXwdkaNB4BhSQ9lldRdG1qCjlrAFkynPGDc5wPoUcYEQQeQGmKyAWJPvGkYAWmtVrxWmDAkg==} 616 | dev: true 617 | 618 | /emoji-regex/8.0.0: 619 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 620 | dev: true 621 | 622 | /encoding/0.1.13: 623 | resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} 624 | dependencies: 625 | iconv-lite: 0.6.2 626 | dev: false 627 | optional: true 628 | 629 | /end-of-stream/1.4.4: 630 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 631 | dependencies: 632 | once: 1.4.0 633 | dev: true 634 | 635 | /enquirer/2.3.6: 636 | resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} 637 | engines: {node: '>=8.6'} 638 | dependencies: 639 | ansi-colors: 4.1.1 640 | dev: true 641 | 642 | /err-code/2.0.3: 643 | resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} 644 | dev: false 645 | 646 | /escalade/3.1.1: 647 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 648 | engines: {node: '>=6'} 649 | dev: true 650 | 651 | /escape-string-regexp/1.0.5: 652 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 653 | engines: {node: '>=0.8.0'} 654 | 655 | /escape-string-regexp/4.0.0: 656 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 657 | engines: {node: '>=10'} 658 | dev: true 659 | 660 | /eslint-config-important-stuff/1.1.0: 661 | resolution: {integrity: sha512-CsV6QFsjNDTZTDEgE1XxhTKph4YJUh5XFMdsWv3p+9DuMyvfy40fsnZiwqXZHBVEUNMHf+zfPGk6s6b4fS9Erw==} 662 | dev: true 663 | 664 | /eslint-config-node-important-stuff/1.1.0_eslint@7.32.0: 665 | resolution: {integrity: sha512-bG6bnD0P81rWYIU2yY3RUxnjz7BoDushsTsDUfg0tZlujXHqApaR2tN1AskHk/FEOYOB7hObY9NxmPdiT8jctA==} 666 | dependencies: 667 | eslint-config-important-stuff: 1.1.0 668 | eslint-plugin-node: 11.1.0_eslint@7.32.0 669 | transitivePeerDependencies: 670 | - eslint 671 | dev: true 672 | 673 | /eslint-plugin-es/3.0.1_eslint@7.32.0: 674 | resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} 675 | engines: {node: '>=8.10.0'} 676 | peerDependencies: 677 | eslint: '>=4.19.1' 678 | dependencies: 679 | eslint: 7.32.0 680 | eslint-utils: 2.1.0 681 | regexpp: 3.2.0 682 | dev: true 683 | 684 | /eslint-plugin-node/11.1.0_eslint@7.32.0: 685 | resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} 686 | engines: {node: '>=8.10.0'} 687 | peerDependencies: 688 | eslint: '>=5.16.0' 689 | dependencies: 690 | eslint: 7.32.0 691 | eslint-plugin-es: 3.0.1_eslint@7.32.0 692 | eslint-utils: 2.1.0 693 | ignore: 5.1.8 694 | minimatch: 3.0.4 695 | resolve: 1.20.0 696 | semver: 6.3.0 697 | dev: true 698 | 699 | /eslint-scope/5.1.1: 700 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 701 | engines: {node: '>=8.0.0'} 702 | dependencies: 703 | esrecurse: 4.3.0 704 | estraverse: 4.3.0 705 | dev: true 706 | 707 | /eslint-utils/2.1.0: 708 | resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} 709 | engines: {node: '>=6'} 710 | dependencies: 711 | eslint-visitor-keys: 1.3.0 712 | dev: true 713 | 714 | /eslint-visitor-keys/1.3.0: 715 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 716 | engines: {node: '>=4'} 717 | dev: true 718 | 719 | /eslint-visitor-keys/2.1.0: 720 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 721 | engines: {node: '>=10'} 722 | dev: true 723 | 724 | /eslint/7.32.0: 725 | resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} 726 | engines: {node: ^10.12.0 || >=12.0.0} 727 | hasBin: true 728 | dependencies: 729 | '@babel/code-frame': 7.12.11 730 | '@eslint/eslintrc': 0.4.3 731 | '@humanwhocodes/config-array': 0.5.0 732 | ajv: 6.12.6 733 | chalk: 4.1.2 734 | cross-spawn: 7.0.3 735 | debug: 4.3.1 736 | doctrine: 3.0.0 737 | enquirer: 2.3.6 738 | escape-string-regexp: 4.0.0 739 | eslint-scope: 5.1.1 740 | eslint-utils: 2.1.0 741 | eslint-visitor-keys: 2.1.0 742 | espree: 7.3.1 743 | esquery: 1.4.0 744 | esutils: 2.0.3 745 | fast-deep-equal: 3.1.3 746 | file-entry-cache: 6.0.1 747 | functional-red-black-tree: 1.0.1 748 | glob-parent: 5.1.2 749 | globals: 13.11.0 750 | ignore: 4.0.6 751 | import-fresh: 3.3.0 752 | imurmurhash: 0.1.4 753 | is-glob: 4.0.1 754 | js-yaml: 3.14.1 755 | json-stable-stringify-without-jsonify: 1.0.1 756 | levn: 0.4.1 757 | lodash.merge: 4.6.2 758 | minimatch: 3.0.4 759 | natural-compare: 1.4.0 760 | optionator: 0.9.1 761 | progress: 2.0.3 762 | regexpp: 3.2.0 763 | semver: 7.3.5 764 | strip-ansi: 6.0.0 765 | strip-json-comments: 3.1.1 766 | table: 6.7.1 767 | text-table: 0.2.0 768 | v8-compile-cache: 2.3.0 769 | transitivePeerDependencies: 770 | - supports-color 771 | dev: true 772 | 773 | /espree/7.3.1: 774 | resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} 775 | engines: {node: ^10.12.0 || >=12.0.0} 776 | dependencies: 777 | acorn: 7.4.1 778 | acorn-jsx: 5.3.2_acorn@7.4.1 779 | eslint-visitor-keys: 1.3.0 780 | dev: true 781 | 782 | /esprima/4.0.1: 783 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 784 | engines: {node: '>=4'} 785 | hasBin: true 786 | dev: true 787 | 788 | /esquery/1.4.0: 789 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 790 | engines: {node: '>=0.10'} 791 | dependencies: 792 | estraverse: 5.2.0 793 | dev: true 794 | 795 | /esrecurse/4.3.0: 796 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 797 | engines: {node: '>=4.0'} 798 | dependencies: 799 | estraverse: 5.2.0 800 | dev: true 801 | 802 | /estraverse/4.3.0: 803 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 804 | engines: {node: '>=4.0'} 805 | dev: true 806 | 807 | /estraverse/5.2.0: 808 | resolution: {integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==} 809 | engines: {node: '>=4.0'} 810 | dev: true 811 | 812 | /esutils/2.0.3: 813 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 814 | engines: {node: '>=0.10.0'} 815 | dev: true 816 | 817 | /execa/4.1.0: 818 | resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} 819 | engines: {node: '>=10'} 820 | dependencies: 821 | cross-spawn: 7.0.3 822 | get-stream: 5.2.0 823 | human-signals: 1.1.1 824 | is-stream: 2.0.0 825 | merge-stream: 2.0.0 826 | npm-run-path: 4.0.1 827 | onetime: 5.1.2 828 | signal-exit: 3.0.3 829 | strip-final-newline: 2.0.0 830 | dev: true 831 | 832 | /fast-deep-equal/3.1.3: 833 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 834 | dev: true 835 | 836 | /fast-json-stable-stringify/2.1.0: 837 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 838 | dev: true 839 | 840 | /fast-levenshtein/2.0.6: 841 | resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} 842 | dev: true 843 | 844 | /file-entry-cache/6.0.1: 845 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 846 | engines: {node: ^10.12.0 || >=12.0.0} 847 | dependencies: 848 | flat-cache: 3.0.4 849 | dev: true 850 | 851 | /filelist/1.0.2: 852 | resolution: {integrity: sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==} 853 | dependencies: 854 | minimatch: 3.0.4 855 | dev: false 856 | 857 | /fill-range/7.0.1: 858 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 859 | engines: {node: '>=8'} 860 | dependencies: 861 | to-regex-range: 5.0.1 862 | dev: false 863 | 864 | /find-up/4.1.0: 865 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 866 | engines: {node: '>=8'} 867 | dependencies: 868 | locate-path: 5.0.0 869 | path-exists: 4.0.0 870 | dev: true 871 | 872 | /flat-cache/3.0.4: 873 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 874 | engines: {node: ^10.12.0 || >=12.0.0} 875 | dependencies: 876 | flatted: 3.2.2 877 | rimraf: 3.0.2 878 | dev: true 879 | 880 | /flatted/3.2.2: 881 | resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} 882 | dev: true 883 | 884 | /fromentries/1.3.2: 885 | resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} 886 | dev: true 887 | 888 | /fs-minipass/2.1.0: 889 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 890 | engines: {node: '>= 8'} 891 | dependencies: 892 | minipass: 3.1.3 893 | dev: false 894 | 895 | /fs.realpath/1.0.0: 896 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 897 | 898 | /function-bind/1.1.1: 899 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 900 | dev: true 901 | 902 | /functional-red-black-tree/1.0.1: 903 | resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} 904 | dev: true 905 | 906 | /gensync/1.0.0-beta.2: 907 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 908 | engines: {node: '>=6.9.0'} 909 | dev: true 910 | 911 | /get-stream/5.2.0: 912 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 913 | engines: {node: '>=8'} 914 | dependencies: 915 | pump: 3.0.0 916 | dev: true 917 | 918 | /glob-parent/5.1.2: 919 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 920 | engines: {node: '>= 6'} 921 | dependencies: 922 | is-glob: 4.0.1 923 | dev: true 924 | 925 | /glob/7.1.6: 926 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 927 | dependencies: 928 | fs.realpath: 1.0.0 929 | inflight: 1.0.6 930 | inherits: 2.0.4 931 | minimatch: 3.0.4 932 | once: 1.4.0 933 | path-is-absolute: 1.0.1 934 | 935 | /globals/11.12.0: 936 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 937 | engines: {node: '>=4'} 938 | dev: true 939 | 940 | /globals/13.11.0: 941 | resolution: {integrity: sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==} 942 | engines: {node: '>=8'} 943 | dependencies: 944 | type-fest: 0.20.2 945 | dev: true 946 | 947 | /has-flag/3.0.0: 948 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 949 | engines: {node: '>=4'} 950 | 951 | /has-flag/4.0.0: 952 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 953 | engines: {node: '>=8'} 954 | dev: true 955 | 956 | /has/1.0.3: 957 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 958 | engines: {node: '>= 0.4.0'} 959 | dependencies: 960 | function-bind: 1.1.1 961 | dev: true 962 | 963 | /hosted-git-info/4.0.2: 964 | resolution: {integrity: sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==} 965 | engines: {node: '>=10'} 966 | dependencies: 967 | lru-cache: 6.0.0 968 | dev: false 969 | 970 | /http-cache-semantics/4.1.0: 971 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 972 | dev: false 973 | 974 | /http-proxy-agent/4.0.1: 975 | resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 976 | engines: {node: '>= 6'} 977 | dependencies: 978 | '@tootallnate/once': 1.1.2 979 | agent-base: 6.0.2 980 | debug: 4.3.1 981 | transitivePeerDependencies: 982 | - supports-color 983 | dev: false 984 | 985 | /https-proxy-agent/5.0.0: 986 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} 987 | engines: {node: '>= 6'} 988 | dependencies: 989 | agent-base: 6.0.2 990 | debug: 4.3.1 991 | transitivePeerDependencies: 992 | - supports-color 993 | dev: false 994 | 995 | /human-signals/1.1.1: 996 | resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} 997 | engines: {node: '>=8.12.0'} 998 | dev: true 999 | 1000 | /humanize-ms/1.2.1: 1001 | resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} 1002 | dependencies: 1003 | ms: 2.1.3 1004 | dev: false 1005 | 1006 | /husky/7.0.1: 1007 | resolution: {integrity: sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA==} 1008 | engines: {node: '>=12'} 1009 | hasBin: true 1010 | dev: true 1011 | 1012 | /iconv-lite/0.6.2: 1013 | resolution: {integrity: sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==} 1014 | engines: {node: '>=0.10.0'} 1015 | dependencies: 1016 | safer-buffer: 2.1.2 1017 | dev: false 1018 | optional: true 1019 | 1020 | /ignore/4.0.6: 1021 | resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} 1022 | engines: {node: '>= 4'} 1023 | dev: true 1024 | 1025 | /ignore/5.1.8: 1026 | resolution: {integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==} 1027 | engines: {node: '>= 4'} 1028 | dev: true 1029 | 1030 | /import-fresh/3.3.0: 1031 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1032 | engines: {node: '>=6'} 1033 | dependencies: 1034 | parent-module: 1.0.1 1035 | resolve-from: 4.0.0 1036 | dev: true 1037 | 1038 | /imurmurhash/0.1.4: 1039 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 1040 | engines: {node: '>=0.8.19'} 1041 | 1042 | /indent-string/4.0.0: 1043 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1044 | engines: {node: '>=8'} 1045 | dev: false 1046 | 1047 | /infer-owner/1.0.4: 1048 | resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} 1049 | dev: false 1050 | 1051 | /inflight/1.0.6: 1052 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 1053 | dependencies: 1054 | once: 1.4.0 1055 | wrappy: 1.0.2 1056 | 1057 | /inherits/2.0.4: 1058 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1059 | 1060 | /ip/1.1.5: 1061 | resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} 1062 | dev: false 1063 | 1064 | /is-core-module/2.5.0: 1065 | resolution: {integrity: sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==} 1066 | dependencies: 1067 | has: 1.0.3 1068 | dev: true 1069 | 1070 | /is-extglob/2.1.1: 1071 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 1072 | engines: {node: '>=0.10.0'} 1073 | dev: true 1074 | 1075 | /is-fullwidth-code-point/3.0.0: 1076 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1077 | engines: {node: '>=8'} 1078 | dev: true 1079 | 1080 | /is-glob/4.0.1: 1081 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 1082 | engines: {node: '>=0.10.0'} 1083 | dependencies: 1084 | is-extglob: 2.1.1 1085 | dev: true 1086 | 1087 | /is-lambda/1.0.1: 1088 | resolution: {integrity: sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=} 1089 | dev: false 1090 | 1091 | /is-number/7.0.0: 1092 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1093 | engines: {node: '>=0.12.0'} 1094 | dev: false 1095 | 1096 | /is-stream/2.0.0: 1097 | resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} 1098 | engines: {node: '>=8'} 1099 | dev: true 1100 | 1101 | /isexe/2.0.0: 1102 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1103 | dev: true 1104 | 1105 | /jake/10.8.2: 1106 | resolution: {integrity: sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==} 1107 | hasBin: true 1108 | dependencies: 1109 | async: 0.9.2 1110 | chalk: 2.4.2 1111 | filelist: 1.0.2 1112 | minimatch: 3.0.4 1113 | dev: false 1114 | 1115 | /js-tokens/4.0.0: 1116 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1117 | dev: true 1118 | 1119 | /js-yaml/3.14.1: 1120 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1121 | hasBin: true 1122 | dependencies: 1123 | argparse: 1.0.10 1124 | esprima: 4.0.1 1125 | dev: true 1126 | 1127 | /jsesc/2.5.2: 1128 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1129 | engines: {node: '>=4'} 1130 | hasBin: true 1131 | dev: true 1132 | 1133 | /json-schema-traverse/0.4.1: 1134 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1135 | dev: true 1136 | 1137 | /json-schema-traverse/1.0.0: 1138 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1139 | dev: true 1140 | 1141 | /json-stable-stringify-without-jsonify/1.0.1: 1142 | resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} 1143 | dev: true 1144 | 1145 | /json5/2.2.0: 1146 | resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} 1147 | engines: {node: '>=6'} 1148 | hasBin: true 1149 | dependencies: 1150 | minimist: 1.2.5 1151 | dev: true 1152 | 1153 | /jsonparse/1.3.1: 1154 | resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} 1155 | engines: {'0': node >= 0.2.0} 1156 | dev: false 1157 | 1158 | /levn/0.4.1: 1159 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1160 | engines: {node: '>= 0.8.0'} 1161 | dependencies: 1162 | prelude-ls: 1.2.1 1163 | type-check: 0.4.0 1164 | dev: true 1165 | 1166 | /locate-path/5.0.0: 1167 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1168 | engines: {node: '>=8'} 1169 | dependencies: 1170 | p-locate: 4.1.0 1171 | dev: true 1172 | 1173 | /lodash.clonedeep/4.5.0: 1174 | resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} 1175 | dev: true 1176 | 1177 | /lodash.merge/4.6.2: 1178 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1179 | dev: true 1180 | 1181 | /lodash.truncate/4.4.2: 1182 | resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} 1183 | dev: true 1184 | 1185 | /lru-cache/6.0.0: 1186 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1187 | engines: {node: '>=10'} 1188 | dependencies: 1189 | yallist: 4.0.0 1190 | 1191 | /make-fetch-happen/8.0.14: 1192 | resolution: {integrity: sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ==} 1193 | engines: {node: '>= 10'} 1194 | dependencies: 1195 | agentkeepalive: 4.1.4 1196 | cacache: 15.0.6 1197 | http-cache-semantics: 4.1.0 1198 | http-proxy-agent: 4.0.1 1199 | https-proxy-agent: 5.0.0 1200 | is-lambda: 1.0.1 1201 | lru-cache: 6.0.0 1202 | minipass: 3.1.3 1203 | minipass-collect: 1.0.2 1204 | minipass-fetch: 1.3.3 1205 | minipass-flush: 1.0.5 1206 | minipass-pipeline: 1.2.4 1207 | promise-retry: 2.0.1 1208 | socks-proxy-agent: 5.0.0 1209 | ssri: 8.0.1 1210 | transitivePeerDependencies: 1211 | - supports-color 1212 | dev: false 1213 | 1214 | /merge-stream/2.0.0: 1215 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1216 | dev: true 1217 | 1218 | /micromatch/4.0.4: 1219 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 1220 | engines: {node: '>=8.6'} 1221 | dependencies: 1222 | braces: 3.0.2 1223 | picomatch: 2.2.3 1224 | dev: false 1225 | 1226 | /mimic-fn/2.1.0: 1227 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1228 | engines: {node: '>=6'} 1229 | dev: true 1230 | 1231 | /minimatch/3.0.4: 1232 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 1233 | dependencies: 1234 | brace-expansion: 1.1.11 1235 | 1236 | /minimist/1.2.5: 1237 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1238 | 1239 | /minipass-collect/1.0.2: 1240 | resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} 1241 | engines: {node: '>= 8'} 1242 | dependencies: 1243 | minipass: 3.1.3 1244 | dev: false 1245 | 1246 | /minipass-fetch/1.3.3: 1247 | resolution: {integrity: sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==} 1248 | engines: {node: '>=8'} 1249 | dependencies: 1250 | minipass: 3.1.3 1251 | minipass-sized: 1.0.3 1252 | minizlib: 2.1.2 1253 | optionalDependencies: 1254 | encoding: 0.1.13 1255 | dev: false 1256 | 1257 | /minipass-flush/1.0.5: 1258 | resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} 1259 | engines: {node: '>= 8'} 1260 | dependencies: 1261 | minipass: 3.1.3 1262 | dev: false 1263 | 1264 | /minipass-json-stream/1.0.1: 1265 | resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} 1266 | dependencies: 1267 | jsonparse: 1.3.1 1268 | minipass: 3.1.3 1269 | dev: false 1270 | 1271 | /minipass-pipeline/1.2.4: 1272 | resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} 1273 | engines: {node: '>=8'} 1274 | dependencies: 1275 | minipass: 3.1.3 1276 | dev: false 1277 | 1278 | /minipass-sized/1.0.3: 1279 | resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} 1280 | engines: {node: '>=8'} 1281 | dependencies: 1282 | minipass: 3.1.3 1283 | dev: false 1284 | 1285 | /minipass/3.1.3: 1286 | resolution: {integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==} 1287 | engines: {node: '>=8'} 1288 | dependencies: 1289 | yallist: 4.0.0 1290 | dev: false 1291 | 1292 | /minizlib/2.1.2: 1293 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1294 | engines: {node: '>= 8'} 1295 | dependencies: 1296 | minipass: 3.1.3 1297 | yallist: 4.0.0 1298 | dev: false 1299 | 1300 | /mkdirp/1.0.4: 1301 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1302 | engines: {node: '>=10'} 1303 | hasBin: true 1304 | dev: false 1305 | 1306 | /mri/1.1.6: 1307 | resolution: {integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==} 1308 | engines: {node: '>=4'} 1309 | dev: true 1310 | 1311 | /ms/2.1.2: 1312 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1313 | 1314 | /ms/2.1.3: 1315 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1316 | dev: false 1317 | 1318 | /multimatch/4.0.0: 1319 | resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} 1320 | engines: {node: '>=8'} 1321 | dependencies: 1322 | '@types/minimatch': 3.0.4 1323 | array-differ: 3.0.0 1324 | array-union: 2.1.0 1325 | arrify: 2.0.1 1326 | minimatch: 3.0.4 1327 | dev: true 1328 | 1329 | /natural-compare/1.4.0: 1330 | resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} 1331 | dev: true 1332 | 1333 | /node-releases/1.1.74: 1334 | resolution: {integrity: sha512-caJBVempXZPepZoZAPCWRTNxYQ+xtG/KAi4ozTA5A+nJ7IU+kLQCbqaUjb5Rwy14M9upBWiQ4NutcmW04LJSRw==} 1335 | dev: true 1336 | 1337 | /npm-package-arg/8.1.2: 1338 | resolution: {integrity: sha512-6Eem455JsSMJY6Kpd3EyWE+n5hC+g9bSyHr9K9U2zqZb7+02+hObQ2c0+8iDk/mNF+8r1MhY44WypKJAkySIYA==} 1339 | engines: {node: '>=10'} 1340 | dependencies: 1341 | hosted-git-info: 4.0.2 1342 | semver: 7.3.5 1343 | validate-npm-package-name: 3.0.0 1344 | dev: false 1345 | 1346 | /npm-registry-fetch/10.1.0: 1347 | resolution: {integrity: sha512-XcKu0h6OuRTB7HO5uv8htavPQJ1dYTLAXLE5AMs4GFQ1LbY+LlHiNoqIbVshE3rk0vLk+nKxpA/4WJm1kE7eqg==} 1348 | engines: {node: '>=10'} 1349 | dependencies: 1350 | lru-cache: 6.0.0 1351 | make-fetch-happen: 8.0.14 1352 | minipass: 3.1.3 1353 | minipass-fetch: 1.3.3 1354 | minipass-json-stream: 1.0.1 1355 | minizlib: 2.1.2 1356 | npm-package-arg: 8.1.2 1357 | transitivePeerDependencies: 1358 | - supports-color 1359 | dev: false 1360 | 1361 | /npm-run-path/4.0.1: 1362 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1363 | engines: {node: '>=8'} 1364 | dependencies: 1365 | path-key: 3.1.1 1366 | dev: true 1367 | 1368 | /once/1.4.0: 1369 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1370 | dependencies: 1371 | wrappy: 1.0.2 1372 | 1373 | /onetime/5.1.2: 1374 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1375 | engines: {node: '>=6'} 1376 | dependencies: 1377 | mimic-fn: 2.1.0 1378 | dev: true 1379 | 1380 | /optionator/0.9.1: 1381 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1382 | engines: {node: '>= 0.8.0'} 1383 | dependencies: 1384 | deep-is: 0.1.3 1385 | fast-levenshtein: 2.0.6 1386 | levn: 0.4.1 1387 | prelude-ls: 1.2.1 1388 | type-check: 0.4.0 1389 | word-wrap: 1.2.3 1390 | dev: true 1391 | 1392 | /p-limit/2.3.0: 1393 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1394 | engines: {node: '>=6'} 1395 | dependencies: 1396 | p-try: 2.2.0 1397 | dev: true 1398 | 1399 | /p-locate/4.1.0: 1400 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1401 | engines: {node: '>=8'} 1402 | dependencies: 1403 | p-limit: 2.3.0 1404 | dev: true 1405 | 1406 | /p-map/4.0.0: 1407 | resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} 1408 | engines: {node: '>=10'} 1409 | dependencies: 1410 | aggregate-error: 3.1.0 1411 | dev: false 1412 | 1413 | /p-try/2.2.0: 1414 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1415 | engines: {node: '>=6'} 1416 | dev: true 1417 | 1418 | /parent-module/1.0.1: 1419 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1420 | engines: {node: '>=6'} 1421 | dependencies: 1422 | callsites: 3.1.0 1423 | dev: true 1424 | 1425 | /path-exists/4.0.0: 1426 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1427 | engines: {node: '>=8'} 1428 | dev: true 1429 | 1430 | /path-is-absolute/1.0.1: 1431 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1432 | engines: {node: '>=0.10.0'} 1433 | 1434 | /path-key/3.1.1: 1435 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1436 | engines: {node: '>=8'} 1437 | dev: true 1438 | 1439 | /path-parse/1.0.7: 1440 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1441 | dev: true 1442 | 1443 | /picomatch/2.2.3: 1444 | resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==} 1445 | engines: {node: '>=8.6'} 1446 | dev: false 1447 | 1448 | /pinst/2.1.6: 1449 | resolution: {integrity: sha512-B4dYmf6nEXg1NpDSB+orYWvKa5Kfmz5KzWC29U59dpVM4S/+xp0ak/JMEsw04UQTNNKps7klu0BUalr343Gt9g==} 1450 | engines: {node: '>=10.0.0'} 1451 | hasBin: true 1452 | dependencies: 1453 | fromentries: 1.3.2 1454 | dev: true 1455 | 1456 | /prelude-ls/1.2.1: 1457 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1458 | engines: {node: '>= 0.8.0'} 1459 | dev: true 1460 | 1461 | /prettier/2.3.2: 1462 | resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} 1463 | engines: {node: '>=10.13.0'} 1464 | hasBin: true 1465 | dev: true 1466 | 1467 | /pretty-quick/3.1.1_prettier@2.3.2: 1468 | resolution: {integrity: sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==} 1469 | engines: {node: '>=10.13'} 1470 | hasBin: true 1471 | peerDependencies: 1472 | prettier: '>=2.0.0' 1473 | dependencies: 1474 | chalk: 3.0.0 1475 | execa: 4.1.0 1476 | find-up: 4.1.0 1477 | ignore: 5.1.8 1478 | mri: 1.1.6 1479 | multimatch: 4.0.0 1480 | prettier: 2.3.2 1481 | dev: true 1482 | 1483 | /progress/2.0.3: 1484 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1485 | engines: {node: '>=0.4.0'} 1486 | dev: true 1487 | 1488 | /promise-inflight/1.0.1: 1489 | resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} 1490 | dev: false 1491 | 1492 | /promise-retry/2.0.1: 1493 | resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} 1494 | engines: {node: '>=10'} 1495 | dependencies: 1496 | err-code: 2.0.3 1497 | retry: 0.12.0 1498 | dev: false 1499 | 1500 | /pump/3.0.0: 1501 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1502 | dependencies: 1503 | end-of-stream: 1.4.4 1504 | once: 1.4.0 1505 | dev: true 1506 | 1507 | /punycode/2.1.1: 1508 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1509 | engines: {node: '>=6'} 1510 | dev: true 1511 | 1512 | /regexpp/3.2.0: 1513 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1514 | engines: {node: '>=8'} 1515 | dev: true 1516 | 1517 | /require-from-string/2.0.2: 1518 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1519 | engines: {node: '>=0.10.0'} 1520 | dev: true 1521 | 1522 | /resolve-from/4.0.0: 1523 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1524 | engines: {node: '>=4'} 1525 | dev: true 1526 | 1527 | /resolve/1.20.0: 1528 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1529 | dependencies: 1530 | is-core-module: 2.5.0 1531 | path-parse: 1.0.7 1532 | dev: true 1533 | 1534 | /retry/0.12.0: 1535 | resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} 1536 | engines: {node: '>= 4'} 1537 | dev: false 1538 | 1539 | /rimraf/3.0.2: 1540 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1541 | hasBin: true 1542 | dependencies: 1543 | glob: 7.1.6 1544 | 1545 | /safe-buffer/5.1.2: 1546 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1547 | dev: true 1548 | 1549 | /safer-buffer/2.1.2: 1550 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1551 | dev: false 1552 | optional: true 1553 | 1554 | /semver/6.3.0: 1555 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1556 | hasBin: true 1557 | dev: true 1558 | 1559 | /semver/7.3.5: 1560 | resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} 1561 | engines: {node: '>=10'} 1562 | hasBin: true 1563 | dependencies: 1564 | lru-cache: 6.0.0 1565 | 1566 | /shebang-command/2.0.0: 1567 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1568 | engines: {node: '>=8'} 1569 | dependencies: 1570 | shebang-regex: 3.0.0 1571 | dev: true 1572 | 1573 | /shebang-regex/3.0.0: 1574 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1575 | engines: {node: '>=8'} 1576 | dev: true 1577 | 1578 | /signal-exit/3.0.3: 1579 | resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} 1580 | dev: true 1581 | 1582 | /slice-ansi/4.0.0: 1583 | resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} 1584 | engines: {node: '>=10'} 1585 | dependencies: 1586 | ansi-styles: 4.3.0 1587 | astral-regex: 2.0.0 1588 | is-fullwidth-code-point: 3.0.0 1589 | dev: true 1590 | 1591 | /smart-buffer/4.1.0: 1592 | resolution: {integrity: sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==} 1593 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} 1594 | dev: false 1595 | 1596 | /socks-proxy-agent/5.0.0: 1597 | resolution: {integrity: sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==} 1598 | engines: {node: '>= 6'} 1599 | dependencies: 1600 | agent-base: 6.0.2 1601 | debug: 4.3.1 1602 | socks: 2.6.1 1603 | transitivePeerDependencies: 1604 | - supports-color 1605 | dev: false 1606 | 1607 | /socks/2.6.1: 1608 | resolution: {integrity: sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==} 1609 | engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} 1610 | dependencies: 1611 | ip: 1.1.5 1612 | smart-buffer: 4.1.0 1613 | dev: false 1614 | 1615 | /source-map/0.5.7: 1616 | resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} 1617 | engines: {node: '>=0.10.0'} 1618 | dev: true 1619 | 1620 | /sprintf-js/1.0.3: 1621 | resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} 1622 | dev: true 1623 | 1624 | /ssri/8.0.1: 1625 | resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} 1626 | engines: {node: '>= 8'} 1627 | dependencies: 1628 | minipass: 3.1.3 1629 | dev: false 1630 | 1631 | /string-width/4.2.2: 1632 | resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} 1633 | engines: {node: '>=8'} 1634 | dependencies: 1635 | emoji-regex: 8.0.0 1636 | is-fullwidth-code-point: 3.0.0 1637 | strip-ansi: 6.0.0 1638 | dev: true 1639 | 1640 | /strip-ansi/6.0.0: 1641 | resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} 1642 | engines: {node: '>=8'} 1643 | dependencies: 1644 | ansi-regex: 5.0.0 1645 | dev: true 1646 | 1647 | /strip-final-newline/2.0.0: 1648 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1649 | engines: {node: '>=6'} 1650 | dev: true 1651 | 1652 | /strip-json-comments/3.1.1: 1653 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1654 | engines: {node: '>=8'} 1655 | dev: true 1656 | 1657 | /supports-color/5.5.0: 1658 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1659 | engines: {node: '>=4'} 1660 | dependencies: 1661 | has-flag: 3.0.0 1662 | 1663 | /supports-color/7.2.0: 1664 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1665 | engines: {node: '>=8'} 1666 | dependencies: 1667 | has-flag: 4.0.0 1668 | dev: true 1669 | 1670 | /table/6.7.1: 1671 | resolution: {integrity: sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==} 1672 | engines: {node: '>=10.0.0'} 1673 | dependencies: 1674 | ajv: 8.6.2 1675 | lodash.clonedeep: 4.5.0 1676 | lodash.truncate: 4.4.2 1677 | slice-ansi: 4.0.0 1678 | string-width: 4.2.2 1679 | strip-ansi: 6.0.0 1680 | dev: true 1681 | 1682 | /tar/6.1.0: 1683 | resolution: {integrity: sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==} 1684 | engines: {node: '>= 10'} 1685 | dependencies: 1686 | chownr: 2.0.0 1687 | fs-minipass: 2.1.0 1688 | minipass: 3.1.3 1689 | minizlib: 2.1.2 1690 | mkdirp: 1.0.4 1691 | yallist: 4.0.0 1692 | dev: false 1693 | 1694 | /text-table/0.2.0: 1695 | resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} 1696 | dev: true 1697 | 1698 | /to-fast-properties/2.0.0: 1699 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1700 | engines: {node: '>=4'} 1701 | dev: true 1702 | 1703 | /to-regex-range/5.0.1: 1704 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1705 | engines: {node: '>=8.0'} 1706 | dependencies: 1707 | is-number: 7.0.0 1708 | dev: false 1709 | 1710 | /type-check/0.4.0: 1711 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1712 | engines: {node: '>= 0.8.0'} 1713 | dependencies: 1714 | prelude-ls: 1.2.1 1715 | dev: true 1716 | 1717 | /type-fest/0.20.2: 1718 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1719 | engines: {node: '>=10'} 1720 | dev: true 1721 | 1722 | /typescript/4.2.4: 1723 | resolution: {integrity: sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==} 1724 | engines: {node: '>=4.2.0'} 1725 | hasBin: true 1726 | dev: true 1727 | 1728 | /unique-filename/1.1.1: 1729 | resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} 1730 | dependencies: 1731 | unique-slug: 2.0.2 1732 | dev: false 1733 | 1734 | /unique-slug/2.0.2: 1735 | resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} 1736 | dependencies: 1737 | imurmurhash: 0.1.4 1738 | dev: false 1739 | 1740 | /uri-js/4.4.1: 1741 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1742 | dependencies: 1743 | punycode: 2.1.1 1744 | dev: true 1745 | 1746 | /v8-compile-cache/2.3.0: 1747 | resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} 1748 | dev: true 1749 | 1750 | /validate-npm-package-name/3.0.0: 1751 | resolution: {integrity: sha1-X6kS2B630MdK/BQN5zF/DKffQ34=} 1752 | dependencies: 1753 | builtins: 1.0.3 1754 | dev: false 1755 | 1756 | /which/2.0.2: 1757 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1758 | engines: {node: '>= 8'} 1759 | hasBin: true 1760 | dependencies: 1761 | isexe: 2.0.0 1762 | dev: true 1763 | 1764 | /word-wrap/1.2.3: 1765 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1766 | engines: {node: '>=0.10.0'} 1767 | dev: true 1768 | 1769 | /wrappy/1.0.2: 1770 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1771 | 1772 | /yallist/4.0.0: 1773 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1774 | -------------------------------------------------------------------------------- /test/happy-path/conf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('../../lib/self-hosted-shared-dependencies.js').BuildOpts} 3 | */ 4 | export default { 5 | clean: true, 6 | // skipPackagesAtUrl: 'https://unpkg.com/', 7 | generateDockerfile: true, 8 | logLevel: "debug", 9 | registryFetchOptions: { 10 | username: "fake-username", 11 | password: "not-the-real-password", 12 | }, 13 | packages: [ 14 | { 15 | name: "react", 16 | include: ["umd/**"], 17 | versions: [">= 17"], 18 | }, 19 | { 20 | name: "react-dom", 21 | include: ["umd/**"], 22 | versions: ["17.0.1"], 23 | }, 24 | ], 25 | }; 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": ["lib/self-hosted-shared-dependencies.js"], 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "outDir": "types", 6 | "declaration": true, 7 | "emitDeclarationOnly": true 8 | } 9 | } 10 | --------------------------------------------------------------------------------