@seanhogg/builderforce-webcontainers 2026.10.1 → 2026.10.3
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.
- package/README.md +11 -0
- package/dist/assets.d.ts +6 -0
- package/dist/assets.js +6 -0
- package/dist/check/cachedFetch.d.ts +3 -0
- package/dist/check/cachedFetch.d.ts.map +1 -0
- package/dist/check/cachedFetch.js +39 -0
- package/dist/check/cachedFetch.js.map +1 -0
- package/dist/check/index.d.ts +41 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +74 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/protocol.d.ts +29 -0
- package/dist/check/protocol.d.ts.map +1 -0
- package/dist/check/protocol.js +13 -0
- package/dist/check/protocol.js.map +1 -0
- package/dist/check/worker.js +20 -0
- package/dist/componentCompilers.d.ts +21 -0
- package/dist/componentCompilers.d.ts.map +1 -0
- package/dist/componentCompilers.js +35 -0
- package/dist/componentCompilers.js.map +1 -0
- package/dist/esbuildWasm.d.ts +10 -4
- package/dist/esbuildWasm.d.ts.map +1 -1
- package/dist/esbuildWasm.js +14 -6
- package/dist/esbuildWasm.js.map +1 -1
- package/dist/host.d.ts +61 -6
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +61 -42
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.ts +42 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +45 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/processHost.d.ts +65 -0
- package/dist/node/processHost.d.ts.map +1 -0
- package/dist/node/processHost.js +269 -0
- package/dist/node/processHost.js.map +1 -0
- package/dist/node/protocol.d.ts +139 -0
- package/dist/node/protocol.d.ts.map +1 -0
- package/dist/node/protocol.js +5 -0
- package/dist/node/protocol.js.map +1 -0
- package/dist/node/worker.js +197 -0
- package/dist/node/workerProcess.d.ts +22 -0
- package/dist/node/workerProcess.d.ts.map +1 -0
- package/dist/node/workerProcess.js +210 -0
- package/dist/node/workerProcess.js.map +1 -0
- package/dist/packageCache.d.ts +12 -0
- package/dist/packageCache.d.ts.map +1 -0
- package/dist/packageCache.js +28 -0
- package/dist/packageCache.js.map +1 -0
- package/dist/process-worker.js +197 -0
- package/dist/protocol.d.ts +27 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +25 -0
- package/dist/protocol.js.map +1 -1
- package/dist/relay.html +2 -0
- package/dist/relayWorker.d.ts +19 -0
- package/dist/relayWorker.d.ts.map +1 -0
- package/dist/relayWorker.js +39 -0
- package/dist/relayWorker.js.map +1 -0
- package/dist/sw.js +1 -1
- package/dist/swRouter.d.ts +9 -1
- package/dist/swRouter.d.ts.map +1 -1
- package/dist/swRouter.js +29 -5
- package/dist/swRouter.js.map +1 -1
- package/dist/transport.d.ts +23 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +112 -0
- package/dist/transport.js.map +1 -0
- package/dist/worker.d.ts +5 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +29 -0
- package/dist/worker.js.map +1 -0
- package/package.json +17 -3
- package/src/check/cachedFetch.ts +47 -0
- package/src/check/index.ts +98 -0
- package/src/check/protocol.ts +34 -0
- package/src/check/worker.ts +49 -0
- package/src/componentCompilers.ts +66 -0
- package/src/esbuildWasm.ts +19 -7
- package/src/host.ts +125 -42
- package/src/index.ts +18 -4
- package/src/node/index.ts +69 -0
- package/src/node/processHost.ts +307 -0
- package/src/node/protocol.ts +63 -0
- package/src/node/worker.ts +46 -0
- package/src/node/workerProcess.ts +219 -0
- package/src/packageCache.ts +28 -0
- package/src/protocol.ts +33 -0
- package/src/relay.ts +44 -0
- package/src/relayWorker.ts +53 -0
- package/src/sw.ts +25 -6
- package/src/swRouter.ts +36 -5
- package/src/transport.ts +141 -0
- package/src/worker.ts +25 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cachedFetch.d.ts","sourceRoot":"","sources":["../../src/check/cachedFetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,iDAAiD,CAAC;AA0BpG,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,OAAO,KAAa,GAAG,SAAS,CAoBvE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `fetch` for type definitions, backed by Cache Storage so a new tab (or a new
|
|
3
|
+
* worker) does not download lib.dom.d.ts and React's types again.
|
|
4
|
+
*
|
|
5
|
+
* Only immutable URLs are cached: lib files under a pinned TypeScript version and
|
|
6
|
+
* package files at an exact `name@x.y.z`. Range lookups (`react@^18`) always go to
|
|
7
|
+
* the network, so a new release is picked up. A cached entry keeps the final URL
|
|
8
|
+
* and the `X-TypeScript-Types` header, the two things acquisition reads besides
|
|
9
|
+
* the body.
|
|
10
|
+
*/
|
|
11
|
+
const CACHE_NAME = 'bfwc-types-v1';
|
|
12
|
+
const EXACT_VERSION = /@\d+\.\d+\.\d+(?:[-+][\w.]+)?\//;
|
|
13
|
+
const FINAL_URL = 'x-bfwc-final-url';
|
|
14
|
+
const TYPES = 'x-typescript-types';
|
|
15
|
+
function wrap(url, body, types) {
|
|
16
|
+
return { ok: true, url, headers: { get: (name) => (name.toLowerCase() === TYPES ? types : null) }, text: async () => body };
|
|
17
|
+
}
|
|
18
|
+
export function createCachedFetch(base = fetch) {
|
|
19
|
+
let cache;
|
|
20
|
+
const open = () => (cache ??= typeof caches === 'undefined' ? Promise.resolve(undefined) : caches.open(CACHE_NAME).catch(() => undefined));
|
|
21
|
+
return async (url) => {
|
|
22
|
+
const cacheable = EXACT_VERSION.test(url);
|
|
23
|
+
const store = cacheable ? await open() : undefined;
|
|
24
|
+
const hit = await store?.match(url).catch(() => undefined);
|
|
25
|
+
if (hit)
|
|
26
|
+
return wrap(hit.headers.get(FINAL_URL) ?? url, await hit.text(), hit.headers.get(TYPES));
|
|
27
|
+
const res = await base(url);
|
|
28
|
+
if (!res.ok || !store)
|
|
29
|
+
return res;
|
|
30
|
+
const body = await res.text();
|
|
31
|
+
const types = res.headers.get(TYPES);
|
|
32
|
+
const headers = { [FINAL_URL]: res.url || url };
|
|
33
|
+
if (types)
|
|
34
|
+
headers[TYPES] = types;
|
|
35
|
+
await store.put(url, new Response(body, { headers })).catch(() => undefined);
|
|
36
|
+
return wrap(res.url || url, body, types);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cachedFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cachedFetch.js","sourceRoot":"","sources":["../../src/check/cachedFetch.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AACxD,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,KAAK,GAAG,oBAAoB,CAAC;AAOnC,SAAS,IAAI,CAAC,GAAW,EAAE,IAAY,EAAE,KAAoB;IAC3D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC9H,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAqB,KAAK;IAC1D,IAAI,KAAiD,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,EAAE,CAChB,CAAC,KAAK,KAAK,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1H,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAElG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,OAAO,GAA2B,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;QACxE,IAAI,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QAClC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@seanhogg/builderforce-webcontainers/check` — type-check a project in a Web
|
|
3
|
+
* Worker, with no install and no server.
|
|
4
|
+
*
|
|
5
|
+
* The worker loads the TypeScript compiler from a CDN (pinned below) and fetches
|
|
6
|
+
* dependency types from esm.sh, caching both, so the page's main thread never
|
|
7
|
+
* parses lib.dom.d.ts. Diagnostics come back as plain data (see CheckDiagnostic).
|
|
8
|
+
*/
|
|
9
|
+
import { VirtualFileSystem, type FlatFiles } from '@seanhogg/builderforce-webcontainers-core';
|
|
10
|
+
import type { TypeSources, TypecheckResult } from '@seanhogg/builderforce-webcontainers-core/check';
|
|
11
|
+
export type { CheckDiagnostic, DiagnosticCategory, TypecheckResult } from '@seanhogg/builderforce-webcontainers-core/check';
|
|
12
|
+
export { formatDiagnostic } from '@seanhogg/builderforce-webcontainers-core/check';
|
|
13
|
+
/** The TypeScript the checker runs. Pinned, so results do not change under a project. */
|
|
14
|
+
export declare const TYPESCRIPT_VERSION = "5.9.3";
|
|
15
|
+
export declare const DEFAULT_TYPESCRIPT_URL = "https://cdn.jsdelivr.net/npm/typescript@5.9.3/lib/typescript.js";
|
|
16
|
+
export interface CheckerOptions {
|
|
17
|
+
/**
|
|
18
|
+
* The worker script (this package's `dist/check/worker.js`). By default it is
|
|
19
|
+
* resolved beside this module, a pattern Vite, webpack 5 and Next.js all bundle.
|
|
20
|
+
*/
|
|
21
|
+
workerUrl?: string | URL;
|
|
22
|
+
/** Build the Worker yourself (a CSP that needs a specific origin, a test double). */
|
|
23
|
+
createWorker?: () => Worker;
|
|
24
|
+
/** A classic-script build of TypeScript that sets `self.ts`. Default: jsDelivr, {@link TYPESCRIPT_VERSION}. */
|
|
25
|
+
typescriptUrl?: string;
|
|
26
|
+
/** Where types, libs and tsconfig packages come from. Libs default to the loaded TypeScript's version. */
|
|
27
|
+
sources?: Partial<TypeSources>;
|
|
28
|
+
}
|
|
29
|
+
export interface CheckResult extends TypecheckResult {
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface Checker {
|
|
33
|
+
/** Type-check the project. Checks queue; each resolves with its own result. */
|
|
34
|
+
check(files: VirtualFileSystem | FlatFiles): Promise<CheckResult>;
|
|
35
|
+
/** Stop the worker; pending checks reject. */
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
38
|
+
/** Only the files that can affect checking, as text: assets never cross to the worker. */
|
|
39
|
+
export declare function checkInputs(files: VirtualFileSystem | FlatFiles): Record<string, string>;
|
|
40
|
+
export declare function createChecker(options?: CheckerOptions): Checker;
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/check/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAC9F,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAGpG,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAC5H,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AAEnF,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,sBAAsB,oEAAoF,CAAC;AAExH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACzB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,+GAA+G;IAC/G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0GAA0G;IAC1G,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,8CAA8C;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxF;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAwCnE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@seanhogg/builderforce-webcontainers/check` — type-check a project in a Web
|
|
3
|
+
* Worker, with no install and no server.
|
|
4
|
+
*
|
|
5
|
+
* The worker loads the TypeScript compiler from a CDN (pinned below) and fetches
|
|
6
|
+
* dependency types from esm.sh, caching both, so the page's main thread never
|
|
7
|
+
* parses lib.dom.d.ts. Diagnostics come back as plain data (see CheckDiagnostic).
|
|
8
|
+
*/
|
|
9
|
+
import { VirtualFileSystem } from '@seanhogg/builderforce-webcontainers-core';
|
|
10
|
+
import { CHECK, CHECK_RESULT, isCheckInput, isCheckReply } from './protocol.js';
|
|
11
|
+
export { formatDiagnostic } from '@seanhogg/builderforce-webcontainers-core/check';
|
|
12
|
+
/** The TypeScript the checker runs. Pinned, so results do not change under a project. */
|
|
13
|
+
export const TYPESCRIPT_VERSION = '5.9.3';
|
|
14
|
+
export const DEFAULT_TYPESCRIPT_URL = `https://cdn.jsdelivr.net/npm/typescript@${TYPESCRIPT_VERSION}/lib/typescript.js`;
|
|
15
|
+
/** Only the files that can affect checking, as text: assets never cross to the worker. */
|
|
16
|
+
export function checkInputs(files) {
|
|
17
|
+
let fs;
|
|
18
|
+
if (files instanceof VirtualFileSystem)
|
|
19
|
+
fs = files;
|
|
20
|
+
else {
|
|
21
|
+
fs = new VirtualFileSystem();
|
|
22
|
+
fs.mount(files);
|
|
23
|
+
}
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const path of fs.list())
|
|
26
|
+
if (isCheckInput(path))
|
|
27
|
+
out[path.slice(1)] = fs.readText(path) ?? '';
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
export function createChecker(options = {}) {
|
|
31
|
+
const worker = options.createWorker?.() ?? new Worker(options.workerUrl ?? new URL('./worker.js', import.meta.url));
|
|
32
|
+
const pending = new Map();
|
|
33
|
+
let nextId = 0;
|
|
34
|
+
worker.addEventListener('message', (event) => {
|
|
35
|
+
if (!isCheckReply(event.data))
|
|
36
|
+
return;
|
|
37
|
+
const reply = event.data;
|
|
38
|
+
const waiter = pending.get(reply.id);
|
|
39
|
+
pending.delete(reply.id);
|
|
40
|
+
if (reply.type === CHECK_RESULT)
|
|
41
|
+
waiter?.resolve({ ...reply.result, durationMs: reply.durationMs });
|
|
42
|
+
else
|
|
43
|
+
waiter?.reject(new Error(reply.message));
|
|
44
|
+
});
|
|
45
|
+
worker.addEventListener('error', (event) => {
|
|
46
|
+
const error = new Error(event.message || 'The check worker failed to start.');
|
|
47
|
+
for (const waiter of pending.values())
|
|
48
|
+
waiter.reject(error);
|
|
49
|
+
pending.clear();
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
check(files) {
|
|
53
|
+
const id = ++nextId;
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
pending.set(id, { resolve, reject });
|
|
56
|
+
worker.postMessage({
|
|
57
|
+
type: CHECK,
|
|
58
|
+
id,
|
|
59
|
+
files: checkInputs(files),
|
|
60
|
+
typescriptUrl: options.typescriptUrl ?? DEFAULT_TYPESCRIPT_URL,
|
|
61
|
+
sources: options.sources,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
dispose() {
|
|
66
|
+
worker.terminate();
|
|
67
|
+
const error = new Error('The checker was disposed.');
|
|
68
|
+
for (const waiter of pending.values())
|
|
69
|
+
waiter.reject(error);
|
|
70
|
+
pending.clear();
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/check/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Messages between `createChecker()` (page) and the check worker. Files travel as
|
|
3
|
+
* strings: only source and config files are sent, never assets.
|
|
4
|
+
*/
|
|
5
|
+
import type { TypeSources, TypecheckResult } from '@seanhogg/builderforce-webcontainers-core/check';
|
|
6
|
+
export declare const CHECK = "bfwc:check";
|
|
7
|
+
export declare const CHECK_RESULT = "bfwc:check-result";
|
|
8
|
+
export declare const CHECK_ERROR = "bfwc:check-error";
|
|
9
|
+
export interface CheckRequest {
|
|
10
|
+
type: typeof CHECK;
|
|
11
|
+
id: number;
|
|
12
|
+
files: Record<string, string>;
|
|
13
|
+
/** Classic script URL of the TypeScript compiler (sets `self.ts`). */
|
|
14
|
+
typescriptUrl: string;
|
|
15
|
+
sources?: Partial<TypeSources>;
|
|
16
|
+
}
|
|
17
|
+
export type CheckReply = {
|
|
18
|
+
type: typeof CHECK_RESULT;
|
|
19
|
+
id: number;
|
|
20
|
+
result: TypecheckResult;
|
|
21
|
+
durationMs: number;
|
|
22
|
+
} | {
|
|
23
|
+
type: typeof CHECK_ERROR;
|
|
24
|
+
id: number;
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function isCheckInput(path: string): boolean;
|
|
28
|
+
export declare function isCheckReply(value: unknown): value is CheckReply;
|
|
29
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/check/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAEpG,eAAO,MAAM,KAAK,eAAe,CAAC;AAClC,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,KAAK,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,IAAI,EAAE,OAAO,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAK9D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAGhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const CHECK = 'bfwc:check';
|
|
2
|
+
export const CHECK_RESULT = 'bfwc:check-result';
|
|
3
|
+
export const CHECK_ERROR = 'bfwc:check-error';
|
|
4
|
+
/** Paths whose contents can affect type-checking. */
|
|
5
|
+
const CHECKED = /\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|json)$/i;
|
|
6
|
+
export function isCheckInput(path) {
|
|
7
|
+
return CHECKED.test(path) && !/(^|\/)(node_modules|dist)\//.test(path);
|
|
8
|
+
}
|
|
9
|
+
export function isCheckReply(value) {
|
|
10
|
+
const v = value;
|
|
11
|
+
return !!v && (v.type === CHECK_RESULT || v.type === CHECK_ERROR) && typeof v.id === 'number';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/check/protocol.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,CAAC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAe9C,qDAAqD;AACrD,MAAM,OAAO,GAAG,0CAA0C,CAAC;AAE3D,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,CAAC,GAAG,KAA0B,CAAC;IACrC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAChG,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";(()=>{var je=Object.defineProperty;var Re=(n,e,t)=>e in n?je(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var S=(n,e,t)=>Re(n,typeof e!="symbol"?e+"":e,t);function E(n){let e=[];for(let t of n.replace(/\\/g,"/").split("/"))!t||t==="."||(t===".."?e.pop():e.push(t));return"/"+e.join("/")}function R(n){let e=E(n),t=e.lastIndexOf("/");return t<=0?"/":e.slice(0,t)}function ke(n){let e=E(n);return e.slice(e.lastIndexOf("/")+1)}function w(...n){return E(n.join("/"))}function T(n){let e=ke(n),t=e.lastIndexOf(".");return t<=0?"":e.slice(t).toLowerCase()}var $e=new TextDecoder,P=class{constructor(){S(this,"files",new Map);S(this,"versions",new Map);S(this,"mtimes",new Map);S(this,"children",new Map([["/",new Set]]));S(this,"explicit",new Set);S(this,"listeners",new Set);S(this,"clock",0)}writeFile(e,t){let s=E(e);if(s==="/"||this.children.has(s))throw new Error(`EISDIR: illegal operation on a directory, open '${s}'`);let r=!this.files.has(s);r&&this.link(s),this.files.set(s,t),this.versions.set(s,++this.clock),this.mtimes.set(s,Date.now()),this.emit({type:"write",path:s,created:r})}readFile(e){return this.files.get(E(e))}readText(e){let t=this.readFile(e);if(t!==void 0)return typeof t=="string"?t:$e.decode(t)}isFile(e){return this.files.has(E(e))}isDirectory(e){return this.children.has(E(e))}exists(e){return this.isFile(e)||this.isDirectory(e)}mkdir(e){let t=E(e);if(this.files.has(t))throw new Error(`EEXIST: file already exists, mkdir '${t}'`);if(t==="/")return;let s=this.children.has(t);this.explicit.add(t),!s&&(this.ensureDir(t),this.emit({type:"mkdir",path:t}))}readdir(e){return[...this.children.get(E(e))??[]].sort()}list(){return[...this.files.keys()].sort()}explicitDirectories(){return[...this.explicit].sort()}rm(e){let t=E(e);if(this.files.has(t)){this.removeFile(t);return}if(!this.children.has(t))return;for(let r of[...this.children.get(t)??[]])this.rm(t==="/"?"/"+r:`${t}/${r}`);if(t==="/")return;let s=this.explicit.delete(t);this.children.has(t)&&this.unlinkDir(t),s&&this.emit({type:"remove",path:t})}version(e){return this.versions.get(E(e))}mtime(e){return this.mtimes.get(E(e))}mount(e,t="/"){for(let[s,r]of Object.entries(e)){let c=w(t,s);typeof r=="string"||r instanceof Uint8Array?this.writeFile(c,r):"file"in r?this.writeFile(c,r.file.contents):(this.mkdir(c),this.mount(r.directory,c))}}toFlat(){let e={};for(let[t,s]of this.files)e[t.slice(1)]=s;return e}watch(e){return this.listeners.add(e),()=>this.listeners.delete(e)}removeFile(e){this.files.delete(e),this.versions.delete(e),this.mtimes.delete(e),this.unlink(e),this.emit({type:"remove",path:e})}link(e){let t=R(e);this.ensureDir(t),this.children.get(t).add(e.slice(e.lastIndexOf("/")+1))}ensureDir(e){if(!this.children.has(e)){if(this.files.has(e))throw new Error(`ENOTDIR: not a directory, '${e}'`);this.children.set(e,new Set),this.link(e)}}unlink(e){let t=R(e),s=this.children.get(t);s&&(s.delete(e.slice(e.lastIndexOf("/")+1)),s.size===0&&t!=="/"&&!this.explicit.has(t)&&this.unlinkDir(t))}unlinkDir(e){this.children.delete(e),this.unlink(e)}emit(e){for(let t of this.listeners)t(e)}};function Fe(n){return["/.env","/.env.local",`/.env.${n}`,`/.env.${n}.local`]}function z(n){let e="",t=!1;for(let s=0;s<n.length;s++){let r=n[s],c=n[s+1];if(t){e+=r,r==="\\"?(e+=c??"",s++):r==='"'&&(t=!1);continue}if(r==='"'){t=!0,e+=r;continue}if(r==="/"&&c==="/"){for(;s<n.length&&n[s]!==`
|
|
2
|
+
`;)s++;e+=`
|
|
3
|
+
`;continue}if(r==="/"&&c==="*"){for(s+=2;s<n.length&&!(n[s]==="*"&&n[s+1]==="/");)s++;s++;continue}e+=r}return JSON.parse(e.replace(/,(\s*[}\]])/g,"$1"))}function U(n,e){let t=n.readText(e);if(t!==void 0)try{let s=z(t);return s&&typeof s=="object"?s:void 0}catch{return}}function N(n){return n&&typeof n=="object"?n:{}}function Te(n){let e=U(n,"/package.json")??{},t={};for(let s of["devDependencies","dependencies"])for(let[r,c]of Object.entries(N(e[s])))typeof c=="string"&&(t[r]=c);return t}function Ce(n){let e=U(n,"/tsconfig.json")??U(n,"/jsconfig.json")??{},t={...N(e.compilerOptions)},s=Array.isArray(e.references)?e.references:[];for(let r of s){let c=N(r).path;if(typeof c!="string")continue;let o=c.endsWith(".json")?w("/",c):w("/",c,"tsconfig.json");for(let[l,a]of Object.entries(N(U(n,o)?.compilerOptions)))l in t||(t[l]=a)}return t}function _e(n){let e=typeof n.baseUrl=="string"?n.baseUrl:".",t=[];for(let[s,r]of Object.entries(N(n.paths))){if(!Array.isArray(r))continue;let c=s.endsWith("*"),o=r.filter(l=>typeof l=="string").map(l=>{let a=c?l.replace(/\*$/,""):l,f=w("/",e,a);return a.endsWith("/")&&f!=="/"?f+"/":f});t.push({prefix:c?s.slice(0,-1):s,wildcard:c,targets:o})}return t.sort((s,r)=>r.prefix.length-s.prefix.length)}function be(n){let e=typeof n.jsxImportSource=="string"?n.jsxImportSource:"react";return{runtime:n.jsx==="react"?"classic":"automatic",importSource:e}}function De(n){let e={};for(let t of n.split(/\r?\n/)){let s=t.trim();if(!s||s.startsWith("#"))continue;let r=s.indexOf("=");if(r<=0)continue;let c=s.slice(0,r).replace(/^export\s+/,"").trim(),o=s.slice(r+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),e[c]=o}return e}function Ie(n,e){let t={};for(let s of Fe(e)){let r=n.readText(s);r!==void 0&&Object.assign(t,De(r))}return t}function ee(n,e="development"){let t=Ce(n);return{dependencies:Te(n),aliases:_e(t),jsx:be(t),env:Ie(n,e)}}var te=[".tsx",".ts",".jsx",".js",".mjs",".cjs",".json",".css"];function k(n){return n.startsWith(".")||n.startsWith("/")?!1:!/^[a-z][a-z0-9+.-]*:/i.test(n)}function $(n){let e=n.split("/"),t=n.startsWith("@")?2:1;return{name:e.slice(0,t).join("/"),subpath:e.length>t?"/"+e.slice(t).join("/"):""}}function Pe(n,e){if(n.isFile(e))return e;for(let s of te)if(n.isFile(e+s))return e+s;let t=T(e);if(t===".js"||t===".jsx"||t===".mjs"){let s=e.slice(0,-t.length);for(let r of[".ts",".tsx"])if(n.isFile(s+r))return s+r}if(n.isDirectory(e))for(let s of te){let r=w(e,"index"+s);if(n.isFile(r))return r}}function ne(n,e,t){for(let s of e){if(!(s.wildcard?t.startsWith(s.prefix):t===s.prefix))continue;let c=s.wildcard?t.slice(s.prefix.length):"";for(let o of s.targets){let l=Pe(n,E(o+c));if(l)return l}}}var H="/__bfwc_shims__",O=`${H}/ambient.d.ts`,q=`${H}/empty.d.ts`,W=new Set(["vite/client","react-scripts"]),A="{ const src: string; export default src; }",se="{ const value: any; export default value; }",Ne=[["*.module.css","{ const classes: { readonly [key: string]: string }; export default classes; }"],["*.module.scss","{ const classes: { readonly [key: string]: string }; export default classes; }"],["*.css","{}"],["*.scss","{}"],["*.sass","{}"],["*.less","{}"],...["svg","png","jpg","jpeg","gif","webp","avif","ico","bmp","woff","woff2","ttf","otf","eot","mp4","webm","mp3","wav","ogg","pdf","txt","md","wasm"].map(n=>[`*.${n}`,A]),["*?raw",A],["*?url",A],["*?inline",A],["*.vue",se],["*.svelte",se]],Oe=`interface ImportMetaEnv {
|
|
4
|
+
readonly [key: string]: any;
|
|
5
|
+
readonly MODE: string;
|
|
6
|
+
readonly BASE_URL: string;
|
|
7
|
+
readonly PROD: boolean;
|
|
8
|
+
readonly DEV: boolean;
|
|
9
|
+
readonly SSR: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface ImportMeta {
|
|
12
|
+
readonly env: ImportMetaEnv;
|
|
13
|
+
readonly hot?: any;
|
|
14
|
+
readonly glob: any;
|
|
15
|
+
}`;function Me(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Le(n,e){let t=new RegExp(`declare\\s+module\\s+['"]${Me(e)}['"]`);for(let s of n)if(t.test(s))return!0;return!1}function re(n){let e=[Oe];n.existing.some(t=>/declare\s+var\s+process\b/.test(t))||e.push("declare var process: { env: { readonly [key: string]: string | undefined; readonly NODE_ENV: string } };");for(let[t,s]of Ne)Le(n.existing,t)||e.push(`declare module ${JSON.stringify(t)} ${s}`);for(let t of n.untyped)e.push(`declare module ${JSON.stringify(t)};`),e.push(`declare module ${JSON.stringify(`${t}/*`)};`);return e.join(`
|
|
16
|
+
`)+`
|
|
17
|
+
`}function ie(n){return!/^(workspace|file|link|portal|git\+|git:|github:|https?:)/.test(n)&&!n.includes("/")}var C="/__bfwc_types__",_="/__bfwc_lib__",M="/node_modules",G="https://esm.sh",B="https://cdn.jsdelivr.net/npm";function K(n){return`${B}/typescript@${n}/lib`}function X(n){return`@types/${n.startsWith("@")?n.slice(1).replace("/","__"):n}`}function J(n,e){let t=e[n];return t&&ie(t)?`${n}@${t}`:n}function F(n,e,t){let{name:s,subpath:r}=$(e);return`${n}/${J(s,t)}${r}`}function I(n,e){let t=new URL(n,e).href.replace(/[?#].*$/,"");return/\.d\.[mc]?ts$/.test(t)?[t]:/\.[mc]?js$/.test(t)?[t.replace(/\.([mc]?)js$/,".d.$1ts")]:/\.[mc]?ts$/.test(t)?[t]:[`${t}.d.ts`,`${t}/index.d.ts`]}var b=class{constructor(){S(this,"files",new Map);S(this,"redirects",new Map);S(this,"packages",new Map);S(this,"libs",new Map);S(this,"configs",new Map);S(this,"sourceFiles",new Map)}finalUrl(e){return(this.redirects.get(e)??(this.files.has(e)?e:void 0))||void 0}virtualPath(e){return`${C}/${e.replace(/^[a-z]+:\/\//i,"")}`}urlOf(e){if(!e.startsWith(`${C}/`))return;let t=e.slice(C.length+1);for(let s of["https://","http://"])if(this.files.has(s+t))return s+t}read(e){if(e.startsWith(`${_}/`))return this.libs.get(e.slice(_.length+1))??void 0;if(e.startsWith(`${M}/`))return this.configs.get(e)??void 0;let t=this.urlOf(e);return t?this.files.get(t):void 0}};var Ue="X-TypeScript-Types";async function oe(n,e,t,s){let{sources:r}=s,c=new Map,o=[],l=u=>o.push(u().catch(()=>{})),a=(u,x)=>(c.has(u)||c.set(u,x()),c.get(u)),f=u=>s.fetch(u).then(x=>x.ok?x:void 0,()=>{});function i(u,x){let h=n.preProcessFile(x,!0,!0);for(let p of h.referencedFiles)l(()=>d(I(p.fileName,u)));for(let p of h.typeReferenceDirectives)l(()=>j(p.fileName));for(let p of h.libReferenceDirectives)l(()=>y(`lib.${p.fileName.toLowerCase()}.d.ts`));for(let p of h.importedFiles){let v=p.fileName;l(()=>k(v)?g(v):d(I(v,u)))}}function m(u){let x=e.redirects.get(u);return x!==void 0?Promise.resolve(x||void 0):e.files.has(u)?Promise.resolve(u):a(`dts:${u}`,async()=>{if(e.files.size>=s.maxFiles)return;let h=await f(u);if(!h){e.redirects.set(u,"");return}let p=h.url||u;if(e.redirects.set(u,p),!e.files.has(p)){let v=await h.text();e.files.set(p,v),i(p,v)}return p})}async function d(u){for(let x of u){let h=await m(x);if(h)return h}}function g(u,x={}){let h=F(r.typesOrigin,u,x);return e.packages.has(h)?Promise.resolve(e.packages.get(h)??void 0):a(`pkg:${h}`,async()=>{let p=await f(h),v=p?.headers.get(Ue),L=v?await m(new URL(v,p.url||h).href):void 0;return e.packages.set(h,L??null),L})}function j(u,x={}){if(W.has(u))return Promise.resolve();let h=`types:${u}`;return e.packages.has(h)?Promise.resolve():a(h,async()=>{let p=u==="node"?void 0:await g(u,x),{name:v,subpath:L}=$(u),Se=X(v),ve=p?void 0:await m(`${r.typesOrigin}/${J(Se,x)}${L||"/index"}.d.ts`);e.packages.set(h,p??ve??null)})}function y(u){return e.libs.has(u)?Promise.resolve():a(`lib:${u}`,async()=>{let x=await f(`${r.libBaseUrl}/${u}`),h=x?await x.text():null;if(e.libs.set(u,h),h)for(let p of n.preProcessFile(h,!0,!1).libReferenceDirectives)l(()=>y(`lib.${p.fileName.toLowerCase()}.d.ts`))})}for(let u of t.specifiers)l(()=>g(u,t.dependencies));for(let u of t.typeReferences)l(()=>j(u,t.dependencies));for(let u of t.libFiles)l(()=>y(u));for(;o.length;)await Promise.all(o.splice(0))}async function ce(n,e,t,s){let r=[];function c(a){try{let f=z(a).extends;return(Array.isArray(f)?f:[f]).filter(i=>typeof i=="string")}catch{return[]}}function o(a,f){for(let i of c(f)){let m;if(k(i)){let{name:d,subpath:g}=$(i);m=`${M}/${d}${g?g.endsWith(".json")?g:`${g}.json`:"/tsconfig.json"}`}else if(a.startsWith(`${M}/`))m=w(R(a),i.endsWith(".json")?i:`${i}.json`);else continue;e.configs.has(m)||(e.configs.set(m,null),r.push(l(m)))}}async function l(a){let f=a.slice(M.length+1),{name:i,subpath:m}=$(f),d=await s.fetch(`${s.sources.npmBaseUrl}/${J(i,t)}${m}`).catch(()=>{});if(!d?.ok)return;let g=await d.text();e.configs.set(a,g),o(a,g)}for(let a of n.list())/^\/tsconfig[^/]*\.json$/.test(a)&&o(a,n.readText(a)??"");for(;r.length;)await Promise.all(r.splice(0))}var V=[".ts",".tsx",".d.ts",".mts",".cts",".js",".jsx",".mjs",".cjs",".json"];function Ae(n,e){return e.endsWith(".d.ts")?n.Extension.Dts:e.endsWith(".d.mts")?n.Extension.Dmts:e.endsWith(".d.cts")?n.Extension.Dcts:{".ts":n.Extension.Ts,".tsx":n.Extension.Tsx,".mts":n.Extension.Mts,".cts":n.Extension.Cts,".js":n.Extension.Js,".jsx":n.Extension.Jsx,".mjs":n.Extension.Mjs,".cjs":n.Extension.Cjs,".json":n.Extension.Json}[T(e)]??n.Extension.Ts}function ae(n,e){let t=T(e);if(n.isFile(e)&&V.includes(t))return e;for(let s of V)if(n.isFile(e+s))return e+s;if(t===".js"||t===".jsx"||t===".mjs"||t===".cjs"){let s=e.slice(0,-t.length);for(let r of[".ts",".tsx",".d.ts",".mts",".cts"])if(n.isFile(s+r))return s+r}for(let s of V)if(n.isFile(w(e,`index${s}`)))return w(e,`index${s}`)}function fe(n,e){let{fs:t,store:s}=e,r=i=>i===O?e.shim:i===q?`export {};
|
|
18
|
+
`:t.readText(i)??s.read(i);function c(i){return i?s.virtualPath(i):void 0}function o(i,m){if(k(i))return c(s.packages.get(F(e.typesOrigin,i,{})));for(let d of I(i,m)){let g=s.finalUrl(d);if(g)return c(g)}}function l(i,m){if(!i.includes("?")){if(!k(i)){let d=i.startsWith("/")?E(i):w(R(m),i);return ae(t,d)}for(let d of e.aliases){if(!(d.wildcard?i.startsWith(d.prefix):i===d.prefix))continue;let j=d.wildcard?i.slice(d.prefix.length):"";for(let y of d.targets){let u=ae(t,E(y+j));if(u)return u}}return c(s.packages.get(F(e.typesOrigin,i,e.dependencies)))}}function a(i,m){let d=s.urlOf(m),g=d?o(i,d):l(i,m);if(g)return{resolvedFileName:g,extension:Ae(n,g),isExternalLibraryImport:g.startsWith(`${C}/`)}}function f(i){return W.has(i)?q:c(s.packages.get(`types:${i}`))}return{getSourceFile(i,m){let d=!t.isFile(i),g=d?s.sourceFiles.get(i):void 0;if(g)return g;let j=r(i);if(j===void 0)return;let y=n.createSourceFile(i,j,m,!0);return d&&i!==O&&s.sourceFiles.set(i,y),y},getDefaultLibFileName:i=>`${_}/${n.getDefaultLibFileName(i)}`,getDefaultLibLocation:()=>_,writeFile:()=>{},getCurrentDirectory:()=>"/",getCanonicalFileName:i=>i,useCaseSensitiveFileNames:()=>!0,getNewLine:()=>`
|
|
19
|
+
`,fileExists:i=>r(i)!==void 0,readFile:r,directoryExists:i=>t.isDirectory(i)||i.startsWith(C)||i===_||i===H,getDirectories:()=>[],resolveModuleNameLiterals:(i,m)=>i.map(d=>({resolvedModule:a(d.text,m)})),resolveTypeReferenceDirectiveReferences:i=>i.map(m=>{let d=f(typeof m=="string"?m:m.fileName);return{resolvedTypeReferenceDirective:d?{primary:!0,resolvedFileName:d,isExternalLibraryImport:!0}:void 0}})}}var He={0:"warning",1:"error",2:"suggestion",3:"message"};function Q(n,e){let t=n.flattenDiagnosticMessageText(e.messageText,`
|
|
20
|
+
`),s=He[e.category]??"error";if(!e.file||e.start===void 0)return{line:1,column:1,message:t,code:e.code,category:s};let{line:r,character:c}=e.file.getLineAndCharacterOfPosition(e.start);return{file:e.file.fileName.replace(/^\//,""),line:r+1,column:c+1,message:t,code:e.code,category:s}}function le(n){let e=new Set;return n.filter(t=>{let s=`${t.file??""}:${t.line}:${t.column}:${t.code}:${t.message}`;return e.has(s)?!1:(e.add(s),!0)}).sort((t,s)=>(t.file??"").localeCompare(s.file??"")||t.line-s.line||t.column-s.column)}var ue=/(^|\/)(vite|vitest|svelte|tailwind|postcss|eslint|prettier|playwright)\.config\.[cm]?[jt]s$/,We=[".ts",".tsx",".mts",".cts"],Be=18003;function Je(n,e){return{target:n.ScriptTarget.ES2020,lib:["lib.es2020.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts"],module:n.ModuleKind.ESNext,moduleResolution:n.ModuleResolutionKind.Bundler,jsx:n.JsxEmit.ReactJSX,...e?{jsxImportSource:e}:{},strict:!0,noFallthroughCasesInSwitch:!0,isolatedModules:!0,resolveJsonModule:!0,allowImportingTsExtensions:!0,esModuleInterop:!0,skipLibCheck:!0,noEmit:!0}}function Ye(n){return{...n,noEmit:!0,skipLibCheck:!0,composite:!1,incremental:!1,declaration:!1,declarationMap:!1,emitDeclarationOnly:!1,tsBuildInfoFile:void 0}}function ze(n){let e="";for(let t=0;t<n.length;t++){let s=n[t];s==="*"&&n[t+1]==="*"&&n[t+2]==="/"?(e+="(?:[^/]+/)*",t+=2):s==="*"?e+="[^/]*":s==="?"?e+="[^/]":e+=s.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return new RegExp(`^${e}$`)}function de(n,e){let t=w(n,e),s=t.slice(t.lastIndexOf("/")+1);return!/[*?]/.test(s)&&!T(s)&&(t=`${t==="/"?"":t}/**/*`),ze(t)}function qe(n,e){return{useCaseSensitiveFileNames:!0,fileExists:t=>n.isFile(t)||e.read(t)!==void 0,readFile:t=>n.readText(t)??e.read(t),readDirectory(t,s,r,c){let o=(c??["**/*"]).map(a=>de(t,a)),l=(r??[]).map(a=>de(t,a));return n.list().filter(a=>s.some(f=>a.endsWith(f))&&!a.includes("/node_modules/")&&o.some(f=>f.test(a))&&!l.some(f=>f.test(a)))}}}function Ge(n,e,t){let s=e.readFile(t)??"",r=n.parseConfigFileTextToJson(t,s);return r.error?{errors:[r.error]}:n.parseJsonConfigFileContent(r.config,e,R(t),void 0,t)}function Ke(n,e,t){let s=n.parseConfigFileTextToJson(t,e.readFile(t)??"").config,r=s?.references??[],c=(s?.files?.length??0)>0||s?.include!==void 0;return!r.length||c?[]:r.map(o=>typeof o.path=="string"?w(R(t),o.path):void 0).filter(o=>!!o).map(o=>o.endsWith(".json")?o:w(o,"tsconfig.json")).filter(o=>e.fileExists(o))}function pe(n,e,t,s){let r=qe(e,t),c=["/tsconfig.json","/jsconfig.json"].find(a=>e.isFile(a));if(!c){let a=e.list().filter(f=>We.some(i=>f.endsWith(i))&&!f.includes("/node_modules/")&&!ue.test(f));return a.length?[{options:Je(n,s),rootNames:a,errors:[]}]:[]}let o=Ke(n,r,c),l=[];for(let a of o.length?o:[c]){let f=Ge(n,r,a),i=f.errors.filter(d=>d.code!==Be);if(!("options"in f)){l.push({configPath:a,options:{},rootNames:[],errors:i});continue}let m=f.fileNames.filter(d=>!ue.test(d));!m.length&&!i.length||l.push({configPath:a,options:Ye(f.options),rootNames:m,errors:i})}return l}function Xe(n){if(n instanceof P)return n;let e=new P;return e.mount(n),e}function Ve(n,e,t,s){let r={specifiers:new Set,typeReferences:new Set,libFiles:new Set};for(let c of t){let{options:o}=c;for(let l of c.rootNames){let a=n.preProcessFile(e.readText(l)??"",!0,!0);for(let f of a.importedFiles)k(f.fileName)&&!f.fileName.includes("?")&&!s(f.fileName)&&r.specifiers.add(f.fileName);for(let f of a.typeReferenceDirectives)r.typeReferences.add(f.fileName);for(let f of a.libReferenceDirectives)r.libFiles.add(`lib.${f.fileName.toLowerCase()}.d.ts`)}for(let l of o.types??[])r.typeReferences.add(l);if(o.jsx===n.JsxEmit.ReactJSX||o.jsx===n.JsxEmit.ReactJSXDev){let l=o.jsx===n.JsxEmit.ReactJSXDev?"jsx-dev-runtime":"jsx-runtime";r.specifiers.add(`${o.jsxImportSource??"react"}/${l}`)}if(!o.noLib)for(let l of o.lib??[n.getDefaultLibFileName(o)])r.libFiles.add(l)}return r}async function Z(n,e,t){let s=Xe(e),r=t.store??new b,c={typesOrigin:G,npmBaseUrl:B,libBaseUrl:K(n.version),...t.sources},o=ee(s),{dependencies:l}=o;await ce(s,r,l,{fetch:t.fetch,sources:c});let a=pe(n,s,r,o.jsx.importSource==="react"?void 0:o.jsx.importSource),f=Ve(n,s,a,y=>ne(s,o.aliases,y)!==void 0);await oe(n,r,{specifiers:[...f.specifiers],typeReferences:[...f.typeReferences],libFiles:[...f.libFiles],dependencies:l},{fetch:t.fetch,sources:c,maxFiles:t.maxTypeFiles??2e3});let i=[...new Set([...f.specifiers].filter(y=>!r.packages.get(F(c.typesOrigin,y,l))).map(y=>$(y).name))].sort(),m=s.list().filter(y=>y.endsWith(".d.ts")).map(y=>s.readText(y)??""),d=re({existing:[...m,...r.files.values()],untyped:i}),g=[],j=new Set;for(let y of a){for(let p of y.errors)g.push(Q(n,p));if(!y.rootNames.length)continue;let u=fe(n,{fs:s,store:r,typesOrigin:c.typesOrigin,dependencies:l,aliases:o.aliases,shim:d}),x=n.createProgram({rootNames:[...y.rootNames,O],options:y.options,host:u}),h=[...x.getOptionsDiagnostics(),...x.getGlobalDiagnostics()];for(let p of x.getSourceFiles())s.isFile(p.fileName)&&(j.add(p.fileName.slice(1)),h.push(...x.getSyntacticDiagnostics(p),...x.getSemanticDiagnostics(p)));for(let p of h)p.file&&!s.isFile(p.file.fileName)||g.push(Q(n,p))}return{diagnostics:le(g),untypedPackages:i,files:[...j].sort()}}var Qe="bfwc-types-v1",Ze=/@\d+\.\d+\.\d+(?:[-+][\w.]+)?\//,me="x-bfwc-final-url",Y="x-typescript-types";function he(n,e,t){return{ok:!0,url:n,headers:{get:s=>s.toLowerCase()===Y?t:null},text:async()=>e}}function ge(n=fetch){let e,t=()=>e??(e=typeof caches>"u"?Promise.resolve(void 0):caches.open(Qe).catch(()=>{}));return async s=>{let c=Ze.test(s)?await t():void 0,o=await c?.match(s).catch(()=>{});if(o)return he(o.headers.get(me)??s,await o.text(),o.headers.get(Y));let l=await n(s);if(!l.ok||!c)return l;let a=await l.text(),f=l.headers.get(Y),i={[me]:l.url||s};return f&&(i[Y]=f),await c.put(s,new Response(a,{headers:i})).catch(()=>{}),he(l.url||s,a,f)}}var xe="bfwc:check",ye="bfwc:check-result",Ee="bfwc:check-error";var D=globalThis,et=new b,tt=ge(),we;function nt(n){if((!D.ts||we!==n)&&(D.importScripts(n),we=n),!D.ts)throw new Error(`${n} did not define the TypeScript compiler.`);return D.ts}D.addEventListener("message",n=>{let e=n.data;if(e?.type!==xe)return;let t=Date.now();(async()=>{try{let s=nt(e.typescriptUrl),r=await Z(s,e.files,{fetch:tt,store:et,sources:e.sources});D.postMessage({type:ye,id:e.id,result:r,durationMs:Date.now()-t})}catch(s){D.postMessage({type:Ee,id:e.id,message:s instanceof Error?s.message:String(s)})}})()});})();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ComponentCompilers } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
|
+
/**
|
|
3
|
+
* The Vue and Svelte compilers, fetched from a CDN the first time a project
|
|
4
|
+
* needs one — nothing is downloaded for a React app — and pinned to the
|
|
5
|
+
* project's own framework range, so compiler and runtime agree. (Svelte's
|
|
6
|
+
* compiled output calls internal runtime functions that change between minors;
|
|
7
|
+
* the runtime is served by esm.sh from the same range, so the compiler is too.)
|
|
8
|
+
*/
|
|
9
|
+
export interface CdnComponentCompilerOptions {
|
|
10
|
+
/** The ES module URL of `@vue/compiler-sfc`'s browser build for a `vue` range. */
|
|
11
|
+
vueCompilerUrl?: (range: string) => string;
|
|
12
|
+
/** The ES module URL of `svelte/compiler` for a `svelte` range. */
|
|
13
|
+
svelteCompilerUrl?: (range: string) => string;
|
|
14
|
+
/** Loads a module by URL. Default: native `import()`. */
|
|
15
|
+
importModule?: (url: string) => Promise<unknown>;
|
|
16
|
+
}
|
|
17
|
+
/** Self-contained ESM build the official Vue SFC playground loads. */
|
|
18
|
+
export declare const defaultVueCompilerUrl: (range: string) => string;
|
|
19
|
+
export declare const defaultSvelteCompilerUrl: (range: string) => string;
|
|
20
|
+
export declare function createCdnComponentCompilers(options?: CdnComponentCompilerOptions): ComponentCompilers;
|
|
21
|
+
//# sourceMappingURL=componentCompilers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentCompilers.d.ts","sourceRoot":"","sources":["../src/componentCompilers.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,kBAAkB,EAGxB,MAAM,2CAA2C,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,kFAAkF;IAClF,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,yDAAyD;IACzD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClD;AAED,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,WACyC,CAAC;AAE7F,eAAO,MAAM,wBAAwB,GAAI,OAAO,MAAM,WAA8C,CAAC;AAarG,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,2BAAgC,GAAG,kBAAkB,CAsBzG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createSvelteCompiler, createVueCompiler, isRegistryRange, } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
|
+
/** Self-contained ESM build the official Vue SFC playground loads. */
|
|
3
|
+
export const defaultVueCompilerUrl = (range) => `https://cdn.jsdelivr.net/npm/@vue/compiler-sfc@${range}/dist/compiler-sfc.esm-browser.js`;
|
|
4
|
+
export const defaultSvelteCompilerUrl = (range) => `https://esm.sh/svelte@${range}/compiler`;
|
|
5
|
+
/**
|
|
6
|
+
* `import()` of a runtime URL. The magic comments stop the host app's bundler
|
|
7
|
+
* (webpack, Vite) from trying to resolve the CDN URL at build time.
|
|
8
|
+
*/
|
|
9
|
+
const nativeImport = (url) => import(/* webpackIgnore: true */ /* @vite-ignore */ url);
|
|
10
|
+
function rangeOf(dependencies, name, fallback) {
|
|
11
|
+
const range = dependencies[name];
|
|
12
|
+
return range && isRegistryRange(range) ? range : fallback;
|
|
13
|
+
}
|
|
14
|
+
export function createCdnComponentCompilers(options = {}) {
|
|
15
|
+
const load = options.importModule ?? nativeImport;
|
|
16
|
+
const cache = new Map();
|
|
17
|
+
const memo = (url, make) => {
|
|
18
|
+
let hit = cache.get(url);
|
|
19
|
+
if (!hit) {
|
|
20
|
+
hit = load(url).then(make);
|
|
21
|
+
hit.catch(() => cache.delete(url)); // a failed download may be retried
|
|
22
|
+
cache.set(url, hit);
|
|
23
|
+
}
|
|
24
|
+
return hit;
|
|
25
|
+
};
|
|
26
|
+
return (extension, dependencies) => {
|
|
27
|
+
if (extension === '.vue') {
|
|
28
|
+
const url = (options.vueCompilerUrl ?? defaultVueCompilerUrl)(rangeOf(dependencies, 'vue', '3'));
|
|
29
|
+
return memo(url, (module) => createVueCompiler(module));
|
|
30
|
+
}
|
|
31
|
+
const url = (options.svelteCompilerUrl ?? defaultSvelteCompilerUrl)(rangeOf(dependencies, 'svelte', '5'));
|
|
32
|
+
return memo(url, (module) => createSvelteCompiler(module));
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=componentCompilers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentCompilers.js","sourceRoot":"","sources":["../src/componentCompilers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAKhB,MAAM,2CAA2C,CAAC;AAkBnD,sEAAsE;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAE,EAAE,CACrD,kDAAkD,KAAK,mCAAmC,CAAC;AAE7F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,yBAAyB,KAAK,WAAW,CAAC;AAErG;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,GAAW,EAAoB,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAEjH,SAAS,OAAO,CAAC,YAA8C,EAAE,IAAY,EAAE,QAAgB;IAC7F,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAuC,EAAE;IACnF,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,YAAY,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE5D,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,IAA4C,EAA8B,EAAE;QACrG,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,mCAAmC;YACvE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE;QACjC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,qBAAqB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAA4B,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAA4B,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/esbuildWasm.d.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { type Transformer } from '@seanhogg/builderforce-webcontainers-core';
|
|
1
|
+
import { type Bundler, type Transformer } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
2
|
export interface EsbuildWasmOptions {
|
|
3
3
|
/** Where to fetch esbuild.wasm. Defaults to jsDelivr at the installed version. */
|
|
4
4
|
wasmURL?: string;
|
|
5
5
|
}
|
|
6
|
+
type EsbuildWasm = typeof import('esbuild-wasm');
|
|
6
7
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* esbuild compiled to WebAssembly, run off the main thread. esbuild may be
|
|
9
|
+
* initialised once per page, so the dev-server transformer and the production
|
|
10
|
+
* bundler share one instance (the options of the first call win).
|
|
10
11
|
*/
|
|
12
|
+
export declare function loadEsbuildWasm(options?: EsbuildWasmOptions): Promise<EsbuildWasm>;
|
|
13
|
+
/** The default compiler for the dev server. */
|
|
11
14
|
export declare function createEsbuildWasmTransformer(options?: EsbuildWasmOptions): Promise<Transformer>;
|
|
15
|
+
/** The default bundler for `runtime.build()`. */
|
|
16
|
+
export declare function createEsbuildWasmBundler(options?: EsbuildWasmOptions): Promise<Bundler>;
|
|
17
|
+
export {};
|
|
12
18
|
//# sourceMappingURL=esbuildWasm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esbuildWasm.d.ts","sourceRoot":"","sources":["../src/esbuildWasm.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"esbuildWasm.d.ts","sourceRoot":"","sources":["../src/esbuildWasm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkD,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAE3I,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,WAAW,GAAG,cAAc,cAAc,CAAC,CAAC;AAIjD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAWtF;AAED,+CAA+C;AAC/C,wBAAsB,4BAA4B,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC,CAEzG;AAED,iDAAiD;AACjD,wBAAsB,wBAAwB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAEjG"}
|
package/dist/esbuildWasm.js
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import { createEsbuildTransformer } from '@seanhogg/builderforce-webcontainers-core';
|
|
1
|
+
import { createEsbuildBundler, createEsbuildTransformer } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
2
|
let ready;
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* esbuild compiled to WebAssembly, run off the main thread. esbuild may be
|
|
5
|
+
* initialised once per page, so the dev-server transformer and the production
|
|
6
|
+
* bundler share one instance (the options of the first call win).
|
|
7
7
|
*/
|
|
8
|
-
export function
|
|
8
|
+
export function loadEsbuildWasm(options = {}) {
|
|
9
9
|
ready ??= (async () => {
|
|
10
10
|
const esbuild = await import('esbuild-wasm');
|
|
11
11
|
const wasmURL = options.wasmURL ?? `https://cdn.jsdelivr.net/npm/esbuild-wasm@${esbuild.version}/esbuild.wasm`;
|
|
12
12
|
await esbuild.initialize({ wasmURL, worker: true });
|
|
13
|
-
return
|
|
13
|
+
return esbuild;
|
|
14
14
|
})().catch((error) => {
|
|
15
15
|
ready = undefined; // let a later call retry (a transient network failure fetching the wasm)
|
|
16
16
|
throw error;
|
|
17
17
|
});
|
|
18
18
|
return ready;
|
|
19
19
|
}
|
|
20
|
+
/** The default compiler for the dev server. */
|
|
21
|
+
export async function createEsbuildWasmTransformer(options = {}) {
|
|
22
|
+
return createEsbuildTransformer(await loadEsbuildWasm(options));
|
|
23
|
+
}
|
|
24
|
+
/** The default bundler for `runtime.build()`. */
|
|
25
|
+
export async function createEsbuildWasmBundler(options = {}) {
|
|
26
|
+
return createEsbuildBundler(await loadEsbuildWasm(options));
|
|
27
|
+
}
|
|
20
28
|
//# sourceMappingURL=esbuildWasm.js.map
|
package/dist/esbuildWasm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esbuildWasm.js","sourceRoot":"","sources":["../src/esbuildWasm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"esbuildWasm.js","sourceRoot":"","sources":["../src/esbuildWasm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAkC,MAAM,2CAA2C,CAAC;AAS3I,IAAI,KAAuC,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAA8B,EAAE;IAC9D,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,6CAA6C,OAAO,CAAC,OAAO,eAAe,CAAC;QAC/G,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC5B,KAAK,GAAG,SAAS,CAAC,CAAC,yEAAyE;QAC5F,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,UAA8B,EAAE;IACjF,OAAO,wBAAwB,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,UAA8B,EAAE;IAC7E,OAAO,oBAAoB,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/host.d.ts
CHANGED
|
@@ -1,23 +1,55 @@
|
|
|
1
|
-
import { DevServer, VirtualFileSystem, type
|
|
2
|
-
|
|
1
|
+
import { DevServer, VirtualFileSystem, type BuildResult, type Bundler, type ComponentCompilers, type FileSystemTree, type FlatFiles, type PackageCdnFactory, type ProjectProfile, type Transformer, type SpawnOptions, type WebContainerProcess } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
|
+
import { type WireResponse } from './protocol.js';
|
|
3
|
+
import { type NodeRuntimeOptions } from './node/index.js';
|
|
4
|
+
/** Serve previews on THIS page's origin. Only for code the page's own user trusts. */
|
|
5
|
+
export interface SameOriginOptions {
|
|
3
6
|
/** Where the host serves this package's `dist/sw.js` (e.g. `/__bfwc/sw.js`). */
|
|
4
7
|
serviceWorkerUrl: string;
|
|
5
8
|
/** Worker scope. Defaults to the worker script's directory. */
|
|
6
9
|
scope?: string;
|
|
10
|
+
relayUrl?: never;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Serve previews on a SEPARATE origin, isolated from this page's cookies, storage
|
|
14
|
+
* and DOM. That origin serves `dist/relay.html` and `dist/sw.js` side by side, with
|
|
15
|
+
* `frame-ancestors` limited to the pages allowed to drive it.
|
|
16
|
+
*/
|
|
17
|
+
export interface RelayOptions {
|
|
18
|
+
/** e.g. `https://preview.example.com/__bfwc/relay.html`. */
|
|
19
|
+
relayUrl: string;
|
|
20
|
+
serviceWorkerUrl?: never;
|
|
21
|
+
scope?: never;
|
|
22
|
+
}
|
|
23
|
+
export type BootOptions = (SameOriginOptions | RelayOptions) & CommonBootOptions;
|
|
24
|
+
export interface CommonBootOptions {
|
|
7
25
|
/** Compiler. Defaults to esbuild-wasm. */
|
|
8
26
|
transformer?: Transformer;
|
|
9
|
-
/** Package CDN factory. Defaults to esm.sh. */
|
|
10
|
-
cdn?:
|
|
11
|
-
/**
|
|
27
|
+
/** Package CDN factory, for previews (`dev: true`) and builds (`dev: false`). Defaults to esm.sh. */
|
|
28
|
+
cdn?: PackageCdnFactory;
|
|
29
|
+
/** `.vue` / `.svelte` compilers. Default: the official ones, fetched from a CDN on first use. */
|
|
30
|
+
components?: ComponentCompilers;
|
|
31
|
+
/** Bundler for `build()`. Default: esbuild-wasm (the same instance as the compiler). */
|
|
32
|
+
bundler?: Bundler;
|
|
33
|
+
/** Stable id (e.g. the project id; `[A-Za-z0-9_-]`) — keeps the preview URL stable across reloads. */
|
|
12
34
|
id?: string;
|
|
13
35
|
/** The "Built with Builderforce.ai" badge in the preview. Default true — please keep it. */
|
|
14
36
|
attribution?: boolean;
|
|
37
|
+
/** Reload open previews when files change. Default true. */
|
|
38
|
+
liveReload?: boolean;
|
|
39
|
+
/** The Node runtime behind `spawn` (process workers, npm registry). */
|
|
40
|
+
node?: NodeRuntimeOptions;
|
|
15
41
|
}
|
|
16
42
|
export interface PreviewError {
|
|
17
43
|
message: string;
|
|
18
44
|
stack?: string;
|
|
19
45
|
href: string;
|
|
20
46
|
}
|
|
47
|
+
export interface RuntimeBuildOptions {
|
|
48
|
+
/** Where the site will be served from. Default `./` (works from any directory). */
|
|
49
|
+
base?: string;
|
|
50
|
+
/** Default true. */
|
|
51
|
+
minify?: boolean;
|
|
52
|
+
}
|
|
21
53
|
export interface PreviewRuntime {
|
|
22
54
|
readonly id: string;
|
|
23
55
|
/** Absolute URL to load in the preview iframe. */
|
|
@@ -27,16 +59,39 @@ export interface PreviewRuntime {
|
|
|
27
59
|
mount(files: FileSystemTree | FlatFiles): void;
|
|
28
60
|
/** Whether this runtime can serve the mounted project, and why not. */
|
|
29
61
|
profile(): ProjectProfile;
|
|
62
|
+
/**
|
|
63
|
+
* `npm run build` for the mounted files: a deployable static site (index.html,
|
|
64
|
+
* hashed `assets/`, `public/` copied). Rejects with the reason when the project
|
|
65
|
+
* is not one this runtime supports, or with the bundler's errors.
|
|
66
|
+
*/
|
|
67
|
+
build(options?: RuntimeBuildOptions): Promise<BuildResult>;
|
|
30
68
|
/** Uncaught errors and rejections raised inside the preview. */
|
|
31
69
|
onError(listener: (error: PreviewError) => void): () => void;
|
|
70
|
+
/**
|
|
71
|
+
* Run a command — `node server.js`, `npm install`, `npm run dev`, `jsh` for a
|
|
72
|
+
* terminal — in its own Web Worker. Same shape as `@webcontainer/api`'s
|
|
73
|
+
* `spawn`: `output`/`input` streams, `exit`, `kill()`, `resize()`. Pass
|
|
74
|
+
* `{ terminal: { cols, rows } }` when wiring it to xterm.js.
|
|
75
|
+
*/
|
|
76
|
+
spawn(command: string, args?: string[], options?: SpawnOptions): WebContainerProcess;
|
|
77
|
+
spawn(command: string, options?: SpawnOptions): WebContainerProcess;
|
|
78
|
+
/** `server-ready`: a process started listening (or a dev script handed off to the preview); `url` loads it in an iframe. */
|
|
79
|
+
on(event: 'server-ready', listener: (port: number, url: string) => void): () => void;
|
|
80
|
+
/** `port`: a virtual server opened or closed. */
|
|
81
|
+
on(event: 'port', listener: (port: number, type: 'open' | 'close', url: string) => void): () => void;
|
|
32
82
|
dispose(): void;
|
|
33
83
|
}
|
|
84
|
+
export declare function toWire(reqId: number, served: Awaited<ReturnType<DevServer['handle']>>): {
|
|
85
|
+
message: WireResponse;
|
|
86
|
+
transfer: Transferable[];
|
|
87
|
+
};
|
|
34
88
|
/**
|
|
35
89
|
* Boot a preview runtime in this page: a virtual file system, a dev server over
|
|
36
90
|
* it, and a service worker that routes the preview iframe's requests back here.
|
|
37
91
|
*
|
|
38
92
|
* Needs a secure context (https or localhost) for the service worker — and
|
|
39
|
-
* nothing else: no cross-origin isolation headers, no SharedArrayBuffer.
|
|
93
|
+
* nothing else: no cross-origin isolation headers, no SharedArrayBuffer. Pass
|
|
94
|
+
* `relayUrl` to serve the preview from its own origin (see `RelayOptions`).
|
|
40
95
|
*/
|
|
41
96
|
export declare function bootPreviewRuntime(options: BootOptions): Promise<PreviewRuntime>;
|
|
42
97
|
//# sourceMappingURL=host.d.ts.map
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,iBAAiB,
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|