feat(core): refactor lock file parsing and pruning (#13864)

Co-authored-by: Jason Jean <FrozenPandaz@users.noreply.github.com>
Co-authored-by: Victor Savkin <vsavkin@users.noreply.github.com>
Co-authored-by: FrozenPandaz <jasonjean1993@gmail.com>
This commit is contained in:
Miroslav Jonaš 2023-02-06 17:39:36 +01:00 committed by GitHub
parent d1933d272c
commit b80286191d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
101 changed files with 135554 additions and 61084 deletions

View File

@ -12,6 +12,7 @@ packages/express/src/schematics/**/files/**/*.json
packages/nest/src/schematics/**/files/**/*.json packages/nest/src/schematics/**/files/**/*.json
packages/react/src/schematics/**/files/**/*.json packages/react/src/schematics/**/files/**/*.json
packages/jest/src/schematics/**/files/**/*.json packages/jest/src/schematics/**/files/**/*.json
packages/nx/src/lock-file/__fixtures__/**/*.*
packages/**/schematics/**/files/**/*.html packages/**/schematics/**/files/**/*.html
packages/**/generators/**/files/**/*.html packages/**/generators/**/files/**/*.html
packages/nx/src/native/ packages/nx/src/native/

View File

@ -1,4 +1,3 @@
import { satisfies } from 'semver';
import { import {
checkFilesDoNotExist, checkFilesDoNotExist,
checkFilesExist, checkFilesExist,
@ -83,20 +82,21 @@ describe('js e2e', () => {
expect(output).toContain('1 task it depends on'); expect(output).toContain('1 task it depends on');
expect(output).toContain('Successfully compiled: 2 files with swc'); expect(output).toContain('Successfully compiled: 2 files with swc');
runCLI(`build ${parentLib} --generateLockfile=true`); runCLI(`build ${parentLib}`);
checkFilesExist( checkFilesExist(`dist/libs/${parentLib}/package.json`);
`dist/libs/${parentLib}/package.json`,
`dist/libs/${parentLib}/${
packageManagerLockFile[detectPackageManager(tmpProjPath())]
}`
);
updateJson(`libs/${lib}/.lib.swcrc`, (json) => { updateJson(`libs/${lib}/.lib.swcrc`, (json) => {
json.jsc.externalHelpers = true; json.jsc.externalHelpers = true;
return json; return json;
}); });
runCLI(`build ${lib}`); runCLI(`build ${lib} --generateLockfile=true`);
checkFilesExist(
`dist/libs/${lib}/package.json`,
`dist/libs/${lib}/${
packageManagerLockFile[detectPackageManager(tmpProjPath())]
}`
);
const swcHelpersFromRoot = const swcHelpersFromRoot =
readJson(`package.json`).dependencies['@swc/helpers']; readJson(`package.json`).dependencies['@swc/helpers'];

View File

@ -1,13 +1,18 @@
import { detectPackageManager, joinPathFragments } from '@nrwl/devkit';
import { import {
checkFilesExist, checkFilesExist,
cleanupProject, cleanupProject,
getPackageManagerCommand,
isNotWindows, isNotWindows,
killPorts, killPorts,
newProject, newProject,
packageManagerLockFile,
readFile, readFile,
rmDist, rmDist,
runCLI, runCLI,
runCommand,
runCommandUntil, runCommandUntil,
tmpProjPath,
uniq, uniq,
updateFile, updateFile,
updateProjectConfig, updateProjectConfig,
@ -19,8 +24,12 @@ import { checkApp } from './utils';
describe('Next.js Applications', () => { describe('Next.js Applications', () => {
let proj: string; let proj: string;
let originalEnv: string; let originalEnv: string;
let packageManager;
beforeAll(() => (proj = newProject())); beforeAll(() => {
proj = newProject();
packageManager = detectPackageManager(tmpProjPath());
});
afterAll(() => cleanupProject()); afterAll(() => cleanupProject());
@ -147,6 +156,20 @@ describe('Next.js Applications', () => {
); );
}, 300_000); }, 300_000);
it('should build and install pruned lock file', () => {
const appName = uniq('app');
runCLI(`generate @nrwl/next:app ${appName} --no-interactive --style=css`);
const result = runCLI(`build ${appName} --generateLockfile=true`);
expect(result).not.toMatch(/Graph is not consistent/);
checkFilesExist(
`dist/apps/${appName}/${packageManagerLockFile[packageManager]}`
);
runCommand(`${getPackageManagerCommand().ciInstall}`, {
cwd: joinPathFragments(tmpProjPath(), 'dist/apps', appName),
});
}, 1_000_000);
// TODO(jack): re-enable this test // TODO(jack): re-enable this test
xit('should be able to serve with a proxy configuration', async () => { xit('should be able to serve with a proxy configuration', async () => {
const appName = uniq('app'); const appName = uniq('app');

View File

@ -1,4 +1,5 @@
import { stripIndents } from '@angular-devkit/core/src/utils/literals'; import { stripIndents } from '@angular-devkit/core/src/utils/literals';
import { joinPathFragments } from '@nrwl/devkit';
import { import {
checkFilesDoNotExist, checkFilesDoNotExist,
checkFilesExist, checkFilesExist,
@ -6,14 +7,17 @@ import {
createFile, createFile,
detectPackageManager, detectPackageManager,
expectJestTestsToPass, expectJestTestsToPass,
getPackageManagerCommand,
killPorts, killPorts,
newProject, newProject,
packageInstall, packageInstall,
packageManagerLockFile,
promisifiedTreeKill, promisifiedTreeKill,
readFile, readFile,
readJson, readJson,
runCLI, runCLI,
runCLIAsync, runCLIAsync,
runCommand,
runCommandUntil, runCommandUntil,
tmpProjPath, tmpProjPath,
uniq, uniq,
@ -235,6 +239,7 @@ describe('Build Node apps', () => {
it('should generate a package.json with the `--generatePackageJson` flag', async () => { it('should generate a package.json with the `--generatePackageJson` flag', async () => {
const scope = newProject(); const scope = newProject();
const packageManager = detectPackageManager(tmpProjPath());
const nestapp = uniq('nestapp'); const nestapp = uniq('nestapp');
runCLI(`generate @nrwl/nest:app ${nestapp} --linter=eslint`); runCLI(`generate @nrwl/nest:app ${nestapp} --linter=eslint`);
@ -274,6 +279,13 @@ describe('Build Node apps', () => {
rootPackageJson.dependencies['tslib'] rootPackageJson.dependencies['tslib']
); );
checkFilesExist(
`dist/apps/${nestapp}/${packageManagerLockFile[packageManager]}`
);
runCommand(`${getPackageManagerCommand().ciInstall}`, {
cwd: joinPathFragments(tmpProjPath(), 'dist/apps', nestapp),
});
const nodeapp = uniq('nodeapp'); const nodeapp = uniq('nodeapp');
runCLI(`generate @nrwl/node:app ${nodeapp} --bundler=webpack`); runCLI(`generate @nrwl/node:app ${nodeapp} --bundler=webpack`);
@ -289,14 +301,28 @@ ${jslib}();
` `
); );
await runCLIAsync(`build ${nodeapp} --generate-package-json`); const { combinedOutput: nodeCombinedOutput } = await runCLIAsync(
checkFilesExist(`dist/apps/${nestapp}/package.json`); `build ${nodeapp} --generate-package-json`
);
expect(nodeCombinedOutput).not.toMatch(/Graph is not consistent/);
checkFilesExist(`dist/apps/${nodeapp}/package.json`);
checkFilesExist(
`dist/apps/${nodeapp}/${packageManagerLockFile[packageManager]}`
);
const nodeAppPackageJson = JSON.parse( const nodeAppPackageJson = JSON.parse(
readFile(`dist/apps/${nodeapp}/package.json`) readFile(`dist/apps/${nodeapp}/package.json`)
); );
expect(nodeAppPackageJson['dependencies']['tslib']).toBeTruthy(); expect(nodeAppPackageJson['dependencies']['tslib']).toBeTruthy();
}, 300000);
runCommand(`${getPackageManagerCommand().ciInstall}`, {
cwd: joinPathFragments(tmpProjPath(), 'dist/apps', nestapp),
});
runCommand(`${getPackageManagerCommand().ciInstall}`, {
cwd: joinPathFragments(tmpProjPath(), 'dist/apps', nodeapp),
});
}, 1_000_000);
it('should remove previous output before building with the --deleteOutputPath option set', async () => { it('should remove previous output before building with the --deleteOutputPath option set', async () => {
const appName = uniq('app'); const appName = uniq('app');

View File

@ -1012,6 +1012,7 @@ export function getPackageManagerCommand({
runNxSilent: string; runNxSilent: string;
runUninstalledPackage: string; runUninstalledPackage: string;
install: string; install: string;
ciInstall: string;
addProd: string; addProd: string;
addDev: string; addDev: string;
list: string; list: string;
@ -1030,6 +1031,7 @@ export function getPackageManagerCommand({
runNxSilent: `npx nx`, runNxSilent: `npx nx`,
runUninstalledPackage: `npx --yes`, runUninstalledPackage: `npx --yes`,
install: 'npm install', install: 'npm install',
ciInstall: 'npm ci',
addProd: `npm install --legacy-peer-deps`, addProd: `npm install --legacy-peer-deps`,
addDev: `npm install --legacy-peer-deps -D`, addDev: `npm install --legacy-peer-deps -D`,
list: 'npm ls --depth 10', list: 'npm ls --depth 10',
@ -1043,6 +1045,7 @@ export function getPackageManagerCommand({
runNxSilent: `yarn --silent nx`, runNxSilent: `yarn --silent nx`,
runUninstalledPackage: 'npx --yes', runUninstalledPackage: 'npx --yes',
install: 'yarn', install: 'yarn',
ciInstall: 'yarn --frozen-lockfile',
addProd: `yarn add`, addProd: `yarn add`,
addDev: `yarn add -D`, addDev: `yarn add -D`,
list: 'npm ls --depth 10', list: 'npm ls --depth 10',
@ -1056,6 +1059,7 @@ export function getPackageManagerCommand({
runNxSilent: `pnpm exec nx`, runNxSilent: `pnpm exec nx`,
runUninstalledPackage: 'pnpm dlx', runUninstalledPackage: 'pnpm dlx',
install: 'pnpm i', install: 'pnpm i',
ciInstall: 'pnpm install --frozen-lockfile',
addProd: `pnpm add`, addProd: `pnpm add`,
addDev: `pnpm add -D`, addDev: `pnpm add -D`,
list: 'npm ls --depth 10', list: 'npm ls --depth 10',

View File

@ -73,6 +73,7 @@
"@parcel/watcher": "2.0.4", "@parcel/watcher": "2.0.4",
"@phenomnomnominal/tsquery": "4.1.1", "@phenomnomnominal/tsquery": "4.1.1",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
"@pnpm/lockfile-types": "^4.3.6",
"@reduxjs/toolkit": "1.9.0", "@reduxjs/toolkit": "1.9.0",
"@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-commonjs": "^20.0.0", "@rollup/plugin-commonjs": "^20.0.0",

View File

@ -40,7 +40,11 @@
{ {
"input": "packages/nx", "input": "packages/nx",
"glob": "**/*.json", "glob": "**/*.json",
"ignore": ["**/tsconfig*.json", "**/project.json"], "ignore": [
"**/tsconfig*.json",
"**/project.json",
"**/__fixtures__/**"
],
"output": "/" "output": "/"
}, },
{ {

View File

@ -0,0 +1,83 @@
## Get packages' peer dependencies for NPM V1 mocks:
Renders only those packages that have peer dependencies.
```js
const readFileSync = require('fs').readFileSync;
const readdirSync = require('fs').readdirSync;
const existsSync = require('fs').existsSync;
let report = '';
const packageNames = [];
function processNodeModules(path = '.') {
if (existsSync(`${path}/node_modules`)) {
readdirSync(`${path}/node_modules`).forEach(folder => {
if (folder.startsWith('@')) {
readdirSync(`${path}/node_modules/${folder}`).forEach(subfolder => {
packageNames.push(`${path}/node_modules/${folder}/${subfolder}`);
processNodeModules(`${path}/node_modules/${folder}/${subfolder}`);
});
} else {
packageNames.push(`${path}/node_modules/${folder}`);
processNodeModules(`${path}/node_modules/${folder}`);
}
});
}
}
processNodeModules();
packageNames.forEach(path => {
const filePath = `${path}/package.json`;
if (existsSync(filePath)) {
const content = readFileSync(filePath, 'utf-8');
const peerDependencies = JSON.parse(content).peerDependencies;
const peerDependenciesMeta = JSON.parse(content).peerDependenciesMeta;
const output = JSON.stringify({
...peerDependencies && { peerDependencies },
...peerDependenciesMeta && { peerDependenciesMeta },
});
if (output === '{}') return;
report += `'${filePath.slice(2)}': '${output}',\n`;
}
});
console.log(report);
```
## Get packages' versions for Yarn and Pnpm mocks:
Renders only hoisted dependencies.
```js
const readFileSync = require('fs').readFileSync;
const readdirSync = require('fs').readdirSync;
const existsSync = require('fs').existsSync;
let report = '';
const packageNames = [];
readdirSync('node_modules').forEach(folder => {
if (folder === '.pnpm') return;
if (folder.startsWith('@')) {
readdirSync(`node_modules/${folder}`).forEach(subfolder => {
packageNames.push(`${folder}/${subfolder}`);
});
} else {
packageNames.push(folder);
}
});
packageNames.forEach(packageName => {
const path = `node_modules/${packageName}/package.json`;
if (existsSync(path)) {
const content = readFileSync(path, 'utf-8');
const version = JSON.parse(content).version;
report += `'${path}': '{"version": "${version}"}',\n`;
}
});
console.log(report);
```

View File

@ -0,0 +1,416 @@
// This file is autogenerated in the node_modules when using Pnpm
export default `hoistPattern:
- '*'
hoistedDependencies:
/@eslint/eslintrc/1.3.3:
'@eslint/eslintrc': public
/@humanwhocodes/config-array/0.11.7:
'@humanwhocodes/config-array': private
/@humanwhocodes/module-importer/1.0.1:
'@humanwhocodes/module-importer': private
/@humanwhocodes/object-schema/1.2.1:
'@humanwhocodes/object-schema': private
/@nodelib/fs.scandir/2.1.5:
'@nodelib/fs.scandir': private
/@nodelib/fs.stat/2.0.5:
'@nodelib/fs.stat': private
/@nodelib/fs.walk/1.2.8:
'@nodelib/fs.walk': private
/@nrwl/cli/15.3.0:
'@nrwl/cli': private
/@nrwl/tao/15.3.0:
'@nrwl/tao': private
/@parcel/watcher/2.0.4:
'@parcel/watcher': private
/@phenomnomnominal/tsquery/4.1.1_typescript@4.8.4:
'@phenomnomnominal/tsquery': private
/@types/json5/0.0.29:
'@types/json5': private
/@yarnpkg/lockfile/1.1.0:
'@yarnpkg/lockfile': private
/@yarnpkg/parsers/3.0.0-rc.32:
'@yarnpkg/parsers': private
/@zkochan/js-yaml/0.0.6:
'@zkochan/js-yaml': private
/acorn-jsx/5.3.2_acorn@8.8.1:
acorn-jsx: private
/acorn/8.8.1:
acorn: private
/ajv/6.12.6:
ajv: private
/ansi-colors/4.1.3:
ansi-colors: private
/ansi-regex/5.0.1:
ansi-regex: private
/ansi-styles/4.3.0:
ansi-styles: private
/anymatch/3.1.3:
anymatch: private
/app-root-path/3.1.0:
app-root-path: private
/argparse/2.0.1:
argparse: private
/async/3.2.4:
async: private
/asynckit/0.4.0:
asynckit: private
/axios/1.2.1:
axios: private
/balanced-match/1.0.2:
balanced-match: private
/base64-js/1.5.1:
base64-js: private
/binary-extensions/2.2.0:
binary-extensions: private
/bl/4.1.0:
bl: private
/brace-expansion/1.1.11:
brace-expansion: private
/braces/3.0.2:
braces: private
/buffer/5.7.1:
buffer: private
/callsites/3.1.0:
callsites: private
/chalk/4.1.2:
chalk: private
/chokidar/3.5.3:
chokidar: private
/cli-cursor/3.1.0:
cli-cursor: private
/cli-spinners/2.6.1:
cli-spinners: private
/cliui/8.0.1:
cliui: private
/color-convert/2.0.1:
color-convert: private
/color-name/1.1.4:
color-name: private
/combined-stream/1.0.8:
combined-stream: private
/concat-map/0.0.1:
concat-map: private
/cross-spawn/7.0.3:
cross-spawn: private
/debug/4.3.4:
debug: private
/deep-is/0.1.4:
deep-is: private
/define-lazy-prop/2.0.0:
define-lazy-prop: private
/delayed-stream/1.0.0:
delayed-stream: private
/doctrine/3.0.0:
doctrine: private
/dotenv/10.0.0:
dotenv: private
/duplexer/0.1.2:
duplexer: private
/ejs/3.1.8:
ejs: private
/emoji-regex/8.0.0:
emoji-regex: private
/end-of-stream/1.4.4:
end-of-stream: private
/enquirer/2.3.6:
enquirer: private
/escalade/3.1.1:
escalade: private
/escape-string-regexp/4.0.0:
escape-string-regexp: private
/eslint-rule-composer/0.3.0:
eslint-rule-composer: public
/eslint-scope/7.1.1:
eslint-scope: public
/eslint-utils/3.0.0_eslint@8.29.0:
eslint-utils: public
/eslint-visitor-keys/3.3.0:
eslint-visitor-keys: public
/eslint/8.29.0:
eslint: public
/espree/9.4.1:
espree: private
/esprima/4.0.1:
esprima: private
/esquery/1.4.0:
esquery: private
/esrecurse/4.3.0:
esrecurse: private
/estraverse/5.3.0:
estraverse: private
/esutils/2.0.3:
esutils: private
/fast-deep-equal/3.1.3:
fast-deep-equal: private
/fast-glob/3.2.7:
fast-glob: private
/fast-json-stable-stringify/2.1.0:
fast-json-stable-stringify: private
/fast-levenshtein/2.0.6:
fast-levenshtein: private
/fastq/1.14.0:
fastq: private
/figures/3.2.0:
figures: private
/file-entry-cache/6.0.1:
file-entry-cache: private
/filelist/1.0.4:
filelist: private
/fill-range/7.0.1:
fill-range: private
/find-up/5.0.0:
find-up: private
/flat-cache/3.0.4:
flat-cache: private
/flat/5.0.2:
flat: private
/flatted/3.2.7:
flatted: private
/follow-redirects/1.15.2:
follow-redirects: private
/form-data/4.0.0:
form-data: private
/fs-constants/1.0.0:
fs-constants: private
/fs-extra/10.1.0:
fs-extra: private
/fs.realpath/1.0.0:
fs.realpath: private
/fsevents/2.3.2:
fsevents: private
/get-caller-file/2.0.5:
get-caller-file: private
/glob-parent/6.0.2:
glob-parent: private
/glob/7.1.4:
glob: private
/globals/13.18.0:
globals: private
/graceful-fs/4.2.10:
graceful-fs: private
/grapheme-splitter/1.0.4:
grapheme-splitter: private
/has-flag/4.0.0:
has-flag: private
/ieee754/1.2.1:
ieee754: private
/ignore/5.2.1:
ignore: private
/import-fresh/3.3.0:
import-fresh: private
/imurmurhash/0.1.4:
imurmurhash: private
/inflight/1.0.6:
inflight: private
/inherits/2.0.4:
inherits: private
/is-binary-path/2.1.0:
is-binary-path: private
/is-docker/2.2.1:
is-docker: private
/is-extglob/2.1.1:
is-extglob: private
/is-fullwidth-code-point/3.0.0:
is-fullwidth-code-point: private
/is-glob/4.0.3:
is-glob: private
/is-number/7.0.0:
is-number: private
/is-path-inside/3.0.3:
is-path-inside: private
/is-wsl/2.2.0:
is-wsl: private
/isexe/2.0.0:
isexe: private
/jake/10.8.5:
jake: private
/js-sdsl/4.2.0:
js-sdsl: private
/js-tokens/4.0.0:
js-tokens: private
/js-yaml/4.1.0:
js-yaml: private
/json-schema-traverse/0.4.1:
json-schema-traverse: private
/json-stable-stringify-without-jsonify/1.0.1:
json-stable-stringify-without-jsonify: private
/json5/1.0.1:
json5: private
/jsonc-parser/3.2.0:
jsonc-parser: private
/jsonfile/6.1.0:
jsonfile: private
/levn/0.4.1:
levn: private
/locate-path/6.0.0:
locate-path: private
/lodash.merge/4.6.2:
lodash.merge: private
/loose-envify/1.4.0:
loose-envify: private
/lru-cache/6.0.0:
lru-cache: private
/merge2/1.4.1:
merge2: private
/micromatch/4.0.5:
micromatch: private
/mime-db/1.52.0:
mime-db: private
/mime-types/2.1.35:
mime-types: private
/mimic-fn/2.1.0:
mimic-fn: private
/minimatch/3.1.2:
minimatch: private
/minimist/1.2.7:
minimist: private
/ms/2.1.2:
ms: private
/natural-compare/1.4.0:
natural-compare: private
/node-addon-api/3.2.1:
node-addon-api: private
/node-gyp-build/4.5.0:
node-gyp-build: private
/normalize-path/3.0.0:
normalize-path: private
/npm-run-path/4.0.1:
npm-run-path: private
/nx/15.3.0:
nx: private
/once/1.4.0:
once: private
/onetime/5.1.2:
onetime: private
/open/8.4.0:
open: private
/optionator/0.9.1:
optionator: private
/p-limit/3.1.0:
p-limit: private
/p-locate/5.0.0:
p-locate: private
/parent-module/1.0.1:
parent-module: private
/path-exists/4.0.0:
path-exists: private
/path-is-absolute/1.0.1:
path-is-absolute: private
/path-key/3.1.1:
path-key: private
/picomatch/2.3.1:
picomatch: private
/prelude-ls/1.2.1:
prelude-ls: private
/proxy-from-env/1.1.0:
proxy-from-env: private
/punycode/2.1.1:
punycode: private
/queue-microtask/1.2.3:
queue-microtask: private
/readable-stream/3.6.0:
readable-stream: private
/readdirp/3.6.0:
readdirp: private
/regexpp/3.2.0:
regexpp: private
/require-directory/2.1.1:
require-directory: private
/resolve-from/4.0.0:
resolve-from: private
/restore-cursor/3.1.0:
restore-cursor: private
/reusify/1.0.4:
reusify: private
/rimraf/3.0.2:
rimraf: private
/run-parallel/1.2.0:
run-parallel: private
/safe-buffer/5.2.1:
safe-buffer: private
/semver/7.3.4:
semver: private
/shebang-command/2.0.0:
shebang-command: private
/shebang-regex/3.0.0:
shebang-regex: private
/signal-exit/3.0.7:
signal-exit: private
/sprintf-js/1.0.3:
sprintf-js: private
/string-width/4.2.3:
string-width: private
/string_decoder/1.3.0:
string_decoder: private
/strip-ansi/6.0.1:
strip-ansi: private
/strip-bom/3.0.0:
strip-bom: private
/strip-json-comments/3.1.1:
strip-json-comments: private
/strong-log-transformer/2.1.0:
strong-log-transformer: private
/supports-color/7.2.0:
supports-color: private
/tar-stream/2.2.0:
tar-stream: private
/text-table/0.2.0:
text-table: private
/through/2.3.8:
through: private
/tmp/0.2.1:
tmp: private
/to-regex-range/5.0.1:
to-regex-range: private
/tsconfig-paths/3.14.1:
tsconfig-paths: private
/tslib/2.4.1:
tslib: private
/type-check/0.4.0:
type-check: private
/type-fest/0.20.2:
type-fest: private
/universalify/2.0.0:
universalify: private
/uri-js/4.4.1:
uri-js: private
/util-deprecate/1.0.2:
util-deprecate: private
/v8-compile-cache/2.3.0:
v8-compile-cache: private
/which/2.0.2:
which: private
/word-wrap/1.2.3:
word-wrap: private
/wrap-ansi/7.0.0:
wrap-ansi: private
/wrappy/1.0.2:
wrappy: private
/y18n/5.0.8:
y18n: private
/yallist/4.0.0:
yallist: private
/yargs-parser/21.1.1:
yargs-parser: private
/yocto-queue/0.1.0:
yocto-queue: private
included:
dependencies: true
devDependencies: true
optionalDependencies: true
injectedDeps: {}
layoutVersion: 5
nodeLinker: isolated
packageManager: pnpm@7.16.0
pendingBuilds: []
prunedAt: Thu, 29 Dec 2022 15:57:57 GMT
publicHoistPattern:
- '*eslint*'
- '*prettier*'
registries:
default: https://registry.npmjs.org/
skipped: []
storeDir: /Users/jdoe/Library/pnpm/store/v3
virtualStoreDir: .pnpm
`;

View File

@ -0,0 +1,2 @@
strict-peer-dependencies=false
auto-install-peers=true

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
{
"name": "test",
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"@nrwl/devkit": "15.0.13",
"eslint-plugin-disable-autofix": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
"postgres": "charsleysa/postgres#fix-errors-compiled",
"yargs": "17.6.2"
},
"devDependencies": {
"react": "18.2.0"
},
"peerDependencies": {
"typescript": "4.8.4"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,856 @@
export default `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@eslint/eslintrc@^1.3.3":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95"
integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.4.0"
globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.11.6":
version "0.11.7"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f"
integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==
dependencies:
"@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
minimatch "^3.0.5"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@nrwl/devkit@15.0.13":
version "15.0.13"
resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.0.13.tgz#3943e6967cf93cb3115b04a4dc48494a5453e645"
integrity sha512-/8k7wbBRFf2UC+T4F+vWMy3bfSGi+uK6RwXk53moLq3nxehXaQhRiCqasC6VJFUw3zK6luu2T7xkPUlA9K9l4w==
dependencies:
"@phenomnomnominal/tsquery" "4.1.1"
ejs "^3.1.7"
ignore "^5.0.4"
semver "7.3.4"
tslib "^2.3.0"
"@phenomnomnominal/tsquery@4.1.1":
version "4.1.1"
resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df"
integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==
dependencies:
esquery "^1.0.1"
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.8.0:
version "8.8.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73"
integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==
ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
app-root-path@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86"
integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
async@^3.2.3:
version "3.2.4"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
chalk@^4.0.0, chalk@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
debug@^4.1.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
ejs@^3.1.7:
version "3.1.8"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b"
integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==
dependencies:
jake "^10.8.5"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
"eslint-plugin-disable-autofix@npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@mattlewis92/eslint-plugin-disable-autofix/-/eslint-plugin-disable-autofix-3.0.0.tgz#15cba2d1ce2fd481ebe038cdd0fd2bf85d8d0aff"
integrity sha512-zYDdpaj+1Al8Ki3WpY2I9bOAd8NSgFWGT7yR6KemSi25qWwDMNArnR2q6gDEDKSw+KuYY4shFxkY/JpoNF64tg==
dependencies:
app-root-path "^3.1.0"
eslint "^8.16.0"
eslint-rule-composer "^0.3.0"
eslint-rule-composer@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
eslint-scope@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
dependencies:
eslint-visitor-keys "^2.0.0"
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.16.0:
version "8.29.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87"
integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==
dependencies:
"@eslint/eslintrc" "^1.3.3"
"@humanwhocodes/config-array" "^0.11.6"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
eslint-visitor-keys "^3.3.0"
espree "^9.4.0"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.15.0"
grapheme-splitter "^1.0.4"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
js-sdsl "^4.1.4"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
regexpp "^3.2.0"
strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
text-table "^0.2.0"
espree@^9.4.0:
version "9.4.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd"
integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==
dependencies:
acorn "^8.8.0"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0"
esquery@^1.0.1, esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
dependencies:
estraverse "^5.2.0"
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fastq@^1.6.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce"
integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==
dependencies:
reusify "^1.0.4"
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
flat-cache "^3.0.4"
filelist@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
dependencies:
minimatch "^5.0.1"
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
dependencies:
flatted "^3.1.0"
rimraf "^3.0.2"
flatted@^3.1.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
dependencies:
is-glob "^4.0.3"
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
globals@^13.15.0:
version "13.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc"
integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==
dependencies:
type-fest "^0.20.2"
grapheme-splitter@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
ignore@^5.0.4, ignore@^5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c"
integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
parent-module "^1.0.0"
resolve-from "^4.0.0"
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-path-inside@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
jake@^10.8.5:
version "10.8.5"
resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
filelist "^1.0.1"
minimatch "^3.0.4"
js-sdsl@^4.1.4:
version "4.2.0"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0"
integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
dependencies:
prelude-ls "^1.2.1"
type-check "~0.4.0"
locate-path@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
dependencies:
p-locate "^5.0.0"
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
loose-envify@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022"
integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==
dependencies:
brace-expansion "^2.0.1"
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
dependencies:
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
word-wrap "^1.2.3"
p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
dependencies:
yocto-queue "^0.1.0"
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
dependencies:
p-limit "^3.0.2"
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
"postgres@https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb":
version "3.2.4"
resolved "https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
react@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"
semver@7.3.4:
version "7.3.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
dependencies:
lru-cache "^6.0.0"
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
tslib@^2.3.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies:
prelude-ls "^1.2.1"
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@17.6.2:
version "17.6.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541"
integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
`;

View File

@ -0,0 +1,856 @@
export default `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@eslint/eslintrc@^1.3.3":
version "1.3.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95"
integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.4.0"
globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.11.6":
version "0.11.7"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f"
integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==
dependencies:
"@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
minimatch "^3.0.5"
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/object-schema@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@2.0.5":
version "2.0.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@nrwl/devkit@15.0.13":
version "15.0.13"
resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.0.13.tgz#3943e6967cf93cb3115b04a4dc48494a5453e645"
integrity sha512-/8k7wbBRFf2UC+T4F+vWMy3bfSGi+uK6RwXk53moLq3nxehXaQhRiCqasC6VJFUw3zK6luu2T7xkPUlA9K9l4w==
dependencies:
"@phenomnomnominal/tsquery" "4.1.1"
ejs "^3.1.7"
ignore "^5.0.4"
semver "7.3.4"
tslib "^2.3.0"
"@phenomnomnominal/tsquery@4.1.1":
version "4.1.1"
resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df"
integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==
dependencies:
esquery "^1.0.1"
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.8.0:
version "8.8.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73"
integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==
ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
app-root-path@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86"
integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
async@^3.2.3:
version "3.2.4"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
chalk@^4.0.0, chalk@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
debug@^4.1.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
ejs@^3.1.7:
version "3.1.8"
resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b"
integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==
dependencies:
jake "^10.8.5"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
"eslint-plugin-disable-autofix@npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@mattlewis92/eslint-plugin-disable-autofix/-/eslint-plugin-disable-autofix-3.0.0.tgz#15cba2d1ce2fd481ebe038cdd0fd2bf85d8d0aff"
integrity sha512-zYDdpaj+1Al8Ki3WpY2I9bOAd8NSgFWGT7yR6KemSi25qWwDMNArnR2q6gDEDKSw+KuYY4shFxkY/JpoNF64tg==
dependencies:
app-root-path "^3.1.0"
eslint "^8.16.0"
eslint-rule-composer "^0.3.0"
eslint-rule-composer@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
eslint-scope@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
dependencies:
eslint-visitor-keys "^2.0.0"
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
eslint-visitor-keys@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.16.0:
version "8.29.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87"
integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==
dependencies:
"@eslint/eslintrc" "^1.3.3"
"@humanwhocodes/config-array" "^0.11.6"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
eslint-visitor-keys "^3.3.0"
espree "^9.4.0"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.15.0"
grapheme-splitter "^1.0.4"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
js-sdsl "^4.1.4"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
regexpp "^3.2.0"
strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
text-table "^0.2.0"
espree@^9.4.0:
version "9.4.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd"
integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==
dependencies:
acorn "^8.8.0"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0"
esquery@^1.0.1, esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
dependencies:
estraverse "^5.2.0"
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fastq@^1.6.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce"
integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==
dependencies:
reusify "^1.0.4"
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
flat-cache "^3.0.4"
filelist@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
dependencies:
minimatch "^5.0.1"
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
dependencies:
flatted "^3.1.0"
rimraf "^3.0.2"
flatted@^3.1.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
dependencies:
is-glob "^4.0.3"
glob@^7.1.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
globals@^13.15.0:
version "13.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc"
integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==
dependencies:
type-fest "^0.20.2"
grapheme-splitter@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
ignore@^5.0.4, ignore@^5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c"
integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
parent-module "^1.0.0"
resolve-from "^4.0.0"
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-path-inside@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
jake@^10.8.5:
version "10.8.5"
resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
filelist "^1.0.1"
minimatch "^3.0.4"
js-sdsl@^4.1.4:
version "4.2.0"
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0"
integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
dependencies:
prelude-ls "^1.2.1"
type-check "~0.4.0"
locate-path@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
dependencies:
p-locate "^5.0.0"
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
loose-envify@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.1.tgz#6c9dffcf9927ff2a31e74b5af11adf8b9604b022"
integrity sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==
dependencies:
brace-expansion "^2.0.1"
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
dependencies:
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
word-wrap "^1.2.3"
p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
dependencies:
yocto-queue "^0.1.0"
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
dependencies:
p-limit "^3.0.2"
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
postgres@charsleysa/postgres#fix-errors-compiled:
version "3.2.4"
resolved "https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
react@18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"
semver@7.3.4:
version "7.3.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
dependencies:
lru-cache "^6.0.0"
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
tslib@^2.3.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies:
prelude-ls "^1.2.1"
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@17.6.2:
version "17.6.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541"
integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,690 @@
export default `hoistPattern:
- '*'
hoistedDependencies:
/@ampproject/remapping/2.2.0:
'@ampproject/remapping': private
/@babel/code-frame/7.18.6:
'@babel/code-frame': private
/@babel/compat-data/7.20.10:
'@babel/compat-data': private
/@babel/core/7.20.7:
'@babel/core': private
/@babel/generator/7.20.7:
'@babel/generator': private
/@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7:
'@babel/helper-compilation-targets': private
/@babel/helper-environment-visitor/7.18.9:
'@babel/helper-environment-visitor': private
/@babel/helper-function-name/7.19.0:
'@babel/helper-function-name': private
/@babel/helper-hoist-variables/7.18.6:
'@babel/helper-hoist-variables': private
/@babel/helper-module-imports/7.18.6:
'@babel/helper-module-imports': private
/@babel/helper-module-transforms/7.20.11:
'@babel/helper-module-transforms': private
/@babel/helper-plugin-utils/7.20.2:
'@babel/helper-plugin-utils': private
/@babel/helper-simple-access/7.20.2:
'@babel/helper-simple-access': private
/@babel/helper-split-export-declaration/7.18.6:
'@babel/helper-split-export-declaration': private
/@babel/helper-string-parser/7.19.4:
'@babel/helper-string-parser': private
/@babel/helper-validator-identifier/7.19.1:
'@babel/helper-validator-identifier': private
/@babel/helper-validator-option/7.18.6:
'@babel/helper-validator-option': private
/@babel/helpers/7.20.7:
'@babel/helpers': private
/@babel/highlight/7.18.6:
'@babel/highlight': private
/@babel/parser/7.20.7:
'@babel/parser': private
/@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.7:
'@babel/plugin-syntax-async-generators': private
/@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-bigint': private
/@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.7:
'@babel/plugin-syntax-class-properties': private
/@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.7:
'@babel/plugin-syntax-import-meta': private
/@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-json-strings': private
/@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.7:
'@babel/plugin-syntax-logical-assignment-operators': private
/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-nullish-coalescing-operator': private
/@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.7:
'@babel/plugin-syntax-numeric-separator': private
/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-object-rest-spread': private
/@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-optional-catch-binding': private
/@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.7:
'@babel/plugin-syntax-optional-chaining': private
/@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.7:
'@babel/plugin-syntax-top-level-await': private
/@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.7:
'@babel/plugin-syntax-typescript': private
/@babel/template/7.20.7:
'@babel/template': private
/@babel/traverse/7.20.10:
'@babel/traverse': private
/@babel/types/7.20.7:
'@babel/types': private
/@bcoe/v8-coverage/0.2.3:
'@bcoe/v8-coverage': private
/@istanbuljs/load-nyc-config/1.1.0:
'@istanbuljs/load-nyc-config': private
/@istanbuljs/schema/0.1.3:
'@istanbuljs/schema': private
/@jest/console/28.1.3:
'@jest/console': private
/@jest/environment/28.1.3:
'@jest/environment': private
/@jest/expect-utils/28.1.3:
'@jest/expect-utils': private
/@jest/expect/28.1.3:
'@jest/expect': private
/@jest/fake-timers/28.1.3:
'@jest/fake-timers': private
/@jest/globals/28.1.3:
'@jest/globals': private
/@jest/reporters/28.1.1:
'@jest/reporters': private
/@jest/schemas/28.1.3:
'@jest/schemas': private
/@jest/source-map/28.1.2:
'@jest/source-map': private
/@jest/test-result/28.1.1:
'@jest/test-result': private
/@jest/test-sequencer/28.1.3:
'@jest/test-sequencer': private
/@jest/transform/28.1.3:
'@jest/transform': private
/@jest/types/28.1.3:
'@jest/types': private
/@jridgewell/gen-mapping/0.1.1:
'@jridgewell/gen-mapping': private
/@jridgewell/resolve-uri/3.1.0:
'@jridgewell/resolve-uri': private
/@jridgewell/set-array/1.1.2:
'@jridgewell/set-array': private
/@jridgewell/sourcemap-codec/1.4.14:
'@jridgewell/sourcemap-codec': private
/@jridgewell/trace-mapping/0.3.17:
'@jridgewell/trace-mapping': private
/@nodelib/fs.scandir/2.1.5:
'@nodelib/fs.scandir': private
/@nodelib/fs.stat/2.0.5:
'@nodelib/fs.stat': private
/@nodelib/fs.walk/1.2.8:
'@nodelib/fs.walk': private
/@nrwl/cli/15.4.0:
'@nrwl/cli': private
/@nrwl/jest/14.8.6_nx@14.8.6:
'@nrwl/jest': private
/@nrwl/linter/14.8.6:
'@nrwl/linter': private
/@nrwl/tao/15.4.0:
'@nrwl/tao': private
/@parcel/watcher/2.0.4:
'@parcel/watcher': private
/@phenomnomnominal/tsquery/4.1.1:
'@phenomnomnominal/tsquery': private
/@sinclair/typebox/0.24.51:
'@sinclair/typebox': private
/@sinonjs/commons/1.8.6:
'@sinonjs/commons': private
/@sinonjs/fake-timers/9.1.2:
'@sinonjs/fake-timers': private
/@types/babel__core/7.1.20:
'@types/babel__core': private
/@types/babel__generator/7.6.4:
'@types/babel__generator': private
/@types/babel__template/7.4.1:
'@types/babel__template': private
/@types/babel__traverse/7.18.3:
'@types/babel__traverse': private
/@types/graceful-fs/4.1.5:
'@types/graceful-fs': private
/@types/istanbul-lib-coverage/2.0.4:
'@types/istanbul-lib-coverage': private
/@types/istanbul-lib-report/3.0.0:
'@types/istanbul-lib-report': private
/@types/istanbul-reports/3.0.1:
'@types/istanbul-reports': private
/@types/json5/0.0.29:
'@types/json5': private
/@types/node/18.11.18:
'@types/node': private
/@types/prettier/2.7.2:
'@types/prettier': public
/@types/stack-utils/2.0.1:
'@types/stack-utils': private
/@types/yargs-parser/21.0.0:
'@types/yargs-parser': private
/@types/yargs/17.0.19:
'@types/yargs': private
/@yarnpkg/lockfile/1.1.0:
'@yarnpkg/lockfile': private
/@yarnpkg/parsers/3.0.0-rc.34:
'@yarnpkg/parsers': private
/@zkochan/js-yaml/0.0.6:
'@zkochan/js-yaml': private
/ansi-colors/4.1.3:
ansi-colors: private
/ansi-escapes/4.3.2:
ansi-escapes: private
/ansi-regex/5.0.1:
ansi-regex: private
/ansi-styles/4.3.0:
ansi-styles: private
/anymatch/3.1.3:
anymatch: private
/argparse/2.0.1:
argparse: private
/async/3.2.4:
async: private
/asynckit/0.4.0:
asynckit: private
/axios/1.2.2:
axios: private
/babel-jest/28.1.3_@babel+core@7.20.7:
babel-jest: private
/babel-plugin-istanbul/6.1.1:
babel-plugin-istanbul: private
/babel-plugin-jest-hoist/28.1.3:
babel-plugin-jest-hoist: private
/babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.7:
babel-preset-current-node-syntax: private
/babel-preset-jest/28.1.3_@babel+core@7.20.7:
babel-preset-jest: private
/balanced-match/1.0.2:
balanced-match: private
/base64-js/1.5.1:
base64-js: private
/binary-extensions/2.2.0:
binary-extensions: private
/bl/4.1.0:
bl: private
/brace-expansion/1.1.11:
brace-expansion: private
/braces/3.0.2:
braces: private
/browserslist/4.21.4:
browserslist: private
/bser/2.1.1:
bser: private
/buffer-from/1.1.2:
buffer-from: private
/buffer/5.7.1:
buffer: private
/callsites/3.1.0:
callsites: private
/camelcase/6.3.0:
camelcase: private
/caniuse-lite/1.0.30001441:
caniuse-lite: private
/chalk/4.1.0:
chalk: private
/char-regex/1.0.2:
char-regex: private
/chokidar/3.5.3:
chokidar: private
/ci-info/3.7.1:
ci-info: private
/cjs-module-lexer/1.2.2:
cjs-module-lexer: private
/cli-cursor/3.1.0:
cli-cursor: private
/cli-spinners/2.6.1:
cli-spinners: private
/cliui/7.0.4:
cliui: private
/co/4.6.0:
co: private
/collect-v8-coverage/1.0.1:
collect-v8-coverage: private
/color-convert/2.0.1:
color-convert: private
/color-name/1.1.4:
color-name: private
/combined-stream/1.0.8:
combined-stream: private
/concat-map/0.0.1:
concat-map: private
/convert-source-map/1.9.0:
convert-source-map: private
/cross-spawn/7.0.3:
cross-spawn: private
/debug/4.3.4:
debug: private
/dedent/0.7.0:
dedent: private
/deepmerge/4.2.2:
deepmerge: private
/define-lazy-prop/2.0.0:
define-lazy-prop: private
/delayed-stream/1.0.0:
delayed-stream: private
/detect-newline/3.1.0:
detect-newline: private
/diff-sequences/28.1.1:
diff-sequences: private
/dotenv/10.0.0:
dotenv: private
/duplexer/0.1.2:
duplexer: private
/ejs/3.1.8:
ejs: private
/electron-to-chromium/1.4.284:
electron-to-chromium: private
/emittery/0.10.2:
emittery: private
/emoji-regex/8.0.0:
emoji-regex: private
/end-of-stream/1.4.4:
end-of-stream: private
/enquirer/2.3.6:
enquirer: private
/error-ex/1.3.2:
error-ex: private
/escalade/3.1.1:
escalade: private
/escape-string-regexp/1.0.5:
escape-string-regexp: private
/esprima/4.0.1:
esprima: private
/esquery/1.4.0:
esquery: private
/estraverse/5.3.0:
estraverse: private
/execa/5.1.1:
execa: private
/exit/0.1.2:
exit: private
/expect/28.1.3:
expect: private
/fast-glob/3.2.7:
fast-glob: private
/fast-json-stable-stringify/2.1.0:
fast-json-stable-stringify: private
/fastq/1.15.0:
fastq: private
/fb-watchman/2.0.2:
fb-watchman: private
/figures/3.2.0:
figures: private
/filelist/1.0.4:
filelist: private
/fill-range/7.0.1:
fill-range: private
/find-up/4.1.0:
find-up: private
/flat/5.0.2:
flat: private
/follow-redirects/1.15.2:
follow-redirects: private
/form-data/4.0.0:
form-data: private
/fs-constants/1.0.0:
fs-constants: private
/fs-extra/10.1.0:
fs-extra: private
/fs.realpath/1.0.0:
fs.realpath: private
/fsevents/2.3.2:
fsevents: private
/function-bind/1.1.1:
function-bind: private
/gensync/1.0.0-beta.2:
gensync: private
/get-caller-file/2.0.5:
get-caller-file: private
/get-package-type/0.1.0:
get-package-type: private
/get-stream/6.0.1:
get-stream: private
/glob-parent/5.1.2:
glob-parent: private
/glob/7.1.4:
glob: private
/globals/11.12.0:
globals: private
/graceful-fs/4.2.10:
graceful-fs: private
/harmony-reflect/1.6.2:
harmony-reflect: private
/has-flag/4.0.0:
has-flag: private
/has/1.0.3:
has: private
/html-escaper/2.0.2:
html-escaper: private
/human-signals/2.1.0:
human-signals: private
/identity-obj-proxy/3.0.0:
identity-obj-proxy: private
/ieee754/1.2.1:
ieee754: private
/ignore/5.2.4:
ignore: private
/imurmurhash/0.1.4:
imurmurhash: private
/inflight/1.0.6:
inflight: private
/inherits/2.0.4:
inherits: private
/is-arrayish/0.2.1:
is-arrayish: private
/is-binary-path/2.1.0:
is-binary-path: private
/is-core-module/2.11.0:
is-core-module: private
/is-docker/2.2.1:
is-docker: private
/is-extglob/2.1.1:
is-extglob: private
/is-fullwidth-code-point/3.0.0:
is-fullwidth-code-point: private
/is-generator-fn/2.1.0:
is-generator-fn: private
/is-glob/4.0.3:
is-glob: private
/is-number/7.0.0:
is-number: private
/is-stream/2.0.1:
is-stream: private
/is-wsl/2.2.0:
is-wsl: private
/isexe/2.0.0:
isexe: private
/istanbul-lib-coverage/3.2.0:
istanbul-lib-coverage: private
/istanbul-lib-instrument/5.2.1:
istanbul-lib-instrument: private
/istanbul-lib-report/3.0.0:
istanbul-lib-report: private
/istanbul-lib-source-maps/4.0.1:
istanbul-lib-source-maps: private
/istanbul-reports/3.1.5:
istanbul-reports: private
/jake/10.8.5:
jake: private
/jest-circus/28.1.3:
jest-circus: private
/jest-config/28.1.1:
jest-config: private
/jest-diff/28.1.3:
jest-diff: private
/jest-docblock/28.1.1:
jest-docblock: private
/jest-each/28.1.3:
jest-each: private
/jest-environment-node/28.1.3:
jest-environment-node: private
/jest-get-type/28.0.2:
jest-get-type: private
/jest-haste-map/28.1.3:
jest-haste-map: private
/jest-leak-detector/28.1.3:
jest-leak-detector: private
/jest-matcher-utils/28.1.3:
jest-matcher-utils: private
/jest-message-util/28.1.3:
jest-message-util: private
/jest-mock/28.1.3:
jest-mock: private
/jest-pnp-resolver/1.2.3_jest-resolve@28.1.1:
jest-pnp-resolver: private
/jest-regex-util/28.0.2:
jest-regex-util: private
/jest-resolve/28.1.1:
jest-resolve: private
/jest-runner/28.1.3:
jest-runner: private
/jest-runtime/28.1.3:
jest-runtime: private
/jest-snapshot/28.1.3:
jest-snapshot: private
/jest-util/28.1.1:
jest-util: private
/jest-validate/28.1.3:
jest-validate: private
/jest-watcher/28.1.3:
jest-watcher: private
/jest-worker/28.1.3:
jest-worker: private
/js-tokens/4.0.0:
js-tokens: private
/js-yaml/4.1.0:
js-yaml: private
/jsesc/2.5.2:
jsesc: private
/json-parse-even-better-errors/2.3.1:
json-parse-even-better-errors: private
/json5/1.0.2:
json5: private
/jsonc-parser/3.2.0:
jsonc-parser: private
/jsonfile/6.1.0:
jsonfile: private
/leven/3.1.0:
leven: private
/lines-and-columns/1.2.4:
lines-and-columns: private
/locate-path/5.0.0:
locate-path: private
/lru-cache/6.0.0:
lru-cache: private
/make-dir/3.1.0:
make-dir: private
/makeerror/1.0.12:
makeerror: private
/merge-stream/2.0.0:
merge-stream: private
/merge2/1.4.1:
merge2: private
/micromatch/4.0.5:
micromatch: private
/mime-db/1.52.0:
mime-db: private
/mime-types/2.1.35:
mime-types: private
/mimic-fn/2.1.0:
mimic-fn: private
/minimatch/3.0.5:
minimatch: private
/minimist/1.2.7:
minimist: private
/ms/2.1.2:
ms: private
/natural-compare/1.4.0:
natural-compare: private
/node-addon-api/3.2.1:
node-addon-api: private
/node-gyp-build/4.5.0:
node-gyp-build: private
/node-int64/0.4.0:
node-int64: private
/node-releases/2.0.8:
node-releases: private
/normalize-path/3.0.0:
normalize-path: private
/npm-run-path/4.0.1:
npm-run-path: private
/once/1.4.0:
once: private
/onetime/5.1.2:
onetime: private
/open/8.4.0:
open: private
/p-limit/3.1.0:
p-limit: private
/p-locate/4.1.0:
p-locate: private
/p-try/2.2.0:
p-try: private
/parse-json/5.2.0:
parse-json: private
/path-exists/4.0.0:
path-exists: private
/path-is-absolute/1.0.1:
path-is-absolute: private
/path-key/3.1.1:
path-key: private
/path-parse/1.0.7:
path-parse: private
/picocolors/1.0.0:
picocolors: private
/picomatch/2.3.1:
picomatch: private
/pirates/4.0.5:
pirates: private
/pretty-format/28.1.3:
pretty-format: private
/proxy-from-env/1.1.0:
proxy-from-env: private
/queue-microtask/1.2.3:
queue-microtask: private
/react-is/18.2.0:
react-is: private
/readable-stream/3.6.0:
readable-stream: private
/readdirp/3.6.0:
readdirp: private
/require-directory/2.1.1:
require-directory: private
/resolve-from/5.0.0:
resolve-from: private
/resolve.exports/1.1.0:
resolve.exports: private
/resolve/1.22.1:
resolve: private
/restore-cursor/3.1.0:
restore-cursor: private
/reusify/1.0.4:
reusify: private
/rimraf/3.0.2:
rimraf: private
/run-parallel/1.2.0:
run-parallel: private
/rxjs/6.6.7:
rxjs: private
/safe-buffer/5.2.1:
safe-buffer: private
/semver/7.3.4:
semver: private
/shebang-command/2.0.0:
shebang-command: private
/shebang-regex/3.0.0:
shebang-regex: private
/signal-exit/3.0.7:
signal-exit: private
/slash/3.0.0:
slash: private
/source-map-support/0.5.13:
source-map-support: private
/source-map/0.6.1:
source-map: private
/sprintf-js/1.0.3:
sprintf-js: private
/stack-utils/2.0.6:
stack-utils: private
/string-length/4.0.2:
string-length: private
/string-width/4.2.3:
string-width: private
/string_decoder/1.3.0:
string_decoder: private
/strip-ansi/6.0.1:
strip-ansi: private
/strip-bom/3.0.0:
strip-bom: private
/strip-final-newline/2.0.0:
strip-final-newline: private
/strip-json-comments/3.1.1:
strip-json-comments: private
/strong-log-transformer/2.1.0:
strong-log-transformer: private
/supports-color/7.2.0:
supports-color: private
/supports-hyperlinks/2.3.0:
supports-hyperlinks: private
/supports-preserve-symlinks-flag/1.0.0:
supports-preserve-symlinks-flag: private
/tar-stream/2.2.0:
tar-stream: private
/terminal-link/2.1.1:
terminal-link: private
/test-exclude/6.0.0:
test-exclude: private
/through/2.3.8:
through: private
/tmp/0.2.1:
tmp: private
/tmpl/1.0.5:
tmpl: private
/to-fast-properties/2.0.0:
to-fast-properties: private
/to-regex-range/5.0.1:
to-regex-range: private
/tsconfig-paths/3.14.1:
tsconfig-paths: private
/tslib/2.4.1:
tslib: private
/type-detect/4.0.8:
type-detect: private
/type-fest/0.21.3:
type-fest: private
/universalify/2.0.0:
universalify: private
/update-browserslist-db/1.0.10_browserslist@4.21.4:
update-browserslist-db: private
/util-deprecate/1.0.2:
util-deprecate: private
/v8-compile-cache/2.3.0:
v8-compile-cache: private
/v8-to-istanbul/9.0.1:
v8-to-istanbul: private
/walker/1.0.8:
walker: private
/which/2.0.2:
which: private
/wrap-ansi/7.0.0:
wrap-ansi: private
/wrappy/1.0.2:
wrappy: private
/write-file-atomic/4.0.2:
write-file-atomic: private
/y18n/5.0.8:
y18n: private
/yallist/4.0.0:
yallist: private
/yargs-parser/21.0.1:
yargs-parser: private
/yargs/17.6.2:
yargs: private
/yocto-queue/0.1.0:
yocto-queue: private
included:
dependencies: true
devDependencies: true
optionalDependencies: true
injectedDeps: {}
layoutVersion: 5
nodeLinker: isolated
packageManager: pnpm@7.16.0
pendingBuilds: []
prunedAt: Wed, 04 Jan 2023 12:54:25 GMT
publicHoistPattern:
- '*eslint*'
- '*prettier*'
registries:
default: https://registry.npmjs.org/
skipped: []
storeDir: /Users/jdoe/Library/pnpm/store/v3
virtualStoreDir: .pnpm
`;

View File

@ -0,0 +1,2 @@
strict-peer-dependencies=false
auto-install-peers=true

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
{
"name": "double-versions",
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"@nrwl/devkit": "^14.8.0",
"@nrwl/workspace": "^14.8.0",
"nx": "15.4.0"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
strict-peer-dependencies=false
auto-install-peers=true

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
{
"name": "myapp",
"version": "0.0.1",
"dependencies": {
"@nrwl/next": "15.3.3",
"next": "13.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"typescript": "4.8.4"
},
"scripts": {
"start": "next start"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
{
"name": "test",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"start": "nx serve",
"build": "nx build",
"test": "nx test"
},
"private": true,
"dependencies": {
"@nrwl/next": "15.3.3",
"core-js": "^3.6.5",
"next": "13.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"regenerator-runtime": "0.13.7",
"tslib": "^2.3.0"
},
"devDependencies": {
"@babel/preset-react": "^7.14.5",
"@nrwl/cypress": "15.3.3",
"@nrwl/eslint-plugin-nx": "15.3.3",
"@nrwl/jest": "15.3.3",
"@nrwl/linter": "15.3.3",
"@nrwl/react": "15.3.3",
"@nrwl/web": "15.3.3",
"@nrwl/workspace": "15.3.3",
"@testing-library/react": "13.4.0",
"@types/jest": "28.1.1",
"@types/node": "18.11.9",
"@types/react": "18.0.25",
"@types/react-dom": "18.0.9",
"@typescript-eslint/eslint-plugin": "^5.36.1",
"@typescript-eslint/parser": "^5.36.1",
"babel-jest": "28.1.1",
"cypress": "^11.0.0",
"eslint": "~8.15.0",
"eslint-config-next": "13.0.0",
"eslint-config-prettier": "8.1.0",
"eslint-plugin-cypress": "^2.10.3",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-react": "7.31.11",
"eslint-plugin-react-hooks": "4.6.0",
"jest": "28.1.1",
"jest-environment-jsdom": "28.1.1",
"nx": "15.3.3",
"prettier": "^2.6.2",
"react-test-renderer": "18.2.0",
"ts-jest": "28.0.5",
"ts-node": "10.9.1",
"typescript": "~4.8.2"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
export default `hoistPattern:
- '*'
hoistedDependencies:
/asn1/0.2.6:
asn1: private
/bcrypt-pbkdf/1.0.2:
bcrypt-pbkdf: private
/buildcheck/0.0.3:
buildcheck: private
/cpu-features/0.0.4:
cpu-features: private
/nan/2.17.0:
nan: private
/safer-buffer/2.1.2:
safer-buffer: private
/tweetnacl/0.14.5:
tweetnacl: private
included:
dependencies: true
devDependencies: true
optionalDependencies: true
injectedDeps: {}
layoutVersion: 5
nodeLinker: isolated
packageManager: pnpm@7.16.0
pendingBuilds: []
prunedAt: Tue, 10 Jan 2023 12:52:51 GMT
publicHoistPattern:
- '*eslint*'
- '*prettier*'
registries:
default: https://registry.npmjs.org/
skipped: []
storeDir: /Users/jdoe/Library/pnpm/store/v3
virtualStoreDir: .pnpm
`;

View File

@ -0,0 +1,2 @@
strict-peer-dependencies=false
auto-install-peers=true

View File

@ -0,0 +1 @@
yarnPath: .yarn/releases/yarn-3.3.1.cjs

View File

@ -0,0 +1,149 @@
{
"name": "test",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "test",
"version": "0.0.0",
"license": "ISC",
"dependencies": {
"ssh2": "1.11.0"
}
},
"node_modules/asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dependencies": {
"safer-buffer": "~2.1.0"
}
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dependencies": {
"tweetnacl": "^0.14.3"
}
},
"node_modules/buildcheck": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
"integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
"optional": true,
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/cpu-features": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
"integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"buildcheck": "0.0.3",
"nan": "^2.15.0"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/nan": {
"version": "2.17.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
"integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
"optional": true
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/ssh2": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
"integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
"hasInstallScript": true,
"dependencies": {
"asn1": "^0.2.4",
"bcrypt-pbkdf": "^1.0.2"
},
"engines": {
"node": ">=10.16.0"
},
"optionalDependencies": {
"cpu-features": "~0.0.4",
"nan": "^2.16.0"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
}
},
"dependencies": {
"asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"buildcheck": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz",
"integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==",
"optional": true
},
"cpu-features": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz",
"integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==",
"optional": true,
"requires": {
"buildcheck": "0.0.3",
"nan": "^2.15.0"
}
},
"nan": {
"version": "2.17.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
"integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"ssh2": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz",
"integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==",
"requires": {
"asn1": "^0.2.4",
"bcrypt-pbkdf": "^1.0.2",
"cpu-features": "~0.0.4",
"nan": "^2.16.0"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
}
}
}

View File

@ -0,0 +1,9 @@
{
"name": "test",
"version": "0.0.0",
"license": "ISC",
"dependencies": {
"ssh2": "1.11.0"
},
"packageManager": "yarn@3.3.1"
}

View File

@ -0,0 +1,63 @@
export default `lockfileVersion: 5.4
specifiers:
ssh2: 1.11.0
dependencies:
ssh2: 1.11.0
packages:
/asn1/0.2.6:
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
dependencies:
safer-buffer: 2.1.2
dev: false
/bcrypt-pbkdf/1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
dependencies:
tweetnacl: 0.14.5
dev: false
/buildcheck/0.0.3:
resolution: {integrity: sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==}
engines: {node: '>=10.0.0'}
dev: false
optional: true
/cpu-features/0.0.4:
resolution: {integrity: sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==}
engines: {node: '>=10.0.0'}
requiresBuild: true
dependencies:
buildcheck: 0.0.3
nan: 2.17.0
dev: false
optional: true
/nan/2.17.0:
resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==}
dev: false
optional: true
/safer-buffer/2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: false
/ssh2/1.11.0:
resolution: {integrity: sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==}
engines: {node: '>=10.16.0'}
requiresBuild: true
dependencies:
asn1: 0.2.6
bcrypt-pbkdf: 1.0.2
optionalDependencies:
cpu-features: 0.0.4
nan: 2.17.0
dev: false
/tweetnacl/0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
dev: false
`;

View File

@ -0,0 +1,968 @@
export default `# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 6
cacheKey: 8
"@gar/promisify@npm:^1.1.3":
version: 1.1.3
resolution: "@gar/promisify@npm:1.1.3"
checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1
languageName: node
linkType: hard
"@npmcli/fs@npm:^2.1.0":
version: 2.1.2
resolution: "@npmcli/fs@npm:2.1.2"
dependencies:
"@gar/promisify": ^1.1.3
semver: ^7.3.5
checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225
languageName: node
linkType: hard
"@npmcli/move-file@npm:^2.0.0":
version: 2.0.1
resolution: "@npmcli/move-file@npm:2.0.1"
dependencies:
mkdirp: ^1.0.4
rimraf: ^3.0.2
checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380
languageName: node
linkType: hard
"@tootallnate/once@npm:2":
version: 2.0.0
resolution: "@tootallnate/once@npm:2.0.0"
checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8
languageName: node
linkType: hard
"abbrev@npm:^1.0.0":
version: 1.1.1
resolution: "abbrev@npm:1.1.1"
checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17
languageName: node
linkType: hard
"agent-base@npm:6, agent-base@npm:^6.0.2":
version: 6.0.2
resolution: "agent-base@npm:6.0.2"
dependencies:
debug: 4
checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d
languageName: node
linkType: hard
"agentkeepalive@npm:^4.2.1":
version: 4.2.1
resolution: "agentkeepalive@npm:4.2.1"
dependencies:
debug: ^4.1.0
depd: ^1.1.2
humanize-ms: ^1.2.1
checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18
languageName: node
linkType: hard
"aggregate-error@npm:^3.0.0":
version: 3.1.0
resolution: "aggregate-error@npm:3.1.0"
dependencies:
clean-stack: ^2.0.0
indent-string: ^4.0.0
checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
languageName: node
linkType: hard
"ansi-regex@npm:^5.0.1":
version: 5.0.1
resolution: "ansi-regex@npm:5.0.1"
checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
languageName: node
linkType: hard
"aproba@npm:^1.0.3 || ^2.0.0":
version: 2.0.0
resolution: "aproba@npm:2.0.0"
checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24
languageName: node
linkType: hard
"are-we-there-yet@npm:^3.0.0":
version: 3.0.1
resolution: "are-we-there-yet@npm:3.0.1"
dependencies:
delegates: ^1.0.0
readable-stream: ^3.6.0
checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83
languageName: node
linkType: hard
"asn1@npm:^0.2.4":
version: 0.2.6
resolution: "asn1@npm:0.2.6"
dependencies:
safer-buffer: ~2.1.0
checksum: 39f2ae343b03c15ad4f238ba561e626602a3de8d94ae536c46a4a93e69578826305366dc09fbb9b56aec39b4982a463682f259c38e59f6fa380cd72cd61e493d
languageName: node
linkType: hard
"balanced-match@npm:^1.0.0":
version: 1.0.2
resolution: "balanced-match@npm:1.0.2"
checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65
languageName: node
linkType: hard
"bcrypt-pbkdf@npm:^1.0.2":
version: 1.0.2
resolution: "bcrypt-pbkdf@npm:1.0.2"
dependencies:
tweetnacl: ^0.14.3
checksum: 4edfc9fe7d07019609ccf797a2af28351736e9d012c8402a07120c4453a3b789a15f2ee1530dc49eee8f7eb9379331a8dd4b3766042b9e502f74a68e7f662291
languageName: node
linkType: hard
"brace-expansion@npm:^1.1.7":
version: 1.1.11
resolution: "brace-expansion@npm:1.1.11"
dependencies:
balanced-match: ^1.0.0
concat-map: 0.0.1
checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07
languageName: node
linkType: hard
"brace-expansion@npm:^2.0.1":
version: 2.0.1
resolution: "brace-expansion@npm:2.0.1"
dependencies:
balanced-match: ^1.0.0
checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1
languageName: node
linkType: hard
"buildcheck@npm:0.0.3":
version: 0.0.3
resolution: "buildcheck@npm:0.0.3"
checksum: baf30605c56e80c2ca0502e40e18f2ebc7075bb4a861c941c0b36cd468b27957ed11a62248003ce99b9e5f91a7dfa859b30aad4fa50f0090c77a6f596ba20e6d
languageName: node
linkType: hard
"cacache@npm:^16.1.0":
version: 16.1.3
resolution: "cacache@npm:16.1.3"
dependencies:
"@npmcli/fs": ^2.1.0
"@npmcli/move-file": ^2.0.0
chownr: ^2.0.0
fs-minipass: ^2.1.0
glob: ^8.0.1
infer-owner: ^1.0.4
lru-cache: ^7.7.1
minipass: ^3.1.6
minipass-collect: ^1.0.2
minipass-flush: ^1.0.5
minipass-pipeline: ^1.2.4
mkdirp: ^1.0.4
p-map: ^4.0.0
promise-inflight: ^1.0.1
rimraf: ^3.0.2
ssri: ^9.0.0
tar: ^6.1.11
unique-filename: ^2.0.0
checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6
languageName: node
linkType: hard
"chownr@npm:^2.0.0":
version: 2.0.0
resolution: "chownr@npm:2.0.0"
checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
languageName: node
linkType: hard
"clean-stack@npm:^2.0.0":
version: 2.2.0
resolution: "clean-stack@npm:2.2.0"
checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
languageName: node
linkType: hard
"color-support@npm:^1.1.3":
version: 1.1.3
resolution: "color-support@npm:1.1.3"
bin:
color-support: bin.js
checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b
languageName: node
linkType: hard
"concat-map@npm:0.0.1":
version: 0.0.1
resolution: "concat-map@npm:0.0.1"
checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af
languageName: node
linkType: hard
"console-control-strings@npm:^1.1.0":
version: 1.1.0
resolution: "console-control-strings@npm:1.1.0"
checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed
languageName: node
linkType: hard
"cpu-features@npm:~0.0.4":
version: 0.0.4
resolution: "cpu-features@npm:0.0.4"
dependencies:
buildcheck: 0.0.3
nan: ^2.15.0
node-gyp: latest
checksum: a20d58e41e63182b34753dfe23bd1d967944ec13d84b70849b5d334fb4a558b7e71e7f955ed86c8e75dd65b5c5b882f1c494174d342cb6d8a062d77f79d39596
languageName: node
linkType: hard
"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3":
version: 4.3.4
resolution: "debug@npm:4.3.4"
dependencies:
ms: 2.1.2
peerDependenciesMeta:
supports-color:
optional: true
checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
languageName: node
linkType: hard
"delegates@npm:^1.0.0":
version: 1.0.0
resolution: "delegates@npm:1.0.0"
checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd
languageName: node
linkType: hard
"depd@npm:^1.1.2":
version: 1.1.2
resolution: "depd@npm:1.1.2"
checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9
languageName: node
linkType: hard
"emoji-regex@npm:^8.0.0":
version: 8.0.0
resolution: "emoji-regex@npm:8.0.0"
checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
languageName: node
linkType: hard
"encoding@npm:^0.1.13":
version: 0.1.13
resolution: "encoding@npm:0.1.13"
dependencies:
iconv-lite: ^0.6.2
checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f
languageName: node
linkType: hard
"env-paths@npm:^2.2.0":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
languageName: node
linkType: hard
"err-code@npm:^2.0.2":
version: 2.0.3
resolution: "err-code@npm:2.0.3"
checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0":
version: 2.1.0
resolution: "fs-minipass@npm:2.1.0"
dependencies:
minipass: ^3.0.0
checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
languageName: node
linkType: hard
"fs.realpath@npm:^1.0.0":
version: 1.0.0
resolution: "fs.realpath@npm:1.0.0"
checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0
languageName: node
linkType: hard
"gauge@npm:^4.0.3":
version: 4.0.4
resolution: "gauge@npm:4.0.4"
dependencies:
aproba: ^1.0.3 || ^2.0.0
color-support: ^1.1.3
console-control-strings: ^1.1.0
has-unicode: ^2.0.1
signal-exit: ^3.0.7
string-width: ^4.2.3
strip-ansi: ^6.0.1
wide-align: ^1.1.5
checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d
languageName: node
linkType: hard
"glob@npm:^7.1.3, glob@npm:^7.1.4":
version: 7.2.3
resolution: "glob@npm:7.2.3"
dependencies:
fs.realpath: ^1.0.0
inflight: ^1.0.4
inherits: 2
minimatch: ^3.1.1
once: ^1.3.0
path-is-absolute: ^1.0.0
checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133
languageName: node
linkType: hard
"glob@npm:^8.0.1":
version: 8.0.3
resolution: "glob@npm:8.0.3"
dependencies:
fs.realpath: ^1.0.0
inflight: ^1.0.4
inherits: 2
minimatch: ^5.0.1
once: ^1.3.0
checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5
languageName: node
linkType: hard
"graceful-fs@npm:^4.2.6":
version: 4.2.10
resolution: "graceful-fs@npm:4.2.10"
checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da
languageName: node
linkType: hard
"has-unicode@npm:^2.0.1":
version: 2.0.1
resolution: "has-unicode@npm:2.0.1"
checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400
languageName: node
linkType: hard
"http-cache-semantics@npm:^4.1.0":
version: 4.1.0
resolution: "http-cache-semantics@npm:4.1.0"
checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42
languageName: node
linkType: hard
"http-proxy-agent@npm:^5.0.0":
version: 5.0.0
resolution: "http-proxy-agent@npm:5.0.0"
dependencies:
"@tootallnate/once": 2
agent-base: 6
debug: 4
checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786
languageName: node
linkType: hard
"https-proxy-agent@npm:^5.0.0":
version: 5.0.1
resolution: "https-proxy-agent@npm:5.0.1"
dependencies:
agent-base: 6
debug: 4
checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765
languageName: node
linkType: hard
"humanize-ms@npm:^1.2.1":
version: 1.2.1
resolution: "humanize-ms@npm:1.2.1"
dependencies:
ms: ^2.0.0
checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16
languageName: node
linkType: hard
"iconv-lite@npm:^0.6.2":
version: 0.6.3
resolution: "iconv-lite@npm:0.6.3"
dependencies:
safer-buffer: ">= 2.1.2 < 3.0.0"
checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf
languageName: node
linkType: hard
"imurmurhash@npm:^0.1.4":
version: 0.1.4
resolution: "imurmurhash@npm:0.1.4"
checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7
languageName: node
linkType: hard
"indent-string@npm:^4.0.0":
version: 4.0.0
resolution: "indent-string@npm:4.0.0"
checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
languageName: node
linkType: hard
"infer-owner@npm:^1.0.4":
version: 1.0.4
resolution: "infer-owner@npm:1.0.4"
checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89
languageName: node
linkType: hard
"inflight@npm:^1.0.4":
version: 1.0.6
resolution: "inflight@npm:1.0.6"
dependencies:
once: ^1.3.0
wrappy: 1
checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd
languageName: node
linkType: hard
"inherits@npm:2, inherits@npm:^2.0.3":
version: 2.0.4
resolution: "inherits@npm:2.0.4"
checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
languageName: node
linkType: hard
"ip@npm:^2.0.0":
version: 2.0.0
resolution: "ip@npm:2.0.0"
checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349
languageName: node
linkType: hard
"is-fullwidth-code-point@npm:^3.0.0":
version: 3.0.0
resolution: "is-fullwidth-code-point@npm:3.0.0"
checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
languageName: node
linkType: hard
"is-lambda@npm:^1.0.1":
version: 1.0.1
resolution: "is-lambda@npm:1.0.1"
checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35
languageName: node
linkType: hard
"isexe@npm:^2.0.0":
version: 2.0.0
resolution: "isexe@npm:2.0.0"
checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62
languageName: node
linkType: hard
"lru-cache@npm:^6.0.0":
version: 6.0.0
resolution: "lru-cache@npm:6.0.0"
dependencies:
yallist: ^4.0.0
checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297
languageName: node
linkType: hard
"lru-cache@npm:^7.7.1":
version: 7.14.1
resolution: "lru-cache@npm:7.14.1"
checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104
languageName: node
linkType: hard
"make-fetch-happen@npm:^10.0.3":
version: 10.2.1
resolution: "make-fetch-happen@npm:10.2.1"
dependencies:
agentkeepalive: ^4.2.1
cacache: ^16.1.0
http-cache-semantics: ^4.1.0
http-proxy-agent: ^5.0.0
https-proxy-agent: ^5.0.0
is-lambda: ^1.0.1
lru-cache: ^7.7.1
minipass: ^3.1.6
minipass-collect: ^1.0.2
minipass-fetch: ^2.0.3
minipass-flush: ^1.0.5
minipass-pipeline: ^1.2.4
negotiator: ^0.6.3
promise-retry: ^2.0.1
socks-proxy-agent: ^7.0.0
ssri: ^9.0.0
checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c
languageName: node
linkType: hard
"minimatch@npm:^3.1.1":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
dependencies:
brace-expansion: ^1.1.7
checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
languageName: node
linkType: hard
"minimatch@npm:^5.0.1":
version: 5.1.2
resolution: "minimatch@npm:5.1.2"
dependencies:
brace-expansion: ^2.0.1
checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964
languageName: node
linkType: hard
"minipass-collect@npm:^1.0.2":
version: 1.0.2
resolution: "minipass-collect@npm:1.0.2"
dependencies:
minipass: ^3.0.0
checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10
languageName: node
linkType: hard
"minipass-fetch@npm:^2.0.3":
version: 2.1.2
resolution: "minipass-fetch@npm:2.1.2"
dependencies:
encoding: ^0.1.13
minipass: ^3.1.6
minipass-sized: ^1.0.3
minizlib: ^2.1.2
dependenciesMeta:
encoding:
optional: true
checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91
languageName: node
linkType: hard
"minipass-flush@npm:^1.0.5":
version: 1.0.5
resolution: "minipass-flush@npm:1.0.5"
dependencies:
minipass: ^3.0.0
checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf
languageName: node
linkType: hard
"minipass-pipeline@npm:^1.2.4":
version: 1.2.4
resolution: "minipass-pipeline@npm:1.2.4"
dependencies:
minipass: ^3.0.0
checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b
languageName: node
linkType: hard
"minipass-sized@npm:^1.0.3":
version: 1.0.3
resolution: "minipass-sized@npm:1.0.3"
dependencies:
minipass: ^3.0.0
checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60
languageName: node
linkType: hard
"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6":
version: 3.3.6
resolution: "minipass@npm:3.3.6"
dependencies:
yallist: ^4.0.0
checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48
languageName: node
linkType: hard
"minipass@npm:^4.0.0":
version: 4.0.0
resolution: "minipass@npm:4.0.0"
dependencies:
yallist: ^4.0.0
checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381
languageName: node
linkType: hard
"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
version: 2.1.2
resolution: "minizlib@npm:2.1.2"
dependencies:
minipass: ^3.0.0
yallist: ^4.0.0
checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
languageName: node
linkType: hard
"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
version: 1.0.4
resolution: "mkdirp@npm:1.0.4"
bin:
mkdirp: bin/cmd.js
checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f
languageName: node
linkType: hard
"ms@npm:2.1.2":
version: 2.1.2
resolution: "ms@npm:2.1.2"
checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
languageName: node
linkType: hard
"ms@npm:^2.0.0":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
languageName: node
linkType: hard
"nan@npm:^2.15.0, nan@npm:^2.16.0":
version: 2.17.0
resolution: "nan@npm:2.17.0"
dependencies:
node-gyp: latest
checksum: ec609aeaf7e68b76592a3ba96b372aa7f5df5b056c1e37410b0f1deefbab5a57a922061e2c5b369bae9c7c6b5e6eecf4ad2dac8833a1a7d3a751e0a7c7f849ed
languageName: node
linkType: hard
"negotiator@npm:^0.6.3":
version: 0.6.3
resolution: "negotiator@npm:0.6.3"
checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
languageName: node
linkType: hard
"node-gyp@npm:latest":
version: 9.3.1
resolution: "node-gyp@npm:9.3.1"
dependencies:
env-paths: ^2.2.0
glob: ^7.1.4
graceful-fs: ^4.2.6
make-fetch-happen: ^10.0.3
nopt: ^6.0.0
npmlog: ^6.0.0
rimraf: ^3.0.2
semver: ^7.3.5
tar: ^6.1.2
which: ^2.0.2
bin:
node-gyp: bin/node-gyp.js
checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7
languageName: node
linkType: hard
"nopt@npm:^6.0.0":
version: 6.0.0
resolution: "nopt@npm:6.0.0"
dependencies:
abbrev: ^1.0.0
bin:
nopt: bin/nopt.js
checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac
languageName: node
linkType: hard
"npmlog@npm:^6.0.0":
version: 6.0.2
resolution: "npmlog@npm:6.0.2"
dependencies:
are-we-there-yet: ^3.0.0
console-control-strings: ^1.1.0
gauge: ^4.0.3
set-blocking: ^2.0.0
checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a
languageName: node
linkType: hard
"once@npm:^1.3.0":
version: 1.4.0
resolution: "once@npm:1.4.0"
dependencies:
wrappy: 1
checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68
languageName: node
linkType: hard
"p-map@npm:^4.0.0":
version: 4.0.0
resolution: "p-map@npm:4.0.0"
dependencies:
aggregate-error: ^3.0.0
checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
languageName: node
linkType: hard
"path-is-absolute@npm:^1.0.0":
version: 1.0.1
resolution: "path-is-absolute@npm:1.0.1"
checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8
languageName: node
linkType: hard
"promise-inflight@npm:^1.0.1":
version: 1.0.1
resolution: "promise-inflight@npm:1.0.1"
checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981
languageName: node
linkType: hard
"promise-retry@npm:^2.0.1":
version: 2.0.1
resolution: "promise-retry@npm:2.0.1"
dependencies:
err-code: ^2.0.2
retry: ^0.12.0
checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
languageName: node
linkType: hard
"readable-stream@npm:^3.6.0":
version: 3.6.0
resolution: "readable-stream@npm:3.6.0"
dependencies:
inherits: ^2.0.3
string_decoder: ^1.1.1
util-deprecate: ^1.0.1
checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8
languageName: node
linkType: hard
"retry@npm:^0.12.0":
version: 0.12.0
resolution: "retry@npm:0.12.0"
checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c
languageName: node
linkType: hard
"rimraf@npm:^3.0.2":
version: 3.0.2
resolution: "rimraf@npm:3.0.2"
dependencies:
glob: ^7.1.3
bin:
rimraf: bin.js
checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0
languageName: node
linkType: hard
"safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
languageName: node
linkType: hard
"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:~2.1.0":
version: 2.1.2
resolution: "safer-buffer@npm:2.1.2"
checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0
languageName: node
linkType: hard
"semver@npm:^7.3.5":
version: 7.3.8
resolution: "semver@npm:7.3.8"
dependencies:
lru-cache: ^6.0.0
bin:
semver: bin/semver.js
checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1
languageName: node
linkType: hard
"set-blocking@npm:^2.0.0":
version: 2.0.0
resolution: "set-blocking@npm:2.0.0"
checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02
languageName: node
linkType: hard
"signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
languageName: node
linkType: hard
"smart-buffer@npm:^4.2.0":
version: 4.2.0
resolution: "smart-buffer@npm:4.2.0"
checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
languageName: node
linkType: hard
"socks-proxy-agent@npm:^7.0.0":
version: 7.0.0
resolution: "socks-proxy-agent@npm:7.0.0"
dependencies:
agent-base: ^6.0.2
debug: ^4.3.3
socks: ^2.6.2
checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846
languageName: node
linkType: hard
"socks@npm:^2.6.2":
version: 2.7.1
resolution: "socks@npm:2.7.1"
dependencies:
ip: ^2.0.0
smart-buffer: ^4.2.0
checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748
languageName: node
linkType: hard
"ssh2@npm:1.11.0":
version: 1.11.0
resolution: "ssh2@npm:1.11.0"
dependencies:
asn1: ^0.2.4
bcrypt-pbkdf: ^1.0.2
cpu-features: ~0.0.4
nan: ^2.16.0
dependenciesMeta:
cpu-features:
optional: true
nan:
optional: true
checksum: e40cb9f171741a807c170dc555078aa8c49dc93dd36fc9c8be026fce1cfd31f0d37078d9b60a0f2cfb11d0e007ed5407376b72f8a0ef9f2cb89574632bbfb824
languageName: node
linkType: hard
"ssri@npm:^9.0.0":
version: 9.0.1
resolution: "ssri@npm:9.0.1"
dependencies:
minipass: ^3.1.1
checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb
languageName: node
linkType: hard
"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
dependencies:
emoji-regex: ^8.0.0
is-fullwidth-code-point: ^3.0.0
strip-ansi: ^6.0.1
checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
languageName: node
linkType: hard
"string_decoder@npm:^1.1.1":
version: 1.3.0
resolution: "string_decoder@npm:1.3.0"
dependencies:
safe-buffer: ~5.2.0
checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56
languageName: node
linkType: hard
"strip-ansi@npm:^6.0.1":
version: 6.0.1
resolution: "strip-ansi@npm:6.0.1"
dependencies:
ansi-regex: ^5.0.1
checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
languageName: node
linkType: hard
"tar@npm:^6.1.11, tar@npm:^6.1.2":
version: 6.1.13
resolution: "tar@npm:6.1.13"
dependencies:
chownr: ^2.0.0
fs-minipass: ^2.0.0
minipass: ^4.0.0
minizlib: ^2.1.1
mkdirp: ^1.0.3
yallist: ^4.0.0
checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c
languageName: node
linkType: hard
"test@workspace:.":
version: 0.0.0-use.local
resolution: "test@workspace:."
dependencies:
ssh2: 1.11.0
languageName: unknown
linkType: soft
"tweetnacl@npm:^0.14.3":
version: 0.14.5
resolution: "tweetnacl@npm:0.14.5"
checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487
languageName: node
linkType: hard
"unique-filename@npm:^2.0.0":
version: 2.0.1
resolution: "unique-filename@npm:2.0.1"
dependencies:
unique-slug: ^3.0.0
checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f
languageName: node
linkType: hard
"unique-slug@npm:^3.0.0":
version: 3.0.0
resolution: "unique-slug@npm:3.0.0"
dependencies:
imurmurhash: ^0.1.4
checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c
languageName: node
linkType: hard
"util-deprecate@npm:^1.0.1":
version: 1.0.2
resolution: "util-deprecate@npm:1.0.2"
checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2
languageName: node
linkType: hard
"which@npm:^2.0.2":
version: 2.0.2
resolution: "which@npm:2.0.2"
dependencies:
isexe: ^2.0.0
bin:
node-which: ./bin/node-which
checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1
languageName: node
linkType: hard
"wide-align@npm:^1.1.5":
version: 1.1.5
resolution: "wide-align@npm:1.1.5"
dependencies:
string-width: ^1.0.2 || 2 || 3 || 4
checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3
languageName: node
linkType: hard
"wrappy@npm:1":
version: 1.0.2
resolution: "wrappy@npm:1.0.2"
checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5
languageName: node
linkType: hard
"yallist@npm:^4.0.0":
version: 4.0.0
resolution: "yallist@npm:4.0.0"
checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
languageName: node
linkType: hard
`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,290 @@
export default `hoistPattern:
- '*'
hoistedDependencies:
/@nodelib/fs.scandir/2.1.5:
'@nodelib/fs.scandir': private
/@nodelib/fs.stat/2.0.5:
'@nodelib/fs.stat': private
/@nodelib/fs.walk/1.2.8:
'@nodelib/fs.walk': private
/@nrwl/devkit/15.4.5_nx@15.4.5+typescript@4.8.4:
'@nrwl/devkit': private
/@nrwl/linter/15.4.5_nx@15.4.5+typescript@4.8.4:
'@nrwl/linter': private
/@nrwl/tao/15.4.5:
'@nrwl/tao': private
/@parcel/watcher/2.0.4:
'@parcel/watcher': private
/@phenomnomnominal/tsquery/4.1.1_typescript@4.8.4:
'@phenomnomnominal/tsquery': private
/@yarnpkg/lockfile/1.1.0:
'@yarnpkg/lockfile': private
/@yarnpkg/parsers/3.0.0-rc.35:
'@yarnpkg/parsers': private
/@zkochan/js-yaml/0.0.6:
'@zkochan/js-yaml': private
/ansi-colors/4.1.3:
ansi-colors: private
/ansi-regex/5.0.1:
ansi-regex: private
/ansi-styles/4.3.0:
ansi-styles: private
/anymatch/3.1.3:
anymatch: private
/argparse/2.0.1:
argparse: private
/async/3.2.4:
async: private
/asynckit/0.4.0:
asynckit: private
/axios/1.2.2:
axios: private
/balanced-match/1.0.2:
balanced-match: private
/base64-js/1.5.1:
base64-js: private
/binary-extensions/2.2.0:
binary-extensions: private
/bl/4.1.0:
bl: private
/brace-expansion/1.1.11:
brace-expansion: private
/braces/3.0.2:
braces: private
/buffer/5.7.1:
buffer: private
/chalk/4.1.0:
chalk: private
/chokidar/3.5.3:
chokidar: private
/cli-cursor/3.1.0:
cli-cursor: private
/cli-spinners/2.6.1:
cli-spinners: private
/cliui/7.0.4:
cliui: private
/color-convert/2.0.1:
color-convert: private
/color-name/1.1.4:
color-name: private
/combined-stream/1.0.8:
combined-stream: private
/concat-map/0.0.1:
concat-map: private
/define-lazy-prop/2.0.0:
define-lazy-prop: private
/delayed-stream/1.0.0:
delayed-stream: private
/dotenv/10.0.0:
dotenv: private
/duplexer/0.1.2:
duplexer: private
/ejs/3.1.8:
ejs: private
/emoji-regex/8.0.0:
emoji-regex: private
/end-of-stream/1.4.4:
end-of-stream: private
/enquirer/2.3.6:
enquirer: private
/escalade/3.1.1:
escalade: private
/escape-string-regexp/1.0.5:
escape-string-regexp: private
/esprima/4.0.1:
esprima: private
/esquery/1.4.0:
esquery: private
/estraverse/5.3.0:
estraverse: private
/fast-glob/3.2.7:
fast-glob: private
/fastq/1.15.0:
fastq: private
/figures/3.2.0:
figures: private
/filelist/1.0.4:
filelist: private
/fill-range/7.0.1:
fill-range: private
/flat/5.0.2:
flat: private
/follow-redirects/1.15.2:
follow-redirects: private
/form-data/4.0.0:
form-data: private
/fs-constants/1.0.0:
fs-constants: private
/fs-extra/10.1.0:
fs-extra: private
/fs.realpath/1.0.0:
fs.realpath: private
/fsevents/2.3.2:
fsevents: private
/get-caller-file/2.0.5:
get-caller-file: private
/glob-parent/5.1.2:
glob-parent: private
/glob/7.1.4:
glob: private
/graceful-fs/4.2.10:
graceful-fs: private
/has-flag/4.0.0:
has-flag: private
/ieee754/1.2.1:
ieee754: private
/ignore/5.2.4:
ignore: private
/inflight/1.0.6:
inflight: private
/inherits/2.0.4:
inherits: private
/is-binary-path/2.1.0:
is-binary-path: private
/is-docker/2.2.1:
is-docker: private
/is-extglob/2.1.1:
is-extglob: private
/is-fullwidth-code-point/3.0.0:
is-fullwidth-code-point: private
/is-glob/4.0.3:
is-glob: private
/is-number/7.0.0:
is-number: private
/is-wsl/2.2.0:
is-wsl: private
/jake/10.8.5:
jake: private
/js-yaml/4.1.0:
js-yaml: private
/json5/2.2.3:
json5: private
/jsonc-parser/3.2.0:
jsonc-parser: private
/jsonfile/6.1.0:
jsonfile: private
/lru-cache/6.0.0:
lru-cache: private
/merge2/1.4.1:
merge2: private
/micromatch/4.0.5:
micromatch: private
/mime-db/1.52.0:
mime-db: private
/mime-types/2.1.35:
mime-types: private
/mimic-fn/2.1.0:
mimic-fn: private
/minimatch/3.0.5:
minimatch: private
/minimist/1.2.7:
minimist: private
/node-addon-api/3.2.1:
node-addon-api: private
/node-gyp-build/4.6.0:
node-gyp-build: private
/normalize-path/3.0.0:
normalize-path: private
/npm-run-path/4.0.1:
npm-run-path: private
/once/1.4.0:
once: private
/onetime/5.1.2:
onetime: private
/open/8.4.0:
open: private
/path-is-absolute/1.0.1:
path-is-absolute: private
/path-key/3.1.1:
path-key: private
/picomatch/2.3.1:
picomatch: private
/proxy-from-env/1.1.0:
proxy-from-env: private
/queue-microtask/1.2.3:
queue-microtask: private
/readable-stream/3.6.0:
readable-stream: private
/readdirp/3.6.0:
readdirp: private
/require-directory/2.1.1:
require-directory: private
/restore-cursor/3.1.0:
restore-cursor: private
/reusify/1.0.4:
reusify: private
/rimraf/3.0.2:
rimraf: private
/run-parallel/1.2.0:
run-parallel: private
/rxjs/6.6.7:
rxjs: private
/safe-buffer/5.2.1:
safe-buffer: private
/semver/7.3.4:
semver: private
/signal-exit/3.0.7:
signal-exit: private
/sprintf-js/1.0.3:
sprintf-js: private
/string-width/4.2.3:
string-width: private
/string_decoder/1.3.0:
string_decoder: private
/strip-ansi/6.0.1:
strip-ansi: private
/strip-bom/3.0.0:
strip-bom: private
/strong-log-transformer/2.1.0:
strong-log-transformer: private
/supports-color/7.2.0:
supports-color: private
/tar-stream/2.2.0:
tar-stream: private
/through/2.3.8:
through: private
/tmp/0.2.1:
tmp: private
/to-regex-range/5.0.1:
to-regex-range: private
/tsconfig-paths/4.1.2:
tsconfig-paths: private
/tslib/2.4.1:
tslib: private
/universalify/2.0.0:
universalify: private
/util-deprecate/1.0.2:
util-deprecate: private
/v8-compile-cache/2.3.0:
v8-compile-cache: private
/wrap-ansi/7.0.0:
wrap-ansi: private
/wrappy/1.0.2:
wrappy: private
/y18n/5.0.8:
y18n: private
/yallist/4.0.0:
yallist: private
/yargs-parser/21.1.1:
yargs-parser: private
/yargs/17.6.2:
yargs: private
included:
dependencies: true
devDependencies: true
optionalDependencies: true
injectedDeps: {}
layoutVersion: 5
nodeLinker: isolated
packageManager: pnpm@7.16.0
pendingBuilds: []
prunedAt: Wed, 11 Jan 2023 18:55:07 GMT
publicHoistPattern:
- '*eslint*'
- '*prettier*'
registries:
default: https://registry.npmjs.org/
skipped: []
storeDir: /Users/jdoe/Library/pnpm/store/v3
virtualStoreDir: .pnpm
`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
{
"name": "test",
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"@nrwl/devkit": "15.4.5",
"nx": "15.4.5",
"typescript": "4.8.4",
"yargs": "17.6.2"
}
}

View File

@ -0,0 +1,967 @@
export default `lockfileVersion: 5.4
importers:
.:
specifiers:
'@nrwl/devkit': 15.4.5
nx: 15.4.5
typescript: 4.8.4
yargs: 17.6.2
dependencies:
'@nrwl/devkit': 15.4.5_nx@15.4.5+typescript@4.8.4
nx: 15.4.5
typescript: 4.8.4
yargs: 17.6.2
packages:
/@nodelib/fs.scandir/2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
dev: false
/@nodelib/fs.stat/2.0.5:
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'}
dev: false
/@nodelib/fs.walk/1.2.8:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
dev: false
/@nrwl/cli/15.4.5:
resolution: {integrity: sha512-f13s0/hzS9jsV1+QPr1Lp3Um+3dOHD8gEP2h7uw17rEPrtJ5ggRKMj/HcZ9dkT9zDM9EmPtVTb6k38ON+NWcUw==}
dependencies:
nx: 15.4.5
transitivePeerDependencies:
- '@swc-node/register'
- '@swc/core'
- debug
dev: false
/@nrwl/devkit/15.4.5_nx@15.4.5+typescript@4.8.4:
resolution: {integrity: sha512-oag+wJgusKz+rwvgcVy9i8bNtTo7ikbjVVtSOmyVBE0ZrgN1CMFjugBj4FEjKGtd73djjpvW9Mm36uJRujrc2w==}
peerDependencies:
nx: '>= 14 <= 16'
dependencies:
'@phenomnomnominal/tsquery': 4.1.1_typescript@4.8.4
ejs: 3.1.8
ignore: 5.2.4
nx: 15.4.5
semver: 7.3.4
tslib: 2.4.1
transitivePeerDependencies:
- typescript
dev: false
/@nrwl/tao/15.4.5:
resolution: {integrity: sha512-UMtxXxTWqbyZOdyD9Zt2IsDY/JVXIFZtY6pO4jPha7+UIHWf2Zi8Dszs6UoUTS4mqpNMIkKymwpZGtkDTfiAJA==}
hasBin: true
dependencies:
nx: 15.4.5
transitivePeerDependencies:
- '@swc-node/register'
- '@swc/core'
- debug
dev: false
/@parcel/watcher/2.0.4:
resolution: {integrity: sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==}
engines: {node: '>= 10.0.0'}
requiresBuild: true
dependencies:
node-addon-api: 3.2.1
node-gyp-build: 4.6.0
dev: false
/@phenomnomnominal/tsquery/4.1.1_typescript@4.8.4:
resolution: {integrity: sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==}
peerDependencies:
typescript: ^3 || ^4
dependencies:
esquery: 1.4.0
typescript: 4.8.4
dev: false
/@yarnpkg/lockfile/1.1.0:
resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
dev: false
/@yarnpkg/parsers/3.0.0-rc.35:
resolution: {integrity: sha512-J6ySgEdQUqAmlttvZOoXOEsrDTAnHyR/MtEvuAG5a+gwKY/2Cc7xn4CWcpgfuwkp+0a4vXmt2BDwzacDoGDN1g==}
engines: {node: '>=14.15.0'}
dependencies:
js-yaml: 3.14.1
tslib: 2.4.1
dev: false
/@zkochan/js-yaml/0.0.6:
resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==}
hasBin: true
dependencies:
argparse: 2.0.1
dev: false
/ansi-colors/4.1.3:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
dev: false
/ansi-regex/5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
dev: false
/ansi-styles/4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
dependencies:
color-convert: 2.0.1
dev: false
/anymatch/3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
dev: false
/argparse/1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
sprintf-js: 1.0.3
dev: false
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: false
/async/3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
dev: false
/asynckit/0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/axios/1.2.2:
resolution: {integrity: sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==}
dependencies:
follow-redirects: 1.15.2
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
/balanced-match/1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: false
/base64-js/1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
dev: false
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
dev: false
/bl/4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
dependencies:
buffer: 5.7.1
inherits: 2.0.4
readable-stream: 3.6.0
dev: false
/brace-expansion/1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
balanced-match: 1.0.2
concat-map: 0.0.1
dev: false
/brace-expansion/2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
dev: false
/braces/3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'}
dependencies:
fill-range: 7.0.1
dev: false
/buffer/5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
dev: false
/chalk/4.1.0:
resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==}
engines: {node: '>=10'}
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
dev: false
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
dependencies:
anymatch: 3.1.3
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
dev: false
/cli-cursor/3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
dependencies:
restore-cursor: 3.1.0
dev: false
/cli-spinners/2.6.1:
resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==}
engines: {node: '>=6'}
dev: false
/cliui/7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
dev: false
/cliui/8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
dependencies:
string-width: 4.2.3
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
dev: false
/color-convert/2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
dependencies:
color-name: 1.1.4
dev: false
/color-name/1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: false
/combined-stream/1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/concat-map/0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: false
/define-lazy-prop/2.0.0:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
engines: {node: '>=8'}
dev: false
/delayed-stream/1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dotenv/10.0.0:
resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==}
engines: {node: '>=10'}
dev: false
/duplexer/0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
dev: false
/ejs/3.1.8:
resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==}
engines: {node: '>=0.10.0'}
hasBin: true
dependencies:
jake: 10.8.5
dev: false
/emoji-regex/8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: false
/end-of-stream/1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
dependencies:
once: 1.4.0
dev: false
/enquirer/2.3.6:
resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
engines: {node: '>=8.6'}
dependencies:
ansi-colors: 4.1.3
dev: false
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'}
dev: false
/escape-string-regexp/1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
engines: {node: '>=0.8.0'}
dev: false
/esprima/4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
dev: false
/esquery/1.4.0:
resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
engines: {node: '>=0.10'}
dependencies:
estraverse: 5.3.0
dev: false
/estraverse/5.3.0:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
dev: false
/fast-glob/3.2.7:
resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==}
engines: {node: '>=8'}
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
micromatch: 4.0.5
dev: false
/fastq/1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
dependencies:
reusify: 1.0.4
dev: false
/figures/3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
dependencies:
escape-string-regexp: 1.0.5
dev: false
/filelist/1.0.4:
resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
dependencies:
minimatch: 5.1.2
dev: false
/fill-range/7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
dev: false
/flat/5.0.2:
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
hasBin: true
dev: false
/follow-redirects/1.15.2:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/form-data/4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/fs-constants/1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
dev: false
/fs-extra/10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
dependencies:
graceful-fs: 4.2.10
jsonfile: 6.1.0
universalify: 2.0.0
dev: false
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: false
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: false
optional: true
/get-caller-file/2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
dev: false
/glob-parent/5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
dependencies:
is-glob: 4.0.3
dev: false
/glob/7.1.4:
resolution: {integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==}
dependencies:
fs.realpath: 1.0.0
inflight: 1.0.6
inherits: 2.0.4
minimatch: 3.0.5
once: 1.4.0
path-is-absolute: 1.0.1
dev: false
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: false
/has-flag/4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
dev: false
/ieee754/1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: false
/ignore/5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
engines: {node: '>= 4'}
dev: false
/inflight/1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
dependencies:
once: 1.4.0
wrappy: 1.0.2
dev: false
/inherits/2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
dev: false
/is-binary-path/2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.2.0
dev: false
/is-docker/2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'}
hasBin: true
dev: false
/is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
dev: false
/is-fullwidth-code-point/3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
dev: false
/is-glob/4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
dependencies:
is-extglob: 2.1.1
dev: false
/is-number/7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
dev: false
/is-wsl/2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
dependencies:
is-docker: 2.2.1
dev: false
/jake/10.8.5:
resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==}
engines: {node: '>=10'}
hasBin: true
dependencies:
async: 3.2.4
chalk: 4.1.0
filelist: 1.0.4
minimatch: 3.0.5
dev: false
/js-yaml/3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
dependencies:
argparse: 1.0.10
esprima: 4.0.1
dev: false
/js-yaml/4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
dependencies:
argparse: 2.0.1
dev: false
/json5/2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
hasBin: true
dev: false
/jsonc-parser/3.2.0:
resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
dev: false
/jsonfile/6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
dependencies:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.10
dev: false
/lru-cache/6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
dev: false
/merge2/1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
dev: false
/micromatch/4.0.5:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
dependencies:
braces: 3.0.2
picomatch: 2.3.1
dev: false
/mime-db/1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types/2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/mimic-fn/2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
dev: false
/minimatch/3.0.5:
resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==}
dependencies:
brace-expansion: 1.1.11
dev: false
/minimatch/5.1.2:
resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==}
engines: {node: '>=10'}
dependencies:
brace-expansion: 2.0.1
dev: false
/minimist/1.2.7:
resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==}
dev: false
/node-addon-api/3.2.1:
resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
dev: false
/node-gyp-build/4.6.0:
resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==}
hasBin: true
dev: false
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
dev: false
/npm-run-path/4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
dependencies:
path-key: 3.1.1
dev: false
/nx/15.4.5:
resolution: {integrity: sha512-1spZL6sgOV8JJJuN8W5CLtJYwTOnlyaV32jPXfidavU0QMS8MP+rW3+NUQ9Uzc1UYhOu8llZWtnen93neVGQRw==}
hasBin: true
requiresBuild: true
peerDependencies:
'@swc-node/register': ^1.4.2
'@swc/core': ^1.2.173
peerDependenciesMeta:
'@swc-node/register':
optional: true
'@swc/core':
optional: true
dependencies:
'@nrwl/cli': 15.4.5
'@nrwl/tao': 15.4.5
'@parcel/watcher': 2.0.4
'@yarnpkg/lockfile': 1.1.0
'@yarnpkg/parsers': 3.0.0-rc.35
'@zkochan/js-yaml': 0.0.6
axios: 1.2.2
chalk: 4.1.0
chokidar: 3.5.3
cli-cursor: 3.1.0
cli-spinners: 2.6.1
cliui: 7.0.4
dotenv: 10.0.0
enquirer: 2.3.6
fast-glob: 3.2.7
figures: 3.2.0
flat: 5.0.2
fs-extra: 10.1.0
glob: 7.1.4
ignore: 5.2.4
js-yaml: 4.1.0
jsonc-parser: 3.2.0
minimatch: 3.0.5
npm-run-path: 4.0.1
open: 8.4.0
semver: 7.3.4
string-width: 4.2.3
strong-log-transformer: 2.1.0
tar-stream: 2.2.0
tmp: 0.2.1
tsconfig-paths: 4.1.2
tslib: 2.4.1
v8-compile-cache: 2.3.0
yargs: 17.6.2
yargs-parser: 21.1.1
transitivePeerDependencies:
- debug
dev: false
/once/1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
dev: false
/onetime/5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
dependencies:
mimic-fn: 2.1.0
dev: false
/open/8.4.0:
resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==}
engines: {node: '>=12'}
dependencies:
define-lazy-prop: 2.0.0
is-docker: 2.2.1
is-wsl: 2.2.0
dev: false
/path-is-absolute/1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
dev: false
/path-key/3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
dev: false
/picomatch/2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
dev: false
/proxy-from-env/1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/queue-microtask/1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: false
/readable-stream/3.6.0:
resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
engines: {node: '>= 6'}
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
dev: false
/readdirp/3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.1
dev: false
/require-directory/2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
dev: false
/restore-cursor/3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
dependencies:
onetime: 5.1.2
signal-exit: 3.0.7
dev: false
/reusify/1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: false
/rimraf/3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true
dependencies:
glob: 7.1.4
dev: false
/run-parallel/1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
dev: false
/safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false
/semver/7.3.4:
resolution: {integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==}
engines: {node: '>=10'}
hasBin: true
dependencies:
lru-cache: 6.0.0
dev: false
/signal-exit/3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
dev: false
/sprintf-js/1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
dev: false
/string-width/4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
dependencies:
emoji-regex: 8.0.0
is-fullwidth-code-point: 3.0.0
strip-ansi: 6.0.1
dev: false
/string_decoder/1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
dependencies:
safe-buffer: 5.2.1
dev: false
/strip-ansi/6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
dependencies:
ansi-regex: 5.0.1
dev: false
/strip-bom/3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
dev: false
/strong-log-transformer/2.1.0:
resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==}
engines: {node: '>=4'}
hasBin: true
dependencies:
duplexer: 0.1.2
minimist: 1.2.7
through: 2.3.8
dev: false
/supports-color/7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
dependencies:
has-flag: 4.0.0
dev: false
/tar-stream/2.2.0:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'}
dependencies:
bl: 4.1.0
end-of-stream: 1.4.4
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.0
dev: false
/through/2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: false
/tmp/0.2.1:
resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
engines: {node: '>=8.17.0'}
dependencies:
rimraf: 3.0.2
dev: false
/to-regex-range/5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
dev: false
/tsconfig-paths/4.1.2:
resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==}
engines: {node: '>=6'}
dependencies:
json5: 2.2.3
minimist: 1.2.7
strip-bom: 3.0.0
dev: false
/tslib/2.4.1:
resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
dev: false
/typescript/4.8.4:
resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: false
/universalify/2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
dev: false
/util-deprecate/1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: false
/v8-compile-cache/2.3.0:
resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
dev: false
/wrap-ansi/7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
dependencies:
ansi-styles: 4.3.0
string-width: 4.2.3
strip-ansi: 6.0.1
dev: false
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: false
/y18n/5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
dev: false
/yallist/4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: false
/yargs-parser/21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
dev: false
/yargs/17.6.2:
resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==}
engines: {node: '>=12'}
dependencies:
cliui: 8.0.1
escalade: 3.1.1
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
y18n: 5.0.8
yargs-parser: 21.1.1
dev: false
`;

View File

@ -0,0 +1,956 @@
export default `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3":
version "1.2.8"
resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@nrwl/cli@15.4.5":
version "15.4.5"
resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.4.5.tgz"
integrity sha512-f13s0/hzS9jsV1+QPr1Lp3Um+3dOHD8gEP2h7uw17rEPrtJ5ggRKMj/HcZ9dkT9zDM9EmPtVTb6k38ON+NWcUw==
dependencies:
nx "15.4.5"
"@nrwl/devkit@15.4.5":
version "15.4.5"
resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.4.5.tgz"
integrity sha512-oag+wJgusKz+rwvgcVy9i8bNtTo7ikbjVVtSOmyVBE0ZrgN1CMFjugBj4FEjKGtd73djjpvW9Mm36uJRujrc2w==
dependencies:
"@phenomnomnominal/tsquery" "4.1.1"
ejs "^3.1.7"
ignore "^5.0.4"
semver "7.3.4"
tslib "^2.3.0"
"@nrwl/tao@15.4.5":
version "15.4.5"
resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.4.5.tgz"
integrity sha512-UMtxXxTWqbyZOdyD9Zt2IsDY/JVXIFZtY6pO4jPha7+UIHWf2Zi8Dszs6UoUTS4mqpNMIkKymwpZGtkDTfiAJA==
dependencies:
nx "15.4.5"
"@parcel/watcher@2.0.4":
version "2.0.4"
resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz"
integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==
dependencies:
node-addon-api "^3.2.1"
node-gyp-build "^4.3.0"
"@phenomnomnominal/tsquery@4.1.1":
version "4.1.1"
resolved "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz"
integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==
dependencies:
esquery "^1.0.1"
"@yarnpkg/lockfile@^1.1.0":
version "1.1.0"
resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz"
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
"@yarnpkg/parsers@^3.0.0-rc.18":
version "3.0.0-rc.35"
resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.35.tgz"
integrity sha512-J6ySgEdQUqAmlttvZOoXOEsrDTAnHyR/MtEvuAG5a+gwKY/2Cc7xn4CWcpgfuwkp+0a4vXmt2BDwzacDoGDN1g==
dependencies:
js-yaml "^3.10.0"
tslib "^2.4.0"
"@zkochan/js-yaml@0.0.6":
version "0.0.6"
resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz"
integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==
dependencies:
argparse "^2.0.1"
ansi-colors@^4.1.1:
version "4.1.3"
resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz"
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
async@^3.2.3:
version "3.2.4"
resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz"
integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
axios@^1.0.0:
version "1.2.2"
resolved "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz"
integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
dependencies:
balanced-match "^1.0.0"
braces@^3.0.2, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
chalk@4.1.0, chalk@^4.0.2:
version "4.1.0"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chokidar@^3.5.1:
version "3.5.3"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
cli-cursor@3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-spinners@2.6.1:
version "2.6.1"
resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz"
integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz"
integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
define-lazy-prop@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz"
integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
dotenv@~10.0.0:
version "10.0.0"
resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz"
integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
duplexer@^0.1.1:
version "0.1.2"
resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
ejs@^3.1.7:
version "3.1.8"
resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz"
integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==
dependencies:
jake "^10.8.5"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
enquirer@~2.3.6:
version "2.3.6"
resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz"
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
dependencies:
ansi-colors "^4.1.1"
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
esquery@^1.0.1:
version "1.4.0"
resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
dependencies:
estraverse "^5.1.0"
estraverse@^5.1.0:
version "5.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
fast-glob@3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz"
integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
glob-parent "^5.1.2"
merge2 "^1.3.0"
micromatch "^4.0.4"
fastq@^1.6.0:
version "1.15.0"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz"
integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
dependencies:
reusify "^1.0.4"
figures@3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz"
integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
dependencies:
escape-string-regexp "^1.0.5"
filelist@^1.0.1:
version "1.0.4"
resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz"
integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
dependencies:
minimatch "^5.0.1"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
flat@^5.0.2:
version "5.0.2"
resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra@^10.1.0:
version "10.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz"
integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob@7.1.4, glob@^7.1.3:
version "7.1.4"
resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz"
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.10"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.0.4:
version "5.2.4"
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-docker@^2.0.0, is-docker@^2.1.1:
version "2.2.1"
resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
dependencies:
is-docker "^2.0.0"
jake@^10.8.5:
version "10.8.5"
resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz"
integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
dependencies:
async "^3.2.3"
chalk "^4.0.2"
filelist "^1.0.1"
minimatch "^3.0.4"
js-yaml@4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
js-yaml@^3.10.0:
version "3.14.1"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
json5@^2.2.2:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
jsonc-parser@3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz"
integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
universalify "^2.0.0"
optionalDependencies:
graceful-fs "^4.1.6"
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
dependencies:
yallist "^4.0.0"
merge2@^1.3.0:
version "1.4.1"
resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4:
version "4.0.5"
resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
dependencies:
braces "^3.0.2"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
minimatch@3.0.5, minimatch@^3.0.4:
version "3.0.5"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz"
integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
version "5.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz"
integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==
dependencies:
brace-expansion "^2.0.1"
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.7"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
node-addon-api@^3.2.1:
version "3.2.1"
resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz"
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
node-gyp-build@^4.3.0:
version "4.6.0"
resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz"
integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
dependencies:
path-key "^3.0.0"
nx@15.4.5:
version "15.4.5"
resolved "https://registry.npmjs.org/nx/-/nx-15.4.5.tgz"
integrity sha512-1spZL6sgOV8JJJuN8W5CLtJYwTOnlyaV32jPXfidavU0QMS8MP+rW3+NUQ9Uzc1UYhOu8llZWtnen93neVGQRw==
dependencies:
"@nrwl/cli" "15.4.5"
"@nrwl/tao" "15.4.5"
"@parcel/watcher" "2.0.4"
"@yarnpkg/lockfile" "^1.1.0"
"@yarnpkg/parsers" "^3.0.0-rc.18"
"@zkochan/js-yaml" "0.0.6"
axios "^1.0.0"
chalk "4.1.0"
chokidar "^3.5.1"
cli-cursor "3.1.0"
cli-spinners "2.6.1"
cliui "^7.0.2"
dotenv "~10.0.0"
enquirer "~2.3.6"
fast-glob "3.2.7"
figures "3.2.0"
flat "^5.0.2"
fs-extra "^10.1.0"
glob "7.1.4"
ignore "^5.0.4"
js-yaml "4.1.0"
jsonc-parser "3.2.0"
minimatch "3.0.5"
npm-run-path "^4.0.1"
open "^8.4.0"
semver "7.3.4"
string-width "^4.2.3"
strong-log-transformer "^2.1.0"
tar-stream "~2.2.0"
tmp "~0.2.1"
tsconfig-paths "^4.1.2"
tslib "^2.3.0"
v8-compile-cache "2.3.0"
yargs "^17.6.2"
yargs-parser "21.1.1"
once@^1.3.0, once@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
onetime@^5.1.0:
version "5.1.2"
resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
open@^8.4.0:
version "8.4.0"
resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz"
integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
dependencies:
define-lazy-prop "^2.0.0"
is-docker "^2.1.1"
is-wsl "^2.2.0"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.0.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^3.0.0:
version "3.0.2"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
dependencies:
queue-microtask "^1.2.2"
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
semver@7.3.4:
version "7.3.4"
resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz"
integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
dependencies:
lru-cache "^6.0.0"
signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
strong-log-transformer@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz"
integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==
dependencies:
duplexer "^0.1.1"
minimist "^1.2.0"
through "^2.3.4"
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
tar-stream@~2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
dependencies:
bl "^4.0.3"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
readable-stream "^3.1.1"
through@^2.3.4:
version "2.3.8"
resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
tmp@~0.2.1:
version "0.2.1"
resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz"
integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
dependencies:
rimraf "^3.0.0"
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
tsconfig-paths@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz"
integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==
dependencies:
json5 "^2.2.2"
minimist "^1.2.6"
strip-bom "^3.0.0"
tslib@^2.3.0, tslib@^2.4.0:
version "2.4.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
typescript@4.8.4:
version "4.8.4"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz"
integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
v8-compile-cache@2.3.0:
version "2.3.0"
resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrappy@1:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yargs-parser@21.1.1, yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
yargs@17.6.2, yargs@^17.6.2:
version "17.6.2"
resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz"
integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.3"
y18n "^5.0.5"
yargs-parser "^21.1.1"
`;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
{
"name": "test",
"version": "0.0.0",
"license": "MIT",
"devDependencies": {
"@nrwl/cli": "15.4.5",
"@nrwl/workspace": "15.4.5",
"nx": "15.4.5",
"prettier": "^2.6.2",
"typescript": "~4.8.2"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
{
"name": "test",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "test",
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"typescript": "4.8.4"
}
},
"node_modules/typescript": {
"version": "4.8.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
}
},
"dependencies": {
"typescript": {
"version": "4.8.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ=="
}
}
}

View File

@ -0,0 +1,8 @@
{
"name": "test",
"version": "0.0.0",
"license": "MIT",
"dependencies": {
"typescript": "4.8.4"
}
}

View File

@ -0,0 +1,18 @@
export default `lockfileVersion: 5.4
importers:
.:
specifiers:
typescript: 4.8.4
dependencies:
typescript: 4.8.4
packages:
/typescript/4.8.4:
resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: false
`;

View File

@ -0,0 +1,9 @@
export default `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
typescript@4.8.4:
version "4.8.4"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz"
integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
`;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
export default `hoistPattern:
- '*'
hoistedDependencies:
/js-tokens/4.0.0:
js-tokens: private
/loose-envify/1.4.0:
loose-envify: private
/object-assign/4.1.1:
object-assign: private
included:
dependencies: true
devDependencies: true
optionalDependencies: true
injectedDeps: {}
layoutVersion: 5
nodeLinker: isolated
packageManager: pnpm@7.16.0
pendingBuilds: []
prunedAt: Thu, 12 Jan 2023 19:29:37 GMT
publicHoistPattern:
- '*eslint*'
- '*prettier*'
registries:
default: https://registry.npmjs.org/
skipped: []
storeDir: /Users/jdoe/Library/pnpm/store/v3
virtualStoreDir: .pnpm
`;

View File

@ -0,0 +1,119 @@
{
"name": "test",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "test",
"workspaces": [
"packages/*"
],
"dependencies": {
"react": "^17.0.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/package-a": {
"resolved": "packages/package-a",
"link": true
},
"node_modules/react": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
"integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"packages/package-a": {
"version": "0.0.1",
"dependencies": {
"react": "18"
}
},
"packages/package-a/node_modules/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
}
}
},
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"package-a": {
"version": "file:packages/package-a",
"requires": {
"react": "18"
},
"dependencies": {
"react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"requires": {
"loose-envify": "^1.1.0"
}
}
}
},
"react": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
"integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
}
}
}

View File

@ -0,0 +1,50 @@
{
"name": "test",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"package-a": {
"version": "file:packages/package-a",
"requires": {
"react": "18"
},
"dependencies": {
"react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"requires": {
"loose-envify": "^1.1.0"
}
}
}
},
"react": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
"integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
}
}
}

View File

@ -0,0 +1,11 @@
{
"name": "test",
"private": true,
"workspaces": [
"packages/*"
],
"dependencies": {
"react": "^17.0.0"
},
"packageManager": "yarn@1.22.19"
}

View File

@ -0,0 +1,12 @@
{
"name": "package-a",
"version": "0.0.1",
"scripts": {
"serve": "some serve",
"build": "some build",
"test": "some test"
},
"dependencies": {
"react": "18"
}
}

View File

@ -0,0 +1,49 @@
export default `lockfileVersion: 5.4
importers:
.:
specifiers:
react: ^17.0.0
dependencies:
react: 17.0.2
packages/package-a:
specifiers:
react: '18'
dependencies:
react: 18.2.0
packages:
/js-tokens/4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: false
/loose-envify/1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: false
/object-assign/4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
dev: false
/react/17.0.2:
resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
object-assign: 4.1.1
dev: false
/react/18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
dev: false
`;

View File

@ -0,0 +1,4 @@
export default `packages:
# all packages in direct subdirs of packages/
- "packages/*"
`;

View File

@ -0,0 +1,67 @@
export default `# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 6
cacheKey: 8
"js-tokens@npm:^3.0.0 || ^4.0.0":
version: 4.0.0
resolution: "js-tokens@npm:4.0.0"
checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
languageName: node
linkType: hard
"loose-envify@npm:^1.1.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
dependencies:
js-tokens: ^3.0.0 || ^4.0.0
bin:
loose-envify: cli.js
checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
languageName: node
linkType: hard
"object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
languageName: node
linkType: hard
"package-a@workspace:packages/package-a":
version: 0.0.0-use.local
resolution: "package-a@workspace:packages/package-a"
dependencies:
react: 18
languageName: unknown
linkType: soft
"react@npm:18":
version: 18.2.0
resolution: "react@npm:18.2.0"
dependencies:
loose-envify: ^1.1.0
checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b
languageName: node
linkType: hard
"react@npm:^17.0.0":
version: 17.0.2
resolution: "react@npm:17.0.2"
dependencies:
loose-envify: ^1.1.0
object-assign: ^4.1.1
checksum: b254cc17ce3011788330f7bbf383ab653c6848902d7936a87b09d835d091e3f295f7e9dd1597c6daac5dc80f90e778c8230218ba8ad599f74adcc11e33b9d61b
languageName: node
linkType: hard
"test@workspace:.":
version: 0.0.0-use.local
resolution: "test@workspace:."
dependencies:
react: ^17.0.0
languageName: unknown
linkType: soft
`;

View File

@ -0,0 +1,36 @@
export default `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
loose-envify@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
react@18:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
react@^17.0.0:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
`;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,153 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`npm LockFile utility v1 should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9",
},
"dev": true,
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/@ampproject/remapping",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`npm LockFile utility v1 should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"dev": true,
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/typescript",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"rootVersion": true,
"version": "4.8.4",
},
}
`;
exports[`npm LockFile utility v2 should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9",
},
"dev": true,
"engines": Object {
"node": ">=6.0.0",
},
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/@ampproject/remapping",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`npm LockFile utility v2 should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"bin": Object {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver",
},
"dev": true,
"engines": Object {
"node": ">=4.2.0",
},
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/typescript",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"rootVersion": true,
"version": "4.8.4",
},
}
`;
exports[`npm LockFile utility v3 should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9",
},
"dev": true,
"engines": Object {
"node": ">=6.0.0",
},
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/@ampproject/remapping",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`npm LockFile utility v3 should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"bin": Object {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver",
},
"dev": true,
"engines": Object {
"node": ">=4.2.0",
},
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/typescript",
"peer": undefined,
},
],
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"rootVersion": true,
"version": "4.8.4",
},
}
`;

View File

@ -1,121 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`pnpm LockFile utility lock file with inline specifiers should parse lockfile (IS) 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "0.1.1",
"@jridgewell/trace-mapping": "0.3.17",
},
"engines": Object {
"node": ">=6.0.0",
},
"packageMeta": Array [
Object {
"dependencyDetails": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "0.1.1",
"@jridgewell/trace-mapping": "0.3.17",
},
},
"dev": true,
"isDependency": false,
"isDevDependency": false,
"key": "/@ampproject/remapping/2.2.0",
"specifier": undefined,
},
],
"resolution": Object {
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
},
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`pnpm LockFile utility lock file with inline specifiers should parse lockfile (IS) 2`] = `
Object {
"typescript@4.8.4": Object {
"engines": Object {
"node": ">=4.2.0",
},
"hasBin": true,
"packageMeta": Array [
Object {
"dependencyDetails": Object {},
"dev": true,
"isDependency": false,
"isDevDependency": true,
"key": "/typescript/4.8.4",
"specifier": "~4.8.2",
},
],
"resolution": Object {
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
},
"rootVersion": true,
"version": "4.8.4",
},
}
`;
exports[`pnpm LockFile utility standard lock file should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "0.1.1",
"@jridgewell/trace-mapping": "0.3.17",
},
"engines": Object {
"node": ">=6.0.0",
},
"packageMeta": Array [
Object {
"dependencyDetails": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "0.1.1",
"@jridgewell/trace-mapping": "0.3.17",
},
},
"dev": true,
"isDependency": false,
"isDevDependency": false,
"key": "/@ampproject/remapping/2.2.0",
"specifier": undefined,
},
],
"resolution": Object {
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
},
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`pnpm LockFile utility standard lock file should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"engines": Object {
"node": ">=4.2.0",
},
"hasBin": true,
"packageMeta": Array [
Object {
"dependencyDetails": Object {},
"dev": true,
"isDependency": false,
"isDevDependency": true,
"key": "/typescript/4.8.4",
"specifier": "~4.8.2",
},
],
"resolution": Object {
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
},
"rootVersion": true,
"version": "4.8.4",
},
}
`;

View File

@ -1,73 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`yarn LockFile utility berry should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"checksum": "d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292",
"dependencies": Object {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9",
},
"languageName": "node",
"linkType": "hard",
"packageMeta": Array [
"@ampproject/remapping@npm:^2.1.0",
],
"resolution": "@ampproject/remapping@npm:2.2.0",
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`yarn LockFile utility berry should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"bin": Object {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver",
},
"checksum": "3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0",
"languageName": "node",
"linkType": "hard",
"packageMeta": Array [
"typescript@npm:~4.8.2",
],
"resolution": "typescript@npm:4.8.4",
"rootVersion": true,
"version": "4.8.4",
},
}
`;
exports[`yarn LockFile utility classic should parse lockfile correctly 1`] = `
Object {
"@ampproject/remapping@2.2.0": Object {
"dependencies": Object {
"@jridgewell/gen-mapping": "^0.1.0",
"@jridgewell/trace-mapping": "^0.3.9",
},
"integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"packageMeta": Array [
"@ampproject/remapping@^2.1.0",
],
"resolved": "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d",
"rootVersion": true,
"version": "2.2.0",
},
}
`;
exports[`yarn LockFile utility classic should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.4": Object {
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"packageMeta": Array [
"typescript@~4.8.2",
],
"resolved": "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6",
"rootVersion": true,
"version": "4.8.4",
},
}
`;

View File

@ -1,392 +0,0 @@
import { mapLockFileDataToPartialGraph } from './lock-file';
import {
parseNpmLockFile,
pruneNpmLockFile,
stringifyNpmLockFile,
} from './npm';
import {
parsePnpmLockFile,
prunePnpmLockFile,
stringifyPnpmLockFile,
} from './pnpm';
import {
parseYarnLockFile,
pruneYarnLockFile,
stringifyYarnLockFile,
} from './yarn';
import {
npmLockFileV1WithAliases,
npmLockFileWithAliases,
pnpmLockFileWithAliases,
yarnLockFileWithAliases,
} from './__fixtures__/auxiliary.lock';
import {
lockFileV3YargsAndDevkitOnly as npmLockFileV3YargsAndDevkit,
lockFileV2YargsAndDevkitOnly as npmLockFileV2YargsAndDevkit,
lockFileV1YargsAndDevkitOnly as npmLockFileV1YargsAndDevkit,
lockFileV3 as npmLockFileV3,
lockFileV2 as npmLockFileV2,
lockFileV1 as npmLockFileV1,
} from './__fixtures__/npm.lock';
import {
lockFileYargsAndDevkit as pnpmLockFileYargsAndDevkit,
lockFile as pnpmLockFile,
} from './__fixtures__/pnpm.lock';
import {
lockFileDevkitAndYargs as yarnLockFileDevkitAndYargs,
lockFile as yarnLockFile,
} from './__fixtures__/yarn.lock';
import { vol } from 'memfs';
import { ProjectGraph } from '../config/project-graph';
import { createPackageJson } from '../utils/create-package-json';
jest.mock('fs', () => require('memfs').fs);
jest.mock('@nrwl/devkit', () => ({
...jest.requireActual<any>('@nrwl/devkit'),
workspaceRoot: '/root',
}));
jest.mock('nx/src/utils/workspace-root', () => ({
workspaceRoot: '/root',
}));
describe('lock-file', () => {
describe('mapLockFileDataToExternalNodes', () => {
describe('yarn', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});
it('should map lock file data to external nodes', () => {
const lockFileData = parseYarnLockFile(yarnLockFileDevkitAndYargs);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'yarn'
);
expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});
it('should map successfully complex lock file', () => {
const lockFileData = parseYarnLockFile(yarnLockFile);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'yarn'
);
expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
});
describe('npm', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.2"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "4.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/yargs-parser/package.json': '{"version": "21.1.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});
it('should map lock file v3 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV3YargsAndDevkit);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});
it('should map lock file v2 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV2YargsAndDevkit);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});
it('should map lock file v1 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV1YargsAndDevkit);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});
it('should map successfully complex lock file v3', () => {
const lockFileData = parseNpmLockFile(npmLockFileV3);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
it('should map successfully complex lock file v2', () => {
const lockFileData = parseNpmLockFile(npmLockFileV2);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
it('should map successfully complex lock file v1', () => {
const lockFileData = parseNpmLockFile(npmLockFileV1);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');
expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
});
describe('pnpm', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});
it('should map lock file data to external nodes', () => {
const lockFileData = parsePnpmLockFile(pnpmLockFileYargsAndDevkit);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'pnpm'
);
expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});
it('should map successfully complex lock file', () => {
const lockFileData = parsePnpmLockFile(pnpmLockFile);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'pnpm'
);
expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
expect(
partialGraph.externalNodes['npm:@phenomnomnominal/tsquery']
).toMatchSnapshot();
expect(
partialGraph.dependencies['npm:@phenomnomnominal/tsquery']
).toMatchSnapshot();
});
});
});
describe('package aliases and direct urls', () => {
function expandGraph(partialGraph: ProjectGraph) {
partialGraph.nodes['lib1'] = {
type: 'lib',
name: 'lib1',
data: {
root: 'libs/lib1',
} as any,
};
partialGraph.dependencies['lib1'] = [
{
type: 'static',
source: 'lib1',
target: 'npm:postgres',
},
];
return partialGraph;
}
const fileSys = {
'package.json': JSON.stringify({
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '15.0.13',
yargs: '17.6.2',
postgres: 'charsleysa/postgres#fix-errors-compiled',
},
devDependencies: {
react: '18.2.0',
},
peerDependencies: {
typescript: '4.8.4',
},
}),
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});
it('should properly parse, map and stringify npm V2/3', () => {
const lockFileData = parseNpmLockFile(npmLockFileWithAliases);
const lockFile = stringifyNpmLockFile(lockFileData);
expect(JSON.parse(lockFile)).toEqual(JSON.parse(npmLockFileWithAliases));
const partialGraph = expandGraph(
mapLockFileDataToPartialGraph(lockFileData, 'npm')
);
const newPackage = createPackageJson('lib1', partialGraph, {});
const prunedLockFile = pruneYarnLockFile(lockFileData, newPackage);
expect(newPackage).toMatchInlineSnapshot(`
Object {
"dependencies": Object {
"postgres": "git+ssh://git@github.com/charsleysa/postgres.git#3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "lib1",
"version": "0.0.1",
}
`);
expect(partialGraph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"hash": "29ded3acf364abfbda0186d5ae76ec0aebe1b31662dadb4263126e272ababdf9",
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should properly parse, map and stringify npm V1', () => {
const lockFileData = parseNpmLockFile(npmLockFileV1WithAliases);
const lockFile = stringifyNpmLockFile(lockFileData);
expect(JSON.parse(lockFile)).toEqual(
JSON.parse(npmLockFileV1WithAliases)
);
const partialGraph = expandGraph(
mapLockFileDataToPartialGraph(lockFileData, 'npm')
);
const newPackage = createPackageJson('lib1', partialGraph, {});
const prunedLockFile = pruneNpmLockFile(lockFileData, newPackage);
expect(newPackage).toMatchInlineSnapshot(`
Object {
"dependencies": Object {
"postgres": "git+ssh://git@github.com/charsleysa/postgres.git#3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "lib1",
"version": "0.0.1",
}
`);
expect(partialGraph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"hash": "29ded3acf364abfbda0186d5ae76ec0aebe1b31662dadb4263126e272ababdf9",
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should properly parse, map and stringify yarn', () => {
const lockFileData = parseYarnLockFile(yarnLockFileWithAliases);
const lockFile = stringifyYarnLockFile(lockFileData);
expect(lockFile).toEqual(yarnLockFileWithAliases);
const partialGraph = expandGraph(
mapLockFileDataToPartialGraph(lockFileData, 'yarn')
);
const newPackage = createPackageJson('lib1', partialGraph, {});
const prunedLockFile = pruneYarnLockFile(lockFileData, newPackage);
expect(newPackage).toMatchInlineSnapshot(`
Object {
"dependencies": Object {
"postgres": "charsleysa/postgres#fix-errors-compiled",
},
"name": "lib1",
"version": "0.0.1",
}
`);
expect(partialGraph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"hash": "4adf0349b24951646e5657c35e819065d283446fae842d72ce73ba2d466492bf",
"packageName": "eslint-plugin-disable-autofix",
"version": "3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should properly parse, map and stringify pnpm', () => {
const lockFileData = parsePnpmLockFile(pnpmLockFileWithAliases);
const lockFile = stringifyPnpmLockFile(lockFileData);
expect(lockFile).toEqual(pnpmLockFileWithAliases);
const partialGraph = expandGraph(
mapLockFileDataToPartialGraph(lockFileData, 'pnpm')
);
const newPackage = createPackageJson('lib1', partialGraph, {});
const prunedLockFile = prunePnpmLockFile(lockFileData, newPackage);
expect(newPackage).toMatchInlineSnapshot(`
Object {
"dependencies": Object {
"postgres": "github.com/charsleysa/postgres/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "lib1",
"version": "0.0.1",
}
`);
expect(partialGraph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"hash": "308b8cb8052d8d26cf1a2be5dc197f7ba6291185a309d00f2a0c1497df9089db",
"packageName": "eslint-plugin-disable-autofix",
"version": "/@mattlewis92/eslint-plugin-disable-autofix/3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
});
});

View File

@ -1,34 +1,22 @@
import { detectPackageManager, PackageManager } from '../utils/package-manager'; /**
import { * This is the main API for accessing the lock file functionality.
parseYarnLockFile, * It encapsulates the package manager specific logic and implementation details.
pruneYarnLockFile, */
stringifyYarnLockFile,
transitiveDependencyYarnLookup, import { readFileSync, existsSync } from 'fs';
} from './yarn';
import {
parseNpmLockFile,
pruneNpmLockFile,
stringifyNpmLockFile,
transitiveDependencyNpmLookup,
} from './npm';
import {
parsePnpmLockFile,
prunePnpmLockFile,
stringifyPnpmLockFile,
transitiveDependencyPnpmLookup,
} from './pnpm';
import { LockFileData } from './utils/lock-file-type';
import { workspaceRoot } from '../utils/workspace-root';
import { join } from 'path'; import { join } from 'path';
import { mapExternalNodes } from './utils/mapping';
import { hashExternalNodes, hashString } from './utils/hashing'; import { detectPackageManager, PackageManager } from '../utils/package-manager';
import { import { workspaceRoot } from '../utils/workspace-root';
ProjectGraph, import { ProjectGraph } from '../config/project-graph';
ProjectGraphExternalNode,
} from '../config/project-graph';
import { existsSync, readFileSync, writeFileSync } from 'fs';
import { normalizePackageJson } from './utils/pruning';
import { PackageJson } from '../utils/package-json'; import { PackageJson } from '../utils/package-json';
import { defaultHashing } from '../hasher/hashing-impl';
import { parseNpmLockfile, stringifyNpmLockfile } from './npm-parser';
import { parsePnpmLockfile, stringifyPnpmLockfile } from './pnpm-parser';
import { parseYarnLockfile, stringifyYarnLockfile } from './yarn-parser';
import { pruneProjectGraph } from './project-graph-pruning';
import { normalizePackageJson } from './utils/package-json';
const YARN_LOCK_FILE = 'yarn.lock'; const YARN_LOCK_FILE = 'yarn.lock';
const NPM_LOCK_FILE = 'package-lock.json'; const NPM_LOCK_FILE = 'package-lock.json';
@ -53,7 +41,9 @@ export function lockFileExists(
if (packageManager === 'npm') { if (packageManager === 'npm') {
return existsSync(NPM_LOCK_PATH); return existsSync(NPM_LOCK_PATH);
} }
throw Error(`Unknown package manager ${packageManager} or lock file missing`); throw new Error(
`Unknown package manager ${packageManager} or lock file missing`
);
} }
/** /**
@ -62,107 +52,51 @@ export function lockFileExists(
export function lockFileHash( export function lockFileHash(
packageManager: PackageManager = detectPackageManager(workspaceRoot) packageManager: PackageManager = detectPackageManager(workspaceRoot)
): string { ): string {
let file: string; let content: string;
if (packageManager === 'yarn') { if (packageManager === 'yarn') {
file = readFileSync(YARN_LOCK_PATH, 'utf8'); content = readFileSync(YARN_LOCK_PATH, 'utf8');
} }
if (packageManager === 'pnpm') { if (packageManager === 'pnpm') {
file = readFileSync(PNPM_LOCK_PATH, 'utf8'); content = readFileSync(PNPM_LOCK_PATH, 'utf8');
} }
if (packageManager === 'npm') { if (packageManager === 'npm') {
file = readFileSync(NPM_LOCK_PATH, 'utf8'); content = readFileSync(NPM_LOCK_PATH, 'utf8');
} }
if (file) { if (content) {
return hashString(file); return defaultHashing.hashArray([content]);
} else { } else {
throw Error( throw new Error(
`Unknown package manager ${packageManager} or lock file missing` `Unknown package manager ${packageManager} or lock file missing`
); );
} }
} }
/** /**
* Parses lock file and maps dependencies and metadata to {@link LockFileData} * Parses lock file and maps dependencies and metadata to {@link LockFileGraph}
*/ */
export function parseLockFile( export function parseLockFile(
packageManager: PackageManager = detectPackageManager(workspaceRoot) packageManager: PackageManager = detectPackageManager(workspaceRoot)
): LockFileData { ): ProjectGraph {
if (packageManager === 'yarn') { if (packageManager === 'yarn') {
const file = readFileSync(YARN_LOCK_PATH, 'utf8'); const content = readFileSync(YARN_LOCK_PATH, 'utf8');
return parseYarnLockFile(file); return parseYarnLockfile(content);
} }
if (packageManager === 'pnpm') { if (packageManager === 'pnpm') {
const file = readFileSync(PNPM_LOCK_PATH, 'utf8'); const content = readFileSync(PNPM_LOCK_PATH, 'utf8');
return parsePnpmLockFile(file); return parsePnpmLockfile(content);
} }
if (packageManager === 'npm') { if (packageManager === 'npm') {
const file = readFileSync(NPM_LOCK_PATH, 'utf8'); const content = readFileSync(NPM_LOCK_PATH, 'utf8');
return parseNpmLockFile(file); return parseNpmLockfile(content);
} }
throw Error(`Unknown package manager: ${packageManager}`); throw new Error(`Unknown package manager: ${packageManager}`);
} }
/** /**
* Maps lock file data to {@link ProjectGraphExternalNode} hash map * Returns lock file name based on the detected package manager in the root
* @param lockFileData * @param packageManager
* @returns * @returns
*/ */
export function mapLockFileDataToPartialGraph(
lockFileData: LockFileData,
packageManager: PackageManager = detectPackageManager(workspaceRoot)
): ProjectGraph {
let externalNodes;
if (packageManager === 'yarn') {
externalNodes = mapExternalNodes(
lockFileData,
transitiveDependencyYarnLookup
);
}
if (packageManager === 'pnpm') {
externalNodes = mapExternalNodes(
lockFileData,
transitiveDependencyPnpmLookup
);
}
if (packageManager === 'npm') {
externalNodes = mapExternalNodes(
lockFileData,
transitiveDependencyNpmLookup
);
}
if (externalNodes) {
hashExternalNodes(externalNodes);
return externalNodes;
}
throw Error(`Unknown package manager: ${packageManager}`);
}
/**
* Stringifies {@link LockFileData} content and writes it to lock file
*/
export function writeLockFile(
lockFile: LockFileData,
packageManager: PackageManager = detectPackageManager(workspaceRoot)
): void {
if (packageManager === 'yarn') {
const content = stringifyYarnLockFile(lockFile);
writeFileSync(YARN_LOCK_PATH, content);
return;
}
if (packageManager === 'pnpm') {
const content = stringifyPnpmLockFile(lockFile);
writeFileSync(PNPM_LOCK_PATH, content);
return;
}
if (packageManager === 'npm') {
const content = stringifyNpmLockFile(lockFile);
writeFileSync(NPM_LOCK_PATH, content);
return;
}
throw Error(`Unknown package manager: ${packageManager}`);
}
export function getLockFileName( export function getLockFileName(
packageManager: PackageManager = detectPackageManager(workspaceRoot) packageManager: PackageManager = detectPackageManager(workspaceRoot)
): string { ): string {
@ -175,7 +109,7 @@ export function getLockFileName(
if (packageManager === 'npm') { if (packageManager === 'npm') {
return NPM_LOCK_FILE; return NPM_LOCK_FILE;
} }
throw Error(`Unknown package manager: ${packageManager}`); throw new Error(`Unknown package manager: ${packageManager}`);
} }
/** /**
@ -190,20 +124,22 @@ export function createLockFile(
packageJson: PackageJson, packageJson: PackageJson,
packageManager: PackageManager = detectPackageManager(workspaceRoot) packageManager: PackageManager = detectPackageManager(workspaceRoot)
): string { ): string {
const lockFileData = parseLockFile(packageManager);
const normalizedPackageJson = normalizePackageJson(packageJson); const normalizedPackageJson = normalizePackageJson(packageJson);
const content = readFileSync(getLockFileName(packageManager), 'utf8');
if (packageManager === 'yarn') { if (packageManager === 'yarn') {
const prunedData = pruneYarnLockFile(lockFileData, normalizedPackageJson); const graph = parseYarnLockfile(content);
return stringifyYarnLockFile(prunedData); const prunedGraph = pruneProjectGraph(graph, packageJson);
return stringifyYarnLockfile(prunedGraph, content, normalizedPackageJson);
} }
if (packageManager === 'pnpm') { if (packageManager === 'pnpm') {
const prunedData = prunePnpmLockFile(lockFileData, normalizedPackageJson); const graph = parsePnpmLockfile(content);
return stringifyPnpmLockFile(prunedData); const prunedGraph = pruneProjectGraph(graph, packageJson);
return stringifyPnpmLockfile(prunedGraph, content, normalizedPackageJson);
} }
if (packageManager === 'npm') { if (packageManager === 'npm') {
const prunedData = pruneNpmLockFile(lockFileData, normalizedPackageJson); const graph = parseNpmLockfile(content);
return stringifyNpmLockFile(prunedData); const prunedGraph = pruneProjectGraph(graph, packageJson);
return stringifyNpmLockfile(prunedGraph, content, normalizedPackageJson);
} }
throw Error(`Unknown package manager: ${packageManager}`);
} }

View File

@ -0,0 +1,440 @@
import { joinPathFragments } from '../utils/path';
import { parseNpmLockfile, stringifyNpmLockfile } from './npm-parser';
import { pruneProjectGraph } from './project-graph-pruning';
import { vol } from 'memfs';
import { ProjectGraph } from '../config/project-graph';
jest.mock('fs', () => require('memfs').fs);
jest.mock('@nrwl/devkit', () => ({
...jest.requireActual<any>('@nrwl/devkit'),
workspaceRoot: '/root',
}));
jest.mock('nx/src/utils/workspace-root', () => ({
workspaceRoot: '/root',
}));
describe('NPM lock file utility', () => {
afterEach(() => {
vol.reset();
});
describe('next.js generated', () => {
const rootLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/package-lock.json'
));
let graph: ProjectGraph;
beforeEach(() => {
graph = parseNpmLockfile(JSON.stringify(rootLockFile));
});
it('should parse root lock file', async () => {
expect(Object.keys(graph.externalNodes).length).toEqual(1285); // 1143
});
it('should prune lock file', async () => {
const appPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/package.json'
));
const appLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/package-lock.json'
));
// this is original generated lock file
const appGraph = parseNpmLockfile(JSON.stringify(appLockFile));
expect(Object.keys(appGraph.externalNodes).length).toEqual(984);
// this is our pruned lock file structure
const prunedGraph = pruneProjectGraph(graph, appPackageJson);
expect(Object.keys(prunedGraph.externalNodes).length).toEqual(
Object.keys(appGraph.externalNodes).length
);
const keys = new Set(Object.keys(prunedGraph.externalNodes));
const originalKeys = new Set(Object.keys(appGraph.externalNodes));
expect(keys).toEqual(originalKeys);
});
});
describe('auxiliary packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@nrwl/devkit/package.json':
'{"peerDependencies":{"nx":">= 14 <= 16"}}',
'node_modules/@phenomnomnominal/tsquery/package.json':
'{"peerDependencies":{"typescript":"^3 || ^4"}}',
'node_modules/@yarnpkg/parsers/node_modules/argparse/package.json':
'{}',
'node_modules/@yarnpkg/parsers/node_modules/js-yaml/package.json': '{}',
'node_modules/acorn-jsx/package.json':
'{"peerDependencies":{"acorn":"^6.0.0 || ^7.0.0 || ^8.0.0"}}',
'node_modules/debug/package.json':
'{"peerDependenciesMeta":{"supports-color":{"optional":true}}}',
'node_modules/eslint-utils/package.json':
'{"peerDependencies":{"eslint":">=5"}}',
'node_modules/follow-redirects/package.json':
'{"peerDependenciesMeta":{"debug":{"optional":true}}}',
'node_modules/json-stable-stringify-without-jsonify/package.json': '{}',
'node_modules/nx/package.json':
'{"peerDependencies":{"@swc-node/register":"^1.4.2","@swc/core":"^1.2.173"},"peerDependenciesMeta":{"@swc-node/register":{"optional":true},"@swc/core":{"optional":true}}}',
};
vol.fromJSON(fileSys, '/root');
});
it('should parse v1', async () => {
const rootLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/package-lock.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootLockFile));
expect(Object.keys(graph.externalNodes).length).toEqual(212); // 202
expect(graph.externalNodes['npm:minimatch']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "3.1.2",
},
"name": "npm:minimatch",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:minimatch@5.1.1']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "5.1.1",
},
"name": "npm:minimatch@5.1.1",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:postgres']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "postgres",
"version": "git+ssh://git@github.com/charsleysa/postgres.git#3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "npm:postgres",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should parse v3', async () => {
const rootV2LockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/package-lock-v2.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootV2LockFile));
expect(Object.keys(graph.externalNodes).length).toEqual(212); // 202
expect(graph.externalNodes['npm:minimatch']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "3.1.2",
},
"name": "npm:minimatch",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:minimatch@5.1.1']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "5.1.1",
},
"name": "npm:minimatch@5.1.1",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:postgres']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "postgres",
"version": "git+ssh://git@github.com/charsleysa/postgres.git#3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "npm:postgres",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
function cleanupTypes(
collection: Record<string, any>,
recursive?: boolean
) {
Object.values(collection).forEach((p: any) => {
delete p.peer;
delete p.dev;
if (p.dependencies && recursive) {
cleanupTypes(p.dependencies, recursive);
}
});
}
it('should prune v2', async () => {
const rootV2LockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/package-lock-v2.json'
));
const prunedV2LockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/package-lock-v2.pruned.json'
));
const normalizedPackageJson = {
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '15.0.13',
'eslint-plugin-disable-autofix':
'npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0',
postgres:
'git+ssh://git@github.com/charsleysa/postgres.git#3b1a01b2da3e2fafb1a79006f838eff11a8de3cb',
yargs: '17.6.2',
},
devDependencies: {
react: '18.2.0',
},
peerDependencies: {
typescript: '4.8.4',
},
};
// (meeroslav)this test is ignoring types since they are not vital (dev, peer, etc..)
cleanupTypes(prunedV2LockFile.packages);
cleanupTypes(prunedV2LockFile.dependencies, true);
const graph = parseNpmLockfile(JSON.stringify(rootV2LockFile));
const prunedGraph = pruneProjectGraph(graph, normalizedPackageJson);
const result = stringifyNpmLockfile(
prunedGraph,
JSON.stringify(rootV2LockFile),
normalizedPackageJson
);
expect(result).toEqual(JSON.stringify(prunedV2LockFile, null, 2));
});
});
describe('duplicate packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@babel/helper-compilation-targets/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0"}}',
'node_modules/@babel/plugin-syntax-async-generators/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-bigint/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-class-properties/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-import-meta/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-json-strings/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-logical-assignment-operators/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-nullish-coalescing-operator/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-numeric-separator/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-object-rest-spread/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-optional-catch-binding/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-optional-chaining/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-top-level-await/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@babel/plugin-syntax-typescript/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0-0"}}',
'node_modules/@jest/reporters/package.json':
'{"peerDependencies":{"node-notifier":"^8.0.1 || ^9.0.0 || ^10.0.0"},"peerDependenciesMeta":{"node-notifier":{"optional":true}}}',
'node_modules/@nrwl/devkit/package.json':
'{"peerDependencies":{"nx":">= 13.10 <= 15"}}',
'node_modules/@nrwl/linter/package.json':
'{"peerDependencies":{"eslint":"^8.0.0"},"peerDependenciesMeta":{"eslint":{"optional":true}}}',
'node_modules/@nrwl/linter/node_modules/nx/package.json':
'{"peerDependencies":{"@swc-node/register":"^1.4.2","@swc/core":"^1.2.173"},"peerDependenciesMeta":{"@swc-node/register":{"optional":true},"@swc/core":{"optional":true}}}',
'node_modules/@nrwl/workspace/package.json':
'{"peerDependencies":{"prettier":"^2.6.2"},"peerDependenciesMeta":{"prettier":{"optional":true}}}',
'node_modules/@nrwl/workspace/node_modules/nx/package.json':
'{"peerDependencies":{"@swc-node/register":"^1.4.2","@swc/core":"^1.2.173"},"peerDependenciesMeta":{"@swc-node/register":{"optional":true},"@swc/core":{"optional":true}}}',
'node_modules/@phenomnomnominal/tsquery/package.json':
'{"peerDependencies":{"typescript":"^3 || ^4"}}',
'node_modules/babel-jest/package.json':
'{"peerDependencies":{"@babel/core":"^7.8.0"}}',
'node_modules/babel-preset-current-node-syntax/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0"}}',
'node_modules/babel-preset-jest/package.json':
'{"peerDependencies":{"@babel/core":"^7.0.0"}}',
'node_modules/debug/package.json':
'{"peerDependenciesMeta":{"supports-color":{"optional":true}}}',
'node_modules/follow-redirects/package.json':
'{"peerDependenciesMeta":{"debug":{"optional":true}}}',
'node_modules/jest-config/package.json':
'{"peerDependencies":{"@types/node":"*","ts-node":">=9.0.0"},"peerDependenciesMeta":{"@types/node":{"optional":true},"ts-node":{"optional":true}}}',
'node_modules/jest-pnp-resolver/package.json':
'{"peerDependencies":{"jest-resolve":"*"},"peerDependenciesMeta":{"jest-resolve":{"optional":true}}}',
'node_modules/nx/package.json':
'{"peerDependencies":{"@swc-node/register":"^1.4.2","@swc/core":"^1.2.173"},"peerDependenciesMeta":{"@swc-node/register":{"optional":true},"@swc/core":{"optional":true}}}',
'node_modules/update-browserslist-db/package.json':
'{"peerDependencies":{"browserslist":">= 4.21.0"}}',
};
vol.fromJSON(fileSys, '/root');
});
it('should parse v1', async () => {
const rootLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/duplicate-package/package-lock-v1.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootLockFile));
expect(Object.keys(graph.externalNodes).length).toEqual(369); // 338
});
it('should parse v3', async () => {
const rootLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/duplicate-package/package-lock.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootLockFile));
expect(Object.keys(graph.externalNodes).length).toEqual(369); //338
});
});
describe('optional packages', () => {
it('should match parsed and pruned graph', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/optional/package-lock.json'
));
const packageJson = require(joinPathFragments(
__dirname,
'__fixtures__/optional/package.json'
));
const graph = parseNpmLockfile(JSON.stringify(lockFile));
expect(Object.keys(graph.externalNodes).length).toEqual(8);
const prunedGraph = pruneProjectGraph(graph, packageJson);
expect(Object.keys(prunedGraph.externalNodes).length).toEqual(8);
});
});
describe('pruning', () => {
let rootLockFile;
beforeAll(() => {
rootLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/package-lock.json'
));
});
it('should prune single package', () => {
const typescriptPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/package.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootLockFile));
const prunedGraph = pruneProjectGraph(graph, typescriptPackageJson);
const result = stringifyNpmLockfile(
prunedGraph,
JSON.stringify(rootLockFile),
typescriptPackageJson
);
expect(result).toEqual(
JSON.stringify(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/package-lock.json'
)),
null,
2
)
);
});
it('should prune multi packages', () => {
const multiPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/package.json'
));
const graph = parseNpmLockfile(JSON.stringify(rootLockFile));
const prunedGraph = pruneProjectGraph(graph, multiPackageJson);
const result = stringifyNpmLockfile(
prunedGraph,
JSON.stringify(rootLockFile),
multiPackageJson
);
expect(result).toEqual(
JSON.stringify(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/package-lock.json'
)),
null,
2
)
);
});
});
describe('workspaces', () => {
let lockFile;
it('should parse v2 lock file', async () => {
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/package-lock.json'
));
const result = parseNpmLockfile(JSON.stringify(lockFile));
expect(Object.keys(result.externalNodes).length).toEqual(5);
});
it('should parse v1 lock file', async () => {
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/package-lock.v1.json'
));
const result = parseNpmLockfile(JSON.stringify(lockFile));
expect(Object.keys(result.externalNodes).length).toEqual(5);
});
});
});

View File

@ -0,0 +1,621 @@
import { existsSync, readFileSync } from 'fs';
import { satisfies } from 'semver';
import { workspaceRoot } from '../utils/workspace-root';
import { ProjectGraphBuilder } from '../project-graph/project-graph-builder';
import { reverse } from '../project-graph/operators';
import {
ProjectGraph,
ProjectGraphExternalNode,
} from '../config/project-graph';
import { NormalizedPackageJson } from './utils/package-json';
/**
* NPM
* - v1 has only dependencies
* - v2 has packages and dependencies for backwards compatibility
* - v3 has only packages
*/
type NpmDependency = {
name?: string;
version: string;
resolved?: string;
integrity?: string;
dev?: boolean;
peer?: boolean;
devOptional?: boolean;
optional?: boolean;
};
type NpmDependencyV3 = NpmDependency & {
dependencies?: Record<string, string>;
optionalDependencies?: Record<string, string>;
devDependencies?: Record<string, string>;
peerDependencies?: Record<string, string>;
peerDependenciesMeta?: Record<string, { optional: boolean }>;
link?: boolean;
};
type NpmDependencyV1 = NpmDependency & {
requires?: Record<string, string>;
dependencies?: Record<string, NpmDependencyV1>;
};
type NpmLockFile = {
name?: string;
version?: string;
lockfileVersion: number;
requires?: boolean;
packages?: Record<string, NpmDependencyV3>;
dependencies?: Record<string, NpmDependencyV1>;
};
export function parseNpmLockfile(lockFileContent: string): ProjectGraph {
const data = JSON.parse(lockFileContent) as NpmLockFile;
const builder = new ProjectGraphBuilder();
// we use key => node map to avoid duplicate work when parsing keys
const keyMap = new Map<string, ProjectGraphExternalNode>();
addNodes(data, builder, keyMap);
addDependencies(data, builder, keyMap);
return builder.getUpdatedProjectGraph();
}
function addNodes(
data: NpmLockFile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
const nodes: Map<string, Map<string, ProjectGraphExternalNode>> = new Map();
if (data.lockfileVersion > 1) {
Object.entries(data.packages).forEach(([path, snapshot]) => {
// skip workspaces packages
if (path === '' || !path.includes('node_modules') || snapshot.link) {
return;
}
const packageName = path.split('node_modules/').pop();
const version = findV3Version(snapshot, packageName);
const node = createNode(
packageName,
version,
path,
nodes,
keyMap,
!path.includes('/node_modules/')
);
if (node) {
builder.addExternalNode(node);
}
});
} else {
Object.entries(data.dependencies).forEach(([packageName, snapshot]) => {
// we only care about dependencies of workspace packages
if (snapshot.version?.startsWith('file:')) {
if (snapshot.dependencies) {
Object.entries(snapshot.dependencies).forEach(
([depName, depSnapshot]) => {
addV1Node(
depName,
depSnapshot,
`${snapshot.version.slice(5)}/node_modules/${depName}`,
nodes,
keyMap,
builder
);
}
);
}
} else {
addV1Node(
packageName,
snapshot,
`node_modules/${packageName}`,
nodes,
keyMap,
builder
);
}
});
}
}
function addV1Node(
packageName: string,
snapshot: NpmDependencyV1,
path: string,
nodes: Map<string, Map<string, ProjectGraphExternalNode>>,
keyMap: Map<string, ProjectGraphExternalNode>,
builder: ProjectGraphBuilder
) {
const node = createNode(
packageName,
snapshot.version,
path,
nodes,
keyMap,
!path.includes('/node_modules/')
);
if (node) {
builder.addExternalNode(node);
}
// traverse nested dependencies
if (snapshot.dependencies) {
Object.entries(snapshot.dependencies).forEach(([depName, depSnapshot]) => {
addV1Node(
depName,
depSnapshot,
`${path}/node_modules/${depName}`,
nodes,
keyMap,
builder
);
});
}
}
function createNode(
packageName: string,
version: string,
key: string,
nodes: Map<string, Map<string, ProjectGraphExternalNode>>,
keyMap: Map<string, ProjectGraphExternalNode>,
isHoisted?: boolean
): ProjectGraphExternalNode {
const existingNode = nodes.get(packageName)?.get(version);
if (existingNode) {
keyMap.set(key, existingNode);
return;
}
const node: ProjectGraphExternalNode = {
type: 'npm',
name: isHoisted ? `npm:${packageName}` : `npm:${packageName}@${version}`,
data: {
version,
packageName,
},
};
keyMap.set(key, node);
if (!nodes.has(packageName)) {
nodes.set(packageName, new Map([[version, node]]));
} else {
nodes.get(packageName).set(version, node);
}
return node;
}
function findV3Version(snapshot: NpmDependencyV3, packageName: string): string {
let version = snapshot.version;
const resolved = snapshot.resolved;
// for tarball packages version might not exist or be useless
if (!version || (resolved && !resolved.includes(version))) {
version = resolved;
}
// for alias packages name is set
if (snapshot.name && snapshot.name !== packageName) {
if (version) {
version = `npm:${snapshot.name}@${version}`;
} else {
version = `npm:${snapshot.name}`;
}
}
return version;
}
function addDependencies(
data: NpmLockFile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
if (data.lockfileVersion > 1) {
Object.entries(data.packages).forEach(([path, snapshot]) => {
// we are skipping workspaces packages
if (!keyMap.has(path)) {
return;
}
const sourceName = keyMap.get(path).name;
[
snapshot.peerDependencies,
snapshot.dependencies,
snapshot.optionalDependencies,
].forEach((section) => {
if (section) {
Object.entries(section).forEach(([name, versionRange]) => {
const target = findTarget(path, keyMap, name, versionRange);
if (target) {
builder.addExternalNodeDependency(sourceName, target.name);
}
});
}
});
});
} else {
Object.entries(data.dependencies).forEach(([packageName, snapshot]) => {
addV1NodeDependencies(
`node_modules/${packageName}`,
snapshot,
builder,
keyMap
);
});
}
}
function findTarget(
sourcePath: string,
keyMap: Map<string, ProjectGraphExternalNode>,
targetName: string,
versionRange: string
): ProjectGraphExternalNode {
if (sourcePath && !sourcePath.endsWith('/')) {
sourcePath = `${sourcePath}/`;
}
const searchPath = `${sourcePath}node_modules/${targetName}`;
if (keyMap.has(searchPath)) {
const child = keyMap.get(searchPath);
if (
child.data.version === versionRange ||
satisfies(child.data.version, versionRange)
) {
return child;
}
}
// the hoisted package did not match, this dependency is missing
if (!sourcePath) {
return;
}
return findTarget(
sourcePath.split('node_modules/').slice(0, -1).join('node_modules/'),
keyMap,
targetName,
versionRange
);
}
function addV1NodeDependencies(
path: string,
snapshot: NpmDependencyV1,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
if (keyMap.has(path) && snapshot.requires) {
const source = keyMap.get(path).name;
Object.entries(snapshot.requires).forEach(([name, versionRange]) => {
const target = findTarget(path, keyMap, name, versionRange);
if (target) {
builder.addExternalNodeDependency(source, target.name);
}
});
}
if (snapshot.dependencies) {
Object.entries(snapshot.dependencies).forEach(([depName, depSnapshot]) => {
addV1NodeDependencies(
`${path}/node_modules/${depName}`,
depSnapshot,
builder,
keyMap
);
});
}
const { peerDependencies } = getPeerDependencies(path);
if (peerDependencies) {
const node = keyMap.get(path);
Object.entries(peerDependencies).forEach(([depName, depSpec]) => {
if (
!builder.graph.dependencies[node.name]?.find(
(d) => d.target === depName
)
) {
const target = findTarget(path, keyMap, depName, depSpec);
if (target) {
builder.addExternalNodeDependency(node.name, target.name);
}
}
});
}
}
export function stringifyNpmLockfile(
graph: ProjectGraph,
rootLockFileContent: string,
packageJson: NormalizedPackageJson
): string {
const rootLockFile = JSON.parse(rootLockFileContent) as NpmLockFile;
const { lockfileVersion } = JSON.parse(rootLockFileContent) as NpmLockFile;
const mappedPackages = mapSnapshots(rootLockFile, graph);
const output: NpmLockFile = {
name: packageJson.name || rootLockFile.name,
version: packageJson.version || '0.0.1',
lockfileVersion: rootLockFile.lockfileVersion,
};
if (rootLockFile.requires) {
output.requires = rootLockFile.requires;
}
if (lockfileVersion > 1) {
output.packages = mapV3Snapshots(mappedPackages, packageJson);
}
if (lockfileVersion < 3) {
output.dependencies = mapV1Snapshots(mappedPackages);
}
return JSON.stringify(output, null, 2);
}
function mapV3Snapshots(
mappedPackages: MappedPackage[],
packageJson: NormalizedPackageJson
): Record<string, NpmDependencyV3> {
const output: Record<string, NpmDependencyV3> = {};
output[''] = packageJson;
mappedPackages.forEach((p) => {
output[p.path] = p.valueV3;
});
return output;
}
function mapV1Snapshots(
mappedPackages: MappedPackage[]
): Record<string, NpmDependencyV1> {
const output: Record<string, NpmDependencyV1> = {};
mappedPackages.forEach((p) => {
getPackageParent(p.path, output)[p.name] = p.valueV1;
});
return output;
}
function getPackageParent(
path: string,
packages: Record<string, NpmDependencyV1>
): Record<string, NpmDependencyV1> {
const segments = path.split(/\/?node_modules\//).slice(1, -1);
if (!segments.length) {
return packages;
}
let parent = packages[segments.shift()];
if (!parent.dependencies) {
parent.dependencies = {};
}
while (segments.length) {
parent = parent.dependencies[segments.shift()];
if (!parent.dependencies) {
parent.dependencies = {};
}
}
return parent.dependencies;
}
type MappedPackage = {
path: string;
name: string;
valueV3?: NpmDependencyV3;
valueV1?: NpmDependencyV1;
};
function mapSnapshots(
rootLockFile: NpmLockFile,
graph: ProjectGraph
): MappedPackage[] {
const nestedNodes = new Set<ProjectGraphExternalNode>();
const visitedNodes = new Map<ProjectGraphExternalNode, Set<string>>();
const visitedPaths = new Set<string>();
const remappedPackages: MappedPackage[] = [];
// add first level children
Object.values(graph.externalNodes).forEach((node) => {
if (node.name === `npm:${node.data.packageName}`) {
const mappedPackage = mapPackage(
rootLockFile,
node.data.packageName,
node.data.version
);
remappedPackages.push(mappedPackage);
visitedNodes.set(node, new Set([mappedPackage.path]));
visitedPaths.add(mappedPackage.path);
} else {
nestedNodes.add(node);
}
});
if (nestedNodes.size) {
const invertedGraph = reverse(graph);
nestMappedPackages(
invertedGraph,
remappedPackages,
nestedNodes,
visitedNodes,
visitedPaths,
rootLockFile
);
}
return remappedPackages.sort((a, b) => a.path.localeCompare(b.path));
}
function mapPackage(
rootLockFile: NpmLockFile,
packageName: string,
version: string,
parentPath = ''
): MappedPackage {
const path = parentPath + `node_modules/${packageName}`;
const lockfileVersion = rootLockFile.lockfileVersion;
let valueV3, valueV1;
if (lockfileVersion < 3) {
valueV1 = findMatchingPackageV1(
rootLockFile.dependencies,
packageName,
version
);
}
if (lockfileVersion > 1) {
valueV3 = findMatchingPackageV3(
rootLockFile.packages,
packageName,
version
);
}
return {
path,
name: packageName,
valueV1,
valueV3,
};
}
function nestMappedPackages(
invertedGraph: ProjectGraph,
result: MappedPackage[],
nestedNodes: Set<ProjectGraphExternalNode>,
visitedNodes: Map<ProjectGraphExternalNode, Set<string>>,
visitedPaths: Set<string>,
rootLockFile: NpmLockFile
) {
const initialSize = nestedNodes.size;
if (!initialSize) {
return;
}
nestedNodes.forEach((node) => {
if (invertedGraph.dependencies[node.name].length === 1) {
const targetName = invertedGraph.dependencies[node.name][0].target;
const targetNode = invertedGraph.externalNodes[targetName];
if (visitedNodes.has(targetNode)) {
visitedNodes.get(targetNode).forEach((path) => {
const parentPath =
findParentPath(path, node.data.packageName, visitedPaths) + '/';
const mappedPackage = mapPackage(
rootLockFile,
node.data.packageName,
node.data.version,
parentPath
);
result.push(mappedPackage);
if (visitedNodes.has(node)) {
visitedNodes.get(node).add(mappedPackage.path);
} else {
visitedNodes.set(node, new Set([mappedPackage.path]));
}
visitedPaths.add(mappedPackage.path);
});
nestedNodes.delete(node);
}
}
});
if (initialSize === nestedNodes.size) {
throw Error('Loop detected while pruning. Please report this issue.');
} else {
nestMappedPackages(
invertedGraph,
result,
nestedNodes,
visitedNodes,
visitedPaths,
rootLockFile
);
}
}
function findParentPath(
path: string,
packageName: string,
visitedPaths: Set<string>
): string {
const segments = path.split('/node_modules/');
let parentPath = path;
while (
segments.length > 1 &&
!visitedPaths.has(`${parentPath}/node_modules/${packageName}`)
) {
segments.pop();
parentPath = segments.join('/node_modules/');
}
return parentPath;
}
function findMatchingPackageV3(
packages: Record<string, NpmDependencyV3>,
name: string,
version: string
) {
for (const [key, { dev, peer, ...snapshot }] of Object.entries(packages)) {
if (key.endsWith(`node_modules/${name}`)) {
if (
[
snapshot.version,
snapshot.resolved,
`npm:${snapshot.name}@${snapshot.version}`,
].includes(version)
) {
return snapshot;
}
}
}
}
function findMatchingPackageV1(
packages: Record<string, NpmDependencyV1>,
name: string,
version: string
) {
for (const [
packageName,
{ dev, peer, dependencies, ...snapshot },
] of Object.entries(packages)) {
if (packageName === name) {
if (snapshot.version === version) {
return snapshot;
}
}
if (dependencies) {
const found = findMatchingPackageV1(dependencies, name, version);
if (found) {
return found;
}
}
}
}
// NPM V1 does not track the peer dependencies in the lock file
// so we need to parse them directly from the package.json
function getPeerDependencies(path: string): {
peerDependencies?: Record<string, string>;
peerDependenciesMeta?: Record<string, { optional: boolean }>;
} {
const fullPath = `${workspaceRoot}/${path}/package.json`;
if (existsSync(fullPath)) {
const content = readFileSync(fullPath, 'utf-8');
const { peerDependencies, peerDependenciesMeta } = JSON.parse(content);
return {
...(peerDependencies && { peerDependencies }),
...(peerDependenciesMeta && { peerDependenciesMeta }),
};
} else {
if (process.env.NX_VERBOSE_LOGGING === 'true') {
console.warn(`Could not find package.json at "${path}"`);
}
return {};
}
}

View File

@ -1,487 +0,0 @@
import {
parseNpmLockFile,
pruneNpmLockFile,
stringifyNpmLockFile,
} from './npm';
import {
lockFileV1,
lockFileV1JustTypescript,
lockFileV1YargsAndDevkitOnly,
lockFileV2,
lockFileV2JustTypescript,
lockFileV2YargsAndDevkitOnly,
lockFileV3,
lockFileV3JustTypescript,
lockFileV3YargsAndDevkitOnly,
rxjsTslibLockFileV1,
rxjsTslibLockFileV2,
rxjsTslibLockFileV3,
ssh2LockFileV1,
ssh2LockFileV2,
ssh2LockFileV3,
} from './__fixtures__/npm.lock';
import { vol } from 'memfs';
import { npmLockFileWithWorkspaces } from './__fixtures__/workspaces.lock';
jest.mock('fs', () => require('memfs').fs);
jest.mock('@nrwl/devkit', () => ({
...jest.requireActual<any>('@nrwl/devkit'),
workspaceRoot: '/root',
}));
jest.mock('nx/src/utils/workspace-root', () => ({
workspaceRoot: '/root',
}));
const TypeScriptOnlyPackage = {
name: 'test',
version: '0.0.0',
dependencies: { typescript: '4.8.4' },
};
const YargsAndDevkitPackage = {
name: 'test',
version: '0.0.0',
dependencies: { '@nrwl/devkit': '15.0.13', yargs: '17.6.2' },
};
const Ssh2Package = {
name: 'test',
version: '0.0.0',
dependencies: {
ssh2: '1.11.0',
},
};
const RxjsTslibPackage = {
name: 'test',
version: '0.0.0',
dependencies: {
rxjs: '^7.8.0',
tslib: '^2.4.1',
},
};
describe('npm LockFile utility', () => {
describe('v3', () => {
const parsedLockFile = parseNpmLockFile(lockFileV3);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({
metadata: {
lockfileVersion: 3,
name: 'test',
requires: true,
version: '0.0.0',
},
rootPackage: {
devDependencies: {
'@nrwl/cli': '15.0.13',
'@nrwl/workspace': '15.0.13',
nx: '15.0.13',
prettier: '^2.6.2',
typescript: '~4.8.2',
},
license: 'MIT',
name: 'test',
version: '0.0.0',
},
});
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
// This is opposite from yarn and pnpm
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
].rootVersion
).toBeTruthy();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
].rootVersion
).toBeFalsy();
});
it('should map various instances of the same version', () => {
const jestResolveDependency =
parsedLockFile.dependencies['jest-resolve']['jest-resolve@28.1.3'];
expect(jestResolveDependency.packageMeta.length).toEqual(2);
expect((jestResolveDependency.packageMeta[0] as any).path).toEqual(
'node_modules/jest-runner/node_modules/jest-resolve'
);
expect((jestResolveDependency.packageMeta[1] as any).path).toEqual(
'node_modules/jest-runtime/node_modules/jest-resolve'
);
});
it('should map optional field', () => {
const tsDependency =
parsedLockFile.dependencies['typescript']['typescript@4.8.4'];
expect((tsDependency.packageMeta[0] as any).optional).toBeFalsy();
const fsEventsDependency =
parsedLockFile.dependencies['fsevents']['fsevents@2.3.2'];
expect((fsEventsDependency.packageMeta[0] as any).optional).toBeTruthy();
});
it('should match the original file on stringification', () => {
expect(JSON.parse(stringifyNpmLockFile(parsedLockFile))).toEqual(
JSON.parse(lockFileV3)
);
});
it('should prune the lock file', () => {
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies
).length
).toEqual(1);
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage).dependencies
).length
).toEqual(136);
});
it('should correctly prune lockfile with single package', () => {
expect(
JSON.parse(
stringifyNpmLockFile(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage)
)
)
).toEqual(JSON.parse(lockFileV3JustTypescript));
});
it('should correctly prune lockfile with multiple packages', () => {
expect(
JSON.parse(
stringifyNpmLockFile(
pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage)
)
)
).toEqual(JSON.parse(lockFileV3YargsAndDevkitOnly));
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(parseNpmLockFile(ssh2LockFileV3), Ssh2Package)
)
).toEqual(ssh2LockFileV3);
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(
parseNpmLockFile(rxjsTslibLockFileV3),
RxjsTslibPackage
)
)
).toEqual(rxjsTslibLockFileV3);
});
});
describe('v2', () => {
const parsedLockFile = parseNpmLockFile(lockFileV2);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({
metadata: {
lockfileVersion: 2,
name: 'test',
requires: true,
version: '0.0.0',
},
rootPackage: {
devDependencies: {
'@nrwl/cli': '15.0.13',
'@nrwl/workspace': '15.0.13',
nx: '15.0.13',
prettier: '^2.6.2',
typescript: '~4.8.2',
},
license: 'MIT',
name: 'test',
version: '0.0.0',
},
});
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should parse lockfile with workspaces correctly', () => {
const parsedWorkspaceLockFile = parseNpmLockFile(
npmLockFileWithWorkspaces
);
expect(JSON.parse(stringifyNpmLockFile(parsedWorkspaceLockFile))).toEqual(
JSON.parse(npmLockFileWithWorkspaces)
);
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
// This is opposite from yarn and pnpm
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
].rootVersion
).toBeTruthy();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
].rootVersion
).toBeFalsy();
});
it('should map various instances of the same version', () => {
const jestResolveDependency =
parsedLockFile.dependencies['jest-resolve']['jest-resolve@28.1.3'];
expect(jestResolveDependency.packageMeta.length).toEqual(2);
expect((jestResolveDependency.packageMeta[0] as any).path).toEqual(
'node_modules/jest-runner/node_modules/jest-resolve'
);
expect((jestResolveDependency.packageMeta[1] as any).path).toEqual(
'node_modules/jest-runtime/node_modules/jest-resolve'
);
});
it('should map optional field', () => {
const tsDependency =
parsedLockFile.dependencies['typescript']['typescript@4.8.4'];
expect((tsDependency.packageMeta[0] as any).optional).toBeFalsy();
const fsEventsDependency =
parsedLockFile.dependencies['fsevents']['fsevents@2.3.2'];
expect((fsEventsDependency.packageMeta[0] as any).optional).toBeTruthy();
});
it('should match the original file on stringification', () => {
expect(JSON.parse(stringifyNpmLockFile(parsedLockFile))).toEqual(
JSON.parse(lockFileV2)
);
});
it('should prune the lock file', () => {
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies
).length
).toEqual(1);
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage).dependencies
).length
).toEqual(136);
});
it('should correctly prune lockfile with single package', () => {
expect(
JSON.parse(
stringifyNpmLockFile(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage)
)
)
).toEqual(JSON.parse(lockFileV2JustTypescript));
});
it('should correctly prune lockfile with multiple packages', () => {
const pruned = pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage);
expect(JSON.parse(stringifyNpmLockFile(pruned))).toEqual(
JSON.parse(lockFileV2YargsAndDevkitOnly)
);
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(parseNpmLockFile(ssh2LockFileV2), Ssh2Package)
)
).toEqual(ssh2LockFileV2);
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(
parseNpmLockFile(rxjsTslibLockFileV2),
RxjsTslibPackage
)
)
).toEqual(rxjsTslibLockFileV2);
});
});
describe('v1', () => {
const parsedLockFile = parseNpmLockFile(lockFileV1);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({
metadata: {
lockfileVersion: 1,
name: 'test',
requires: true,
version: '0.0.0',
},
});
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
// This is opposite from yarn and pnpm
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
].rootVersion
).toBeTruthy();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
].rootVersion
).toBeFalsy();
});
it('should map various instances of the same version', () => {
const jestResolveDependency =
parsedLockFile.dependencies['jest-resolve']['jest-resolve@28.1.3'];
expect(jestResolveDependency.packageMeta.length).toEqual(2);
expect((jestResolveDependency.packageMeta[0] as any).path).toEqual(
'node_modules/jest-runner/node_modules/jest-resolve'
);
expect((jestResolveDependency.packageMeta[1] as any).path).toEqual(
'node_modules/jest-runtime/node_modules/jest-resolve'
);
});
it('should map optional field', () => {
const tsDependency =
parsedLockFile.dependencies['typescript']['typescript@4.8.4'];
expect((tsDependency.packageMeta[0] as any).optional).toBeFalsy();
const fsEventsDependency =
parsedLockFile.dependencies['fsevents']['fsevents@2.3.2'];
expect((fsEventsDependency.packageMeta[0] as any).optional).toBeTruthy();
});
it('should match the original file on stringification', () => {
expect(JSON.parse(stringifyNpmLockFile(parsedLockFile))).toEqual(
JSON.parse(lockFileV1)
);
});
describe('pruning', () => {
beforeAll(() => {
const v2packages = JSON.parse(lockFileV2).packages;
const fileSys = {};
// map all v2 packages to the file system
Object.keys(v2packages).forEach((key) => {
if (key) {
fileSys[`/root/${key}/package.json`] = JSON.stringify(
v2packages[key]
);
}
});
vol.fromJSON(fileSys, '/root');
});
it('should prune the lock file', () => {
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies
).length
).toEqual(1);
expect(
Object.keys(
pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage).dependencies
).length
).toEqual(136);
});
it('should correctly prune lockfile with single package', () => {
expect(
JSON.parse(
stringifyNpmLockFile(
pruneNpmLockFile(parsedLockFile, TypeScriptOnlyPackage)
)
)
).toEqual(JSON.parse(lockFileV1JustTypescript));
});
it('should correctly prune lockfile with multiple packages', () => {
const pruned = pruneNpmLockFile(parsedLockFile, YargsAndDevkitPackage);
expect(JSON.parse(stringifyNpmLockFile(pruned))).toEqual(
JSON.parse(lockFileV1YargsAndDevkitOnly)
);
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(parseNpmLockFile(ssh2LockFileV1), Ssh2Package)
)
).toEqual(ssh2LockFileV1);
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
stringifyNpmLockFile(
pruneNpmLockFile(
parseNpmLockFile(rxjsTslibLockFileV1),
RxjsTslibPackage
)
)
).toEqual(rxjsTslibLockFileV1);
});
});
});
});

View File

@ -1,819 +0,0 @@
import { existsSync } from 'fs';
import { satisfies } from 'semver';
import { readJsonFile } from '../utils/fileutils';
import { output } from '../utils/output';
import { joinPathFragments } from '../utils/path';
import { workspaceRoot } from '../utils/workspace-root';
import { LockFileData, PackageDependency } from './utils/lock-file-type';
import { TransitiveLookupFunctionInput } from './utils/mapping';
import { hashString, generatePrunnedHash } from './utils/hashing';
import type { PackageJsonDeps } from './utils/pruning';
type PackageMeta = {
path: string;
optional?: boolean;
dev?: boolean;
[key: string]: any;
};
type Dependencies = Record<string, Omit<PackageDependency, 'packageMeta'>>;
type NpmDependency = {
version: string;
resolved: string;
integrity: string;
requires?: Record<string, string>;
dependencies?: Record<string, NpmDependency>;
dev?: boolean;
peer?: boolean;
devOptional?: boolean;
optional?: boolean;
};
/**
* Lock file version differences:
* - v1 has only dependencies
* - v2 has dependencies and packages for backwards compatibility
* - v3 has only packages
*/
type NpmLockFile = {
name?: string;
lockfileVersion: number;
requires?: boolean;
packages?: Record<string, NpmDependency>;
dependencies?: Record<string, NpmDependency>;
};
/**
* Parses package-lock.json file to `LockFileData` object
*
* @param lockFile
* @returns
*/
export function parseNpmLockFile(lockFile: string): LockFileData {
const { packages, dependencies, ...metadata } = JSON.parse(
lockFile
) as NpmLockFile;
return {
dependencies: mapPackages(dependencies, packages, metadata.lockfileVersion),
lockFileMetadata: {
metadata,
...(packages && { rootPackage: packages[''] }),
},
hash: hashString(lockFile),
};
}
// Maps /node_modules/@abc/def with version 1.2.3 => @abc/def > @abc/dev@1.2.3
function mapPackages(
dependencies: Record<string, NpmDependency>,
packages: Record<string, NpmDependency>,
lockfileVersion: number
): LockFileData['dependencies'] {
const mappedPackages: LockFileData['dependencies'] = {};
if (lockfileVersion === 1) {
Object.entries(dependencies).forEach(([packageName, value]) => {
const { newKey, packagePath } = prepareDependency(
packageName,
value,
mappedPackages
);
mapPackageDependency(
mappedPackages,
packageName,
newKey,
packagePath,
value,
lockfileVersion,
true
);
// we need to map the nested dependencies recursively
mapPackageDependencies(
mappedPackages,
value.dependencies,
packagePath,
lockfileVersion
);
});
} else {
Object.entries(packages).forEach(([packagePath, value]) => {
// we parse root package.json separately
if (packagePath !== '') {
const packageName = packagePath.split('node_modules/').pop();
const { newKey } = prepareDependency(
packageName,
value,
mappedPackages,
undefined,
packagePath
);
let dependency;
if (lockfileVersion === 2) {
const path = packagePath.split(/\/?node_modules\//).slice(1);
let index = 1;
dependency = dependencies[path[0]];
while (index < path.length) {
// the root lockfile might not match the nested project's lockfile
// given path might not exist in the root lockfile
if (
dependency?.dependencies &&
dependency.dependencies[path[index]]
) {
dependency = dependency.dependencies[path[index]];
index++;
} else {
break;
}
}
// if versions are same, no need to track it further
if (dependency && value.version === dependency.version) {
dependency = undefined;
}
}
mapPackageDependency(
mappedPackages,
packageName,
newKey,
packagePath,
value,
lockfileVersion,
undefined,
dependency
);
}
});
}
return mappedPackages;
}
function prepareDependency(
packageName: string,
dependency: NpmDependency,
mappedPackages: LockFileData['dependencies'],
pathPrefix: string = '',
path?: string
) {
mappedPackages[packageName] = mappedPackages[packageName] || {};
const version = dependency.integrity
? dependency.version
: dependency.resolved;
const newKey = packageName + '@' + version;
const packagePath =
path || pathPrefix
? `${pathPrefix}/node_modules/${packageName}`
: `node_modules/${packageName}`;
return { newKey, packagePath };
}
function mapPackageDependency(
mappedPackages: LockFileData['dependencies'],
packageName: string,
key: string,
packagePath: string,
value: NpmDependency | Omit<PackageDependency, 'packageMeta'>,
lockfileVersion: number,
isRootVersion?: boolean,
dependencyValue?: NpmDependency
) {
const { dev, peer, optional } = value;
const packageMeta = {
path: packagePath,
dev,
peer,
optional,
};
const rootVersion =
isRootVersion ?? packagePath.split('/node_modules/').length === 1;
if (!mappedPackages[packageName][key] || rootVersion) {
// const packageDependencies = lockfileVersion === 1 ? requires : dependencies;
if (lockfileVersion === 1) {
const { requires, ...rest } = value;
if (requires) {
rest.dependencies = requires;
}
value = rest;
}
mappedPackages[packageName][key] = {
...(value as Omit<PackageDependency, 'packageMeta'>),
...(!value.integrity &&
value.version && {
actualVersion: value.version,
version: value.resolved,
}),
...(value.integrity &&
dependencyValue && {
actualVersion: value.version,
version: dependencyValue.version,
}),
...(dependencyValue && { dependencyValue }),
packageMeta: [],
rootVersion,
};
}
mappedPackages[packageName][key].packageMeta.push(packageMeta);
}
function mapPackageDependencies(
mappedPackages: LockFileData['dependencies'],
dependencies: Record<string, NpmDependency>,
parentPath: string,
lockfileVersion: number
): void {
if (!dependencies) {
return;
}
Object.entries(dependencies).forEach(([packageName, value]) => {
const { newKey, packagePath } = prepareDependency(
packageName,
value,
mappedPackages,
parentPath
);
mapPackageDependency(
mappedPackages,
packageName,
newKey,
packagePath,
value,
lockfileVersion,
false
);
mapPackageDependencies(
mappedPackages,
value.dependencies,
packagePath,
lockfileVersion
);
});
}
/**
* Generates package-lock.json file from `LockFileData` object
*
* @param lockFile
* @returns
*/
export function stringifyNpmLockFile(lockFileData: LockFileData): string {
const notV1 = lockFileData.lockFileMetadata.metadata.lockfileVersion > 1;
const notV3 = lockFileData.lockFileMetadata.metadata.lockfileVersion < 3;
// initialize the lockfile collections
const dependencies = {};
const packages: Dependencies = {
...(notV1 && { '': lockFileData.lockFileMetadata.rootPackage }),
};
const keys = Object.keys(lockFileData.dependencies);
for (let i = 0; i < keys.length; i++) {
const packageName = keys[i];
const packageVersions = lockFileData.dependencies[packageName];
const values = Object.values(packageVersions);
values.forEach((value) => {
if (notV1) {
unmapPackage(packages, value);
}
if (notV3) {
unmapDependencies(dependencies, packageName, value);
}
});
}
// generate package lock JSON
const lockFileJson: NpmLockFile = {
...lockFileData.lockFileMetadata.metadata,
...(notV1 && {
packages: sortObject(packages),
}),
...(notV3 && { dependencies: sortDependencies(dependencies) }),
};
return JSON.stringify(lockFileJson, null, 2) + '\n';
}
function sortObject(packages: Dependencies): Dependencies | undefined {
const keys = Object.keys(packages);
if (keys.length === 0) {
return;
}
keys.sort((a, b) => a.localeCompare(b));
const result: Dependencies = {};
keys.forEach((key) => {
result[key] = packages[key];
});
return result;
}
// remapping the package back to package-lock format
function unmapPackage(packages: Dependencies, dependency: PackageDependency) {
const {
packageMeta,
rootVersion,
version,
actualVersion,
resolved,
integrity,
dev,
peer,
optional,
dependencyValue,
...value
} = dependency;
// we need to decompose value, to achieve particular field ordering
for (let i = 0; i < packageMeta.length; i++) {
const { path, dev, peer, optional } = packageMeta[i];
// we are sorting the properties to get as close as possible to the original package-lock.json
packages[path] = {
version: actualVersion || version,
resolved,
integrity,
dev,
peer,
optional,
...value,
};
}
}
function unmapDependencies(
dependencies: Record<string, NpmDependency>,
packageName: string,
{ packageMeta, ...value }: PackageDependency & { packageMeta: PackageMeta[] }
): void {
const { version, resolved, integrity, devOptional, dependencyValue, from } =
value;
for (let i = 0; i < packageMeta.length; i++) {
const { path, dev, optional, peer } = packageMeta[i];
const projectPath = path.split('node_modules/').slice(1);
const requires = unmapDependencyRequires(value);
const innerDeps = getProjectNodeAndEnsureParentHierarchy(
projectPath,
dependencies
);
// sorting fields to match package-lock structure
innerDeps[packageName] = dependencyValue || {
version,
resolved,
integrity,
from,
dev,
devOptional,
optional,
peer,
requires,
...innerDeps[packageName],
};
}
}
// generates/ensures entire parent hierarchy exists for the given project path
// returns pointer to last project in the path
function getProjectNodeAndEnsureParentHierarchy(
projects: string[],
dependencies: Record<string, NpmDependency>
) {
while (projects.length > 1) {
const parentName = projects.shift().replace(/\/$/, '');
if (!dependencies[parentName]) {
dependencies[parentName] = {} as NpmDependency;
}
if (!dependencies[parentName].dependencies) {
dependencies[parentName].dependencies = {};
}
dependencies = dependencies[parentName].dependencies;
}
return dependencies;
}
// combine dependencies and optionalDependencies into requires and sort them
function unmapDependencyRequires(
value: Omit<PackageDependency, 'packageMeta'>
): Record<string, string> {
if (!value.dependencies && !value.optionalDependencies) {
return undefined;
}
const dependencies = {
...(value.dependencies || {}),
...(value.optionalDependencies || {}),
};
const sortedKeys = Object.keys(dependencies).sort((a, b) =>
a.localeCompare(b)
);
const result = {};
for (let i = 0; i < sortedKeys.length; i++) {
const key = sortedKeys[i];
result[key] = dependencies[key];
}
return result;
}
// recursively sort dependencies
function sortDependencies(
unsortedDependencies: Record<string, NpmDependency>
): Record<string, NpmDependency> {
const dependencies = {};
const sortedKeys = Object.keys(unsortedDependencies).sort((a, b) =>
a.localeCompare(b)
);
for (let i = 0; i < sortedKeys.length; i++) {
const value = unsortedDependencies[sortedKeys[i]];
dependencies[sortedKeys[i]] = value;
if (value.dependencies) {
value.dependencies = sortDependencies(value.dependencies);
}
}
return dependencies;
}
/**
* Returns matching version of the dependency
*/
export function transitiveDependencyNpmLookup({
packageName,
parentPackages,
versions,
version,
}: TransitiveLookupFunctionInput): PackageDependency {
const packageDependencies = Object.values(versions);
for (let i = 0; i < packageDependencies.length; i++) {
if (satisfies(packageDependencies[i].version, version)) {
const packageMeta = packageDependencies[i].packageMeta.find((p) =>
isPathMatching(p.path, packageName, parentPackages)
);
if (packageMeta) {
return {
...packageDependencies[i],
packageMeta: [packageMeta],
};
}
}
}
// otherwise return the root version
return Object.values(versions).find((v) => v.rootVersion);
}
function isPathMatching(
path: string,
packageName: string,
parentPackages: string[]
): boolean {
const packages = path.split(/\/?node_modules\//).slice(1);
if (packages[packages.length - 1] !== packageName) {
return false;
}
const locations = parentPackages
.map((p) => packages.indexOf(p))
.filter((p) => p !== -1);
if (locations.length === 0) {
return false;
}
for (let i = 0; i < locations.length - 2; i++) {
if (locations[i] > locations[i + 1]) {
return false;
}
}
return true;
}
/**
* Prunes the lock file data based on the list of packages and their transitive dependencies
*
* @param lockFileData
* @returns
*/
export function pruneNpmLockFile(
lockFileData: LockFileData,
normalizedPackageJson: PackageJsonDeps
): LockFileData {
const isV1 = lockFileData.lockFileMetadata.metadata.lockfileVersion === 1;
// NPM V1 does not track full dependency list in the lock file,
// so we can't reuse the lock file to generate a new one
if (isV1) {
output.warn({
title: 'Pruning v1 lock file',
bodyLines: [
`If your "node_modules" are not in sync with the lock file, you might get inaccurate results.`,
`Run "npm ci" to ensure your installed packages are synchronized or upgrade to NPM v7+ to benefit from the new lock file format`,
],
});
}
const dependencies = pruneDependencies(
lockFileData.dependencies,
normalizedPackageJson,
isV1
);
const lockFileMetadata = {
...lockFileData.lockFileMetadata,
...pruneRootPackage(lockFileData, normalizedPackageJson),
};
let prunedLockFileData: LockFileData;
prunedLockFileData = {
dependencies,
lockFileMetadata,
hash: generatePrunnedHash(lockFileData.hash, normalizedPackageJson),
};
return prunedLockFileData;
}
function pruneRootPackage(
lockFileData: LockFileData,
{ name, version, license, ...dependencyInfo }: PackageJsonDeps
): Record<string, any> {
if (lockFileData.lockFileMetadata.metadata.lockfileVersion === 1) {
return undefined;
}
const rootPackage = {
name: name || lockFileData.lockFileMetadata.rootPackage.name,
version: version || lockFileData.lockFileMetadata.rootPackage.version,
...(lockFileData.lockFileMetadata.rootPackage.license && {
license: license || lockFileData.lockFileMetadata.rootPackage.license,
}),
...dependencyInfo,
};
return { rootPackage };
}
type PeerDepsInfo = Record<
string,
{
parentPackages: string[];
dependency: PackageDependency;
packageMeta: PackageMeta;
packageName: string;
key: string;
}
>;
// iterate over packages to collect the affected tree of dependencies
function pruneDependencies(
dependencies: LockFileData['dependencies'],
normalizedPackageJson: PackageJsonDeps,
isV1?: boolean
): LockFileData['dependencies'] {
const result: LockFileData['dependencies'] = {};
const peerDependenciesToPrune: PeerDepsInfo = {};
Object.keys({
...normalizedPackageJson.dependencies,
...normalizedPackageJson.devDependencies,
...normalizedPackageJson.peerDependencies,
}).forEach((packageName) => {
if (dependencies[packageName]) {
const [key, { packageMeta, dev: _d, peer: _p, optional: _o, ...value }] =
Object.entries(dependencies[packageName]).find(
([_, v]) => v.rootVersion
);
const dev = normalizedPackageJson.devDependencies?.[packageName];
const peer = normalizedPackageJson.peerDependencies?.[packageName];
const optional =
normalizedPackageJson.peerDependenciesMeta?.[packageName]?.optional;
const modifier = peer
? 'peer'
: optional
? 'optional'
: dev
? 'dev'
: undefined;
result[packageName] = result[packageName] || {};
result[packageName][key] = Object.assign(value, {
packageMeta: [
{
path: `node_modules/${packageName}`,
...(dev ? { dev } : {}),
...(optional ? { optional } : {}),
...(peer ? { peer } : {}),
},
],
});
pruneTransitiveDependencies(
[packageName],
dependencies,
result,
result[packageName][key],
isV1,
modifier,
peerDependenciesToPrune
);
} else {
console.warn(
`Could not find ${packageName} in the lock file. Skipping...`
);
}
});
// add all peer dependencies
Object.values(peerDependenciesToPrune).forEach(
({ parentPackages, dependency, packageMeta, packageName, key }) => {
addPrunedDependency(
parentPackages,
dependencies,
result,
dependency,
packageMeta,
packageName,
key,
isV1
);
}
);
return result;
}
// find all transitive dependencies of already pruned packages
// and adds them to the collection
// recursively prune their dependencies
function pruneTransitiveDependencies(
parentPackages: string[],
dependencies: LockFileData['dependencies'],
prunedDeps: LockFileData['dependencies'],
value: PackageDependency,
isV1?: boolean,
modifier?: 'dev' | 'optional' | 'peer',
peerDependenciesToPrune?: PeerDepsInfo
): void {
let packageJSON: PackageDependency;
if (isV1) {
const pathToPackageJSON = joinPathFragments(
workspaceRoot,
value.packageMeta[0].path,
'package.json'
);
// if node_modules are our of sync with lock file, we might not have the package.json
if (existsSync(pathToPackageJSON)) {
packageJSON = readJsonFile(pathToPackageJSON);
}
}
if (
!value.dependencies &&
!value.peerDependencies &&
!packageJSON?.peerDependencies
) {
return;
}
Object.entries({
...value.dependencies,
...value.peerDependencies,
...value.optionalDependencies,
...packageJSON?.peerDependencies,
}).forEach(([packageName, version]: [string, string]) => {
const versions = dependencies[packageName];
if (versions) {
const dependency = transitiveDependencyNpmLookup({
packageName,
parentPackages,
versions,
version,
});
if (dependency) {
// dev/optional/peer dependencies can be changed during the pruning process
// so we need to update them
if (!prunedDeps[packageName]) {
prunedDeps[packageName] = {};
}
const key = `${packageName}@${dependency.version}`;
const packageMeta = setPackageMetaModifiers(
packageName,
dependency,
packageJSON || value,
modifier
);
// initially will collect only non-peer dependencies
// this gives priority to direct dependencies over peer ones
if (
peerDependenciesToPrune &&
(value.peerDependencies?.[packageName] ||
packageJSON?.peerDependencies?.[packageName])
) {
peerDependenciesToPrune[key] = peerDependenciesToPrune[key] || {
parentPackages,
dependency,
packageMeta,
packageName,
key,
};
return;
}
addPrunedDependency(
parentPackages,
dependencies,
prunedDeps,
dependency,
packageMeta,
packageName,
key,
isV1,
peerDependenciesToPrune
);
}
}
});
}
function addPrunedDependency(
parentPackages,
dependencies: LockFileData['dependencies'],
prunedDeps: LockFileData['dependencies'],
dependency: PackageDependency,
packageMeta: PackageMeta,
packageName: string,
key: string,
isV1?: boolean,
peerDependenciesToPrune?: PeerDepsInfo
) {
if (prunedDeps[packageName][key]) {
const currentMeta = prunedDeps[packageName][key].packageMeta;
if (!currentMeta.find((p) => p.path === dependency.packageMeta[0].path)) {
currentMeta.push(packageMeta);
currentMeta.sort();
}
} else {
dependency.packageMeta = [packageMeta];
prunedDeps[packageName][key] = dependency;
// recurively collect dependencies
pruneTransitiveDependencies(
[...parentPackages, packageName],
dependencies,
prunedDeps,
prunedDeps[packageName][key],
isV1,
getModifier(packageMeta),
peerDependenciesToPrune
);
}
}
function getModifier(
packageMeta: PackageMeta
): 'dev' | 'optional' | 'peer' | undefined {
if (packageMeta.dev) {
return 'dev';
} else if (packageMeta.optional) {
return 'optional';
} else if (packageMeta.peer) {
return 'peer';
}
}
function setPackageMetaModifiers(
packageName: string,
dependency: PackageDependency,
parent: PackageDependency,
modifier?: 'dev' | 'optional' | 'peer'
): PackageMeta {
const packageMeta: PackageMeta = { path: dependency.packageMeta[0].path };
if (parent.devDependencies?.[packageName]) {
packageMeta.dev = true;
} else if (dependency.optional) {
packageMeta.optional = true;
} else if (parent.optionalDependencies?.[packageName]) {
packageMeta.optional = true;
} else if (parent.peerDependencies?.[packageName]) {
packageMeta.peer = true;
} else if (modifier === 'dev') {
packageMeta.dev = true;
} else if (modifier === 'optional') {
packageMeta.optional = true;
}
// peer is carried over from the parent
if (modifier === 'peer') {
packageMeta.peer = true;
}
return packageMeta;
}

View File

@ -0,0 +1,429 @@
import { joinPathFragments } from '../utils/path';
import { parsePnpmLockfile, stringifyPnpmLockfile } from './pnpm-parser';
import { ProjectGraph } from '../config/project-graph';
import { vol } from 'memfs';
import { pruneProjectGraph } from './project-graph-pruning';
jest.mock('fs', () => require('memfs').fs);
jest.mock('@nrwl/devkit', () => ({
...jest.requireActual<any>('@nrwl/devkit'),
workspaceRoot: '/root',
}));
jest.mock('nx/src/utils/workspace-root', () => ({
workspaceRoot: '/root',
}));
describe('pnpm LockFile utility', () => {
afterEach(() => {
vol.reset();
});
describe('next.js generated', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@babel/preset-react/package.json':
'{"version": "7.18.6"}',
'node_modules/@eslint/eslintrc/package.json': '{"version": "1.3.3"}',
'node_modules/@next/eslint-plugin-next/package.json':
'{"version": "13.0.0"}',
'node_modules/@nrwl/cypress/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/eslint-plugin-nx/package.json':
'{"version": "15.3.3"}',
'node_modules/@nrwl/jest/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/linter/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/next/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/react/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/web/package.json': '{"version": "15.3.3"}',
'node_modules/@nrwl/workspace/package.json': '{"version": "15.3.3"}',
'node_modules/@rushstack/eslint-patch/package.json':
'{"version": "1.2.0"}',
'node_modules/@testing-library/react/package.json':
'{"version": "13.4.0"}',
'node_modules/@types/eslint/package.json': '{"version": "8.4.10"}',
'node_modules/@types/eslint-scope/package.json': '{"version": "3.7.4"}',
'node_modules/@types/jest/package.json': '{"version": "28.1.1"}',
'node_modules/@types/node/package.json': '{"version": "18.11.9"}',
'node_modules/@types/prettier/package.json': '{"version": "2.7.1"}',
'node_modules/@types/react/package.json': '{"version": "18.0.25"}',
'node_modules/@types/react-dom/package.json': '{"version": "18.0.9"}',
'node_modules/@typescript-eslint/eslint-plugin/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/parser/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/scope-manager/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/type-utils/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/types/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/typescript-estree/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/utils/package.json':
'{"version": "5.46.1"}',
'node_modules/@typescript-eslint/visitor-keys/package.json':
'{"version": "5.46.1"}',
'node_modules/babel-jest/package.json': '{"version": "28.1.1"}',
'node_modules/core-js/package.json': '{"version": "3.26.1"}',
'node_modules/cypress/package.json': '{"version": "11.2.0"}',
'node_modules/eslint/package.json': '{"version": "8.15.0"}',
'node_modules/eslint-config-next/package.json': '{"version": "13.0.0"}',
'node_modules/eslint-config-prettier/package.json':
'{"version": "8.1.0"}',
'node_modules/eslint-import-resolver-node/package.json':
'{"version": "0.3.6"}',
'node_modules/eslint-import-resolver-typescript/package.json':
'{"version": "2.7.1"}',
'node_modules/eslint-module-utils/package.json': '{"version": "2.7.4"}',
'node_modules/eslint-plugin-cypress/package.json':
'{"version": "2.12.1"}',
'node_modules/eslint-plugin-import/package.json':
'{"version": "2.26.0"}',
'node_modules/eslint-plugin-jsx-a11y/package.json':
'{"version": "6.6.1"}',
'node_modules/eslint-plugin-react/package.json':
'{"version": "7.31.11"}',
'node_modules/eslint-plugin-react-hooks/package.json':
'{"version": "4.6.0"}',
'node_modules/eslint-scope/package.json': '{"version": "7.1.1"}',
'node_modules/eslint-utils/package.json': '{"version": "3.0.0"}',
'node_modules/eslint-visitor-keys/package.json': '{"version": "3.3.0"}',
'node_modules/jest/package.json': '{"version": "28.1.1"}',
'node_modules/jest-environment-jsdom/package.json':
'{"version": "28.1.1"}',
'node_modules/next/package.json': '{"version": "13.0.0"}',
'node_modules/nx/package.json': '{"version": "15.3.3"}',
'node_modules/prettier/package.json': '{"version": "2.8.1"}',
'node_modules/react/package.json': '{"version": "18.2.0"}',
'node_modules/react-dom/package.json': '{"version": "18.2.0"}',
'node_modules/react-test-renderer/package.json':
'{"version": "18.2.0"}',
'node_modules/regenerator-runtime/package.json':
'{"version": "0.13.7"}',
'node_modules/ts-jest/package.json': '{"version": "28.0.5"}',
'node_modules/ts-node/package.json': '{"version": "10.9.1"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/typescript/package.json': '{"version": "4.8.4"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
});
let graph: ProjectGraph;
let lockFile: string;
beforeEach(() => {
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/pnpm-lock.yaml'
)).default;
graph = parsePnpmLockfile(lockFile);
});
it('should parse root lock file', async () => {
expect(Object.keys(graph.externalNodes).length).toEqual(1280); ///1143
});
it('should prune lock file', async () => {
const appPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/package.json'
));
// this is original generated lock file
// const appLockFile = require(joinPathFragments(
// __dirname,
// '__fixtures__/nextjs/app/pnpm-lock.yaml'
// )).default;
// const appGraph = parsePnpmLockfile(appLockFile);
// expect(Object.keys(appGraph.externalNodes).length).toEqual(863);
// this is our pruned lock file structure
const prunedGraph = pruneProjectGraph(graph, appPackageJson);
// meeroslav: our pruning keep all transitive peer deps, mainly cypress and eslint
// which adds 119 more deps
// but it's still possible to run `pnpm install --frozen-lockfile` on it (there are e2e tests for that)
expect(Object.keys(prunedGraph.externalNodes).length).toEqual(863 + 119);
// this should not fail
const result = stringifyPnpmLockfile(
prunedGraph,
lockFile,
appPackageJson
);
});
});
describe('auxiliary packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@eslint/eslintrc/package.json': '{"version": "1.3.3"}',
'node_modules/@nrwl/devkit/package.json': '{"version": "15.0.13"}',
'node_modules/eslint/package.json': '{"version": "8.29.0"}',
'node_modules/eslint-plugin-disable-autofix/package.json':
'{"version": "3.0.0"}',
'node_modules/eslint-rule-composer/package.json':
'{"version": "0.3.0"}',
'node_modules/eslint-scope/package.json': '{"version": "7.1.1"}',
'node_modules/eslint-utils/package.json': '{"version": "3.0.0"}',
'node_modules/eslint-visitor-keys/package.json': '{"version": "3.3.0"}',
'node_modules/postgres/package.json': '{"version": "3.2.4"}',
'node_modules/react/package.json': '{"version": "18.2.0"}',
'node_modules/typescript/package.json': '{"version": "4.8.4"}',
'node_modules/yargs/package.json': '{"version": "17.6.2"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
});
it('should parse root lock file', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/pnpm-lock.yaml'
)).default;
const graph = parsePnpmLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(213); //202
expect(graph.externalNodes['npm:minimatch']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "3.1.2",
},
"name": "npm:minimatch",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:minimatch@5.1.1']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "5.1.1",
},
"name": "npm:minimatch@5.1.1",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:postgres']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "postgres",
"version": "github.com/charsleysa/postgres/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "npm:postgres",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should prune lock file', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/pnpm-lock.yaml'
)).default;
const prunedLockFile: string = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/pnpm-lock.yaml.pruned'
)).default;
const prunedPackageJson = {
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '15.0.13',
'eslint-plugin-disable-autofix':
'npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0',
postgres:
'github.com/charsleysa/postgres/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb',
yargs: '17.6.2',
},
devDependencies: {
react: '18.2.0',
},
peerDependencies: {
typescript: '4.8.4',
},
};
const graph = parsePnpmLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, prunedPackageJson);
const result = stringifyPnpmLockfile(
prunedGraph,
lockFile,
prunedPackageJson
);
// we replace the dev: true with dev: false because the lock file is generated with dev: false
// this does not break the intallation, despite being inaccurate
const manipulatedLockFile = prunedLockFile.replace(
/dev: true/g,
'dev: false'
);
expect(result).toEqual(manipulatedLockFile);
});
});
describe('duplicate packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@nrwl/devkit/package.json': '{"version": "14.8.6"}',
'node_modules/@nrwl/workspace/package.json': '{"version": "14.8.6"}',
'node_modules/@types/prettier/package.json': '{"version": "2.7.2"}',
'node_modules/nx/package.json': '{"version": "15.4.0"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/duplicate-package/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
});
it('should parse root lock file', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/duplicate-package/pnpm-lock.yaml'
)).default;
const graph = parsePnpmLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(370); //337
expect(Object.keys(graph.dependencies).length).toEqual(213);
expect(graph.dependencies['npm:@nrwl/devkit'].length).toEqual(6);
});
});
describe('optional packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/ssh2/package.json': '{"version": "1.11.6"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/optional/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
});
it('should match parsed and pruned graph', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/optional/pnpm-lock.yaml'
)).default;
const graph = parsePnpmLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(8);
const packageJson = require(joinPathFragments(
__dirname,
'__fixtures__/optional/package.json'
));
const prunedGraph = pruneProjectGraph(graph, packageJson);
expect(Object.keys(prunedGraph.externalNodes).length).toEqual(8);
});
});
describe('pruning', () => {
let graph, lockFile;
beforeEach(() => {
const fileSys = {
'node_modules/argparse/package.json': '{"version": "2.0.1"}',
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/cliui/package.json': '{"version": "7.0.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/pruning/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/pnpm-lock.yaml'
)).default;
graph = parsePnpmLockfile(lockFile);
});
it('should prune single package', () => {
const typescriptPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/package.json'
));
const prunedGraph = pruneProjectGraph(graph, typescriptPackageJson);
const result = stringifyPnpmLockfile(
prunedGraph,
lockFile,
typescriptPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/pnpm-lock.yaml'
)).default
);
});
it('should prune multi packages', () => {
const multiPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/package.json'
));
const prunedGraph = pruneProjectGraph(graph, multiPackageJson);
const result = stringifyPnpmLockfile(
prunedGraph,
lockFile,
multiPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/pnpm-lock.yaml'
)).default
);
});
});
describe('workspaces', () => {
let lockFile;
beforeAll(() => {
const fileSys = {
'node_modules/react/package.json': '{"version": "17.0.2"}',
'node_modules/.modules.yaml': require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/.modules.yaml'
)).default,
};
vol.fromJSON(fileSys, '/root');
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/pnpm-lock.yaml'
)).default;
});
it('should parse lock file', async () => {
const graph = parsePnpmLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(5);
});
});
});

View File

@ -0,0 +1,299 @@
import type {
PackageSnapshot,
Lockfile,
ProjectSnapshot,
PackageSnapshots,
} from '@pnpm/lockfile-types';
import {
loadPnpmHoistedDepsDefinition,
parseAndNormalizePnpmLockfile,
stringifyToPnpmYaml,
} from './utils/pnpm-normalizer';
import { getHoistedPackageVersion } from './utils/package-json';
import { NormalizedPackageJson } from './utils/package-json';
import { sortObjectByKeys } from '../utils/object-sort';
import {
ProjectGraph,
ProjectGraphExternalNode,
} from '../config/project-graph';
import { ProjectGraphBuilder } from '../project-graph/project-graph-builder';
export function parsePnpmLockfile(lockFileContent: string): ProjectGraph {
const data = parseAndNormalizePnpmLockfile(lockFileContent);
const builder = new ProjectGraphBuilder();
// we use key => node map to avoid duplicate work when parsing keys
const keyMap = new Map<string, ProjectGraphExternalNode>();
addNodes(data, builder, keyMap);
addDependencies(data, builder, keyMap);
return builder.getUpdatedProjectGraph();
}
function addNodes(
data: Lockfile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
const nodes: Map<string, Map<string, ProjectGraphExternalNode>> = new Map();
Object.entries(data.packages).forEach(([key, value]) => {
const packageName = findPackageName(key, value, data);
const version = findVersion(key, packageName).split('_')[0];
// we don't need to keep duplicates, we can just track the keys
const existingNode = nodes.get(packageName)?.get(version);
if (existingNode) {
keyMap.set(key, existingNode);
return;
}
const node: ProjectGraphExternalNode = {
type: 'npm',
name: `npm:${packageName}@${version}`,
data: {
version,
packageName,
},
};
keyMap.set(key, node);
if (!nodes.has(packageName)) {
nodes.set(packageName, new Map([[version, node]]));
} else {
nodes.get(packageName).set(version, node);
}
});
const hoistedDeps = loadPnpmHoistedDepsDefinition();
for (const [packageName, versionMap] of nodes.entries()) {
let hoistedNode: ProjectGraphExternalNode;
if (versionMap.size === 1) {
hoistedNode = versionMap.values().next().value;
} else {
const hoistedVersion = getHoistedVersion(hoistedDeps, packageName);
hoistedNode = versionMap.get(hoistedVersion);
}
if (hoistedNode) {
hoistedNode.name = `npm:${packageName}`;
}
versionMap.forEach((node) => {
builder.addExternalNode(node);
});
}
}
function getHoistedVersion(
hoistedDependencies: Record<string, any>,
packageName: string
): string {
let version = getHoistedPackageVersion(packageName);
if (!version) {
const key = Object.keys(hoistedDependencies).find((k) =>
k.startsWith(`/${packageName}/`)
);
if (key) {
version = key.slice(key.lastIndexOf('/') + 1).split('_')[0];
} else {
// pnpm might not hoist every package
// similarly those packages will not be available to be used via import
return;
}
}
return version;
}
function addDependencies(
data: Lockfile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
Object.entries(data.packages).forEach(([key, snapshot]) => {
const node = keyMap.get(key);
[snapshot.dependencies, snapshot.optionalDependencies].forEach(
(section) => {
if (section) {
Object.entries(section).forEach(([name, versionRange]) => {
const version = findVersion(versionRange, name).split('_')[0];
const target =
builder.graph.externalNodes[`npm:${name}@${version}`] ||
builder.graph.externalNodes[`npm:${name}`];
if (target) {
builder.addExternalNodeDependency(node.name, target.name);
}
});
}
}
);
});
}
export function stringifyPnpmLockfile(
graph: ProjectGraph,
rootLockFileContent: string,
packageJson: NormalizedPackageJson
): string {
const data = parseAndNormalizePnpmLockfile(rootLockFileContent);
const output: Lockfile = {
lockfileVersion: data.lockfileVersion,
importers: {
'.': mapRootSnapshot(packageJson, data.packages, graph.externalNodes),
},
packages: sortObjectByKeys(
mapSnapshots(data.packages, graph.externalNodes)
),
};
return stringifyToPnpmYaml(output);
}
function mapSnapshots(
packages: PackageSnapshots,
nodes: Record<string, ProjectGraphExternalNode>
): PackageSnapshots {
const result: PackageSnapshots = {};
Object.values(nodes).forEach((node) => {
const matchedKeys = findOriginalKeys(packages, node, {
returnFullKey: true,
});
// the package manager doesn't check for types of dependencies
// so we can safely set all to prod
matchedKeys.forEach(([key, snapshot]) => {
snapshot.dev = false;
result[key] = snapshot;
});
});
return result;
}
function findOriginalKeys(
packages: PackageSnapshots,
{ data: { packageName, version } }: ProjectGraphExternalNode,
{ returnFullKey }: { returnFullKey?: boolean } = {}
): Array<[string, PackageSnapshot]> {
const matchedKeys = [];
for (const key of Object.keys(packages)) {
const snapshot = packages[key];
// standard package
if (key.startsWith(`/${packageName}/${version}`)) {
matchedKeys.push([returnFullKey ? key : key.split('/').pop(), snapshot]);
}
// tarball package
if (key === version) {
matchedKeys.push([version, snapshot]);
}
// alias package
if (
version.startsWith('npm:') &&
key.startsWith(
`/${version.slice(4, version.lastIndexOf('@'))}/${version.slice(
version.lastIndexOf('@') + 1
)}`
)
) {
matchedKeys.push([key, snapshot]);
}
}
return matchedKeys;
}
function mapRootSnapshot(
packageJson: NormalizedPackageJson,
packages: PackageSnapshots,
nodes: Record<string, ProjectGraphExternalNode>
): ProjectSnapshot {
const snapshot: ProjectSnapshot = { specifiers: {} };
[
'dependencies',
'optionalDependencies',
'devDependencies',
'peerDependencies',
].forEach((depType) => {
if (packageJson[depType]) {
Object.keys(packageJson[depType]).forEach((packageName) => {
const version = packageJson[depType][packageName];
const node =
nodes[`npm:${packageName}@${version}`] || nodes[`npm:${packageName}`];
snapshot.specifiers[packageName] = version;
// peer dependencies are mapped to dependencies
let section = depType === 'peerDependencies' ? 'dependencies' : depType;
snapshot[section] = snapshot[section] || {};
snapshot[section][packageName] = findOriginalKeys(packages, node)[0][0];
});
}
});
Object.keys(snapshot).forEach((key) => {
snapshot[key] = sortObjectByKeys(snapshot[key]);
});
return snapshot;
}
function findVersion(key: string, packageName: string): string {
if (key.startsWith(`/${packageName}/`)) {
return key.slice(key.lastIndexOf('/') + 1);
}
// for alias packages prepend with "npm:"
if (key.startsWith('/')) {
const aliasName = key.slice(1, key.lastIndexOf('/'));
const version = key.slice(key.lastIndexOf('/') + 1);
return `npm:${aliasName}@${version}`;
}
// for tarball package the entire key is the version spec
return key;
}
function findPackageName(
key: string,
value: PackageSnapshot,
data: Lockfile
): string {
const matchPropValue = (record: Record<string, string>): string => {
if (!record) {
return undefined;
}
const index = Object.values(record).findIndex((version) => version === key);
if (index > -1) {
return Object.keys(record)[index];
}
};
const matchedDependencyName = (
snapshot: Partial<PackageSnapshot>
): string => {
return (
matchPropValue(snapshot.dependencies) ||
matchPropValue(snapshot.optionalDependencies) ||
matchPropValue(snapshot.peerDependencies)
);
};
// snapshot already has a name
if (value.name) {
return value.name;
}
// it'a a root dependency
const rootDependencyName =
matchedDependencyName(data.importers['.']) ||
// only root importers have devDependencies
matchPropValue(data.importers['.'].devDependencies);
if (rootDependencyName) {
return rootDependencyName;
}
// find a snapshot that has a dependency that points to this snapshot
const snapshots = Object.values(data.packages);
for (let i = 0; i < snapshots.length; i++) {
const snapshot = snapshots[i];
const dependencyName = matchedDependencyName(snapshot);
if (dependencyName) {
return dependencyName;
}
}
// otherwise, it's a standard package
return key.startsWith('/') ? key.slice(1, key.lastIndexOf('/')) : key;
}

View File

@ -1,305 +0,0 @@
import {
parsePnpmLockFile,
prunePnpmLockFile,
stringifyPnpmLockFile,
} from './pnpm';
import {
lockFile,
lockFileJustTypescript,
lockFileWithInlineSpecifiers,
lockFileYargsAndDevkit,
rxjsTslibLockFile,
ssh2LockFile,
} from './__fixtures__/pnpm.lock';
import {
pnpmLockFileWithInlineSpecifiersAndWorkspaces,
pnpmLockFileWithWorkspacesAndTime,
} from './__fixtures__/workspaces.lock';
const TypeScriptOnlyPackage = {
name: 'test',
version: '1.0.0',
dependencies: { typescript: '4.8.4' },
};
const YargsAndDevkitPackage = {
name: 'test',
version: '1.2.3',
dependencies: { '@nrwl/devkit': '15.0.13', yargs: '17.6.2' },
};
const Ssh2Package = {
name: 'test',
version: '0.0.0',
dependencies: {
ssh2: '1.11.0',
},
};
const RxjsTslibPackage = {
name: 'test',
version: '0.0.0',
dependencies: {
rxjs: '^7.8.0',
tslib: '^2.4.1',
},
};
describe('pnpm LockFile utility', () => {
describe('standard lock file', () => {
const parsedLockFile = parsePnpmLockFile(lockFile);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({ lockfileVersion: 5.4 });
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
].rootVersion
).toBeFalsy();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
].rootVersion
).toBeTruthy();
});
it('should map various instances of the same version', () => {
const jestResolveDependency =
parsedLockFile.dependencies['jest-pnp-resolver'][
'jest-pnp-resolver@1.2.3'
];
expect(jestResolveDependency.packageMeta.length).toEqual(2);
expect((jestResolveDependency.packageMeta[0] as any).key).toEqual(
'/jest-pnp-resolver/1.2.3_jest-resolve@28.1.1'
);
expect((jestResolveDependency.packageMeta[1] as any).key).toEqual(
'/jest-pnp-resolver/1.2.3_jest-resolve@28.1.3'
);
expect(
(jestResolveDependency.packageMeta[0] as any).dependencyDetails
.dependencies
).toEqual({ 'jest-resolve': '28.1.1' });
expect(
(jestResolveDependency.packageMeta[1] as any).dependencyDetails
.dependencies
).toEqual({ 'jest-resolve': '28.1.3' });
});
it('should properly extract specifier', () => {
expect(
(
parsedLockFile.dependencies['@ampproject/remapping'][
'@ampproject/remapping@2.2.0'
].packageMeta[0] as any
).specifier
).toBeUndefined();
expect(
(
parsedLockFile.dependencies['typescript']['typescript@4.8.4']
.packageMeta[0] as any
).specifier
).toEqual('~4.8.2');
});
it('should properly extract dev dependency', () => {
expect(
(
parsedLockFile.dependencies['@ampproject/remapping'][
'@ampproject/remapping@2.2.0'
].packageMeta[0] as any
).isDevDependency
).toEqual(false);
expect(
(
parsedLockFile.dependencies['typescript']['typescript@4.8.4']
.packageMeta[0] as any
).isDevDependency
).toEqual(true);
});
it('should match the original file on stringification', () => {
expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(lockFile);
});
it('should prune the lock file', () => {
expect(
Object.keys(
prunePnpmLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies
).length
).toEqual(1);
expect(
Object.keys(
prunePnpmLockFile(parsedLockFile, YargsAndDevkitPackage).dependencies
).length
).toEqual(136);
});
it('should correctly prune lockfile with single package', () => {
expect(
stringifyPnpmLockFile(
prunePnpmLockFile(parsedLockFile, TypeScriptOnlyPackage)
)
).toEqual(lockFileJustTypescript);
});
it('should correctly prune lockfile with multiple packages', () => {
expect(
stringifyPnpmLockFile(
prunePnpmLockFile(parsedLockFile, YargsAndDevkitPackage)
)
).toEqual(lockFileYargsAndDevkit);
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
stringifyPnpmLockFile(
prunePnpmLockFile(parsePnpmLockFile(ssh2LockFile), Ssh2Package)
)
).toEqual(ssh2LockFile);
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
stringifyPnpmLockFile(
prunePnpmLockFile(
parsePnpmLockFile(rxjsTslibLockFile),
RxjsTslibPackage
)
)
).toEqual(rxjsTslibLockFile);
});
});
it('should parse lockfile with time-based resolution and workspaces', () => {
const parsedLockFile = parsePnpmLockFile(pnpmLockFileWithWorkspacesAndTime);
expect(parsedLockFile.lockFileMetadata.time).toBeDefined();
expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(
pnpmLockFileWithWorkspacesAndTime
);
});
describe('lock file with inline specifiers', () => {
const parsedLockFile = parsePnpmLockFile(lockFileWithInlineSpecifiers);
it('should parse lockfile (IS)', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({
lockfileVersion: '5.4-inlineSpecifiers',
});
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages (IS)', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
});
it('should map various instances of the same version (IS)', () => {
const jestResolveDependency =
parsedLockFile.dependencies['jest-pnp-resolver'][
'jest-pnp-resolver@1.2.3'
];
expect(jestResolveDependency.packageMeta.length).toEqual(2);
expect((jestResolveDependency.packageMeta[0] as any).key).toEqual(
'/jest-pnp-resolver/1.2.3_jest-resolve@28.1.1'
);
expect((jestResolveDependency.packageMeta[1] as any).key).toEqual(
'/jest-pnp-resolver/1.2.3_jest-resolve@28.1.3'
);
expect(
(jestResolveDependency.packageMeta[0] as any).dependencyDetails
.dependencies
).toEqual({ 'jest-resolve': '28.1.1' });
expect(
(jestResolveDependency.packageMeta[1] as any).dependencyDetails
.dependencies
).toEqual({ 'jest-resolve': '28.1.3' });
});
it('should properly extract specifier (IS)', () => {
expect(
(
parsedLockFile.dependencies['@ampproject/remapping'][
'@ampproject/remapping@2.2.0'
].packageMeta[0] as any
).specifier
).toBeUndefined();
expect(
(
parsedLockFile.dependencies['typescript']['typescript@4.8.4']
.packageMeta[0] as any
).specifier
).toEqual('~4.8.2');
});
it('should properly extract dev dependency (IS)', () => {
expect(
(
parsedLockFile.dependencies['@ampproject/remapping'][
'@ampproject/remapping@2.2.0'
].packageMeta[0] as any
).isDevDependency
).toEqual(false);
expect(
(
parsedLockFile.dependencies['typescript']['typescript@4.8.4']
.packageMeta[0] as any
).isDevDependency
).toEqual(true);
});
it('should match the original file on stringification (IS)', () => {
expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(
lockFileWithInlineSpecifiers
);
});
});
it('should parse lockfile with inline specifiers and workspaces', () => {
const parsedLockFile = parsePnpmLockFile(
pnpmLockFileWithInlineSpecifiersAndWorkspaces
);
expect(stringifyPnpmLockFile(parsedLockFile)).toEqual(
pnpmLockFileWithInlineSpecifiersAndWorkspaces
);
});
});

View File

@ -1,592 +0,0 @@
import {
LockFileData,
PackageDependency,
PackageVersions,
} from './utils/lock-file-type';
import { dump, load } from '@zkochan/js-yaml';
import { isRootVersion, TransitiveLookupFunctionInput } from './utils/mapping';
import { generatePrunnedHash, hashString } from './utils/hashing';
import { satisfies } from 'semver';
import { PackageJsonDeps } from './utils/pruning';
import { sortObjectByKeys } from '../utils/object-sort';
type PackageMeta = {
key: string;
specifier?: string;
isDevDependency?: boolean;
isDependency?: boolean;
dependencyDetails: Record<string, Record<string, string>>;
dev?: boolean;
optional?: boolean;
peer?: boolean;
};
type Dependencies = Record<string, Omit<PackageDependency, 'packageMeta'>>;
type VersionInfoWithInlineSpecifier = {
version: string;
specifier: string;
};
type PnpmLockFile = {
lockfileVersion: number;
specifiers?: Record<string, string>;
dependencies?: Record<
string,
string | { version: string; specifier: string }
>;
devDependencies?: Record<
string,
string | { version: string; specifier: string }
>;
packages?: Dependencies;
importers?: Record<string, { specifiers: Record<string, string> }>;
time?: Record<string, string>; // e.g. /@babel/core/7.19.6: '2022-10-20T09:03:36.074Z'
overrides?: Record<string, string>; // js-yaml@^4.0.0: npm:@zkochan/js-yaml@0.0.6
patchedDependencies?: Record<string, { path: string; hash: string }>; // e.g. pkg@5.7.0: { path: 'patches/pkg@5.7.0.patch', hash: 'sha512-...' }
neverBuiltDependencies?: string[]; // e.g. ['core-js', 'level']
onlyBuiltDependencies?: string[]; // e.g. ['vite']
packageExtensionsChecksum?: string; // e.g. 'sha512-...' DO NOT COPY TO PRUNED LOCKFILE
};
const LOCKFILE_YAML_FORMAT = {
blankLines: true,
lineWidth: 1000,
noCompatMode: true,
noRefs: true,
sortKeys: false,
};
/**
* Parses pnpm-lock.yaml file to `LockFileData` object
*
* @param lockFile
* @returns
*/
export function parsePnpmLockFile(lockFile: string): LockFileData {
const data: PnpmLockFile = load(lockFile);
const { dependencies, devDependencies, packages, specifiers, ...metadata } =
data;
return {
dependencies: mapPackages(
dependencies,
devDependencies,
specifiers,
packages,
metadata.lockfileVersion.toString().endsWith('inlineSpecifiers')
),
lockFileMetadata: { ...metadata },
hash: hashString(lockFile),
};
}
function mapPackages(
dependencies: Record<string, string | VersionInfoWithInlineSpecifier>,
devDependencies: Record<string, string | VersionInfoWithInlineSpecifier>,
specifiers: Record<string, string>,
packages: Dependencies,
inlineSpecifiers: boolean
): LockFileData['dependencies'] {
const mappedPackages: LockFileData['dependencies'] = {};
Object.entries(packages).forEach(([key, value]) => {
// create new key
const { version, packageName, actualVersion } = parseVersionAndPackage(
key,
value,
{ dependencies, devDependencies }
);
const newKey = `${packageName}@${version.split('_')[0]}`;
// construct packageMeta object
const meta = mapMetaInformation(
{ dependencies, devDependencies, specifiers },
inlineSpecifiers,
key,
value,
packageName,
version
);
if (!mappedPackages[packageName]) {
mappedPackages[packageName] = {};
}
if (mappedPackages[packageName][newKey]) {
mappedPackages[packageName][newKey].packageMeta.push(meta);
} else {
const { dev, optional, peer, ...rest } = value;
mappedPackages[packageName][newKey] = {
...rest,
version: version.split('_')[0],
...(actualVersion && { actualVersion }),
packageMeta: [meta],
};
}
});
Object.keys(mappedPackages).forEach((packageName) => {
const versions = mappedPackages[packageName];
const versionKeys = Object.keys(versions);
if (versionKeys.length === 1) {
versions[versionKeys[0]].rootVersion = true;
} else {
const rootVersionKey = versionKeys.find((v) =>
isRootVersion(packageName, versions[v].version)
);
// this should never happen, but just in case
if (rootVersionKey) {
versions[rootVersionKey].rootVersion = true;
}
}
});
return mappedPackages;
}
function parseVersionAndPackage(
key: string,
value: Omit<PackageDependency, 'packageMeta'>,
{ dependencies, devDependencies }
): { version: string; packageName: string; actualVersion: string } {
let version, packageName, actualVersion;
const combinedDependencies = {
...(dependencies || {}),
...(devDependencies || {}),
};
// check if it's a special case package - npm:... or github:...
packageName = Object.keys(combinedDependencies).find(
(k) => combinedDependencies[k] === key
);
if (packageName) {
version = key;
actualVersion = value.version ?? key;
} else {
version = key.split('/').pop();
packageName = key.slice(1, key.lastIndexOf('/'));
}
return { version, packageName, actualVersion };
}
// maps packageMeta based on dependencies, devDependencies and (inline) specifiers
function mapMetaInformation(
{
dependencies,
devDependencies,
specifiers,
}: Omit<PnpmLockFile, 'lockfileVersion' | 'packages'>,
hasInlineSpefiers,
key: string,
{
dev,
optional,
peer,
...dependencyDetails
}: Omit<PackageDependency, 'packageMeta'>,
packageName: string,
matchingVersion: string
): PackageMeta {
const isDependency = isVersionMatch(
dependencies?.[packageName],
matchingVersion,
hasInlineSpefiers
);
const isDevDependency = isVersionMatch(
devDependencies?.[packageName],
matchingVersion,
hasInlineSpefiers
);
let specifier;
if (isDependency || isDevDependency) {
if (hasInlineSpefiers) {
specifier =
getSpecifier(dependencies?.[packageName]) ||
getSpecifier(devDependencies?.[packageName]);
} else {
if (isDependency || isDevDependency) {
specifier = specifiers[packageName];
}
}
}
return {
key,
isDependency,
isDevDependency,
specifier,
...(dev && { dev }),
...(optional && { optional }),
...(peer && { peer }),
dependencyDetails: {
...(dependencyDetails.dependencies && {
dependencies: dependencyDetails.dependencies,
}),
...(dependencyDetails.peerDependencies && {
peerDependencies: dependencyDetails.peerDependencies,
}),
...(dependencyDetails.optionalDependencies && {
optionalDependencies: dependencyDetails.optionalDependencies,
}),
...(dependencyDetails.transitivePeerDependencies && {
transitivePeerDependencies:
dependencyDetails.transitivePeerDependencies,
}),
},
};
}
// version match for dependencies w/ or w/o inline specifier
function isVersionMatch(
versionInfo: string | { version: string; specifier: string },
matchingVersion,
hasInlineSpefiers
): boolean {
if (!versionInfo) {
return false;
}
if (!hasInlineSpefiers) {
return versionInfo === matchingVersion;
}
return (
(versionInfo as VersionInfoWithInlineSpecifier).version === matchingVersion
);
}
function getSpecifier(
versionInfo: string | { version: string; specifier: string }
): string {
return (
versionInfo && (versionInfo as VersionInfoWithInlineSpecifier).specifier
);
}
/**
* Generates pnpm-lock.yml file from `LockFileData` object
*
* @param lockFile
* @returns
*/
export function stringifyPnpmLockFile(lockFileData: LockFileData): string {
const pnpmLockFile = unmapLockFile(lockFileData);
return dump(pnpmLockFile, LOCKFILE_YAML_FORMAT);
}
// revert lock file to it's original state
function unmapLockFile(lockFileData: LockFileData): PnpmLockFile {
const devDependencies: Record<
string,
string | VersionInfoWithInlineSpecifier
> = {};
const dependencies: Record<string, string | VersionInfoWithInlineSpecifier> =
{};
const packages: Dependencies = {};
const specifiers: Record<string, string> = {};
const inlineSpecifiers = lockFileData.lockFileMetadata.lockfileVersion
.toString()
.endsWith('inlineSpecifiers');
const packageNames = Object.keys(lockFileData.dependencies);
for (let i = 0; i < packageNames.length; i++) {
const packageName = packageNames[i];
const versions = Object.values(lockFileData.dependencies[packageName]);
versions.forEach(
({ packageMeta, version: _, actualVersion, rootVersion, ...rest }) => {
(packageMeta as PackageMeta[]).forEach(
({
key,
specifier,
isDependency,
isDevDependency,
dependencyDetails,
dev,
optional,
peer,
}) => {
let version;
if (inlineSpecifiers) {
version = {
specifier,
version: actualVersion
? key
: key.slice(key.lastIndexOf('/') + 1),
};
} else {
version = actualVersion
? key
: key.slice(key.lastIndexOf('/') + 1);
if (specifier) {
specifiers[packageName] = specifier;
}
}
if (isDependency) {
dependencies[packageName] = version;
}
if (isDevDependency) {
devDependencies[packageName] = version;
}
packages[key] = {
...rest,
...(actualVersion &&
actualVersion !== version && { version: actualVersion }),
dev: !!dev,
...(optional && { optional }),
...(peer && { peer }),
...dependencyDetails,
};
}
);
}
);
}
const { time, ...lockFileMetatada } = lockFileData.lockFileMetadata as Omit<
PnpmLockFile,
'specifiers' | 'importers' | 'devDependencies' | 'dependencies' | 'packages'
>;
return {
...(lockFileMetatada as { lockfileVersion: number }),
...(Object.keys(specifiers).length && {
specifiers: sortObjectByKeys(specifiers),
}),
...(Object.keys(dependencies).length && {
dependencies: sortObjectByKeys(dependencies),
}),
...(Object.keys(devDependencies).length && {
devDependencies: sortObjectByKeys(devDependencies),
}),
...(Object.keys(packages).length && {
packages: sortObjectByKeys(packages),
}),
time,
};
}
/**
* Returns matching version of the dependency
*/
export function transitiveDependencyPnpmLookup({
packageName,
versions,
version,
}: TransitiveLookupFunctionInput): PackageDependency {
const combinedDependency = Object.values(versions).find((v) =>
v.packageMeta.some((m) => m.key === `/${packageName}/${version}`)
);
if (combinedDependency) {
return combinedDependency;
}
// pnpm's dependencies always point to the exact version so this block is only for insurrance
return Object.values(versions).find((v) => satisfies(v.version, version));
}
/**
* Prunes the lock file data based on the list of packages and their transitive dependencies
*
* @param lockFileData
* @returns
*/
export function prunePnpmLockFile(
lockFileData: LockFileData,
normalizedPackageJson: PackageJsonDeps
): LockFileData {
const dependencies = pruneDependencies(
lockFileData.dependencies,
normalizedPackageJson
);
const prunedLockFileData = {
lockFileMetadata: pruneMetadata(
lockFileData.lockFileMetadata,
dependencies
),
dependencies,
hash: generatePrunnedHash(lockFileData.hash, normalizedPackageJson),
};
return prunedLockFileData;
}
// iterate over packages to collect the affected tree of dependencies
function pruneDependencies(
dependencies: LockFileData['dependencies'],
normalizedPackageJson: PackageJsonDeps
): LockFileData['dependencies'] {
const result: LockFileData['dependencies'] = {};
Object.entries({
...normalizedPackageJson.dependencies,
...normalizedPackageJson.devDependencies,
...normalizedPackageJson.peerDependencies,
}).forEach(([packageName, packageVersion]) => {
if (dependencies[packageName]) {
const [key, { packageMeta, ...value }] = Object.entries(
dependencies[packageName]
).find(([_, v]) => v.rootVersion);
result[packageName] = result[packageName] || {};
const metaKey = value.actualVersion
? value.version
: `/${packageName}/${value.version}`;
const meta = packageMeta.find((m) => m.key.startsWith(metaKey));
result[packageName][key] = Object.assign(value, {
packageMeta: [
{
isDependency:
!!normalizedPackageJson.dependencies?.[packageName] ||
!!normalizedPackageJson.peerDependencies?.[packageName],
isDevDependency:
!!normalizedPackageJson.devDependencies?.[packageName],
key: meta.key,
specifier: packageVersion,
dependencyDetails: meta.dependencyDetails,
},
],
});
pruneTransitiveDependencies(
[packageName],
dependencies,
result,
result[packageName][key]
);
} else {
console.warn(
`Could not find ${packageName} in the lock file. Skipping...`
);
}
});
return result;
}
function pruneMetadata(
lockFileMetadata: LockFileData['lockFileMetadata'],
prunedDependencies: Record<string, PackageVersions>
): LockFileData['lockFileMetadata'] {
// These should be removed from the lock file metadata since we don't have them in the package.json
// overrides, patchedDependencies, neverBuiltDependencies, onlyBuiltDependencies, packageExtensionsChecksum
return {
lockfileVersion: lockFileMetadata.lockfileVersion,
...(lockFileMetadata.time && {
time: pruneTime(lockFileMetadata.time, prunedDependencies),
}),
};
}
function pruneTime(
time: Record<string, string>,
prunedDependencies: Record<string, PackageVersions>
): Record<string, string> {
const result: Record<string, string> = {};
Object.entries(time).forEach(([key, value]) => {
const packageName = key.slice(1, key.lastIndexOf('/'));
const version = key.slice(key.lastIndexOf('/'));
if (
prunedDependencies[packageName] &&
prunedDependencies[packageName][`${packageName}@${version}`]
) {
result[key] = value;
}
});
return result;
}
// find all transitive dependencies of already pruned packages
// and adds them to the collection
// recursively prune their dependencies
function pruneTransitiveDependencies(
parentPackages: string[],
dependencies: LockFileData['dependencies'],
prunedDeps: LockFileData['dependencies'],
parent: PackageDependency
): void {
Object.entries({
...parent.dependencies,
...parent.optionalDependencies,
}).forEach(([packageName, version]: [string, string]) => {
const versions = dependencies[packageName];
if (versions) {
const dependency = transitiveDependencyPnpmLookup({
packageName,
parentPackages,
versions,
version,
});
if (dependency) {
if (!prunedDeps[packageName]) {
prunedDeps[packageName] = {};
}
const { packageMeta, rootVersion, ...value } = dependency;
const key = `${packageName}@${value.version}`;
const meta = findPackageMeta(packageMeta, parentPackages);
if (prunedDeps[packageName][key]) {
// TODO not sure if this is important?
} else {
const packageMeta: PackageMeta = {
key: meta.key,
dependencyDetails: meta.dependencyDetails,
};
prunedDeps[packageName][key] = Object.assign(value, {
rootVersion: false,
packageMeta: [packageMeta],
});
if (
parent.packageMeta[0].optional ||
parent.optionalDependencies?.[packageName]
) {
packageMeta.optional = true;
}
pruneTransitiveDependencies(
[...parentPackages, packageName],
dependencies,
prunedDeps,
prunedDeps[packageName][key]
);
}
}
}
});
}
function findPackageMeta(
packageMeta: PackageMeta[],
parentPackages: string[]
): PackageMeta {
const matchPackageVersionModifier =
(version: string) => (packageName: string) => {
const normalizedName = packageName.split('/').join('+');
if (version.includes(`_${normalizedName}@`)) {
return true;
}
};
const nestedDependency =
packageMeta.find((m) => {
const version = m.key.split('/').pop();
// it's modified by a single dependency
// e.g. /@org/my-package/1.0.0_@babel+core@1.2.3
return (
version.includes('_') &&
parentPackages.some(matchPackageVersionModifier(version))
);
}) ||
// it's not modified by a single dependency but a mix of them
// e.g. /@org/my-package/1.0.0_asfgasgasgasg
packageMeta.find((m) => m.key.split('/').pop().includes('_'));
if (nestedDependency) {
return nestedDependency;
}
// otherwise it's a root dependency
return packageMeta.find((m) => !m.key.split('/').pop().includes('_'));
}

View File

@ -0,0 +1,205 @@
import { ProjectGraphBuilder } from '../project-graph/project-graph-builder';
import {
ProjectGraph,
ProjectGraphExternalNode,
} from '../config/project-graph';
import { PackageJson } from '../utils/package-json';
import { reverse } from '../project-graph/operators';
import { satisfies } from 'semver';
/**
* Prune project graph's external nodes and their dependencies
* based on the pruned package.json
*/
export function pruneProjectGraph(
graph: ProjectGraph,
prunedPackageJson: PackageJson
): ProjectGraph {
const builder = new ProjectGraphBuilder();
const combinedDependencies = normalizeDependencies(prunedPackageJson, graph);
addNodesAndDependencies(graph, combinedDependencies, builder);
// for NPM (as well as the graph consistency)
// we need to distinguish between hoisted and non-hoisted dependencies
rehoistNodes(graph, combinedDependencies, builder);
return builder.getUpdatedProjectGraph();
}
// ensure that dependency ranges from package.json (e.g. ^1.0.0)
// are replaced with the actual version based on the available nodes (e.g. 1.0.1)
function normalizeDependencies(packageJson: PackageJson, graph: ProjectGraph) {
const {
dependencies,
devDependencies,
optionalDependencies,
peerDependencies,
} = packageJson;
const combinedDependencies = {
...dependencies,
...devDependencies,
...optionalDependencies,
...peerDependencies,
};
Object.entries(combinedDependencies).forEach(
([packageName, versionRange]) => {
if (graph.externalNodes[`npm:${packageName}@${versionRange}`]) {
return;
}
if (
graph.externalNodes[`npm:${packageName}`] &&
graph.externalNodes[`npm:${packageName}`].data.version === versionRange
) {
return;
}
// otherwise we need to find the correct version
const nodes = Object.values(graph.externalNodes).filter(
(n) => n.data.packageName === packageName
);
const node = nodes.find((n) => satisfies(n.data.version, versionRange));
if (node) {
combinedDependencies[packageName] = node.data.version;
} else {
throw new Error(
`Pruned lock file creation failed. The following package was not found in the root lock file: ${packageName}@${versionRange}`
);
}
}
);
return combinedDependencies;
}
function addNodesAndDependencies(
graph: ProjectGraph,
packageJsonDeps: Record<string, string>,
builder: ProjectGraphBuilder
) {
Object.entries(packageJsonDeps).forEach(([name, version]) => {
const node =
graph.externalNodes[`npm:${name}@${version}`] ||
graph.externalNodes[`npm:${name}`];
traverseNode(graph, builder, node);
});
}
function traverseNode(
graph: ProjectGraph,
builder: ProjectGraphBuilder,
node: ProjectGraphExternalNode
) {
if (builder.graph.externalNodes[node.name]) {
return;
}
builder.addExternalNode(node);
graph.dependencies[node.name]?.forEach((dep) => {
const depNode = graph.externalNodes[dep.target];
traverseNode(graph, builder, depNode);
builder.addExternalNodeDependency(node.name, dep.target);
});
}
function rehoistNodes(
graph: ProjectGraph,
packageJsonDeps: Record<string, string>,
builder: ProjectGraphBuilder
) {
const packagesToRehoist = new Map<string, ProjectGraphExternalNode[]>();
// find all packages that need to be rehoisted
Object.values(graph.externalNodes).forEach((node) => {
if (
node.name === `npm:${node.data.packageName}` &&
!builder.graph.externalNodes[node.name]
) {
const nestedNodes = Object.values(builder.graph.externalNodes).filter(
(n) => n.data.packageName === node.data.packageName
);
if (nestedNodes.length > 0) {
packagesToRehoist.set(node.data.packageName, nestedNodes);
}
}
});
// find new hoisted version
packagesToRehoist.forEach((nestedNodes) => {
if (nestedNodes.length === 1) {
switchNodeToHoisted(nestedNodes[0], builder);
} else {
// invert dependencies for easier traversal back
const invertedGraph = reverse(builder.graph);
let minDistance = Infinity;
let closest;
nestedNodes.forEach((node) => {
const distance = pathLengthToIncoming(
node,
packageJsonDeps,
builder,
invertedGraph
);
if (distance < minDistance) {
minDistance = distance;
closest = node;
}
});
switchNodeToHoisted(closest, builder);
}
});
}
function switchNodeToHoisted(
node: ProjectGraphExternalNode,
builder: ProjectGraphBuilder
) {
// make a copy of current name, all the dependencies and dependents
const previousName = node.name;
const targets = (builder.graph.dependencies[node.name] || []).map(
(d) => d.target
);
const sources: string[] = Object.keys(builder.graph.dependencies).filter(
(name) =>
builder.graph.dependencies[name].some((d) => d.target === previousName)
);
builder.removeNode(node.name);
// modify the node and re-add it
node.name = `npm:${node.data.packageName}`;
builder.addExternalNode(node);
targets.forEach((target) => {
builder.addExternalNodeDependency(node.name, target);
});
sources.forEach((source) =>
builder.addExternalNodeDependency(source, node.name)
);
}
// BFS to find the shortest path to a dependency specified in package.json
// package version with the shortest path is the one that should be hoisted
function pathLengthToIncoming(
node: ProjectGraphExternalNode,
packageJsonDeps: Record<string, string>,
builder: ProjectGraphBuilder,
invertedGraph: ProjectGraph
): number {
const visited = new Set<string>([node.name]);
const queue: Array<[ProjectGraphExternalNode, number]> = [[node, 0]];
while (queue.length > 0) {
const [current, distance] = queue.shift();
if (packageJsonDeps[current.data.packageName] === current.data.version) {
return distance;
}
for (let { target } of invertedGraph.dependencies[current.name] || []) {
if (!visited.has(target)) {
visited.add(target);
queue.push([builder.graph.externalNodes[target], distance + 1]);
}
}
}
}

View File

@ -1,85 +0,0 @@
import { defaultHashing } from '../../hasher/hashing-impl';
import {
ProjectGraph,
ProjectGraphExternalNode,
} from '../../config/project-graph';
import { PackageJsonDeps } from './pruning';
/**
* Apply simple hashing of the content using the default hashing implementation
* @param fileContent
* @returns
*/
export function hashString(fileContent: string): string {
return defaultHashing.hashArray([fileContent]);
}
/**
* Hash partial graph's external nodes
* for task graph caching
* @param projectGraph
*/
export function hashExternalNodes(projectGraph: ProjectGraph) {
Object.keys(projectGraph.externalNodes).forEach((key) => {
if (!projectGraph.externalNodes[key].data.hash) {
// hash it using it's dependencies
hashExternalNode(projectGraph.externalNodes[key], projectGraph);
}
});
}
function hashExternalNode(node: ProjectGraphExternalNode, graph: ProjectGraph) {
const hashKey = `${node.data.packageName}@${node.data.version}`;
if (!graph.dependencies[node.name]) {
node.data.hash = hashString(hashKey);
} else {
// collect all dependencies' hashes
const externalDependencies = traverseExternalNodesDependencies(
node.name,
graph,
new Set([hashKey])
);
node.data.hash = defaultHashing.hashArray(
Array.from(externalDependencies).sort()
);
}
}
function traverseExternalNodesDependencies(
projectName: string,
graph: ProjectGraph,
visited: Set<string>
): Set<string> {
graph.dependencies[projectName].forEach((d) => {
const target = graph.externalNodes[d.target];
if (!target) {
return;
}
const targetKey = `${target.data.packageName}@${target.data.version}`;
if (!visited.has(targetKey)) {
visited.add(targetKey);
if (graph.dependencies[d.target]) {
traverseExternalNodesDependencies(d.target, graph, visited);
}
}
});
return visited;
}
/**
* Generate new hash based on the original hash and pruning input parameters - packages and project name
* @param originalHash
* @param packages
* @param projectName
* @returns
*/
export function generatePrunnedHash(
originalHash: string,
normalizedPackageJson: PackageJsonDeps
) {
const hashingInput = [originalHash, JSON.stringify(normalizedPackageJson)];
return defaultHashing.hashArray(hashingInput);
}

View File

@ -1,17 +0,0 @@
export interface PackageDependency {
version?: string;
rootVersion?: boolean;
packageMeta: any[];
dependencies?: Record<string, string>;
optionalDependencies?: Record<string, string>;
name?: string;
[key: string]: any;
}
export type PackageVersions = Record<string, PackageDependency>;
export type LockFileData = {
dependencies: Record<string, PackageVersions>;
lockFileMetadata?: Record<string, any>;
hash: string;
};

View File

@ -1,172 +0,0 @@
import { ProjectGraph } from '../../config/project-graph';
import { workspaceRoot } from '../../utils/workspace-root';
import { existsSync, readFileSync } from 'fs';
import {
LockFileData,
PackageDependency,
PackageVersions,
} from './lock-file-type';
export type TransitiveLookupFunctionInput = {
packageName: string;
parentPackages: string[];
versions: PackageVersions;
version: string;
};
type TransitiveLookupFunction = (
data: TransitiveLookupFunctionInput
) => PackageDependency;
/**
* Checks whether the package is a root dependency
* @param packageName
* @param version
* @returns
*/
export function isRootVersion(packageName: string, version: string): boolean {
const fullPath = `${workspaceRoot}/node_modules/${packageName}/package.json`;
if (existsSync(fullPath)) {
const content = readFileSync(fullPath, 'utf-8');
return JSON.parse(content).version === version;
} else {
return false;
}
}
// Finds the maching version of each dependency of the package and
// maps each {package}:{versionRange} pair to "npm:{package}@{version}" (when transitive) or "npm:{package}" (when root)
function mapTransitiveDependencies(
parentPackages: string[],
packages: Record<string, PackageVersions>,
dependencies: Record<string, string>,
versionCache: Record<string, string>,
transitiveLookupFn: TransitiveLookupFunction
): string[] {
if (!dependencies) {
return [];
}
const result: string[] = [];
Object.keys(dependencies).forEach((packageName) => {
const versions = packages[packageName];
// some of the peer dependencies might not be installed,
// we don't have them as nodes in externalNodes
// so there's no need to map them as dependencies
if (!versions) {
return;
}
// fix for pnpm versions that might have suffixes - `1.2.3_@babel+core@4.5.6`
const version = dependencies[packageName].split('_')[0];
const key = `${packageName}@${version}`;
// if we already processed this dependency, use the version from the cache
if (versionCache[key]) {
result.push(versionCache[key]);
} else {
const matchedVersion = versions[`${packageName}@${version}`]
? version
: transitiveLookupFn({
packageName,
parentPackages,
versions,
version,
})?.version;
// for some peer dependencies, we won't find installed version so we'll just ignore these
if (matchedVersion) {
const nodeName = getNodeName(
packageName,
matchedVersion,
versions[`${packageName}@${matchedVersion}`]?.rootVersion
);
result.push(nodeName);
versionCache[key] = nodeName;
}
}
});
return result;
}
/**
* Returns node name depending on whether it's root version or nested
*/
export function getNodeName(
dep: string,
version: string,
rootVersion: boolean
): `npm:${string}` {
return rootVersion ? `npm:${dep}` : `npm:${dep}@${version}`;
}
/**
* Maps the lockfile data to the partial project graph
* using package manager specific {@link TransitiveLookupFunction}
*
* @param lockFileData
* @param transitiveLookupFn
* @returns
*/
export function mapExternalNodes(
lockFileData: LockFileData,
transitiveLookupFn: TransitiveLookupFunction
) {
const result: ProjectGraph = {
dependencies: {},
externalNodes: {},
nodes: {},
};
const versionCache: Record<string, string> = {};
Object.entries(lockFileData.dependencies).forEach(
([packageName, versions]) => {
Object.values(versions).forEach(
({ version, rootVersion, dependencies, peerDependencies }) => {
// save external node
const nodeName = getNodeName(packageName, version, rootVersion);
result.externalNodes[nodeName] = {
type: 'npm',
name: nodeName,
data: {
version,
packageName,
},
};
// combine dependencies and peerDependencies
const allDependencies =
dependencies || peerDependencies
? {
...(dependencies || {}),
...(peerDependencies || {}),
}
: undefined;
if (allDependencies) {
const nodeDependencies = [];
const transitiveDeps = mapTransitiveDependencies(
[packageName],
lockFileData.dependencies,
allDependencies,
versionCache,
transitiveLookupFn
);
transitiveDeps.forEach((target) => {
nodeDependencies.push({
type: 'static',
source: nodeName,
target,
});
});
result.dependencies[nodeName] = nodeDependencies;
}
}
);
}
);
return result;
}

View File

@ -0,0 +1,60 @@
import { existsSync, readFileSync } from 'fs';
import { PackageJson } from '../../utils/package-json';
import { workspaceRoot } from '../../utils/workspace-root';
/**
* Get version of hoisted package if available
*/
export function getHoistedPackageVersion(packageName: string): string {
const fullPath = `${workspaceRoot}/node_modules/${packageName}/package.json`;
if (existsSync(fullPath)) {
const content = readFileSync(fullPath, 'utf-8');
return JSON.parse(content)?.version;
}
if (process.env.NX_VERBOSE_LOGGING === 'true') {
console.warn(`Could not find ${fullPath}`);
}
return;
}
export type NormalizedPackageJson = Pick<
PackageJson,
| 'name'
| 'version'
| 'license'
| 'dependencies'
| 'devDependencies'
| 'peerDependencies'
| 'peerDependenciesMeta'
| 'optionalDependencies'
>;
/**
* Strip off non-pruning related fields from package.json
*/
export function normalizePackageJson(
packageJson: PackageJson
): NormalizedPackageJson {
const {
name,
version,
license,
dependencies,
devDependencies,
peerDependencies,
peerDependenciesMeta,
optionalDependencies,
} = packageJson;
return {
name,
version,
license,
dependencies,
devDependencies,
peerDependencies,
peerDependenciesMeta,
optionalDependencies,
};
}

View File

@ -0,0 +1,210 @@
/**
* This file contains the logic to convert pnpm lockfile to a standard format.
* It will convert inline specifiers to the separate specifiers format and ensure importers are present.
*/
import type {
Lockfile,
ProjectSnapshot,
ResolvedDependencies,
} from '@pnpm/lockfile-types';
import { dump, load } from '@zkochan/js-yaml';
import { existsSync, readFileSync } from 'fs';
import { workspaceRoot } from '../../utils/workspace-root';
const LOCKFILE_YAML_FORMAT = {
blankLines: true,
lineWidth: 1000,
noCompatMode: true,
noRefs: true,
sortKeys: false,
};
export function stringifyToPnpmYaml(lockfile: Lockfile): string {
return dump(lockfile, LOCKFILE_YAML_FORMAT);
}
export function parseAndNormalizePnpmLockfile(content: string): Lockfile {
const lockFileData = load(content);
return revertFromInlineSpecifiersFormatIfNecessary(
convertFromLockfileFileMutable(lockFileData)
);
}
export function loadPnpmHoistedDepsDefinition() {
const fullPath = `${workspaceRoot}/node_modules/.modules.yaml`;
if (existsSync(fullPath)) {
const content = readFileSync(fullPath, 'utf-8');
return load(content)?.hoistedDependencies;
} else {
throw new Error(`Could not find ".modules.yaml" at "${fullPath}"`);
}
}
/**
* THE FOLLOWING CODE IS COPIED FROM @pnpm/lockfile-file for convenience
*/
function isMutableLockfile(
lockfileFile:
| (Omit<Lockfile, 'importers'> &
Partial<ProjectSnapshot> &
Partial<Pick<Lockfile, 'importers'>>)
| InlineSpecifiersLockfile
| Lockfile
): lockfileFile is Omit<Lockfile, 'importers'> &
Partial<ProjectSnapshot> &
Partial<Pick<Lockfile, 'importers'>> {
return typeof lockfileFile['importers'] === 'undefined';
}
/**
* Reverts changes from the "forceSharedFormat" write option if necessary.
*/
function convertFromLockfileFileMutable(
lockfileFile:
| (Omit<Lockfile, 'importers'> &
Partial<ProjectSnapshot> &
Partial<Pick<Lockfile, 'importers'>>)
| InlineSpecifiersLockfile
| Lockfile
): InlineSpecifiersLockfile | Lockfile {
if (isMutableLockfile(lockfileFile)) {
lockfileFile.importers = {
'.': {
specifiers: lockfileFile['specifiers'] ?? {},
...(lockfileFile['dependenciesMeta'] && {
dependenciesMeta: lockfileFile['dependenciesMeta'],
}),
...(lockfileFile['publishDirectory'] && {
publishDirectory: lockfileFile['publishDirectory'],
}),
},
};
delete lockfileFile.specifiers;
for (const depType of DEPENDENCIES_FIELDS) {
if (lockfileFile[depType] != null) {
lockfileFile.importers['.'][depType] = lockfileFile[depType];
delete lockfileFile[depType];
}
}
return lockfileFile as Lockfile;
} else {
return lockfileFile;
}
}
interface InlineSpecifiersLockfile
extends Omit<Lockfile, 'lockfileVersion' | 'importers'> {
lockfileVersion: string;
importers: Record<string, InlineSpecifiersProjectSnapshot>;
}
interface InlineSpecifiersProjectSnapshot {
dependencies?: InlineSpecifiersResolvedDependencies;
devDependencies?: InlineSpecifiersResolvedDependencies;
optionalDependencies?: InlineSpecifiersResolvedDependencies;
dependenciesMeta?: ProjectSnapshot['dependenciesMeta'];
}
interface InlineSpecifiersResolvedDependencies {
[depName: string]: SpecifierAndResolution;
}
interface SpecifierAndResolution {
specifier: string;
version: string;
}
const INLINE_SPECIFIERS_FORMAT_LOCKFILE_VERSION_SUFFIX = '-inlineSpecifiers';
function isInlineSpecifierLockfile(
lockfile: InlineSpecifiersLockfile | Lockfile
): lockfile is InlineSpecifiersLockfile {
return (
typeof lockfile.lockfileVersion === 'string' &&
lockfile.lockfileVersion.endsWith(
INLINE_SPECIFIERS_FORMAT_LOCKFILE_VERSION_SUFFIX
)
);
}
function revertFromInlineSpecifiersFormatIfNecessary(
lockFile: InlineSpecifiersLockfile | Lockfile
): Lockfile {
if (isInlineSpecifierLockfile(lockFile)) {
const { lockfileVersion, importers, ...rest } = lockFile;
const originalVersionStr = lockfileVersion.replace(
INLINE_SPECIFIERS_FORMAT_LOCKFILE_VERSION_SUFFIX,
''
);
const originalVersion = Number(originalVersionStr);
if (isNaN(originalVersion)) {
throw new Error(
`Unable to revert lockfile from inline specifiers format. Invalid version parsed: ${originalVersionStr}`
);
}
const mappedImporters: Record<string, ProjectSnapshot> = {};
Object.entries(importers).forEach(([key, value]) => {
mappedImporters[key] = revertProjectSnapshot(value);
});
return {
...rest,
lockfileVersion: originalVersion,
importers: mappedImporters,
};
}
return lockFile;
}
function revertProjectSnapshot(
from: InlineSpecifiersProjectSnapshot
): ProjectSnapshot {
const specifiers: ResolvedDependencies = {};
function moveSpecifiers(
from: InlineSpecifiersResolvedDependencies
): ResolvedDependencies {
const resolvedDependencies: ResolvedDependencies = {};
for (const [depName, { specifier, version }] of Object.entries(from)) {
const existingValue = specifiers[depName];
if (existingValue != null && existingValue !== specifier) {
throw new Error(
`Project snapshot lists the same dependency more than once with conflicting versions: ${depName}`
);
}
specifiers[depName] = specifier;
resolvedDependencies[depName] = version;
}
return resolvedDependencies;
}
const dependencies: ResolvedDependencies = from.dependencies
? moveSpecifiers(from.dependencies)
: null;
const devDependencies: ResolvedDependencies = from.devDependencies
? moveSpecifiers(from.devDependencies)
: null;
const optionalDependencies: ResolvedDependencies = from.optionalDependencies
? moveSpecifiers(from.optionalDependencies)
: null;
return {
...from,
specifiers,
dependencies,
devDependencies,
optionalDependencies,
};
}
export const DEPENDENCIES_FIELDS = [
'optionalDependencies',
'dependencies',
'devDependencies',
];

View File

@ -1,44 +0,0 @@
import { PackageJson } from '../../utils/package-json';
export type PackageJsonDeps = Pick<
PackageJson,
| 'name'
| 'version'
| 'license'
| 'dependencies'
| 'devDependencies'
| 'peerDependencies'
| 'peerDependenciesMeta'
>;
/**
* Strip off non-pruning related fields from package.json
*
* @param packageJson
* @param isProduction
* @param projectName
* @returns
*/
export function normalizePackageJson(
packageJson: PackageJson
): PackageJsonDeps {
const {
name,
version,
license,
dependencies,
devDependencies,
peerDependencies,
peerDependenciesMeta,
} = packageJson;
return {
name,
version,
license,
dependencies,
devDependencies,
peerDependencies,
peerDependenciesMeta,
};
}

View File

@ -0,0 +1,926 @@
import { joinPathFragments } from '../utils/path';
import { parseYarnLockfile, stringifyYarnLockfile } from './yarn-parser';
import { pruneProjectGraph } from './project-graph-pruning';
import { vol } from 'memfs';
import { ProjectGraph } from '../config/project-graph';
import { PackageJson } from '../utils/package-json';
jest.mock('fs', () => require('memfs').fs);
jest.mock('@nrwl/devkit', () => ({
...jest.requireActual<any>('@nrwl/devkit'),
workspaceRoot: '/root',
}));
jest.mock('nx/src/utils/workspace-root', () => ({
workspaceRoot: '/root',
}));
describe('yarn LockFile utility', () => {
afterEach(() => {
vol.reset();
});
describe('next.js generated', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@jest/reporters/package.json': '{"version": "28.1.1"}',
'node_modules/@jest/test-result/package.json': '{"version": "28.1.3"}',
'node_modules/@jridgewell/gen-mapping/package.json':
'{"version": "0.3.2"}',
'node_modules/@jridgewell/trace-mapping/package.json':
'{"version": "0.3.17"}',
'node_modules/@rollup/pluginutils/package.json': '{"version": "3.1.0"}',
'node_modules/@swc/helpers/package.json': '{"version": "0.4.11"}',
'node_modules/@types/estree/package.json': '{"version": "1.0.0"}',
'node_modules/@types/node/package.json': '{"version": "18.11.9"}',
'node_modules/@types/react/package.json': '{"version": "18.0.25"}',
'node_modules/acorn-walk/package.json': '{"version": "8.2.0"}',
'node_modules/acorn/package.json': '{"version": "8.8.1"}',
'node_modules/ajv-keywords/package.json': '{"version": "3.5.2"}',
'node_modules/ajv/package.json': '{"version": "6.12.6"}',
'node_modules/ansi-styles/package.json': '{"version": "4.3.0"}',
'node_modules/argparse/package.json': '{"version": "2.0.1"}',
'node_modules/aria-query/package.json': '{"version": "4.2.2"}',
'node_modules/array-flatten/package.json': '{"version": "1.1.1"}',
'node_modules/array-union/package.json': '{"version": "2.1.0"}',
'node_modules/async/package.json': '{"version": "3.2.4"}',
'node_modules/babel-jest/package.json': '{"version": "28.1.1"}',
'node_modules/bluebird/package.json': '{"version": "3.7.2"}',
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/bytes/package.json': '{"version": "3.1.2"}',
'node_modules/camelcase/package.json': '{"version": "6.3.0"}',
'node_modules/chalk/package.json': '{"version": "4.1.2"}',
'node_modules/cliui/package.json': '{"version": "7.0.4"}',
'node_modules/color-convert/package.json': '{"version": "2.0.1"}',
'node_modules/color-name/package.json': '{"version": "1.1.4"}',
'node_modules/colorette/package.json': '{"version": "2.0.19"}',
'node_modules/commander/package.json': '{"version": "5.1.0"}',
'node_modules/core-util-is/package.json': '{"version": "1.0.2"}',
'node_modules/cosmiconfig/package.json': '{"version": "7.1.0"}',
'node_modules/cssom/package.json': '{"version": "0.5.0"}',
'node_modules/debug/package.json': '{"version": "4.3.4"}',
'node_modules/depd/package.json': '{"version": "2.0.0"}',
'node_modules/diff-sequences/package.json': '{"version": "28.1.1"}',
'node_modules/doctrine/package.json': '{"version": "2.1.0"}',
'node_modules/emoji-regex/package.json': '{"version": "9.2.2"}',
'node_modules/entities/package.json': '{"version": "4.4.0"}',
'node_modules/escape-string-regexp/package.json':
'{"version": "1.0.5"}',
'node_modules/eslint-scope/package.json': '{"version": "5.1.1"}',
'node_modules/eslint-visitor-keys/package.json': '{"version": "3.3.0"}',
'node_modules/estraverse/package.json': '{"version": "5.3.0"}',
'node_modules/estree-walker/package.json': '{"version": "2.0.2"}',
'node_modules/execa/package.json': '{"version": "5.1.1"}',
'node_modules/extsprintf/package.json': '{"version": "1.3.0"}',
'node_modules/fast-glob/package.json': '{"version": "3.2.12"}',
'node_modules/find-up/package.json': '{"version": "4.1.0"}',
'node_modules/form-data/package.json': '{"version": "4.0.0"}',
'node_modules/fs-extra/package.json': '{"version": "10.1.0"}',
'node_modules/get-stream/package.json': '{"version": "5.2.0"}',
'node_modules/glob-parent/package.json': '{"version": "5.1.2"}',
'node_modules/glob/package.json': '{"version": "7.2.3"}',
'node_modules/globals/package.json': '{"version": "11.12.0"}',
'node_modules/globby/package.json': '{"version": "11.1.0"}',
'node_modules/has-flag/package.json': '{"version": "4.0.0"}',
'node_modules/http-errors/package.json': '{"version": "2.0.0"}',
'node_modules/human-signals/package.json': '{"version": "2.1.0"}',
'node_modules/iconv-lite/package.json': '{"version": "0.4.24"}',
'node_modules/inherits/package.json': '{"version": "2.0.4"}',
'node_modules/ipaddr.js/package.json': '{"version": "2.0.1"}',
'node_modules/is-plain-object/package.json': '{"version": "2.0.4"}',
'node_modules/isarray/package.json': '{"version": "2.0.5"}',
'node_modules/jest-config/package.json': '{"version": "28.1.3"}',
'node_modules/jest-diff/package.json': '{"version": "28.1.3"}',
'node_modules/jest-get-type/package.json': '{"version": "28.0.2"}',
'node_modules/jest-matcher-utils/package.json': '{"version": "28.1.3"}',
'node_modules/jest-resolve/package.json': '{"version": "28.1.3"}',
'node_modules/jest-util/package.json': '{"version": "28.1.3"}',
'node_modules/jest-worker/package.json': '{"version": "28.1.3"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/jsesc/package.json': '{"version": "2.5.2"}',
'node_modules/json-schema-traverse/package.json':
'{"version": "0.4.1"}',
'node_modules/json5/package.json': '{"version": "2.2.1"}',
'node_modules/jsonfile/package.json': '{"version": "6.1.0"}',
'node_modules/levn/package.json': '{"version": "0.4.1"}',
'node_modules/loader-utils/package.json': '{"version": "2.0.4"}',
'node_modules/locate-path/package.json': '{"version": "5.0.0"}',
'node_modules/make-dir/package.json': '{"version": "3.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.1.2"}',
'node_modules/mkdirp/package.json': '{"version": "0.5.6"}',
'node_modules/ms/package.json': '{"version": "2.0.0"}',
'node_modules/optionator/package.json': '{"version": "0.9.1"}',
'node_modules/p-limit/package.json': '{"version": "3.1.0"}',
'node_modules/p-locate/package.json': '{"version": "4.1.0"}',
'node_modules/parse5/package.json': '{"version": "6.0.1"}',
'node_modules/pify/package.json': '{"version": "2.3.0"}',
'node_modules/pkg-dir/package.json': '{"version": "4.2.0"}',
'node_modules/postcss/package.json': '{"version": "8.4.20"}',
'node_modules/prelude-ls/package.json': '{"version": "1.1.2"}',
'node_modules/pretty-format/package.json': '{"version": "28.1.3"}',
'node_modules/proxy-from-env/package.json': '{"version": "1.0.0"}',
'node_modules/qs/package.json': '{"version": "6.11.0"}',
'node_modules/react-is/package.json': '{"version": "18.2.0"}',
'node_modules/readable-stream/package.json': '{"version": "3.6.0"}',
'node_modules/regenerator-runtime/package.json':
'{"version": "0.13.7"}',
'node_modules/resolve-from/package.json': '{"version": "5.0.0"}',
'node_modules/resolve/package.json': '{"version": "1.22.1"}',
'node_modules/rxjs/package.json': '{"version": "6.6.7"}',
'node_modules/safe-buffer/package.json': '{"version": "5.2.1"}',
'node_modules/schema-utils/package.json': '{"version": "3.1.1"}',
'node_modules/semver/package.json': '{"version": "6.3.0"}',
'node_modules/setprototypeof/package.json': '{"version": "1.2.0"}',
'node_modules/slash/package.json': '{"version": "3.0.0"}',
'node_modules/slice-ansi/package.json': '{"version": "3.0.0"}',
'node_modules/source-map-support/package.json': '{"version": "0.5.13"}',
'node_modules/source-map/package.json': '{"version": "0.6.1"}',
'node_modules/statuses/package.json': '{"version": "2.0.1"}',
'node_modules/string_decoder/package.json': '{"version": "1.3.0"}',
'node_modules/strip-bom/package.json': '{"version": "3.0.0"}',
'node_modules/supports-color/package.json': '{"version": "7.2.0"}',
'node_modules/tough-cookie/package.json': '{"version": "4.1.2"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/type-check/package.json': '{"version": "0.3.2"}',
'node_modules/type-fest/package.json': '{"version": "0.20.2"}',
'node_modules/universalify/package.json': '{"version": "2.0.0"}',
'node_modules/whatwg-url/package.json': '{"version": "10.0.0"}',
'node_modules/wrap-ansi/package.json': '{"version": "7.0.0"}',
};
vol.fromJSON(fileSys, '/root');
});
let lockFile;
let graph: ProjectGraph;
beforeEach(() => {
lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/yarn.lock'
)).default;
graph = parseYarnLockfile(lockFile);
});
it('should parse root lock file', async () => {
expect(Object.keys(graph.externalNodes).length).toEqual(1244); // 1104
});
it('should prune lock file', async () => {
const appPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/package.json'
));
// this is our pruned lock file structure
const prunedGraph = pruneProjectGraph(graph, appPackageJson);
expect(Object.keys(prunedGraph.externalNodes).length).toEqual(864);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
appPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/yarn.lock'
)).default
);
});
it('should match pruned lock file', () => {
const appPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/package.json'
));
const prunedGraph = pruneProjectGraph(graph, appPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
appPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/nextjs/app/yarn.lock'
)).default
);
});
});
describe('auxiliary packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/eslint-visitor-keys/package.json': '{"version": "3.3.0"}',
'node_modules/ignore/package.json': '{"version": "5.2.4"}',
'node_modules/minimatch/package.json': '{"version": "3.1.2"}',
};
vol.fromJSON(fileSys, '/root');
});
it('should parse yarn classic', async () => {
const classicLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn.lock'
)).default;
const graph = parseYarnLockfile(classicLockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(127); // 124 hoisted
expect(graph.externalNodes['npm:minimatch']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "3.1.2",
},
"name": "npm:minimatch",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:minimatch@5.1.1']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "5.1.1",
},
"name": "npm:minimatch@5.1.1",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:postgres']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "postgres",
"version": "https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "npm:postgres",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should prune yarn classic', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn.lock'
)).default;
const normalizedPackageJson = {
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '15.0.13',
'eslint-plugin-disable-autofix':
'npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0',
postgres:
'https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb',
yargs: '17.6.2',
},
devDependencies: {
react: '18.2.0',
},
};
const prunedLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn.lock.pruned'
)).default;
const graph = parseYarnLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, normalizedPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
normalizedPackageJson
);
expect(result).toEqual(prunedLockFile);
});
it('should prune yarn classic with package json with ranges', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn.lock'
)).default;
const normalizedPackageJson = {
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '^15.0.0',
'eslint-plugin-disable-autofix':
'npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0',
postgres:
'https://codeload.github.com/charsleysa/postgres/tar.gz/3b1a01b2da3e2fafb1a79006f838eff11a8de3cb',
yargs: '~17.6.0',
},
devDependencies: {
react: '>=18 < 19',
},
};
const prunedLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn.lock.pruned'
)).default;
const graph = parseYarnLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, normalizedPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
normalizedPackageJson
);
expect(result).toEqual(
prunedLockFile
.replace('"@nrwl/devkit@15.0.13":', '"@nrwl/devkit@^15.0.0":')
.replace('react@18.2.0:', '"react@>=18 < 19":')
.replace('yargs@17.6.2:', 'yargs@~17.6.0:')
);
});
it('should parse yarn berry', async () => {
const berryLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn-berry.lock'
)).default;
const graph = parseYarnLockfile(berryLockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(128); //124 hoisted
expect(graph.externalNodes['npm:minimatch']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "3.1.2",
},
"name": "npm:minimatch",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:minimatch@5.1.1']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "minimatch",
"version": "5.1.1",
},
"name": "npm:minimatch@5.1.1",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:postgres']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "postgres",
"version": "https://github.com/charsleysa/postgres.git#commit=3b1a01b2da3e2fafb1a79006f838eff11a8de3cb",
},
"name": "npm:postgres",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:eslint-plugin-disable-autofix'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "eslint-plugin-disable-autofix",
"version": "npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0",
},
"name": "npm:eslint-plugin-disable-autofix",
"type": "npm",
}
`);
});
it('should prune yarn berry', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn-berry.lock'
)).default;
const normalizedPackageJson = {
name: 'test',
version: '0.0.0',
license: 'MIT',
dependencies: {
'@nrwl/devkit': '15.0.13',
'eslint-plugin-disable-autofix':
'npm:@mattlewis92/eslint-plugin-disable-autofix@3.0.0',
postgres:
'https://github.com/charsleysa/postgres.git#commit=3b1a01b2da3e2fafb1a79006f838eff11a8de3cb',
yargs: '17.6.2',
},
devDependencies: {
react: '18.2.0',
},
};
const prunedLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/auxiliary-packages/yarn-berry.lock.pruned'
)).default;
const graph = parseYarnLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, normalizedPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
normalizedPackageJson
);
expect(result.split('\n').slice(2)).toEqual(
prunedLockFile.split('\n').slice(2)
);
});
});
describe('duplicate packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@jest/test-result/package.json': '{"version": "28.1.3"}',
'node_modules/@jridgewell/gen-mapping/package.json':
'{"version": "0.1.1"}',
'node_modules/@nrwl/cli/package.json': '{"version": "15.4.0"}',
'node_modules/@nrwl/tao/package.json': '{"version": "15.4.0"}',
'node_modules/ansi-styles/package.json': '{"version": "4.3.0"}',
'node_modules/argparse/package.json': '{"version": "2.0.1"}',
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/camelcase/package.json': '{"version": "6.3.0"}',
'node_modules/chalk/package.json': '{"version": "4.1.2"}',
'node_modules/cliui/package.json': '{"version": "7.0.4"}',
'node_modules/color-convert/package.json': '{"version": "2.0.1"}',
'node_modules/color-name/package.json': '{"version": "1.1.4"}',
'node_modules/escape-string-regexp/package.json':
'{"version": "1.0.5"}',
'node_modules/glob/package.json': '{"version": "7.2.3"}',
'node_modules/has-flag/package.json': '{"version": "4.0.0"}',
'node_modules/jest-resolve/package.json': '{"version": "28.1.3"}',
'node_modules/jest-util/package.json': '{"version": "28.1.3"}',
'node_modules/js-yaml/package.json': '{"version": "3.14.1"}',
'node_modules/json5/package.json': '{"version": "1.0.2"}',
'node_modules/lru-cache/package.json': '{"version": "6.0.0"}',
'node_modules/minimatch/package.json': '{"version": "3.1.2"}',
'node_modules/nx/package.json': '{"version": "15.4.0"}',
'node_modules/p-limit/package.json': '{"version": "3.1.0"}',
'node_modules/semver/package.json': '{"version": "6.3.0"}',
'node_modules/strip-bom/package.json': '{"version": "3.0.0"}',
'node_modules/supports-color/package.json': '{"version": "7.2.0"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/yallist/package.json': '{"version": "4.0.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
vol.fromJSON(fileSys, '/root');
});
it('should parse root lock file', async () => {
const classicLockFile = require(joinPathFragments(
__dirname,
'__fixtures__/duplicate-package/yarn.lock'
)).default;
const graph = parseYarnLockfile(classicLockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(371); //337 hoisted
});
});
describe('optional packages', () => {
beforeEach(() => {
const fileSys = {
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/glob/package.json': '{"version": "7.2.3"}',
'node_modules/lru-cache/package.json': '{"version": "7.14.1"}',
'node_modules/minimatch/package.json': '{"version": "3.1.2"}',
'node_modules/minipass/package.json': '{"version": "3.3.6"}',
'node_modules/ms/package.json': '{"version": "2.1.3"}',
'node_modules/ssh2/package.json': '{"version": "1.11.0"}',
};
vol.fromJSON(fileSys, '/root');
});
it('should match parsed and pruned graph', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/optional/yarn.lock'
)).default;
const packageJson = require(joinPathFragments(
__dirname,
'__fixtures__/optional/package.json'
));
const graph = parseYarnLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(103);
const prunedGraph = pruneProjectGraph(graph, packageJson);
expect(graph).toEqual(prunedGraph);
});
});
describe('pruning', () => {
beforeEach(() => {
const fileSys = {
'node_modules/@jest/test-result/package.json': '{"version": "28.1.3"}',
'node_modules/@jridgewell/gen-mapping/package.json':
'{"version": "0.1.1"}',
'node_modules/ansi-styles/package.json': '{"version": "4.3.0"}',
'node_modules/argparse/package.json': '{"version": "2.0.1"}',
'node_modules/brace-expansion/package.json': '{"version": "1.1.11"}',
'node_modules/camelcase/package.json': '{"version": "6.3.0"}',
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/cliui/package.json': '{"version": "7.0.4"}',
'node_modules/color-convert/package.json': '{"version": "2.0.1"}',
'node_modules/color-name/package.json': '{"version": "1.1.4"}',
'node_modules/escape-string-regexp/package.json':
'{"version": "1.0.5"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/has-flag/package.json': '{"version": "4.0.0"}',
'node_modules/jest-resolve/package.json': '{"version": "28.1.3"}',
'node_modules/jest-util/package.json': '{"version": "28.1.3"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/json5/package.json': '{"version": "2.2.3"}',
'node_modules/lru-cache/package.json': '{"version": "6.0.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/p-limit/package.json': '{"version": "3.1.0"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/strip-bom/package.json': '{"version": "3.0.0"}',
'node_modules/supports-color/package.json': '{"version": "7.2.0"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/yallist/package.json': '{"version": "4.0.0"}',
'node_modules/@nodelib/fs.scandir/package.json': '{"version": "2.1.5"}',
'node_modules/@nodelib/fs.stat/package.json': '{"version": "2.0.5"}',
'node_modules/@nodelib/fs.walk/package.json': '{"version": "1.2.8"}',
'node_modules/@nrwl/cli/package.json': '{"version": "15.4.5"}',
'node_modules/@nrwl/devkit/package.json': '{"version": "15.4.5"}',
'node_modules/@nrwl/linter/package.json': '{"version": "15.4.5"}',
'node_modules/@nrwl/tao/package.json': '{"version": "15.4.5"}',
'node_modules/@nrwl/workspace/package.json': '{"version": "15.4.5"}',
'node_modules/@parcel/watcher/package.json': '{"version": "2.0.4"}',
'node_modules/@phenomnomnominal/tsquery/package.json':
'{"version": "4.1.1"}',
'node_modules/@yarnpkg/lockfile/package.json': '{"version": "1.1.0"}',
'node_modules/@yarnpkg/parsers/package.json':
'{"version": "3.0.0-rc.35"}',
'node_modules/@zkochan/js-yaml/package.json': '{"version": "0.0.6"}',
'node_modules/ansi-colors/package.json': '{"version": "4.1.3"}',
'node_modules/ansi-regex/package.json': '{"version": "5.0.1"}',
'node_modules/anymatch/package.json': '{"version": "3.1.3"}',
'node_modules/async/package.json': '{"version": "3.2.4"}',
'node_modules/asynckit/package.json': '{"version": "0.4.0"}',
'node_modules/axios/package.json': '{"version": "1.2.2"}',
'node_modules/balanced-match/package.json': '{"version": "1.0.2"}',
'node_modules/base64-js/package.json': '{"version": "1.5.1"}',
'node_modules/binary-extensions/package.json': '{"version": "2.2.0"}',
'node_modules/bl/package.json': '{"version": "4.1.0"}',
'node_modules/braces/package.json': '{"version": "3.0.2"}',
'node_modules/buffer/package.json': '{"version": "5.7.1"}',
'node_modules/chokidar/package.json': '{"version": "3.5.3"}',
'node_modules/cli-cursor/package.json': '{"version": "3.1.0"}',
'node_modules/cli-spinners/package.json': '{"version": "2.6.1"}',
'node_modules/combined-stream/package.json': '{"version": "1.0.8"}',
'node_modules/concat-map/package.json': '{"version": "0.0.1"}',
'node_modules/define-lazy-prop/package.json': '{"version": "2.0.0"}',
'node_modules/delayed-stream/package.json': '{"version": "1.0.0"}',
'node_modules/dotenv/package.json': '{"version": "10.0.0"}',
'node_modules/duplexer/package.json': '{"version": "0.1.2"}',
'node_modules/ejs/package.json': '{"version": "3.1.8"}',
'node_modules/emoji-regex/package.json': '{"version": "8.0.0"}',
'node_modules/end-of-stream/package.json': '{"version": "1.4.4"}',
'node_modules/enquirer/package.json': '{"version": "2.3.6"}',
'node_modules/escalade/package.json': '{"version": "3.1.1"}',
'node_modules/esprima/package.json': '{"version": "4.0.1"}',
'node_modules/esquery/package.json': '{"version": "1.4.0"}',
'node_modules/estraverse/package.json': '{"version": "5.3.0"}',
'node_modules/fast-glob/package.json': '{"version": "3.2.7"}',
'node_modules/fastq/package.json': '{"version": "1.15.0"}',
'node_modules/figures/package.json': '{"version": "3.2.0"}',
'node_modules/filelist/package.json': '{"version": "1.0.4"}',
'node_modules/fill-range/package.json': '{"version": "7.0.1"}',
'node_modules/flat/package.json': '{"version": "5.0.2"}',
'node_modules/follow-redirects/package.json': '{"version": "1.15.2"}',
'node_modules/form-data/package.json': '{"version": "4.0.0"}',
'node_modules/fs-constants/package.json': '{"version": "1.0.0"}',
'node_modules/fs-extra/package.json': '{"version": "10.1.0"}',
'node_modules/fs.realpath/package.json': '{"version": "1.0.0"}',
'node_modules/fsevents/package.json': '{"version": "2.3.2"}',
'node_modules/get-caller-file/package.json': '{"version": "2.0.5"}',
'node_modules/glob-parent/package.json': '{"version": "5.1.2"}',
'node_modules/graceful-fs/package.json': '{"version": "4.2.10"}',
'node_modules/ieee754/package.json': '{"version": "1.2.1"}',
'node_modules/ignore/package.json': '{"version": "5.2.4"}',
'node_modules/inflight/package.json': '{"version": "1.0.6"}',
'node_modules/inherits/package.json': '{"version": "2.0.4"}',
'node_modules/is-binary-path/package.json': '{"version": "2.1.0"}',
'node_modules/is-docker/package.json': '{"version": "2.2.1"}',
'node_modules/is-extglob/package.json': '{"version": "2.1.1"}',
'node_modules/is-fullwidth-code-point/package.json':
'{"version": "3.0.0"}',
'node_modules/is-glob/package.json': '{"version": "4.0.3"}',
'node_modules/is-number/package.json': '{"version": "7.0.0"}',
'node_modules/is-wsl/package.json': '{"version": "2.2.0"}',
'node_modules/jake/package.json': '{"version": "10.8.5"}',
'node_modules/jsonc-parser/package.json': '{"version": "3.2.0"}',
'node_modules/jsonfile/package.json': '{"version": "6.1.0"}',
'node_modules/merge2/package.json': '{"version": "1.4.1"}',
'node_modules/micromatch/package.json': '{"version": "4.0.5"}',
'node_modules/mime-db/package.json': '{"version": "1.52.0"}',
'node_modules/mime-types/package.json': '{"version": "2.1.35"}',
'node_modules/mimic-fn/package.json': '{"version": "2.1.0"}',
'node_modules/minimist/package.json': '{"version": "1.2.7"}',
'node_modules/node-addon-api/package.json': '{"version": "3.2.1"}',
'node_modules/node-gyp-build/package.json': '{"version": "4.6.0"}',
'node_modules/normalize-path/package.json': '{"version": "3.0.0"}',
'node_modules/npm-run-path/package.json': '{"version": "4.0.1"}',
'node_modules/nx/package.json': '{"version": "15.4.5"}',
'node_modules/once/package.json': '{"version": "1.4.0"}',
'node_modules/onetime/package.json': '{"version": "5.1.2"}',
'node_modules/open/package.json': '{"version": "8.4.0"}',
'node_modules/path-is-absolute/package.json': '{"version": "1.0.1"}',
'node_modules/path-key/package.json': '{"version": "3.1.1"}',
'node_modules/picomatch/package.json': '{"version": "2.3.1"}',
'node_modules/prettier/package.json': '{"version": "2.8.2"}',
'node_modules/proxy-from-env/package.json': '{"version": "1.1.0"}',
'node_modules/queue-microtask/package.json': '{"version": "1.2.3"}',
'node_modules/readable-stream/package.json': '{"version": "3.6.0"}',
'node_modules/readdirp/package.json': '{"version": "3.6.0"}',
'node_modules/require-directory/package.json': '{"version": "2.1.1"}',
'node_modules/restore-cursor/package.json': '{"version": "3.1.0"}',
'node_modules/reusify/package.json': '{"version": "1.0.4"}',
'node_modules/rimraf/package.json': '{"version": "3.0.2"}',
'node_modules/run-parallel/package.json': '{"version": "1.2.0"}',
'node_modules/rxjs/package.json': '{"version": "6.6.7"}',
'node_modules/safe-buffer/package.json': '{"version": "5.2.1"}',
'node_modules/signal-exit/package.json': '{"version": "3.0.7"}',
'node_modules/sprintf-js/package.json': '{"version": "1.0.3"}',
'node_modules/string-width/package.json': '{"version": "4.2.3"}',
'node_modules/string_decoder/package.json': '{"version": "1.3.0"}',
'node_modules/strip-ansi/package.json': '{"version": "6.0.1"}',
'node_modules/strong-log-transformer/package.json':
'{"version": "2.1.0"}',
'node_modules/tar-stream/package.json': '{"version": "2.2.0"}',
'node_modules/through/package.json': '{"version": "2.3.8"}',
'node_modules/tmp/package.json': '{"version": "0.2.1"}',
'node_modules/to-regex-range/package.json': '{"version": "5.0.1"}',
'node_modules/tsconfig-paths/package.json': '{"version": "4.1.2"}',
'node_modules/typescript/package.json': '{"version": "4.8.4"}',
'node_modules/universalify/package.json': '{"version": "2.0.0"}',
'node_modules/util-deprecate/package.json': '{"version": "1.0.2"}',
'node_modules/v8-compile-cache/package.json': '{"version": "2.3.0"}',
'node_modules/wrap-ansi/package.json': '{"version": "7.0.0"}',
'node_modules/wrappy/package.json': '{"version": "1.0.2"}',
'node_modules/y18n/package.json': '{"version": "5.0.8"}',
'node_modules/yargs/package.json': '{"version": "17.6.2"}',
'node_modules/yargs-parser/package.json': '{"version": "21.1.1"}',
};
vol.fromJSON(fileSys, '/root');
});
it('should prune single package', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/yarn.lock'
)).default;
const typescriptPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/package.json'
));
const graph = parseYarnLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, typescriptPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
typescriptPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/typescript/yarn.lock'
)).default
);
});
it('should prune multi packages', () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/yarn.lock'
)).default;
const multiPackageJson = require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/package.json'
));
const graph = parseYarnLockfile(lockFile);
const prunedGraph = pruneProjectGraph(graph, multiPackageJson);
const result = stringifyYarnLockfile(
prunedGraph,
lockFile,
multiPackageJson
);
expect(result).toEqual(
require(joinPathFragments(
__dirname,
'__fixtures__/pruning/devkit-yargs/yarn.lock'
)).default
);
});
});
describe('workspaces', () => {
beforeEach(() => {
const fileSys = {
'packages/package-a/package.json':
'{"name": "package-a", "version": "0.0.1", "dependencies": { "react": "18" } }',
'node_modules/react/package.json': '{"version": "17.0.2"}',
};
vol.fromJSON(fileSys, '/root');
});
it('should parse classic lock file', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/yarn.lock'
)).default;
const graph = parseYarnLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(5);
});
it('should parse berry lock file', async () => {
const lockFile = require(joinPathFragments(
__dirname,
'__fixtures__/workspaces/yarn.lock.berry'
)).default;
const graph = parseYarnLockfile(lockFile);
expect(Object.keys(graph.externalNodes).length).toEqual(5);
});
});
describe('different registry', () => {
const prunedPackageJson: PackageJson = {
name: '@my-ns/example',
version: '0.0.1',
type: 'commonjs',
dependencies: {
'@gitlab-examples/semantic-release-npm': '2.0.1',
},
peerDependencies: {
tslib: '2.5.0',
},
main: './src/index.js',
types: './src/index.d.ts',
};
it('should parse and prune classic', () => {
const lockFile = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@gitlab-examples/semantic-release-npm@^2.0.1":
version "2.0.1"
resolved "https://gitlab.com/api/v4/projects/22738259/packages/npm/@gitlab-examples/semantic-release-npm/-/@gitlab-examples/semantic-release-npm-2.0.1.tgz#923345c3fdc51c6cdf921e7c0e9b43e999caa61a"
integrity sha1-kjNFw/3FHGzfkh58DptD6ZnKpho=
tslib@^2.3.0, tslib@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
`;
const graph = parseYarnLockfile(lockFile);
expect(graph.externalNodes['npm:tslib']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "tslib",
"version": "2.5.0",
},
"name": "npm:tslib",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:@gitlab-examples/semantic-release-npm'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "@gitlab-examples/semantic-release-npm",
"version": "2.0.1",
},
"name": "npm:@gitlab-examples/semantic-release-npm",
"type": "npm",
}
`);
const prunedGraph = pruneProjectGraph(graph, prunedPackageJson);
expect(stringifyYarnLockfile(prunedGraph, lockFile, prunedPackageJson))
.toMatchInlineSnapshot(`
"# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
\\"@gitlab-examples/semantic-release-npm@2.0.1\\":
version \\"2.0.1\\"
resolved \\"https://gitlab.com/api/v4/projects/22738259/packages/npm/@gitlab-examples/semantic-release-npm/-/@gitlab-examples/semantic-release-npm-2.0.1.tgz#923345c3fdc51c6cdf921e7c0e9b43e999caa61a\\"
integrity sha1-kjNFw/3FHGzfkh58DptD6ZnKpho=
tslib@2.5.0:
version \\"2.5.0\\"
resolved \\"https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf\\"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
"
`);
});
it('should parse and prune berry', () => {
const lockFile = `# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 6
cacheKey: 8
"@gar/promisify@npm:^1.1.3":
version: 1.1.3
resolution: "@gar/promisify@npm:1.1.3"
checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1
languageName: node
linkType: hard
"@gitlab-examples/semantic-release-npm@npm:^2.0.1":
version: 2.0.1
resolution: "@gitlab-examples/semantic-release-npm@npm:2.0.1::__archiveUrl=https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%2Fprojects%2F22738259%2Fpackages%2Fnpm%2F%40gitlab-examples%2Fsemantic-release-npm%2F-%2F%40gitlab-examples%2Fsemantic-release-npm-2.0.1.tgz"
checksum: 1944ac24ebb3e7c30db4fe743b75f0bb3b82a0c142c9ba435aa8224005fcc2bc709e21cec109c6f67d6290e0abb6032a55eaca38ca950711bf03317d128db30a
languageName: node
linkType: hard
"tslib@npm:^2.3.0, tslib@npm:^2.4.0":
version: 2.5.0
resolution: "tslib@npm:2.5.0"
checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1
languageName: node
linkType: hard
`;
const graph = parseYarnLockfile(lockFile);
expect(graph.externalNodes['npm:tslib']).toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "tslib",
"version": "2.5.0",
},
"name": "npm:tslib",
"type": "npm",
}
`);
expect(graph.externalNodes['npm:@gitlab-examples/semantic-release-npm'])
.toMatchInlineSnapshot(`
Object {
"data": Object {
"packageName": "@gitlab-examples/semantic-release-npm",
"version": "2.0.1",
},
"name": "npm:@gitlab-examples/semantic-release-npm",
"type": "npm",
}
`);
const prunedGraph = pruneProjectGraph(graph, prunedPackageJson);
expect(stringifyYarnLockfile(prunedGraph, lockFile, prunedPackageJson))
.toMatchInlineSnapshot(`
"# This file was generated by Nx. Do not edit this file directly
# Manual changes might be lost - proceed with caution!
__metadata:
version: 6
cacheKey: 8
\\"@gitlab-examples/semantic-release-npm@npm:2.0.1\\":
version: 2.0.1
resolution: \\"@gitlab-examples/semantic-release-npm@npm:2.0.1::__archiveUrl=https%3A%2F%2Fgitlab.com%2Fapi%2Fv4%2Fprojects%2F22738259%2Fpackages%2Fnpm%2F%40gitlab-examples%2Fsemantic-release-npm%2F-%2F%40gitlab-examples%2Fsemantic-release-npm-2.0.1.tgz\\"
checksum: 1944ac24ebb3e7c30db4fe743b75f0bb3b82a0c142c9ba435aa8224005fcc2bc709e21cec109c6f67d6290e0abb6032a55eaca38ca950711bf03317d128db30a
languageName: node
linkType: hard
\\"@my-ns/example@workspace:.\\":
version: 0.0.0-use.local
resolution: \\"@my-ns/example@workspace:.\\"
dependencies:
\\"@gitlab-examples/semantic-release-npm\\": 2.0.1
peerDependencies:
tslib: 2.5.0
languageName: unknown
linkType: soft
\\"tslib@npm:2.5.0\\":
version: 2.5.0
resolution: \\"tslib@npm:2.5.0\\"
checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1
languageName: node
linkType: hard
"
`);
});
});
});

View File

@ -0,0 +1,429 @@
import { parseSyml, stringifySyml } from '@yarnpkg/parsers';
import { stringify } from '@yarnpkg/lockfile';
import { sortObjectByKeys } from '../utils/object-sort';
import { getHoistedPackageVersion } from './utils/package-json';
import {
ProjectGraph,
ProjectGraphExternalNode,
} from '../config/project-graph';
import { ProjectGraphBuilder } from '../project-graph/project-graph-builder';
import { satisfies } from 'semver';
import { NormalizedPackageJson } from './utils/package-json';
/**
* Yarn
* - Classic has resolved and integrity
* - Berry has resolution, checksum, languageName and linkType
*/
type YarnLockFile = {
__metadata?: {};
} & Record<string, YarnDependency>;
type YarnDependency = {
version: string;
dependencies?: Record<string, string>;
optionalDependencies?: Record<string, string>;
peerDependencies?: Record<string, string>;
// classic specific
resolved?: string;
integrity?: string;
// berry specific
resolution?: string;
checksum?: string;
languageName?: string;
linkType?: 'soft' | 'hard';
};
export function parseYarnLockfile(lockFileContent: string): ProjectGraph {
const data = parseSyml(lockFileContent);
const builder = new ProjectGraphBuilder();
// we use key => node map to avoid duplicate work when parsing keys
const keyMap = new Map<string, ProjectGraphExternalNode>();
addNodes(data, builder, keyMap);
addDependencies(data, builder, keyMap);
return builder.getUpdatedProjectGraph();
}
function addNodes(
{ __metadata, ...dependencies }: YarnLockFile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
const isBerry = !!__metadata;
const nodes: Map<string, Map<string, ProjectGraphExternalNode>> = new Map();
Object.entries(dependencies).forEach(([keys, snapshot]) => {
// ignore workspace projects
if (snapshot.linkType === 'soft') {
return;
}
const packageName = keys.slice(0, keys.indexOf('@', 1));
const version = findVersion(
packageName,
keys.split(', ')[0],
snapshot,
isBerry
);
keys.split(', ').forEach((key) => {
// we don't need to keep duplicates, we can just track the keys
const existingNode = nodes.get(packageName)?.get(version);
if (existingNode) {
keyMap.set(key, existingNode);
return;
}
const node: ProjectGraphExternalNode = {
type: 'npm',
name: `npm:${packageName}@${version}`,
data: {
version,
packageName,
},
};
keyMap.set(key, node);
if (!nodes.has(packageName)) {
nodes.set(packageName, new Map([[version, node]]));
} else {
nodes.get(packageName).set(version, node);
}
});
});
for (const [packageName, versionMap] of nodes.entries()) {
let hoistedNode: ProjectGraphExternalNode;
if (versionMap.size === 1) {
hoistedNode = versionMap.values().next().value;
} else {
const hoistedVersion = getHoistedVersion(packageName);
hoistedNode = versionMap.get(hoistedVersion);
}
if (hoistedNode) {
hoistedNode.name = `npm:${packageName}`;
}
versionMap.forEach((node) => {
builder.addExternalNode(node);
});
}
}
function findVersion(
packageName: string,
key: string,
snapshot: YarnDependency,
isBerry: boolean
): string {
const versionRange = key.slice(packageName.length + 1);
// check for alias packages
const isAlias = isBerry
? snapshot.resolution && !snapshot.resolution.startsWith(`${packageName}@`)
: versionRange.startsWith('npm:');
if (isAlias) {
return versionRange;
}
// check for berry tarball packages
if (
isBerry &&
snapshot.resolution &&
// different registry would yield suffix following '::' which we don't need
snapshot.resolution.split('::')[0] !==
`${packageName}@npm:${snapshot.version}`
) {
return snapshot.resolution.slice(packageName.length + 1);
}
if (!isBerry && !satisfies(snapshot.version, versionRange)) {
return snapshot.resolved;
}
// otherwise it's a standard version
return snapshot.version;
}
function getHoistedVersion(packageName: string): string {
const version = getHoistedPackageVersion(packageName);
if (version) {
return version;
}
}
function addDependencies(
{ __metadata, ...dependencies }: YarnLockFile,
builder: ProjectGraphBuilder,
keyMap: Map<string, ProjectGraphExternalNode>
) {
Object.keys(dependencies).forEach((keys) => {
const snapshot = dependencies[keys];
keys.split(', ').forEach((key) => {
if (keyMap.has(key)) {
const node = keyMap.get(key);
[snapshot.dependencies, snapshot.optionalDependencies].forEach(
(section) => {
if (section) {
Object.entries(section).forEach(([name, versionRange]) => {
const target =
keyMap.get(`${name}@npm:${versionRange}`) ||
keyMap.get(`${name}@${versionRange}`);
if (target) {
builder.addExternalNodeDependency(node.name, target.name);
}
});
}
}
);
}
});
});
}
export function stringifyYarnLockfile(
graph: ProjectGraph,
rootLockFileContent: string,
packageJson: NormalizedPackageJson
): string {
const { __metadata, ...dependencies } = parseSyml(rootLockFileContent);
const isBerry = !!__metadata;
const snapshots = mapSnapshots(
dependencies,
graph.externalNodes,
packageJson,
isBerry
);
if (isBerry) {
// add root workspace package
const workspacePackage = generateRootWorkspacePackage(packageJson);
snapshots[workspacePackage.resolution] = workspacePackage;
return (
BERRY_LOCK_FILE_DISCLAIMER +
stringifySyml({
__metadata,
...sortObjectByKeys(snapshots),
})
);
} else {
return stringify(sortObjectByKeys(snapshots));
}
}
function groupDependencies(
dependencies: Record<string, YarnDependency>
): Record<string, YarnDependency> {
let groupedDependencies: Record<string, YarnDependency>;
const resolutionMap = new Map<string, YarnDependency>();
const snapshotMap = new Map<YarnDependency, Set<string>>();
Object.entries(dependencies).forEach(([key, snapshot]) => {
const resolutionKey = `${snapshot.resolution}${snapshot.integrity}`;
if (resolutionMap.has(resolutionKey)) {
const existingSnapshot = resolutionMap.get(resolutionKey);
snapshotMap.get(existingSnapshot).add(key);
} else {
resolutionMap.set(resolutionKey, snapshot);
snapshotMap.set(snapshot, new Set([key]));
}
});
groupedDependencies = {};
snapshotMap.forEach((keys, snapshot) => {
groupedDependencies[Array.from(keys).join(', ')] = snapshot;
});
return groupedDependencies;
}
function addPackageVersion(
packageName: string,
version: string,
collection: Map<string, Set<string>>,
isBerry?: boolean
) {
if (!collection.has(packageName)) {
collection.set(packageName, new Set());
}
collection.get(packageName).add(`${packageName}@${version}`);
if (isBerry && !version.startsWith('npm:')) {
collection.get(packageName).add(`${packageName}@npm:${version}`);
}
}
function mapSnapshots(
dependencies: Record<string, YarnDependency>,
nodes: Record<string, ProjectGraphExternalNode>,
packageJson: NormalizedPackageJson,
isBerry: boolean
): Record<string, YarnDependency> {
// map snapshot to set of keys (e.g. `eslint@^7.0.0, eslint@npm:^7.0.0`)
const snapshotMap: Map<YarnDependency, Set<string>> = new Map();
// track all existing dependencies's keys
const existingKeys = new Map<string, Set<string>>();
const combinedDependencies = {
...packageJson.dependencies,
...packageJson.devDependencies,
...packageJson.optionalDependencies,
...packageJson.peerDependencies,
};
let groupedDependencies: Record<string, YarnDependency>;
if (isBerry) {
groupedDependencies = dependencies;
} else {
// yarn classic splits keys when parsing so we need to stich them back together
groupedDependencies = groupDependencies(dependencies);
}
// collect snapshots and their matching keys
Object.values(nodes).forEach((node) => {
const [matchedKeys, snapshot] = findOriginalKeys(groupedDependencies, node);
snapshotMap.set(snapshot, new Set(matchedKeys));
// separately save keys that still exist
[snapshot.dependencies, snapshot.optionalDependencies].forEach(
(section) => {
Object.entries(section || {}).forEach(([name, versionSpec]) =>
addPackageVersion(name, versionSpec, existingKeys, isBerry)
);
}
);
// add package.json requested version to keys
const requestedVersion = getPackageJsonVersion(combinedDependencies, node);
if (requestedVersion) {
addPackageVersion(
node.data.packageName,
requestedVersion,
existingKeys,
isBerry
);
const requestedKey = isBerry
? reverseMapBerryKey(node, requestedVersion, snapshot)
: `${node.data.packageName}@${requestedVersion}`;
if (!snapshotMap.get(snapshot).has(requestedKey)) {
snapshotMap.get(snapshot).add(requestedKey);
}
}
});
// remove keys that match version ranges that have been pruned away
snapshotMap.forEach((keysSet) => {
for (const key of keysSet.values()) {
const packageName = key.slice(0, key.indexOf('@', 1));
if (!existingKeys.get(packageName).has(key)) {
keysSet.delete(key);
}
}
});
// join mapped snapshots to lock json file
const result: Record<string, YarnDependency> = {};
snapshotMap.forEach((keysSet, snapshot) => {
if (isBerry) {
result[Array.from(keysSet).sort().join(', ')] = snapshot;
} else {
for (const key of keysSet.values()) {
result[key] = snapshot;
}
}
});
return result;
}
function reverseMapBerryKey(
node: ProjectGraphExternalNode,
version: string,
snapshot: YarnDependency
): string {
// alias packages already have version
if (version.startsWith('npm:')) {
`${node.data.packageName}@${version}`;
}
// check for berry tarball packages
if (
snapshot.resolution &&
snapshot.resolution === `${node.data.packageName}@${version}`
) {
return snapshot.resolution;
}
return `${node.data.packageName}@npm:${version}`;
}
function getPackageJsonVersion(
combinedDependencies: Record<string, string>,
node: ProjectGraphExternalNode
): string {
const { packageName, version } = node.data;
if (combinedDependencies[packageName]) {
if (
combinedDependencies[packageName] === version ||
satisfies(version, combinedDependencies[packageName])
) {
return combinedDependencies[packageName];
}
}
}
function findOriginalKeys(
dependencies: Record<string, YarnDependency>,
node: ProjectGraphExternalNode
): [string[], YarnDependency] {
for (const keyExpr of Object.keys(dependencies)) {
const snapshot = dependencies[keyExpr];
const keys = keyExpr.split(', ');
if (!keys[0].startsWith(`${node.data.packageName}@`)) {
continue;
}
// standard package
if (snapshot.version === node.data.version) {
return [keys, snapshot];
}
// berry alias package
if (
snapshot.resolution &&
`npm:${snapshot.resolution}` === node.data.version
) {
return [keys, snapshot];
}
// classic alias
if (
node.data.version.startsWith('npm:') &&
keys.every((k) => k === `${node.data.packageName}@${node.data.version}`)
) {
return [keys, snapshot];
}
// tarball package
if (
snapshot.resolved === node.data.version ||
snapshot.resolution === `${node.data.packageName}@${node.data.version}`
) {
return [keys, snapshot];
}
}
}
const BERRY_LOCK_FILE_DISCLAIMER = `# This file was generated by Nx. Do not edit this file directly\n# Manual changes might be lost - proceed with caution!\n\n`;
function generateRootWorkspacePackage(
packageJson: NormalizedPackageJson
): YarnDependency {
return {
version: '0.0.0-use.local',
resolution: `${packageJson.name}@workspace:.`,
...(packageJson.dependencies && { dependencies: packageJson.dependencies }),
...(packageJson.peerDependencies && {
peerDependencies: packageJson.peerDependencies,
}),
...(packageJson.devDependencies && {
devDependencies: packageJson.devDependencies,
}),
...(packageJson.optionalDependencies && {
optionalDependencies: packageJson.optionalDependencies,
}),
languageName: 'unknown',
linkType: 'soft',
};
}

View File

@ -1,290 +0,0 @@
import {
parseYarnLockFile,
pruneYarnLockFile,
stringifyYarnLockFile,
} from './yarn';
import {
berryLockFile,
berryLockFileDevkitAndYargs,
berryRxjsTslibLockFile,
berrySsh2LockFile,
lockFile,
lockFileDevkitAndYargs,
lockFileJustTypescript,
rxjsTslibLockFile,
ssh2LockFile,
} from './__fixtures__/yarn.lock';
const TypeScriptOnlyPackage = {
name: 'test',
version: '1.0.0',
dependencies: { typescript: '4.8.4' },
};
const YargsAndDevkitPackage = {
name: 'test',
version: '0.0.0',
dependencies: {
'@nrwl/devkit': '15.0.13',
yargs: '17.6.2',
typescript: '4.8.4',
},
};
const YargsDevkitTypescriptPackage = {
name: 'test',
version: '0.0.0',
dependencies: {
'@nrwl/devkit': '15.0.13',
typescript: '4.8.4',
yargs: '17.6.2',
},
};
const Ssh2Package = {
name: 'test',
version: '0.0.0',
dependencies: {
ssh2: '1.11.0',
},
};
const RxjsTslibPackage = {
name: 'test',
version: '0.0.0',
dependencies: {
rxjs: '^7.8.0',
tslib: '^2.4.1',
},
};
describe('yarn LockFile utility', () => {
describe('classic', () => {
const parsedLockFile = parseYarnLockFile(lockFile);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toBeUndefined();
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(339);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
].rootVersion
).toBeFalsy();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
].rootVersion
).toBeTruthy();
});
it('should map various instances of the same version', () => {
const babelCoreDependency =
parsedLockFile.dependencies['@babel/core']['@babel/core@7.20.5'];
expect(babelCoreDependency.packageMeta.length).toEqual(2);
expect(babelCoreDependency.packageMeta).toEqual([
'@babel/core@^7.11.6',
'@babel/core@^7.12.3',
]);
});
it('should match the original file on stringification', () => {
expect(stringifyYarnLockFile(parsedLockFile)).toEqual(lockFile);
});
it('should prune the lock file', () => {
expect(
Object.keys(
pruneYarnLockFile(parsedLockFile, TypeScriptOnlyPackage).dependencies
).length
).toEqual(1);
expect(
Object.keys(
pruneYarnLockFile(parsedLockFile, YargsAndDevkitPackage).dependencies
).length
).toEqual(37);
});
it('should correctly prune lockfile with single package', () => {
expect(
stringifyYarnLockFile(
pruneYarnLockFile(parsedLockFile, TypeScriptOnlyPackage)
)
).toEqual(lockFileJustTypescript);
});
it('should correctly prune lockfile with multiple packages', () => {
expect(
stringifyYarnLockFile(
pruneYarnLockFile(parsedLockFile, YargsAndDevkitPackage)
)
).toEqual(lockFileDevkitAndYargs);
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
stringifyYarnLockFile(
pruneYarnLockFile(parseYarnLockFile(ssh2LockFile), Ssh2Package)
)
).toEqual(ssh2LockFile);
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
stringifyYarnLockFile(
pruneYarnLockFile(
parseYarnLockFile(rxjsTslibLockFile),
RxjsTslibPackage
)
)
).toEqual(rxjsTslibLockFile);
});
});
describe('berry', () => {
const parsedLockFile = parseYarnLockFile(berryLockFile);
it('should parse lockfile correctly', () => {
expect(parsedLockFile.lockFileMetadata).toEqual({
__metadata: { cacheKey: '8', version: '6' },
workspacePackages: {
'test@workspace:.': {
dependencies: {
'@nrwl/cli': '15.0.13',
'@nrwl/workspace': '15.0.13',
nx: '15.0.13',
prettier: '^2.6.2',
typescript: '~4.8.2',
},
languageName: 'unknown',
linkType: 'soft',
resolution: 'test@workspace:.',
version: '0.0.0-use.local',
},
},
});
expect(Object.keys(parsedLockFile.dependencies).length).toEqual(401);
expect(
parsedLockFile.dependencies['@ampproject/remapping']
).toMatchSnapshot();
expect(parsedLockFile.dependencies['typescript']).toMatchSnapshot();
});
it('should map various versions of packages', () => {
expect(
Object.keys(parsedLockFile.dependencies['@jridgewell/gen-mapping'])
.length
).toEqual(2);
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.1.1'
]
).toBeDefined();
expect(
parsedLockFile.dependencies['@jridgewell/gen-mapping'][
'@jridgewell/gen-mapping@0.3.2'
]
).toBeDefined();
});
it('should map various instances of the same version', () => {
const babelCoreDependency =
parsedLockFile.dependencies['@babel/core']['@babel/core@7.20.5'];
expect(babelCoreDependency.packageMeta.length).toEqual(2);
expect(babelCoreDependency.packageMeta).toEqual([
'@babel/core@npm:^7.11.6',
'@babel/core@npm:^7.12.3',
]);
});
it('should match the original file on stringification', () => {
const result = stringifyYarnLockFile(parsedLockFile);
expect(result).toMatch(
/This file was generated by Nx. Do not edit this file directly/
);
expect(removeComment(result)).toEqual(removeComment(berryLockFile));
});
it('should prune the lock file', () => {
expect(
Object.keys(
pruneYarnLockFile(parsedLockFile, YargsDevkitTypescriptPackage)
.dependencies
).length
).toEqual(38);
});
it('should correctly prune lockfile with multiple packages', () => {
const result = stringifyYarnLockFile(
pruneYarnLockFile(parsedLockFile, YargsDevkitTypescriptPackage)
);
expect(removeComment(result)).toEqual(
removeComment(berryLockFileDevkitAndYargs)
);
});
it('should correctly prune lockfile with multiple packages and custom name', () => {
const result = pruneYarnLockFile(parsedLockFile, {
...YargsDevkitTypescriptPackage,
name: 'custom-name',
});
expect(result.lockFileMetadata.workspacePackages).toMatchInlineSnapshot(`
Object {
"custom-name@workspace:^": Object {
"dependencies": Object {
"@nrwl/devkit": "15.0.13",
"typescript": "4.8.4",
"yargs": "17.6.2",
},
"languageName": "unknown",
"linkType": "soft",
"resolution": "custom-name@workspace:^",
"version": "0.0.0-use.local",
},
}
`);
});
it('should correctly prune lockfile with package that has optional dependencies', () => {
expect(
removeComment(
stringifyYarnLockFile(
pruneYarnLockFile(parseYarnLockFile(berrySsh2LockFile), Ssh2Package)
)
)
).toEqual(removeComment(berrySsh2LockFile));
});
it('should correctly prune lockfile with packages in multiple versions', () => {
expect(
removeComment(
stringifyYarnLockFile(
pruneYarnLockFile(
parseYarnLockFile(berryRxjsTslibLockFile),
RxjsTslibPackage
)
)
)
).toEqual(removeComment(berryRxjsTslibLockFile));
});
});
});
// we don't care about comment message
const removeComment = (value) => value.split(/\n/).slice(2).join('\n');

View File

@ -1,533 +0,0 @@
import { parseSyml, stringifySyml } from '@yarnpkg/parsers';
import { stringify } from '@yarnpkg/lockfile';
import {
LockFileData,
PackageDependency,
PackageVersions,
} from './utils/lock-file-type';
import { isRootVersion, TransitiveLookupFunctionInput } from './utils/mapping';
import { generatePrunnedHash, hashString } from './utils/hashing';
import { PackageJsonDeps } from './utils/pruning';
import { sortObjectByKeys } from '../utils/object-sort';
type LockFileDependencies = Record<
string,
Omit<PackageDependency, 'packageMeta'>
>;
const BERRY_LOCK_FILE_DISCLAIMER = `# This file was generated by Nx. Do not edit this file directly\n# Manual changes might be lost - proceed with caution!\n\n`;
/**
* Parses `yarn.lock` syml file and maps to {@link LockFileData}
*
* @param lockFile
* @returns
*/
export function parseYarnLockFile(lockFile: string): LockFileData {
const { __metadata, ...dependencies } = parseSyml(lockFile);
// Yarn Berry has workspace packages includes, so we need to extract those to metadata
const isBerry = !!__metadata;
const [mappedPackages, workspacePackages] = mapPackages(
dependencies,
isBerry
);
const hash = hashString(lockFile);
if (isBerry) {
return {
dependencies: mappedPackages,
lockFileMetadata: {
__metadata,
workspacePackages,
},
hash,
};
} else {
return { dependencies: mappedPackages, hash };
}
}
function extendVersionProperty(
key: string,
value: Omit<PackageDependency, 'packageMeta'>,
isBerry: boolean
) {
if (isBerry) {
const packageName = key.slice(0, key.lastIndexOf('@'));
if (value.resolution !== `${packageName}@npm:${value.version}`) {
return {
version: value.resolution.slice(packageName.length + 1),
actualVersion: value.version,
};
}
return;
}
if (value.integrity) {
return;
}
return {
version: key.slice(key.lastIndexOf('@') + 1),
actualVersion: value.version,
};
}
// map original yarn packages to the LockFileData structure
function mapPackages(
packages: LockFileDependencies,
isBerry: boolean
): [LockFileData['dependencies'], LockFileDependencies] {
const mappedPackages: LockFileData['dependencies'] = {};
const workspacePackages: LockFileDependencies = {};
Object.entries(packages).forEach(([keyExpr, value]) => {
// separate workspace packages from the external ones
// we only combine them back when stringifying
if (value.linkType === 'soft') {
workspacePackages[keyExpr] = value;
} else {
// key might be "@nrwl/somedep@1.2.3, @nrwl/somedep@^1.0.0..."
const keys = keyExpr.split(', ');
let packageName = keys[0].slice(0, keys[0].indexOf('@', 1));
if (
isBerry &&
keys[0].startsWith(`${packageName}@patch:${packageName}`)
) {
// handle Berry's patch format as a separate package
packageName = `${packageName}@patch:${packageName}`;
}
const newKey = `${packageName}@${value.version}`;
mappedPackages[packageName] = mappedPackages[packageName] || {};
if (!mappedPackages[packageName][newKey]) {
mappedPackages[packageName][newKey] = {
...value,
...extendVersionProperty(keys[0], value, isBerry),
packageMeta: keys,
};
} else {
mappedPackages[packageName][newKey].packageMeta.push(...keys);
}
}
});
Object.keys(mappedPackages).forEach((packageName) => {
const versions = mappedPackages[packageName];
const versionKeys = Object.keys(versions);
if (versionKeys.length === 1) {
versions[versionKeys[0]].rootVersion = true;
} else {
const rootVersionKey = versionKeys.find((v) =>
isRootVersion(packageName, versions[v].version)
);
// this should never happen, but just in case
if (rootVersionKey) {
versions[rootVersionKey].rootVersion = true;
}
}
});
return [mappedPackages, workspacePackages];
}
/**
* Generates yarn.lock file from `LockFileData` object
*
* @param lockFileData
* @returns
*/
export function stringifyYarnLockFile(lockFileData: LockFileData): string {
// only berry's format has metadata defined
// this is an easy way to distinguish it from the classic
const isBerry = !!lockFileData.lockFileMetadata?.__metadata;
const dependencies = unmapPackages(lockFileData.dependencies, isBerry);
if (isBerry) {
const lockFile = {
__metadata: lockFileData.lockFileMetadata.__metadata,
...lockFileData.lockFileMetadata.workspacePackages,
...dependencies,
};
// berry's stringifySyml doesn't generate comment
return BERRY_LOCK_FILE_DISCLAIMER + stringifySyml(lockFile);
} else {
return stringify(dependencies);
}
}
// revert mapping of packages from LockFileData to the original JSON structure
// E.g. from:
// "abc": {
// "abc@1.2.3": {
// ...value
// packageMeta: ["abc@^1.0.0", "abc@~1.2.0"]
// }
// }
// to:
// "abc@^1.0.0, abc@~1.2.0": {
// ...value
// }
//
function unmapPackages(
dependencies: LockFileDependencies,
isBerry = false
): LockFileDependencies {
const packages: LockFileDependencies = {};
Object.values(dependencies).forEach((packageVersions) => {
Object.values(packageVersions).forEach((value) => {
const { packageMeta, rootVersion, actualVersion, ...rest } = value;
if (actualVersion) {
rest.version = actualVersion;
}
if (isBerry) {
// berry's `stringifySyml` does not combine packages
// we have to do it manually
packages[packageMeta.join(', ')] = rest;
} else {
// classic's `stringify` combines packages with same resolution
packageMeta.forEach((key) => {
packages[key] = rest;
});
}
});
});
return packages;
}
/**
* Returns matching version of the dependency
*/
export function transitiveDependencyYarnLookup({
packageName,
versions,
version,
}: TransitiveLookupFunctionInput): PackageDependency {
return Object.values(versions).find((v) =>
v.packageMeta.some(
(p) =>
p === `${packageName}@${version}` ||
p === `${packageName}@npm:${version}`
)
);
}
/**
* Prunes the lock file data based on the list of packages and their transitive dependencies
*
* @param lockFileData
* @returns
*/
export function pruneYarnLockFile(
lockFileData: LockFileData,
normalizedPackageJson: PackageJsonDeps
): LockFileData {
const isBerry = !!lockFileData.lockFileMetadata?.__metadata;
const prunedDependencies = pruneDependencies(
lockFileData.dependencies,
normalizedPackageJson,
isBerry
);
const hash = generatePrunnedHash(lockFileData.hash, normalizedPackageJson);
let prunedLockFileData: LockFileData;
if (isBerry) {
const { __metadata, workspacePackages } = lockFileData.lockFileMetadata;
prunedLockFileData = {
lockFileMetadata: {
__metadata,
workspacePackages: pruneWorkspacePackages(
workspacePackages,
prunedDependencies,
normalizedPackageJson
),
},
dependencies: prunedDependencies,
hash,
};
} else {
prunedLockFileData = {
dependencies: prunedDependencies,
hash,
};
}
prunedLockFileData.hash = hashString(JSON.stringify(prunedLockFileData));
return prunedLockFileData;
}
// iterate over packages to collect the affected tree of dependencies
function pruneDependencies(
dependencies: LockFileData['dependencies'],
normalizedPackageJson: PackageJsonDeps,
isBerry: boolean
): LockFileData['dependencies'] {
const result: LockFileData['dependencies'] = {};
Object.keys({
...normalizedPackageJson.dependencies,
...normalizedPackageJson.devDependencies,
...normalizedPackageJson.peerDependencies,
}).forEach((packageName) => {
if (dependencies[packageName]) {
pruneDependency(packageName, normalizedPackageJson, dependencies, result);
if (isBerry) {
const patchPackageName = `${packageName}@patch:${packageName}`;
if (dependencies[patchPackageName]) {
pruneDependency(
patchPackageName,
normalizedPackageJson,
dependencies,
result,
true
);
}
}
} else {
console.warn(
`Could not find ${packageName} in the lock file. Skipping...`
);
}
});
return result;
}
function pruneDependency(
packageName: string,
normalizedPackageJson: PackageJsonDeps,
dependencies: LockFileData['dependencies'],
result: LockFileData['dependencies'],
isPatch = false
) {
const [key, value] = Object.entries(dependencies[packageName]).find(
([, v]) => v.rootVersion
);
result[packageName] ??= {};
result[packageName][key] ??= { ...value, packageMeta: [] };
let metaVersion: string;
if (isPatch) {
const originalPackageName = packageName.split('@patch:').pop();
const patchSuffix = value.packageMeta[0].split('#').pop();
metaVersion = `${packageName}@${getVersionFromPackageJson(
normalizedPackageJson,
originalPackageName
)}#${patchSuffix}`;
} else if (value.resolution) {
metaVersion = `${value.resolution.replace(
value.version,
''
)}${getVersionFromPackageJson(normalizedPackageJson, packageName)}`;
} else {
metaVersion = `${packageName}@${getVersionFromPackageJson(
normalizedPackageJson,
packageName
)}`;
}
result[packageName][key].packageMeta = ensureMetaVersion(
result[packageName][key].packageMeta,
metaVersion
);
pruneTransitiveDependencies(dependencies, result, value);
}
function getVersionFromPackageJson(
normalizedPackageJson: PackageJsonDeps,
packageName: string
): string {
return (
normalizedPackageJson.dependencies?.[packageName] ||
normalizedPackageJson.devDependencies?.[packageName] ||
normalizedPackageJson.peerDependencies?.[packageName]
);
}
// find all transitive dependencies of already pruned packages
// and adds them to the collection
// recursively prunes their dependencies
function pruneTransitiveDependencies(
dependencies: LockFileData['dependencies'],
prunedDeps: LockFileData['dependencies'],
value: PackageDependency
): void {
[
...Object.entries(value.dependencies ?? {}),
...Object.entries(value.optionalDependencies ?? {}),
].forEach(([packageName, version]: [string, string]) => {
if (dependencies[packageName]) {
// check if package with given version exists in data
// if yes, return key, value and version expression from packageMeta
const dependencyTriplet = findDependencyTriplet(
dependencies[packageName],
packageName,
version
);
if (dependencyTriplet) {
const [key, { packageMeta, ...depValue }, metaVersion] =
dependencyTriplet;
if (!prunedDeps[packageName]) {
prunedDeps[packageName] = {};
}
if (prunedDeps[packageName][key]) {
prunedDeps[packageName][key].packageMeta = ensureMetaVersion(
prunedDeps[packageName][key].packageMeta,
metaVersion
);
} else {
prunedDeps[packageName][key] = {
...depValue,
packageMeta: [metaVersion],
};
// recursively collect dependencies
pruneTransitiveDependencies(
dependencies,
prunedDeps,
prunedDeps[packageName][key]
);
}
}
}
});
}
// prune dependencies of workspace packages from the lockFileMeta
function pruneWorkspacePackages(
workspacePackages: LockFileDependencies,
prunedDependencies: LockFileData['dependencies'],
normalizedPackageJson: PackageJsonDeps
): LockFileDependencies {
const result: LockFileDependencies = {};
const name = normalizedPackageJson.name;
const workspaceProjKey =
Object.keys(workspacePackages).find((key) =>
key.startsWith(`${name}@workspace:`)
) || `${name}@workspace:^`;
if (workspaceProjKey) {
const prunedWorkspaceDependencies = pruneWorkspacePackageDependencies(
workspacePackages[workspaceProjKey]?.dependencies || {},
normalizedPackageJson,
prunedDependencies
);
result[workspaceProjKey] = {
version: `${normalizedPackageJson.version || '0.0.0'}-use.local`,
resolution: workspaceProjKey,
languageName: 'unknown',
linkType: 'soft',
dependencies: sortObjectByKeys(prunedWorkspaceDependencies),
};
}
return result;
}
function pruneWorkspacePackageDependencies(
dependencies: Record<string, string>,
normalizedPackageJson: PackageJsonDeps,
prunedDependencies: LockFileData['dependencies']
): Record<string, string> {
const result: Record<string, string> = {};
Object.entries(dependencies).forEach(
([packageName, packageVersion]: [string, string]) => {
if (
isPackageVersionMatch(
prunedDependencies[packageName],
packageName,
packageVersion
)
) {
result[packageName] = packageVersion;
}
}
);
// add all missing deps to root workspace package
Object.keys({
...normalizedPackageJson.dependencies,
...normalizedPackageJson.devDependencies,
...normalizedPackageJson.peerDependencies,
}).forEach((p) => {
if (!result[p]) {
// extract first version expression from package's structure
const metaVersion = Object.values(prunedDependencies[p])[0]
.packageMeta[0] as string;
result[p] = metaVersion.split('@npm:')[1];
}
});
return result;
}
// check if package with given version exists in pruned dependencies
function isPackageVersionMatch(
packageVersions: PackageVersions,
packageName: string,
packageVersion: string
): boolean {
if (!packageVersions) {
return false;
}
const versionExpr = `${packageName}@${packageVersion}`;
const berryVersionExpr = `${packageName}@npm:${packageVersion}`;
const values = Object.values(packageVersions);
for (let i = 0; i < values.length; i++) {
if (
values[i].packageMeta.includes(versionExpr) ||
values[i].packageMeta.includes(berryVersionExpr)
) {
return true;
}
}
return false;
}
// find version of the package in LockFileData that matches given depVersion expression
// returns [package@version, packageValue, package@npm:version]
// for berry, the third parameter is different so we return it as well
function findDependencyTriplet(
dependency: PackageVersions,
packageName: string,
version: string
): [string, PackageDependency, string] {
const entries = Object.entries(dependency);
for (let i = 0; i < entries.length; i++) {
const [key, value] = entries[i];
let metaVersion = `${packageName}@${version}`;
if (value.packageMeta.includes(metaVersion)) {
return [key, value, metaVersion];
}
// for berry, meta version starts with 'npm:'
metaVersion = `${packageName}@npm:${version}`;
if (value.packageMeta.includes(metaVersion)) {
return [key, value, metaVersion];
}
}
return;
}
function ensureMetaVersion(
packageMeta: string[],
metaVersion: string
): string[] {
if (packageMeta.indexOf(metaVersion) === -1) {
return [...packageMeta, metaVersion].sort();
}
return packageMeta;
}

View File

@ -36,7 +36,6 @@ import { readNxJson } from '../config/configuration';
import { import {
lockFileExists, lockFileExists,
lockFileHash, lockFileHash,
mapLockFileDataToPartialGraph,
parseLockFile, parseLockFile,
} from '../lock-file/lock-file'; } from '../lock-file/lock-file';
import { Workspaces } from '../config/workspaces'; import { Workspaces } from '../config/workspaces';
@ -106,7 +105,7 @@ export async function buildProjectGraphUsingProjectFileMap(
if (cache && cache.lockFileHash === lockHash) { if (cache && cache.lockFileHash === lockHash) {
partialGraph = isolatePartialGraphFromCache(cache); partialGraph = isolatePartialGraphFromCache(cache);
} else { } else {
partialGraph = mapLockFileDataToPartialGraph(parseLockFile()); partialGraph = parseLockFile();
} }
} }
const context = createContext( const context = createContext(

View File

@ -10,6 +10,7 @@ import {
} from '../config/project-graph'; } from '../config/project-graph';
export class ProjectGraphBuilder { export class ProjectGraphBuilder {
// TODO(FrozenPandaz): make this private
readonly graph: ProjectGraph; readonly graph: ProjectGraph;
readonly removedEdges: { [source: string]: Set<string> } = {}; readonly removedEdges: { [source: string]: Set<string> } = {};
@ -46,6 +47,23 @@ export class ProjectGraphBuilder {
this.graph.dependencies[node.name] = []; this.graph.dependencies[node.name] = [];
} }
/**
* Removes a node and all of its dependency edges from the graph
*/
removeNode(name: string) {
if (!this.graph.nodes[name] && !this.graph.externalNodes[name]) {
throw new Error(`There is no node named: "${name}"`);
}
this.removeDependenciesWithNode(name);
if (this.graph.nodes[name]) {
delete this.graph.nodes[name];
} else {
delete this.graph.externalNodes[name];
}
}
/** /**
* Adds a external node to the project graph * Adds a external node to the project graph
*/ */
@ -145,6 +163,42 @@ export class ProjectGraphBuilder {
} }
} }
/**
* Add an explicit dependency from a file in source project to target project
*/
addExternalNodeDependency(
sourceProjectName: string,
targetProjectName: string
): void {
if (sourceProjectName === targetProjectName) {
return;
}
const source = this.graph.externalNodes[sourceProjectName];
if (!source) {
throw new Error(`Source project does not exist: ${sourceProjectName}`);
}
if (!this.graph.externalNodes[targetProjectName]) {
throw new Error(`Target project does not exist: ${targetProjectName}`);
}
if (!this.graph.dependencies[sourceProjectName]) {
this.graph.dependencies[sourceProjectName] = [];
}
if (
!this.graph.dependencies[sourceProjectName].some(
(d) => d.target === targetProjectName
)
) {
this.graph.dependencies[sourceProjectName].push({
source: sourceProjectName,
target: targetProjectName,
type: DependencyType.static,
});
}
}
/** /**
* Set version of the project graph * Set version of the project graph
*/ */
@ -179,6 +233,27 @@ export class ProjectGraphBuilder {
return this.graph; return this.graph;
} }
private removeDependenciesWithNode(name: string) {
// remove all source dependencies
delete this.graph.dependencies[name];
// remove all target dependencies
for (const dependencies of Object.values(this.graph.dependencies)) {
for (const [index, { source, target }] of dependencies.entries()) {
if (target === name) {
const deps = this.graph.dependencies[source];
this.graph.dependencies[source] = [
...deps.slice(0, index),
...deps.slice(index + 1),
];
if (this.graph.dependencies[source].length === 0) {
delete this.graph.dependencies[source];
}
}
}
}
}
private calculateTargetDepsFromFiles(sourceProject: string) { private calculateTargetDepsFromFiles(sourceProject: string) {
const fileDeps = new Set<string>(); const fileDeps = new Set<string>();
const files = this.graph.nodes[sourceProject].data.files; const files = this.graph.nodes[sourceProject].data.files;

View File

@ -29,6 +29,8 @@ export interface NxMigrationsConfiguration {
packageGroup?: PackageGroup; packageGroup?: PackageGroup;
} }
type PackageOverride = { [key: string]: string | PackageOverride };
export interface PackageJson { export interface PackageJson {
// Generic Package.Json Configuration // Generic Package.Json Configuration
name: string; name: string;
@ -47,8 +49,11 @@ export interface PackageJson {
>; >;
dependencies?: Record<string, string>; dependencies?: Record<string, string>;
devDependencies?: Record<string, string>; devDependencies?: Record<string, string>;
optionalDependencies?: Record<string, string>;
peerDependencies?: Record<string, string>; peerDependencies?: Record<string, string>;
peerDependenciesMeta?: Record<string, { optional?: boolean }>; peerDependenciesMeta?: Record<string, { optional: boolean }>;
resolutions?: Record<string, string>;
overrides?: PackageOverride;
bin?: Record<string, string>; bin?: Record<string, string>;
workspaces?: workspaces?:
| string[] | string[]

View File

@ -10,7 +10,7 @@
"**/*.spec.ts", "**/*.spec.ts",
"**/*_spec.ts", "**/*_spec.ts",
"jest.config.ts", "jest.config.ts",
"**/__fixtures__/*.*" "**/__fixtures__/**/*.*"
], ],
"include": ["**/*.ts"] "include": ["**/*.ts"]
} }

Some files were not shown because too many files have changed in this diff Show More