Skip to content

Commit 259a2f6

Browse files
authored
Correctly detect used/unused namespace exports that begin with double underscores (#1180)
Co-authored-by: Andrew Kallem <[email protected]>
1 parent 0754130 commit 259a2f6

File tree

10 files changed

+51
-3
lines changed

10 files changed

+51
-3
lines changed

packages/knip/fixtures/exports-special-characters/exports.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export const $dollar = '$';
22
export const dollar$ = '$$';
33
export const _underscore = '_';
4+
export const __underscores = '__';
45

56
export class DollarMembers {
67
$member: string;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const __underscoresUnused = 'underscoresUnused';
2+
export const __underscoresUsed = 'underscoresUsed';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { __underscoresUsed } from './imported';
2+
import * as NS from './namespace';
3+
4+
__underscoresUsed;
5+
NS.__underscoresUsed;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"ignoreExportsUsedInFile": true
3+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const __underscoresUnused = 'underscoresUnused';
2+
export const __underscoresUsed = 'underscoresUsed';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"name": "@fixtures/ignore-exports-used-in-file-id-underscores"
3+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"compilerOptions": {
3+
"types": ["node"]
4+
}
5+
}

packages/knip/src/typescript/ast-helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ const getMemberStringLiterals = (typeChecker: ts.TypeChecker, node: ts.Node) =>
181181
}
182182

183183
if (ts.isPropertyAccessExpression(node)) {
184-
return [node.name.escapedText as string];
184+
return [node.name.getText()];
185185
}
186186
};
187187

packages/knip/test/exports-special-characters.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ test('Handle special characters in named exports and members', async () => {
1616
assert(issues.exports['exports.ts']['$dollar']);
1717
assert(issues.exports['exports.ts']['dollar$']);
1818
assert(issues.exports['exports.ts']['_underscore']);
19+
assert(issues.exports['exports.ts']['__underscores']);
1920
assert(issues.exports['exports.ts']['$Dollar']);
2021

2122
assert(issues.types['exports.ts']['$DollarType']);
@@ -28,7 +29,7 @@ test('Handle special characters in named exports and members', async () => {
2829
assert.deepEqual(counters, {
2930
...baseCounters,
3031
classMembers: 4,
31-
exports: 4,
32+
exports: 5,
3233
types: 1,
3334
processed: 2,
3435
total: 2,
@@ -45,6 +46,7 @@ test('Handle special characters in named exports and members (nsTypes)', async (
4546
assert(issues.exports['exports.ts']['$dollar']);
4647
assert(issues.exports['exports.ts']['dollar$']);
4748
assert(issues.exports['exports.ts']['_underscore']);
49+
assert(issues.exports['exports.ts']['__underscores']);
4850
assert(issues.exports['exports.ts']['$Dollar']);
4951

5052
assert(issues.types['exports.ts']['$DollarType']);
@@ -79,7 +81,7 @@ test('Handle special characters in named exports and members (nsTypes)', async (
7981
...baseCounters,
8082
classMembers: 4,
8183
enumMembers: 20,
82-
exports: 4,
84+
exports: 5,
8385
types: 1,
8486
processed: 2,
8587
total: 2,
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { test } from 'bun:test';
2+
import assert from 'node:assert/strict';
3+
import { main } from '../src/index.js';
4+
import { resolve } from '../src/util/path.js';
5+
import baseArguments from './helpers/baseArguments.js';
6+
import baseCounters from './helpers/baseCounters.js';
7+
8+
const cwd = resolve('fixtures/ignore-exports-used-in-file-id-underscores');
9+
10+
test('Find unused exports when identifiers begin with two underscores', async () => {
11+
const { issues, counters } = await main({
12+
...baseArguments,
13+
cwd,
14+
});
15+
16+
assert.equal(issues.exports['imported.ts']['__underscoresUnused'].symbol, '__underscoresUnused');
17+
assert.equal(issues.exports['namespace.ts']['__underscoresUnused'].symbol, '__underscoresUnused');
18+
19+
assert.deepEqual(counters, {
20+
...baseCounters,
21+
exports: 2,
22+
processed: 3,
23+
total: 3,
24+
});
25+
});

0 commit comments

Comments
 (0)