Skip to content

Commit 4cc348e

Browse files
PlayBridgeJS: Use @typescript/vfs to load lib.d.ts
1 parent a31a107 commit 4cc348e

File tree

3 files changed

+49
-27
lines changed

3 files changed

+49
-27
lines changed

Examples/PlayBridgeJS/Sources/JavaScript/app.js

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import { EditorSystem } from './editor.js';
33
import ts from 'typescript';
44
import { TypeProcessor } from './processor.js';
55
import { CodeShareManager } from './code-share.js';
6+
import {
7+
createSystem,
8+
createDefaultMapFromCDN,
9+
createVirtualCompilerHost
10+
} from '@typescript/vfs';
611

712
/**
813
* @typedef {import('../../.build/plugins/PackageToJS/outputs/Package/bridge-js.js').PlayBridgeJS} PlayBridgeJS
@@ -81,12 +86,11 @@ export class BridgeJSPlayground {
8186
try {
8287
// Import the BridgeJS module
8388
const { init } = await import("../../.build/plugins/PackageToJS/outputs/Package/index.js");
89+
const virtualHost = await this.createTS2SkeletonFactory();
8490
const { exports } = await init({
85-
getImports: () => {
86-
return {
87-
createTS2Skeleton: this.createTS2Skeleton
88-
};
89-
}
91+
getImports: () => ({
92+
createTS2Skeleton: () => this.createTS2Skeleton(virtualHost)
93+
})
9094
});
9195
this.playBridgeJS = new exports.PlayBridgeJS();
9296
console.log('BridgeJS initialized successfully');
@@ -171,32 +175,44 @@ export class BridgeJSPlayground {
171175
});
172176
}
173177

174-
createTS2Skeleton() {
178+
async createTS2SkeletonFactory() {
179+
const createVirtualHost = async () => {
180+
const fsMap = await createDefaultMapFromCDN(
181+
{ target: ts.ScriptTarget.ES2015 },
182+
ts.version,
183+
true,
184+
ts
185+
);
186+
187+
const system = createSystem(fsMap);
188+
189+
const compilerOptions = {
190+
target: ts.ScriptTarget.ES2015,
191+
lib: ["es2015", "dom"],
192+
};
193+
194+
return createVirtualCompilerHost(system, compilerOptions, ts);
195+
}
196+
return await createVirtualHost();
197+
}
198+
199+
/**
200+
* @param {ReturnType<typeof createVirtualCompilerHost>} virtualHost
201+
*/
202+
createTS2Skeleton(virtualHost) {
175203
return {
204+
/**
205+
* @param {string} dtsCode
206+
* @returns {string}
207+
*/
176208
convert: (dtsCode) => {
177-
const virtualFilePath = "bridge-js.d.ts"
178-
const virtualHost = {
179-
fileExists: fileName => fileName === virtualFilePath,
180-
readFile: fileName => dtsCode,
181-
getSourceFile: (fileName, languageVersion) => {
182-
const sourceText = dtsCode;
183-
if (sourceText === undefined) return undefined;
184-
return ts.createSourceFile(fileName, sourceText, languageVersion);
185-
},
186-
getDefaultLibFileName: options => "lib.d.ts",
187-
writeFile: (fileName, data) => {
188-
console.log(`[emit] ${fileName}:\n${data}`);
189-
},
190-
getCurrentDirectory: () => "",
191-
getDirectories: () => [],
192-
getCanonicalFileName: fileName => fileName,
193-
getNewLine: () => "\n",
194-
useCaseSensitiveFileNames: () => true
195-
}
196209
// Create TypeScript program from d.ts content
210+
const virtualFilePath = "bridge-js.d.ts"
211+
const sourceFile = ts.createSourceFile(virtualFilePath, dtsCode, ts.ScriptTarget.ES2015);
212+
virtualHost.updateFile(sourceFile);
197213
const tsProgram = ts.createProgram({
198214
rootNames: [virtualFilePath],
199-
host: virtualHost,
215+
host: virtualHost.compilerHost,
200216
options: {
201217
noEmit: true,
202218
declaration: true,

Examples/PlayBridgeJS/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
<script type="importmap">
1010
{
1111
"imports": {
12-
"typescript": "https://esm.sh/[email protected]"
12+
"typescript": "https://esm.sh/[email protected]",
13+
"@typescript/vfs": "https://esm.sh/@typescript/[email protected]"
1314
}
1415
}
1516
</script>

Examples/PlayBridgeJS/package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"devDependencies": {
3+
"@typescript/vfs": "^1.6.1"
4+
}
5+
}

0 commit comments

Comments
 (0)