Skip to content

Commit 7830149

Browse files
committed
Refresh Corsa with the revised WASI package layout
Use the committed compiler build with the reactor host owned by the TypeScript API package. Keep its binary, library index, declarations, and configuration schemas paired with the matching implementation. Refresh from fa49b4514d79a1121c9e20fb7796412233f8fd25 and consume the artifact package's library index instead of maintaining a separate copy of the standard libraries.
1 parent 20c3aa5 commit 7830149

445 files changed

Lines changed: 6905 additions & 1565 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎packages/playground-v2/scripts/build.mjs‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { context } from "esbuild"
22
import { createHash } from "node:crypto"
3-
import { cp, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises"
4-
import { basename, dirname, resolve } from "node:path"
3+
import { cp, mkdir, readFile, rm, writeFile } from "node:fs/promises"
4+
import { dirname, resolve } from "node:path"
55
import { fileURLToPath } from "node:url"
66
import { compatibilityHtml, compatibilityPaths, playgroundPath } from "./routes.mjs"
77

@@ -16,9 +16,9 @@ const compatibilityDirectories = compatibilityPaths.map(path =>
1616
const serve = process.argv.includes("--serve")
1717
const playgroundBase = serve ? "/" : process.env.PLAYGROUND_BASE ?? playgroundPath
1818

19-
const wasmFile = resolve(vendorDirectory, "typescript-wasip1-wasm/lib/tsc.wasm")
20-
const libDirectory = resolve(vendorDirectory, "lib")
21-
const configSchema = resolve(websiteDirectory, "packages/tsconfig-reference/scripts/schema/result/schema.json")
19+
const wasmFile = new URL(import.meta.resolve("@typescript/typescript-wasip1-wasm/lib/tsc.wasm"))
20+
const libListURL = new URL(import.meta.resolve("@typescript/typescript-wasip1-wasm/lib/libFiles.json"))
21+
const configSchema = new URL(import.meta.resolve("@typescript/typescript/schemas/tsconfig.schema.json"))
2222
const releaseIndex = resolve(packageDirectory, "vendor/versions.json")
2323
const examplesIndex = resolve(packageDirectory, "vendor/examples.json")
2424
const helpIndex = resolve(packageDirectory, "vendor/help.json")
@@ -33,12 +33,12 @@ const indexHtml = (await readFile(resolve(packageDirectory, "src/index.html"), "
3333

3434
await rm(outputDirectory, { force: true, recursive: true })
3535
await mkdir(outputDirectory, { recursive: true })
36-
const libFileNames = (await readdir(libDirectory)).filter(fileName => /^lib(?:\..+)?\.d\.ts$/.test(fileName)).sort()
36+
const libFileNames = JSON.parse(await readFile(libListURL, "utf8"))
3737
const libFiles = Object.fromEntries(
3838
await Promise.all(
3939
libFileNames.map(async fileName => [
40-
`/${basename(fileName)}`,
41-
await readFile(resolve(libDirectory, fileName), "utf8"),
40+
`/${fileName}`,
41+
await readFile(new URL(fileName, libListURL), "utf8"),
4242
])
4343
)
4444
)

‎packages/playground-v2/scripts/smoke-test.mjs‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import assert from "node:assert/strict"
22
import { readFile, readdir } from "node:fs/promises"
3-
import { resolve } from "node:path"
43
import { runInNewContext } from "node:vm"
54
import { compatibilityHtml, compatibilityPaths, compatibilityScript, playgroundPath } from "./routes.mjs"
65
import { API } from "@typescript/typescript/unstable/sync"
7-
import { instantiateWasm, WasmTransport, wasmURL } from "@typescript/typescript-wasip1-wasm"
6+
import { instantiateWasm, WasmTransport } from "@typescript/typescript/unstable/wasm"
7+
import { wasmURL } from "@typescript/typescript-wasip1-wasm"
88

9-
const packageDirectory = resolve(import.meta.dirname, "..")
109
const wasm = await readFile(wasmURL)
1110
const module = await WebAssembly.compile(wasm)
1211
const instance = await instantiateWasm(module)
@@ -30,10 +29,14 @@ try {
3029
assert.equal(redirected, `${playgroundPath}${original.search}${original.hash}`)
3130
}
3231

33-
const libDirectory = resolve(packageDirectory, "vendor/lib")
34-
const libFileNames = (await readdir(libDirectory)).filter(fileName => /^lib(?:\..+)?\.d\.ts$/.test(fileName))
32+
const libListURL = new URL(import.meta.resolve("@typescript/typescript-wasip1-wasm/lib/libFiles.json"))
33+
const libFileNames = JSON.parse(await readFile(libListURL, "utf8"))
34+
assert.deepEqual(
35+
libFileNames,
36+
(await readdir(new URL("./", libListURL))).filter(fileName => /^lib(?:\..+)?\.d\.ts$/.test(fileName)).sort()
37+
)
3538
for (const fileName of libFileNames) {
36-
transport.setFile(`/${fileName}`, await readFile(resolve(libDirectory, fileName), "utf8"))
39+
transport.setFile(`/${fileName}`, await readFile(new URL(fileName, libListURL), "utf8"))
3740
}
3841

3942
const files = {

‎packages/playground-v2/scripts/vendor-typescript.mjs‎

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,26 @@ const typescriptDirectory = resolve(process.env.TYPESCRIPT_REPO || resolve(websi
99
const vendorDirectory = resolve(packageDirectory, "vendor")
1010
const typescriptPackage = resolve(typescriptDirectory, "packages/typescript")
1111
const wasmPackage = resolve(typescriptDirectory, "packages/typescript-wasip1-wasm")
12-
const libDirectory = resolve(typescriptDirectory, "built/local")
12+
const libDirectory = resolve(wasmPackage, "lib")
1313
const packageNames = ["typescript", "typescript-wasip1-wasm"]
1414
const legalFiles = ["LICENSE.txt", "NOTICE.txt"]
1515

16+
const libFileNames = JSON.parse(await readFile(resolve(libDirectory, "libFiles.json"), "utf8"))
17+
const expectedLibFileNames = (await readdir(libDirectory)).filter(fileName => /^lib(?:\..+)?\.d\.ts$/.test(fileName)).sort()
18+
if (
19+
!Array.isArray(libFileNames) ||
20+
libFileNames.length === 0 ||
21+
JSON.stringify(libFileNames) !== JSON.stringify(expectedLibFileNames)
22+
) {
23+
throw new Error("The WASI package library index does not match its declaration files")
24+
}
25+
await Promise.all([
26+
readFile(resolve(typescriptPackage, "dist/wasm/index.js")),
27+
readFile(resolve(typescriptPackage, "schemas/tsconfig.schema.json")),
28+
readFile(resolve(typescriptPackage, "schemas/jsconfig.schema.json")),
29+
readFile(resolve(wasmPackage, "lib/tsc.wasm")),
30+
])
31+
1632
await Promise.all([
1733
rm(resolve(vendorDirectory, "lib"), { force: true, recursive: true }),
1834
rm(resolve(vendorDirectory, "typescript"), { force: true, recursive: true }),
@@ -28,9 +44,8 @@ await Promise.all([
2844
cp(resolve(wasmPackage, "dist"), resolve(vendorDirectory, "typescript-wasip1-wasm/dist"), {
2945
recursive: true,
3046
}),
31-
mkdir(resolve(vendorDirectory, "typescript-wasip1-wasm/lib"), { recursive: true }).then(() =>
32-
cp(resolve(wasmPackage, "lib/tsc.wasm"), resolve(vendorDirectory, "typescript-wasip1-wasm/lib/tsc.wasm"))
33-
),
47+
cp(resolve(wasmPackage, "lib"), resolve(vendorDirectory, "typescript-wasip1-wasm/lib"), { recursive: true }),
48+
cp(resolve(typescriptPackage, "schemas"), resolve(vendorDirectory, "typescript/schemas"), { recursive: true }),
3449
writeVendorManifest(typescriptPackage, "typescript"),
3550
writeVendorManifest(wasmPackage, "typescript-wasip1-wasm"),
3651
...packageNames.flatMap(packageName =>
@@ -40,13 +55,6 @@ await Promise.all([
4055
),
4156
])
4257

43-
const vendorLibDirectory = resolve(vendorDirectory, "lib")
44-
await mkdir(vendorLibDirectory, { recursive: true })
45-
const libFileNames = (await readdir(libDirectory)).filter(fileName => /^lib(?:\..+)?\.d\.ts$/.test(fileName))
46-
await Promise.all(
47-
libFileNames.map(fileName => cp(resolve(libDirectory, fileName), resolve(vendorLibDirectory, fileName)))
48-
)
49-
5058
const versionResult = spawnSync(resolve(typescriptDirectory, "built/local/tsc"), ["--version"], { encoding: "utf8" })
5159
if (versionResult.status !== 0) {
5260
throw new Error(versionResult.stderr || "Unable to read the TypeScript version")
@@ -85,7 +93,7 @@ async function writeVendorManifest(sourceDirectory, vendorName) {
8593
version: manifest.version,
8694
license: manifest.license,
8795
type: manifest.type,
88-
files: vendorName === "typescript-wasip1-wasm" ? ["dist", "lib/tsc.wasm", ...legalFiles] : ["dist", ...legalFiles],
96+
files: vendorName === "typescript-wasip1-wasm" ? ["dist", "lib", ...legalFiles] : ["dist", "schemas", ...legalFiles],
8997
exports,
9098
imports,
9199
}

‎packages/playground-v2/src/ata/README.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ path references, and standard-library references. Literal dynamic imports,
2121
import types, re-exports, and import-equals are supported. Existing
2222
`// types: VERSION` annotations are preserved.
2323

24+
The native API and reactor host come from the same TypeScript package.
25+
The matching WASI artifact package supplies the binary and standard libraries;
26+
its `lib/libFiles.json` index determines which libraries the build includes.
27+
Configuration schemas are vendored from the compiler package alongside its API.
28+
2429
## Resolution
2530

2631
- Node builtin imports resolve directly to `@types/node`.

‎packages/playground-v2/src/ata/ata.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { readFile } from "node:fs/promises"
33
import { createRequire } from "node:module"
44
import { test } from "node:test"
55
import { API } from "@typescript/typescript/unstable/sync"
6-
import { instantiateWasm, WasmTransport } from "@typescript/typescript-wasip1-wasm"
6+
import { instantiateWasm, WasmTransport } from "@typescript/typescript/unstable/wasm"
77
import { acquisitionOptions } from "./config"
88
import { corsaDiscovery, stradaDiscovery, PackageTypeAcquirer, type AcquisitionProgress, type Dependency } from "./index"
99
import { packageName, safePackagePath } from "./packages"

‎packages/playground-v2/src/native-compiler.test.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import assert from "node:assert/strict"
22
import { readFile, readdir } from "node:fs/promises"
33
import { test } from "node:test"
44
import { API } from "@typescript/typescript/unstable/sync"
5-
import { instantiateWasm, WasmTransport } from "@typescript/typescript-wasip1-wasm"
5+
import { instantiateWasm, WasmTransport } from "@typescript/typescript/unstable/wasm"
66
import { NativeCompiler, type NativeCompileInput } from "./native-compiler"
77

88
test("native compiler reuses snapshots across edits, types, and configuration changes", async () => {
99
const directory = process.env.PLAYGROUND_DIR!
1010
const module = await WebAssembly.compile(await readFile(`${directory}/vendor/typescript-wasip1-wasm/lib/tsc.wasm`))
1111
const transport = new WasmTransport({ instance: await instantiateWasm(module), cwd: "/workspace" })
12-
for (const name of await readdir(`${directory}/vendor/lib`)) {
13-
if (/^lib(?:\..+)?\.d\.ts$/.test(name)) transport.setFile(`/${name}`, await readFile(`${directory}/vendor/lib/${name}`, "utf8"))
12+
const libDirectory = `${directory}/vendor/typescript-wasip1-wasm/lib`
13+
for (const name of await readdir(libDirectory)) {
14+
if (/^lib(?:\..+)?\.d\.ts$/.test(name)) transport.setFile(`/${name}`, await readFile(`${libDirectory}/${name}`, "utf8"))
1415
}
1516
const api = new API({ transport })
1617
const createProgram = api.createProgram

‎packages/playground-v2/src/native-compiler.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { API, type Diagnostic, type FileNotifications, type Snapshot } from "@typescript/typescript/unstable/sync"
22
import type { Node } from "@typescript/typescript/unstable/ast"
3-
import type { WasmTransport } from "@typescript/typescript-wasip1-wasm"
3+
import type { WasmTransport } from "@typescript/typescript/unstable/wasm"
44
import { TextDocument } from "vscode-languageserver-textdocument"
55
import { corsaDiscovery, type Dependency, type SourceFile } from "./ata"
66

‎packages/playground-v2/src/native.worker.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { API } from "@typescript/typescript/unstable/sync"
2-
import { instantiateWasm, WasmTransport } from "@typescript/typescript-wasip1-wasm"
2+
import { instantiateWasm, WasmTransport } from "@typescript/typescript/unstable/wasm"
33
import type { SourceFile } from "./ata"
44
import { NativeCompiler, type NativeCompileInput } from "./native-compiler"
55

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
d27e2f5148eec753f9492e7ff730adedf336d146
1+
fa49b4514d79a1121c9e20fb7796412233f8fd25
Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,2 @@
1-
export { wasmURL } from "#wasmURL";
2-
export { instantiateWasm, type InstantiateWasmOptions, instantiateWasmSync } from "./wasi.ts";
3-
import { type WasmFileSystem } from "./wasi.ts";
4-
export interface WasmReactorExports {
5-
memory: {
6-
readonly buffer: ArrayBufferLike;
7-
};
8-
create_session(optionsPointer: number, optionsLength: number): number;
9-
close_session(): void;
10-
get_request_buffer(size: number): number;
11-
handle_request(methodLength: number, payloadLength: number): number;
12-
set_file(pathLength: number, contentLength: number): number;
13-
read_file(pathLength: number): number;
14-
remove_file(pathLength: number): number;
15-
response_ptr(): number;
16-
response_len(): number;
17-
}
18-
export interface WasmReactorInstance {
19-
readonly exports: object;
20-
}
21-
export interface WasmTransportOptions {
22-
/**
23-
* An instantiated reactor whose WASI host has already initialized it.
24-
* For example, call `wasi.initialize(instance)` before constructing the transport.
25-
*/
26-
instance: WasmReactorInstance;
27-
cwd?: string | undefined;
28-
useCaseSensitiveFileNames?: boolean | undefined;
29-
collectTiming?: boolean | undefined;
30-
fs?: WasmFileSystem | undefined;
31-
}
32-
/**
33-
* Synchronous API transport backed by an in-process TypeScript WebAssembly reactor.
34-
*
35-
* Host callbacks must complete synchronously and cannot call this transport while
36-
* an outer request is in progress.
37-
*/
38-
export declare class WasmTransport {
39-
lastBytesSent: number;
40-
lastBytesReceived: number;
41-
private readonly instance;
42-
private readonly exports;
43-
private requestPointer;
44-
private closed;
45-
private inCallback;
46-
constructor(options: WasmTransportOptions);
47-
setFileSystem(fs: WasmFileSystem | undefined): void;
48-
requestSync(method: string, payload: string): string;
49-
request(method: string, payload: string): {
50-
value: string;
51-
bytesSent: number;
52-
bytesReceived: number;
53-
};
54-
requestBinarySync(method: string, payload: Uint8Array): Uint8Array;
55-
requestBinary(method: string, payload: Uint8Array): {
56-
value: Uint8Array;
57-
bytesSent: number;
58-
bytesReceived: number;
59-
};
60-
registerCallback(name: string, callback: (name: string, payload: string) => string): void;
61-
unregisterCallback(name: string): void;
62-
setFile(path: string, content: string): void;
63-
/** Read a file from the reactor's in-memory filesystem. */
64-
readFile(path: string): string | undefined;
65-
removeFile(path: string): void;
66-
close(): void;
67-
private call;
68-
private writeRequest;
69-
private readResponseText;
70-
private readResponseBytes;
71-
private ensureOpen;
72-
}
1+
export declare const wasmURL: URL;
732
//# sourceMappingURL=index.d.ts.map

0 commit comments

Comments
 (0)