@ketvietlab/ketjs 0.1.1
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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/agent/capabilities.d.ts +62 -0
- package/dist/agent/capabilities.d.ts.map +1 -0
- package/dist/agent/capabilities.js +89 -0
- package/dist/agent/capabilities.js.map +1 -0
- package/dist/agent/permissions.d.ts +56 -0
- package/dist/agent/permissions.d.ts.map +1 -0
- package/dist/agent/permissions.js +209 -0
- package/dist/agent/permissions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +698 -0
- package/dist/cli.js.map +1 -0
- package/dist/codegen/dts.d.ts +3 -0
- package/dist/codegen/dts.d.ts.map +1 -0
- package/dist/codegen/dts.js +94 -0
- package/dist/codegen/dts.js.map +1 -0
- package/dist/data/adapter.d.ts +4 -0
- package/dist/data/adapter.d.ts.map +1 -0
- package/dist/data/adapter.js +18 -0
- package/dist/data/adapter.js.map +1 -0
- package/dist/data/changeset.d.ts +49 -0
- package/dist/data/changeset.d.ts.map +1 -0
- package/dist/data/changeset.js +206 -0
- package/dist/data/changeset.js.map +1 -0
- package/dist/data/expr.d.ts +59 -0
- package/dist/data/expr.d.ts.map +1 -0
- package/dist/data/expr.js +61 -0
- package/dist/data/expr.js.map +1 -0
- package/dist/data/fleet.d.ts +28 -0
- package/dist/data/fleet.d.ts.map +1 -0
- package/dist/data/fleet.js +82 -0
- package/dist/data/fleet.js.map +1 -0
- package/dist/data/list-search.d.ts +93 -0
- package/dist/data/list-search.d.ts.map +1 -0
- package/dist/data/list-search.js +268 -0
- package/dist/data/list-search.js.map +1 -0
- package/dist/data/migrate.d.ts +75 -0
- package/dist/data/migrate.d.ts.map +1 -0
- package/dist/data/migrate.js +136 -0
- package/dist/data/migrate.js.map +1 -0
- package/dist/data/pool.d.ts +20 -0
- package/dist/data/pool.d.ts.map +1 -0
- package/dist/data/pool.js +92 -0
- package/dist/data/pool.js.map +1 -0
- package/dist/data/query.d.ts +111 -0
- package/dist/data/query.d.ts.map +1 -0
- package/dist/data/query.js +268 -0
- package/dist/data/query.js.map +1 -0
- package/dist/data/sqlite.d.ts +3 -0
- package/dist/data/sqlite.d.ts.map +1 -0
- package/dist/data/sqlite.js +107 -0
- package/dist/data/sqlite.js.map +1 -0
- package/dist/data/time.d.ts +9 -0
- package/dist/data/time.d.ts.map +1 -0
- package/dist/data/time.js +107 -0
- package/dist/data/time.js.map +1 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/apps.d.ts +43 -0
- package/dist/kernel/apps.d.ts.map +1 -0
- package/dist/kernel/apps.js +234 -0
- package/dist/kernel/apps.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +976 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/define.d.ts +9 -0
- package/dist/kernel/define.d.ts.map +1 -0
- package/dist/kernel/define.js +140 -0
- package/dist/kernel/define.js.map +1 -0
- package/dist/kernel/diff.d.ts +11 -0
- package/dist/kernel/diff.d.ts.map +1 -0
- package/dist/kernel/diff.js +106 -0
- package/dist/kernel/diff.js.map +1 -0
- package/dist/kernel/errors.d.ts +17 -0
- package/dist/kernel/errors.d.ts.map +1 -0
- package/dist/kernel/errors.js +43 -0
- package/dist/kernel/errors.js.map +1 -0
- package/dist/kernel/graph.d.ts +3 -0
- package/dist/kernel/graph.d.ts.map +1 -0
- package/dist/kernel/graph.js +56 -0
- package/dist/kernel/graph.js.map +1 -0
- package/dist/kernel/i18n.d.ts +43 -0
- package/dist/kernel/i18n.d.ts.map +1 -0
- package/dist/kernel/i18n.js +79 -0
- package/dist/kernel/i18n.js.map +1 -0
- package/dist/kernel/index.d.ts +7 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +7 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/layout.d.ts +17 -0
- package/dist/kernel/layout.d.ts.map +1 -0
- package/dist/kernel/layout.js +77 -0
- package/dist/kernel/layout.js.map +1 -0
- package/dist/kernel/menu.d.ts +27 -0
- package/dist/kernel/menu.d.ts.map +1 -0
- package/dist/kernel/menu.js +65 -0
- package/dist/kernel/menu.js.map +1 -0
- package/dist/kernel/modules.d.ts +31 -0
- package/dist/kernel/modules.d.ts.map +1 -0
- package/dist/kernel/modules.js +322 -0
- package/dist/kernel/modules.js.map +1 -0
- package/dist/kernel/routes.d.ts +24 -0
- package/dist/kernel/routes.d.ts.map +1 -0
- package/dist/kernel/routes.js +98 -0
- package/dist/kernel/routes.js.map +1 -0
- package/dist/kernel/types.d.ts +8 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/types.js +67 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/workspace.d.ts +62 -0
- package/dist/kernel/workspace.d.ts.map +1 -0
- package/dist/kernel/workspace.js +156 -0
- package/dist/kernel/workspace.js.map +1 -0
- package/dist/scaffold/index.d.ts +2 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +49 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates/app.test.ts.tmpl +17 -0
- package/dist/scaffold/templates/biome.json.tmpl +30 -0
- package/dist/scaffold/templates/dev.mjs.tmpl +16 -0
- package/dist/scaffold/templates/gitignore.tmpl +24 -0
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +18 -0
- package/dist/scaffold/templates/module.ts.tmpl +27 -0
- package/dist/scaffold/templates/package.json.tmpl +25 -0
- package/dist/scaffold/templates/tsconfig.json.tmpl +15 -0
- package/dist/server/boot.d.ts +173 -0
- package/dist/server/boot.d.ts.map +1 -0
- package/dist/server/boot.js +659 -0
- package/dist/server/boot.js.map +1 -0
- package/dist/server/config.d.ts +48 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +82 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/ctx.d.ts +13 -0
- package/dist/server/ctx.d.ts.map +1 -0
- package/dist/server/ctx.js +496 -0
- package/dist/server/ctx.js.map +1 -0
- package/dist/server/fn.d.ts +34 -0
- package/dist/server/fn.d.ts.map +1 -0
- package/dist/server/fn.js +170 -0
- package/dist/server/fn.js.map +1 -0
- package/dist/server/http.d.ts +79 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +459 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/idem.d.ts +31 -0
- package/dist/server/idem.d.ts.map +1 -0
- package/dist/server/idem.js +68 -0
- package/dist/server/idem.js.map +1 -0
- package/dist/server/jobs.d.ts +5 -0
- package/dist/server/jobs.d.ts.map +1 -0
- package/dist/server/jobs.js +24 -0
- package/dist/server/jobs.js.map +1 -0
- package/dist/server/multipart.d.ts +18 -0
- package/dist/server/multipart.d.ts.map +1 -0
- package/dist/server/multipart.js +183 -0
- package/dist/server/multipart.js.map +1 -0
- package/dist/server/project.d.ts +9 -0
- package/dist/server/project.d.ts.map +1 -0
- package/dist/server/project.js +67 -0
- package/dist/server/project.js.map +1 -0
- package/dist/server/queue.d.ts +80 -0
- package/dist/server/queue.d.ts.map +1 -0
- package/dist/server/queue.js +494 -0
- package/dist/server/queue.js.map +1 -0
- package/dist/server/respond.d.ts +91 -0
- package/dist/server/respond.d.ts.map +1 -0
- package/dist/server/respond.js +99 -0
- package/dist/server/respond.js.map +1 -0
- package/dist/server/runtime.d.ts +14 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +25 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/session.d.ts +55 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +172 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/sessionstore.d.ts +54 -0
- package/dist/server/sessionstore.d.ts.map +1 -0
- package/dist/server/sessionstore.js +232 -0
- package/dist/server/sessionstore.js.map +1 -0
- package/dist/server/storage/index.d.ts +11 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +31 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/local.d.ts +5 -0
- package/dist/server/storage/local.d.ts.map +1 -0
- package/dist/server/storage/local.js +165 -0
- package/dist/server/storage/local.js.map +1 -0
- package/dist/server/storage/s3.d.ts +11 -0
- package/dist/server/storage/s3.d.ts.map +1 -0
- package/dist/server/storage/s3.js +133 -0
- package/dist/server/storage/s3.js.map +1 -0
- package/dist/server/storage/sigv4.d.ts +23 -0
- package/dist/server/storage/sigv4.d.ts.map +1 -0
- package/dist/server/storage/sigv4.js +79 -0
- package/dist/server/storage/sigv4.js.map +1 -0
- package/dist/server/storage/types.d.ts +37 -0
- package/dist/server/storage/types.d.ts.map +1 -0
- package/dist/server/storage/types.js +82 -0
- package/dist/server/storage/types.js.map +1 -0
- package/dist/server/stream.d.ts +43 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +117 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/streamstore.d.ts +29 -0
- package/dist/server/streamstore.d.ts.map +1 -0
- package/dist/server/streamstore.js +140 -0
- package/dist/server/streamstore.js.map +1 -0
- package/dist/server/tenants.d.ts +108 -0
- package/dist/server/tenants.d.ts.map +1 -0
- package/dist/server/tenants.js +172 -0
- package/dist/server/tenants.js.map +1 -0
- package/dist/server/transport/index.d.ts +5 -0
- package/dist/server/transport/index.d.ts.map +1 -0
- package/dist/server/transport/index.js +3 -0
- package/dist/server/transport/index.js.map +1 -0
- package/dist/server/transport/memory.d.ts +14 -0
- package/dist/server/transport/memory.d.ts.map +1 -0
- package/dist/server/transport/memory.js +36 -0
- package/dist/server/transport/memory.js.map +1 -0
- package/dist/server/transport/types.d.ts +44 -0
- package/dist/server/transport/types.d.ts.map +1 -0
- package/dist/server/transport/types.js +79 -0
- package/dist/server/transport/types.js.map +1 -0
- package/dist/server/worker.d.ts +33 -0
- package/dist/server/worker.d.ts.map +1 -0
- package/dist/server/worker.js +428 -0
- package/dist/server/worker.js.map +1 -0
- package/dist/testing.d.ts +146 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +406 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme/contracts.d.ts +4 -0
- package/dist/theme/contracts.d.ts.map +1 -0
- package/dist/theme/contracts.js +87 -0
- package/dist/theme/contracts.js.map +1 -0
- package/dist/theme/index.d.ts +8 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +7 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/joints.d.ts +19 -0
- package/dist/theme/joints.d.ts.map +1 -0
- package/dist/theme/joints.js +126 -0
- package/dist/theme/joints.js.map +1 -0
- package/dist/theme/ktl/compile.d.ts +26 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -0
- package/dist/theme/ktl/compile.js +226 -0
- package/dist/theme/ktl/compile.js.map +1 -0
- package/dist/theme/ktl/lexer.d.ts +20 -0
- package/dist/theme/ktl/lexer.d.ts.map +1 -0
- package/dist/theme/ktl/lexer.js +56 -0
- package/dist/theme/ktl/lexer.js.map +1 -0
- package/dist/theme/ktl/parser.d.ts +64 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -0
- package/dist/theme/ktl/parser.js +220 -0
- package/dist/theme/ktl/parser.js.map +1 -0
- package/dist/theme/render.d.ts +19 -0
- package/dist/theme/render.d.ts.map +1 -0
- package/dist/theme/render.js +246 -0
- package/dist/theme/render.js.map +1 -0
- package/dist/theme/templates.d.ts +2 -0
- package/dist/theme/templates.d.ts.map +1 -0
- package/dist/theme/templates.js +40 -0
- package/dist/theme/templates.js.map +1 -0
- package/dist/theme/tokens.d.ts +4 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +15 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/theme/viewmodel.d.ts +6 -0
- package/dist/theme/viewmodel.d.ts.map +1 -0
- package/dist/theme/viewmodel.js +40 -0
- package/dist/theme/viewmodel.js.map +1 -0
- package/dist/types.d.ts +614 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Translations, declared by the module that owns the strings.
|
|
2
|
+
//
|
|
3
|
+
// Same rule as everything else: a module declares what it contributes and the
|
|
4
|
+
// composer merges it. Keys are prefixed with the module name, so two modules can
|
|
5
|
+
// both have a "title" without either knowing about the other — the collision that
|
|
6
|
+
// makes a flat global catalogue rot.
|
|
7
|
+
//
|
|
8
|
+
// Missing translations are never an error. A build that breaks because a Danish
|
|
9
|
+
// string is absent is a build nobody will translate into Danish. They fall back,
|
|
10
|
+
// and `missingMessages()` reports the gaps for whoever is filling them in.
|
|
11
|
+
const PLACEHOLDER = /\{(\w+)\}/g;
|
|
12
|
+
/**
|
|
13
|
+
* Pseudo-locale: every string comes back longer and bracketed. It exists so a
|
|
14
|
+
* layout can be tested against text expansion before a real translation arrives —
|
|
15
|
+
* Vietnamese is short and English is not, and a design tuned to the shorter one
|
|
16
|
+
* breaks on the longer.
|
|
17
|
+
*/
|
|
18
|
+
export const PSEUDO_LOCALE = 'qps';
|
|
19
|
+
const pseudo = (s) => `⟦${s.replace(/[aeiouAEIOU]/g, (c) => c + c.toLowerCase())}⟧`;
|
|
20
|
+
export function translator(manifest, locale, o = {}) {
|
|
21
|
+
const fallback = o.fallback ?? 'vi';
|
|
22
|
+
const catalogs = manifest.messages ?? {};
|
|
23
|
+
const primary = catalogs[locale] ?? {};
|
|
24
|
+
const secondary = catalogs[fallback] ?? {};
|
|
25
|
+
const plural = new Intl.PluralRules(locale === PSEUDO_LOCALE ? 'en' : locale);
|
|
26
|
+
const resolve = (key) => {
|
|
27
|
+
if (key in primary)
|
|
28
|
+
return { message: primary[key], exact: true };
|
|
29
|
+
if (key in secondary)
|
|
30
|
+
return { message: secondary[key], exact: false };
|
|
31
|
+
return { message: undefined, exact: false };
|
|
32
|
+
};
|
|
33
|
+
const t = ((key, params = {}) => {
|
|
34
|
+
const { message, exact } = resolve(key);
|
|
35
|
+
if (!exact)
|
|
36
|
+
o.onMissing?.(key, locale);
|
|
37
|
+
let text;
|
|
38
|
+
if (message === undefined)
|
|
39
|
+
text = key; // visible, not blank
|
|
40
|
+
else if (typeof message === 'string')
|
|
41
|
+
text = message;
|
|
42
|
+
else {
|
|
43
|
+
const count = Number(params.count ?? 0);
|
|
44
|
+
text = message[plural.select(count)] ?? message.other ?? key;
|
|
45
|
+
}
|
|
46
|
+
text = text.replace(PLACEHOLDER, (_, name) => String(params[name] ?? `{${name}}`));
|
|
47
|
+
return locale === PSEUDO_LOCALE ? pseudo(text) : text;
|
|
48
|
+
});
|
|
49
|
+
t.locale = locale;
|
|
50
|
+
t.has = (key) => key in primary;
|
|
51
|
+
t.resolves = (key) => key in primary || key in secondary;
|
|
52
|
+
return t;
|
|
53
|
+
}
|
|
54
|
+
/** Which keys each locale is missing, measured against the union of all of them. */
|
|
55
|
+
export function missingMessages(manifest, locales) {
|
|
56
|
+
const catalogs = manifest.messages ?? {};
|
|
57
|
+
const wanted = locales ?? Object.keys(catalogs);
|
|
58
|
+
const every = new Set();
|
|
59
|
+
for (const c of Object.values(catalogs))
|
|
60
|
+
for (const k of Object.keys(c))
|
|
61
|
+
every.add(k);
|
|
62
|
+
const out = {};
|
|
63
|
+
for (const locale of wanted) {
|
|
64
|
+
const have = catalogs[locale] ?? {};
|
|
65
|
+
const gaps = [...every].filter((k) => !(k in have)).sort();
|
|
66
|
+
if (gaps.length)
|
|
67
|
+
out[locale] = gaps;
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
export function formatMissing(missing) {
|
|
72
|
+
const entries = Object.entries(missing);
|
|
73
|
+
if (!entries.length)
|
|
74
|
+
return 'every locale has every key';
|
|
75
|
+
return entries
|
|
76
|
+
.map(([locale, keys]) => `${locale}: ${keys.length} missing\n${keys.map((k) => ` ${k}`).join('\n')}`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/i18n.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { defineModule, defineTheme } from './define.ts';
|
|
2
|
+
export { compose } from './compose.ts';
|
|
3
|
+
export { topoSort } from './graph.ts';
|
|
4
|
+
export { diffManifests, formatDiff } from './diff.ts';
|
|
5
|
+
export { KetError, Diagnostics } from './errors.ts';
|
|
6
|
+
export { isDateText, parseType, tsTypeOf, sqlTypeOf, SCALARS } from './types.ts';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { defineModule, defineTheme } from './define.js';
|
|
2
|
+
export { compose } from './compose.js';
|
|
3
|
+
export { topoSort } from './graph.js';
|
|
4
|
+
export { diffManifests, formatDiff } from './diff.js';
|
|
5
|
+
export { KetError, Diagnostics } from './errors.js';
|
|
6
|
+
export { isDateText, parseType, tsTypeOf, sqlTypeOf, SCALARS } from './types.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Manifest } from '../types.ts';
|
|
2
|
+
export type Placement = {
|
|
3
|
+
type: string;
|
|
4
|
+
settings?: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
export type LayoutError = {
|
|
7
|
+
at: number;
|
|
8
|
+
type: string;
|
|
9
|
+
field?: string;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function validateLayout(manifest: Manifest, layout: unknown): {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
errors: LayoutError[];
|
|
15
|
+
};
|
|
16
|
+
export declare const formatLayoutErrors: (errors: LayoutError[]) => string;
|
|
17
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/layout.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAA;AAC5E,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAcvF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAwD1G;AAED,eAAO,MAAM,kBAAkB,WAAY,WAAW,EAAE,KAAG,MACwC,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Validating a page layout against the sections that exist.
|
|
2
|
+
//
|
|
3
|
+
// This is the payoff for making sections data rather than code: what an agent
|
|
4
|
+
// writes can be checked before it is stored, against the same declaration the
|
|
5
|
+
// theme renders from. A bad section type, a missing required setting, or a setting
|
|
6
|
+
// of the wrong shape are all caught here — as a list, not as an exception, because
|
|
7
|
+
// a list is what an agent can act on.
|
|
8
|
+
import { isDateText, parseType } from './types.js';
|
|
9
|
+
const JS_OF = {
|
|
10
|
+
id: 'string',
|
|
11
|
+
text: 'string',
|
|
12
|
+
ref: 'string',
|
|
13
|
+
int: 'number',
|
|
14
|
+
float: 'number',
|
|
15
|
+
bool: 'boolean',
|
|
16
|
+
date: 'string',
|
|
17
|
+
datetime: 'string',
|
|
18
|
+
json: 'object',
|
|
19
|
+
};
|
|
20
|
+
export function validateLayout(manifest, layout) {
|
|
21
|
+
const errors = [];
|
|
22
|
+
if (!Array.isArray(layout)) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
errors: [{ at: -1, type: '(layout)', message: 'a layout must be an array of section placements' }],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
layout.forEach((raw, at) => {
|
|
29
|
+
const placement = raw;
|
|
30
|
+
if (!placement || typeof placement.type !== 'string') {
|
|
31
|
+
errors.push({ at, type: '(unknown)', message: 'each placement needs a "type"' });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const section = manifest.sections[placement.type];
|
|
35
|
+
if (!section) {
|
|
36
|
+
errors.push({
|
|
37
|
+
at,
|
|
38
|
+
type: placement.type,
|
|
39
|
+
message: `no installed module provides this section (available: ${Object.keys(manifest.sections).join(', ') || 'none'})`,
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const schema = section.settings ?? {};
|
|
44
|
+
const settings = placement.settings ?? {};
|
|
45
|
+
for (const [field, spec] of Object.entries(schema)) {
|
|
46
|
+
const t = parseType(spec);
|
|
47
|
+
const value = settings[field];
|
|
48
|
+
if (value == null) {
|
|
49
|
+
if (t.ok && !t.optional)
|
|
50
|
+
errors.push({ at, type: placement.type, field, message: `is required (${spec})` });
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (!t.ok)
|
|
54
|
+
continue;
|
|
55
|
+
const want = JS_OF[t.base];
|
|
56
|
+
if (want && typeof value !== want) {
|
|
57
|
+
errors.push({ at, type: placement.type, field, message: `expects ${t.base}, got ${typeof value}` });
|
|
58
|
+
}
|
|
59
|
+
else if (t.base === 'date' && !isDateText(value)) {
|
|
60
|
+
errors.push({ at, type: placement.type, field, message: 'expects date in YYYY-MM-DD format' });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
for (const field of Object.keys(settings)) {
|
|
64
|
+
if (!(field in schema)) {
|
|
65
|
+
errors.push({
|
|
66
|
+
at,
|
|
67
|
+
type: placement.type,
|
|
68
|
+
field,
|
|
69
|
+
message: `is not a setting of this section (accepted: ${Object.keys(schema).join(', ') || 'none'})`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return { ok: errors.length === 0, errors };
|
|
75
|
+
}
|
|
76
|
+
export const formatLayoutErrors = (errors) => errors.map((e) => ` [${e.at}] ${e.type}${e.field ? '.' + e.field : ''} ${e.message}`).join('\n');
|
|
77
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Manifest } from '../types.ts';
|
|
2
|
+
export type MenuNode = {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
path: string | null;
|
|
6
|
+
icon: string | null;
|
|
7
|
+
/** True for the node whose path is showing, and for every heading above it. */
|
|
8
|
+
active: boolean;
|
|
9
|
+
children: MenuNode[];
|
|
10
|
+
};
|
|
11
|
+
export type MenuOptions = {
|
|
12
|
+
/** Function keys this viewer may call. Null means unrestricted. */
|
|
13
|
+
allow?: readonly string[] | null;
|
|
14
|
+
/** Resolves a label. Given a key it does not know, it should return it unchanged. */
|
|
15
|
+
translate?: (key: string) => string;
|
|
16
|
+
/** The path currently showing, used to mark the branch leading to it. */
|
|
17
|
+
active?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Narrow the tree to what matches. A heading survives if anything under it
|
|
20
|
+
* does, so filtering never orphans a leaf from the words above it.
|
|
21
|
+
*/
|
|
22
|
+
q?: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function buildMenu(manifest: Manifest, o?: MenuOptions): MenuNode[];
|
|
25
|
+
/** The app a path belongs to: the root whose branch contains it. */
|
|
26
|
+
export declare function activeApp(tree: MenuNode[]): MenuNode | null;
|
|
27
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,QAAQ,EAAE,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,mEAAmE;IACnE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAChC,qFAAqF;IACrF,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,CAAA;CACX,CAAA;AAKD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAE,WAAgB,GAAG,QAAQ,EAAE,CAoD7E;AAED,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAE3D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// The navigation tree, as one viewer sees it.
|
|
2
|
+
//
|
|
3
|
+
// Three filters, applied in this order, because each depends on the one before:
|
|
4
|
+
// what the deployment ships, what this database has switched on, and what this
|
|
5
|
+
// viewer may call. The last is the one that matters most — a menu offering what it
|
|
6
|
+
// cannot deliver is a menu that lies, and the 401 arrives after the click rather
|
|
7
|
+
// than instead of it.
|
|
8
|
+
//
|
|
9
|
+
// A heading with nothing left under it disappears with its children. An empty
|
|
10
|
+
// section is worse than a missing one: it reads as "this is broken" rather than
|
|
11
|
+
// "this is not for you".
|
|
12
|
+
const order = (a, b) => (a[1].sequence ?? 100) - (b[1].sequence ?? 100) || a[1].label.localeCompare(b[1].label);
|
|
13
|
+
export function buildMenu(manifest, o = {}) {
|
|
14
|
+
const entries = Object.entries(manifest.menus);
|
|
15
|
+
const byParent = new Map();
|
|
16
|
+
for (const e of entries) {
|
|
17
|
+
const list = byParent.get(e[1].parent) ?? [];
|
|
18
|
+
list.push(e);
|
|
19
|
+
byParent.set(e[1].parent, list);
|
|
20
|
+
}
|
|
21
|
+
// Two reasons an entry does not appear: the function it leads to is not in this
|
|
22
|
+
// build at all, or it is and this viewer may not call it.
|
|
23
|
+
const permitted = (def) => !def.needs || (!!manifest.functions[def.needs] && (!o.allow || o.allow.includes(def.needs)));
|
|
24
|
+
const label = (def) => {
|
|
25
|
+
const key = `${def.by}.${def.label}`;
|
|
26
|
+
const out = o.translate?.(key);
|
|
27
|
+
// A translator that does not know the key hands it back; a module that wrote a
|
|
28
|
+
// literal rather than a key gets the literal.
|
|
29
|
+
return out && out !== key ? out : (o.translate?.(def.label) ?? def.label);
|
|
30
|
+
};
|
|
31
|
+
const needle = o.q?.trim().toLocaleLowerCase('vi') ?? '';
|
|
32
|
+
const matches = (text) => !needle || text.toLocaleLowerCase('vi').includes(needle);
|
|
33
|
+
const activePath = o.active
|
|
34
|
+
? entries
|
|
35
|
+
.map(([, def]) => def.path)
|
|
36
|
+
.filter((path) => !!path && (o.active === path || o.active.startsWith(`${path.replace(/\/$/, '')}/`)))
|
|
37
|
+
.sort((a, b) => b.length - a.length)[0]
|
|
38
|
+
: undefined;
|
|
39
|
+
const build = (parent, depth) => {
|
|
40
|
+
if (depth > 8)
|
|
41
|
+
return []; // a cycle would otherwise recurse forever
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const [id, def] of (byParent.get(parent) ?? []).sort(order)) {
|
|
44
|
+
if (!permitted(def))
|
|
45
|
+
continue;
|
|
46
|
+
const children = build(id, depth + 1);
|
|
47
|
+
// A heading is only worth showing if something is under it.
|
|
48
|
+
if (!def.path && !children.length)
|
|
49
|
+
continue;
|
|
50
|
+
// A search keeps a branch that matches anywhere along it, so a leaf never
|
|
51
|
+
// arrives without the words that explain where it lives.
|
|
52
|
+
if (needle && !children.length && !matches(label(def)))
|
|
53
|
+
continue;
|
|
54
|
+
const active = (def.path !== undefined && def.path === activePath) || children.some((c) => c.active);
|
|
55
|
+
out.push({ id, label: label(def), path: def.path ?? null, icon: def.icon ?? null, active, children });
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
};
|
|
59
|
+
return build(undefined, 0);
|
|
60
|
+
}
|
|
61
|
+
/** The app a path belongs to: the root whose branch contains it. */
|
|
62
|
+
export function activeApp(tree) {
|
|
63
|
+
return tree.find((n) => n.active) ?? null;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { KetModule } from '../types.ts';
|
|
2
|
+
import type { AppSpec, ModulePath, WorkspaceDeclaration } from './workspace.ts';
|
|
3
|
+
export type ModuleSource = {
|
|
4
|
+
name: string;
|
|
5
|
+
descriptor: string;
|
|
6
|
+
entry: string;
|
|
7
|
+
root: string;
|
|
8
|
+
};
|
|
9
|
+
export type ResolvedModuleInfo = {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
kind: KetModule['kind'];
|
|
13
|
+
source: 'workspace' | string;
|
|
14
|
+
apps: string[];
|
|
15
|
+
};
|
|
16
|
+
export type ResolvedWorkspace = {
|
|
17
|
+
apps: AppSpec[];
|
|
18
|
+
modulePaths: string[];
|
|
19
|
+
modules: ResolvedModuleInfo[];
|
|
20
|
+
};
|
|
21
|
+
export type ResolveWorkspaceOptions = {
|
|
22
|
+
/** URL of the workspace file; relative string roots are resolved beside it. */
|
|
23
|
+
baseUrl: URL;
|
|
24
|
+
/** CLI/environment roots appended to the declaration's roots. */
|
|
25
|
+
extraModulePaths?: ModulePath[];
|
|
26
|
+
/** Development's tsx loader may execute source. Production Node may not. */
|
|
27
|
+
allowSource?: boolean;
|
|
28
|
+
};
|
|
29
|
+
/** Resolve an authored workspace into the object-only shape the runtime accepts. */
|
|
30
|
+
export declare function resolveWorkspace(declaration: WorkspaceDeclaration, options: ResolveWorkspaceOptions): Promise<ResolvedWorkspace>;
|
|
31
|
+
//# sourceMappingURL=modules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/modules.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAkB,OAAO,EAAE,UAAU,EAAa,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAa1G,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;IACvB,MAAM,EAAE,WAAW,GAAG,MAAM,CAAA;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,+EAA+E;IAC/E,OAAO,EAAE,GAAG,CAAA;IACZ,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAA;IAC/B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAyTD,oFAAoF;AACpF,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,oBAAoB,EACjC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAyC5B"}
|