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.
Files changed (155) hide show
  1. package/esm/cli/commands/init/config-generator.d.ts.map +1 -1
  2. package/esm/cli/commands/init/config-generator.js +1 -0
  3. package/esm/cli/main.js +15 -0
  4. package/esm/deno.d.ts +3 -3
  5. package/esm/deno.js +5 -5
  6. package/esm/extensions/ext-esbuild/src/binary.d.ts +7 -0
  7. package/esm/extensions/ext-esbuild/src/binary.d.ts.map +1 -0
  8. package/esm/extensions/ext-esbuild/src/binary.js +143 -0
  9. package/esm/extensions/ext-esbuild/src/es-module-lexer.d.ts +17 -0
  10. package/esm/extensions/ext-esbuild/src/es-module-lexer.d.ts.map +1 -0
  11. package/esm/extensions/ext-esbuild/src/es-module-lexer.js +29 -0
  12. package/esm/extensions/ext-esbuild/src/esbuild-bundler.d.ts +20 -0
  13. package/esm/extensions/ext-esbuild/src/esbuild-bundler.d.ts.map +1 -0
  14. package/esm/extensions/ext-esbuild/src/esbuild-bundler.js +98 -0
  15. package/esm/extensions/ext-esbuild/src/index.d.ts +19 -0
  16. package/esm/extensions/ext-esbuild/src/index.d.ts.map +1 -0
  17. package/esm/extensions/ext-esbuild/src/index.js +40 -0
  18. package/esm/extensions/ext-esbuild/src/plugin-adapter.d.ts +14 -0
  19. package/esm/extensions/ext-esbuild/src/plugin-adapter.d.ts.map +1 -0
  20. package/esm/extensions/ext-esbuild/src/plugin-adapter.js +55 -0
  21. package/esm/extensions/ext-esbuild/src/runtime.d.ts +4 -0
  22. package/esm/extensions/ext-esbuild/src/runtime.d.ts.map +1 -0
  23. package/esm/extensions/ext-esbuild/src/runtime.js +43 -0
  24. package/esm/src/agent/conversation-bootstrap.d.ts +1 -1
  25. package/esm/src/agent/conversation-bootstrap.d.ts.map +1 -1
  26. package/esm/src/agent/conversation-bootstrap.js +1 -1
  27. package/esm/src/agent/conversation-root-run-context.d.ts +3 -3
  28. package/esm/src/agent/conversation-root-run-context.d.ts.map +1 -1
  29. package/esm/src/agent/conversation-root-run-context.js +3 -3
  30. package/esm/src/agent/durable.d.ts +1 -1
  31. package/esm/src/agent/durable.d.ts.map +1 -1
  32. package/esm/src/agent/durable.js +2 -2
  33. package/esm/src/agent/fork-runtime-stream.d.ts +11 -1
  34. package/esm/src/agent/fork-runtime-stream.d.ts.map +1 -1
  35. package/esm/src/agent/fork-runtime-stream.js +36 -0
  36. package/esm/src/agent/hosted-child-bootstrap.d.ts +1 -1
  37. package/esm/src/agent/hosted-child-bootstrap.d.ts.map +1 -1
  38. package/esm/src/agent/hosted-child-bootstrap.js +1 -1
  39. package/esm/src/agent/index.d.ts +1 -1
  40. package/esm/src/agent/index.d.ts.map +1 -1
  41. package/esm/src/agent/index.js +1 -1
  42. package/esm/src/build/bundler/code-splitter/build-context.d.ts +1 -1
  43. package/esm/src/build/bundler/code-splitter/build-context.d.ts.map +1 -1
  44. package/esm/src/build/bundler/code-splitter/build-context.js +1 -1
  45. package/esm/src/build/bundler/code-splitter/esbuild-plugin.d.ts +1 -1
  46. package/esm/src/build/bundler/code-splitter/esbuild-plugin.d.ts.map +1 -1
  47. package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts +1 -1
  48. package/esm/src/build/bundler/code-splitter/manifest-builder.d.ts.map +1 -1
  49. package/esm/src/build/bundler/code-splitter/types.d.ts +1 -1
  50. package/esm/src/build/bundler/code-splitter/types.d.ts.map +1 -1
  51. package/esm/src/build/compiler/mdx-compiler/transpiler.js +1 -1
  52. package/esm/src/build/compiler/mdx-to-js.js +1 -1
  53. package/esm/src/build/embedded/preset.js +1 -1
  54. package/esm/src/build/production-build/client-runtime.js +1 -1
  55. package/esm/src/discovery/transpiler.js +1 -1
  56. package/esm/src/extensions/bundler.d.ts +28 -0
  57. package/esm/src/extensions/bundler.d.ts.map +1 -0
  58. package/esm/src/extensions/bundler.js +42 -0
  59. package/esm/src/extensions/interfaces/bundler.d.ts +162 -27
  60. package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -1
  61. package/esm/src/extensions/interfaces/index.d.ts +2 -1
  62. package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
  63. package/esm/src/extensions/interfaces/module-lexer.d.ts +45 -0
  64. package/esm/src/extensions/interfaces/module-lexer.d.ts.map +1 -0
  65. package/esm/src/extensions/interfaces/module-lexer.js +13 -0
  66. package/esm/src/extensions/loader.d.ts.map +1 -1
  67. package/esm/src/extensions/loader.js +7 -1
  68. package/esm/src/extensions/recommendations.d.ts.map +1 -1
  69. package/esm/src/extensions/recommendations.js +3 -0
  70. package/esm/src/platform/compat/esbuild.d.ts +20 -6
  71. package/esm/src/platform/compat/esbuild.d.ts.map +1 -1
  72. package/esm/src/platform/compat/esbuild.js +20 -137
  73. package/esm/src/rendering/script-page-handling.js +1 -1
  74. package/esm/src/routing/api/module-loader/esbuild-plugin.d.ts +1 -1
  75. package/esm/src/routing/api/module-loader/esbuild-plugin.d.ts.map +1 -1
  76. package/esm/src/routing/api/module-loader/loader.js +1 -1
  77. package/esm/src/server/bootstrap.d.ts.map +1 -1
  78. package/esm/src/server/bootstrap.js +22 -0
  79. package/esm/src/server/dev-server/middleware.js +1 -1
  80. package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts +1 -1
  81. package/esm/src/server/handlers/dev/files/esbuild-plugins.d.ts.map +1 -1
  82. package/esm/src/server/handlers/studio/bridge-modules.handler.js +1 -1
  83. package/esm/src/server/services/rsc/endpoints/script-handlers.js +1 -1
  84. package/esm/src/server/services/rsc/orchestrators/hydrator-handler.js +1 -1
  85. package/esm/src/server/shared/browser-module-bundler.js +1 -1
  86. package/esm/src/testing/bdd.d.ts +1 -0
  87. package/esm/src/testing/bdd.d.ts.map +1 -1
  88. package/esm/src/testing/bdd.js +1 -0
  89. package/esm/src/testing/init.js +7 -0
  90. package/esm/src/transforms/esm/http-bundler.d.ts +1 -1
  91. package/esm/src/transforms/esm/http-bundler.d.ts.map +1 -1
  92. package/esm/src/transforms/esm/lexer.d.ts +2 -9
  93. package/esm/src/transforms/esm/lexer.d.ts.map +1 -1
  94. package/esm/src/transforms/esm/lexer.js +9 -10
  95. package/esm/src/transforms/esm/transform-utils.d.ts +1 -1
  96. package/esm/src/transforms/esm/transform-utils.d.ts.map +1 -1
  97. package/esm/src/transforms/import-rewriter/parse-cache.d.ts +1 -1
  98. package/esm/src/transforms/import-rewriter/parse-cache.d.ts.map +1 -1
  99. package/esm/src/transforms/import-rewriter/parse-cache.js +8 -7
  100. package/esm/src/transforms/mdx/esm-module-loader/import-transformer.js +1 -1
  101. package/esm/src/transforms/pipeline/stages/ssr-vf-modules/transform.js +2 -2
  102. package/esm/src/utils/version-constant.d.ts +1 -1
  103. package/esm/src/utils/version-constant.js +1 -1
  104. package/package.json +1 -1
  105. package/src/cli/commands/init/config-generator.ts +1 -0
  106. package/src/cli/main.ts +14 -0
  107. package/src/deno.js +5 -5
  108. package/src/extensions/ext-esbuild/src/binary.ts +154 -0
  109. package/src/extensions/ext-esbuild/src/es-module-lexer.ts +34 -0
  110. package/src/extensions/ext-esbuild/src/esbuild-bundler.ts +122 -0
  111. package/src/extensions/ext-esbuild/src/index.ts +46 -0
  112. package/src/extensions/ext-esbuild/src/plugin-adapter.ts +66 -0
  113. package/src/extensions/ext-esbuild/src/runtime.ts +54 -0
  114. package/src/src/agent/conversation-bootstrap.ts +2 -2
  115. package/src/src/agent/conversation-root-run-context.ts +6 -6
  116. package/src/src/agent/durable.ts +3 -3
  117. package/src/src/agent/fork-runtime-stream.ts +61 -1
  118. package/src/src/agent/hosted-child-bootstrap.ts +2 -2
  119. package/src/src/agent/index.ts +2 -0
  120. package/src/src/build/bundler/code-splitter/build-context.ts +1 -1
  121. package/src/src/build/bundler/code-splitter/esbuild-plugin.ts +1 -1
  122. package/src/src/build/bundler/code-splitter/manifest-builder.ts +1 -1
  123. package/src/src/build/bundler/code-splitter/splitter.ts +1 -1
  124. package/src/src/build/bundler/code-splitter/types.ts +1 -1
  125. package/src/src/build/compiler/mdx-compiler/transpiler.ts +1 -1
  126. package/src/src/build/compiler/mdx-to-js.ts +1 -1
  127. package/src/src/build/embedded/preset.ts +1 -1
  128. package/src/src/build/production-build/client-runtime.ts +2 -2
  129. package/src/src/discovery/transpiler.ts +2 -2
  130. package/src/src/extensions/bundler.ts +85 -0
  131. package/src/src/extensions/interfaces/bundler.ts +189 -16
  132. package/src/src/extensions/interfaces/index.ts +16 -0
  133. package/src/src/extensions/interfaces/module-lexer.ts +46 -0
  134. package/src/src/extensions/loader.ts +6 -1
  135. package/src/src/extensions/recommendations.ts +3 -0
  136. package/src/src/platform/compat/esbuild.ts +48 -160
  137. package/src/src/rendering/script-page-handling.ts +1 -1
  138. package/src/src/routing/api/module-loader/esbuild-plugin.ts +1 -1
  139. package/src/src/routing/api/module-loader/loader.ts +2 -2
  140. package/src/src/server/bootstrap.ts +29 -0
  141. package/src/src/server/dev-server/middleware.ts +1 -1
  142. package/src/src/server/handlers/dev/files/esbuild-plugins.ts +1 -1
  143. package/src/src/server/handlers/studio/bridge-modules.handler.ts +1 -1
  144. package/src/src/server/services/rsc/endpoints/script-handlers.ts +4 -4
  145. package/src/src/server/services/rsc/orchestrators/hydrator-handler.ts +1 -1
  146. package/src/src/server/shared/browser-module-bundler.ts +1 -1
  147. package/src/src/testing/bdd.ts +1 -0
  148. package/src/src/testing/init.ts +9 -0
  149. package/src/src/transforms/esm/http-bundler.ts +1 -1
  150. package/src/src/transforms/esm/lexer.ts +13 -21
  151. package/src/src/transforms/esm/transform-utils.ts +1 -1
  152. package/src/src/transforms/import-rewriter/parse-cache.ts +10 -7
  153. package/src/src/transforms/mdx/esm-module-loader/import-transformer.ts +1 -1
  154. package/src/src/transforms/pipeline/stages/ssr-vf-modules/transform.ts +2 -2
  155. 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("esbuild");
317
+ const { build } = await import("../extensions/bundler.js");
318
318
  const loader = getEsbuildLoader(modulePath);
319
319
 
320
320
  const result = await build({
@@ -7,7 +7,7 @@ import {
7
7
  type LockfileManager,
8
8
  serverLogger,
9
9
  } from "../../../utils/index.js";
10
- import type { Message, Plugin } from "esbuild";
10
+ import type { Message, Plugin } from "../../../extensions/bundler.js";
11
11
 
12
12
  const logger = serverLogger.component("api");
13
13
 
@@ -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 "esbuild";
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("esbuild");
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("esbuild");
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 "esbuild";
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("esbuild");
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("esbuild").BuildOptions, "stdin"> & {
23
- stdin: import("esbuild").StdinOptions;
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("esbuild") | null = null;
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("esbuild");
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("esbuild");
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("esbuild");
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,
@@ -12,6 +12,7 @@ import "../../_dnt.polyfills.js";
12
12
  import * as dntShim from "../../_dnt.shims.js";
13
13
 
14
14
 
15
+ import "./init.js";
15
16
  import { isBun, isDeno } from "../platform/compat/runtime.js";
16
17
  import { getEnvOverlayStorage } from "../platform/compat/process.js";
17
18
 
@@ -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 "esbuild";
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 { init, parse } from "es-module-lexer";
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
- // es-module-lexer@1.5 exports init as a Promise (not a function) in ESM build
47
- // but some typings expect a function. Handle both to avoid type errors.
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
- [imports] = parse(masked);
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 [imports] = parse(masked);
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 [imports] = parse(masked);
160
+ const imports = getLexer().parse(masked);
169
161
 
170
162
  let result = masked;
171
163
 
@@ -1,4 +1,4 @@
1
- import type { Loader } from "esbuild";
1
+ import type { Loader } from "../../extensions/bundler.js";
2
2
  import { shortHash } from "../../utils/hash-utils.js";
3
3
 
4
4
  /**
@@ -5,21 +5,24 @@
5
5
  * This eliminates redundant parsing that happened with the fragmented system.
6
6
  */
7
7
 
8
- import { init, parse } from "es-module-lexer";
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 es-module-lexer (must be called before parsing).
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 anyInit = init as unknown;
20
- initPromise = typeof anyInit === "function"
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 [rawImports] = parse(masked);
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("esbuild");
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("esbuild");
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("esbuild");
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";
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.367";
3
+ export const VERSION = "0.1.369";