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
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,wBAAwB,CAAC;AAmCjG,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,OAAO,EAAE,cAAc,CAAC;IAExB,2BAA2B;IAC3B,MAAM,EAAE,eAAe,CAAC;IAExB,wCAAwC;IACxC,cAAc,EAAE,OAAO,CAAC;IAExB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,eAAe,EAAE,eAAe,CAAC;IAEjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AA2CD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,EAC3C,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAClC,OAAO,CAAC,eAAe,CAAC,CAO1B;AAkDD,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CA+I1B;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAyB1B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/src/server/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,wBAAwB,CAAC;AAqCjG,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,OAAO,EAAE,cAAc,CAAC;IAExB,2BAA2B;IAC3B,MAAM,EAAE,eAAe,CAAC;IAExB,wCAAwC;IACxC,cAAc,EAAE,OAAO,CAAC;IAExB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,eAAe,EAAE,eAAe,CAAC;IAEjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAmED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,EAC3C,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAClC,OAAO,CAAC,eAAe,CAAC,CAO1B;AAkDD,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAkJ1B;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAyB1B"}
@@ -2,6 +2,8 @@ import { clearConfigCache, getConfig } from "../config/index.js";
2
2
  import { orchestrateExtensions, tryResolve } from "../extensions/index.js";
3
3
  import { AIProviderRegistryName } from "../extensions/interfaces/index.js";
4
4
  import { createAIProviderRegistry } from "../extensions/registries/ai-provider-registry.js";
5
+ import { MISSING_EXTENSION_ERROR } from "../extensions/errors.js";
6
+ import { getRecommendation } from "../extensions/recommendations.js";
5
7
  import { setGlobalActiveSpanAccessor, setGlobalMetricsAPI, setGlobalTracerProvider, } from "../observability/tracing/api-shim.js";
6
8
  import { getEnvironmentConfig, refreshEnvironmentConfig, } from "../config/environment-config.js";
7
9
  import { getErrorMessage } from "../errors/veryfront-error.js";
@@ -22,6 +24,23 @@ const bootstrapProdLog = logger.component("bootstrap-prod");
22
24
  * Wire the `TracingExporter` contract (if registered) into the core shim.
23
25
  * Must be called after `orchestrateExtensions()` completes.
24
26
  */
27
+ /**
28
+ * Fail-fast: ensure the `Bundler` contract has been registered. Core depends
29
+ * on it for every JS/TS transform path. `ModuleLexer` is checked too, but
30
+ * only as a warning (dev-only paths can degrade).
31
+ */
32
+ function assertRequiredContracts() {
33
+ if (!tryResolve("Bundler")) {
34
+ const recommendation = getRecommendation("Bundler");
35
+ throw MISSING_EXTENSION_ERROR.create({
36
+ message: `Missing extension for contract "Bundler"${recommendation ? `. Recommended: ${recommendation}` : ""}`,
37
+ detail: recommendation ? `Install it with: deno add ${recommendation}` : undefined,
38
+ });
39
+ }
40
+ if (!tryResolve("ModuleLexer")) {
41
+ bootstrapLog.warn(`[bootstrap] no ModuleLexer extension registered — dev-server import rewriting will fail. Recommended: ${getRecommendation("ModuleLexer") ?? "@veryfront/ext-esbuild"}`);
42
+ }
43
+ }
25
44
  function wireTracingShim() {
26
45
  const tracing = tryResolve("TracingExporter");
27
46
  if (tracing) {
@@ -135,6 +154,7 @@ export async function bootstrap(projectDir, adapter) {
135
154
  primeContracts: { [AIProviderRegistryName]: createAIProviderRegistry() },
136
155
  });
137
156
  wireTracingShim();
157
+ assertRequiredContracts();
138
158
  return {
139
159
  adapter,
140
160
  config,
@@ -167,6 +187,7 @@ export async function bootstrap(projectDir, adapter) {
167
187
  primeContracts: { [AIProviderRegistryName]: createAIProviderRegistry() },
168
188
  });
169
189
  wireTracingShim();
190
+ assertRequiredContracts();
170
191
  return {
171
192
  adapter,
172
193
  config,
@@ -222,6 +243,7 @@ export async function bootstrap(projectDir, adapter) {
222
243
  primeContracts: { [AIProviderRegistryName]: createAIProviderRegistry() },
223
244
  }), fsDispose);
224
245
  wireTracingShim();
246
+ assertRequiredContracts();
225
247
  return {
226
248
  adapter: enhancedAdapter,
227
249
  config,
@@ -105,7 +105,7 @@ async function loadMiddlewareFromVirtualFS(middlewarePath, adapter) {
105
105
  const content = await adapter.fs.readFile(middlewarePath);
106
106
  const source = typeof content === "string" ? content : new TextDecoder().decode(content);
107
107
  const loader = getEsbuildLoader(middlewarePath);
108
- const { build } = await import("esbuild");
108
+ const { build } = await import("../../extensions/bundler.js");
109
109
  const result = await build({
110
110
  bundle: false,
111
111
  write: false,
@@ -1,4 +1,4 @@
1
- import type { Plugin } from "esbuild";
1
+ import type { Plugin } from "../../../../extensions/bundler.js";
2
2
  import type { RuntimeAdapter } from "../../../../platform/adapters/base.js";
3
3
  import { type LockfileManager } from "../../../../utils/import-lockfile.js";
4
4
  /** Create relative file system plugin for resolving imports via adapter's fs */
@@ -1 +1 @@
1
- {"version":3,"file":"esbuild-plugins.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/files/esbuild-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,MAAM,EAAe,MAAM,SAAS,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAQ5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sCAAsC,CAAC;AAkB9C,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAyF1F;AAKD,UAAU,yBAAyB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AA+DD,kFAAkF;AAClF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAAyB,GAAG,OAAe,GACnD,MAAM,CAqER;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD"}
1
+ {"version":3,"file":"esbuild-plugins.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/dev/files/esbuild-plugins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6B,MAAM,EAAe,MAAM,mCAAmC,CAAC;AAGxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAQ5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sCAAsC,CAAC;AAkB9C,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAyF1F;AAKD,UAAU,yBAAyB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AA+DD,kFAAkF;AAClF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAAyB,GAAG,OAAe,GACnD,MAAM,CAqER;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD"}
@@ -44,7 +44,7 @@ async function bundleBridge() {
44
44
  // Dev mode: bundle on-the-fly with esbuild
45
45
  const entryPoint = `${BRIDGE_DIR}bridge-coordinator.ts`;
46
46
  const source = await dntShim.Deno.readTextFile(entryPoint);
47
- const { build } = await import("esbuild");
47
+ const { build } = await import("../../../extensions/bundler.js");
48
48
  const { outputFiles } = await build({
49
49
  bundle: true,
50
50
  write: false,
@@ -17,7 +17,7 @@ async function buildOrServeScript(adapter, path, fallbackBundle, esbuildOptions)
17
17
  let esbuild = null;
18
18
  try {
19
19
  const src = await adapter.fs.readFile(path);
20
- esbuild = await import("esbuild");
20
+ esbuild = await import("../../../../extensions/bundler.js");
21
21
  const result = await esbuild.build({
22
22
  ...esbuildOptions,
23
23
  stdin: { ...esbuildOptions.stdin, contents: src },
@@ -25,7 +25,7 @@ export class HydratorHandler {
25
25
  return this.fsAdapter?.readFile(filePath) ?? compatFs.readTextFile(filePath);
26
26
  }
27
27
  async bundleHydrator(filePath) {
28
- const { build, stop } = await import("esbuild");
28
+ const { build, stop } = await import("../../../../extensions/bundler.js");
29
29
  try {
30
30
  const source = await this.readHydratorFile(filePath);
31
31
  const result = await build({
@@ -4,7 +4,7 @@ import { getDirectory, getEsbuildLoader } from "../../utils/path-utils.js";
4
4
  import { createBareExternalPlugin, createHttpExternalPlugin, createRelativeFsPlugin, } from "../handlers/dev/files/esbuild-plugins.js";
5
5
  export function bundleBrowserModule(absPath, options) {
6
6
  return withSpan("server.browser-module.bundle", async () => {
7
- const { build } = await import("esbuild");
7
+ const { build } = await import("../../extensions/bundler.js");
8
8
  const src = await options.adapter.fs.readFile(absPath);
9
9
  const importMapJson = await buildImportMapJson({
10
10
  projectDir: options.projectDir,
@@ -8,6 +8,7 @@
8
8
  * @module
9
9
  */
10
10
  import "../../_dnt.polyfills.js";
11
+ import "./init.js";
11
12
  /** Test function that can be sync or async */
12
13
  type TestFn = () => void | Promise<void>;
13
14
  /** Test options for Deno sanitizers (ignored in Node/Bun) */
@@ -1 +1 @@
1
- {"version":3,"file":"bdd.d.ts","sourceRoot":"","sources":["../../../src/src/testing/bdd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bdd.d.ts","sourceRoot":"","sources":["../../../src/src/testing/bdd.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import "../../_dnt.polyfills.js";
11
11
  import * as dntShim from "../../_dnt.shims.js";
12
+ import "./init.js";
12
13
  import { isBun, isDeno } from "../platform/compat/runtime.js";
13
14
  import { getEnvOverlayStorage } from "../platform/compat/process.js";
14
15
  function getActiveEnvOverlay() {
@@ -10,9 +10,16 @@
10
10
  * @module
11
11
  */
12
12
  import * as dntShim from "../../_dnt.shims.js";
13
+ import { EsbuildBundler, EsModuleLexer } from "../../extensions/ext-esbuild/src/index.js";
14
+ import { register as registerContract } from "../extensions/contracts.js";
13
15
  const g = dntShim.dntGlobalThis;
14
16
  g.__vfDisableLruInterval = true;
15
17
  g.__vfTestEnv = true;
16
18
  g.__vfTestEnvMask = {
17
19
  prefixes: ["VERYFRONT_", "OTEL_", "OAUTH_", "GITHUB_", "OPENAI_", "ANTHROPIC_", "GOOGLE_"],
18
20
  };
21
+ // Tests don't run the extension orchestrator; prime the Bundler + ModuleLexer
22
+ // contracts here so transforms that depend on them (lexer.ts, parse-cache.ts,
23
+ // the platform/compat/esbuild shim, and bundler call-sites) work in tests.
24
+ registerContract("Bundler", new EsbuildBundler());
25
+ registerContract("ModuleLexer", new EsModuleLexer());
@@ -1,4 +1,4 @@
1
- import type { Plugin } from "esbuild";
1
+ import type { Plugin } from "../../extensions/bundler.js";
2
2
  import { getReactUrls } from "./package-registry.js";
3
3
  /** Check if code has HTTP imports */
4
4
  export declare function hasHttpImports(code: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"http-bundler.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/http-bundler.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAyB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA0B5E,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,yDAAyD;AACzD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6GzC;AA4DD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD1B"}
1
+ {"version":3,"file":"http-bundler.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/http-bundler.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAyB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA0B5E,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,yDAAyD;AACzD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6GzC;AA4DD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD1B"}
@@ -1,13 +1,6 @@
1
+ import type { ImportSpecifier } from "../../extensions/interfaces/module-lexer.js";
2
+ export type { ImportSpecifier };
1
3
  export declare function initLexer(): Promise<void>;
2
- export type ImportSpecifier = {
3
- n: string | undefined;
4
- s: number;
5
- e: number;
6
- ss: number;
7
- se: number;
8
- d: number;
9
- a: number;
10
- };
11
4
  export declare function parseImports(code: string): Promise<readonly ImportSpecifier[]>;
12
5
  /**
13
6
  * Replace import specifiers (the path string) in the code.
@@ -1 +1 @@
1
- {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/lexer.ts"],"names":[],"mappings":"AAuCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAc/C;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAyBF,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAqBpF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7E,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACnE,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
1
+ {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/lexer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,6CAA6C,CAAC;AAEhG,YAAY,EAAE,eAAe,EAAE,CAAC;AA0ChC,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAS/C;AAyBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAqBpF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7E,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GACnE,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -1,5 +1,5 @@
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
3
  const logger = baseLogger.component("es-module-lexer");
4
4
  let initPromise = null;
5
5
  // Matches HTTP/HTTPS URLs in string literals (single, double, or backtick quotes)
@@ -22,17 +22,16 @@ function unmaskHttpUrls(code, urlMap) {
22
22
  }
23
23
  return result;
24
24
  }
25
+ function getLexer() {
26
+ return resolveContract("ModuleLexer");
27
+ }
25
28
  export async function initLexer() {
26
29
  if (initPromise) {
27
30
  await initPromise;
28
31
  return;
29
32
  }
30
- // es-module-lexer@1.5 exports init as a Promise (not a function) in ESM build
31
- // but some typings expect a function. Handle both to avoid type errors.
32
- const anyInit = init;
33
- initPromise = typeof anyInit === "function"
34
- ? anyInit()
35
- : anyInit;
33
+ const lexer = getLexer();
34
+ initPromise = lexer.init ? lexer.init() : Promise.resolve();
36
35
  await initPromise;
37
36
  }
38
37
  function logParseError(error, code) {
@@ -60,7 +59,7 @@ export async function parseImports(code) {
60
59
  const { masked, urlMap } = maskHttpUrls(code);
61
60
  let imports;
62
61
  try {
63
- [imports] = parse(masked);
62
+ imports = getLexer().parse(masked);
64
63
  }
65
64
  catch (error) {
66
65
  logParseError(error, masked);
@@ -82,7 +81,7 @@ export async function parseImports(code) {
82
81
  export async function replaceSpecifiers(code, replacer) {
83
82
  await initLexer();
84
83
  const { masked, urlMap } = maskHttpUrls(code);
85
- const [imports] = parse(masked);
84
+ const imports = getLexer().parse(masked);
86
85
  let result = masked;
87
86
  for (let i = imports.length - 1; i >= 0; i--) {
88
87
  const imp = imports[i];
@@ -116,7 +115,7 @@ export async function replaceSpecifiers(code, replacer) {
116
115
  export async function rewriteImports(code, rewriter) {
117
116
  await initLexer();
118
117
  const { masked, urlMap } = maskHttpUrls(code);
119
- const [imports] = parse(masked);
118
+ const imports = getLexer().parse(masked);
120
119
  let result = masked;
121
120
  for (let i = imports.length - 1; i >= 0; i--) {
122
121
  const imp = imports[i];
@@ -1,4 +1,4 @@
1
- import type { Loader } from "esbuild";
1
+ import type { Loader } from "../../extensions/bundler.js";
2
2
  /**
3
3
  * Compute a short 8-character content hash for cache keys.
4
4
  * Use this for transform cache keys where a compact hash is preferred.
@@ -1 +1 @@
1
- {"version":3,"file":"transform-utils.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/transform-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAExE;AAaD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD"}
1
+ {"version":3,"file":"transform-utils.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/esm/transform-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAG1D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAExE;AAaD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { ImportSpecifierInfo } from "./types.js";
8
8
  /**
9
- * Initialize es-module-lexer (must be called before parsing).
9
+ * Initialize the ModuleLexer (must be called before parsing).
10
10
  */
11
11
  export declare function initLexer(): Promise<void>;
12
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"parse-cache.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/import-rewriter/parse-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAS/C;AAsCD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,6CAA6C;IAC7C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmB1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACvE,MAAM,CAiDR;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7E,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
1
+ {"version":3,"file":"parse-cache.d.ts","sourceRoot":"","sources":["../../../../src/src/transforms/import-rewriter/parse-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAStD;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAO/C;AAsCD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,6CAA6C;IAC7C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmB1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACvE,MAAM,CAiDR;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7E,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
@@ -4,17 +4,18 @@
4
4
  * Single parse per file - reused across all strategies.
5
5
  * This eliminates redundant parsing that happened with the fragmented system.
6
6
  */
7
- import { init, parse } from "es-module-lexer";
7
+ import { resolve as resolveContract } from "../../extensions/contracts.js";
8
8
  let initPromise = null;
9
+ function getLexer() {
10
+ return resolveContract("ModuleLexer");
11
+ }
9
12
  /**
10
- * Initialize es-module-lexer (must be called before parsing).
13
+ * Initialize the ModuleLexer (must be called before parsing).
11
14
  */
12
15
  export async function initLexer() {
13
16
  if (!initPromise) {
14
- const anyInit = init;
15
- initPromise = typeof anyInit === "function"
16
- ? anyInit()
17
- : anyInit;
17
+ const lexer = getLexer();
18
+ initPromise = lexer.init ? lexer.init() : Promise.resolve();
18
19
  }
19
20
  await initPromise;
20
21
  }
@@ -47,7 +48,7 @@ function unmaskUrl(specifier, urlMap) {
47
48
  export async function parseAllImports(code) {
48
49
  await initLexer();
49
50
  const { masked, urlMap } = maskHttpUrls(code);
50
- const [rawImports] = parse(masked);
51
+ const rawImports = getLexer().parse(masked);
51
52
  const imports = rawImports
52
53
  .filter((imp) => imp.n !== undefined)
53
54
  .map((imp) => ({
@@ -70,7 +70,7 @@ export function transformImports(code, importMap) {
70
70
  * Optimized to process all imports in parallel batches for better performance.
71
71
  */
72
72
  export async function transformJsxImports(code, adapter, esmCacheDir) {
73
- const { transform } = await import("esbuild");
73
+ const { transform } = await import("../../../extensions/bundler.js");
74
74
  const importsToProcess = [];
75
75
  let jsxMatch;
76
76
  while ((jsxMatch = JSX_IMPORT_PATTERN.exec(code)) !== null) {
@@ -77,7 +77,7 @@ export async function transformFrameworkCode(content, sourcePath, ctx, throwOnMi
77
77
  depth,
78
78
  });
79
79
  // Return minimally transformed code - it will fail at runtime but won't hang
80
- const { transform } = await import("esbuild");
80
+ const { transform } = await import("../../../../extensions/bundler.js");
81
81
  const ext = sourcePath.match(/\.(tsx?|jsx?)$/)?.[1] ?? "tsx";
82
82
  let loader = "js";
83
83
  if (ext === "tsx")
@@ -121,7 +121,7 @@ export async function transformFrameworkCode(content, sourcePath, ctx, throwOnMi
121
121
  // Mark as being transformed
122
122
  transformingFiles.add(sourcePath);
123
123
  try {
124
- const { transform } = await import("esbuild");
124
+ const { transform } = await import("../../../../extensions/bundler.js");
125
125
  const ext = sourcePath.match(/\.(tsx?|jsx?)$/)?.[1] ?? "tsx";
126
126
  let loader = "js";
127
127
  if (ext === "tsx")
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.367";
1
+ export declare const VERSION = "0.1.369";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.367",
3
+ "version": "0.1.369",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
@@ -70,6 +70,7 @@ export async function createPackageJson(
70
70
  react: `^${DEFAULT_INIT_REACT_VERSION}`,
71
71
  "react-dom": `^${DEFAULT_INIT_REACT_VERSION}`,
72
72
  veryfront: `^${VERSION}`,
73
+ "@veryfront/ext-esbuild": `^${VERSION}`,
73
74
  zod: "^3.24.0",
74
75
  },
75
76
  };
package/src/cli/main.ts CHANGED
@@ -17,6 +17,20 @@ import * as dntShim from "../_dnt.shims.js";
17
17
 
18
18
  await import("../src/platform/compat/esbuild-init.js");
19
19
 
20
+ // Register the default Bundler + ModuleLexer contracts shipped with the
21
+ // binary so bootstrap paths can resolve them without the user having to
22
+ // declare @veryfront/ext-esbuild as a project extension. User-installed
23
+ // extensions (orchestrated later) can still override these.
24
+ {
25
+ const { register } = await import("../src/extensions/contracts.js");
26
+ const { tryResolve } = await import("../src/extensions/index.js");
27
+ if (!tryResolve("Bundler") || !tryResolve("ModuleLexer")) {
28
+ const { EsbuildBundler, EsModuleLexer } = await import("../extensions/ext-esbuild/src/index.js");
29
+ if (!tryResolve("Bundler")) register("Bundler", new EsbuildBundler());
30
+ if (!tryResolve("ModuleLexer")) register("ModuleLexer", new EsModuleLexer());
31
+ }
32
+ }
33
+
20
34
  // All imports below must be dynamic to ensure esbuild init completes first
21
35
  const { getArgs } = await import("../src/platform/index.js");
22
36
  const { hasEnvLoaded, loadEnv, markEnvLoaded, supportsEnvFiles } = await import(
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.367",
3
+ "version": "0.1.369",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -10,6 +10,7 @@ export default {
10
10
  "./extensions/ext-node-compat",
11
11
  "./extensions/ext-openai",
12
12
  "./extensions/ext-opentelemetry",
13
+ "./extensions/ext-esbuild",
13
14
  "./extensions/ext-redis",
14
15
  "./extensions/ext-tailwind"
15
16
  ],
@@ -143,6 +144,9 @@ export default {
143
144
  "veryfront/testing": "./src/testing/index.ts",
144
145
  "veryfront/testing/assert": "./src/testing/assert.ts",
145
146
  "veryfront/testing/bdd": "./src/testing/bdd.ts",
147
+ "veryfront/extensions/bundler": "./src/extensions/bundler.ts",
148
+ "veryfront/extensions/contracts": "./src/extensions/contracts.ts",
149
+ "veryfront/extensions/interfaces": "./src/extensions/interfaces/index.ts",
146
150
  "#veryfront": "./src/index.ts",
147
151
  "#veryfront/agent": "./src/agent/index.ts",
148
152
  "#veryfront/agent/react": "./src/agent/react/index.ts",
@@ -275,9 +279,6 @@ export default {
275
279
  "rehype-raw": "npm:rehype-raw@7.0.0",
276
280
  "rehype-sanitize": "npm:rehype-sanitize@6.0.0",
277
281
  "rehype-stringify": "npm:rehype-stringify@10.0.1",
278
- "esbuild": "npm:esbuild@0.27.4",
279
- "esbuild/mod.js": "npm:esbuild@0.27.4",
280
- "es-module-lexer": "npm:es-module-lexer@2.0.0",
281
282
  "gray-matter": "npm:gray-matter@4.0.3",
282
283
  "zod": "npm:zod@4.3.6",
283
284
  "mdast": "npm:@types/mdast@4.0.3",
@@ -440,7 +441,6 @@ export default {
440
441
  "npm:onnxruntime-node@1.21.0"
441
442
  ],
442
443
  "deny": [
443
- "npm:esbuild@0.27.4",
444
444
  "npm:protobufjs@7.5.4"
445
445
  ]
446
446
  }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Binary extraction for `deno compile` VFS.
3
+ *
4
+ * Ported from src/platform/compat/esbuild.ts + esbuild-shared.ts. When the
5
+ * framework runs as a compiled Deno binary, the esbuild native binary lives
6
+ * inside the VFS and must be copied to a writable path before esbuild's
7
+ * child-process spawn can find it.
8
+ *
9
+ * On normal Deno (not `deno compile`) or when ESBUILD_BINARY_PATH is already
10
+ * set, `ensureEsbuildBinary()` is a no-op.
11
+ *
12
+ * @module extensions/ext-esbuild/binary
13
+ */
14
+ import * as dntShim from "../../../_dnt.shims.js";
15
+
16
+
17
+ import { isDenoCompiled } from "./runtime.js";
18
+
19
+ const ESBUILD_VERSION = "0.27.4";
20
+
21
+ function getTempDir(): string {
22
+ try {
23
+ return (
24
+ dntShim.Deno.env.get("TMPDIR") ?? dntShim.Deno.env.get("TEMP") ?? dntShim.Deno.env.get("TMP") ?? "/tmp"
25
+ );
26
+ } catch {
27
+ return "/tmp";
28
+ }
29
+ }
30
+
31
+ function getEsbuildBinaryName(): string {
32
+ const archMap: Record<string, string> = { x86_64: "x64", aarch64: "arm64" };
33
+ const arch = archMap[dntShim.Deno.build.arch] ?? dntShim.Deno.build.arch;
34
+ return `@esbuild/${dntShim.Deno.build.os}-${arch}`;
35
+ }
36
+
37
+ function getVFSBasePath(filePath: string, tempDir: string): string {
38
+ const denoCompileMatch = filePath.match(/^(.*\/deno-compile-[^/]+)\//);
39
+ if (denoCompileMatch?.[1]) return denoCompileMatch[1];
40
+ const parts = filePath.split("/");
41
+ const srcIndex = parts.lastIndexOf("src");
42
+ if (srcIndex > 0) return parts.slice(0, srcIndex).join("/");
43
+ return `${tempDir}/deno-compile-veryfront`;
44
+ }
45
+
46
+ async function isFile(path: string): Promise<boolean> {
47
+ try {
48
+ const stat = await dntShim.Deno.stat(path);
49
+ return stat.isFile;
50
+ } catch {
51
+ return false;
52
+ }
53
+ }
54
+
55
+ async function findEsbuildInVFS(): Promise<string | null> {
56
+ const binaryName = getEsbuildBinaryName();
57
+ const vfsBase = getVFSBasePath(new URL(import.meta.url).pathname, getTempDir());
58
+
59
+ const possiblePaths = [
60
+ `${vfsBase}/node_modules/${binaryName}/bin/esbuild`,
61
+ `${vfsBase}/node_modules/.deno/${binaryName}@${ESBUILD_VERSION}/node_modules/${binaryName}/bin/esbuild`,
62
+ `${vfsBase}/node_modules/.deno/esbuild@${ESBUILD_VERSION}/node_modules/${binaryName}/bin/esbuild`,
63
+ `${vfsBase}/node_modules/esbuild/bin/esbuild`,
64
+ `${vfsBase}/node_modules/.package/esbuild@${ESBUILD_VERSION}/bin/esbuild`,
65
+ `${vfsBase}/node_modules/.package/${binaryName}@${ESBUILD_VERSION}/bin/esbuild`,
66
+ ];
67
+
68
+ for (const p of possiblePaths) {
69
+ if (await isFile(p)) return p;
70
+ }
71
+
72
+ try {
73
+ const nodeModulesPath = `${vfsBase}/node_modules`;
74
+ for await (const entry of dntShim.Deno.readDir(nodeModulesPath)) {
75
+ if (entry.name !== binaryName && !entry.name.startsWith("@esbuild")) continue;
76
+ const binPath = `${nodeModulesPath}/${entry.name}/bin/esbuild`;
77
+ if (await isFile(binPath)) return binPath;
78
+ }
79
+ } catch {
80
+ /* node_modules not readable in VFS */
81
+ }
82
+
83
+ return null;
84
+ }
85
+
86
+ async function extractEsbuildBinary(): Promise<string> {
87
+ const cacheDir = `${getTempDir()}/veryfront-esbuild`;
88
+ const targetPath = `${cacheDir}/esbuild-${ESBUILD_VERSION}`;
89
+
90
+ try {
91
+ const stat = await dntShim.Deno.stat(targetPath);
92
+ if (stat.isFile && stat.mode && (stat.mode & 0o111)) return targetPath;
93
+ } catch {
94
+ /* cache miss */
95
+ }
96
+
97
+ const vfsPath = await findEsbuildInVFS();
98
+ if (!vfsPath) {
99
+ throw new Error(
100
+ `[ext-esbuild] Could not find esbuild binary in deno compile VFS. ` +
101
+ `Platform: ${getEsbuildBinaryName()}. ` +
102
+ `Ensure esbuild is in dependencies and deno compile includes node_modules.`,
103
+ );
104
+ }
105
+
106
+ await dntShim.Deno.mkdir(cacheDir, { recursive: true });
107
+ const binary = await dntShim.Deno.readFile(vfsPath);
108
+ await dntShim.Deno.writeFile(targetPath, binary, { mode: 0o755 });
109
+
110
+ return targetPath;
111
+ }
112
+
113
+ let setupComplete = false;
114
+ let setupPromise: Promise<void> | null = null;
115
+
116
+ /**
117
+ * Idempotent one-shot setup — copies the esbuild binary out of the VFS (if
118
+ * running in `deno compile`) and sets ESBUILD_BINARY_PATH. No-op on normal
119
+ * Deno or when the env var is already set.
120
+ */
121
+ export async function ensureEsbuildBinary(): Promise<void> {
122
+ if (setupComplete) return;
123
+ if (setupPromise) {
124
+ await setupPromise;
125
+ return;
126
+ }
127
+
128
+ setupPromise = (async () => {
129
+ try {
130
+ if (dntShim.Deno.env.get("ESBUILD_BINARY_PATH") || !isDenoCompiled) {
131
+ setupComplete = true;
132
+ return;
133
+ }
134
+
135
+ try {
136
+ const binaryPath = await extractEsbuildBinary();
137
+ dntShim.Deno.env.set("ESBUILD_BINARY_PATH", binaryPath);
138
+ // esbuild reads process.env (not Deno.env) on some code paths.
139
+ const proc = (dntShim.dntGlobalThis as { process?: { env: Record<string, string> } }).process;
140
+ if (proc?.env) proc.env.ESBUILD_BINARY_PATH = binaryPath;
141
+ } catch (err) {
142
+ console.error("[ext-esbuild] Binary extraction failed:", err);
143
+ }
144
+ } finally {
145
+ setupComplete = true;
146
+ }
147
+ })();
148
+
149
+ try {
150
+ await setupPromise;
151
+ } finally {
152
+ setupPromise = null;
153
+ }
154
+ }