-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
typescript-platform.ts
98 lines (92 loc) · 2.77 KB
/
typescript-platform.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import type TypeScript from 'typescript';
import type { Optimizer } from './optimizer';
import type { ResolveModuleOptions, ResolveModuleResult } from './types';
import { platform } from './utils';
export function getTsconfig(
ts: typeof TypeScript,
rootDir: string
): TypeScript.ParsedCommandLine | null {
if (ts && ts.sys) {
const tsconfigPath = ts.findConfigFile(rootDir, ts.sys.fileExists);
if (tsconfigPath) {
const tsconfigResults = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
if (!tsconfigResults.error) {
return ts.parseJsonConfigFileContent(
tsconfigResults.config,
ts.sys,
rootDir,
undefined,
tsconfigPath
);
}
}
}
return null;
}
export async function getTypeScript(optimizer: Optimizer): Promise<typeof TypeScript | null> {
if (platform === 'node') {
try {
return require(optimizer.getTypeScriptPath());
} catch (e) {
/**/
}
const module = await import('module');
const moduleRequire = module.Module.createRequire(optimizer.getRootDir());
return moduleRequire(optimizer.getTypeScriptPath());
}
return getTypeScriptSync(optimizer);
}
export function getTypeScriptSync(optimizer: Optimizer): typeof TypeScript | null {
if (platform === 'node') {
// NodeJs (CJS)
return require(optimizer.getTypeScriptPath());
} else if (platform === 'browser-webworker') {
// Browser (Web Worker)
if (!self.ts) {
(self as any).importScripts(optimizer.getTypeScriptPath());
}
return self.ts as any;
} else if (platform === 'browser-main') {
// Browser (Main)
if (!window.ts) {
throw new Error(`Browser main must already have TypeScript loaded on "window.ts"`);
}
}
return null;
}
export function resolveModuleSync(
ts: typeof TypeScript,
compilerOpts: TypeScript.CompilerOptions,
moduleResolveCache: TypeScript.ModuleResolutionCache,
opts: ResolveModuleOptions
) {
if (!opts.host) {
if (platform === 'node') {
opts.host = ts.sys;
}
}
const tsResult = ts.resolveModuleName(
opts.moduleName,
opts.containingFile,
compilerOpts,
opts.host!,
moduleResolveCache
);
const result: ResolveModuleResult = {};
if (tsResult?.resolvedModule) {
if (tsResult.resolvedModule.packageId) {
result.name = tsResult.resolvedModule.packageId.name;
result.subModuleName = tsResult.resolvedModule.packageId.subModuleName;
result.version = tsResult.resolvedModule.packageId.version;
}
result.isExternalLibraryImport = tsResult.resolvedModule.isExternalLibraryImport;
result.resolvedFileName = tsResult.resolvedModule.resolvedFileName;
}
return result;
}
declare const window: {
ts?: typeof TypeScript;
};
declare const self: {
ts?: typeof TypeScript;
};