@ketvietlab/ketjs 0.1.2 → 0.1.5
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 +1 -1
- package/README.md +8 -2
- package/dist/agent/capabilities.d.ts +1 -3
- package/dist/agent/capabilities.d.ts.map +1 -1
- package/dist/agent/capabilities.js +10 -1
- package/dist/agent/capabilities.js.map +1 -1
- package/dist/agent/permissions.d.ts +43 -1
- package/dist/agent/permissions.d.ts.map +1 -1
- package/dist/agent/permissions.js +50 -2
- package/dist/agent/permissions.js.map +1 -1
- package/dist/cli.js +246 -97
- package/dist/cli.js.map +1 -1
- package/dist/codegen/dts.d.ts.map +1 -1
- package/dist/codegen/dts.js +1 -0
- package/dist/codegen/dts.js.map +1 -1
- package/dist/data/changeset.d.ts +12 -0
- package/dist/data/changeset.d.ts.map +1 -1
- package/dist/data/changeset.js +73 -17
- package/dist/data/changeset.js.map +1 -1
- package/dist/data/expr.d.ts +25 -1
- package/dist/data/expr.d.ts.map +1 -1
- package/dist/data/expr.js +47 -6
- package/dist/data/expr.js.map +1 -1
- package/dist/data/fleet.d.ts +41 -1
- package/dist/data/fleet.d.ts.map +1 -1
- package/dist/data/fleet.js +100 -11
- package/dist/data/fleet.js.map +1 -1
- package/dist/data/migrate.d.ts +20 -0
- package/dist/data/migrate.d.ts.map +1 -1
- package/dist/data/migrate.js +86 -3
- package/dist/data/migrate.js.map +1 -1
- package/dist/data/physical.d.ts +5 -0
- package/dist/data/physical.d.ts.map +1 -0
- package/dist/data/physical.js +196 -0
- package/dist/data/physical.js.map +1 -0
- package/dist/data/pool.d.ts +2 -1
- package/dist/data/pool.d.ts.map +1 -1
- package/dist/data/pool.js +159 -31
- package/dist/data/pool.js.map +1 -1
- package/dist/data/query.d.ts +10 -1
- package/dist/data/query.d.ts.map +1 -1
- package/dist/data/query.js +136 -27
- package/dist/data/query.js.map +1 -1
- package/dist/data/sqlite.d.ts.map +1 -1
- package/dist/data/sqlite.js +350 -52
- package/dist/data/sqlite.js.map +1 -1
- package/dist/data/time.d.ts +13 -0
- package/dist/data/time.d.ts.map +1 -1
- package/dist/data/time.js +61 -17
- package/dist/data/time.js.map +1 -1
- package/dist/index.d.ts +45 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -18
- package/dist/index.js.map +1 -1
- package/dist/kernel/audit.d.ts +27 -0
- package/dist/kernel/audit.d.ts.map +1 -0
- package/dist/kernel/audit.js +67 -0
- package/dist/kernel/audit.js.map +1 -0
- package/dist/kernel/classification.d.ts +26 -0
- package/dist/kernel/classification.d.ts.map +1 -0
- package/dist/kernel/classification.js +73 -0
- package/dist/kernel/classification.js.map +1 -0
- package/dist/kernel/compose.d.ts +6 -2
- package/dist/kernel/compose.d.ts.map +1 -1
- package/dist/kernel/compose.js +269 -15
- package/dist/kernel/compose.js.map +1 -1
- package/dist/kernel/define.d.ts +2 -3
- package/dist/kernel/define.d.ts.map +1 -1
- package/dist/kernel/define.js +22 -12
- package/dist/kernel/define.js.map +1 -1
- package/dist/kernel/diff.d.ts.map +1 -1
- package/dist/kernel/diff.js +28 -4
- package/dist/kernel/diff.js.map +1 -1
- package/dist/kernel/graph.js +1 -1
- package/dist/kernel/graph.js.map +1 -1
- package/dist/kernel/i18n.d.ts +10 -1
- package/dist/kernel/i18n.d.ts.map +1 -1
- package/dist/kernel/i18n.js +34 -1
- package/dist/kernel/i18n.js.map +1 -1
- package/dist/kernel/layout.d.ts +97 -0
- package/dist/kernel/layout.d.ts.map +1 -1
- package/dist/kernel/layout.js +294 -12
- package/dist/kernel/layout.js.map +1 -1
- package/dist/kernel/menu.d.ts +33 -2
- package/dist/kernel/menu.d.ts.map +1 -1
- package/dist/kernel/menu.js +99 -7
- package/dist/kernel/menu.js.map +1 -1
- package/dist/kernel/modules.d.ts +3 -3
- package/dist/kernel/modules.d.ts.map +1 -1
- package/dist/kernel/modules.js +21 -21
- package/dist/kernel/modules.js.map +1 -1
- package/dist/kernel/permissions.d.ts +10 -0
- package/dist/kernel/permissions.d.ts.map +1 -0
- package/dist/kernel/permissions.js +365 -0
- package/dist/kernel/permissions.js.map +1 -0
- package/dist/kernel/schedule.d.ts +23 -0
- package/dist/kernel/schedule.d.ts.map +1 -0
- package/dist/kernel/schedule.js +83 -0
- package/dist/kernel/schedule.js.map +1 -0
- package/dist/kernel/types.d.ts.map +1 -1
- package/dist/kernel/types.js +5 -4
- package/dist/kernel/types.js.map +1 -1
- package/dist/kernel/workspace.d.ts +92 -14
- package/dist/kernel/workspace.d.ts.map +1 -1
- package/dist/kernel/workspace.js +128 -49
- package/dist/kernel/workspace.js.map +1 -1
- package/dist/pdf/assets/Inter-Bold.ttf +0 -0
- package/dist/pdf/assets/Inter-Regular.ttf +0 -0
- package/dist/pdf/assets/Inter-SemiBold.ttf +0 -0
- package/dist/pdf/assets/LICENSE.txt +92 -0
- package/dist/pdf/font.d.ts +10 -0
- package/dist/pdf/font.d.ts.map +1 -0
- package/dist/pdf/font.js +83 -0
- package/dist/pdf/font.js.map +1 -0
- package/dist/pdf/image.d.ts +8 -0
- package/dist/pdf/image.d.ts.map +1 -0
- package/dist/pdf/image.js +94 -0
- package/dist/pdf/image.js.map +1 -0
- package/dist/pdf/index.d.ts +15 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +17 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/markup.d.ts +19 -0
- package/dist/pdf/markup.d.ts.map +1 -0
- package/dist/pdf/markup.js +146 -0
- package/dist/pdf/markup.js.map +1 -0
- package/dist/pdf/render.d.ts +14 -0
- package/dist/pdf/render.d.ts.map +1 -0
- package/dist/pdf/render.js +387 -0
- package/dist/pdf/render.js.map +1 -0
- package/dist/scaffold/index.js +6 -6
- package/dist/scaffold/index.js.map +1 -1
- package/dist/scaffold/templates/{app.test.ts.tmpl → deployment.test.ts.tmpl} +3 -3
- package/dist/scaffold/templates/ket.workspace.ts.tmpl +4 -6
- package/dist/scaffold/templates/module.ts.tmpl +1 -4
- package/dist/server/assets.d.ts +23 -0
- package/dist/server/assets.d.ts.map +1 -0
- package/dist/server/assets.js +97 -0
- package/dist/server/assets.js.map +1 -0
- package/dist/server/boot.d.ts +174 -38
- package/dist/server/boot.d.ts.map +1 -1
- package/dist/server/boot.js +399 -140
- package/dist/server/boot.js.map +1 -1
- package/dist/server/config.d.ts +30 -10
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +73 -17
- package/dist/server/config.js.map +1 -1
- package/dist/server/ctx.d.ts +10 -0
- package/dist/server/ctx.d.ts.map +1 -1
- package/dist/server/ctx.js +284 -48
- package/dist/server/ctx.js.map +1 -1
- package/dist/server/development.d.ts +10 -0
- package/dist/server/development.d.ts.map +1 -0
- package/dist/server/development.js +15 -0
- package/dist/server/development.js.map +1 -0
- package/dist/server/fn.d.ts +22 -3
- package/dist/server/fn.d.ts.map +1 -1
- package/dist/server/fn.js +116 -32
- package/dist/server/fn.js.map +1 -1
- package/dist/server/form.d.ts +33 -0
- package/dist/server/form.d.ts.map +1 -0
- package/dist/server/form.js +47 -0
- package/dist/server/form.js.map +1 -0
- package/dist/server/http.d.ts +82 -3
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +373 -37
- package/dist/server/http.js.map +1 -1
- package/dist/server/idem.d.ts +3 -2
- package/dist/server/idem.d.ts.map +1 -1
- package/dist/server/idem.js +12 -4
- package/dist/server/idem.js.map +1 -1
- package/dist/server/jobs.js +1 -1
- package/dist/server/jobs.js.map +1 -1
- package/dist/server/log/combinators.d.ts +42 -0
- package/dist/server/log/combinators.d.ts.map +1 -0
- package/dist/server/log/combinators.js +270 -0
- package/dist/server/log/combinators.js.map +1 -0
- package/dist/server/log/console.d.ts +12 -0
- package/dist/server/log/console.d.ts.map +1 -0
- package/dist/server/log/console.js +96 -0
- package/dist/server/log/console.js.map +1 -0
- package/dist/server/log/file.d.ts +11 -0
- package/dist/server/log/file.d.ts.map +1 -0
- package/dist/server/log/file.js +61 -0
- package/dist/server/log/file.js.map +1 -0
- package/dist/server/log/index.d.ts +23 -0
- package/dist/server/log/index.d.ts.map +1 -0
- package/dist/server/log/index.js +45 -0
- package/dist/server/log/index.js.map +1 -0
- package/dist/server/log/logger.d.ts +53 -0
- package/dist/server/log/logger.d.ts.map +1 -0
- package/dist/server/log/logger.js +94 -0
- package/dist/server/log/logger.js.map +1 -0
- package/dist/server/log/memory.d.ts +11 -0
- package/dist/server/log/memory.d.ts.map +1 -0
- package/dist/server/log/memory.js +25 -0
- package/dist/server/log/memory.js.map +1 -0
- package/dist/server/log/types.d.ts +112 -0
- package/dist/server/log/types.d.ts.map +1 -0
- package/dist/server/log/types.js +58 -0
- package/dist/server/log/types.js.map +1 -0
- package/dist/server/policy.d.ts +29 -0
- package/dist/server/policy.d.ts.map +1 -0
- package/dist/server/policy.js +29 -0
- package/dist/server/policy.js.map +1 -0
- package/dist/server/queue.d.ts +1 -1
- package/dist/server/queue.d.ts.map +1 -1
- package/dist/server/queue.js.map +1 -1
- package/dist/server/ratelimit.d.ts +48 -0
- package/dist/server/ratelimit.d.ts.map +1 -0
- package/dist/server/ratelimit.js +102 -0
- package/dist/server/ratelimit.js.map +1 -0
- package/dist/server/respond.d.ts.map +1 -1
- package/dist/server/respond.js +16 -1
- package/dist/server/respond.js.map +1 -1
- package/dist/server/runtime.d.ts +18 -3
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +32 -2
- package/dist/server/runtime.js.map +1 -1
- package/dist/server/schedule.d.ts +18 -0
- package/dist/server/schedule.d.ts.map +1 -0
- package/dist/server/schedule.js +70 -0
- package/dist/server/schedule.js.map +1 -0
- package/dist/server/sequence.d.ts +42 -0
- package/dist/server/sequence.d.ts.map +1 -0
- package/dist/server/sequence.js +97 -0
- package/dist/server/sequence.js.map +1 -0
- package/dist/server/session.d.ts +21 -0
- package/dist/server/session.d.ts.map +1 -1
- package/dist/server/session.js +84 -10
- package/dist/server/session.js.map +1 -1
- package/dist/server/sessionstore.d.ts +3 -1
- package/dist/server/sessionstore.d.ts.map +1 -1
- package/dist/server/sessionstore.js +7 -3
- package/dist/server/sessionstore.js.map +1 -1
- package/dist/server/storage/index.d.ts +1 -1
- package/dist/server/storage/index.d.ts.map +1 -1
- package/dist/server/storage/index.js +61 -1
- package/dist/server/storage/index.js.map +1 -1
- package/dist/server/storage/types.d.ts +8 -0
- package/dist/server/storage/types.d.ts.map +1 -1
- package/dist/server/storage/types.js +58 -0
- package/dist/server/storage/types.js.map +1 -1
- package/dist/server/stream.d.ts +8 -2
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/stream.js +44 -4
- package/dist/server/stream.js.map +1 -1
- package/dist/server/streamstore.d.ts +10 -0
- package/dist/server/streamstore.d.ts.map +1 -1
- package/dist/server/streamstore.js +72 -6
- package/dist/server/streamstore.js.map +1 -1
- package/dist/server/tenants.d.ts +20 -18
- package/dist/server/tenants.d.ts.map +1 -1
- package/dist/server/tenants.js +133 -84
- package/dist/server/tenants.js.map +1 -1
- package/dist/server/transport/types.js +2 -2
- package/dist/server/transport/types.js.map +1 -1
- package/dist/server/worker.d.ts +19 -3
- package/dist/server/worker.d.ts.map +1 -1
- package/dist/server/worker.js +168 -21
- package/dist/server/worker.js.map +1 -1
- package/dist/testing.d.ts +26 -10
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -14
- package/dist/testing.js.map +1 -1
- package/dist/theme/contracts.d.ts +14 -1
- package/dist/theme/contracts.d.ts.map +1 -1
- package/dist/theme/contracts.js +35 -6
- package/dist/theme/contracts.js.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/joint-runtime.d.ts +33 -0
- package/dist/theme/joint-runtime.d.ts.map +1 -0
- package/dist/theme/joint-runtime.js +121 -0
- package/dist/theme/joint-runtime.js.map +1 -0
- package/dist/theme/joints.d.ts.map +1 -1
- package/dist/theme/joints.js +15 -97
- package/dist/theme/joints.js.map +1 -1
- package/dist/theme/ktl/compile.d.ts +4 -0
- package/dist/theme/ktl/compile.d.ts.map +1 -1
- package/dist/theme/ktl/compile.js +54 -1
- package/dist/theme/ktl/compile.js.map +1 -1
- package/dist/theme/ktl/parser.d.ts +4 -0
- package/dist/theme/ktl/parser.d.ts.map +1 -1
- package/dist/theme/ktl/parser.js +8 -0
- package/dist/theme/ktl/parser.js.map +1 -1
- package/dist/theme/render.d.ts +8 -0
- package/dist/theme/render.d.ts.map +1 -1
- package/dist/theme/render.js +88 -118
- package/dist/theme/render.js.map +1 -1
- package/dist/theme/tokens.d.ts +18 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +33 -0
- package/dist/theme/tokens.js.map +1 -1
- package/dist/theme/viewmodel.d.ts +24 -0
- package/dist/theme/viewmodel.d.ts.map +1 -1
- package/dist/theme/viewmodel.js +75 -6
- package/dist/theme/viewmodel.js.map +1 -1
- package/dist/types.d.ts +320 -56
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
- package/dist/kernel/apps.d.ts +0 -43
- package/dist/kernel/apps.d.ts.map +0 -1
- package/dist/kernel/apps.js +0 -234
- package/dist/kernel/apps.js.map +0 -1
package/dist/kernel/layout.js
CHANGED
|
@@ -2,10 +2,21 @@
|
|
|
2
2
|
//
|
|
3
3
|
// This is the payoff for making sections data rather than code: what an agent
|
|
4
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,
|
|
6
|
-
// of the wrong shape
|
|
7
|
-
// a list is what an agent can
|
|
5
|
+
// theme renders from. A bad section type, a missing required setting, a setting
|
|
6
|
+
// of the wrong shape, a child in a slot that does not accept it - all caught
|
|
7
|
+
// here, as a list rather than an exception, because a list is what an agent can
|
|
8
|
+
// act on.
|
|
8
9
|
import { isDateText, parseType } from './types.js';
|
|
10
|
+
/** A page is a page, not a filesystem: deep enough for real work, and bounded. */
|
|
11
|
+
export const MAX_LAYOUT_DEPTH = 6;
|
|
12
|
+
/**
|
|
13
|
+
* Nodes in the whole tree, not placements at the top.
|
|
14
|
+
*
|
|
15
|
+
* The old ceiling was a hundred top-level placements. Counting the tree instead
|
|
16
|
+
* keeps the same number honest: without it, a hundred containers each holding a
|
|
17
|
+
* hundred children would pass a check that was written to bound a page.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_LAYOUT_NODES = 100;
|
|
9
20
|
const JS_OF = {
|
|
10
21
|
id: 'string',
|
|
11
22
|
text: 'string',
|
|
@@ -17,18 +28,55 @@ const JS_OF = {
|
|
|
17
28
|
datetime: 'string',
|
|
18
29
|
json: 'object',
|
|
19
30
|
};
|
|
31
|
+
const slotsOf = (placement) => {
|
|
32
|
+
const slots = placement.slots;
|
|
33
|
+
if (!slots || typeof slots !== 'object' || Array.isArray(slots))
|
|
34
|
+
return [];
|
|
35
|
+
return Object.entries(slots).map(([name, children]) => [name, Array.isArray(children) ? children : []]);
|
|
36
|
+
};
|
|
37
|
+
/** Every placement in the tree, parents before children. */
|
|
38
|
+
export const walkPlacements = function* (layout, path = '') {
|
|
39
|
+
for (let at = 0; at < layout.length; at += 1) {
|
|
40
|
+
const placement = layout[at];
|
|
41
|
+
const here = path ? `${path}.${at}` : String(at);
|
|
42
|
+
yield { placement, at, path: here };
|
|
43
|
+
if (!placement || typeof placement !== 'object')
|
|
44
|
+
continue;
|
|
45
|
+
for (const [slot, children] of slotsOf(placement))
|
|
46
|
+
yield* walkPlacements(children, `${here}.${slot}`);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export const countPlacements = (layout) => {
|
|
50
|
+
let total = 0;
|
|
51
|
+
for (const _ of walkPlacements(layout))
|
|
52
|
+
total += 1;
|
|
53
|
+
return total;
|
|
54
|
+
};
|
|
20
55
|
export function validateLayout(manifest, layout) {
|
|
21
|
-
const errors = [];
|
|
22
56
|
if (!Array.isArray(layout)) {
|
|
23
57
|
return {
|
|
24
58
|
ok: false,
|
|
25
59
|
errors: [{ at: -1, type: '(layout)', message: 'a layout must be an array of section placements' }],
|
|
26
60
|
};
|
|
27
61
|
}
|
|
62
|
+
const errors = [];
|
|
63
|
+
const nodes = countPlacements(layout);
|
|
64
|
+
if (nodes > MAX_LAYOUT_NODES)
|
|
65
|
+
errors.push({
|
|
66
|
+
at: -1,
|
|
67
|
+
type: '(layout)',
|
|
68
|
+
message: `holds ${nodes} sections, and a page may hold ${MAX_LAYOUT_NODES}`,
|
|
69
|
+
});
|
|
70
|
+
validateInto(manifest, layout, errors, '', 1);
|
|
71
|
+
return { ok: errors.length === 0, errors };
|
|
72
|
+
}
|
|
73
|
+
const validateInto = (manifest, layout, errors, path, depth) => {
|
|
28
74
|
layout.forEach((raw, at) => {
|
|
75
|
+
const here = path ? `${path}.${at}` : String(at);
|
|
76
|
+
const nested = path ? { path: here } : {};
|
|
29
77
|
const placement = raw;
|
|
30
78
|
if (!placement || typeof placement.type !== 'string') {
|
|
31
|
-
errors.push({ at, type: '(unknown)', message: 'each placement needs a "type"' });
|
|
79
|
+
errors.push({ at, type: '(unknown)', ...nested, message: 'each placement needs a "type"' });
|
|
32
80
|
return;
|
|
33
81
|
}
|
|
34
82
|
const section = manifest.sections[placement.type];
|
|
@@ -36,7 +84,8 @@ export function validateLayout(manifest, layout) {
|
|
|
36
84
|
errors.push({
|
|
37
85
|
at,
|
|
38
86
|
type: placement.type,
|
|
39
|
-
|
|
87
|
+
...nested,
|
|
88
|
+
message: `no composed module provides this section (available: ${Object.keys(manifest.sections).join(', ') || 'none'})`,
|
|
40
89
|
});
|
|
41
90
|
return;
|
|
42
91
|
}
|
|
@@ -47,17 +96,29 @@ export function validateLayout(manifest, layout) {
|
|
|
47
96
|
const value = settings[field];
|
|
48
97
|
if (value == null) {
|
|
49
98
|
if (t.ok && !t.optional)
|
|
50
|
-
errors.push({ at, type: placement.type, field, message: `is required (${spec})` });
|
|
99
|
+
errors.push({ at, type: placement.type, field, ...nested, message: `is required (${spec})` });
|
|
51
100
|
continue;
|
|
52
101
|
}
|
|
53
102
|
if (!t.ok)
|
|
54
103
|
continue;
|
|
55
104
|
const want = JS_OF[t.base];
|
|
56
105
|
if (want && typeof value !== want) {
|
|
57
|
-
errors.push({
|
|
106
|
+
errors.push({
|
|
107
|
+
at,
|
|
108
|
+
type: placement.type,
|
|
109
|
+
field,
|
|
110
|
+
...nested,
|
|
111
|
+
message: `expects ${t.base}, got ${typeof value}`,
|
|
112
|
+
});
|
|
58
113
|
}
|
|
59
114
|
else if (t.base === 'date' && !isDateText(value)) {
|
|
60
|
-
errors.push({
|
|
115
|
+
errors.push({
|
|
116
|
+
at,
|
|
117
|
+
type: placement.type,
|
|
118
|
+
field,
|
|
119
|
+
...nested,
|
|
120
|
+
message: 'expects date in YYYY-MM-DD format',
|
|
121
|
+
});
|
|
61
122
|
}
|
|
62
123
|
}
|
|
63
124
|
for (const field of Object.keys(settings)) {
|
|
@@ -66,12 +127,233 @@ export function validateLayout(manifest, layout) {
|
|
|
66
127
|
at,
|
|
67
128
|
type: placement.type,
|
|
68
129
|
field,
|
|
130
|
+
...nested,
|
|
69
131
|
message: `is not a setting of this section (accepted: ${Object.keys(schema).join(', ') || 'none'})`,
|
|
70
132
|
});
|
|
71
133
|
}
|
|
72
134
|
}
|
|
135
|
+
validateSlots(manifest, placement, section.slots ?? {}, errors, at, here, depth);
|
|
73
136
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
137
|
+
};
|
|
138
|
+
const validateSlots = (manifest, placement, declared, errors, at, here, depth) => {
|
|
139
|
+
for (const [slot, children] of slotsOf(placement)) {
|
|
140
|
+
const rule = declared[slot];
|
|
141
|
+
if (!rule) {
|
|
142
|
+
// A section that declares no slot for this name cannot hold anything
|
|
143
|
+
// under it. Silently dropping the children would lose an author's work
|
|
144
|
+
// between the save and the render.
|
|
145
|
+
errors.push({
|
|
146
|
+
at,
|
|
147
|
+
type: placement.type,
|
|
148
|
+
field: slot,
|
|
149
|
+
path: `${here}.${slot}`,
|
|
150
|
+
message: `is not a slot of this section (accepted: ${Object.keys(declared).join(', ') || 'none'})`,
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (depth >= MAX_LAYOUT_DEPTH && children.length) {
|
|
155
|
+
errors.push({
|
|
156
|
+
at,
|
|
157
|
+
type: placement.type,
|
|
158
|
+
field: slot,
|
|
159
|
+
path: `${here}.${slot}`,
|
|
160
|
+
message: `nests deeper than ${MAX_LAYOUT_DEPTH} levels`,
|
|
161
|
+
});
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (rule.max != null && children.length > rule.max) {
|
|
165
|
+
errors.push({
|
|
166
|
+
at,
|
|
167
|
+
type: placement.type,
|
|
168
|
+
field: slot,
|
|
169
|
+
path: `${here}.${slot}`,
|
|
170
|
+
message: `holds ${children.length} sections, and this slot takes ${rule.max}`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (rule.accepts) {
|
|
174
|
+
const allowed = new Set(rule.accepts);
|
|
175
|
+
children.forEach((child, childAt) => {
|
|
176
|
+
const type = child?.type;
|
|
177
|
+
if (typeof type === 'string' && !allowed.has(type))
|
|
178
|
+
errors.push({
|
|
179
|
+
at: childAt,
|
|
180
|
+
type,
|
|
181
|
+
path: `${here}.${slot}.${childAt}`,
|
|
182
|
+
message: `is not accepted by slot "${slot}" (accepted: ${rule.accepts?.join(', ')})`,
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
validateInto(manifest, children, errors, `${here}.${slot}`, depth + 1);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
export const formatLayoutErrors = (errors) => errors.map((e) => ` [${e.path ?? e.at}] ${e.type}${e.field ? '.' + e.field : ''} ${e.message}`).join('\n');
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
// Placement identity
|
|
192
|
+
//
|
|
193
|
+
// A layout used to be an ordered array and nothing else, so a saved revision
|
|
194
|
+
// could not say whether a section had moved or had been deleted and a new one
|
|
195
|
+
// added in its place. Everything an editor needs downstream - undo, a diff
|
|
196
|
+
// between two revisions, a conflict that says what conflicted - rests on being
|
|
197
|
+
// able to answer that, and none of it can be recovered from position alone.
|
|
198
|
+
//
|
|
199
|
+
// The id lives beside `type` rather than inside `settings`: it is not something
|
|
200
|
+
// a section declares or a theme renders, and putting it in `settings` would
|
|
201
|
+
// make it collide with a real setting and fail validation.
|
|
202
|
+
/** How long a derived id is. Long enough not to collide, short enough to read. */
|
|
203
|
+
const DERIVED_ID_LENGTH = 16;
|
|
204
|
+
const canonical = (value) => {
|
|
205
|
+
if (value === null || typeof value !== 'object')
|
|
206
|
+
return JSON.stringify(value) ?? 'null';
|
|
207
|
+
if (Array.isArray(value))
|
|
208
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
209
|
+
const entries = Object.entries(value)
|
|
210
|
+
.filter(([, v]) => v !== undefined)
|
|
211
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
212
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(',')}}`;
|
|
213
|
+
};
|
|
214
|
+
/** A placement id is opaque, but it has to survive a round trip through JSON. */
|
|
215
|
+
export const isPlacementId = (value) => typeof value === 'string' && /^[A-Za-z0-9_-]{8,64}$/.test(value);
|
|
216
|
+
/**
|
|
217
|
+
* Give every placement in the tree an id, deriving one only where none exists.
|
|
218
|
+
*
|
|
219
|
+
* Derived from the content, not the position, and disambiguated by how many
|
|
220
|
+
* identical placements came before it. Deriving from the index instead would
|
|
221
|
+
* mean that the first save after a reorder - the one that turns legacy content
|
|
222
|
+
* into identified content - renamed everything it touched, which is precisely
|
|
223
|
+
* the case the id exists to distinguish.
|
|
224
|
+
*
|
|
225
|
+
* A subtree is part of what a container says, so the derivation walks children
|
|
226
|
+
* first and folds their ids in: two containers holding different things are
|
|
227
|
+
* different containers, even when their own settings match.
|
|
228
|
+
*
|
|
229
|
+
* An id already present is never replaced, so identity survives every later
|
|
230
|
+
* save regardless of what this function would have derived.
|
|
231
|
+
*/
|
|
232
|
+
export const withPlacementIds = (layout, digest, seen = new Map()) => layout.map((placement) => {
|
|
233
|
+
const slots = slotsOf(placement);
|
|
234
|
+
const identified = {};
|
|
235
|
+
for (const [slot, children] of slots)
|
|
236
|
+
identified[slot] = withPlacementIds(children, digest, seen);
|
|
237
|
+
const withSlots = slots.length ? { ...placement, slots: identified } : { ...placement };
|
|
238
|
+
const existing = placement.id;
|
|
239
|
+
if (isPlacementId(existing))
|
|
240
|
+
return { ...withSlots, id: existing };
|
|
241
|
+
const childIds = slots.flatMap(([slot, _]) => (identified[slot] ?? []).map((child) => `${slot}:${child.id}`));
|
|
242
|
+
const fingerprint = `${placement.type} ${canonical(placement.settings ?? {})} ${childIds.join(',')}`;
|
|
243
|
+
const ordinal = seen.get(fingerprint) ?? 0;
|
|
244
|
+
seen.set(fingerprint, ordinal + 1);
|
|
245
|
+
return { ...withSlots, id: digest(`${fingerprint} ${ordinal}`).slice(0, DERIVED_ID_LENGTH) };
|
|
246
|
+
});
|
|
247
|
+
/** Ids a layout cannot have: malformed, or the same one twice anywhere in it. */
|
|
248
|
+
export const placementIdErrors = (layout) => {
|
|
249
|
+
const errors = [];
|
|
250
|
+
const seen = new Set();
|
|
251
|
+
for (const { placement, at, path } of walkPlacements(layout)) {
|
|
252
|
+
const id = placement?.id;
|
|
253
|
+
if (id === undefined)
|
|
254
|
+
continue;
|
|
255
|
+
const where = path.includes('.') ? { path } : {};
|
|
256
|
+
if (!isPlacementId(id)) {
|
|
257
|
+
errors.push({
|
|
258
|
+
at,
|
|
259
|
+
type: placement?.type ?? '(unknown)',
|
|
260
|
+
field: 'id',
|
|
261
|
+
...where,
|
|
262
|
+
message: 'is not a placement id',
|
|
263
|
+
});
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (seen.has(id))
|
|
267
|
+
errors.push({
|
|
268
|
+
at,
|
|
269
|
+
type: placement?.type ?? '(unknown)',
|
|
270
|
+
field: 'id',
|
|
271
|
+
...where,
|
|
272
|
+
// Two placements sharing an id make every later diff ambiguous, so this
|
|
273
|
+
// is refused at the write rather than resolved by guessing at the read.
|
|
274
|
+
// Uniqueness is across the whole tree, not per level: a diff keyed on
|
|
275
|
+
// id has no level to disambiguate with.
|
|
276
|
+
message: 'is already used by another placement in this layout',
|
|
277
|
+
});
|
|
278
|
+
seen.add(id);
|
|
279
|
+
}
|
|
280
|
+
return errors;
|
|
281
|
+
};
|
|
282
|
+
const changedSettings = (before, after) => {
|
|
283
|
+
const a = (before ?? {});
|
|
284
|
+
const b = (after ?? {});
|
|
285
|
+
const names = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
286
|
+
return [...names].filter((name) => canonical(a[name]) !== canonical(b[name])).sort();
|
|
287
|
+
};
|
|
288
|
+
/**
|
|
289
|
+
* What changed between two layouts, said per placement rather than per index.
|
|
290
|
+
*
|
|
291
|
+
* The walk is the whole tree, so a setting changed six levels down is reported
|
|
292
|
+
* on the node that changed. Comparing only the top level would have folded a
|
|
293
|
+
* subtree edit into "the container's settings are the same" and said nothing.
|
|
294
|
+
*
|
|
295
|
+
* Only placements carrying ids can be compared this way. Anything without one
|
|
296
|
+
* is reported as removed and added, which is the truthful answer: with no id
|
|
297
|
+
* there is no evidence the two are the same section.
|
|
298
|
+
*/
|
|
299
|
+
export const diffPlacements = (before, after) => {
|
|
300
|
+
const index = (layout) => {
|
|
301
|
+
const map = new Map();
|
|
302
|
+
for (const entry of walkPlacements(layout)) {
|
|
303
|
+
const id = entry.placement?.id;
|
|
304
|
+
if (isPlacementId(id))
|
|
305
|
+
map.set(id, entry);
|
|
306
|
+
}
|
|
307
|
+
return map;
|
|
308
|
+
};
|
|
309
|
+
const from = index(before);
|
|
310
|
+
const to = index(after);
|
|
311
|
+
const changes = [];
|
|
312
|
+
for (const [id, entry] of from)
|
|
313
|
+
if (!to.has(id))
|
|
314
|
+
changes.push({ id, type: entry.placement.type, change: 'removed', at: entry.at, path: entry.path });
|
|
315
|
+
for (const [id, entry] of to) {
|
|
316
|
+
const previous = from.get(id);
|
|
317
|
+
if (!previous) {
|
|
318
|
+
changes.push({ id, type: entry.placement.type, change: 'added', at: entry.at, path: entry.path });
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (previous.placement.type !== entry.placement.type) {
|
|
322
|
+
// A placement that changed type is a different section wearing the same
|
|
323
|
+
// id. Reported on its own so a reviewer never reads it as an edit.
|
|
324
|
+
changes.push({
|
|
325
|
+
id,
|
|
326
|
+
type: entry.placement.type,
|
|
327
|
+
change: 'retyped',
|
|
328
|
+
at: entry.at,
|
|
329
|
+
path: entry.path,
|
|
330
|
+
from: previous.placement.type,
|
|
331
|
+
});
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const fields = changedSettings(previous.placement.settings, entry.placement.settings);
|
|
335
|
+
if (fields.length)
|
|
336
|
+
changes.push({
|
|
337
|
+
id,
|
|
338
|
+
type: entry.placement.type,
|
|
339
|
+
change: 'settings',
|
|
340
|
+
at: entry.at,
|
|
341
|
+
path: entry.path,
|
|
342
|
+
fields,
|
|
343
|
+
});
|
|
344
|
+
// The path carries the slot and every ancestor, so a section dragged into
|
|
345
|
+
// a different container reads as one move rather than as a removal from
|
|
346
|
+
// one place and an arrival somewhere else.
|
|
347
|
+
if (previous.path !== entry.path)
|
|
348
|
+
changes.push({
|
|
349
|
+
id,
|
|
350
|
+
type: entry.placement.type,
|
|
351
|
+
change: 'moved',
|
|
352
|
+
at: entry.at,
|
|
353
|
+
path: entry.path,
|
|
354
|
+
from: previous.path,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return changes.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
358
|
+
};
|
|
77
359
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/layout.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/layout.ts"],"names":[],"mappings":"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"}
|
package/dist/kernel/menu.d.ts
CHANGED
|
@@ -6,6 +6,11 @@ export type MenuNode = {
|
|
|
6
6
|
icon: string | null;
|
|
7
7
|
/** True for the node whose path is showing, and for every heading above it. */
|
|
8
8
|
active: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* True when this viewer may open the entry but the entry is not their work.
|
|
11
|
+
* The shell leaves these out of the main list; search still finds them.
|
|
12
|
+
*/
|
|
13
|
+
secondary: boolean;
|
|
9
14
|
children: MenuNode[];
|
|
10
15
|
};
|
|
11
16
|
export type MenuOptions = {
|
|
@@ -13,6 +18,8 @@ export type MenuOptions = {
|
|
|
13
18
|
allow?: readonly string[] | null;
|
|
14
19
|
/** Resolves a label. Given a key it does not know, it should return it unchanged. */
|
|
15
20
|
translate?: (key: string) => string;
|
|
21
|
+
/** The locale the labels come back in, so equal sequences sort the way it reads. */
|
|
22
|
+
locale?: string;
|
|
16
23
|
/** The path currently showing, used to mark the branch leading to it. */
|
|
17
24
|
active?: string;
|
|
18
25
|
/**
|
|
@@ -20,8 +27,32 @@ export type MenuOptions = {
|
|
|
20
27
|
* does, so filtering never orphans a leaf from the words above it.
|
|
21
28
|
*/
|
|
22
29
|
q?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Mark entries this viewer may open but does not work on. Off by default:
|
|
32
|
+
* a caller that does not ask for the distinction gets the tree it always got.
|
|
33
|
+
*
|
|
34
|
+
* A viewer nothing is primary for keeps the whole permitted tree. An empty
|
|
35
|
+
* sidebar reads as a broken deployment, and telling a night auditor their
|
|
36
|
+
* work is nowhere is worse than showing them one screen too many.
|
|
37
|
+
*/
|
|
38
|
+
intent?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The deployment's own grouping, applied before anything else is decided.
|
|
41
|
+
*
|
|
42
|
+
* Named entries move under the declared heading; the rest keep the heading
|
|
43
|
+
* their module gave them. A heading whose entries are all filtered away
|
|
44
|
+
* disappears like any other empty heading.
|
|
45
|
+
*/
|
|
46
|
+
groups?: ReadonlyArray<{
|
|
47
|
+
id: string;
|
|
48
|
+
label: string;
|
|
49
|
+
icon?: string;
|
|
50
|
+
items: readonly string[];
|
|
51
|
+
}>;
|
|
52
|
+
/** Menu ids to keep out of the main list whatever `for` says. */
|
|
53
|
+
demote?: readonly string[];
|
|
23
54
|
};
|
|
24
55
|
export declare function buildMenu(manifest: Manifest, o?: MenuOptions): MenuNode[];
|
|
25
|
-
/** The
|
|
26
|
-
export declare function
|
|
56
|
+
/** The root navigation section a path belongs to. */
|
|
57
|
+
export declare function activeMenuRoot(tree: MenuNode[]): MenuNode | null;
|
|
27
58
|
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"AAWA,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;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,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,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,CAAA;IACV;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC9F,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3B,CAAA;AAoED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,GAAE,WAAgB,GAAG,QAAQ,EAAE,CA6F7E;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAI,CAEhE"}
|
package/dist/kernel/menu.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// The navigation tree, as one viewer sees it.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// what the deployment ships, what this database has switched on, and what this
|
|
3
|
+
// Two filters, applied in this order: what the deployment composes and what this
|
|
5
4
|
// viewer may call. The last is the one that matters most — a menu offering what it
|
|
6
5
|
// cannot deliver is a menu that lies, and the 401 arrives after the click rather
|
|
7
6
|
// than instead of it.
|
|
@@ -9,9 +8,65 @@
|
|
|
9
8
|
// A heading with nothing left under it disappears with its children. An empty
|
|
10
9
|
// section is worse than a missing one: it reads as "this is broken" rather than
|
|
11
10
|
// "this is not for you".
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
/**
|
|
12
|
+
* The menu as this deployment arranges it.
|
|
13
|
+
*
|
|
14
|
+
* Regrouping happens on the declarations rather than on the built tree, so
|
|
15
|
+
* permission, intent, search and active-branch logic all keep working on one
|
|
16
|
+
* shape.
|
|
17
|
+
*
|
|
18
|
+
* Declaration order wins, for the groups and for the entries inside them. The
|
|
19
|
+
* first version of this inherited each group's position from the earliest entry
|
|
20
|
+
* it claimed, on the theory that module authors had already thought about order.
|
|
21
|
+
* They had — but within headings that regrouping dissolves. `sequence` 10 under
|
|
22
|
+
* "Operations" and `sequence` 10 under "Housekeeping" never had to compare, and
|
|
23
|
+
* once both headings are gone they compare as a tie broken by the alphabet. A
|
|
24
|
+
* hotel that listed its shifts in the order a shift runs got them back sorted by
|
|
25
|
+
* first letter.
|
|
26
|
+
*/
|
|
27
|
+
const regrouped = (manifest, groups) => {
|
|
14
28
|
const entries = Object.entries(manifest.menus);
|
|
29
|
+
if (!groups?.length)
|
|
30
|
+
return entries;
|
|
31
|
+
const claimed = new Map();
|
|
32
|
+
for (const [index, group] of groups.entries())
|
|
33
|
+
for (const [place, item] of group.items.entries())
|
|
34
|
+
claimed.set(item, { id: group.id, label: group.label, icon: group.icon, order: index, place });
|
|
35
|
+
const byId = new Map(entries);
|
|
36
|
+
// Spaced like module sequences so a declared group still interleaves sensibly
|
|
37
|
+
// with a heading the deployment left alone.
|
|
38
|
+
const groupSequence = (index) => (index + 1) * 10;
|
|
39
|
+
const out = [];
|
|
40
|
+
const seen = new Set();
|
|
41
|
+
for (const [id, def] of entries) {
|
|
42
|
+
const group = claimed.get(id);
|
|
43
|
+
if (!group) {
|
|
44
|
+
out.push([id, def]);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (!seen.has(group.id)) {
|
|
48
|
+
seen.add(group.id);
|
|
49
|
+
out.push([
|
|
50
|
+
group.id,
|
|
51
|
+
{
|
|
52
|
+
by: def.by,
|
|
53
|
+
label: group.label,
|
|
54
|
+
...(group.icon ? { icon: group.icon } : {}),
|
|
55
|
+
// The declared group stands where the module's heading stood, so a
|
|
56
|
+
// regrouped sidebar sits at the same level as the one it replaces.
|
|
57
|
+
// An entry hanging straight off a root has no heading to replace, and
|
|
58
|
+
// the group becomes that root's first heading instead.
|
|
59
|
+
parent: def.parent ? (byId.get(def.parent)?.parent ?? def.parent) : undefined,
|
|
60
|
+
sequence: groupSequence(group.order),
|
|
61
|
+
},
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
out.push([id, { ...def, parent: group.id, sequence: group.place }]);
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
};
|
|
68
|
+
export function buildMenu(manifest, o = {}) {
|
|
69
|
+
const entries = regrouped(manifest, o.groups);
|
|
15
70
|
const byParent = new Map();
|
|
16
71
|
for (const e of entries) {
|
|
17
72
|
const list = byParent.get(e[1].parent) ?? [];
|
|
@@ -21,6 +76,13 @@ export function buildMenu(manifest, o = {}) {
|
|
|
21
76
|
// Two reasons an entry does not appear: the function it leads to is not in this
|
|
22
77
|
// build at all, or it is and this viewer may not call it.
|
|
23
78
|
const permitted = (def) => !def.needs || (!!manifest.functions[def.needs] && (!o.allow || o.allow.includes(def.needs)));
|
|
79
|
+
// `for` is about this viewer, not about this build: an entry naming a write
|
|
80
|
+
// the deployment does not compose is a declaration to fix, not a reason to
|
|
81
|
+
// demote the entry for everyone.
|
|
82
|
+
const demoted = new Set(o.demote ?? []);
|
|
83
|
+
let applyIntent = o.intent === true;
|
|
84
|
+
const intended = (id, def) => !applyIntent ||
|
|
85
|
+
(!demoted.has(id) && (!def.for?.length || def.for.some((key) => !o.allow || o.allow.includes(key))));
|
|
24
86
|
const label = (def) => {
|
|
25
87
|
const key = `${def.by}.${def.label}`;
|
|
26
88
|
const out = o.translate?.(key);
|
|
@@ -28,6 +90,18 @@ export function buildMenu(manifest, o = {}) {
|
|
|
28
90
|
// literal rather than a key gets the literal.
|
|
29
91
|
return out && out !== key ? out : (o.translate?.(def.label) ?? def.label);
|
|
30
92
|
};
|
|
93
|
+
/**
|
|
94
|
+
* Sequence first, then the words the reader actually sees.
|
|
95
|
+
*
|
|
96
|
+
* The tie-break used to compare `def.label`, which is the message *key*: every
|
|
97
|
+
* root often declares the same `menu.app` key, so equal sequences compared equal
|
|
98
|
+
* and the sidebar fell back to the order modules happened to be registered in.
|
|
99
|
+
* Below a heading it was worse — an untranslated key sorts in English, so the
|
|
100
|
+
* Vietnamese Purchasing menu read Đơn mua · RFQ · Bảng giá because `orders` <
|
|
101
|
+
* `rfqs` < `vendorPricelists`. Comparing the translation puts a Vietnamese menu
|
|
102
|
+
* in Vietnamese order, and `sequence` remains the way to say what you mean.
|
|
103
|
+
*/
|
|
104
|
+
const order = (a, b) => (a[1].sequence ?? 100) - (b[1].sequence ?? 100) || label(a[1]).localeCompare(label(b[1]), o.locale);
|
|
31
105
|
const needle = o.q?.trim().toLocaleLowerCase('vi') ?? '';
|
|
32
106
|
const matches = (text) => !needle || text.toLocaleLowerCase('vi').includes(needle);
|
|
33
107
|
const activePath = o.active
|
|
@@ -52,14 +126,32 @@ export function buildMenu(manifest, o = {}) {
|
|
|
52
126
|
if (needle && !children.length && !matches(label(def)))
|
|
53
127
|
continue;
|
|
54
128
|
const active = (def.path !== undefined && def.path === activePath) || children.some((c) => c.active);
|
|
55
|
-
|
|
129
|
+
// A heading is secondary only when everything under it is: a group holding
|
|
130
|
+
// one entry that is someone's work still belongs in their sidebar.
|
|
131
|
+
const secondary = children.length ? children.every((c) => c.secondary) : !intended(id, def);
|
|
132
|
+
out.push({
|
|
133
|
+
id,
|
|
134
|
+
label: label(def),
|
|
135
|
+
path: def.path ?? null,
|
|
136
|
+
icon: def.icon ?? null,
|
|
137
|
+
active,
|
|
138
|
+
secondary,
|
|
139
|
+
children,
|
|
140
|
+
});
|
|
56
141
|
}
|
|
57
142
|
return out;
|
|
58
143
|
};
|
|
144
|
+
const tree = build(undefined, 0);
|
|
145
|
+
// Nobody gets an empty sidebar. If no entry claims this viewer, the distinction
|
|
146
|
+
// told us nothing about them and the permitted tree is the honest answer.
|
|
147
|
+
const anyPrimary = (nodes) => nodes.some((node) => !node.secondary || anyPrimary(node.children));
|
|
148
|
+
if (!applyIntent || anyPrimary(tree))
|
|
149
|
+
return tree;
|
|
150
|
+
applyIntent = false;
|
|
59
151
|
return build(undefined, 0);
|
|
60
152
|
}
|
|
61
|
-
/** The
|
|
62
|
-
export function
|
|
153
|
+
/** The root navigation section a path belongs to. */
|
|
154
|
+
export function activeMenuRoot(tree) {
|
|
63
155
|
return tree.find((n) => n.active) ?? null;
|
|
64
156
|
}
|
|
65
157
|
//# sourceMappingURL=menu.js.map
|
package/dist/kernel/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../../../../packages/ketjs/src/kernel/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/kernel/modules.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { KetModule } from '../types.ts';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DeploymentSpec, ModulePath, WorkspaceDeclaration } from './workspace.ts';
|
|
3
3
|
export type ModuleSource = {
|
|
4
4
|
name: string;
|
|
5
5
|
descriptor: string;
|
|
@@ -11,10 +11,10 @@ export type ResolvedModuleInfo = {
|
|
|
11
11
|
version: string;
|
|
12
12
|
kind: KetModule['kind'];
|
|
13
13
|
source: 'workspace' | string;
|
|
14
|
-
|
|
14
|
+
deployments: string[];
|
|
15
15
|
};
|
|
16
16
|
export type ResolvedWorkspace = {
|
|
17
|
-
|
|
17
|
+
deployments: DeploymentSpec[];
|
|
18
18
|
modulePaths: string[];
|
|
19
19
|
modules: ResolvedModuleInfo[];
|
|
20
20
|
};
|