@mxpicture/build-api 0.3.20 → 0.3.21

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.
@@ -7,6 +7,8 @@ export declare class MissingImports {
7
7
  config?: any;
8
8
  error?: ts.Diagnostic;
9
9
  } | null;
10
+ protected _service: ts.LanguageService | null;
11
+ protected _serviceHost: ts.LanguageServiceHost | null;
10
12
  constructor(tsconfigPath: string, virtualFiles: VirtualFiles);
11
13
  get missingNames(): Record<string, string[]>;
12
14
  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;aAQP,YAAY,EAAE,MAAM;IACpC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY;IAR/C,SAAS,CAAC,WAAW,EAAE;QAErB,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC;KACvB,GAAG,IAAI,CAAQ;gBAGE,YAAY,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY;IAG/C,IAAW,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAmBlD;IAED,SAAS,KAAK,OAAO,IAAI,EAAE,CAAC,eAAe,CAK1C;IAED,SAAS,KAAK,UAAU;iBArCb,GAAG;gBACJ,EAAE,CAAC,UAAU;MAkDtB;IAED,SAAS,KAAK,WAAW,IAAI,EAAE,CAAC,mBAAmB,CAmClD;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;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"}
@@ -5,6 +5,8 @@ export class MissingImports {
5
5
  tsconfigPath;
6
6
  virtualFiles;
7
7
  _configFile = null;
8
+ _service = null;
9
+ _serviceHost = null;
8
10
  constructor(tsconfigPath, virtualFiles) {
9
11
  this.tsconfigPath = tsconfigPath;
10
12
  this.virtualFiles = virtualFiles;
@@ -17,8 +19,7 @@ export class MissingImports {
17
19
  for (const diag of diagnostics) {
18
20
  if (diag.code !== 2304 || diag.start === undefined)
19
21
  continue;
20
- const source = this.virtualFiles[fileName];
21
- const text = source.slice(diag.start, diag.start + (diag.length || 0));
22
+ const text = this.virtualFiles[fileName].slice(diag.start, diag.start + (diag.length || 0));
22
23
  if (text)
23
24
  missing.add(text);
24
25
  }
@@ -28,7 +29,9 @@ export class MissingImports {
28
29
  return result;
29
30
  }
30
31
  get service() {
31
- return ts.createLanguageService(this.serviceHost, ts.createDocumentRegistry());
32
+ if (!this._service)
33
+ this._service = ts.createLanguageService(this.serviceHost, ts.createDocumentRegistry());
34
+ return this._service;
32
35
  }
33
36
  get configFile() {
34
37
  if (!this._configFile || this._configFile.error) {
@@ -39,31 +42,34 @@ export class MissingImports {
39
42
  return this._configFile;
40
43
  }
41
44
  get serviceHost() {
42
- const parsed = ts.parseJsonConfigFileContent(this.configFile.config, ts.sys, dirname(this.tsconfigPath));
43
- const allFileNames = new Set([
44
- ...parsed.fileNames,
45
- ...Object.keys(this.virtualFiles),
46
- ]);
47
- const fileVersions = new Map();
48
- for (const f of allFileNames)
49
- fileVersions.set(f, 0);
50
- return {
51
- getScriptFileNames: () => Array.from(allFileNames),
52
- getScriptVersion: (fileName) => fileVersions.get(fileName)?.toString() ?? "0",
53
- getScriptSnapshot: (fileName) => {
54
- if (this.virtualFiles[fileName])
55
- return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);
56
- if (!ts.sys.fileExists(fileName))
57
- return undefined;
58
- return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || "");
59
- },
60
- getCurrentDirectory: () => cwd(),
61
- getCompilationSettings: () => parsed.options,
62
- getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),
63
- fileExists: (fileName) => fileName in this.virtualFiles || ts.sys.fileExists(fileName),
64
- readFile: (fileName) => this.virtualFiles[fileName] ?? ts.sys.readFile(fileName),
65
- readDirectory: ts.sys.readDirectory,
66
- };
45
+ if (!this._serviceHost) {
46
+ const parsed = ts.parseJsonConfigFileContent(this.configFile.config, ts.sys, dirname(this.tsconfigPath));
47
+ const allFileNames = new Set([
48
+ ...parsed.fileNames,
49
+ ...Object.keys(this.virtualFiles),
50
+ ]);
51
+ const fileVersions = new Map();
52
+ for (const f of allFileNames)
53
+ fileVersions.set(f, 0);
54
+ this._serviceHost = {
55
+ getScriptFileNames: () => Array.from(allFileNames),
56
+ getScriptVersion: (fileName) => fileVersions.get(fileName)?.toString() ?? "0",
57
+ getScriptSnapshot: (fileName) => {
58
+ if (this.virtualFiles[fileName])
59
+ return ts.ScriptSnapshot.fromString(this.virtualFiles[fileName]);
60
+ if (!ts.sys.fileExists(fileName))
61
+ return undefined;
62
+ return ts.ScriptSnapshot.fromString(ts.sys.readFile(fileName) || "");
63
+ },
64
+ getCurrentDirectory: () => cwd(),
65
+ getCompilationSettings: () => parsed.options,
66
+ 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),
69
+ readDirectory: ts.sys.readDirectory,
70
+ };
71
+ }
72
+ return this._serviceHost;
67
73
  }
68
74
  }
69
75
  //# sourceMappingURL=MissingImports.js.map
@@ -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 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 source = this.virtualFiles[fileName];\n const text = source.slice(diag.start, diag.start + (diag.length || 0));\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 return ts.createLanguageService(\n this.serviceHost,\n ts.createDocumentRegistry(),\n );\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 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 return {\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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/build-api",
3
- "version": "0.3.20",
3
+ "version": "0.3.21",
4
4
  "description": "Build utilities API",
5
5
  "type": "module",
6
6
  "author": "MXPicture",