veryfront 0.1.367 → 0.1.369
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/esm/cli/commands/init/config-generator.d.ts.map +1 -1
- package/esm/cli/commands/init/config-generator.js +1 -0
- package/esm/cli/main.js +15 -0
- package/esm/deno.d.ts +3 -3
- package/esm/deno.js +5 -5
- package/esm/extensions/ext-esbuild/src/binary.d.ts +7 -0
- package/esm/extensions/ext-esbuild/src/binary.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/binary.js +143 -0
- package/esm/extensions/ext-esbuild/src/es-module-lexer.d.ts +17 -0
- package/esm/extensions/ext-esbuild/src/es-module-lexer.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/es-module-lexer.js +29 -0
- package/esm/extensions/ext-esbuild/src/esbuild-bundler.d.ts +20 -0
- package/esm/extensions/ext-esbuild/src/esbuild-bundler.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/esbuild-bundler.js +98 -0
- package/esm/extensions/ext-esbuild/src/index.d.ts +19 -0
- package/esm/extensions/ext-esbuild/src/index.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/index.js +40 -0
- package/esm/extensions/ext-esbuild/src/plugin-adapter.d.ts +14 -0
- package/esm/extensions/ext-esbuild/src/plugin-adapter.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/plugin-adapter.js +55 -0
- package/esm/extensions/ext-esbuild/src/runtime.d.ts +4 -0
- package/esm/extensions/ext-esbuild/src/runtime.d.ts.map +1 -0
- package/esm/extensions/ext-esbuild/src/runtime.js +43 -0
- package/esm/src/agent/conversation-bootstrap.d.ts +1 -1
- package/esm/src/agent/conversation-bootstrap.d.ts.map +1 -1
- package/esm/src/agent/conversation-bootstrap.js +1 -1
- package/esm/src/agent/conversation-root-run-context.d.ts +3 -3
- package/esm/src/agent/conversation-root-run-context.d.ts.map +1 -1
- package/esm/src/agent/conversation-root-run-context.js +3 -3
- package/esm/src/agent/durable.d.ts +1 -1
- package/esm/src/agent/durable.d.ts.map +1 -1
- package/esm/src/agent/durable.js +2 -2
- package/esm/src/agent/fork-runtime-stream.d.ts +11 -1
- package/esm/src/agent/fork-runtime-stream.d.ts.map +1 -1
- package/esm/src/agent/fork-runtime-stream.js +36 -0
- package/esm/src/agent/hosted-child-bootstrap.d.ts +1 -1
- package/esm/src/agent/hosted-child-bootstrap.d.ts.map +1 -1
- package/esm/src/agent/hosted-child-bootstrap.js +1 -1
- package/esm/src/agent/index.d.ts +1 -1
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +1 -1
- package/esm/src/build/bundler/code-splitter/build-context.d.ts +1 -1
- package/esm/src/build/bundler/code-splitter/build-context.d.ts.map +1 -1
- package/esm/src/build/bundler/code-splitter/build-context.js +1 -1
- package/esm/src/build/bundler/code-splitter/esbuild-plugin.d.ts +1 -1
- package/esm/src/build/bundler/code-splitter/esbuild-plugin.d.ts.map +1 -1
- package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts +1 -1
- package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts.map +1 -1
- package/esm/src/build/bundler/code-splitter/types.d.ts +1 -1
- package/esm/src/build/bundler/code-splitter/types.d.ts.map +1 -1
- package/esm/src/build/compiler/mdx-compiler/transpiler.js +1 -1
- package/esm/src/build/compiler/mdx-to-js.js +1 -1
- package/esm/src/build/embedded/preset.js +1 -1
- package/esm/src/build/production-build/client-runtime.js +1 -1
- package/esm/src/discovery/transpiler.js +1 -1
- package/esm/src/extensions/bundler.d.ts +28 -0
- package/esm/src/extensions/bundler.d.ts.map +1 -0
- package/esm/src/extensions/bundler.js +42 -0
- package/esm/src/extensions/interfaces/bundler.d.ts +162 -27
- package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -1
- package/esm/src/extensions/interfaces/index.d.ts +2 -1
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
- package/esm/src/extensions/interfaces/module-lexer.d.ts +45 -0
- package/esm/src/extensions/interfaces/module-lexer.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/module-lexer.js +13 -0
- package/esm/src/extensions/loader.d.ts.map +1 -1
- package/esm/src/extensions/loader.js +7 -1
- package/esm/src/extensions/recommendations.d.ts.map +1 -1
- package/esm/src/extensions/recommendations.js +3 -0
- package/esm/src/platform/compat/esbuild.d.ts +20 -6
- package/esm/src/platform/compat/esbuild.d.ts.map +1 -1
- package/esm/src/platform/compat/esbuild.js +20 -137
- package/esm/src/rendering/script-page-handling.js +1 -1
- package/esm/src/routing/api/module-loader/esbuild-plugin.d.ts +1 -1
- package/esm/src/routing/api/module-loader/esbuild-plugin.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +1 -1
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +22 -0
- package/esm/src/server/dev-server/middleware.js +1 -1
- package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts +1 -1
- package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts.map +1 -1
- package/esm/src/server/handlers/studio/bridge-modules.handler.js +1 -1
- package/esm/src/server/services/rsc/endpoints/script-handlers.js +1 -1
- package/esm/src/server/services/rsc/orchestrators/hydrator-handler.js +1 -1
- package/esm/src/server/shared/browser-module-bundler.js +1 -1
- package/esm/src/testing/bdd.d.ts +1 -0
- package/esm/src/testing/bdd.d.ts.map +1 -1
- package/esm/src/testing/bdd.js +1 -0
- package/esm/src/testing/init.js +7 -0
- package/esm/src/transforms/esm/http-bundler.d.ts +1 -1
- package/esm/src/transforms/esm/http-bundler.d.ts.map +1 -1
- package/esm/src/transforms/esm/lexer.d.ts +2 -9
- package/esm/src/transforms/esm/lexer.d.ts.map +1 -1
- package/esm/src/transforms/esm/lexer.js +9 -10
- package/esm/src/transforms/esm/transform-utils.d.ts +1 -1
- package/esm/src/transforms/esm/transform-utils.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/parse-cache.d.ts +1 -1
- package/esm/src/transforms/import-rewriter/parse-cache.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/parse-cache.js +8 -7
- package/esm/src/transforms/mdx/esm-module-loader/import-transformer.js +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/transform.js +2 -2
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/cli/commands/init/config-generator.ts +1 -0
- package/src/cli/main.ts +14 -0
- package/src/deno.js +5 -5
- package/src/extensions/ext-esbuild/src/binary.ts +154 -0
- package/src/extensions/ext-esbuild/src/es-module-lexer.ts +34 -0
- package/src/extensions/ext-esbuild/src/esbuild-bundler.ts +122 -0
- package/src/extensions/ext-esbuild/src/index.ts +46 -0
- package/src/extensions/ext-esbuild/src/plugin-adapter.ts +66 -0
- package/src/extensions/ext-esbuild/src/runtime.ts +54 -0
- package/src/src/agent/conversation-bootstrap.ts +2 -2
- package/src/src/agent/conversation-root-run-context.ts +6 -6
- package/src/src/agent/durable.ts +3 -3
- package/src/src/agent/fork-runtime-stream.ts +61 -1
- package/src/src/agent/hosted-child-bootstrap.ts +2 -2
- package/src/src/agent/index.ts +2 -0
- package/src/src/build/bundler/code-splitter/build-context.ts +1 -1
- package/src/src/build/bundler/code-splitter/esbuild-plugin.ts +1 -1
- package/src/src/build/bundler/code-splitter/manifest-builder.ts +1 -1
- package/src/src/build/bundler/code-splitter/splitter.ts +1 -1
- package/src/src/build/bundler/code-splitter/types.ts +1 -1
- package/src/src/build/compiler/mdx-compiler/transpiler.ts +1 -1
- package/src/src/build/compiler/mdx-to-js.ts +1 -1
- package/src/src/build/embedded/preset.ts +1 -1
- package/src/src/build/production-build/client-runtime.ts +2 -2
- package/src/src/discovery/transpiler.ts +2 -2
- package/src/src/extensions/bundler.ts +85 -0
- package/src/src/extensions/interfaces/bundler.ts +189 -16
- package/src/src/extensions/interfaces/index.ts +16 -0
- package/src/src/extensions/interfaces/module-lexer.ts +46 -0
- package/src/src/extensions/loader.ts +6 -1
- package/src/src/extensions/recommendations.ts +3 -0
- package/src/src/platform/compat/esbuild.ts +48 -160
- package/src/src/rendering/script-page-handling.ts +1 -1
- package/src/src/routing/api/module-loader/esbuild-plugin.ts +1 -1
- package/src/src/routing/api/module-loader/loader.ts +2 -2
- package/src/src/server/bootstrap.ts +29 -0
- package/src/src/server/dev-server/middleware.ts +1 -1
- package/src/src/server/handlers/dev/files/esbuild-plugins.ts +1 -1
- package/src/src/server/handlers/studio/bridge-modules.handler.ts +1 -1
- package/src/src/server/services/rsc/endpoints/script-handlers.ts +4 -4
- package/src/src/server/services/rsc/orchestrators/hydrator-handler.ts +1 -1
- package/src/src/server/shared/browser-module-bundler.ts +1 -1
- package/src/src/testing/bdd.ts +1 -0
- package/src/src/testing/init.ts +9 -0
- package/src/src/transforms/esm/http-bundler.ts +1 -1
- package/src/src/transforms/esm/lexer.ts +13 -21
- package/src/src/transforms/esm/transform-utils.ts +1 -1
- package/src/src/transforms/import-rewriter/parse-cache.ts +10 -7
- package/src/src/transforms/mdx/esm-module-loader/import-transformer.ts +1 -1
- package/src/src/transforms/pipeline/stages/ssr-vf-modules/transform.ts +2 -2
- package/src/src/utils/version-constant.ts +1 -1
|
@@ -314,7 +314,7 @@ async function transpileWithEsbuild(
|
|
|
314
314
|
modulePath: string,
|
|
315
315
|
resolveDir: string,
|
|
316
316
|
): Promise<string> {
|
|
317
|
-
const { build } = await import("
|
|
317
|
+
const { build } = await import("../extensions/bundler.js");
|
|
318
318
|
const loader = getEsbuildLoader(modulePath);
|
|
319
319
|
|
|
320
320
|
const result = await build({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
2
|
import { serverLogger } from "../../../utils/index.js";
|
|
3
|
-
import type { BuildResult, Plugin } from "
|
|
3
|
+
import type { BuildResult, Plugin } from "../../../extensions/bundler.js";
|
|
4
4
|
import type { RuntimeAdapter } from "../../../platform/adapters/base.js";
|
|
5
5
|
import type { VeryfrontConfig } from "../../../config/index.js";
|
|
6
6
|
import { createHTTPPlugin } from "./esbuild-plugin.js";
|
|
@@ -328,7 +328,7 @@ function loadAndTranspileModule(
|
|
|
328
328
|
userExternals.push(name, `${name}/*`);
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
-
const { build } = await import("
|
|
331
|
+
const { build } = await import("../../../extensions/bundler.js");
|
|
332
332
|
|
|
333
333
|
// Many npm packages use CJS require() for Node built-ins (e.g. require('fs')).
|
|
334
334
|
// When esbuild bundles CJS into ESM output, these become __require() shims that
|
|
@@ -5,6 +5,8 @@ import { clearConfigCache, getConfig } from "../config/index.js";
|
|
|
5
5
|
import { type ExtensionLoader, orchestrateExtensions, tryResolve } from "../extensions/index.js";
|
|
6
6
|
import { AIProviderRegistryName } from "../extensions/interfaces/index.js";
|
|
7
7
|
import { createAIProviderRegistry } from "../extensions/registries/ai-provider-registry.js";
|
|
8
|
+
import { MISSING_EXTENSION_ERROR } from "../extensions/errors.js";
|
|
9
|
+
import { getRecommendation } from "../extensions/recommendations.js";
|
|
8
10
|
import type { TracingExporter } from "../extensions/interfaces/tracing-exporter.js";
|
|
9
11
|
import {
|
|
10
12
|
setGlobalActiveSpanAccessor,
|
|
@@ -68,6 +70,30 @@ export interface BootstrapResult {
|
|
|
68
70
|
* Wire the `TracingExporter` contract (if registered) into the core shim.
|
|
69
71
|
* Must be called after `orchestrateExtensions()` completes.
|
|
70
72
|
*/
|
|
73
|
+
/**
|
|
74
|
+
* Fail-fast: ensure the `Bundler` contract has been registered. Core depends
|
|
75
|
+
* on it for every JS/TS transform path. `ModuleLexer` is checked too, but
|
|
76
|
+
* only as a warning (dev-only paths can degrade).
|
|
77
|
+
*/
|
|
78
|
+
function assertRequiredContracts(): void {
|
|
79
|
+
if (!tryResolve("Bundler")) {
|
|
80
|
+
const recommendation = getRecommendation("Bundler");
|
|
81
|
+
throw MISSING_EXTENSION_ERROR.create({
|
|
82
|
+
message: `Missing extension for contract "Bundler"${
|
|
83
|
+
recommendation ? `. Recommended: ${recommendation}` : ""
|
|
84
|
+
}`,
|
|
85
|
+
detail: recommendation ? `Install it with: deno add ${recommendation}` : undefined,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (!tryResolve("ModuleLexer")) {
|
|
89
|
+
bootstrapLog.warn(
|
|
90
|
+
`[bootstrap] no ModuleLexer extension registered — dev-server import rewriting will fail. Recommended: ${
|
|
91
|
+
getRecommendation("ModuleLexer") ?? "@veryfront/ext-esbuild"
|
|
92
|
+
}`,
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
71
97
|
function wireTracingShim(): void {
|
|
72
98
|
const tracing = tryResolve<TracingExporter>("TracingExporter");
|
|
73
99
|
if (tracing) {
|
|
@@ -203,6 +229,7 @@ export async function bootstrap(
|
|
|
203
229
|
primeContracts: { [AIProviderRegistryName]: createAIProviderRegistry() },
|
|
204
230
|
});
|
|
205
231
|
wireTracingShim();
|
|
232
|
+
assertRequiredContracts();
|
|
206
233
|
return {
|
|
207
234
|
adapter,
|
|
208
235
|
config,
|
|
@@ -245,6 +272,7 @@ export async function bootstrap(
|
|
|
245
272
|
primeContracts: { [AIProviderRegistryName]: createAIProviderRegistry() },
|
|
246
273
|
});
|
|
247
274
|
wireTracingShim();
|
|
275
|
+
assertRequiredContracts();
|
|
248
276
|
return {
|
|
249
277
|
adapter,
|
|
250
278
|
config,
|
|
@@ -311,6 +339,7 @@ export async function bootstrap(
|
|
|
311
339
|
fsDispose,
|
|
312
340
|
);
|
|
313
341
|
wireTracingShim();
|
|
342
|
+
assertRequiredContracts();
|
|
314
343
|
|
|
315
344
|
return {
|
|
316
345
|
adapter: enhancedAdapter,
|
|
@@ -139,7 +139,7 @@ async function loadMiddlewareFromVirtualFS(
|
|
|
139
139
|
const source = typeof content === "string" ? content : new TextDecoder().decode(content);
|
|
140
140
|
const loader = getEsbuildLoader(middlewarePath);
|
|
141
141
|
|
|
142
|
-
const { build } = await import("
|
|
142
|
+
const { build } = await import("../../extensions/bundler.js");
|
|
143
143
|
const result = await build({
|
|
144
144
|
bundle: false,
|
|
145
145
|
write: false,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OnLoadArgs, OnResolveArgs, Plugin, PluginBuild } from "
|
|
1
|
+
import type { OnLoadArgs, OnResolveArgs, Plugin, PluginBuild } from "../../../../extensions/bundler.js";
|
|
2
2
|
import { NETWORK_ERROR } from "../../../../errors/index.js";
|
|
3
3
|
// Direct import from base.ts to avoid circular dependency through barrel
|
|
4
4
|
import type { RuntimeAdapter } from "../../../../platform/adapters/base.js";
|
|
@@ -59,7 +59,7 @@ async function bundleBridge(): Promise<{ js: string; etag: string }> {
|
|
|
59
59
|
const entryPoint = `${BRIDGE_DIR}bridge-coordinator.ts`;
|
|
60
60
|
const source = await dntShim.Deno.readTextFile(entryPoint);
|
|
61
61
|
|
|
62
|
-
const { build } = await import("
|
|
62
|
+
const { build } = await import("../../../extensions/bundler.js");
|
|
63
63
|
const { outputFiles } = await build({
|
|
64
64
|
bundle: true,
|
|
65
65
|
write: false,
|
|
@@ -19,18 +19,18 @@ async function buildOrServeScript(
|
|
|
19
19
|
adapter: RuntimeAdapter,
|
|
20
20
|
path: string,
|
|
21
21
|
fallbackBundle: string,
|
|
22
|
-
esbuildOptions: Omit<import("
|
|
23
|
-
stdin: import("
|
|
22
|
+
esbuildOptions: Omit<import("../../../../extensions/bundler.js").BuildOptions, "stdin"> & {
|
|
23
|
+
stdin: import("../../../../extensions/bundler.js").StdinOptions;
|
|
24
24
|
},
|
|
25
25
|
): Promise<Response> {
|
|
26
26
|
// If a pre-built bundle was injected at compile time, serve it directly
|
|
27
27
|
if (fallbackBundle) return jsResponse(fallbackBundle);
|
|
28
28
|
|
|
29
|
-
let esbuild: typeof import("
|
|
29
|
+
let esbuild: typeof import("../../../../extensions/bundler.js") | null = null;
|
|
30
30
|
|
|
31
31
|
try {
|
|
32
32
|
const src = await adapter.fs.readFile(path);
|
|
33
|
-
esbuild = await import("
|
|
33
|
+
esbuild = await import("../../../../extensions/bundler.js");
|
|
34
34
|
const result = await esbuild.build({
|
|
35
35
|
...esbuildOptions,
|
|
36
36
|
stdin: { ...esbuildOptions.stdin, contents: src },
|
|
@@ -32,7 +32,7 @@ export class HydratorHandler {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
private async bundleHydrator(filePath: string): Promise<string> {
|
|
35
|
-
const { build, stop } = await import("
|
|
35
|
+
const { build, stop } = await import("../../../../extensions/bundler.js");
|
|
36
36
|
|
|
37
37
|
try {
|
|
38
38
|
const source = await this.readHydratorFile(filePath);
|
|
@@ -23,7 +23,7 @@ export function bundleBrowserModule(
|
|
|
23
23
|
return withSpan(
|
|
24
24
|
"server.browser-module.bundle",
|
|
25
25
|
async () => {
|
|
26
|
-
const { build } = await import("
|
|
26
|
+
const { build } = await import("../../extensions/bundler.js");
|
|
27
27
|
const src = await options.adapter.fs.readFile(absPath);
|
|
28
28
|
const importMapJson = await buildImportMapJson({
|
|
29
29
|
projectDir: options.projectDir,
|
package/src/src/testing/bdd.ts
CHANGED
package/src/src/testing/init.ts
CHANGED
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
import * as dntShim from "../../_dnt.shims.js";
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
import { EsbuildBundler, EsModuleLexer } from "../../extensions/ext-esbuild/src/index.js";
|
|
16
|
+
import { register as registerContract } from "../extensions/contracts.js";
|
|
17
|
+
|
|
15
18
|
const g = dntShim.dntGlobalThis as Record<string, unknown>;
|
|
16
19
|
|
|
17
20
|
g.__vfDisableLruInterval = true;
|
|
@@ -19,3 +22,9 @@ g.__vfTestEnv = true;
|
|
|
19
22
|
g.__vfTestEnvMask = {
|
|
20
23
|
prefixes: ["VERYFRONT_", "OTEL_", "OAUTH_", "GITHUB_", "OPENAI_", "ANTHROPIC_", "GOOGLE_"],
|
|
21
24
|
};
|
|
25
|
+
|
|
26
|
+
// Tests don't run the extension orchestrator; prime the Bundler + ModuleLexer
|
|
27
|
+
// contracts here so transforms that depend on them (lexer.ts, parse-cache.ts,
|
|
28
|
+
// the platform/compat/esbuild shim, and bundler call-sites) work in tests.
|
|
29
|
+
registerContract("Bundler", new EsbuildBundler());
|
|
30
|
+
registerContract("ModuleLexer", new EsModuleLexer());
|
|
@@ -8,7 +8,7 @@ import * as dntShim from "../../../_dnt.shims.js";
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
import { rendererLogger as logger } from "../../utils/index.js";
|
|
11
|
-
import type { Plugin } from "
|
|
11
|
+
import type { Plugin } from "../../extensions/bundler.js";
|
|
12
12
|
import { replaceSpecifiers } from "./lexer.js";
|
|
13
13
|
import { DEFAULT_REACT_VERSION, getReactUrls } from "./package-registry.js";
|
|
14
14
|
import {
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { logger as baseLogger } from "../../utils/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { resolve as resolveContract } from "../../extensions/contracts.js";
|
|
3
|
+
import type { ImportSpecifier, ModuleLexer } from "../../extensions/interfaces/module-lexer.js";
|
|
4
|
+
|
|
5
|
+
export type { ImportSpecifier };
|
|
3
6
|
|
|
4
7
|
const logger = baseLogger.component("es-module-lexer");
|
|
5
8
|
|
|
@@ -37,32 +40,21 @@ function unmaskHttpUrls(code: string, urlMap: Map<string, string>): string {
|
|
|
37
40
|
return result;
|
|
38
41
|
}
|
|
39
42
|
|
|
43
|
+
function getLexer(): ModuleLexer {
|
|
44
|
+
return resolveContract<ModuleLexer>("ModuleLexer");
|
|
45
|
+
}
|
|
46
|
+
|
|
40
47
|
export async function initLexer(): Promise<void> {
|
|
41
48
|
if (initPromise) {
|
|
42
49
|
await initPromise;
|
|
43
50
|
return;
|
|
44
51
|
}
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const anyInit = init as unknown;
|
|
49
|
-
initPromise = typeof anyInit === "function"
|
|
50
|
-
? (anyInit as () => Promise<void>)()
|
|
51
|
-
: (anyInit as Promise<void>);
|
|
52
|
-
|
|
53
|
+
const lexer = getLexer();
|
|
54
|
+
initPromise = lexer.init ? lexer.init() : Promise.resolve();
|
|
53
55
|
await initPromise;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
export type ImportSpecifier = {
|
|
57
|
-
n: string | undefined; // The module specifier (e.g., "react")
|
|
58
|
-
s: number; // Start of module specifier
|
|
59
|
-
e: number; // End of module specifier
|
|
60
|
-
ss: number; // Start of import statement
|
|
61
|
-
se: number; // End of import statement
|
|
62
|
-
d: number; // > -1 if dynamic import
|
|
63
|
-
a: number; // import attribute index
|
|
64
|
-
};
|
|
65
|
-
|
|
66
58
|
function logParseError(error: unknown, code: string): void {
|
|
67
59
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
68
60
|
const match = errorMsg.match(/@:(\d+):(\d+)/);
|
|
@@ -93,7 +85,7 @@ export async function parseImports(code: string): Promise<readonly ImportSpecifi
|
|
|
93
85
|
|
|
94
86
|
let imports: readonly ImportSpecifier[];
|
|
95
87
|
try {
|
|
96
|
-
|
|
88
|
+
imports = getLexer().parse(masked);
|
|
97
89
|
} catch (error) {
|
|
98
90
|
logParseError(error, masked);
|
|
99
91
|
throw error;
|
|
@@ -120,7 +112,7 @@ export async function replaceSpecifiers(
|
|
|
120
112
|
await initLexer();
|
|
121
113
|
|
|
122
114
|
const { masked, urlMap } = maskHttpUrls(code);
|
|
123
|
-
const
|
|
115
|
+
const imports = getLexer().parse(masked);
|
|
124
116
|
|
|
125
117
|
let result = masked;
|
|
126
118
|
|
|
@@ -165,7 +157,7 @@ export async function rewriteImports(
|
|
|
165
157
|
await initLexer();
|
|
166
158
|
|
|
167
159
|
const { masked, urlMap } = maskHttpUrls(code);
|
|
168
|
-
const
|
|
160
|
+
const imports = getLexer().parse(masked);
|
|
169
161
|
|
|
170
162
|
let result = masked;
|
|
171
163
|
|
|
@@ -5,21 +5,24 @@
|
|
|
5
5
|
* This eliminates redundant parsing that happened with the fragmented system.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import { resolve as resolveContract } from "../../extensions/contracts.js";
|
|
9
|
+
import type { ModuleLexer } from "../../extensions/interfaces/module-lexer.js";
|
|
9
10
|
import type { ImportSpecifierInfo } from "./types.js";
|
|
10
11
|
import type { ImportSpecifier } from "../esm/lexer.js";
|
|
11
12
|
|
|
12
13
|
let initPromise: Promise<void> | null = null;
|
|
13
14
|
|
|
15
|
+
function getLexer(): ModuleLexer {
|
|
16
|
+
return resolveContract<ModuleLexer>("ModuleLexer");
|
|
17
|
+
}
|
|
18
|
+
|
|
14
19
|
/**
|
|
15
|
-
* Initialize
|
|
20
|
+
* Initialize the ModuleLexer (must be called before parsing).
|
|
16
21
|
*/
|
|
17
22
|
export async function initLexer(): Promise<void> {
|
|
18
23
|
if (!initPromise) {
|
|
19
|
-
const
|
|
20
|
-
initPromise =
|
|
21
|
-
? (anyInit as () => Promise<void>)()
|
|
22
|
-
: (anyInit as Promise<void>);
|
|
24
|
+
const lexer = getLexer();
|
|
25
|
+
initPromise = lexer.init ? lexer.init() : Promise.resolve();
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
await initPromise;
|
|
@@ -81,7 +84,7 @@ export async function parseAllImports(code: string): Promise<ParsedImports> {
|
|
|
81
84
|
await initLexer();
|
|
82
85
|
|
|
83
86
|
const { masked, urlMap } = maskHttpUrls(code);
|
|
84
|
-
const
|
|
87
|
+
const rawImports = getLexer().parse(masked);
|
|
85
88
|
|
|
86
89
|
const imports: ImportSpecifierInfo[] = rawImports
|
|
87
90
|
.filter((imp) => imp.n !== undefined)
|
|
@@ -91,7 +91,7 @@ export async function transformJsxImports(
|
|
|
91
91
|
adapter: ESMLoaderContext["adapter"],
|
|
92
92
|
esmCacheDir: string,
|
|
93
93
|
): Promise<string> {
|
|
94
|
-
const { transform } = await import("
|
|
94
|
+
const { transform } = await import("../../../extensions/bundler.js");
|
|
95
95
|
|
|
96
96
|
const importsToProcess: Array<{
|
|
97
97
|
fullMatch: string;
|
|
@@ -107,7 +107,7 @@ export async function transformFrameworkCode(
|
|
|
107
107
|
depth,
|
|
108
108
|
});
|
|
109
109
|
// Return minimally transformed code - it will fail at runtime but won't hang
|
|
110
|
-
const { transform } = await import("
|
|
110
|
+
const { transform } = await import("../../../../extensions/bundler.js");
|
|
111
111
|
const ext = sourcePath.match(/\.(tsx?|jsx?)$/)?.[1] ?? "tsx";
|
|
112
112
|
let loader: "tsx" | "ts" | "jsx" | "js" = "js";
|
|
113
113
|
if (ext === "tsx") loader = "tsx";
|
|
@@ -151,7 +151,7 @@ export async function transformFrameworkCode(
|
|
|
151
151
|
transformingFiles.add(sourcePath);
|
|
152
152
|
|
|
153
153
|
try {
|
|
154
|
-
const { transform } = await import("
|
|
154
|
+
const { transform } = await import("../../../../extensions/bundler.js");
|
|
155
155
|
|
|
156
156
|
const ext = sourcePath.match(/\.(tsx?|jsx?)$/)?.[1] ?? "tsx";
|
|
157
157
|
let loader: "tsx" | "ts" | "jsx" | "js" = "js";
|