@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/function-fetch-proxy.d.ts +9 -3
- package/dist/index.js +286 -91
- package/dist/vite-dev.d.ts +2 -0
- package/dist/web-container.esm.js +6985 -0
- package/dist/web-container.iife.js +7003 -0
- package/package.json +17 -22
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
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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 (
|
|
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 [
|
|
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("/") ?
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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), {
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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/
|
|
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
|
|
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,
|