veryfront 0.1.626 → 0.1.628

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 (25) hide show
  1. package/esm/deno.js +1 -1
  2. package/esm/src/agent/runtime/chat-stream-handler.d.ts +2 -0
  3. package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
  4. package/esm/src/agent/runtime/chat-stream-handler.js +34 -15
  5. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  6. package/esm/src/agent/runtime/index.js +21 -17
  7. package/esm/src/platform/adapters/runtime/deno/adapter.d.ts.map +1 -1
  8. package/esm/src/platform/adapters/runtime/deno/adapter.js +5 -2
  9. package/esm/src/platform/compat/http/node-types.d.ts +4 -0
  10. package/esm/src/platform/compat/http/node-types.d.ts.map +1 -1
  11. package/esm/src/platform/compat/http/request-adapter.d.ts +12 -0
  12. package/esm/src/platform/compat/http/request-adapter.d.ts.map +1 -1
  13. package/esm/src/platform/compat/http/request-adapter.js +49 -4
  14. package/esm/src/platform/compat/http/websocket.js +9 -2
  15. package/esm/src/routing/api/module-loader/external-import-rewriter.d.ts +15 -1
  16. package/esm/src/routing/api/module-loader/external-import-rewriter.d.ts.map +1 -1
  17. package/esm/src/routing/api/module-loader/external-import-rewriter.js +106 -2
  18. package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
  19. package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
  20. package/esm/src/routing/api/module-loader/loader.js +1 -1
  21. package/esm/src/server/handlers/preview/hmr.handler.d.ts.map +1 -1
  22. package/esm/src/server/handlers/preview/hmr.handler.js +5 -0
  23. package/esm/src/utils/version-constant.d.ts +1 -1
  24. package/esm/src/utils/version-constant.js +1 -1
  25. package/package.json +1 -1
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.626",
3
+ "version": "0.1.628",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "workspace": [
@@ -3,6 +3,8 @@ export interface StreamingToolCall {
3
3
  id: string;
4
4
  name: string;
5
5
  arguments: string;
6
+ inputDeltas?: string[];
7
+ inputAnnounced?: boolean;
6
8
  inputAvailable?: boolean;
7
9
  providerExecuted?: boolean;
8
10
  dynamic?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA+KD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAqbf"}
1
+ {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA+KD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CA2cf"}
@@ -219,6 +219,26 @@ export function processStream(result, state, controller, encoder, textPartId, ca
219
219
  });
220
220
  activeReasoningId = null;
221
221
  };
222
+ const announceToolInputStart = (toolCall) => {
223
+ if (toolCall.inputAnnounced === true) {
224
+ return;
225
+ }
226
+ const dynamic = toolCall.dynamic ?? isDynamicTool(toolCall.name);
227
+ sendSSE(controller, encoder, {
228
+ type: "tool-input-start",
229
+ toolCallId: toolCall.id,
230
+ toolName: toolCall.name,
231
+ ...(dynamic ? { dynamic: true } : {}),
232
+ });
233
+ for (const delta of toolCall.inputDeltas ?? []) {
234
+ sendSSE(controller, encoder, {
235
+ type: "tool-input-delta",
236
+ toolCallId: toolCall.id,
237
+ inputTextDelta: delta,
238
+ });
239
+ }
240
+ toolCall.inputAnnounced = true;
241
+ };
222
242
  const ensureToolLifecycle = (part) => {
223
243
  const dynamic = part.dynamic ?? isDynamicTool(part.toolName);
224
244
  const existing = state.toolCalls.get(part.toolCallId);
@@ -233,6 +253,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
233
253
  ? { providerExecuted: part.providerExecuted }
234
254
  : {}),
235
255
  ...(dynamic ? { dynamic: true } : {}),
256
+ inputAnnounced: true,
236
257
  });
237
258
  sendSSE(controller, encoder, {
238
259
  type: "tool-input-start",
@@ -267,6 +288,7 @@ export function processStream(result, state, controller, encoder, textPartId, ca
267
288
  if (dynamic) {
268
289
  existing.dynamic = true;
269
290
  }
291
+ announceToolInputStart(existing);
270
292
  sendSSE(controller, encoder, {
271
293
  type: "tool-input-available",
272
294
  toolCallId: part.toolCallId,
@@ -353,13 +375,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
353
375
  inputAvailable: false,
354
376
  providerExecuted: typedPart.providerExecuted,
355
377
  dynamic: typedPart.dynamic,
356
- });
357
- const dynamic = isDynamicTool(typedPart.toolName);
358
- sendSSE(controller, encoder, {
359
- type: "tool-input-start",
360
- toolCallId: toolId,
361
- toolName: typedPart.toolName,
362
- ...(dynamic ? { dynamic: true } : {}),
378
+ inputDeltas: [],
379
+ inputAnnounced: false,
363
380
  });
364
381
  break;
365
382
  }
@@ -370,11 +387,8 @@ export function processStream(result, state, controller, encoder, textPartId, ca
370
387
  if (!tc)
371
388
  break;
372
389
  tc.arguments = mergeToolInputDelta(tc.arguments, typedPart.delta);
373
- sendSSE(controller, encoder, {
374
- type: "tool-input-delta",
375
- toolCallId: toolId,
376
- inputTextDelta: typedPart.delta,
377
- });
390
+ tc.inputDeltas ??= [];
391
+ tc.inputDeltas.push(typedPart.delta);
378
392
  break;
379
393
  }
380
394
  case "tool-call": {
@@ -383,18 +397,23 @@ export function processStream(result, state, controller, encoder, textPartId, ca
383
397
  // tool-call fires when the full tool call is available
384
398
  const toolId = typedPart.toolCallId;
385
399
  const inputStr = normalizeToolInputString(typedPart.input);
386
- const previousArguments = state.toolCalls.get(toolId)?.arguments ?? "";
400
+ const previous = state.toolCalls.get(toolId);
401
+ const previousArguments = previous?.arguments ?? "";
387
402
  const resolvedArguments = mergeToolCallInput(previousArguments, inputStr);
388
- state.toolCalls.set(toolId, {
403
+ const toolCall = {
389
404
  id: toolId,
390
405
  name: typedPart.toolName,
391
406
  arguments: resolvedArguments,
407
+ inputDeltas: previous?.inputDeltas ?? [],
408
+ inputAnnounced: previous?.inputAnnounced ?? false,
392
409
  inputAvailable: true,
393
410
  providerExecuted: typedPart.providerExecuted,
394
411
  dynamic: typedPart.dynamic,
395
- });
412
+ };
413
+ state.toolCalls.set(toolId, toolCall);
396
414
  const dynamic = isDynamicTool(typedPart.toolName);
397
415
  const inputObj = parseToolInputObject(typedPart.input);
416
+ announceToolInputStart(toolCall);
398
417
  sendSSE(controller, encoder, {
399
418
  type: "tool-input-available",
400
419
  toolCallId: toolId,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -821,14 +821,16 @@ export class AgentRuntime {
821
821
  partialArgumentsLength: materialized.partialArgumentsLength,
822
822
  partialArgumentsPreview: materialized.partialArgumentsPreview,
823
823
  });
824
- const dynamicIncomplete = isDynamicTool(tc.name);
825
- sendSSE(controller, encoder, {
826
- type: "tool-input-error",
827
- toolCallId: tc.id,
828
- errorText: `Stream terminated before tool-call event fired for "${tc.name}". ` +
829
- `Received ${materialized.partialArgumentsLength} chars of partial tool-input deltas.`,
830
- ...(dynamicIncomplete ? { dynamic: true } : {}),
831
- });
824
+ if (tc.inputAnnounced === true) {
825
+ const dynamicIncomplete = isDynamicTool(tc.name);
826
+ sendSSE(controller, encoder, {
827
+ type: "tool-input-error",
828
+ toolCallId: tc.id,
829
+ errorText: `Stream terminated before tool-call event fired for "${tc.name}". ` +
830
+ `Received ${materialized.partialArgumentsLength} chars of partial tool-input deltas.`,
831
+ ...(dynamicIncomplete ? { dynamic: true } : {}),
832
+ });
833
+ }
832
834
  }
833
835
  else if (materialized.kind === "parse-error") {
834
836
  logger.warn("Failed to parse streamed tool arguments", {
@@ -897,7 +899,7 @@ export class AgentRuntime {
897
899
  status: "pending",
898
900
  };
899
901
  await this.recordToolError(incompleteToolCall, `Stream terminated before tool-call event fired for "${tc.name}". ` +
900
- `Received ${tc.arguments.length} chars of partial tool-input deltas.`, controller, encoder, currentMessages, toolCalls, currentRunToolState);
902
+ `Received ${tc.arguments.length} chars of partial tool-input deltas.`, controller, encoder, currentMessages, toolCalls, currentRunToolState, { emitSse: tc.inputAnnounced === true });
901
903
  continue;
902
904
  }
903
905
  const capturedInput = captureStreamedToolCallInput(tc);
@@ -1019,17 +1021,19 @@ export class AgentRuntime {
1019
1021
  /**
1020
1022
  * Record a tool error and send SSE event.
1021
1023
  */
1022
- async recordToolError(toolCall, errorStr, controller, encoder, currentMessages, toolCalls, currentRunToolState) {
1024
+ async recordToolError(toolCall, errorStr, controller, encoder, currentMessages, toolCalls, currentRunToolState, options = {}) {
1023
1025
  toolCall.status = "error";
1024
1026
  toolCall.error = errorStr;
1025
1027
  toolCalls.push(toolCall);
1026
- const dynamic = isDynamicTool(toolCall.name);
1027
- sendSSE(controller, encoder, {
1028
- type: "tool-output-error",
1029
- toolCallId: toolCall.id,
1030
- errorText: errorStr,
1031
- ...(dynamic ? { dynamic: true } : {}),
1032
- });
1028
+ if (options.emitSse !== false) {
1029
+ const dynamic = isDynamicTool(toolCall.name);
1030
+ sendSSE(controller, encoder, {
1031
+ type: "tool-output-error",
1032
+ toolCallId: toolCall.id,
1033
+ errorText: errorStr,
1034
+ ...(dynamic ? { dynamic: true } : {}),
1035
+ });
1036
+ }
1033
1037
  const errorMessage = createToolErrorMessage(toolCall.id, toolCall.name, errorStr);
1034
1038
  currentMessages.push(errorMessage);
1035
1039
  await this.memory.add(errorMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAyHvB,cAAM,qBAAsB,YAAW,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAY/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW;CAuErE;AAED,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGnC;AAED,cAAM,iBAAkB,YAAW,aAAa;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;CASrD;AAED,cAAM,gBAAiB,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAejE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAanC;AAwBD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,EAAE,wBAA+B;IAC1C,QAAQ,CAAC,GAAG,yBAAgC;IAC5C,QAAQ,CAAC,MAAM,oBAA2B;IAC1C,QAAQ,CAAC,KAAK,mBAA0B;IAExC,QAAQ,CAAC,YAAY;;;;;;;;;;MAUnB;IAEF,OAAO,CAAC,YAAY,CAA2B;IAE/C,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAC3D,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAuEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAyHvB,cAAM,qBAAsB,YAAW,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAY/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW;CAuErE;AAED,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGnC;AAED,cAAM,iBAAkB,YAAW,aAAa;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB;CAYrD;AAED,cAAM,gBAAiB,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAejE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAanC;AAwBD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,EAAE,wBAA+B;IAC1C,QAAQ,CAAC,GAAG,yBAAgC;IAC5C,QAAQ,CAAC,MAAM,oBAA2B;IAC1C,QAAQ,CAAC,KAAK,mBAA0B;IAExC,QAAQ,CAAC,YAAY;;;;;;;;;;MAUnB;IAEF,OAAO,CAAC,YAAY,CAA2B;IAE/C,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAC3D,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAuEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -212,12 +212,15 @@ class DenoEnvironmentAdapter {
212
212
  }
213
213
  class DenoServerAdapter {
214
214
  upgradeWebSocket(request) {
215
- if (typeof dntShim.Deno === "undefined") {
215
+ // Access native Deno via `self` to bypass dnt shim transform.
216
+ // dnt rewrites `globalThis.Deno` to @deno/shim-deno, which lacks upgradeWebSocket.
217
+ const nativeDeno = self["Deno"];
218
+ if (typeof nativeDeno?.upgradeWebSocket !== "function") {
216
219
  throw NOT_SUPPORTED.create({
217
220
  detail: "DenoServerAdapter.upgradeWebSocket() can only be used in Deno runtime",
218
221
  });
219
222
  }
220
- const { socket, response } = dntShim.Deno.upgradeWebSocket(request);
223
+ const { socket, response } = nativeDeno.upgradeWebSocket(request);
221
224
  return { socket, response };
222
225
  }
223
226
  }
@@ -5,6 +5,10 @@ export interface NodeIncomingMessage {
5
5
  on(event: "data", handler: (chunk: Uint8Array) => void): void;
6
6
  on(event: "end", handler: () => void): void;
7
7
  on(event: "error", handler: (error: Error) => void): void;
8
+ /** Pause flowing mode — used to apply backpressure to the request body. */
9
+ pause?(): void;
10
+ /** Resume flowing mode once the body stream consumer asks for more. */
11
+ resume?(): void;
8
12
  }
9
13
  export interface NodeServerResponse {
10
14
  statusCode: number;
@@ -1 +1 @@
1
- {"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/node-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACxC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CACV,eAAe,EAAE,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAC3E,UAAU,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,GAAG,CAAC;CACjB"}
1
+ {"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/node-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,2EAA2E;IAC3E,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,uEAAuE;IACvE,MAAM,CAAC,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACxC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACnE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAChE,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,CACV,eAAe,EAAE,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAC3E,UAAU,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,GAAG,CAAC;CACjB"}
@@ -1,3 +1,15 @@
1
1
  import type { NodeIncomingMessage } from "./node-types.js";
2
+ /**
3
+ * Convert a Node `http.IncomingMessage` into a WHATWG `Request`.
4
+ *
5
+ * A Node request is a readable stream of body bytes. When a streaming body is
6
+ * supplied to the `Request` constructor (e.g. under Node's built-in fetch /
7
+ * undici), the spec requires `duplex: "half"` — without it the constructor
8
+ * throws `TypeError: RequestInit: duplex option is required when sending a
9
+ * body.`, which previously surfaced as a generic 500 for every POST/PUT/etc.
10
+ *
11
+ * Bodyless methods (`GET`/`HEAD`/`OPTIONS`) must not attach a body at all;
12
+ * `OPTIONS` in particular is used for CORS preflights and carries no body.
13
+ */
2
14
  export declare function convertNodeRequestToWebRequest(req: NodeIncomingMessage, url: string): Request;
3
15
  //# sourceMappingURL=request-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/request-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,mBAAmB,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAUT"}
1
+ {"version":3,"file":"request-adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/compat/http/request-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,mBAAmB,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAiBT"}
@@ -1,9 +1,54 @@
1
+ /** HTTP methods that never carry a request body. */
2
+ const BODYLESS_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
3
+ /**
4
+ * Convert a Node `http.IncomingMessage` into a WHATWG `Request`.
5
+ *
6
+ * A Node request is a readable stream of body bytes. When a streaming body is
7
+ * supplied to the `Request` constructor (e.g. under Node's built-in fetch /
8
+ * undici), the spec requires `duplex: "half"` — without it the constructor
9
+ * throws `TypeError: RequestInit: duplex option is required when sending a
10
+ * body.`, which previously surfaced as a generic 500 for every POST/PUT/etc.
11
+ *
12
+ * Bodyless methods (`GET`/`HEAD`/`OPTIONS`) must not attach a body at all;
13
+ * `OPTIONS` in particular is used for CORS preflights and carries no body.
14
+ */
1
15
  export function convertNodeRequestToWebRequest(req, url) {
2
- const method = req.method;
3
- const body = method !== "GET" && method !== "HEAD" ? req : undefined;
4
- return new Request(url, {
16
+ const method = req.method ?? "GET";
17
+ const hasBody = !BODYLESS_METHODS.has(method.toUpperCase());
18
+ // `duplex` is part of the WHATWG fetch spec but not yet in the lib.dom
19
+ // `RequestInit` type, hence the intersection.
20
+ const init = {
5
21
  method,
6
22
  headers: req.headers,
7
- body,
23
+ };
24
+ if (hasBody) {
25
+ init.body = nodeRequestToReadableStream(req);
26
+ init.duplex = "half";
27
+ }
28
+ return new Request(url, init);
29
+ }
30
+ /**
31
+ * Adapt a Node readable request into a web `ReadableStream` using only the
32
+ * event interface declared on {@link NodeIncomingMessage}, so this stays free
33
+ * of a hard `node:stream` dependency (consistent with the rest of the compat
34
+ * layer, which avoids static Node imports for non-Node runtimes).
35
+ */
36
+ function nodeRequestToReadableStream(req) {
37
+ return new ReadableStream({
38
+ start(controller) {
39
+ req.on("data", (chunk) => {
40
+ controller.enqueue(chunk);
41
+ // Apply backpressure: once the stream's internal queue is full, pause
42
+ // the Node request so it stops buffering the whole body in memory.
43
+ if ((controller.desiredSize ?? 1) <= 0)
44
+ req.pause?.();
45
+ });
46
+ req.on("end", () => controller.close());
47
+ req.on("error", (error) => controller.error(error));
48
+ },
49
+ pull() {
50
+ // The consumer asked for more — resume flowing mode.
51
+ req.resume?.();
52
+ },
8
53
  });
9
54
  }
@@ -1,4 +1,3 @@
1
- import * as dntShim from "../../../../_dnt.shims.js";
2
1
  import { isDeno } from "../runtime.js";
3
2
  import { NOT_SUPPORTED } from "../../../errors/index.js";
4
3
  export function upgradeWebSocket(request, options) {
@@ -14,9 +13,17 @@ export function isWebSocketUpgrade(request) {
14
13
  return request.headers.get("upgrade")?.toLowerCase() === "websocket";
15
14
  }
16
15
  function upgradeWebSocketDeno(request, options) {
16
+ // Access native Deno via `self` to bypass dnt shim transform.
17
+ // dnt rewrites `globalThis.Deno` to @deno/shim-deno, which lacks upgradeWebSocket.
18
+ const nativeDeno = self["Deno"];
19
+ if (typeof nativeDeno?.upgradeWebSocket !== "function") {
20
+ throw NOT_SUPPORTED.create({
21
+ detail: "Deno.upgradeWebSocket() is not available in this runtime.",
22
+ });
23
+ }
17
24
  const denoOptions = options?.protocol
18
25
  ? { protocol: options.protocol }
19
26
  : undefined;
20
- const { socket, response } = dntShim.Deno.upgradeWebSocket(request, denoOptions);
27
+ const { socket, response } = nativeDeno.upgradeWebSocket(request, denoOptions);
21
28
  return { socket, response };
22
29
  }
@@ -15,12 +15,26 @@ export declare function readProjectDependencies(projectDir: string, fs: FileSyst
15
15
  export declare function generateCompiledBinaryRequireShim(projectDir: string): string;
16
16
  export declare function getNodeExternalPackagesToResolve(userDeps: Map<string, string>): string[];
17
17
  export declare function resolveNodePackageToFileUrl(projectDir: string, packageName: string, fs: FileSystem, pathToFileURL: typeof import("node:url").pathToFileURL): Promise<string | null>;
18
+ /** Location of an ESM-only user dependency, used to rewrite imports to real ES module URLs. */
19
+ export interface EsmDependencyLocation {
20
+ /** file:// URL of the package's ESM entry point. */
21
+ entryUrl: string;
22
+ /** Absolute path of the package's root directory (used to contain subpath imports). */
23
+ packageDir: string;
24
+ }
25
+ /**
26
+ * Identify the subset of user dependencies that are ESM-only and resolve each
27
+ * to file:// URLs so the compiled-binary loader can import them as real ES
28
+ * modules instead of transpiling them to CommonJS. CJS dependencies are omitted
29
+ * and continue to load through the `createRequire`-based shim.
30
+ */
31
+ export declare function resolveEsmUserDependencies(projectDir: string, fs: FileSystem, userDeps: Map<string, string>): Promise<Map<string, EsmDependencyLocation>>;
18
32
  export declare function loadVeryfrontExportsMap(projectDir: string, fs: FileSystem): Promise<Record<string, {
19
33
  import?: string;
20
34
  }>>;
21
35
  export declare function rewriteNodeExternalImports(code: string, projectDir: string, fs: FileSystem, userDeps: Map<string, string>): Promise<string>;
22
36
  export declare function rewriteCompiledBinaryVeryfrontImports(code: string): string;
23
- export declare function rewriteCompiledBinaryUserDependencyImports(code: string, userDeps: Map<string, string>): string;
37
+ export declare function rewriteCompiledBinaryUserDependencyImports(code: string, userDeps: Map<string, string>, esmDeps?: Map<string, EsmDependencyLocation>): string;
24
38
  export declare function rewriteDenoNpmDependencyImports(code: string, projectDir: string, fs: FileSystem, userDeps: Map<string, string>): Promise<string>;
25
39
  export declare function rewriteDenoNodeBuiltinImports(code: string): string;
26
40
  export declare function rewriteExternalImports(code: string, projectDir: string, fs: FileSystem, userDeps?: Map<string, string>): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"external-import-rewriter.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/external-import-rewriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAQjE,wGAAwG;AACxG,eAAO,MAAM,aAAa,mVAkChB,CAAC;AAEX,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAS9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA+E5E;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAUxF;AAED,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,cAAc,UAAU,EAAE,aAAa,GACrD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBxB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAW9C;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6EjB;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB1E;AAED,wBAAgB,0CAA0C,CACxD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,MAAM,CAoDR;AAED,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBlE;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,GACxC,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
1
+ {"version":3,"file":"external-import-rewriter.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/external-import-rewriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AASjE,wGAAwG;AACxG,eAAO,MAAM,aAAa,mVAkChB,CAAC;AAEX,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAS9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA+E5E;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAUxF;AAED,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,UAAU,EACd,aAAa,EAAE,cAAc,UAAU,EAAE,aAAa,GACrD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBxB;AAED,+FAA+F;AAC/F,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAmC7C;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAW9C;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6EjB;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqB1E;AAED,wBAAgB,0CAA0C,CACxD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,OAAO,GAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAa,GACtD,MAAM,CAgGR;AAED,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBlE;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,UAAU,EACd,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,GACxC,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -2,6 +2,7 @@ import { isCompiledBinary, serverLogger } from "../../../utils/index.js";
2
2
  import * as pathHelper from "../../../platform/compat/path/index.js";
3
3
  import { isDeno, isNode } from "../../../platform/compat/runtime.js";
4
4
  import { rewriteNpmImports } from "../../../transforms/npm-import-rewrites.js";
5
+ import { isWithinDirectory } from "../../../security/path-validation.js";
5
6
  import { resolveExportEntry, toCjsDestructureBindings } from "./loader-helpers.js";
6
7
  const logger = serverLogger.component("api");
7
8
  /** Node.js built-in module names — shared across the CJS shim, esbuild externals, and Deno rewrites. */
@@ -168,6 +169,79 @@ export async function resolveNodePackageToFileUrl(projectDir, packageName, fs, p
168
169
  return null;
169
170
  }
170
171
  }
172
+ /**
173
+ * Decide whether an installed package must be loaded as a real ES module.
174
+ *
175
+ * ESM-only packages (e.g. `"type": "module"` packages that use `import.meta` or
176
+ * top-level await) cannot be evaluated as CommonJS via the compiled-binary
177
+ * `new Function` shim. We treat a package as ESM when its package.json declares
178
+ * `"type": "module"` or its resolved entry point is a `.mjs` file.
179
+ */
180
+ function isEsmPackage(pkgJson, entry) {
181
+ if (pkgJson.type === "module")
182
+ return true;
183
+ return entry.endsWith(".mjs");
184
+ }
185
+ /**
186
+ * Resolve a package's ESM entry point, preferring the conditional `import`
187
+ * export, then the `module` field, then `main`.
188
+ */
189
+ function resolveEsmEntry(pkgJson) {
190
+ const exportsField = pkgJson.exports;
191
+ if (exportsField && typeof exportsField === "object") {
192
+ const dot = exportsField["."];
193
+ const fromExports = resolveExportEntry(dot ?? exportsField);
194
+ if (fromExports)
195
+ return fromExports;
196
+ }
197
+ else if (typeof exportsField === "string") {
198
+ return exportsField;
199
+ }
200
+ const moduleField = pkgJson.module;
201
+ if (typeof moduleField === "string")
202
+ return moduleField;
203
+ const mainField = pkgJson.main;
204
+ if (typeof mainField === "string")
205
+ return mainField;
206
+ return "index.js";
207
+ }
208
+ /**
209
+ * Identify the subset of user dependencies that are ESM-only and resolve each
210
+ * to file:// URLs so the compiled-binary loader can import them as real ES
211
+ * modules instead of transpiling them to CommonJS. CJS dependencies are omitted
212
+ * and continue to load through the `createRequire`-based shim.
213
+ */
214
+ export async function resolveEsmUserDependencies(projectDir, fs, userDeps) {
215
+ const esmDeps = new Map();
216
+ for (const name of userDeps.keys()) {
217
+ const packageDir = pathHelper.resolve(pathHelper.join(projectDir, "node_modules", name));
218
+ try {
219
+ const pkgJson = JSON.parse(await fs.readTextFile(pathHelper.join(packageDir, "package.json")));
220
+ const entry = resolveEsmEntry(pkgJson);
221
+ if (!entry || !isEsmPackage(pkgJson, entry))
222
+ continue;
223
+ // The entry path comes from the dependency's own package.json, which is
224
+ // attacker-influenceable (a malicious/compromised package could set
225
+ // "main": "../../../etc/passwd"). Reject entries that resolve outside the
226
+ // package directory so a crafted package.json cannot turn into a file://
227
+ // import that escapes node_modules. This mirrors the containment guard the
228
+ // CJS loader shim enforces via __vf_assertContained.
229
+ const entryPath = pathHelper.resolve(pathHelper.join(packageDir, entry));
230
+ if (!isWithinDirectory(packageDir, entryPath)) {
231
+ logger.warn(`Skipping ESM dependency ${name}: entry escapes package directory (${entry})`);
232
+ continue;
233
+ }
234
+ esmDeps.set(name, {
235
+ entryUrl: pathHelper.toFileUrl(entryPath).href,
236
+ packageDir,
237
+ });
238
+ }
239
+ catch (_) {
240
+ /* expected: package.json missing/invalid → treat as CJS */
241
+ }
242
+ }
243
+ return esmDeps;
244
+ }
171
245
  export async function loadVeryfrontExportsMap(projectDir, fs) {
172
246
  const vfPackagePath = pathHelper.join(projectDir, "node_modules", "veryfront");
173
247
  const vfPackageJsonPath = pathHelper.join(vfPackagePath, "package.json");
@@ -251,10 +325,39 @@ export function rewriteCompiledBinaryVeryfrontImports(code) {
251
325
  transformed = transformed.replace(/import\s*\(\s*["']veryfront\/([^"']+)["']\s*\)/g, (_match, subpath) => `import("./_vf_${subpath.replace(/\//g, "_")}.mjs")`);
252
326
  return transformed;
253
327
  }
254
- export function rewriteCompiledBinaryUserDependencyImports(code, userDeps) {
328
+ export function rewriteCompiledBinaryUserDependencyImports(code, userDeps, esmDeps = new Map()) {
255
329
  let transformed = code;
256
330
  for (const name of userDeps.keys()) {
257
331
  const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
332
+ // ESM-only dependencies are rewritten to real ES module file:// URLs so that
333
+ // import.meta, top-level await, etc. work. They must NOT be transpiled to
334
+ // CommonJS and evaluated via the `new Function` shim (see __vf_loadCjs).
335
+ const esm = esmDeps.get(name);
336
+ if (esm) {
337
+ // Resolve a subpath import to a contained file:// URL. The subpath comes
338
+ // from the handler source; reject any that escape the package directory
339
+ // (e.g. "pkg/../../secret") by leaving the import untouched so it fails to
340
+ // resolve rather than reading outside node_modules.
341
+ const subpathUrl = (subpath, original) => {
342
+ const target = pathHelper.resolve(pathHelper.join(esm.packageDir, subpath));
343
+ if (!isWithinDirectory(esm.packageDir, target)) {
344
+ logger.warn(`Skipping ESM subpath import that escapes package directory: ${original}`);
345
+ return null;
346
+ }
347
+ return pathHelper.toFileUrl(target).href;
348
+ };
349
+ transformed = transformed.replace(new RegExp(`from\\s+["']${escaped}(/[^"']+)["']`, "g"), (match, subpath) => {
350
+ const url = subpathUrl(subpath, match);
351
+ return url ? `from "${url}"` : match;
352
+ });
353
+ transformed = transformed.replace(new RegExp(`from\\s+["']${escaped}["']`, "g"), () => `from "${esm.entryUrl}"`);
354
+ transformed = transformed.replace(new RegExp(`import\\s*\\(\\s*["']${escaped}(/[^"']+)["']\\s*\\)`, "g"), (match, subpath) => {
355
+ const url = subpathUrl(subpath, match);
356
+ return url ? `import("${url}")` : match;
357
+ });
358
+ transformed = transformed.replace(new RegExp(`import\\s*\\(\\s*["']${escaped}["']\\s*\\)`, "g"), () => `import("${esm.entryUrl}")`);
359
+ continue;
360
+ }
258
361
  transformed = transformed.replace(new RegExp(`import\\s+(\\w+)\\s+from\\s+["']${escaped}["']`, "g"), (_, localName) => `const ${localName} = __vf_interopDefault(require("${name}"))`);
259
362
  transformed = transformed.replace(new RegExp(`import\\s+(\\{[^}]+\\})\\s+from\\s+["']${escaped}["']`, "g"), (_, bindings) => `const ${toCjsDestructureBindings(bindings)} = require("${name}")`);
260
363
  transformed = transformed.replace(new RegExp(`import\\s+\\*\\s+as\\s+(\\w+)\\s+from\\s+["']${escaped}["']`, "g"), (_, localName) => `const ${localName} = require("${name}")`);
@@ -324,7 +427,8 @@ export async function rewriteExternalImports(code, projectDir, fs, userDeps = ne
324
427
  // injected by the esbuild banner) to load CJS packages from node_modules,
325
428
  // since npm: specifiers only work for packages embedded at compile time.
326
429
  if (isCompiledBinary()) {
327
- transformed = rewriteCompiledBinaryUserDependencyImports(transformed, userDeps);
430
+ const esmDeps = await resolveEsmUserDependencies(projectDir, fs, userDeps);
431
+ transformed = rewriteCompiledBinaryUserDependencyImports(transformed, userDeps, esmDeps);
328
432
  }
329
433
  else {
330
434
  transformed = await rewriteDenoNpmDependencyImports(transformed, projectDir, fs, userDeps);
@@ -1,5 +1,5 @@
1
1
  import type { APIRoute, LoadModuleOptions } from "./types.js";
2
- export { generateCompiledBinaryRequireShim, getNodeExternalPackagesToResolve, loadVeryfrontExportsMap, resolveNodePackageToFileUrl, rewriteCompiledBinaryUserDependencyImports, rewriteCompiledBinaryVeryfrontImports, rewriteDenoNodeBuiltinImports, rewriteDenoNpmDependencyImports, rewriteNodeExternalImports, } from "./external-import-rewriter.js";
2
+ export { generateCompiledBinaryRequireShim, getNodeExternalPackagesToResolve, loadVeryfrontExportsMap, resolveEsmUserDependencies, resolveNodePackageToFileUrl, rewriteCompiledBinaryUserDependencyImports, rewriteCompiledBinaryVeryfrontImports, rewriteDenoNodeBuiltinImports, rewriteDenoNpmDependencyImports, rewriteNodeExternalImports, } from "./external-import-rewriter.js";
3
3
  export { toCjsDestructureBindings } from "./loader-helpers.js";
4
4
  export declare function loadHandlerModule(options: LoadModuleOptions): Promise<APIRoute | null>;
5
5
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAkB9D,OAAO,EACL,iCAAiC,EACjC,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,0CAA0C,EAC1C,qCAAqC,EACrC,6BAA6B,EAC7B,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyBtF"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAkB9D,OAAO,EACL,iCAAiC,EACjC,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,0CAA0C,EAC1C,qCAAqC,EACrC,6BAA6B,EAC7B,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyBtF"}
@@ -14,7 +14,7 @@ import { isCompiledBinary } from "../../../utils/index.js";
14
14
  import { wrapWithCurrentContext } from "../../../platform/adapters/fs/veryfront/multi-project-adapter.js";
15
15
  import { isWithinDirectory } from "../../../security/path-validation.js";
16
16
  import { generateCompiledBinaryRequireShim, NODE_BUILTINS, readProjectDependencies, rewriteExternalImports, } from "./external-import-rewriter.js";
17
- export { generateCompiledBinaryRequireShim, getNodeExternalPackagesToResolve, loadVeryfrontExportsMap, resolveNodePackageToFileUrl, rewriteCompiledBinaryUserDependencyImports, rewriteCompiledBinaryVeryfrontImports, rewriteDenoNodeBuiltinImports, rewriteDenoNpmDependencyImports, rewriteNodeExternalImports, } from "./external-import-rewriter.js";
17
+ export { generateCompiledBinaryRequireShim, getNodeExternalPackagesToResolve, loadVeryfrontExportsMap, resolveEsmUserDependencies, resolveNodePackageToFileUrl, rewriteCompiledBinaryUserDependencyImports, rewriteCompiledBinaryVeryfrontImports, rewriteDenoNodeBuiltinImports, rewriteDenoNpmDependencyImports, rewriteNodeExternalImports, } from "./external-import-rewriter.js";
18
18
  const logger = serverLogger.component("api");
19
19
  export { toCjsDestructureBindings } from "./loader-helpers.js";
20
20
  export function loadHandlerModule(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"hmr.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/hmr.handler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EAEpB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAuBrB,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgD;IAC1E,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAA6B;IAC7D,OAAO,CAAC,MAAM,CAAC,4BAA4B,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC,QAAQ,EAAE,eAAe,CAKvB;IAEF,OAAO,CAAC,MAAM,CAAC,UAAU;IAsCnB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAuIvE;;;;;OAKG;YACW,wBAAwB;IAuCtC,MAAM,CAAC,cAAc,IAAI,MAAM;IAI/B,MAAM,CAAC,UAAU,IAAI;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAID,MAAM,CAAC,+BAA+B,IAAI,MAAM,IAAI;IAWpD,MAAM,CAAC,QAAQ,IAAI,IAAI;CAaxB"}
1
+ {"version":3,"file":"hmr.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/preview/hmr.handler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EAEpB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAuBrB,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,qBAAa,UAAW,SAAQ,WAAW;IACzC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAgD;IAC1E,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAA6B;IAC7D,OAAO,CAAC,MAAM,CAAC,4BAA4B,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC,QAAQ,EAAE,eAAe,CAKvB;IAEF,OAAO,CAAC,MAAM,CAAC,UAAU;IAsCnB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IA4IvE;;;;;OAKG;YACW,wBAAwB;IAuCtC,MAAM,CAAC,cAAc,IAAI,MAAM;IAI/B,MAAM,CAAC,UAAU,IAAI;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;KAC3B;IAID,MAAM,CAAC,+BAA+B,IAAI,MAAM,IAAI;IAWpD,MAAM,CAAC,QAAQ,IAAI,IAAI;CAaxB"}
@@ -1,6 +1,7 @@
1
1
  import * as dntShim from "../../../../_dnt.shims.js";
2
2
  import { HMR_MAX_MESSAGES_PER_MINUTE, serverLogger } from "../../../utils/index.js";
3
3
  import { RateLimiter } from "../../../modules/server/index.js";
4
+ import { VeryfrontError } from "../../../errors/index.js";
4
5
  import { BaseHandler } from "../response/base.js";
5
6
  import { HandlerPriority, } from "../types.js";
6
7
  import { ReloadNotifier } from "../../reload-notifier.js";
@@ -173,6 +174,10 @@ export class HMRHandler extends BaseHandler {
173
174
  return this.respond(response);
174
175
  }
175
176
  catch (error) {
177
+ if (error instanceof VeryfrontError && error.status === 501) {
178
+ logger.warn("WebSocket upgrade not supported by runtime", { error });
179
+ return this.respond(new Response("WebSocket not supported", { status: 501 }));
180
+ }
176
181
  logger.error("WebSocket upgrade failed", { error });
177
182
  return this.respond(new Response("WebSocket upgrade failed", { status: 500 }));
178
183
  }
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.626";
2
+ export declare const VERSION = "0.1.628";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.626";
4
+ export const VERSION = "0.1.628";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.626",
3
+ "version": "0.1.628",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",