@adep/web-container 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // src/path.ts
11
+ // packages/web-container/src/path.ts
12
12
  var path_exports = {};
13
13
  __export(path_exports, {
14
14
  SEP: () => SEP,
@@ -73,13 +73,13 @@ function isValidSegment(name) {
73
73
  }
74
74
  var SEP;
75
75
  var init_path = __esm({
76
- "src/path.ts"() {
76
+ "packages/web-container/src/path.ts"() {
77
77
  "use strict";
78
78
  SEP = "/";
79
79
  }
80
80
  });
81
81
 
82
- // src/node-resolve.ts
82
+ // packages/web-container/src/node-resolve.ts
83
83
  function parsePackageMeta(content, context) {
84
84
  let parsed;
85
85
  try {
@@ -105,6 +105,27 @@ function withinPackage(pkgDirAbs, rel, context) {
105
105
  }
106
106
  return abs;
107
107
  }
108
+ function pickConditionTarget(conditions, order, resolveRel, context) {
109
+ for (const key of order) {
110
+ const value = conditions[key];
111
+ if (value === void 0 || value === null) continue;
112
+ if (typeof value === "string") return resolveRel(value);
113
+ if (typeof value === "object" && !Array.isArray(value)) {
114
+ const nested = pickConditionTarget(
115
+ value,
116
+ order,
117
+ resolveRel,
118
+ context
119
+ );
120
+ if (nested !== null) return nested;
121
+ continue;
122
+ }
123
+ throw new ResolveError(
124
+ `${context}\uFF1Aexports["."]["${key}"] \u5F62\u6001\u4E0D\u652F\u6301\uFF08\u4EC5\u63A5\u53D7\u5B57\u7B26\u4E32 / null / \u6761\u4EF6\u5BF9\u8C61\uFF09`
125
+ );
126
+ }
127
+ return null;
128
+ }
108
129
  function resolvePackageEntry(meta, pkgDirAbs, condition) {
109
130
  const context = `\u5305 ${meta.name ?? meta.version ?? pkgDirAbs} \u7684 exports/main \u58F0\u660E`;
110
131
  const exp = meta.exports;
@@ -125,20 +146,11 @@ function resolvePackageEntry(meta, pkgDirAbs, condition) {
125
146
  if (typeof dot !== "object" || Array.isArray(dot)) {
126
147
  throw new ResolveError(`${context}\uFF1Aexports["."] \u5F62\u6001\u4E0D\u652F\u6301\uFF08\u4EC5\u63A5\u53D7\u5B57\u7B26\u4E32\u6216\u6761\u4EF6\u5BF9\u8C61\uFF09`);
127
148
  }
128
- const conditions = dot;
129
- const order = condition === "import" ? ["import", "node", "default"] : ["require", "node", "default"];
130
- for (const key of order) {
131
- const value = conditions[key];
132
- if (typeof value === "string") return withinPackage(pkgDirAbs, value, context);
133
- if (value !== void 0 && (typeof value !== "object" || value === null)) {
134
- throw new ResolveError(
135
- `${context}\uFF1Aexports["."]["${key}"] \u5F62\u6001\u4E0D\u652F\u6301\uFF08\u4EC5\u63A5\u53D7\u5B57\u7B26\u4E32\u6216 null\uFF09`
136
- );
137
- }
138
- }
139
- throw new ResolveError(
140
- `${context}\uFF1Aexports["."] \u6761\u4EF6\u5BF9\u8C61\u91CC\u6CA1\u6709 ${condition}/node/default \u5B57\u7B26\u4E32\u5165\u53E3\uFF08\u5B50\u8DEF\u5F84/\u5D4C\u5957\u6761\u4EF6\u4E0D\u652F\u6301\uFF09`
141
- );
149
+ const order = condition === "import" ? IMPORT_CONDITION_ORDER : REQUIRE_CONDITION_ORDER;
150
+ const resolveRel = (rel) => withinPackage(pkgDirAbs, rel, context);
151
+ const hit = pickConditionTarget(dot, order, resolveRel, context);
152
+ if (hit !== null) return hit;
153
+ throw new ResolveError(`${context}\uFF1Aexports["."] \u6761\u4EF6\u5BF9\u8C61\u91CC\u6CA1\u6709 ${order.join("/")} \u5165\u53E3`);
142
154
  }
143
155
  if (meta.main !== void 0) {
144
156
  if (typeof meta.main !== "string") {
@@ -236,11 +248,13 @@ function resolveImport(fs, specifier, fromFileAbs, condition = "require") {
236
248
  `\u627E\u4E0D\u5230\u5305 "${specifier}"\uFF1A${dirname(fromFileAbs)} \u53CA\u5176\u5404\u7EA7\u7236\u76EE\u5F55\u4E0B\u90FD\u6CA1\u6709 node_modules/${name}\uFF08\u5148\u5728\u7EC8\u7AEF npm install ${name}\uFF09`
237
249
  );
238
250
  }
239
- var RESOLVE_EXTENSIONS, ResolveError;
251
+ var IMPORT_CONDITION_ORDER, REQUIRE_CONDITION_ORDER, RESOLVE_EXTENSIONS, ResolveError;
240
252
  var init_node_resolve = __esm({
241
- "src/node-resolve.ts"() {
253
+ "packages/web-container/src/node-resolve.ts"() {
242
254
  "use strict";
243
255
  init_path();
256
+ IMPORT_CONDITION_ORDER = ["browser", "import", "module", "default"];
257
+ REQUIRE_CONDITION_ORDER = ["require", "node", "default"];
244
258
  RESOLVE_EXTENSIONS = [".js", ".mjs", ".cjs", ".json"];
245
259
  ResolveError = class extends Error {
246
260
  constructor(message) {
@@ -251,7 +265,7 @@ var init_node_resolve = __esm({
251
265
  }
252
266
  });
253
267
 
254
- // src/strip-types.ts
268
+ // packages/web-container/src/strip-types.ts
255
269
  function isAnnotationLeader(token) {
256
270
  return ANNOTATION_LEADERS.has(token) || TS_MODIFIERS.has(token);
257
271
  }
@@ -260,7 +274,7 @@ function stripTypes(source) {
260
274
  }
261
275
  var UnsupportedTsSyntaxError, IDENT_START, IDENT_PART, DECL_KEYWORDS, TS_MODIFIERS, ANNOTATION_LEADERS, Eraser;
262
276
  var init_strip_types = __esm({
263
- "src/strip-types.ts"() {
277
+ "packages/web-container/src/strip-types.ts"() {
264
278
  "use strict";
265
279
  UnsupportedTsSyntaxError = class extends Error {
266
280
  constructor(construct, line) {
@@ -515,6 +529,7 @@ var init_strip_types = __esm({
515
529
  return;
516
530
  case "as":
517
531
  case "satisfies": {
532
+ if (this.frames[this.frames.length - 1]?.specifierList === true) return;
518
533
  if (this.tokenAt(2) === "*" || this.tokenAt(2) === "type") return;
519
534
  const nextChar = this.skipWhitespaceFrom(this.i);
520
535
  if (nextChar === null || "=,:]})".includes(this.src[nextChar])) return;
@@ -567,7 +582,8 @@ var init_strip_types = __esm({
567
582
  const frame = {
568
583
  kind: c === "(" ? "paren" : c === "{" ? "brace" : "bracket",
569
584
  declare: false,
570
- classBody: false
585
+ classBody: false,
586
+ specifierList: c === "{" && this.isImportSpecifierBrace()
571
587
  };
572
588
  if (c === "{" && this.pendingClassBody) {
573
589
  frame.classBody = true;
@@ -653,6 +669,15 @@ var init_strip_types = __esm({
653
669
  this.i = end;
654
670
  return true;
655
671
  }
672
+ /**
673
+ * `{` 是 import / export 的说明符列表吗——`{ a as b }` 覆盖 `import { … }`、
674
+ * `export { … }` 与 `import def, { … }` 三种写法(后者说明符花括号的前驱 token 是 `,`)。
675
+ */
676
+ isImportSpecifierBrace() {
677
+ const back1 = this.tokenAt(1);
678
+ if (back1 === "import" || back1 === "export") return true;
679
+ return back1 === "," && this.tokenAt(3) === "import";
680
+ }
656
681
  /**
657
682
  * `(` 是否为参数列表(声明位):`function f(`、类体里的方法 `m(`、箭头 `=> (`,
658
683
  * 以及出现在 `(` `,` `=` `>` `:` `[` `{` `}` `;` 之后(如 `map((v: T) => v)` 的内层括号)。
@@ -664,6 +689,7 @@ var init_strip_types = __esm({
664
689
  if (this.afterFunctionKeyword) return true;
665
690
  if (this.tokenAt(2) === "function" && IDENT_START.test(this.tokenAt(1))) return true;
666
691
  if (this.afterArrow) return true;
692
+ if (this.tokenAt(1) === "return") return true;
667
693
  if (this.inClassBody() && IDENT_PART.test(this.prevSignificantChar(at - 1))) return true;
668
694
  const prev = this.prevSignificantChar(at - 1);
669
695
  return prev === "" || "(,=>:[{};".includes(prev);
@@ -866,7 +892,7 @@ var init_strip_types = __esm({
866
892
  }
867
893
  });
868
894
 
869
- // src/preview-server.ts
895
+ // packages/web-container/src/preview-server.ts
870
896
  var preview_server_exports = {};
871
897
  __export(preview_server_exports, {
872
898
  buildPreviewDocument: () => buildPreviewDocument,
@@ -965,14 +991,14 @@ function createPreviewServer(vfs, options = {}) {
965
991
  }
966
992
  var EXTERNAL_SRC;
967
993
  var init_preview_server = __esm({
968
- "src/preview-server.ts"() {
994
+ "packages/web-container/src/preview-server.ts"() {
969
995
  "use strict";
970
996
  init_path();
971
997
  EXTERNAL_SRC = /(?:^https?:)?\/\//i;
972
998
  }
973
999
  });
974
1000
 
975
- // src/function-fetch-proxy.ts
1001
+ // packages/web-container/src/function-fetch-proxy.ts
976
1002
  function parseBodyByContentType(rawBody, headers) {
977
1003
  if (rawBody === null) return void 0;
978
1004
  const contentType = headers["content-type"] ?? headers["Content-Type"] ?? headers["CONTENT-TYPE"] ?? "";
@@ -1098,7 +1124,7 @@ function createFunctionFetchHandler(options) {
1098
1124
  }
1099
1125
  var FN_FETCH_INTERCEPTOR_SCRIPT;
1100
1126
  var init_function_fetch_proxy = __esm({
1101
- "src/function-fetch-proxy.ts"() {
1127
+ "packages/web-container/src/function-fetch-proxy.ts"() {
1102
1128
  "use strict";
1103
1129
  FN_FETCH_INTERCEPTOR_SCRIPT = (function() {
1104
1130
  var src = [
@@ -1172,7 +1198,10 @@ var init_function_fetch_proxy = __esm({
1172
1198
  " }",
1173
1199
  " var u;",
1174
1200
  " try { u = new URL(urlStr, document.baseURI); }",
1175
- " catch (e) { return ORIGINAL_FETCH(input, init); }",
1201
+ " catch (e0) {",
1202
+ " try { u = new URL(urlStr, window.location.origin); }",
1203
+ " catch (e1) { return ORIGINAL_FETCH(input, init); }",
1204
+ " }",
1176
1205
  ' if (u.pathname.indexOf("/api/") !== 0 && u.pathname !== "/api") {',
1177
1206
  " return ORIGINAL_FETCH(input, init);",
1178
1207
  " }",
@@ -1198,7 +1227,7 @@ var init_function_fetch_proxy = __esm({
1198
1227
  }
1199
1228
  });
1200
1229
 
1201
- // src/vite-dev.ts
1230
+ // packages/web-container/src/vite-dev.ts
1202
1231
  var vite_dev_exports = {};
1203
1232
  __export(vite_dev_exports, {
1204
1233
  ViteDevError: () => ViteDevError,
@@ -1311,6 +1340,18 @@ function cssModule(css) {
1311
1340
  "export default css;"
1312
1341
  ].join("\n");
1313
1342
  }
1343
+ function inlineStyleBlock(css, key) {
1344
+ return [
1345
+ "{",
1346
+ `const css = ${JSON.stringify(css)};`,
1347
+ 'const el = document.createElement("style");',
1348
+ 'el.setAttribute("data-adep-vite", "");',
1349
+ `el.setAttribute("data-adep-style", ${JSON.stringify(key)});`,
1350
+ "el.textContent = css;",
1351
+ "document.head.appendChild(el);",
1352
+ "}"
1353
+ ].join("\n");
1354
+ }
1314
1355
  function jsonModule(source, abs) {
1315
1356
  try {
1316
1357
  JSON.parse(source);
@@ -1361,6 +1402,17 @@ function createViteServer(vfs, options = {}) {
1361
1402
  } catch {
1362
1403
  }
1363
1404
  };
1405
+ const DEFINES = [
1406
+ [/\bprocess\s*\.\s*env\s*\.\s*NODE_ENV\b/g, JSON.stringify("development")],
1407
+ [/\b__VUE_OPTIONS_API__\b/g, "true"],
1408
+ [/\b__VUE_PROD_DEVTOOLS__\b/g, "false"],
1409
+ [/\b__VUE_PROD_HYDRATION_MISMATCH_DETAILS__\b/g, "false"]
1410
+ ];
1411
+ function applyDefines(code) {
1412
+ let out = code;
1413
+ for (const [pattern, value] of DEFINES) out = out.replace(pattern, value);
1414
+ return out;
1415
+ }
1364
1416
  function transformModule2(abs, source) {
1365
1417
  if (abs.endsWith(".css")) return cssModule(source);
1366
1418
  if (abs.endsWith(".json")) return jsonModule(source, abs);
@@ -1371,21 +1423,27 @@ function createViteServer(vfs, options = {}) {
1371
1423
  `${abs} \u662F Vue SFC\uFF0C\u4F46\u5F53\u524D\u73AF\u5883\u672A\u88C5\u914D SFC \u7F16\u8BD1\u5668\uFF08IDE \u4FA7\u9700\u6CE8\u5165 vue/compiler-sfc\uFF09`
1372
1424
  );
1373
1425
  const compiled = sfcCompiler(source, abs);
1374
- return [...compiled.styles.map((css) => cssModule(css)), compiled.script].join("\n");
1426
+ return [
1427
+ ...compiled.styles.map((css, index) => inlineStyleBlock(css, `${abs}#${index}`)),
1428
+ applyDefines(stripTypes(compiled.script))
1429
+ ].join("\n");
1375
1430
  }
1376
1431
  if (abs.endsWith(".tsx") || abs.endsWith(".jsx"))
1377
1432
  throw new ViteDevError(
1378
1433
  "JSX_UNSUPPORTED",
1379
1434
  `${abs} \u4F7F\u7528 JSX\uFF1A\u6D4F\u89C8\u5668\u5185 vite \u53EA\u64E6\u9664 TS \u7C7B\u578B\u6807\u6CE8\uFF0C\u4E0D\u8F6C\u8BD1 JSX\uFF08\u8BF7\u7528 h() \u6E32\u67D3\u51FD\u6570\u6216 .vue SFC\uFF09`
1380
1435
  );
1381
- if (abs.endsWith(".ts") || abs.endsWith(".mts")) return stripTypes(source);
1382
- return source;
1436
+ if (abs.endsWith(".ts") || abs.endsWith(".mts")) return applyDefines(stripTypes(source));
1437
+ return applyDefines(source);
1438
+ }
1439
+ function absoluteFromRoot(spec) {
1440
+ return join(root, spec.replace(/^\/+/, ""));
1383
1441
  }
1384
1442
  async function resolveSpecifier(spec, importerAbs) {
1385
1443
  if (EXTERNAL_SPECIFIER.test(spec) || DATA_OR_BLOB.test(spec)) return spec;
1386
1444
  let target;
1387
1445
  if (spec.startsWith("./") || spec.startsWith("../") || spec.startsWith("/")) {
1388
- const base = spec.startsWith("/") ? spec : join(dirname(importerAbs), spec);
1446
+ const base = spec.startsWith("/") ? absoluteFromRoot(spec) : join(dirname(importerAbs), spec);
1389
1447
  target = resolveWithSuffixes(vfs, base);
1390
1448
  if (!vfs.exists(target) || vfs.isDirectory(target))
1391
1449
  throw new ViteDevError(
@@ -1474,7 +1532,7 @@ function createViteServer(vfs, options = {}) {
1474
1532
  html = html.replace(
1475
1533
  MODULE_SCRIPT_SRC_RE,
1476
1534
  (_whole, pre, _q1, mid, _q2, src, post) => {
1477
- const base = src.startsWith("/") ? normalize(src) : join(dirname(entryAbs), src);
1535
+ const base = src.startsWith("/") ? absoluteFromRoot(src) : join(dirname(entryAbs), src);
1478
1536
  const abs = resolveWithSuffixes(vfs, base);
1479
1537
  if (!vfs.exists(abs) || vfs.isDirectory(abs))
1480
1538
  throw new ViteDevError(
@@ -1482,7 +1540,7 @@ function createViteServer(vfs, options = {}) {
1482
1540
  `\u5165\u53E3 module script \u627E\u4E0D\u5230 "${src}"\uFF08root: ${root}\uFF1B\u8BD5\u8FC7\u6269\u5C55\u540D ${VITE_RESOLVE_SUFFIXES.join("/")} \u4E0E\u76EE\u5F55 index\uFF09`
1483
1541
  );
1484
1542
  entryModuleUrls.push(loadModuleUrl(abs));
1485
- return `<script${pre}${mid}src="__adep_vite_entry_${entryModuleUrls.length - 1}__"${post}></script>`;
1543
+ return `<script${pre}${mid}src="__adep_vite_entry_${entryModuleUrls.length - 1}__"${post} type="module"></script>`;
1486
1544
  }
1487
1545
  );
1488
1546
  html = html.replace(
@@ -1492,7 +1550,7 @@ function createViteServer(vfs, options = {}) {
1492
1550
  const abs = `${INLINE_PREFIX}${inlineSeq++}.mjs`;
1493
1551
  inlineSources.set(abs, body);
1494
1552
  entryModuleUrls.push(loadModuleUrl(abs));
1495
- return `<script${pre}${post}src="__adep_vite_entry_${entryModuleUrls.length - 1}__"></script>`;
1553
+ return `<script${pre}${post}src="__adep_vite_entry_${entryModuleUrls.length - 1}__" type="module"></script>`;
1496
1554
  }
1497
1555
  );
1498
1556
  const urls = await Promise.all(entryModuleUrls);
@@ -1551,7 +1609,7 @@ function createViteServer(vfs, options = {}) {
1551
1609
  }
1552
1610
  var ViteDevError, REGEX_PRECEDING_CHARS, REGEX_PRECEDING_KEYWORDS, isIdentStart, isIdentPart, VITE_RESOLVE_SUFFIXES, INLINE_PREFIX, EXTERNAL_SPECIFIER, DATA_OR_BLOB, MODULE_SCRIPT_SRC_RE, MODULE_SCRIPT_INLINE_RE;
1553
1611
  var init_vite_dev = __esm({
1554
- "src/vite-dev.ts"() {
1612
+ "packages/web-container/src/vite-dev.ts"() {
1555
1613
  "use strict";
1556
1614
  init_path();
1557
1615
  init_node_resolve();
@@ -1615,7 +1673,7 @@ var init_vite_dev = __esm({
1615
1673
  }
1616
1674
  });
1617
1675
 
1618
- // src/vfs.ts
1676
+ // packages/web-container/src/vfs.ts
1619
1677
  init_path();
1620
1678
  var ensureAbs = (path) => path.startsWith("/") ? normalize(path) : `/${normalize(path).replace(/^\/+/, "")}`;
1621
1679
  var ROOT = "/";
@@ -1825,13 +1883,13 @@ var VirtualFileSystem = class {
1825
1883
  }
1826
1884
  };
1827
1885
 
1828
- // src/container.ts
1886
+ // packages/web-container/src/container.ts
1829
1887
  init_path();
1830
1888
 
1831
- // src/shell.ts
1889
+ // packages/web-container/src/shell.ts
1832
1890
  init_path();
1833
1891
 
1834
- // src/completion.ts
1892
+ // packages/web-container/src/completion.ts
1835
1893
  init_path();
1836
1894
  var SHELL_COMMANDS = [
1837
1895
  "pwd",
@@ -1943,7 +2001,7 @@ function helpText() {
1943
2001
  `;
1944
2002
  }
1945
2003
 
1946
- // src/shell.ts
2004
+ // packages/web-container/src/shell.ts
1947
2005
  function tokenize(line) {
1948
2006
  const tokens = [];
1949
2007
  let current = "";
@@ -2576,7 +2634,7 @@ function wgetFileName(url) {
2576
2634
  }
2577
2635
  }
2578
2636
 
2579
- // src/tar.ts
2637
+ // packages/web-container/src/tar.ts
2580
2638
  var BLOCK = 512;
2581
2639
  var GZIP_MAGIC_0 = 31;
2582
2640
  var GZIP_MAGIC_1 = 139;
@@ -2663,7 +2721,7 @@ async function unpackNpmTarball(bytes) {
2663
2721
  return out;
2664
2722
  }
2665
2723
 
2666
- // src/npm-client.ts
2724
+ // packages/web-container/src/npm-client.ts
2667
2725
  init_node_resolve();
2668
2726
  var DEFAULT_MAX_INSTALL_DEPTH = 5;
2669
2727
  var defaultFetch = (url, init) => globalThis.fetch(url, init).then((res) => res);
@@ -2815,7 +2873,7 @@ function createNpmClient(options) {
2815
2873
  };
2816
2874
  }
2817
2875
 
2818
- // src/relay-fetch.ts
2876
+ // packages/web-container/src/relay-fetch.ts
2819
2877
  var defaultFetch2 = (url, init) => globalThis.fetch(url, init).then((res) => res);
2820
2878
  function createRelayFetch(options) {
2821
2879
  const fetchImpl = options.fetchImpl ?? defaultFetch2;
@@ -2865,7 +2923,7 @@ function createRelayFetch(options) {
2865
2923
  };
2866
2924
  }
2867
2925
 
2868
- // src/module-loader.ts
2926
+ // packages/web-container/src/module-loader.ts
2869
2927
  init_node_resolve();
2870
2928
  function interopDefault(value) {
2871
2929
  if (value !== null && typeof value === "object" && "__esModule" in value) {
@@ -2974,7 +3032,7 @@ function composeRequire(vfs, entryFileAbs, cache) {
2974
3032
  };
2975
3033
  }
2976
3034
 
2977
- // src/worker-runtime.ts
3035
+ // packages/web-container/src/worker-runtime.ts
2978
3036
  async function evaluateSource(source, filename, args, extraGlobals) {
2979
3037
  const output = [];
2980
3038
  const fakeConsole = {
@@ -3072,10 +3130,10 @@ function createWorkerRuntime(vfs, options = {}) {
3072
3130
  };
3073
3131
  }
3074
3132
 
3075
- // src/test-runner.ts
3133
+ // packages/web-container/src/test-runner.ts
3076
3134
  init_strip_types();
3077
3135
 
3078
- // src/test-framework.ts
3136
+ // packages/web-container/src/test-framework.ts
3079
3137
  var TestAssertionError = class extends Error {
3080
3138
  constructor(message, expected, received) {
3081
3139
  super(message);
@@ -3338,7 +3396,7 @@ function stringify(value, seen) {
3338
3396
  return `{ ${entries.join(", ")} }`;
3339
3397
  }
3340
3398
 
3341
- // src/test-runner.ts
3399
+ // packages/web-container/src/test-runner.ts
3342
3400
  var TEST_FILE_PATTERN = /\.(?:test|spec)\.[cm]?[jt]s$/;
3343
3401
  var IGNORED_SEGMENTS = /* @__PURE__ */ new Set(["node_modules", ".git", ".adep"]);
3344
3402
  function createTestRunner(options) {
@@ -3507,7 +3565,7 @@ function exampleTestSource(name = "example") {
3507
3565
  ].join("\n");
3508
3566
  }
3509
3567
 
3510
- // src/container.ts
3568
+ // packages/web-container/src/container.ts
3511
3569
  function viteBanner(server, fresh) {
3512
3570
  return [
3513
3571
  fresh ? ` VITE \u6D4F\u89C8\u5668\u5185 dev server \u5DF2\u5C31\u7EEA\uFF08root: ${server.root}\uFF09
@@ -3713,12 +3771,12 @@ function bootstrap(options) {
3713
3771
  };
3714
3772
  }
3715
3773
 
3716
- // src/index.ts
3774
+ // packages/web-container/src/index.ts
3717
3775
  init_node_resolve();
3718
3776
  init_vite_dev();
3719
3777
  init_path();
3720
3778
 
3721
- // src/persistence.ts
3779
+ // packages/web-container/src/persistence.ts
3722
3780
  function cloneEntries(entries) {
3723
3781
  return entries.map(
3724
3782
  (entry) => entry.kind === "file" ? { path: entry.path, kind: "file", contents: entry.contents ?? "" } : { path: entry.path, kind: "dir" }
@@ -3931,10 +3989,10 @@ function createCommandHistory(options) {
3931
3989
  };
3932
3990
  }
3933
3991
 
3934
- // src/index.ts
3992
+ // packages/web-container/src/index.ts
3935
3993
  init_strip_types();
3936
3994
 
3937
- // src/offline/net.ts
3995
+ // packages/web-container/src/offline/net.ts
3938
3996
  var HEALTH_CHECK_INTERVAL_MS = 3e4;
3939
3997
  var HEALTH_CHECK_TIMEOUT_MS = 5e3;
3940
3998
  var HEALTH_ENDPOINT = "/api/v1/health";
@@ -4054,7 +4112,7 @@ function onNetworkChange(listener) {
4054
4112
  return networkMonitor.subscribe(listener);
4055
4113
  }
4056
4114
 
4057
- // src/offline/queue.ts
4115
+ // packages/web-container/src/offline/queue.ts
4058
4116
  var STORAGE_KEY = "adep:offline:publish-queue";
4059
4117
  function simpleHash(input) {
4060
4118
  let hash = 0;
@@ -4195,7 +4253,7 @@ var PublishQueue = class {
4195
4253
  };
4196
4254
  var publishQueue = new PublishQueue();
4197
4255
 
4198
- // src/offline/workspace.ts
4256
+ // packages/web-container/src/offline/workspace.ts
4199
4257
  var DB_NAME = "adep-offline-workspace";
4200
4258
  function requestError(request) {
4201
4259
  return request.error ?? new Error("IndexedDB operation failed");
@@ -4387,7 +4445,7 @@ var OfflineWorkspace = class {
4387
4445
  };
4388
4446
  var offlineWorkspace = new OfflineWorkspace();
4389
4447
 
4390
- // src/sim/kv.ts
4448
+ // packages/web-container/src/sim/kv.ts
4391
4449
  function createMemorySimKv() {
4392
4450
  const map = /* @__PURE__ */ new Map();
4393
4451
  return {
@@ -4453,12 +4511,14 @@ function pickDefaultSimKv() {
4453
4511
  return typeof indexedDB !== "undefined" ? createIdbSimKv() : createMemorySimKv();
4454
4512
  }
4455
4513
 
4456
- // ../runtime/src/shared/capability-keys.ts
4514
+ // packages/runtime/src/shared/capability-keys.ts
4457
4515
  var RPC_CAPABILITY_KEY = "__adepRpc";
4458
4516
  var CHAIN_CAPABILITY_KEY = "__adepChain";
4459
4517
  var DB_RPC = {
4460
4518
  /** 直通方法(如 query):`(method=query, args=[sql, params])`。 */
4461
4519
  query: "query",
4520
+ /** 写路径(CF-013):`(method=writeQuery, args=[sql, params])` → `{ changes }`。 */
4521
+ writeQuery: "writeQuery",
4462
4522
  /** 读取 owned 表变更流(DB-006):`(method=changes, args=[table, query])`。 */
4463
4523
  changes: "changes",
4464
4524
  /** 开启事务:`begin → txId`。 */
@@ -4485,7 +4545,7 @@ var REALTIME_CAPABILITY_METHODS = [
4485
4545
  "unsubscribe"
4486
4546
  ];
4487
4547
 
4488
- // ../runtime/src/database/builder/dialect.ts
4548
+ // packages/runtime/src/database/builder/dialect.ts
4489
4549
  var sqliteDialect = {
4490
4550
  name: "sqlite",
4491
4551
  placeholder: () => "?",
@@ -4504,7 +4564,7 @@ function dialectFor(driver) {
4504
4564
  return driver.engine === "pg" ? postgresDialect : sqliteDialect;
4505
4565
  }
4506
4566
 
4507
- // ../runtime/src/database/provision/identifier.ts
4567
+ // packages/runtime/src/database/provision/identifier.ts
4508
4568
  var DbError = class extends Error {
4509
4569
  constructor(status, code, message) {
4510
4570
  super(message);
@@ -4528,31 +4588,45 @@ function quoteIdentifier(name) {
4528
4588
  return `"${name.replace(/"/g, '""')}"`;
4529
4589
  }
4530
4590
 
4531
- // ../runtime/src/database/builder/guards.ts
4591
+ // packages/runtime/src/database/builder/guards.ts
4532
4592
  function unsafeOperation(message) {
4533
4593
  return new DbError(400, "DB_UNSAFE_OP", message);
4534
4594
  }
4535
4595
  function stripLiterals(sql) {
4536
4596
  return sql.replace(/'[^']*(?:''[^']*)*'/g, "").replace(/"[^"]*(?:""[^"]*)*"/g, "").replace(/--[^\n]*/g, "").replace(/\/\*[\s\S]*?\*\//g, "");
4537
4597
  }
4538
- function assertReadOnlyQuery(sql) {
4598
+ function sqlHead(sql) {
4599
+ return sql.trim().replace(/^\(+/, "").trim().toUpperCase();
4600
+ }
4601
+ function assertSafeStatement(sql) {
4539
4602
  const stripped = stripLiterals(sql);
4540
4603
  if (stripped.includes(";")) {
4541
4604
  throw unsafeOperation("\u4EC5\u5141\u8BB8\u5355\u6761\u8BED\u53E5\uFF0C\u7981\u6B62\u591A\u8BED\u53E5\u5806\u53E0");
4542
4605
  }
4543
- const head = stripped.trim().replace(/^\(+/, "").trim().toUpperCase();
4544
- if (!head.startsWith("SELECT") && !head.startsWith("WITH")) {
4545
- throw unsafeOperation("cloud.db.query \u4EC5\u5141\u8BB8\u53EA\u8BFB\u67E5\u8BE2\uFF08SELECT / WITH\uFF09");
4546
- }
4547
4606
  if (/ATTACH|DETACH/.test(stripped.toUpperCase())) {
4548
4607
  throw unsafeOperation("\u7981\u6B62\u8DE8\u5E93\u64CD\u4F5C\uFF08ATTACH / DETACH\uFF09");
4549
4608
  }
4550
4609
  if (/SQLITE_\w+/i.test(stripped)) {
4551
4610
  throw unsafeOperation("\u7981\u6B62\u8BBF\u95EE\u7CFB\u7EDF\u8868\uFF08sqlite_*\uFF09");
4552
4611
  }
4612
+ return sqlHead(stripped);
4613
+ }
4614
+ function assertReadOnlyQuery(sql) {
4615
+ const head = assertSafeStatement(sql);
4616
+ if (!head.startsWith("SELECT") && !head.startsWith("WITH")) {
4617
+ throw unsafeOperation("cloud.db.query \u4EC5\u5141\u8BB8\u53EA\u8BFB\u67E5\u8BE2\uFF08SELECT / WITH\uFF09");
4618
+ }
4619
+ }
4620
+ function assertWriteQuery(sql) {
4621
+ const head = assertSafeStatement(sql);
4622
+ if (!head.startsWith("INSERT") && !head.startsWith("UPDATE") && !head.startsWith("DELETE")) {
4623
+ throw unsafeOperation(
4624
+ "cloud.db.writeQuery \u4EC5\u5141\u8BB8 DML\uFF08INSERT / UPDATE / DELETE\uFF09\uFF0CDDL \u8BF7\u8D70\u63A7\u5236\u53F0"
4625
+ );
4626
+ }
4553
4627
  }
4554
4628
 
4555
- // ../runtime/src/database/builder/owned.ts
4629
+ // packages/runtime/src/database/builder/owned.ts
4556
4630
  var OWNED_PK = "id";
4557
4631
  var OWNED_OWNER_KEY = "__owner_key";
4558
4632
  var CHANGE_LOG_PREFIX = "_adep_changes_";
@@ -4665,7 +4739,7 @@ async function readChanges(driver, table, query = {}) {
4665
4739
  return rows.map(parseChange);
4666
4740
  }
4667
4741
 
4668
- // ../runtime/src/database/builder/ulid.ts
4742
+ // packages/runtime/src/database/builder/ulid.ts
4669
4743
  var ENCODING = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
4670
4744
  var TIME_LEN = 10;
4671
4745
  var RANDOM_LEN = 16;
@@ -4731,7 +4805,7 @@ function ulid(now = Date.now()) {
4731
4805
  return time + random;
4732
4806
  }
4733
4807
 
4734
- // ../runtime/src/database/builder/table.ts
4808
+ // packages/runtime/src/database/builder/table.ts
4735
4809
  var OPERATORS = /* @__PURE__ */ new Set([
4736
4810
  "=",
4737
4811
  "!=",
@@ -5050,7 +5124,7 @@ function createTableBuilder(table, driver, dialect, options = {}) {
5050
5124
  return build(initialState);
5051
5125
  }
5052
5126
 
5053
- // ../runtime/src/database/builder/index.ts
5127
+ // packages/runtime/src/database/builder/index.ts
5054
5128
  var TX_STATES = /* @__PURE__ */ new WeakMap();
5055
5129
  function createCloudDb(driver, options = {}) {
5056
5130
  const dialect = options.dialect ?? dialectFor(driver);
@@ -5095,6 +5169,14 @@ function createCloudDb(driver, options = {}) {
5095
5169
  assertReadOnlyQuery(sql);
5096
5170
  return driver.all(sql, params);
5097
5171
  },
5172
+ async writeQuery(sql, params) {
5173
+ if (!Array.isArray(params)) {
5174
+ throw unsafeOperation("writeQuery \u7684 params \u5FC5\u987B\u63D0\u4F9B\uFF08\u65E0\u53C2\u4F20 []\uFF09");
5175
+ }
5176
+ guardWrite();
5177
+ assertWriteQuery(sql);
5178
+ return driver.run(sql, params);
5179
+ },
5098
5180
  async changes(table, query = {}) {
5099
5181
  return readChanges(driver, table, query);
5100
5182
  }
@@ -5104,13 +5186,14 @@ function createCloudDb(driver, options = {}) {
5104
5186
  return makeHandle({ allowWriteDuringTx: false });
5105
5187
  }
5106
5188
 
5107
- // ../runtime/src/database/sdk/cloud.ts
5189
+ // packages/runtime/src/database/sdk/cloud.ts
5108
5190
  var CLOUD_DB_SPEC = {
5109
5191
  kind: "cloud-db",
5110
5192
  rootMethod: "table",
5111
5193
  stepMethods: ["select", "where", "orderBy", "limit", "offset"],
5112
5194
  terminalMethods: ["get", "first", "count", "insert", "insertMany", "update", "delete"],
5113
- directMethods: ["query", "changes"],
5195
+ // CF-013:writeQuery 是 D1 shim 的写路径(INSERT/UPDATE/DELETE),与 query 并列直通方法。
5196
+ directMethods: ["query", "writeQuery", "changes"],
5114
5197
  transactionMethod: "transaction"
5115
5198
  };
5116
5199
  var WRITE_TERMINALS = /* @__PURE__ */ new Set(["insert", "insertMany", "update", "delete"]);
@@ -5165,6 +5248,10 @@ function createDbCapability(driver, options = {}) {
5165
5248
  const [sql, params] = args;
5166
5249
  return await db.query(sql, params);
5167
5250
  }
5251
+ case DB_RPC.writeQuery: {
5252
+ const [sql, params] = args;
5253
+ return await db.writeQuery(sql, params);
5254
+ }
5168
5255
  case DB_RPC.changes: {
5169
5256
  const [table, query] = args;
5170
5257
  return await db.changes(table, query);
@@ -5208,7 +5295,7 @@ function createDbCapability(driver, options = {}) {
5208
5295
  };
5209
5296
  }
5210
5297
 
5211
- // ../runtime/src/sim/sql-engine.ts
5298
+ // packages/runtime/src/sim/sql-engine.ts
5212
5299
  var SimDbError = class extends Error {
5213
5300
  constructor(code, message) {
5214
5301
  super(message);
@@ -5626,7 +5713,7 @@ function project(rows, selectRaw) {
5626
5713
  });
5627
5714
  }
5628
5715
 
5629
- // src/sim/db.ts
5716
+ // packages/web-container/src/sim/db.ts
5630
5717
  function simDbKey(projectId) {
5631
5718
  return `db:${projectId}`;
5632
5719
  }
@@ -5654,7 +5741,7 @@ function createBrowserSimDb(options) {
5654
5741
  return { bundle, engine, driver };
5655
5742
  }
5656
5743
 
5657
- // ../runtime/src/storage/driver.ts
5744
+ // packages/runtime/src/storage/driver.ts
5658
5745
  var PROJECT_QUOTA_BYTES = 1024 * 1024 * 1024;
5659
5746
  var StorageError = class extends Error {
5660
5747
  constructor(status, code, message) {
@@ -5695,7 +5782,7 @@ function assertSafeStoragePath(path) {
5695
5782
  return path;
5696
5783
  }
5697
5784
 
5698
- // ../runtime/src/storage/hmac-sha256.ts
5785
+ // packages/runtime/src/storage/hmac-sha256.ts
5699
5786
  var K = new Uint32Array([
5700
5787
  1116352408,
5701
5788
  1899447441,
@@ -5856,7 +5943,7 @@ function hmacSha256Hex(key, message) {
5856
5943
  return [...hmacSha256(key, message)].map((b) => b.toString(16).padStart(2, "0")).join("");
5857
5944
  }
5858
5945
 
5859
- // ../runtime/src/storage/signature.ts
5946
+ // packages/runtime/src/storage/signature.ts
5860
5947
  var DEFAULT_SIGN_TTL_SECONDS = 15 * 60;
5861
5948
  var SIGN_EXPIRES_KEY = "x-expires";
5862
5949
  var SIGN_SIGNATURE_KEY = "x-signature";
@@ -5871,7 +5958,7 @@ function signDownloadUrl(config, projectId, path, ttlSeconds = DEFAULT_SIGN_TTL_
5871
5958
  return `${base}?${SIGN_EXPIRES_KEY}=${expires}&${SIGN_SIGNATURE_KEY}=${signature}`;
5872
5959
  }
5873
5960
 
5874
- // ../runtime/src/storage/cloud.ts
5961
+ // packages/runtime/src/storage/cloud.ts
5875
5962
  var DEFAULT_VISIBILITY = "private";
5876
5963
  function asBytes(data) {
5877
5964
  if (typeof data === "string") return new TextEncoder().encode(data);
@@ -5894,9 +5981,12 @@ function createStorageCapability(driver, signer, projectId) {
5894
5981
  const handler = async (method, args) => {
5895
5982
  switch (method) {
5896
5983
  case "upload": {
5897
- const [path, data] = args;
5984
+ const [path, data, options] = args;
5898
5985
  return toStoredFile(
5899
- await driver.put(projectId, path, asBytes(data), { visibility: DEFAULT_VISIBILITY })
5986
+ await driver.put(projectId, path, asBytes(data), {
5987
+ visibility: DEFAULT_VISIBILITY,
5988
+ ...options?.contentType === void 0 ? {} : { contentType: options.contentType }
5989
+ })
5900
5990
  );
5901
5991
  }
5902
5992
  case "get": {
@@ -5930,7 +6020,7 @@ function createStorageCapability(driver, signer, projectId) {
5930
6020
  };
5931
6021
  }
5932
6022
 
5933
- // src/sim/storage.ts
6023
+ // packages/web-container/src/sim/storage.ts
5934
6024
  function toMeta(object) {
5935
6025
  return {
5936
6026
  path: object.path,
@@ -6043,7 +6133,7 @@ function createBrowserSimStorage(options) {
6043
6133
  return { bundle, driver };
6044
6134
  }
6045
6135
 
6046
- // ../runtime/src/sim/realtime.ts
6136
+ // packages/runtime/src/sim/realtime.ts
6047
6137
  var SimRealtime = class {
6048
6138
  seq = 0;
6049
6139
  subscribers = /* @__PURE__ */ new Map();
@@ -6085,7 +6175,7 @@ var SimRealtime = class {
6085
6175
  };
6086
6176
  var REALTIME_CODES = REALTIME_CAPABILITY_CODES;
6087
6177
 
6088
- // src/sim/realtime.ts
6178
+ // packages/web-container/src/sim/realtime.ts
6089
6179
  function defaultTicketProvider(projectId) {
6090
6180
  return async () => {
6091
6181
  const res = await fetch("/api/v1/realtime/ticket", {
@@ -6255,7 +6345,7 @@ function createBrowserRealtime(options) {
6255
6345
  };
6256
6346
  }
6257
6347
 
6258
- // ../runtime/src/functions/runtime/chain.ts
6348
+ // packages/runtime/src/functions/runtime/chain.ts
6259
6349
  function isChainCapability(value) {
6260
6350
  if (typeof value !== "object" || value === null) return false;
6261
6351
  const spec = value[CHAIN_CAPABILITY_KEY];
@@ -6326,7 +6416,7 @@ function createChainClient(capability, port, pending, nextId, spec) {
6326
6416
  return makeRoot(void 0);
6327
6417
  }
6328
6418
 
6329
- // ../runtime/src/functions/runtime/cloud-container.ts
6419
+ // packages/runtime/src/functions/runtime/cloud-container.ts
6330
6420
  var KNOWN_CAPABILITY_HINTS = {
6331
6421
  db: {
6332
6422
  code: "DB_NOT_PROVISIONED",
@@ -6343,6 +6433,10 @@ var KNOWN_CAPABILITY_HINTS = {
6343
6433
  realtime: {
6344
6434
  code: "REALTIME_NOT_AVAILABLE",
6345
6435
  message: "\u5B9E\u65F6\u901A\u9053\u672A\u88C5\u914D\uFF1Arealtime \u57DF\u672A\u88C5\u8F7D\uFF08\u68C0\u67E5\u90E8\u7F72\u5F62\u6001\u4E0E Redis \u914D\u7F6E\uFF09\uFF08REALTIME_NOT_AVAILABLE\uFF09"
6436
+ },
6437
+ kv: {
6438
+ code: "KV_NOT_PROVISIONED",
6439
+ message: "\u9879\u76EE KV \u5B58\u50A8\u672A\u53EF\u7528\uFF1Akv \u968F\u9879\u76EE\u6570\u636E\u5E93\u63D0\u4F9B\uFF0C\u8BF7\u5148\u542F\u52A8\u6570\u636E\u5E93\uFF08KV_NOT_PROVISIONED\uFF09"
6346
6440
  }
6347
6441
  };
6348
6442
  var CapabilityNotRegisteredError = class extends Error {
@@ -6402,7 +6496,7 @@ function createCloudContainer() {
6402
6496
  };
6403
6497
  }
6404
6498
 
6405
- // src/sim/ctx.ts
6499
+ // packages/web-container/src/sim/ctx.ts
6406
6500
  function createLocalPort(handler) {
6407
6501
  const listeners = [];
6408
6502
  const dispatch = (message) => {
@@ -6482,7 +6576,7 @@ function buildCloudFromBundle(bundle) {
6482
6576
  return container.cloud;
6483
6577
  }
6484
6578
 
6485
- // ../runtime/src/functions/runtime/exports.ts
6579
+ // packages/runtime/src/functions/runtime/exports.ts
6486
6580
  function transformModule(code) {
6487
6581
  let out = code;
6488
6582
  const named = [];
@@ -6524,7 +6618,7 @@ function transformModule(code) {
6524
6618
  return out;
6525
6619
  }
6526
6620
 
6527
- // src/sim/runner.ts
6621
+ // packages/web-container/src/sim/runner.ts
6528
6622
  init_strip_types();
6529
6623
  function safeStringify2(value) {
6530
6624
  if (typeof value === "string") return value;
@@ -6655,7 +6749,107 @@ function createOfflineFunctionRunner(options = {}) {
6655
6749
  return { run };
6656
6750
  }
6657
6751
 
6658
- // src/sim/runtime.ts
6752
+ // packages/runtime/src/database/sdk/kv.ts
6753
+ var KV_TABLE = "_adep_kv";
6754
+ var KV_RPC = {
6755
+ get: "get",
6756
+ put: "put",
6757
+ delete: "delete",
6758
+ list: "list"
6759
+ };
6760
+ var KV_CAPABILITY_CODES = {
6761
+ invalidMethod: "KV_INVALID_METHOD"
6762
+ };
6763
+ var KV_LIST_DEFAULT_LIMIT = 100;
6764
+ function nowSeconds() {
6765
+ return Math.floor(Date.now() / 1e3);
6766
+ }
6767
+ function errorWithCode2(error) {
6768
+ const code = typeof error === "object" && error !== null && typeof error.code === "string" ? error.code : void 0;
6769
+ if (code !== void 0 && error instanceof Error) {
6770
+ return new Error(`[${code}] ${error.message}`);
6771
+ }
6772
+ return error;
6773
+ }
6774
+ function createKvCapability(driver) {
6775
+ let ensurePromise = null;
6776
+ const ensureTable = () => {
6777
+ if (ensurePromise === null) {
6778
+ ensurePromise = driver.run(
6779
+ `CREATE TABLE IF NOT EXISTS ${KV_TABLE} (key TEXT PRIMARY KEY, value TEXT, expires_at INTEGER)`
6780
+ ).then(() => void 0);
6781
+ }
6782
+ return ensurePromise;
6783
+ };
6784
+ const handler = async (method, args) => {
6785
+ try {
6786
+ await ensureTable();
6787
+ switch (method) {
6788
+ case KV_RPC.get: {
6789
+ const [key] = args;
6790
+ const row = await driver.get(`SELECT value, expires_at FROM ${KV_TABLE} WHERE key = ?`, [
6791
+ key
6792
+ ]);
6793
+ if (row === null || row === void 0) return null;
6794
+ const expiresAt = row.expires_at;
6795
+ if (expiresAt !== null && expiresAt !== void 0 && Number(expiresAt) <= nowSeconds()) {
6796
+ return null;
6797
+ }
6798
+ return row.value;
6799
+ }
6800
+ case KV_RPC.put: {
6801
+ const [key, value, options] = args;
6802
+ const ttl = options?.expirationTtlSeconds;
6803
+ const expiresAt = typeof ttl === "number" && ttl > 0 ? nowSeconds() + Math.floor(ttl) : null;
6804
+ await driver.run(`DELETE FROM ${KV_TABLE} WHERE key = ?`, [key]);
6805
+ await driver.run(`INSERT INTO ${KV_TABLE} (key, value, expires_at) VALUES (?, ?, ?)`, [
6806
+ key,
6807
+ value,
6808
+ expiresAt
6809
+ ]);
6810
+ return void 0;
6811
+ }
6812
+ case KV_RPC.delete: {
6813
+ const [key] = args;
6814
+ await driver.run(`DELETE FROM ${KV_TABLE} WHERE key = ?`, [key]);
6815
+ return void 0;
6816
+ }
6817
+ case KV_RPC.list: {
6818
+ const [options] = args;
6819
+ const prefix = options?.prefix ?? "";
6820
+ const limit = options?.limit ?? KV_LIST_DEFAULT_LIMIT;
6821
+ const rows = prefix === "" ? await driver.all(`SELECT key, expires_at FROM ${KV_TABLE}`) : await driver.all(`SELECT key, expires_at FROM ${KV_TABLE} WHERE key LIKE ?`, [
6822
+ `${prefix}%`
6823
+ ]);
6824
+ const now = nowSeconds();
6825
+ const entries = [];
6826
+ for (const row of rows) {
6827
+ const expiresAt = row.expires_at;
6828
+ if (expiresAt !== null && expiresAt !== void 0 && Number(expiresAt) <= now) continue;
6829
+ entries.push({
6830
+ name: String(row.key),
6831
+ expiration: expiresAt === null || expiresAt === void 0 ? null : Number(expiresAt)
6832
+ });
6833
+ if (entries.length >= limit) break;
6834
+ }
6835
+ return entries;
6836
+ }
6837
+ default:
6838
+ throw new Error(
6839
+ `\u672A\u77E5\u7684 cloud.kv \u65B9\u6CD5 "${String(method)}"\uFF08${KV_CAPABILITY_CODES.invalidMethod}\uFF09`
6840
+ );
6841
+ }
6842
+ } catch (error) {
6843
+ throw errorWithCode2(error);
6844
+ }
6845
+ };
6846
+ return {
6847
+ capabilities: [{ name: "kv", value: { [RPC_CAPABILITY_KEY]: true } }],
6848
+ rpcHandlers: { kv: handler }
6849
+ };
6850
+ }
6851
+
6852
+ // packages/web-container/src/sim/runtime.ts
6659
6853
  function mergeBundles(bundles) {
6660
6854
  const capabilities = [];
6661
6855
  const byName = /* @__PURE__ */ new Map();
@@ -6689,7 +6883,8 @@ async function createBrowserSimRuntime(options) {
6689
6883
  projectId: options.projectId,
6690
6884
  ...options.realtime === void 0 ? {} : options.realtime
6691
6885
  });
6692
- const bundle = mergeBundles([db.bundle, storage.bundle, realtime.bundle]);
6886
+ const kvBundle = createKvCapability(db.driver);
6887
+ const bundle = mergeBundles([db.bundle, storage.bundle, kvBundle, realtime.bundle]);
6693
6888
  await db.engine.load();
6694
6889
  const runner = createOfflineFunctionRunner(options.runner ?? {});
6695
6890
  return {
@@ -6702,7 +6897,7 @@ async function createBrowserSimRuntime(options) {
6702
6897
  };
6703
6898
  }
6704
6899
 
6705
- // src/index.ts
6900
+ // packages/web-container/src/index.ts
6706
6901
  init_function_fetch_proxy();
6707
6902
  export {
6708
6903
  COMPLETABLE_COMMANDS,