knip 2.1.2 → 2.2.0

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.
Files changed (116) hide show
  1. package/dist/{configuration-chief.js → ConfigurationChief.js} +39 -38
  2. package/dist/{dependency-deputy.d.ts → DependencyDeputy.d.ts} +4 -2
  3. package/dist/{dependency-deputy.js → DependencyDeputy.js} +29 -10
  4. package/dist/{principal-factory.d.ts → PrincipalFactory.d.ts} +1 -1
  5. package/dist/{principal-factory.js → PrincipalFactory.js} +1 -1
  6. package/dist/{project-principal.d.ts → ProjectPrincipal.d.ts} +7 -4
  7. package/dist/{project-principal.js → ProjectPrincipal.js} +6 -4
  8. package/dist/{workspace-worker.d.ts → WorkspaceWorker.d.ts} +1 -1
  9. package/dist/{workspace-worker.js → WorkspaceWorker.js} +0 -2
  10. package/dist/binaries/index.d.ts +2 -2
  11. package/dist/binaries/index.js +12 -16
  12. package/dist/binaries/resolvers/fallback.js +8 -4
  13. package/dist/binaries/resolvers/npx.js +3 -1
  14. package/dist/binaries/types.d.ts +1 -5
  15. package/dist/cli.js +1 -1
  16. package/dist/index.js +56 -46
  17. package/dist/manifest/index.d.ts +1 -3
  18. package/dist/manifest/index.js +11 -25
  19. package/dist/plugins/_template/index.js +1 -1
  20. package/dist/plugins/ava/index.js +4 -6
  21. package/dist/plugins/babel/index.js +1 -1
  22. package/dist/plugins/capacitor/index.js +1 -1
  23. package/dist/plugins/changesets/index.js +1 -1
  24. package/dist/plugins/commitizen/index.js +1 -1
  25. package/dist/plugins/commitlint/index.js +1 -1
  26. package/dist/plugins/cspell/index.js +1 -1
  27. package/dist/plugins/eslint/index.js +1 -1
  28. package/dist/plugins/gatsby/index.js +1 -1
  29. package/dist/plugins/github-actions/index.js +4 -6
  30. package/dist/plugins/husky/index.js +4 -6
  31. package/dist/plugins/jest/index.js +1 -1
  32. package/dist/plugins/lefthook/index.js +4 -6
  33. package/dist/plugins/lint-staged/index.js +7 -7
  34. package/dist/plugins/markdownlint/index.js +1 -1
  35. package/dist/plugins/mocha/index.js +1 -1
  36. package/dist/plugins/npm-package-json-lint/index.js +1 -1
  37. package/dist/plugins/nx/index.js +4 -4
  38. package/dist/plugins/nyc/index.js +1 -1
  39. package/dist/plugins/postcss/index.js +1 -1
  40. package/dist/plugins/prettier/index.js +1 -1
  41. package/dist/plugins/release-it/index.js +4 -4
  42. package/dist/plugins/remark/index.js +1 -1
  43. package/dist/plugins/semantic-release/index.js +1 -1
  44. package/dist/plugins/storybook/index.js +1 -1
  45. package/dist/plugins/stryker/index.js +1 -1
  46. package/dist/plugins/tailwind/index.js +1 -1
  47. package/dist/plugins/typedoc/index.js +1 -1
  48. package/dist/plugins/typescript/index.js +1 -1
  49. package/dist/plugins/vitest/index.js +1 -1
  50. package/dist/plugins/webpack/index.js +1 -1
  51. package/dist/types/config.d.ts +1 -1
  52. package/dist/types/{ast.d.ts → exports.d.ts} +0 -10
  53. package/dist/types/imports.d.ts +13 -0
  54. package/dist/types/imports.js +1 -0
  55. package/dist/types/plugins.d.ts +1 -2
  56. package/dist/types/workspace.d.ts +1 -0
  57. package/dist/typescript/SourceFile.d.ts +1 -0
  58. package/dist/typescript/getImportsAndExports.d.ts +28 -0
  59. package/dist/typescript/getImportsAndExports.js +157 -0
  60. package/dist/typescript/visitors/exports/exportAssignment.d.ts +3 -0
  61. package/dist/typescript/visitors/exports/exportAssignment.js +8 -0
  62. package/dist/typescript/visitors/exports/exportDeclaration.d.ts +3 -0
  63. package/dist/typescript/visitors/exports/exportDeclaration.js +13 -0
  64. package/dist/typescript/visitors/exports/exportKeyword.d.ts +3 -0
  65. package/dist/typescript/visitors/exports/exportKeyword.js +77 -0
  66. package/dist/typescript/visitors/exports/index.d.ts +3 -0
  67. package/dist/typescript/visitors/exports/index.js +6 -0
  68. package/dist/typescript/visitors/exports/moduleExportsAccessExpression.d.ts +3 -0
  69. package/dist/typescript/visitors/exports/moduleExportsAccessExpression.js +31 -0
  70. package/dist/typescript/visitors/helpers.d.ts +3 -0
  71. package/dist/typescript/visitors/helpers.js +3 -0
  72. package/dist/typescript/visitors/imports/importCall.d.ts +3 -0
  73. package/dist/typescript/visitors/imports/importCall.js +38 -0
  74. package/dist/typescript/visitors/imports/importDeclaration.d.ts +3 -0
  75. package/dist/typescript/visitors/imports/importDeclaration.js +32 -0
  76. package/dist/typescript/visitors/imports/importEqualsDeclaration.d.ts +3 -0
  77. package/dist/typescript/visitors/imports/importEqualsDeclaration.js +11 -0
  78. package/dist/typescript/visitors/imports/index.d.ts +3 -0
  79. package/dist/typescript/visitors/imports/index.js +17 -0
  80. package/dist/typescript/visitors/imports/jsDocType.d.ts +3 -0
  81. package/dist/typescript/visitors/imports/jsDocType.js +11 -0
  82. package/dist/typescript/visitors/imports/reExportDeclaration.d.ts +3 -0
  83. package/dist/typescript/visitors/imports/reExportDeclaration.js +21 -0
  84. package/dist/typescript/visitors/imports/requireCall.d.ts +3 -0
  85. package/dist/typescript/visitors/imports/requireCall.js +46 -0
  86. package/dist/typescript/visitors/imports/requireResolveCall.d.ts +3 -0
  87. package/dist/typescript/visitors/imports/requireResolveCall.js +14 -0
  88. package/dist/typescript/visitors/index.d.ts +10 -0
  89. package/dist/typescript/visitors/index.js +15 -0
  90. package/dist/typescript/visitors/scripts/index.d.ts +3 -0
  91. package/dist/typescript/visitors/scripts/index.js +3 -0
  92. package/dist/typescript/visitors/scripts/zx.d.ts +3 -0
  93. package/dist/typescript/visitors/scripts/zx.js +8 -0
  94. package/dist/util/array.d.ts +0 -1
  95. package/dist/util/array.js +0 -7
  96. package/dist/util/compilers.d.ts +5 -4
  97. package/dist/util/compilers.js +1 -3
  98. package/dist/util/glob.js +1 -1
  99. package/dist/util/loader.js +1 -1
  100. package/dist/util/plugin.js +1 -1
  101. package/dist/util/require.js +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.js +1 -1
  104. package/package.json +4 -4
  105. package/dist/typescript/ast-walker.d.ts +0 -16
  106. package/dist/typescript/ast-walker.js +0 -364
  107. package/dist/{configuration-chief.d.ts → ConfigurationChief.d.ts} +0 -0
  108. package/dist/{configuration-validator.d.ts → ConfigurationValidator.d.ts} +6 -6
  109. /package/dist/{configuration-validator.js → ConfigurationValidator.js} +0 -0
  110. /package/dist/{console-streamer.d.ts → ConsoleStreamer.d.ts} +0 -0
  111. /package/dist/{console-streamer.js → ConsoleStreamer.js} +0 -0
  112. /package/dist/{issue-collector.d.ts → IssueCollector.d.ts} +0 -0
  113. /package/dist/{issue-collector.js → IssueCollector.js} +0 -0
  114. /package/dist/types/{ast.js → exports.js} +0 -0
  115. /package/dist/util/{performance.d.ts → Performance.d.ts} +0 -0
  116. /package/dist/util/{performance.js → Performance.js} +0 -0
@@ -0,0 +1,157 @@
1
+ import { isBuiltin } from 'node:module';
2
+ import ts from 'typescript';
3
+ import { isInNodeModules } from '../util/path.js';
4
+ import { isDeclarationFileExtension, isAccessExpression, getAccessExpressionName } from './ast-helpers.js';
5
+ import getExportVisitors from './visitors/exports/index.js';
6
+ import getImportVisitors from './visitors/imports/index.js';
7
+ import getScriptVisitors from './visitors/scripts/index.js';
8
+ const getVisitors = (sourceFile) => ({
9
+ export: getExportVisitors(sourceFile),
10
+ import: getImportVisitors(sourceFile),
11
+ script: getScriptVisitors(sourceFile),
12
+ });
13
+ export const getImportsAndExports = (sourceFile, options) => {
14
+ const internalImports = new Map();
15
+ const externalImports = new Set();
16
+ const unresolvedImports = new Set();
17
+ const exports = new Map();
18
+ const aliasedExports = {};
19
+ const scripts = new Set();
20
+ const importedInternalSymbols = new Map();
21
+ const visitors = getVisitors(sourceFile);
22
+ const addInternalImport = ({ identifier = '__anonymous', specifier, symbol, filePath, }) => {
23
+ const isStar = identifier === '*';
24
+ const isReExported = Boolean(isStar && !symbol);
25
+ if (!internalImports.has(filePath)) {
26
+ internalImports.set(filePath, {
27
+ specifier,
28
+ isStar,
29
+ isReExported,
30
+ isReExportedBy: new Set(),
31
+ symbols: new Set(),
32
+ });
33
+ }
34
+ const internalImport = internalImports.get(filePath);
35
+ if (isReExported) {
36
+ internalImport.isReExported = isReExported;
37
+ internalImport.isReExportedBy.add(sourceFile.fileName);
38
+ }
39
+ if (isStar) {
40
+ internalImport.isStar = isStar;
41
+ }
42
+ if (!isStar) {
43
+ internalImport.symbols.add(identifier);
44
+ }
45
+ if (isStar && symbol) {
46
+ importedInternalSymbols.set(symbol, filePath);
47
+ }
48
+ };
49
+ const addImport = ({ specifier, symbol, identifier = '__anonymous' }) => {
50
+ if (isBuiltin(specifier))
51
+ return;
52
+ const module = sourceFile.resolvedModules?.get(specifier, undefined);
53
+ if (module?.resolvedModule) {
54
+ const filePath = module.resolvedModule.resolvedFileName;
55
+ if (filePath) {
56
+ if (module.resolvedModule.isExternalLibraryImport) {
57
+ if (!isInNodeModules(filePath)) {
58
+ addInternalImport({ identifier, specifier, symbol, filePath });
59
+ }
60
+ else if (isDeclarationFileExtension(module.resolvedModule.extension)) {
61
+ externalImports.add(specifier);
62
+ }
63
+ else {
64
+ externalImports.add(module.resolvedModule.packageId?.name ?? specifier);
65
+ }
66
+ }
67
+ else {
68
+ addInternalImport({ identifier, specifier, symbol, filePath });
69
+ }
70
+ }
71
+ }
72
+ else {
73
+ unresolvedImports.add(specifier);
74
+ }
75
+ };
76
+ const maybeAddNamespaceAccessAsImport = ({ namespace, member }) => {
77
+ const symbol = sourceFile.locals?.get(namespace);
78
+ if (symbol) {
79
+ const importedSymbolFilePath = importedInternalSymbols.get(symbol);
80
+ if (importedSymbolFilePath) {
81
+ const internalImport = internalImports.get(importedSymbolFilePath);
82
+ internalImport?.symbols.add(member);
83
+ }
84
+ }
85
+ };
86
+ const addExport = ({ node, identifier, type, pos, members }) => {
87
+ if (options.skipExports)
88
+ return;
89
+ if (exports.has(identifier)) {
90
+ const item = exports.get(identifier);
91
+ exports.set(identifier, { ...item, node, type, pos, members });
92
+ }
93
+ else {
94
+ exports.set(identifier, { node, type, pos, members });
95
+ }
96
+ if (ts.isExportAssignment(node))
97
+ maybeAddAliasedExport(node.expression, 'default');
98
+ if (ts.isVariableDeclaration(node))
99
+ maybeAddAliasedExport(node.initializer, identifier);
100
+ };
101
+ const maybeAddAliasedExport = (node, alias) => {
102
+ const identifier = node?.getText();
103
+ if (identifier && sourceFile.symbol?.exports?.has(identifier)) {
104
+ aliasedExports[identifier] = aliasedExports[identifier] ?? [identifier];
105
+ aliasedExports[identifier].push(alias);
106
+ }
107
+ };
108
+ const visit = (node) => {
109
+ for (const visitor of visitors.import) {
110
+ if (visitor) {
111
+ const results = visitor(node, options);
112
+ if (results) {
113
+ [results].flat().forEach(addImport);
114
+ return;
115
+ }
116
+ }
117
+ }
118
+ for (const visitor of visitors.export) {
119
+ if (visitor) {
120
+ const results = visitor(node, options);
121
+ if (results) {
122
+ [results].flat().forEach(addExport);
123
+ return;
124
+ }
125
+ }
126
+ }
127
+ for (const visitor of visitors.script) {
128
+ if (visitor) {
129
+ const results = visitor(node, options);
130
+ if (results) {
131
+ [results].flat().forEach(script => scripts.add(script));
132
+ return;
133
+ }
134
+ }
135
+ }
136
+ if (isAccessExpression(node)) {
137
+ maybeAddNamespaceAccessAsImport({
138
+ namespace: node.expression.getText(),
139
+ member: getAccessExpressionName(node),
140
+ });
141
+ }
142
+ ts.forEachChild(node, visit);
143
+ };
144
+ visit(sourceFile);
145
+ return {
146
+ imports: {
147
+ internal: internalImports,
148
+ external: externalImports,
149
+ unresolved: unresolvedImports,
150
+ },
151
+ exports: {
152
+ exported: exports,
153
+ duplicate: Object.values(aliasedExports),
154
+ },
155
+ scripts,
156
+ };
157
+ };
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddExportOptions | import("../../getImportsAndExports.js").AddExportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import ts from 'typescript';
2
+ import { SymbolType } from '../../../types/issues.js';
3
+ import { exportVisitor as visit } from '../index.js';
4
+ export default visit(() => true, node => {
5
+ if (ts.isExportAssignment(node)) {
6
+ return { node, identifier: 'default', type: SymbolType.UNKNOWN, pos: node.expression.getStart() };
7
+ }
8
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddExportOptions | import("../../getImportsAndExports.js").AddExportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,13 @@
1
+ import ts from 'typescript';
2
+ import { SymbolType } from '../../../types/issues.js';
3
+ import { exportVisitor as visit } from '../index.js';
4
+ export default visit(() => true, node => {
5
+ if (ts.isExportDeclaration(node)) {
6
+ if (node.exportClause && ts.isNamedExports(node.exportClause)) {
7
+ const type = node.isTypeOnly ? SymbolType.TYPE : SymbolType.UNKNOWN;
8
+ return node.exportClause.elements.map(element => {
9
+ return { node: element, identifier: element.name.getText(), type, pos: element.name.pos };
10
+ });
11
+ }
12
+ }
13
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddExportOptions | import("../../getImportsAndExports.js").AddExportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,77 @@
1
+ import ts from 'typescript';
2
+ import { SymbolType } from '../../../types/issues.js';
3
+ import { compact } from '../../../util/array.js';
4
+ import { isPrivateMember, stripQuotes } from '../../ast-helpers.js';
5
+ import { exportVisitor as visit } from '../index.js';
6
+ export default visit(() => true, node => {
7
+ const modifierKinds = node.modifiers?.map(modifier => modifier.kind) ?? [];
8
+ if (modifierKinds.includes(ts.SyntaxKind.ExportKeyword)) {
9
+ if (ts.isVariableStatement(node)) {
10
+ return node.declarationList.declarations.flatMap(declaration => {
11
+ if (ts.isObjectBindingPattern(declaration.name)) {
12
+ return compact(declaration.name.elements.map(element => {
13
+ if (ts.isIdentifier(element.name)) {
14
+ return {
15
+ node: element,
16
+ identifier: element.name.escapedText.toString(),
17
+ type: SymbolType.UNKNOWN,
18
+ pos: element.name.getStart(),
19
+ };
20
+ }
21
+ }));
22
+ }
23
+ else if (ts.isArrayBindingPattern(declaration.name)) {
24
+ return compact(declaration.name.elements.map(element => {
25
+ if (ts.isBindingElement(element)) {
26
+ return {
27
+ node: element,
28
+ identifier: element.getText(),
29
+ type: SymbolType.UNKNOWN,
30
+ pos: element.getStart(),
31
+ };
32
+ }
33
+ }));
34
+ }
35
+ else {
36
+ const identifier = declaration.name.getText();
37
+ return { node: declaration, identifier, type: SymbolType.UNKNOWN, pos: declaration.name.getStart() };
38
+ }
39
+ });
40
+ }
41
+ if (ts.isFunctionDeclaration(node) && node.name) {
42
+ const identifier = modifierKinds.includes(ts.SyntaxKind.DefaultKeyword) ? 'default' : node.name.getText();
43
+ const pos = (node.name ?? node.body ?? node).getStart();
44
+ return { node, identifier, pos, type: SymbolType.FUNCTION };
45
+ }
46
+ if (ts.isClassDeclaration(node) && node.name) {
47
+ const identifier = modifierKinds.includes(ts.SyntaxKind.DefaultKeyword) ? 'default' : node.name.getText();
48
+ const pos = (node.name ?? node).getStart();
49
+ const members = node.members
50
+ .filter((member) => (ts.isPropertyDeclaration(member) || ts.isMethodDeclaration(member)) && !isPrivateMember(member))
51
+ .map(member => ({
52
+ node: member,
53
+ identifier: member.name.getText(),
54
+ pos: member.name.getStart(),
55
+ type: SymbolType.MEMBER,
56
+ }));
57
+ return { node, identifier, type: SymbolType.CLASS, pos, members };
58
+ }
59
+ if (ts.isTypeAliasDeclaration(node)) {
60
+ return { node, identifier: node.name.getText(), type: SymbolType.TYPE, pos: node.name.getStart() };
61
+ }
62
+ if (ts.isInterfaceDeclaration(node)) {
63
+ return { node, identifier: node.name.getText(), type: SymbolType.INTERFACE, pos: node.name.getStart() };
64
+ }
65
+ if (ts.isEnumDeclaration(node)) {
66
+ const identifier = modifierKinds.includes(ts.SyntaxKind.DefaultKeyword) ? 'default' : node.name.getText();
67
+ const pos = node.name.getStart();
68
+ const members = node.members.map(member => ({
69
+ node: member,
70
+ identifier: stripQuotes(member.name.getText()),
71
+ pos: member.name.getStart(),
72
+ type: SymbolType.MEMBER,
73
+ }));
74
+ return { node, identifier, type: SymbolType.ENUM, pos, members };
75
+ }
76
+ }
77
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => (((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddExportOptions | import("../../getImportsAndExports.js").AddExportOptions[] | undefined) | undefined)[];
3
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import exportAssignment from './exportAssignment.js';
2
+ import exportDeclaration from './exportDeclaration.js';
3
+ import exportKeyword from './exportKeyword.js';
4
+ import moduleExportsAccessExpression from './moduleExportsAccessExpression.js';
5
+ const visitors = [exportAssignment, exportDeclaration, exportKeyword, moduleExportsAccessExpression];
6
+ export default (sourceFile) => visitors.map(v => v(sourceFile)).filter(v => v);
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddExportOptions | import("../../getImportsAndExports.js").AddExportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,31 @@
1
+ import ts from 'typescript';
2
+ import { SymbolType } from '../../../types/issues.js';
3
+ import { isModuleExportsAccessExpression, stripQuotes } from '../../ast-helpers.js';
4
+ import { isJS } from '../helpers.js';
5
+ import { exportVisitor as visit } from '../index.js';
6
+ export default visit(isJS, node => {
7
+ if (isModuleExportsAccessExpression(node)) {
8
+ const parent = node.parent;
9
+ if (ts.isPropertyAccessExpression(parent)) {
10
+ const identifier = parent.name.getText();
11
+ const pos = parent.name.getStart();
12
+ return { node, identifier, type: SymbolType.UNKNOWN, pos };
13
+ }
14
+ else if (ts.isElementAccessExpression(parent)) {
15
+ const identifier = stripQuotes(parent.argumentExpression.getText());
16
+ const pos = parent.argumentExpression.getStart();
17
+ return { node, identifier, type: SymbolType.UNKNOWN, pos };
18
+ }
19
+ else if (ts.isBinaryExpression(parent)) {
20
+ const expr = parent.right;
21
+ if (ts.isObjectLiteralExpression(expr) && expr.properties.every(ts.isShorthandPropertyAssignment)) {
22
+ return expr.properties.map(node => {
23
+ return { node, identifier: node.getText(), type: SymbolType.UNKNOWN, pos: node.pos };
24
+ });
25
+ }
26
+ else {
27
+ return { node, identifier: 'default', type: SymbolType.UNKNOWN, pos: node.getStart() };
28
+ }
29
+ }
30
+ }
31
+ });
@@ -0,0 +1,3 @@
1
+ import { BoundSourceFile } from '../SourceFile.js';
2
+ export declare const isNotJS: (sourceFile: BoundSourceFile) => boolean;
3
+ export declare const isJS: (sourceFile: BoundSourceFile) => boolean;
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ export const isNotJS = (sourceFile) => sourceFile.scriptKind !== ts.ScriptKind.JS && sourceFile.scriptKind !== ts.ScriptKind.JSX;
3
+ export const isJS = (sourceFile) => sourceFile.scriptKind === ts.ScriptKind.JS || sourceFile.scriptKind === ts.ScriptKind.JSX;
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,38 @@
1
+ import ts from 'typescript';
2
+ import { isImportCall, isAccessExpression, getAccessExpressionName, isVariableDeclarationList, findDescendants, } from '../../ast-helpers.js';
3
+ import { importVisitor as visit } from '../index.js';
4
+ export default visit(() => true, node => {
5
+ if (isImportCall(node)) {
6
+ if (node.arguments[0] && ts.isStringLiteralLike(node.arguments[0])) {
7
+ const specifier = node.arguments[0].text;
8
+ let _node = node.parent;
9
+ while (_node) {
10
+ if (_node.parent && ts.isCallExpression(_node.parent)) {
11
+ return { specifier, identifier: 'default' };
12
+ }
13
+ if (isAccessExpression(_node)) {
14
+ const identifier = getAccessExpressionName(_node);
15
+ const isPromiseLike = identifier === 'then';
16
+ const symbol = isPromiseLike ? 'default' : identifier;
17
+ return { identifier: symbol, specifier };
18
+ }
19
+ if (isVariableDeclarationList(_node)) {
20
+ return findDescendants(_node, ts.isVariableDeclaration).flatMap(variableDeclaration => {
21
+ if (ts.isIdentifier(variableDeclaration.name)) {
22
+ return { identifier: 'default', specifier };
23
+ }
24
+ else {
25
+ const binds = findDescendants(variableDeclaration, _node => ts.isBindingElement(_node));
26
+ return binds.flatMap(element => {
27
+ const symbol = element.propertyName?.getText() || element.name.getText();
28
+ return { identifier: symbol, specifier };
29
+ });
30
+ }
31
+ });
32
+ }
33
+ _node = _node.parent;
34
+ }
35
+ return { specifier };
36
+ }
37
+ }
38
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import ts from 'typescript';
2
+ import { isDefaultImport } from '../../ast-helpers.js';
3
+ import { importVisitor as visit } from '../index.js';
4
+ export default visit(() => true, (node, options) => {
5
+ if (ts.isImportDeclaration(node) && ts.isStringLiteralLike(node.moduleSpecifier)) {
6
+ const specifier = node.moduleSpecifier.text;
7
+ if (!node.importClause) {
8
+ return { specifier };
9
+ }
10
+ else {
11
+ if (node.importClause.isTypeOnly && options.skipTypeOnly)
12
+ return;
13
+ const imports = [];
14
+ if (isDefaultImport(node)) {
15
+ imports.push({ specifier, identifier: 'default' });
16
+ }
17
+ if (node.importClause?.namedBindings) {
18
+ if (ts.isNamespaceImport(node.importClause.namedBindings)) {
19
+ const symbol = node.importClause.namedBindings.symbol;
20
+ imports.push({ symbol, specifier, identifier: '*' });
21
+ }
22
+ if (ts.isNamedImports(node.importClause.namedBindings)) {
23
+ node.importClause.namedBindings.elements.forEach(element => {
24
+ const identifier = (element.propertyName ?? element.name).getText();
25
+ imports.push({ symbol: element.symbol, specifier, identifier });
26
+ });
27
+ }
28
+ }
29
+ return imports;
30
+ }
31
+ }
32
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,11 @@
1
+ import ts from 'typescript';
2
+ import { isNotJS } from '../helpers.js';
3
+ import { importVisitor as visit } from '../index.js';
4
+ export default visit(isNotJS, node => {
5
+ if (ts.isImportEqualsDeclaration(node) &&
6
+ ts.isExternalModuleReference(node.moduleReference) &&
7
+ ts.isStringLiteralLike(node.moduleReference.expression)) {
8
+ const specifier = node.moduleReference.expression.text;
9
+ return { specifier, identifier: 'default' };
10
+ }
11
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => (((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined)[];
3
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import importCall from './importCall.js';
2
+ import importDeclaration from './importDeclaration.js';
3
+ import importEqualsDeclaration from './importEqualsDeclaration.js';
4
+ import jsDocType from './jsDocType.js';
5
+ import reExportDeclaration from './reExportDeclaration.js';
6
+ import requireCall from './requireCall.js';
7
+ import requireResolveCall from './requireResolveCall.js';
8
+ const visitors = [
9
+ importCall,
10
+ importDeclaration,
11
+ importEqualsDeclaration,
12
+ jsDocType,
13
+ reExportDeclaration,
14
+ requireCall,
15
+ requireResolveCall,
16
+ ];
17
+ export default (sourceFile) => visitors.map(v => v(sourceFile)).filter(v => v);
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,11 @@
1
+ import ts from 'typescript';
2
+ import { isValidImportTypeNode } from '../../ast-helpers.js';
3
+ import { importVisitor as visit } from '../index.js';
4
+ export default visit(() => true, node => {
5
+ if ('jsDoc' in node) {
6
+ const type = ts.getJSDocType(node);
7
+ if (type && isValidImportTypeNode(type)) {
8
+ return { specifier: type.argument.literal.text };
9
+ }
10
+ }
11
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import ts from 'typescript';
2
+ import { importVisitor as visit } from '../index.js';
3
+ export default visit(() => true, node => {
4
+ if (ts.isExportDeclaration(node)) {
5
+ if (node.moduleSpecifier && ts.isStringLiteralLike(node.moduleSpecifier)) {
6
+ if (!node.exportClause) {
7
+ return { identifier: '*', specifier: node.moduleSpecifier.text };
8
+ }
9
+ else if (node.exportClause.kind === ts.SyntaxKind.NamespaceExport) {
10
+ return { identifier: '*', specifier: node.moduleSpecifier.text };
11
+ }
12
+ else {
13
+ const specifier = node.moduleSpecifier;
14
+ return node.exportClause.elements.map(element => {
15
+ const identifier = (element.propertyName ?? element.name).getText();
16
+ return { identifier, specifier: specifier.text };
17
+ });
18
+ }
19
+ }
20
+ }
21
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,46 @@
1
+ import ts from 'typescript';
2
+ import { isRequireCall, findAncestor, findDescendants } from '../../ast-helpers.js';
3
+ import { isJS } from '../helpers.js';
4
+ import { importVisitor as visit } from '../index.js';
5
+ export default visit(isJS, node => {
6
+ if (isRequireCall(node)) {
7
+ if (ts.isStringLiteralLike(node.arguments[0])) {
8
+ const specifier = node.arguments[0].text;
9
+ if (specifier) {
10
+ const propertyAccessExpression = findAncestor(node, _node => {
11
+ if (ts.isExpressionStatement(_node) || ts.isCallExpression(_node))
12
+ return 'STOP';
13
+ return ts.isPropertyAccessExpression(_node);
14
+ });
15
+ if (propertyAccessExpression) {
16
+ const identifier = String(propertyAccessExpression.name.escapedText);
17
+ return { identifier, specifier };
18
+ }
19
+ else {
20
+ const variableDeclaration = node.parent;
21
+ if (ts.isVariableDeclaration(variableDeclaration) &&
22
+ ts.isVariableDeclarationList(variableDeclaration.parent)) {
23
+ if (ts.isIdentifier(variableDeclaration.name)) {
24
+ return { identifier: 'default', specifier };
25
+ }
26
+ else {
27
+ const bindings = findDescendants(variableDeclaration, ts.isBindingElement);
28
+ if (bindings.length > 0) {
29
+ return bindings.map(element => {
30
+ const identifier = (element.propertyName ?? element.name).getText();
31
+ return { identifier, specifier };
32
+ });
33
+ }
34
+ else {
35
+ return { identifier: 'default', specifier };
36
+ }
37
+ }
38
+ }
39
+ else {
40
+ return { identifier: 'default', specifier };
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ });
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => import("../../getImportsAndExports.js").AddImportOptions | import("../../getImportsAndExports.js").AddImportOptions[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,14 @@
1
+ import ts from 'typescript';
2
+ import { isRequireResolveCall } from '../../ast-helpers.js';
3
+ import { isJS } from '../helpers.js';
4
+ import { importVisitor as visit } from '../index.js';
5
+ export default visit(isJS, node => {
6
+ if (isRequireResolveCall(node)) {
7
+ if (node.arguments[0] && ts.isStringLiteralLike(node.arguments[0])) {
8
+ const specifier = node.arguments[0].text;
9
+ if (specifier) {
10
+ return { specifier };
11
+ }
12
+ }
13
+ }
14
+ });
@@ -0,0 +1,10 @@
1
+ import ts from 'typescript';
2
+ import type { GetImportsAndExportsOptions, AddExportOptions, AddImportOptions } from '../getImportsAndExports.js';
3
+ type FileCondition = (sourceFile: ts.SourceFile) => boolean;
4
+ type VisitorFactory<T> = (fileCondition: FileCondition, fn: Visitor<T>) => VisitorCondition<T>;
5
+ type VisitorCondition<T> = (sourceFile: ts.SourceFile) => undefined | Visitor<T>;
6
+ type Visitor<T> = (node: ts.Node, options: GetImportsAndExportsOptions) => undefined | T | T[];
7
+ export declare const importVisitor: VisitorFactory<AddImportOptions>;
8
+ export declare const exportVisitor: VisitorFactory<AddExportOptions>;
9
+ export declare const scriptVisitor: VisitorFactory<string>;
10
+ export {};
@@ -0,0 +1,15 @@
1
+ export const importVisitor = (fileCondition, visitorFn) => sourceFile => {
2
+ if (fileCondition(sourceFile)) {
3
+ return (node, options) => visitorFn(node, options);
4
+ }
5
+ };
6
+ export const exportVisitor = (fileCondition, visitorFn) => sourceFile => {
7
+ if (fileCondition(sourceFile)) {
8
+ return (node, options) => visitorFn(node, options);
9
+ }
10
+ };
11
+ export const scriptVisitor = (fileCondition, visitorFn) => sourceFile => {
12
+ if (fileCondition(sourceFile)) {
13
+ return (node, options) => visitorFn(node, options);
14
+ }
15
+ };
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => (((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => string | string[] | undefined) | undefined)[];
3
+ export default _default;
@@ -0,0 +1,3 @@
1
+ import zx from './zx.js';
2
+ const visitors = [zx];
3
+ export default (sourceFile) => visitors.map(v => v(sourceFile)).filter(v => v);
@@ -0,0 +1,3 @@
1
+ import ts from 'typescript';
2
+ declare const _default: (sourceFile: ts.SourceFile) => ((node: ts.Node, options: import("../../getImportsAndExports.js").GetImportsAndExportsOptions) => string | string[] | undefined) | undefined;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import ts from 'typescript';
2
+ import { stripQuotes } from '../../ast-helpers.js';
3
+ import { scriptVisitor as visit } from '../index.js';
4
+ export default visit(sourceFile => ts.getShebang(sourceFile.text) === '#!/usr/bin/env zx', node => {
5
+ if (ts.isTaggedTemplateExpression(node) && node.tag.getText() === '$') {
6
+ return stripQuotes(node.template.getText());
7
+ }
8
+ });
@@ -1,3 +1,2 @@
1
1
  export declare const compact: <T>(collection: (T | undefined)[]) => T[];
2
2
  export declare const arrayify: (value?: string[] | string) => string[];
3
- export declare const partition: <T>(values: Set<T> | T[], predicate: (value: T) => boolean) => [T[], T[]];