@mxpicture/build-api 0.3.23 → 0.3.25
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/dist/exp/ExportsExtractorItem.d.ts.map +1 -1
- package/dist/exp/ExportsExtractorItem.js +3 -3
- package/dist/exp/ExportsExtractorItem.js.map +1 -1
- package/dist/imp/MissingImports.d.ts +5 -1
- package/dist/imp/MissingImports.d.ts.map +1 -1
- package/dist/imp/MissingImports.js +20 -11
- package/dist/imp/MissingImports.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportsExtractorItem.d.ts","sourceRoot":"","sources":["../../src/exp/ExportsExtractorItem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,cAAc,EACd,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAQ7B,SAAS,CAAC,OAAO,EAAE,cAAc;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE;IACrC,SAAS,CAAC,cAAc,CAAC,EAAE,qBAAqB;IAVlD;;;;;OAKG;gBAES,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAAA,EAChC,QAAQ,CAAC,EAAE,cAAc,EAAE,YAAA,EAC3B,cAAc,CAAC,EAAE,qBAAqB,YAAA;IAGlD;;OAEG;IACU,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;IAuCvC;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,UAAU,EAAE;IAmCf;;OAEG;cACa,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBxB;;OAEG;cACa,qBAAqB,CACnC,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;IAiBxB;;OAEG;cACa,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;cAsCrD,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,EAAE,EACvB,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ExportsExtractorItem.d.ts","sourceRoot":"","sources":["../../src/exp/ExportsExtractorItem.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,cAAc,EACd,UAAU,EACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAQ7B,SAAS,CAAC,OAAO,EAAE,cAAc;IACjC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE;IACrC,SAAS,CAAC,cAAc,CAAC,EAAE,qBAAqB;IAVlD;;;;;OAKG;gBAES,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,YAAA,EAChC,QAAQ,CAAC,EAAE,cAAc,EAAE,YAAA,EAC3B,cAAc,CAAC,EAAE,qBAAqB,YAAA;IAGlD;;OAEG;IACU,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;IAuCvC;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,UAAU,EAAE;IAmCf;;OAEG;cACa,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBxB;;OAEG;cACa,qBAAqB,CACnC,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;IAiBxB;;OAEG;cACa,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;cAsCrD,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,EAAE,EACvB,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,UAAU,EAAE,CAAC;CAuCzB"}
|
|
@@ -155,7 +155,7 @@ export class ExportsExtractorItem {
|
|
|
155
155
|
return nodeItems;
|
|
156
156
|
}
|
|
157
157
|
async replaceAbsoluteSourcePaths(root, nodeItems, entrypoints) {
|
|
158
|
-
return await Promise.all(nodeItems.map(async (item) => {
|
|
158
|
+
return (await Promise.all(nodeItems.map(async (item) => {
|
|
159
159
|
const node = structuredClone(item);
|
|
160
160
|
if (!isAbsolute(node.source) || !node.source.startsWith(root))
|
|
161
161
|
throw new Error(`Source path not supported. ${node.source}`);
|
|
@@ -177,10 +177,10 @@ export class ExportsExtractorItem {
|
|
|
177
177
|
throw new Error(`No index.{js,ts} found for ${node.source}`);
|
|
178
178
|
const entrypoint = entrypoints.find((point) => point.file === subIndex);
|
|
179
179
|
if (!entrypoint)
|
|
180
|
-
|
|
180
|
+
return null;
|
|
181
181
|
node.source = entrypoint.id;
|
|
182
182
|
return node;
|
|
183
|
-
}));
|
|
183
|
+
}))).filter((node) => !!node);
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
186
|
//# sourceMappingURL=ExportsExtractorItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportsExtractorItem.js","sourceRoot":"","sources":["../../src/exp/ExportsExtractorItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, isAbsolute, join, relative } from \"node:path\";\nimport ts from \"typescript\";\nimport { resolve as resolveExports } from \"resolve.exports\";\nimport { readPackageJson } from \"../pkg/pkg.fs.js\";\nimport type {\n EntryPoint,\n ExportNode,\n ExportsCommonExcludes,\n ExportsPattern,\n PackageAPI,\n} from \"../types/types.exports.js\";\nimport type { PackageJson } from \"../types/types.package.js\";\nimport { createSourceFileMap } from \"../code/code.common.js\";\nimport { readdir } from \"node:fs/promises\";\nimport type { ExportsContent } from \"./ExportsContent.js\";\nimport type { SourceFile } from \"../types/types.code.js\";\nimport { resolvePackageRoot } from \"./exports.package.js\";\nimport { readFilePaths, readDTsFilePaths } from \"./exports.file.js\";\nimport { loadModule } from \"./exports.module.js\";\nimport {\n removeNodes,\n packageJsonPattern,\n removeKnownDuplicateNodes,\n} from \"./exports.node.js\";\n\n/**\n * Extracts runtime and type exports for a single package.\n *\n * @remarks\n * Walks an installed package's entry-points and declaration files\n * using the TypeScript compiler API to discover all exported symbols.\n */\nexport class ExportsExtractorItem {\n /**\n * Analyze an installed package and produce\n * a structured API representation.\n *\n * @param pkg package name\n */\n public constructor(\n protected content: ExportsContent,\n protected srcMap?: Map<string, SourceFile>,\n protected excludes?: ExportsPattern[],\n protected commonExcludes?: ExportsCommonExcludes,\n ) {}\n\n /**\n * Analyze an installed package and build its API model.\n */\n public async run(): Promise<PackageAPI> {\n const pkg = this.content.pkg;\n const root = resolvePackageRoot(pkg.packageName);\n const pkgJson = await readPackageJson(root);\n\n let entrypoints = this.resolveEntrypoints(pkg.packageName, pkgJson);\n entrypoints = await this.expandWildcardEntrypoints(root, entrypoints);\n\n const runtimeExports = await this.inspectRuntimeExports(entrypoints);\n let typeExports = await this.parseTypeExports(root);\n typeExports = await this.replaceAbsoluteSourcePaths(\n root,\n typeExports,\n entrypoints,\n );\n\n for (const excl of this.excludes ?? [])\n removeNodes(excl, runtimeExports, typeExports);\n\n if (this.commonExcludes?.excludePackageJson)\n removeNodes(packageJsonPattern, runtimeExports, typeExports);\n\n if (this.commonExcludes?.excludeKnownDuplicates)\n removeKnownDuplicateNodes(runtimeExports, typeExports);\n\n // sort\n pkg.packageName = pkgJson.name;\n pkg.entrypoints = entrypoints.sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n );\n pkg.runtimeExports = runtimeExports.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n );\n pkg.typeExports = typeExports.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n );\n return pkg;\n }\n\n /**\n * Resolve entrypoints using the Node exports algorithm.\n */\n protected resolveEntrypoints(\n pkg: string,\n pkgJson: PackageJson,\n ): EntryPoint[] {\n const entrypoints: EntryPoint[] = [];\n\n if (!pkgJson.exports) {\n entrypoints.push({ id: pkg });\n return entrypoints;\n }\n\n const keys = Object.keys(pkgJson.exports);\n\n for (const key of keys) {\n try {\n const resolved = resolveExports(pkgJson, key, {\n conditions: [\"node\", \"import\", \"require\", \"default\"],\n });\n\n if (!resolved) continue;\n\n const files = Array.isArray(resolved) ? resolved : [resolved];\n\n for (const file of files) {\n const specifier =\n key === \".\" ? pkg : `${pkg}/${key.replace(\"./\", \"\")}`;\n\n entrypoints.push({\n id: specifier,\n file,\n });\n }\n } catch {}\n }\n\n return entrypoints;\n }\n\n /**\n * Expand wildcard export patterns.\n */\n protected async expandWildcardEntrypoints(\n root: string,\n entrypoints: EntryPoint[],\n ): Promise<EntryPoint[]> {\n return (\n await Promise.allSettled(\n entrypoints.map(async (entry) => {\n if (!entry.file?.includes(\"*\")) return [entry];\n\n const pattern = entry.file;\n const files = await readFilePaths(pattern, root);\n\n return files.map((file) => ({\n id: relative(root, file).replace(/\\.(js|mjs|cjs)$/, \"\"),\n file,\n }));\n }),\n )\n )\n .filter((r) => r.status === \"fulfilled\")\n .flatMap((r) => r.value);\n }\n\n /**\n * Extract runtime exports from entrypoints.\n */\n protected async inspectRuntimeExports(\n entrypoints: EntryPoint[],\n ): Promise<ExportNode[]> {\n return (\n await Promise.allSettled(\n entrypoints.map(async (entry) => {\n const mod = await loadModule(entry.id);\n return Object.keys(mod).map((name) => ({\n name,\n kind: typeof mod[name],\n source: entry.id,\n }));\n }),\n )\n )\n .filter((r) => r.status === \"fulfilled\")\n .flatMap((r) => r.value);\n }\n\n /**\n * Parse TypeScript declaration files to extract exported types.\n */\n protected async parseTypeExports(root: string): Promise<ExportNode[]> {\n const nodeItems: ExportNode[] = [];\n const filePaths = await readDTsFilePaths(root);\n const srcMap = this.srcMap ?? createSourceFileMap(filePaths);\n\n for (const filePath of filePaths) {\n const file = srcMap.get(filePath);\n if (!file) continue;\n\n ts.forEachChild(file.sourceFile, (node) => {\n if (\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isClassDeclaration(node) ||\n ts.isFunctionDeclaration(node)\n ) {\n if (!node.name) return;\n\n nodeItems.push({\n name: node.name.text,\n kind: ts.SyntaxKind[node.kind],\n source: filePath,\n });\n }\n\n if (ts.isEnumDeclaration(node)) {\n nodeItems.push({\n name: node.name.text,\n kind: \"enum\",\n source: filePath,\n });\n }\n });\n }\n\n return nodeItems;\n }\n\n protected async replaceAbsoluteSourcePaths(\n root: string,\n nodeItems: ExportNode[],\n entrypoints: EntryPoint[],\n ): Promise<ExportNode[]> {\n return await Promise.all(\n nodeItems.map(async (item): Promise<ExportNode> => {\n const node = structuredClone(item);\n if (!isAbsolute(node.source) || !node.source.startsWith(root))\n throw new Error(`Source path not supported. ${node.source}`);\n\n let subPath = relative(root, node.source);\n // ensure path is starting with \"./\" to match entrypoints\n if (!subPath.startsWith(\"./\")) subPath = `./${subPath}`;\n\n // replace *.d.ts by index.js to match entrypoints\n const subDir = dirname(subPath);\n\n // check for index.js existance (.ts is also allowed)\n const absSubDir = join(root, subDir);\n const filenames = await readdir(absSubDir);\n\n const subIndex = filenames.includes(\"index.ts\")\n ? `${subDir}/index.ts`\n : filenames.includes(\"index.js\")\n ? `${subDir}/index.js`\n : null;\n\n if (!subIndex)\n throw new Error(`No index.{js,ts} found for ${node.source}`);\n\n const entrypoint = entrypoints.find((point) => point.file === subIndex);\n if (!entrypoint)\n throw new Error(`No entrypoint found for ${node.source}`);\n\n node.source = entrypoint.id;\n return node;\n }),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExportsExtractorItem.js","sourceRoot":"","sources":["../../src/exp/ExportsExtractorItem.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname, isAbsolute, join, relative } from \"node:path\";\nimport ts from \"typescript\";\nimport { resolve as resolveExports } from \"resolve.exports\";\nimport { readPackageJson } from \"../pkg/pkg.fs.js\";\nimport type {\n EntryPoint,\n ExportNode,\n ExportsCommonExcludes,\n ExportsPattern,\n PackageAPI,\n} from \"../types/types.exports.js\";\nimport type { PackageJson } from \"../types/types.package.js\";\nimport { createSourceFileMap } from \"../code/code.common.js\";\nimport { readdir } from \"node:fs/promises\";\nimport type { ExportsContent } from \"./ExportsContent.js\";\nimport type { SourceFile } from \"../types/types.code.js\";\nimport { resolvePackageRoot } from \"./exports.package.js\";\nimport { readFilePaths, readDTsFilePaths } from \"./exports.file.js\";\nimport { loadModule } from \"./exports.module.js\";\nimport {\n removeNodes,\n packageJsonPattern,\n removeKnownDuplicateNodes,\n} from \"./exports.node.js\";\n\n/**\n * Extracts runtime and type exports for a single package.\n *\n * @remarks\n * Walks an installed package's entry-points and declaration files\n * using the TypeScript compiler API to discover all exported symbols.\n */\nexport class ExportsExtractorItem {\n /**\n * Analyze an installed package and produce\n * a structured API representation.\n *\n * @param pkg package name\n */\n public constructor(\n protected content: ExportsContent,\n protected srcMap?: Map<string, SourceFile>,\n protected excludes?: ExportsPattern[],\n protected commonExcludes?: ExportsCommonExcludes,\n ) {}\n\n /**\n * Analyze an installed package and build its API model.\n */\n public async run(): Promise<PackageAPI> {\n const pkg = this.content.pkg;\n const root = resolvePackageRoot(pkg.packageName);\n const pkgJson = await readPackageJson(root);\n\n let entrypoints = this.resolveEntrypoints(pkg.packageName, pkgJson);\n entrypoints = await this.expandWildcardEntrypoints(root, entrypoints);\n\n const runtimeExports = await this.inspectRuntimeExports(entrypoints);\n let typeExports = await this.parseTypeExports(root);\n typeExports = await this.replaceAbsoluteSourcePaths(\n root,\n typeExports,\n entrypoints,\n );\n\n for (const excl of this.excludes ?? [])\n removeNodes(excl, runtimeExports, typeExports);\n\n if (this.commonExcludes?.excludePackageJson)\n removeNodes(packageJsonPattern, runtimeExports, typeExports);\n\n if (this.commonExcludes?.excludeKnownDuplicates)\n removeKnownDuplicateNodes(runtimeExports, typeExports);\n\n // sort\n pkg.packageName = pkgJson.name;\n pkg.entrypoints = entrypoints.sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n );\n pkg.runtimeExports = runtimeExports.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n );\n pkg.typeExports = typeExports.sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n );\n return pkg;\n }\n\n /**\n * Resolve entrypoints using the Node exports algorithm.\n */\n protected resolveEntrypoints(\n pkg: string,\n pkgJson: PackageJson,\n ): EntryPoint[] {\n const entrypoints: EntryPoint[] = [];\n\n if (!pkgJson.exports) {\n entrypoints.push({ id: pkg });\n return entrypoints;\n }\n\n const keys = Object.keys(pkgJson.exports);\n\n for (const key of keys) {\n try {\n const resolved = resolveExports(pkgJson, key, {\n conditions: [\"node\", \"import\", \"require\", \"default\"],\n });\n\n if (!resolved) continue;\n\n const files = Array.isArray(resolved) ? resolved : [resolved];\n\n for (const file of files) {\n const specifier =\n key === \".\" ? pkg : `${pkg}/${key.replace(\"./\", \"\")}`;\n\n entrypoints.push({\n id: specifier,\n file,\n });\n }\n } catch {}\n }\n\n return entrypoints;\n }\n\n /**\n * Expand wildcard export patterns.\n */\n protected async expandWildcardEntrypoints(\n root: string,\n entrypoints: EntryPoint[],\n ): Promise<EntryPoint[]> {\n return (\n await Promise.allSettled(\n entrypoints.map(async (entry) => {\n if (!entry.file?.includes(\"*\")) return [entry];\n\n const pattern = entry.file;\n const files = await readFilePaths(pattern, root);\n\n return files.map((file) => ({\n id: relative(root, file).replace(/\\.(js|mjs|cjs)$/, \"\"),\n file,\n }));\n }),\n )\n )\n .filter((r) => r.status === \"fulfilled\")\n .flatMap((r) => r.value);\n }\n\n /**\n * Extract runtime exports from entrypoints.\n */\n protected async inspectRuntimeExports(\n entrypoints: EntryPoint[],\n ): Promise<ExportNode[]> {\n return (\n await Promise.allSettled(\n entrypoints.map(async (entry) => {\n const mod = await loadModule(entry.id);\n return Object.keys(mod).map((name) => ({\n name,\n kind: typeof mod[name],\n source: entry.id,\n }));\n }),\n )\n )\n .filter((r) => r.status === \"fulfilled\")\n .flatMap((r) => r.value);\n }\n\n /**\n * Parse TypeScript declaration files to extract exported types.\n */\n protected async parseTypeExports(root: string): Promise<ExportNode[]> {\n const nodeItems: ExportNode[] = [];\n const filePaths = await readDTsFilePaths(root);\n const srcMap = this.srcMap ?? createSourceFileMap(filePaths);\n\n for (const filePath of filePaths) {\n const file = srcMap.get(filePath);\n if (!file) continue;\n\n ts.forEachChild(file.sourceFile, (node) => {\n if (\n ts.isInterfaceDeclaration(node) ||\n ts.isTypeAliasDeclaration(node) ||\n ts.isClassDeclaration(node) ||\n ts.isFunctionDeclaration(node)\n ) {\n if (!node.name) return;\n\n nodeItems.push({\n name: node.name.text,\n kind: ts.SyntaxKind[node.kind],\n source: filePath,\n });\n }\n\n if (ts.isEnumDeclaration(node)) {\n nodeItems.push({\n name: node.name.text,\n kind: \"enum\",\n source: filePath,\n });\n }\n });\n }\n\n return nodeItems;\n }\n\n protected async replaceAbsoluteSourcePaths(\n root: string,\n nodeItems: ExportNode[],\n entrypoints: EntryPoint[],\n ): Promise<ExportNode[]> {\n return (\n await Promise.all(\n nodeItems.map(async (item): Promise<ExportNode | null> => {\n const node = structuredClone(item);\n if (!isAbsolute(node.source) || !node.source.startsWith(root))\n throw new Error(`Source path not supported. ${node.source}`);\n\n let subPath = relative(root, node.source);\n // ensure path is starting with \"./\" to match entrypoints\n if (!subPath.startsWith(\"./\")) subPath = `./${subPath}`;\n\n // replace *.d.ts by index.js to match entrypoints\n const subDir = dirname(subPath);\n\n // check for index.js existance (.ts is also allowed)\n const absSubDir = join(root, subDir);\n const filenames = await readdir(absSubDir);\n\n const subIndex = filenames.includes(\"index.ts\")\n ? `${subDir}/index.ts`\n : filenames.includes(\"index.js\")\n ? `${subDir}/index.js`\n : null;\n\n if (!subIndex)\n throw new Error(`No index.{js,ts} found for ${node.source}`);\n\n const entrypoint = entrypoints.find(\n (point) => point.file === subIndex,\n );\n if (!entrypoint) return null;\n\n node.source = entrypoint.id;\n return node;\n }),\n )\n ).filter((node) => !!node);\n }\n}\n"]}
|
|
@@ -2,13 +2,17 @@ import ts from "typescript";
|
|
|
2
2
|
export type VirtualFiles = Record<string, string>;
|
|
3
3
|
export declare class MissingImports {
|
|
4
4
|
readonly tsconfigPath: string;
|
|
5
|
-
protected readonly virtualFiles: VirtualFiles;
|
|
6
5
|
protected _configFile: {
|
|
7
6
|
config?: any;
|
|
8
7
|
error?: ts.Diagnostic;
|
|
9
8
|
} | null;
|
|
10
9
|
protected _service: ts.LanguageService | null;
|
|
11
10
|
protected _serviceHost: ts.LanguageServiceHost | null;
|
|
11
|
+
protected _virtualFiles: {
|
|
12
|
+
virtualPath: string;
|
|
13
|
+
filename: string;
|
|
14
|
+
content: string;
|
|
15
|
+
}[];
|
|
12
16
|
constructor(tsconfigPath: string, virtualFiles: VirtualFiles);
|
|
13
17
|
get missingNames(): Record<string, string[]>;
|
|
14
18
|
protected get service(): ts.LanguageService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MissingImports.d.ts","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"MissingImports.d.ts","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,qBAAa,cAAc;aAgBP,YAAY,EAAE,MAAM;IAftC,SAAS,CAAC,WAAW,EAAE;QAErB,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;KACvB,GAAG,IAAI,CAAQ;IAEhB,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,GAAG,IAAI,CAAQ;IACrD,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,mBAAmB,GAAG,IAAI,CAAQ;IAC7D,SAAS,CAAC,aAAa,EAAE;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;gBAGc,YAAY,EAAE,MAAM,EACpC,YAAY,EAAE,YAAY;IAS5B,IAAW,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqBlD;IAED,SAAS,KAAK,OAAO,IAAI,EAAE,CAAC,eAAe,CAO1C;IAED,SAAS,KAAK,UAAU;iBAvDb,GAAG;gBACJ,EAAE,CAAC,UAAU;MAoEtB;IAED,SAAS,KAAK,WAAW,IAAI,EAAE,CAAC,mBAAmB,CA2ClD;CACF"}
|
|
@@ -3,28 +3,32 @@ import { cwd } from "node:process";
|
|
|
3
3
|
import ts from "typescript";
|
|
4
4
|
export class MissingImports {
|
|
5
5
|
tsconfigPath;
|
|
6
|
-
virtualFiles;
|
|
7
6
|
_configFile = null;
|
|
8
7
|
_service = null;
|
|
9
8
|
_serviceHost = null;
|
|
9
|
+
_virtualFiles;
|
|
10
10
|
constructor(tsconfigPath, virtualFiles) {
|
|
11
11
|
this.tsconfigPath = tsconfigPath;
|
|
12
|
-
this.
|
|
12
|
+
this._virtualFiles = Object.entries(virtualFiles).map((f) => ({
|
|
13
|
+
virtualPath: f[0],
|
|
14
|
+
content: f[1],
|
|
15
|
+
filename: f[0].replaceAll("/", "x"),
|
|
16
|
+
}));
|
|
13
17
|
}
|
|
14
18
|
get missingNames() {
|
|
15
19
|
const result = {};
|
|
16
|
-
for (const
|
|
17
|
-
const diagnostics = this.service.getSemanticDiagnostics(
|
|
20
|
+
for (const file of this._virtualFiles) {
|
|
21
|
+
const diagnostics = this.service.getSemanticDiagnostics(file.filename);
|
|
18
22
|
const missing = new Set();
|
|
19
23
|
for (const diag of diagnostics) {
|
|
20
24
|
if (diag.code !== 2304 || diag.start === undefined)
|
|
21
25
|
continue;
|
|
22
|
-
const text =
|
|
26
|
+
const text = file.content.slice(diag.start, diag.start + (diag.length || 0));
|
|
23
27
|
if (text)
|
|
24
28
|
missing.add(text);
|
|
25
29
|
}
|
|
26
30
|
if (missing.size > 0)
|
|
27
|
-
result[
|
|
31
|
+
result[file.virtualPath] = Array.from(missing);
|
|
28
32
|
}
|
|
29
33
|
return result;
|
|
30
34
|
}
|
|
@@ -46,7 +50,7 @@ export class MissingImports {
|
|
|
46
50
|
const parsed = ts.parseJsonConfigFileContent(this.configFile.config, ts.sys, dirname(this.tsconfigPath));
|
|
47
51
|
const allFileNames = new Set([
|
|
48
52
|
...parsed.fileNames,
|
|
49
|
-
...
|
|
53
|
+
...this._virtualFiles.map((f) => f.filename),
|
|
50
54
|
]);
|
|
51
55
|
const fileVersions = new Map();
|
|
52
56
|
for (const f of allFileNames)
|
|
@@ -55,8 +59,9 @@ export class MissingImports {
|
|
|
55
59
|
getScriptFileNames: () => Array.from(allFileNames),
|
|
56
60
|
getScriptVersion: (fileName) => fileVersions.get(fileName)?.toString() ?? "0",
|
|
57
61
|
getScriptSnapshot: (fileName) => {
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
const found = this._virtualFiles.find((f) => f.filename === fileName);
|
|
63
|
+
if (found)
|
|
64
|
+
return ts.ScriptSnapshot.fromString(found.content);
|
|
60
65
|
if (!ts.sys.fileExists(fileName))
|
|
61
66
|
return undefined;
|
|
62
67
|
return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || "");
|
|
@@ -64,8 +69,12 @@ export class MissingImports {
|
|
|
64
69
|
getCurrentDirectory: () => cwd(),
|
|
65
70
|
getCompilationSettings: () => parsed.options,
|
|
66
71
|
getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),
|
|
67
|
-
fileExists: (fileName) =>
|
|
68
|
-
|
|
72
|
+
fileExists: (fileName) => !!this._virtualFiles.find((f) => f.filename === fileName) ||
|
|
73
|
+
ts.sys.fileExists(fileName),
|
|
74
|
+
readFile: (fileName) => {
|
|
75
|
+
const found = this._virtualFiles.find((f) => f.filename === fileName);
|
|
76
|
+
return found?.content ?? ts.sys.readFile(fileName);
|
|
77
|
+
},
|
|
69
78
|
readDirectory: ts.sys.readDirectory,
|
|
70
79
|
};
|
|
71
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MissingImports.js","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"MissingImports.js","sourceRoot":"","sources":["../../src/imp/MissingImports.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from \"node:path\";\nimport { cwd } from \"node:process\";\nimport ts from \"typescript\";\n\nexport type VirtualFiles = Record<string, string>;\n\nexport class MissingImports {\n protected _configFile: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config?: any;\n error?: ts.Diagnostic;\n } | null = null;\n\n protected _service: ts.LanguageService | null = null;\n protected _serviceHost: ts.LanguageServiceHost | null = null;\n protected _virtualFiles: {\n virtualPath: string;\n filename: string;\n content: string;\n }[];\n\n public constructor(\n public readonly tsconfigPath: string,\n virtualFiles: VirtualFiles,\n ) {\n this._virtualFiles = Object.entries(virtualFiles).map((f) => ({\n virtualPath: f[0],\n content: f[1],\n filename: f[0].replaceAll(\"/\", \"x\"),\n }));\n }\n\n public get missingNames(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const file of this._virtualFiles) {\n const diagnostics = this.service.getSemanticDiagnostics(file.filename);\n\n const missing = new Set<string>();\n\n for (const diag of diagnostics) {\n if (diag.code !== 2304 || diag.start === undefined) continue;\n const text = file.content.slice(\n diag.start,\n diag.start + (diag.length || 0),\n );\n if (text) missing.add(text);\n }\n\n if (missing.size > 0) result[file.virtualPath] = Array.from(missing);\n }\n\n return result;\n }\n\n protected get service(): ts.LanguageService {\n if (!this._service)\n this._service = ts.createLanguageService(\n this.serviceHost,\n ts.createDocumentRegistry(),\n );\n return this._service;\n }\n\n protected get configFile() {\n if (!this._configFile || this._configFile.error) {\n this._configFile = ts.readConfigFile(this.tsconfigPath, ts.sys.readFile);\n\n if (this._configFile.error)\n throw new Error(\n ts.flattenDiagnosticMessageText(\n this._configFile.error.messageText,\n \"\\n\",\n ),\n );\n }\n\n return this._configFile;\n }\n\n protected get serviceHost(): ts.LanguageServiceHost {\n if (!this._serviceHost) {\n const parsed = ts.parseJsonConfigFileContent(\n this.configFile.config,\n ts.sys,\n dirname(this.tsconfigPath),\n );\n\n const allFileNames = new Set([\n ...parsed.fileNames,\n ...this._virtualFiles.map((f) => f.filename),\n ]);\n\n const fileVersions = new Map<string, number>();\n for (const f of allFileNames) fileVersions.set(f, 0);\n\n this._serviceHost = {\n getScriptFileNames: () => Array.from(allFileNames),\n getScriptVersion: (fileName) =>\n fileVersions.get(fileName)?.toString() ?? \"0\",\n getScriptSnapshot: (fileName) => {\n const found = this._virtualFiles.find((f) => f.filename === fileName);\n if (found) return ts.ScriptSnapshot.fromString(found.content);\n\n if (!ts.sys.fileExists(fileName)) return undefined;\n return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || \"\");\n },\n getCurrentDirectory: () => cwd(),\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),\n fileExists: (fileName) =>\n !!this._virtualFiles.find((f) => f.filename === fileName) ||\n ts.sys.fileExists(fileName),\n\n readFile: (fileName) => {\n const found = this._virtualFiles.find((f) => f.filename === fileName);\n return found?.content ?? ts.sys.readFile(fileName);\n },\n readDirectory: ts.sys.readDirectory,\n };\n }\n\n return this._serviceHost;\n }\n}\n"]}
|