@tensorix/metahub 0.5.4 → 0.5.7
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/cli.js +677 -155
- package/dist/cli.js.map +23 -17
- package/dist/core/copy-views.d.ts +3 -0
- package/dist/core/copy-views.d.ts.map +1 -0
- package/dist/core/csv-columns.d.ts +6 -0
- package/dist/core/csv-columns.d.ts.map +1 -0
- package/dist/core/databases.d.ts.map +1 -1
- package/dist/core/sync/auth.d.ts.map +1 -1
- package/dist/core/sync/cf-oauth.d.ts.map +1 -1
- package/dist/core/sync/files.d.ts.map +1 -1
- package/dist/core/sync/page-messages.d.ts +5 -0
- package/dist/core/sync/page-messages.d.ts.map +1 -1
- package/dist/core/sync/remote-shares-cache.d.ts.map +1 -1
- package/dist/core/sync/room-serve.d.ts.map +1 -1
- package/dist/core/sync/share-actions.d.ts.map +1 -1
- package/dist/core/sync/share-copy.d.ts +1 -1
- package/dist/core/sync/share-copy.d.ts.map +1 -1
- package/dist/core/sync/share-export.d.ts +4 -2
- package/dist/core/sync/share-export.d.ts.map +1 -1
- package/dist/core/sync/share-file-styles.d.ts +2 -0
- package/dist/core/sync/share-file-styles.d.ts.map +1 -0
- package/dist/core/sync/share-link.d.ts +27 -0
- package/dist/core/sync/share-link.d.ts.map +1 -0
- package/dist/core/sync/share-serve.d.ts.map +1 -1
- package/dist/core/sync/share-short-links.d.ts +8 -0
- package/dist/core/sync/share-short-links.d.ts.map +1 -0
- package/dist/core/sync/sites-serve.d.ts.map +1 -1
- package/dist/core/ui-theme.d.ts +44 -0
- package/dist/core/ui-theme.d.ts.map +1 -0
- package/dist/db-worker.js +64 -64
- package/dist/edge-worker.js +137 -8
- package/dist/index.js +630 -131
- package/dist/index.js.map +20 -15
- package/dist/metahub-sdk.js +4 -4
- package/dist/mh-runtime.js +2 -2
- package/dist/sw.js +9 -6
- package/dist/webui/server/assets.d.ts.map +1 -1
- package/dist/webui.js +130 -130
- package/package.json +1 -1
package/dist/edge-worker.js
CHANGED
|
@@ -66,6 +66,90 @@ function normalizeRow(row) {
|
|
|
66
66
|
return row;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
// src/core/ui-theme.ts
|
|
70
|
+
var LIGHT_THEME = {
|
|
71
|
+
bg: "#ffffff",
|
|
72
|
+
paper: "#ffffff",
|
|
73
|
+
surface: "#fafaf9",
|
|
74
|
+
"surface-2": "#f1f1ef",
|
|
75
|
+
sidebar: "#f7f7f5",
|
|
76
|
+
fg: "#37352f",
|
|
77
|
+
"fg-soft": "#595750",
|
|
78
|
+
muted: "#6f6d66",
|
|
79
|
+
line: "#eae9e6",
|
|
80
|
+
"line-strong": "#d8d7d3",
|
|
81
|
+
accent: "#3867b2",
|
|
82
|
+
"accent-fg": "#ffffff",
|
|
83
|
+
"accent-soft": "#edf2f9",
|
|
84
|
+
hover: "rgba(55,53,47,.035)",
|
|
85
|
+
"hover-2": "rgba(55,53,47,.07)",
|
|
86
|
+
"code-bg": "#f6f5f3",
|
|
87
|
+
"selected-bg": "#f7f9fc",
|
|
88
|
+
"selected-border": "#a8b8ce",
|
|
89
|
+
"selected-icon-bg": "#edf2f8",
|
|
90
|
+
"selected-icon-fg": "#4d678b",
|
|
91
|
+
"selected-muted": "#626b78",
|
|
92
|
+
"selected-hover-bg": "#f1f5fa",
|
|
93
|
+
"selected-hover-border": "#8199bb",
|
|
94
|
+
danger: "#b6423a",
|
|
95
|
+
"danger-fg": "#ffffff",
|
|
96
|
+
"danger-soft": "#f9eeec",
|
|
97
|
+
success: "#347653",
|
|
98
|
+
warning: "#866022",
|
|
99
|
+
"warning-soft": "#faf3e5",
|
|
100
|
+
"brand-purple": "#79619d",
|
|
101
|
+
"brand-teal": "#397d76",
|
|
102
|
+
"brand-orange": "#a06436",
|
|
103
|
+
"shadow-sm": "0 1px 2px rgba(35,32,25,.035)",
|
|
104
|
+
"shadow-md": "0 4px 14px rgba(35,32,25,.08)",
|
|
105
|
+
"shadow-lg": "0 16px 48px rgba(35,32,25,.13)",
|
|
106
|
+
"brand-stripe": "linear-gradient(to right,#335cff 0% 25%,#8967ed 25% 50%,#18b7b6 50% 75%,#f28b55 75% 100%)"
|
|
107
|
+
};
|
|
108
|
+
var DARK_THEME = {
|
|
109
|
+
bg: "#191919",
|
|
110
|
+
paper: "#191919",
|
|
111
|
+
surface: "#222222",
|
|
112
|
+
"surface-2": "#2c2c2b",
|
|
113
|
+
sidebar: "#202020",
|
|
114
|
+
fg: "#e8e7e4",
|
|
115
|
+
"fg-soft": "#c0beb8",
|
|
116
|
+
muted: "#aaa8a2",
|
|
117
|
+
line: "#30302f",
|
|
118
|
+
"line-strong": "#42423f",
|
|
119
|
+
accent: "#8aaddb",
|
|
120
|
+
"accent-fg": "#172235",
|
|
121
|
+
"accent-soft": "#263242",
|
|
122
|
+
hover: "rgba(255,255,255,.035)",
|
|
123
|
+
"hover-2": "rgba(255,255,255,.065)",
|
|
124
|
+
"code-bg": "#242423",
|
|
125
|
+
"selected-bg": "#242a32",
|
|
126
|
+
"selected-border": "#56657a",
|
|
127
|
+
"selected-icon-bg": "#2d3745",
|
|
128
|
+
"selected-icon-fg": "#afc5e2",
|
|
129
|
+
"selected-muted": "#b5bfcd",
|
|
130
|
+
"selected-hover-bg": "#2a313b",
|
|
131
|
+
"selected-hover-border": "#7287a3",
|
|
132
|
+
danger: "#e89890",
|
|
133
|
+
"danger-fg": "#2b1716",
|
|
134
|
+
"danger-soft": "#3b2927",
|
|
135
|
+
success: "#92bd9b",
|
|
136
|
+
warning: "#d6b578",
|
|
137
|
+
"warning-soft": "#363024",
|
|
138
|
+
"brand-purple": "#baa6d1",
|
|
139
|
+
"brand-teal": "#8cbbb4",
|
|
140
|
+
"brand-orange": "#d4a37d",
|
|
141
|
+
"shadow-sm": "0 1px 2px rgba(0,0,0,.15)",
|
|
142
|
+
"shadow-md": "0 4px 14px rgba(0,0,0,.25)",
|
|
143
|
+
"shadow-lg": "0 16px 48px rgba(0,0,0,.35)",
|
|
144
|
+
"brand-stripe": "linear-gradient(to right,#335cff 0% 25%,#8967ed 25% 50%,#18b7b6 50% 75%,#f28b55 75% 100%)"
|
|
145
|
+
};
|
|
146
|
+
var declarations = (palette) => Object.entries(palette).map(([k, v]) => `--${k}:${v};`).join("");
|
|
147
|
+
var THEME_CSS = `:root{color-scheme:light;${declarations(LIGHT_THEME)}--card:var(--surface-2);--ok:var(--success)}
|
|
148
|
+
@media(prefers-color-scheme:dark){:root:not([data-resolved]){color-scheme:dark;${declarations(DARK_THEME)}}}
|
|
149
|
+
:root[data-resolved="dark"]{color-scheme:dark;${declarations(DARK_THEME)}}
|
|
150
|
+
::selection{background:var(--accent-soft);color:var(--accent)}`;
|
|
151
|
+
var THEME_INIT_SCRIPT = `(function(){var t;try{t=localStorage.getItem('mh-theme')}catch(e){}var d=t==='dark'||(t!=='light'&&matchMedia('(prefers-color-scheme: dark)').matches);document.documentElement.dataset.resolved=d?'dark':'light';var m=document.querySelector('meta[name="theme-color"]');if(m)m.content=d?'${DARK_THEME.bg}':'${LIGHT_THEME.bg}'})();`;
|
|
152
|
+
|
|
69
153
|
// src/core/errors.ts
|
|
70
154
|
class MhError extends Error {
|
|
71
155
|
code;
|
|
@@ -158,6 +242,45 @@ function idKind(id) {
|
|
|
158
242
|
return KINDS.has(prefix) ? prefix : null;
|
|
159
243
|
}
|
|
160
244
|
|
|
245
|
+
// src/core/copy-views.ts
|
|
246
|
+
function copyViews(raw, props, records, selfRelations) {
|
|
247
|
+
if (!Array.isArray(raw))
|
|
248
|
+
return raw;
|
|
249
|
+
const object = (x) => !!x && typeof x === "object" && !Array.isArray(x);
|
|
250
|
+
const prop = (x) => typeof x === "string" ? props.get(x) ?? x : x;
|
|
251
|
+
return raw.map((v) => {
|
|
252
|
+
if (!object(v))
|
|
253
|
+
return v;
|
|
254
|
+
const out = { ...v };
|
|
255
|
+
for (const key of ["group", "dateProp", "start", "end"])
|
|
256
|
+
if (key in out)
|
|
257
|
+
out[key] = prop(out[key]);
|
|
258
|
+
if (Array.isArray(v.hidden))
|
|
259
|
+
out.hidden = v.hidden.map(prop);
|
|
260
|
+
if (Array.isArray(v.sort))
|
|
261
|
+
out.sort = v.sort.map((s) => object(s) ? { ...s, prop: prop(s.prop) } : s);
|
|
262
|
+
if (object(v.filter) && Array.isArray(v.filter.rules))
|
|
263
|
+
out.filter = {
|
|
264
|
+
...v.filter,
|
|
265
|
+
rules: v.filter.rules.map((r) => {
|
|
266
|
+
if (!object(r))
|
|
267
|
+
return r;
|
|
268
|
+
return {
|
|
269
|
+
...r,
|
|
270
|
+
prop: prop(r.prop),
|
|
271
|
+
...typeof r.prop === "string" && selfRelations.has(r.prop) && Array.isArray(r.value) ? { value: r.value.map((id) => typeof id === "string" ? records.get(id) ?? id : id) } : {}
|
|
272
|
+
};
|
|
273
|
+
})
|
|
274
|
+
};
|
|
275
|
+
if (object(v.calc))
|
|
276
|
+
out.calc = Object.fromEntries(Object.entries(v.calc).map(([id, value]) => [
|
|
277
|
+
props.get(id) ?? id,
|
|
278
|
+
value
|
|
279
|
+
]));
|
|
280
|
+
return out;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
161
284
|
// src/core/driver.ts
|
|
162
285
|
function writeTx(db, fn) {
|
|
163
286
|
const tx = db.transaction(fn);
|
|
@@ -1351,10 +1474,6 @@ var duplicateDatabase = grouped(function duplicateDatabase(db, id, opts = {}) {
|
|
|
1351
1474
|
name: opts.name ?? src.name,
|
|
1352
1475
|
icon: opts.icon ?? src.icon ?? undefined
|
|
1353
1476
|
});
|
|
1354
|
-
if (src.meta !== null) {
|
|
1355
|
-
const { collapsed: _hidden, ...meta } = src.meta;
|
|
1356
|
-
emitMetaPatch(db, dup.id, null, meta);
|
|
1357
|
-
}
|
|
1358
1477
|
const propIdMap = new Map;
|
|
1359
1478
|
const selfRelNew = new Set;
|
|
1360
1479
|
for (const p of listProperties(db, id)) {
|
|
@@ -1389,6 +1508,12 @@ var duplicateDatabase = grouped(function duplicateDatabase(db, id, opts = {}) {
|
|
|
1389
1508
|
if (Object.keys(patch).length)
|
|
1390
1509
|
updateRecord(db, recIdMap.get(r.id), patch);
|
|
1391
1510
|
}
|
|
1511
|
+
if (src.meta !== null) {
|
|
1512
|
+
const { collapsed: _hidden, ...meta } = src.meta;
|
|
1513
|
+
if ("views" in meta)
|
|
1514
|
+
meta.views = copyViews(meta.views, propIdMap, recIdMap, new Set(listProperties(db, id).filter((p) => p.type === "relation" && p.config?.database === id).map((p) => p.id)));
|
|
1515
|
+
emitMetaPatch(db, dup.id, null, meta);
|
|
1516
|
+
}
|
|
1392
1517
|
return getDatabase(db, dup.id);
|
|
1393
1518
|
});
|
|
1394
1519
|
function getDatabase(db, id) {
|
|
@@ -1768,6 +1893,11 @@ var EN = {
|
|
|
1768
1893
|
"登录已过期,请重新输入令牌。": "Session expired. Enter the token again.",
|
|
1769
1894
|
附件已失效: "Attachment unavailable",
|
|
1770
1895
|
链接缺少分享数据: "The link is missing share data",
|
|
1896
|
+
无法打开这份分享: "Unable to open this share",
|
|
1897
|
+
"请从原消息中重新复制完整链接,再打开试试。": "Copy the full link from the original message, then open it again.",
|
|
1898
|
+
"如果仍然无法打开,请联系分享者重新发送链接。": "If it still won't open, ask the sender for a new link.",
|
|
1899
|
+
"请检查网络连接后重试,或联系分享者确认链接是否仍然有效。": "Check your connection and try again, or ask the sender whether the link is still valid.",
|
|
1900
|
+
重新加载: "Reload",
|
|
1771
1901
|
请输入分享口令: "Enter the share passcode",
|
|
1772
1902
|
链接缺少密钥: "The link is missing its key",
|
|
1773
1903
|
口令错误或链接已失效: "Wrong passcode or the link has expired",
|
|
@@ -3938,16 +4068,15 @@ function serveRoomFile(db, cfg, path, locale) {
|
|
|
3938
4068
|
return new Response(body.buffer, { status, headers });
|
|
3939
4069
|
}
|
|
3940
4070
|
var PAGE_CSS = `
|
|
3941
|
-
|
|
3942
|
-
@media (prefers-color-scheme: dark){:root{--bg:#0d1117;--fg:#e6edf3;--muted:#8b949e;--line:#30363d;--accent:#4493f8;--card:#161b22}}
|
|
4071
|
+
${THEME_CSS}
|
|
3943
4072
|
*{box-sizing:border-box}
|
|
3944
4073
|
body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.65 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
|
|
3945
4074
|
min-height:100dvh;display:flex;align-items:center;justify-content:center;padding:24px}
|
|
3946
4075
|
main{max-width:420px;width:100%}
|
|
3947
4076
|
form.pw{display:flex;flex-direction:column;gap:12px}
|
|
3948
4077
|
form.pw input{padding:9px;border:1px solid var(--line);border-radius:7px;background:var(--card);color:var(--fg)}
|
|
3949
|
-
form.pw button{padding:9px;border:0;border-radius:7px;background:var(--accent);color
|
|
3950
|
-
.err{color
|
|
4078
|
+
form.pw button{padding:9px;border:0;border-radius:7px;background:var(--accent);color:var(--accent-fg);cursor:pointer}
|
|
4079
|
+
.err{color:var(--danger);font-size:13px;margin:0}
|
|
3951
4080
|
.muted{color:var(--muted);font-size:14px}
|
|
3952
4081
|
h1{font-size:20px;margin:0 0 10px;text-align:center}
|
|
3953
4082
|
footer{margin-top:34px;color:var(--muted);font-size:12px;text-align:center}`;
|