yarn-why-duplicate 2.0.0 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +53 -6
- package/bin/yarn-why-duplicate.mjs +6 -6
- package/lib/displayDuplicates.js +4 -4
- package/lib/identifyDuplicates.js +2 -2
- package/lib/index.js +3 -0
- package/lib/readAndParseYarnWhy.js +5 -5
- package/package.json +29 -45
- package/CHANGELOG.md +0 -64
- package/lib/.eslintrc.json +0 -20
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
<
|
|
1
|
+
<h1 align="center">
|
|
2
2
|
yarn-why-duplicate
|
|
3
|
-
</
|
|
3
|
+
</h1>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
Simple bin to know why a package is duplicated
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/v/yarn-why-duplicate.svg?style=flat-square"></a>
|
|
11
|
-
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/dw/yarn-why-duplicate.svg?style=flat-square"></a>
|
|
12
|
-
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/node/v/yarn-why-duplicate.svg?style=flat-square"></a>
|
|
13
|
-
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/types/yarn-why-duplicate.svg?style=flat-square"></a>
|
|
10
|
+
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/v/yarn-why-duplicate.svg?style=flat-square" alt="npm version"></a>
|
|
11
|
+
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/dw/yarn-why-duplicate.svg?style=flat-square" alt="npm downloads"></a>
|
|
12
|
+
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/node/v/yarn-why-duplicate.svg?style=flat-square" alt="node version"></a>
|
|
13
|
+
<a href="https://npmjs.org/package/yarn-why-duplicate"><img src="https://img.shields.io/npm/types/yarn-why-duplicate.svg?style=flat-square" alt="types"></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
## Usage
|
|
@@ -20,3 +20,50 @@ With yarn berry:
|
|
|
20
20
|
```
|
|
21
21
|
yarn dlx yarn-why-duplicate <dependencyName>
|
|
22
22
|
```
|
|
23
|
+
|
|
24
|
+
One package name, no flags. It runs `yarn why <dependencyName> --json` in the
|
|
25
|
+
working directory, groups the answer by resolved version, and prints each
|
|
26
|
+
version with the dependents that asked for it and the range they asked with:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Found 2 versions:
|
|
30
|
+
|
|
31
|
+
semver@npm:7.8.5
|
|
32
|
+
- eslint@npm:10.4.0 (semver@npm:^7.6.3)
|
|
33
|
+
- ts-api-utils@npm:2.1.0 (semver@npm:^7.7.1)
|
|
34
|
+
|
|
35
|
+
semver@npm:6.3.1
|
|
36
|
+
- @babel/core@npm:7.28.4 (semver@npm:^6.3.1)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`No version found` means yarn reported nothing for that name — usually a typo,
|
|
40
|
+
or a package that is not in the tree.
|
|
41
|
+
|
|
42
|
+
Requires yarn berry (>= 2): yarn 1's `yarn why` output is a different format and
|
|
43
|
+
is rejected with an explicit message rather than misparsed. Exits 1 on that and
|
|
44
|
+
on any error yarn reports.
|
|
45
|
+
|
|
46
|
+
### Prefer yarn-berry-why-duplicate
|
|
47
|
+
|
|
48
|
+
This is the original tool, kept working and unchanged. It shells out to
|
|
49
|
+
`yarn why`, so it explains one package at a time, spawns yarn per run, and knows
|
|
50
|
+
nothing about lockstep families or about fixing anything.
|
|
51
|
+
|
|
52
|
+
[yarn-berry-why-duplicate](../yarn-berry-deduplicate) reads `yarn.lock` directly
|
|
53
|
+
and is what to reach for now: it lists every duplicate at once, takes globs and
|
|
54
|
+
package filters, reports the lockstep clusters, tells you which copies can be
|
|
55
|
+
merged — and its sibling `yarn-berry-deduplicate` applies the merges.
|
|
56
|
+
|
|
57
|
+
## Notes
|
|
58
|
+
|
|
59
|
+
- CLI only: there is no importable API. The `exports` map only exposes
|
|
60
|
+
`./package.json`, so `import "yarn-why-duplicate"` fails by design. Internally
|
|
61
|
+
the bin is three steps,
|
|
62
|
+
`readAndParseYarnWhy` → `identifyDuplicates` → `displayDuplicates`, each in
|
|
63
|
+
its own file under `lib/` and each unit-tested against recorded `yarn why`
|
|
64
|
+
output in `test/fixtures/`.
|
|
65
|
+
- Plain JavaScript, no TypeScript and no build; node `>=22.18.0`.
|
|
66
|
+
- `Found N versions` counts every version of the named package, duplicated or
|
|
67
|
+
not — one version is a normal answer, not an error.
|
|
68
|
+
- Colors and descriptor formatting come from `@yarnpkg/core`, configured from
|
|
69
|
+
the working directory, so output matches what yarn itself prints.
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { displayDuplicates } from
|
|
4
|
-
import { identifyDuplicates } from
|
|
5
|
-
import { readAndParseYarnWhy } from
|
|
3
|
+
import { displayDuplicates } from "../lib/displayDuplicates.js";
|
|
4
|
+
import { identifyDuplicates } from "../lib/identifyDuplicates.js";
|
|
5
|
+
import { readAndParseYarnWhy } from "../lib/readAndParseYarnWhy.js";
|
|
6
6
|
|
|
7
7
|
const pkgName = process.argv.slice(2)[0];
|
|
8
8
|
|
|
9
9
|
const yarnWhyResult = readAndParseYarnWhy(pkgName);
|
|
10
10
|
|
|
11
11
|
for (const line of yarnWhyResult) {
|
|
12
|
-
if (line.type ===
|
|
12
|
+
if (line.type === "error") {
|
|
13
13
|
console.error(`yarn error: ${line.data}`);
|
|
14
14
|
process.exit(1);
|
|
15
|
-
} else if (line.type ===
|
|
16
|
-
console.error(
|
|
15
|
+
} else if (line.type === "step") {
|
|
16
|
+
console.error("yarn 1 is not supported, use yarn berry (>=2)");
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
19
19
|
}
|
package/lib/displayDuplicates.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Configuration, structUtils } from "@yarnpkg/core";
|
|
2
2
|
|
|
3
3
|
export const displayDuplicates = (
|
|
4
4
|
groupByVersions,
|
|
@@ -6,13 +6,13 @@ export const displayDuplicates = (
|
|
|
6
6
|
configuration = Configuration.create(process.cwd()),
|
|
7
7
|
) => {
|
|
8
8
|
if (groupByVersions.length === 0) {
|
|
9
|
-
log(
|
|
9
|
+
log("No version found");
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
log(
|
|
14
14
|
`Found ${groupByVersions.length} version${
|
|
15
|
-
groupByVersions.length === 1 ?
|
|
15
|
+
groupByVersions.length === 1 ? "" : "s"
|
|
16
16
|
}:`,
|
|
17
17
|
);
|
|
18
18
|
log();
|
|
@@ -25,7 +25,7 @@ export const displayDuplicates = (
|
|
|
25
25
|
configuration,
|
|
26
26
|
source,
|
|
27
27
|
)} (${structUtils.prettyDescriptor(configuration, descriptor)})`,
|
|
28
|
-
);
|
|
28
|
+
);
|
|
29
29
|
}
|
|
30
30
|
log();
|
|
31
31
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { structUtils } from
|
|
2
|
-
import { compare as compareRange } from
|
|
1
|
+
import { structUtils } from "@yarnpkg/core";
|
|
2
|
+
import { compare as compareRange } from "semver";
|
|
3
3
|
|
|
4
4
|
export const identifyDuplicates = (yarnWhyResult) => {
|
|
5
5
|
const groupByVersions = new Map();
|
package/lib/index.js
ADDED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { spawnSync } from
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
2
|
|
|
3
3
|
export const parseYarnWhy = (content) => {
|
|
4
4
|
return content
|
|
5
|
-
.split(
|
|
5
|
+
.split("\n")
|
|
6
6
|
.filter(Boolean)
|
|
7
7
|
.map((line) => JSON.parse(line));
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
export const readAndParseYarnWhy = (pkgName) => {
|
|
11
|
-
const { stdout, stderr } = spawnSync(
|
|
12
|
-
encoding:
|
|
13
|
-
stdio:
|
|
11
|
+
const { stdout, stderr } = spawnSync("yarn", ["why", pkgName, "--json"], {
|
|
12
|
+
encoding: "utf8",
|
|
13
|
+
stdio: "pipe",
|
|
14
14
|
pwd: process.cwd(),
|
|
15
15
|
});
|
|
16
16
|
if (stderr) {
|
package/package.json
CHANGED
|
@@ -1,62 +1,46 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yarn-why-duplicate",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.2",
|
|
4
4
|
"description": "Simple bin to know why a package is duplicated",
|
|
5
5
|
"keywords": [
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"berry",
|
|
7
|
+
"yarn"
|
|
8
8
|
],
|
|
9
|
-
"
|
|
10
|
-
"license": "ISC",
|
|
11
|
-
"repository": "https://github.com/christophehurpeau/yarn-why-duplicate.git",
|
|
12
|
-
"homepage": "https://github.com/christophehurpeau/yarn-why-duplicate#readme",
|
|
9
|
+
"homepage": "https://github.com/christophehurpeau/pm-tools",
|
|
13
10
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/christophehurpeau/
|
|
11
|
+
"url": "https://github.com/christophehurpeau/pm-tools/issues"
|
|
15
12
|
},
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"exports": {
|
|
23
|
-
".": "./lib/index.js",
|
|
24
|
-
"./package.json": "./package.json"
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Christophe Hurpeau <christophe@hurpeau.com> (https://christophe.hurpeau.com)",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/christophehurpeau/pm-tools.git",
|
|
18
|
+
"directory": "packages/yarn-why-duplicate"
|
|
25
19
|
},
|
|
26
|
-
"sideEffects": false,
|
|
27
20
|
"bin": "./bin/yarn-why-duplicate.mjs",
|
|
28
21
|
"files": [
|
|
29
22
|
"lib",
|
|
30
23
|
"bin"
|
|
31
24
|
],
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"lint:prettier:fix": "pob-root-prettier --write .",
|
|
39
|
-
"postinstallDev": "pob-root-postinstall",
|
|
40
|
-
"test": "node --test",
|
|
41
|
-
"test:coverage": "node --test",
|
|
42
|
-
"test:watch": "node --test --watch"
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"main": "./lib/index.js",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": "./lib/index.js",
|
|
30
|
+
"./package.json": "./package.json"
|
|
43
31
|
},
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
"scripts": {
|
|
33
|
+
"lint": "bun run lint:oxlint && bun run lint:eslint",
|
|
34
|
+
"lint:eslint": "bun run --cwd '../..' eslint --quiet 'packages/yarn-why-duplicate'",
|
|
35
|
+
"lint:oxlint": "bun run --cwd '../..' oxlint --quiet 'packages/yarn-why-duplicate'",
|
|
36
|
+
"test": "bun run --cwd '../..' test -- 'packages/yarn-why-duplicate'"
|
|
49
37
|
},
|
|
50
|
-
"pob": {},
|
|
51
38
|
"dependencies": {
|
|
52
|
-
"@yarnpkg/core": "4.
|
|
53
|
-
"semver": "7.5
|
|
39
|
+
"@yarnpkg/core": "4.9.2",
|
|
40
|
+
"semver": "7.8.5"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.18.0"
|
|
54
44
|
},
|
|
55
|
-
"
|
|
56
|
-
|
|
57
|
-
"@pob/eslint-config": "51.1.2",
|
|
58
|
-
"@pob/root": "8.6.0",
|
|
59
|
-
"check-package-dependencies": "6.8.0",
|
|
60
|
-
"eslint": "8.53.0"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
45
|
+
"pob": {}
|
|
46
|
+
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
-
|
|
6
|
-
## [2.0.0](https://github.com/christophehurpeau/yarn-why-duplicate/compare/v1.2.0...v2.0.0) (2023-11-05)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
### ⚠ BREAKING CHANGES
|
|
10
|
-
|
|
11
|
-
* require node 18
|
|
12
|
-
|
|
13
|
-
### Features
|
|
14
|
-
|
|
15
|
-
* update to yarn 4 stable ([704278c](https://github.com/christophehurpeau/yarn-why-duplicate/commit/704278c5643a7fcb61704511b921cfa3485d3b04))
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
### Bug Fixes
|
|
19
|
-
|
|
20
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.43 ([#12](https://github.com/christophehurpeau/yarn-why-duplicate/issues/12)) ([f7d4e20](https://github.com/christophehurpeau/yarn-why-duplicate/commit/f7d4e202efdfa752d00ab834af391dae95896473))
|
|
21
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.44 ([#20](https://github.com/christophehurpeau/yarn-why-duplicate/issues/20)) ([2887734](https://github.com/christophehurpeau/yarn-why-duplicate/commit/2887734b2e58e1f48827acfef64457105aea940e))
|
|
22
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.45 ([#23](https://github.com/christophehurpeau/yarn-why-duplicate/issues/23)) ([f64c11d](https://github.com/christophehurpeau/yarn-why-duplicate/commit/f64c11d6cf26972e2cc2230cfbaf580f62543e0a))
|
|
23
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.46 ([#27](https://github.com/christophehurpeau/yarn-why-duplicate/issues/27)) ([0217338](https://github.com/christophehurpeau/yarn-why-duplicate/commit/021733849c68a20d7d4a57d102e0aa4d58b2bcca))
|
|
24
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.47 ([#34](https://github.com/christophehurpeau/yarn-why-duplicate/issues/34)) ([ffdebc6](https://github.com/christophehurpeau/yarn-why-duplicate/commit/ffdebc67829c874742628f7b1ca1cda9259716b7))
|
|
25
|
-
* **deps:** update dependency @yarnpkg/core to v4.0.0-rc.48 ([#38](https://github.com/christophehurpeau/yarn-why-duplicate/issues/38)) ([e98d67a](https://github.com/christophehurpeau/yarn-why-duplicate/commit/e98d67a81a1e7e844ef6fd0ced0a8e7f84f05f72))
|
|
26
|
-
* **deps:** update dependency semver to v7.5.1 ([#18](https://github.com/christophehurpeau/yarn-why-duplicate/issues/18)) ([4b347b9](https://github.com/christophehurpeau/yarn-why-duplicate/commit/4b347b955b6bfdf07c5e4451ac4018cb92fe58ea))
|
|
27
|
-
* **deps:** update dependency semver to v7.5.2 ([#24](https://github.com/christophehurpeau/yarn-why-duplicate/issues/24)) ([9359f4b](https://github.com/christophehurpeau/yarn-why-duplicate/commit/9359f4b096230ca238d7d4702c9543871e48d5af))
|
|
28
|
-
* **deps:** update dependency semver to v7.5.3 ([#26](https://github.com/christophehurpeau/yarn-why-duplicate/issues/26)) ([b6cbe1b](https://github.com/christophehurpeau/yarn-why-duplicate/commit/b6cbe1b2f48a407e0ef765574636e2c1d4bfdfea))
|
|
29
|
-
* **deps:** update dependency semver to v7.5.4 ([#39](https://github.com/christophehurpeau/yarn-why-duplicate/issues/39)) ([bb3599a](https://github.com/christophehurpeau/yarn-why-duplicate/commit/bb3599a7830805e864f5f92180c01bf49ba97efd))
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### Code Refactoring
|
|
33
|
-
|
|
34
|
-
* drop node 16 ([be786c3](https://github.com/christophehurpeau/yarn-why-duplicate/commit/be786c3be71e0a7e676ff96faf57f029739a78c4))
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
## [1.2.0](https://github.com/christophehurpeau/yarn-why-duplicate/compare/v1.1.0...v1.2.0) (2023-04-25)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
### Features
|
|
41
|
-
|
|
42
|
-
* force 1.2.0 ([72688d8](https://github.com/christophehurpeau/yarn-why-duplicate/commit/72688d83af568ebb83fe8ee261b6ac18adf44f0e))
|
|
43
|
-
|
|
44
|
-
## [1.1.0](https://github.com/christophehurpeau/yarn-why-duplicate/compare/v1.0.0...v1.1.0) (2023-04-25)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
### Features
|
|
48
|
-
|
|
49
|
-
* force 1.1.0 ([d333635](https://github.com/christophehurpeau/yarn-why-duplicate/commit/d3336353ffe709910577310116dab70dd8f25f5c))
|
|
50
|
-
|
|
51
|
-
## 1.0.0 (2023-04-25)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
### Features
|
|
55
|
-
|
|
56
|
-
* **deps:** update dependency semver to v7.5.0 ([#4](https://github.com/christophehurpeau/yarn-why-duplicate/issues/4)) ([f9eee30](https://github.com/christophehurpeau/yarn-why-duplicate/commit/f9eee30e153dea0dc8dabb69b2484dd6dd3be0dc))
|
|
57
|
-
* first commit ([c3a6354](https://github.com/christophehurpeau/yarn-why-duplicate/commit/c3a6354ae139baffc75c4582af439db4f496329c))
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
### Bug Fixes
|
|
61
|
-
|
|
62
|
-
* add try/catch on compareRange ([357eed7](https://github.com/christophehurpeau/yarn-why-duplicate/commit/357eed715012b156d4abd447f9d7232fdc066d72))
|
|
63
|
-
* use virtuals ([340d56a](https://github.com/christophehurpeau/yarn-why-duplicate/commit/340d56a8abc6c81b9973ed5ecb80604e6905990b))
|
|
64
|
-
* virtual child ([8798439](https://github.com/christophehurpeau/yarn-why-duplicate/commit/8798439ccf4f7ee40292ce9fb734e573a37c1d71))
|
package/lib/.eslintrc.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"root": true,
|
|
3
|
-
"extends": ["@pob/eslint-config/node-module"],
|
|
4
|
-
"overrides": [
|
|
5
|
-
{
|
|
6
|
-
"files": ["**/*.test.{cjs,js}", "__tests__/**/*.{cjs,js}"],
|
|
7
|
-
"env": {
|
|
8
|
-
"jest": true
|
|
9
|
-
},
|
|
10
|
-
"rules": {
|
|
11
|
-
"import/no-extraneous-dependencies": [
|
|
12
|
-
"error",
|
|
13
|
-
{
|
|
14
|
-
"devDependencies": true
|
|
15
|
-
}
|
|
16
|
-
]
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
}
|