@mxpicture/build-api 0.3.24 → 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.
@@ -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;aAWP,YAAY,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAX/C,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;gBAG3C,YAAY,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY;IAG/C,IAAW,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAqBlD;IAED,SAAS,KAAK,OAAO,IAAI,EAAE,CAAC,eAAe,CAO1C;IAED,SAAS,KAAK,UAAU;iBA5Cb,GAAG;gBACJ,EAAE,CAAC,UAAU;MAyDtB;IAED,SAAS,KAAK,WAAW,IAAI,EAAE,CAAC,mBAAmB,CAuClD;CACF"}
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.virtualFiles = virtualFiles;
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 fileName of Object.keys(this.virtualFiles)) {
17
- const diagnostics = this.service.getSemanticDiagnostics(fileName);
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 = this.virtualFiles[fileName].slice(diag.start, diag.start + (diag.length || 0));
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[fileName] = Array.from(missing);
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
- ...Object.keys(this.virtualFiles),
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
- if (this.virtualFiles[fileName])
59
- return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);
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) => fileName in this.virtualFiles || ts.sys.fileExists(fileName),
68
- readFile: (fileName) => this.virtualFiles[fileName] ?? ts.sys.readFile(fileName),
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":"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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\n public constructor(\n public readonly tsconfigPath: string,\n protected readonly virtualFiles: VirtualFiles,\n ) {}\n\n public get missingNames(): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n\n for (const fileName of Object.keys(this.virtualFiles)) {\n const diagnostics = this.service.getSemanticDiagnostics(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 = this.virtualFiles[fileName].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[fileName] = 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 ...Object.keys(this.virtualFiles),\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 if (this.virtualFiles[fileName])\n return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);\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 fileName in this.virtualFiles || ts.sys.fileExists(fileName),\n readFile: (fileName) =>\n this.virtualFiles[fileName] ?? ts.sys.readFile(fileName),\n readDirectory: ts.sys.readDirectory,\n };\n }\n\n return this._serviceHost;\n }\n}\n"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/build-api",
3
- "version": "0.3.24",
3
+ "version": "0.3.25",
4
4
  "description": "Build utilities API",
5
5
  "type": "module",
6
6
  "author": "MXPicture",