Skip to content

Commit 15ee3fe

Browse files
committed
Consistent namespaced issue storage
1 parent 44faf38 commit 15ee3fe

13 files changed

+40
-41
lines changed

packages/knip/src/IssueCollector.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ export class IssueCollector {
7979
issue.severity = this.rules[type];
8080
const issues = this.issues[type];
8181
issues[key] = issues[key] ?? {};
82-
const symbol =
83-
type.endsWith('Members') && issue.parentSymbol ? `${issue.parentSymbol}.${issue.symbol}` : issue.symbol;
82+
const symbol = issue.parentSymbol ? `${issue.parentSymbol}.${issue.symbol}` : issue.symbol;
8483
if (!issues[key][symbol]) {
8584
issues[key][symbol] = issue;
8685
this.counters[issue.type]++;

packages/knip/test/entry-js.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ test('Find unused files and exports with JS entry file', async () => {
1919
assert.equal(Object.values(issues.exports).length, 2);
2020
assert.equal(issues.exports['my-module.ts']['unused'].symbol, 'unused');
2121
assert.equal(issues.exports['my-module.ts']['default'].symbol, 'default');
22-
assert.equal(issues.exports['my-namespace.ts']['key'].symbol, 'key');
22+
assert.equal(issues.exports['my-namespace.ts']['MyNamespace.key'].symbol, 'key');
2323

2424
assert.equal(Object.values(issues.types).length, 2);
2525
assert.equal(issues.types['my-module.ts']['AnyType'].symbolType, 'type');
26-
assert.equal(issues.types['my-namespace.ts']['MyNamespace'].symbol, 'MyNamespace');
26+
assert.equal(issues.types['my-namespace.ts']['MyNamespace.MyNamespace'].symbol, 'MyNamespace');
2727

2828
assert.equal(Object.values(issues.duplicates).length, 1);
2929
assert.equal(issues.duplicates['my-module.ts']['myExport|default'].symbols?.length, 2);

packages/knip/test/exports.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ test('Find unused exports', async () => {
2222
assert.equal(issues.exports['named-exports.ts']['renamedExport'].symbol, 'renamedExport');
2323
assert.equal(issues.exports['named-exports.ts']['namedExport'].symbol, 'namedExport');
2424
assert.equal(issues.exports['dynamic-import.ts']['unusedZero'].symbol, 'unusedZero');
25-
assert.equal(issues.exports['my-namespace.ts']['nsUnusedKey'].line, 3);
26-
assert.equal(issues.exports['my-namespace.ts']['nsUnusedKey'].col, 14);
27-
assert.equal(issues.exports['my-namespace.ts']['nsUnusedKey'].symbol, 'nsUnusedKey');
25+
assert.equal(issues.exports['my-namespace.ts']['MyNamespace.nsUnusedKey'].line, 3);
26+
assert.equal(issues.exports['my-namespace.ts']['MyNamespace.nsUnusedKey'].col, 14);
27+
assert.equal(issues.exports['my-namespace.ts']['MyNamespace.nsUnusedKey'].symbol, 'nsUnusedKey');
2828
assert(!issues.exports['index.ts']);
2929

3030
assert.equal(Object.values(issues.types).length, 3);
3131
assert.equal(issues.types['my-module.ts']['MyAnyType'].symbolType, 'type');
3232
assert.equal(issues.types['types.ts']['MyEnum'].symbolType, 'enum');
3333
assert.equal(issues.types['types.ts']['MyType'].symbolType, 'type');
34-
assert.equal(issues.types['my-namespace.ts']['MyNamespace'].symbol, 'MyNamespace');
34+
assert.equal(issues.types['my-namespace.ts']['MyNamespace.MyNamespace'].symbol, 'MyNamespace');
3535
assert(!issues.types['index.ts']);
3636

3737
assert.equal(Object.values(issues.duplicates).length, 1);
@@ -42,8 +42,8 @@ test('Find unused exports', async () => {
4242

4343
assert.equal(issues.types['my-module.ts']['MyAnyType'].line, 28);
4444
assert.equal(issues.types['my-module.ts']['MyAnyType'].col, 13);
45-
assert.equal(issues.types['my-namespace.ts']['MyNamespace'].line, 6);
46-
assert.equal(issues.types['my-namespace.ts']['MyNamespace'].col, 18);
45+
assert.equal(issues.types['my-namespace.ts']['MyNamespace.MyNamespace'].line, 6);
46+
assert.equal(issues.types['my-namespace.ts']['MyNamespace.MyNamespace'].col, 18);
4747

4848
assert.deepEqual(counters, {
4949
...baseCounters,

packages/knip/test/ignore-exports-used-in-file-id-underscores.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ test('Find unused exports when identifiers begin with two underscores', async ()
1414
});
1515

1616
assert.equal(issues.exports['imported.ts']['__underscoresUnused'].symbol, '__underscoresUnused');
17-
assert.equal(issues.exports['namespace.ts']['__underscoresUnused'].symbol, '__underscoresUnused');
17+
assert.equal(issues.exports['namespace.ts']['NS.__underscoresUnused'].symbol, '__underscoresUnused');
1818

1919
assert.deepEqual(counters, {
2020
...baseCounters,

packages/knip/test/js-only.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ test('Find unused files and exports with only JS files', async () => {
1818

1919
assert.equal(Object.values(issues.exports).length, 1);
2020
assert.equal(Object.values(issues.exports['my-namespace.js']).length, 2);
21-
assert.equal(issues.exports['my-namespace.js']['x'].symbol, 'x');
22-
assert.equal(issues.exports['my-namespace.js']['z'].symbol, 'z');
21+
assert.equal(issues.exports['my-namespace.js']['MyNamespace.x'].symbol, 'x');
22+
assert.equal(issues.exports['my-namespace.js']['MyNamespace.z'].symbol, 'z');
2323

2424
assert.deepEqual(counters, {
2525
...baseCounters,

packages/knip/test/re-exports-aliased-ns.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ test('Find exports through re-exported aliased namespace', async () => {
1313
cwd,
1414
});
1515

16-
assert(issues.exports['2-second.ts']['second']);
16+
assert(issues.exports['2-second.ts']['NS.second']);
1717

1818
assert.deepEqual(counters, {
1919
...baseCounters,

packages/knip/test/re-exports-export-ns.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ test('Find re-exports through namespaces (2)', async () => {
1313
cwd,
1414
});
1515

16-
assert(issues.exports['4-leaf-C.ts']['fnC']);
16+
assert(issues.exports['4-leaf-C.ts']['NS.fnC']);
1717
assert(issues.enumMembers['4-leaf-A.ts']['EnumA.UnusedProp']);
1818

1919
assert.deepEqual(counters, {
@@ -33,7 +33,7 @@ test('Find re-exports through namespaces (2) including entry files', async () =>
3333
});
3434

3535
assert(issues.exports['index.ts']['default']);
36-
assert(issues.exports['4-leaf-C.ts']['fnC']);
36+
assert(issues.exports['4-leaf-C.ts']['NS.fnC']);
3737
// assert(issues.nsExports['1-root.ts']['exportedFnOnNs']); // only when `nsExports` is included
3838
assert(issues.enumMembers['4-leaf-A.ts']['EnumA.UnusedProp']);
3939

packages/knip/test/re-exports-ns-member.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ test('Find destructured props of member-accessed imported symbol', async () => {
1313
cwd,
1414
});
1515

16-
assert(issues.exports['member-ab.ts']['unusedMemberA']);
17-
assert(issues.exports['member-cd.ts']['unusedMemberC']);
16+
assert(issues.exports['member-ab.ts']['NS.unusedMemberA']);
17+
assert(issues.exports['member-cd.ts']['pseudo.unusedMemberC']);
1818

1919
assert.deepEqual(counters, {
2020
...baseCounters,

packages/knip/test/re-exports-twice.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import baseCounters from './helpers/baseCounters.js';
77

88
const cwd = resolve('fixtures/re-exports-twice');
99

10-
test('Find exports through re-exported aliased namespace', async () => {
10+
test('Find exports through re-exported aliased namespace (twice)', async () => {
1111
const { counters } = await main({
1212
...baseArguments,
1313
cwd,

packages/knip/test/tags-cli.test.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ import baseCounters from './helpers/baseCounters.js';
77

88
const cwd = resolve('fixtures/tags-cli');
99

10-
test('Include or exclude tagged exports (default)', async () => {
10+
test('Include or exclude tagged exports (package.json)', async () => {
1111
const { issues, counters } = await main({
1212
...baseArguments,
1313
cwd,
1414
});
1515

1616
assert(issues.exports['unimported.ts']['unimported']);
1717
assert(issues.exports['unimported.ts']['unimportedUntagged']);
18-
assert(issues.exports['tags.ts']['UnusedUntagged']);
19-
assert(issues.exports['tags.ts']['UnusedCustom']);
20-
assert(issues.exports['tags.ts']['UnusedInternal']);
21-
assert(issues.exports['tags.ts']['UnusedCustomAndInternal']);
22-
assert(issues.exports['tags.ts']['MyCustomClass']);
18+
assert(issues.exports['tags.ts']['NS.UnusedUntagged']);
19+
assert(issues.exports['tags.ts']['NS.UnusedCustom']);
20+
assert(issues.exports['tags.ts']['NS.UnusedInternal']);
21+
assert(issues.exports['tags.ts']['NS.UnusedCustomAndInternal']);
22+
assert(issues.exports['tags.ts']['NS.MyCustomClass']);
2323
assert(issues.classMembers['tags.ts']['MyClass.UnusedUntagged']);
2424
assert(issues.classMembers['tags.ts']['MyClass.UnusedCustom']);
2525
assert(issues.classMembers['tags.ts']['MyClass.UnusedInternal']);
@@ -28,7 +28,7 @@ test('Include or exclude tagged exports (default)', async () => {
2828
assert(issues.enumMembers['tags.ts']['MyEnum.UnusedCustom']);
2929
assert(issues.enumMembers['tags.ts']['MyEnum.UnusedInternal']);
3030
assert(issues.enumMembers['tags.ts']['MyEnum.UnusedCustomAndInternal']);
31-
assert(issues.types['tags.ts']['MyCustomEnum']);
31+
assert(issues.types['tags.ts']['NS.MyCustomEnum']);
3232

3333
assert.deepEqual(counters, {
3434
...baseCounters,
@@ -41,18 +41,18 @@ test('Include or exclude tagged exports (default)', async () => {
4141
});
4242
});
4343

44-
test('Include or exclude tagged exports (include)', async () => {
44+
test('Include or exclude tagged exports (package.json/include)', async () => {
4545
const { issues, counters } = await main({
4646
...baseArguments,
4747
cwd,
4848
tags: [['custom'], []],
4949
});
5050

5151
assert(issues.exports['unimported.ts']['unimported']);
52-
assert(issues.exports['tags.ts']['UnusedCustom']);
53-
assert(issues.exports['tags.ts']['UnusedCustomAndInternal']);
54-
assert(issues.exports['tags.ts']['MyCustomClass']);
55-
assert(issues.types['tags.ts']['MyCustomEnum']);
52+
assert(issues.exports['tags.ts']['NS.UnusedCustom']);
53+
assert(issues.exports['tags.ts']['NS.UnusedCustomAndInternal']);
54+
assert(issues.exports['tags.ts']['NS.MyCustomClass']);
55+
assert(issues.types['tags.ts']['NS.MyCustomEnum']);
5656

5757
assert.deepEqual(counters, {
5858
...baseCounters,
@@ -63,16 +63,16 @@ test('Include or exclude tagged exports (include)', async () => {
6363
});
6464
});
6565

66-
test('Include or exclude tagged exports (exclude)', async () => {
66+
test('Include or exclude tagged exports (package.json/exclude)', async () => {
6767
const { issues, counters, tagHints } = await main({
6868
...baseArguments,
6969
cwd,
7070
tags: [[], ['custom']],
7171
});
7272

7373
assert(issues.exports['unimported.ts']['unimportedUntagged']);
74-
assert(issues.exports['tags.ts']['UnusedUntagged']);
75-
assert(issues.exports['tags.ts']['UnusedInternal']);
74+
assert(issues.exports['tags.ts']['NS.UnusedUntagged']);
75+
assert(issues.exports['tags.ts']['NS.UnusedInternal']);
7676
assert(issues.classMembers['tags.ts']['MyClass.UnusedUntagged']);
7777
assert(issues.classMembers['tags.ts']['MyClass.UnusedInternal']);
7878
assert(issues.enumMembers['tags.ts']['MyEnum.UnusedUntagged']);

0 commit comments

Comments
 (0)