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:
parent
d1933d272c
commit
b80286191d
@ -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/
|
||||||
|
|||||||
@ -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'];
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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": "/"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
83
packages/nx/src/lock-file/__fixtures__/README.md
Normal file
83
packages/nx/src/lock-file/__fixtures__/README.md
Normal 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);
|
||||||
|
```
|
||||||
@ -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
|
||||||
|
`;
|
||||||
@ -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
1661
packages/nx/src/lock-file/__fixtures__/auxiliary-packages/package-lock.json
generated
Normal file
1661
packages/nx/src/lock-file/__fixtures__/auxiliary-packages/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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==
|
||||||
|
`;
|
||||||
@ -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
@ -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
|
||||||
|
`;
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
strict-peer-dependencies=false
|
||||||
|
auto-install-peers=true
|
||||||
File diff suppressed because it is too large
Load Diff
4632
packages/nx/src/lock-file/__fixtures__/duplicate-package/package-lock.json
generated
Normal file
4632
packages/nx/src/lock-file/__fixtures__/duplicate-package/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
2261
packages/nx/src/lock-file/__fixtures__/nextjs/.modules.yaml.ts
Normal file
2261
packages/nx/src/lock-file/__fixtures__/nextjs/.modules.yaml.ts
Normal file
File diff suppressed because it is too large
Load Diff
2
packages/nx/src/lock-file/__fixtures__/nextjs/.npmrc
Normal file
2
packages/nx/src/lock-file/__fixtures__/nextjs/.npmrc
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
strict-peer-dependencies=false
|
||||||
|
auto-install-peers=true
|
||||||
22043
packages/nx/src/lock-file/__fixtures__/nextjs/app/package-lock.json
generated
Normal file
22043
packages/nx/src/lock-file/__fixtures__/nextjs/app/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
7449
packages/nx/src/lock-file/__fixtures__/nextjs/app/pnpm-lock.yaml.ts
Normal file
7449
packages/nx/src/lock-file/__fixtures__/nextjs/app/pnpm-lock.yaml.ts
Normal file
File diff suppressed because it is too large
Load Diff
6597
packages/nx/src/lock-file/__fixtures__/nextjs/app/yarn.lock.ts
Normal file
6597
packages/nx/src/lock-file/__fixtures__/nextjs/app/yarn.lock.ts
Normal file
File diff suppressed because it is too large
Load Diff
30038
packages/nx/src/lock-file/__fixtures__/nextjs/package-lock.json
generated
Normal file
30038
packages/nx/src/lock-file/__fixtures__/nextjs/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
55
packages/nx/src/lock-file/__fixtures__/nextjs/package.json
Normal file
55
packages/nx/src/lock-file/__fixtures__/nextjs/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
10284
packages/nx/src/lock-file/__fixtures__/nextjs/pnpm-lock.yaml.ts
Normal file
10284
packages/nx/src/lock-file/__fixtures__/nextjs/pnpm-lock.yaml.ts
Normal file
File diff suppressed because it is too large
Load Diff
9662
packages/nx/src/lock-file/__fixtures__/nextjs/yarn.lock.ts
Normal file
9662
packages/nx/src/lock-file/__fixtures__/nextjs/yarn.lock.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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
|
||||||
|
`;
|
||||||
2
packages/nx/src/lock-file/__fixtures__/optional/.npmrc
Normal file
2
packages/nx/src/lock-file/__fixtures__/optional/.npmrc
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
strict-peer-dependencies=false
|
||||||
|
auto-install-peers=true
|
||||||
@ -0,0 +1 @@
|
|||||||
|
yarnPath: .yarn/releases/yarn-3.3.1.cjs
|
||||||
149
packages/nx/src/lock-file/__fixtures__/optional/package-lock.json
generated
Normal file
149
packages/nx/src/lock-file/__fixtures__/optional/package-lock.json
generated
Normal 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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"name": "test",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"ssh2": "1.11.0"
|
||||||
|
},
|
||||||
|
"packageManager": "yarn@3.3.1"
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
`;
|
||||||
968
packages/nx/src/lock-file/__fixtures__/optional/yarn.lock.ts
Normal file
968
packages/nx/src/lock-file/__fixtures__/optional/yarn.lock.ts
Normal 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
290
packages/nx/src/lock-file/__fixtures__/pruning/.modules.yaml.ts
Normal file
290
packages/nx/src/lock-file/__fixtures__/pruning/.modules.yaml.ts
Normal 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
|
||||||
|
`;
|
||||||
2549
packages/nx/src/lock-file/__fixtures__/pruning/devkit-yargs/package-lock.json
generated
Normal file
2549
packages/nx/src/lock-file/__fixtures__/pruning/devkit-yargs/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
`;
|
||||||
@ -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"
|
||||||
|
`;
|
||||||
2992
packages/nx/src/lock-file/__fixtures__/pruning/package-lock.json
generated
Normal file
2992
packages/nx/src/lock-file/__fixtures__/pruning/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
12
packages/nx/src/lock-file/__fixtures__/pruning/package.json
Normal file
12
packages/nx/src/lock-file/__fixtures__/pruning/package.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
1043
packages/nx/src/lock-file/__fixtures__/pruning/pnpm-lock.yaml.ts
Normal file
1043
packages/nx/src/lock-file/__fixtures__/pruning/pnpm-lock.yaml.ts
Normal file
File diff suppressed because it is too large
Load Diff
35
packages/nx/src/lock-file/__fixtures__/pruning/typescript/package-lock.json
generated
Normal file
35
packages/nx/src/lock-file/__fixtures__/pruning/typescript/package-lock.json
generated
Normal 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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "test",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"typescript": "4.8.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
`;
|
||||||
@ -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==
|
||||||
|
`;
|
||||||
1014
packages/nx/src/lock-file/__fixtures__/pruning/yarn.lock.ts
Normal file
1014
packages/nx/src/lock-file/__fixtures__/pruning/yarn.lock.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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
|
||||||
|
`;
|
||||||
119
packages/nx/src/lock-file/__fixtures__/workspaces/package-lock.json
generated
Normal file
119
packages/nx/src/lock-file/__fixtures__/workspaces/package-lock.json
generated
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "test",
|
||||||
|
"private": true,
|
||||||
|
"workspaces": [
|
||||||
|
"packages/*"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"react": "^17.0.0"
|
||||||
|
},
|
||||||
|
"packageManager": "yarn@1.22.19"
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "package-a",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"serve": "some serve",
|
||||||
|
"build": "some build",
|
||||||
|
"test": "some test"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"react": "18"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
`;
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
export default `packages:
|
||||||
|
# all packages in direct subdirs of packages/
|
||||||
|
- "packages/*"
|
||||||
|
`;
|
||||||
@ -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
|
||||||
|
`;
|
||||||
@ -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
@ -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",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
@ -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",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
@ -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",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
@ -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",
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -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}`);
|
|
||||||
}
|
}
|
||||||
|
|||||||
440
packages/nx/src/lock-file/npm-parser.spec.ts
Normal file
440
packages/nx/src/lock-file/npm-parser.spec.ts
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
621
packages/nx/src/lock-file/npm-parser.ts
Normal file
621
packages/nx/src/lock-file/npm-parser.ts
Normal 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 {};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
429
packages/nx/src/lock-file/pnpm-parser.spec.ts
Normal file
429
packages/nx/src/lock-file/pnpm-parser.spec.ts
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
299
packages/nx/src/lock-file/pnpm-parser.ts
Normal file
299
packages/nx/src/lock-file/pnpm-parser.ts
Normal 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;
|
||||||
|
}
|
||||||
@ -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
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -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('_'));
|
|
||||||
}
|
|
||||||
205
packages/nx/src/lock-file/project-graph-pruning.ts
Normal file
205
packages/nx/src/lock-file/project-graph-pruning.ts
Normal 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
|
||||||
}
|
|
||||||
@ -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;
|
|
||||||
};
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
60
packages/nx/src/lock-file/utils/package-json.ts
Normal file
60
packages/nx/src/lock-file/utils/package-json.ts
Normal 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,
|
||||||
|
};
|
||||||
|
}
|
||||||
210
packages/nx/src/lock-file/utils/pnpm-normalizer.ts
Normal file
210
packages/nx/src/lock-file/utils/pnpm-normalizer.ts
Normal 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',
|
||||||
|
];
|
||||||
@ -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,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
926
packages/nx/src/lock-file/yarn-parser.spec.ts
Normal file
926
packages/nx/src/lock-file/yarn-parser.spec.ts
Normal 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
|
||||||
|
"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
429
packages/nx/src/lock-file/yarn-parser.ts
Normal file
429
packages/nx/src/lock-file/yarn-parser.ts
Normal 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',
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -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');
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
@ -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(
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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[]
|
||||||
|
|||||||
@ -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
Loading…
x
Reference in New Issue
Block a user