@cogenta/schema 0.2.0 → 0.4.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/dist/define-collection.d.ts.map +1 -1
- package/dist/define-collection.js +53 -3
- package/dist/define-collection.js.map +1 -1
- package/dist/generate-types.d.ts.map +1 -1
- package/dist/generate-types.js +6 -1
- package/dist/generate-types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/media-usage.d.ts +56 -0
- package/dist/media-usage.d.ts.map +1 -0
- package/dist/media-usage.js +89 -0
- package/dist/media-usage.js.map +1 -0
- package/dist/rich-text.d.ts +28 -2
- package/dist/rich-text.d.ts.map +1 -1
- package/dist/rich-text.js +26 -3
- package/dist/rich-text.js.map +1 -1
- package/dist/routing/index.d.ts +5 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +2 -0
- package/dist/routing/index.js.map +1 -1
- package/dist/routing/not-found-log.d.ts +78 -0
- package/dist/routing/not-found-log.d.ts.map +1 -0
- package/dist/routing/not-found-log.js +153 -0
- package/dist/routing/not-found-log.js.map +1 -0
- package/dist/routing/redirect-patterns.d.ts +61 -0
- package/dist/routing/redirect-patterns.d.ts.map +1 -0
- package/dist/routing/redirect-patterns.js +173 -0
- package/dist/routing/redirect-patterns.js.map +1 -0
- package/dist/routing/redirects.d.ts +27 -4
- package/dist/routing/redirects.d.ts.map +1 -1
- package/dist/routing/redirects.js +160 -48
- package/dist/routing/redirects.js.map +1 -1
- package/dist/scheduling/index.d.ts +2 -0
- package/dist/scheduling/index.d.ts.map +1 -1
- package/dist/scheduling/index.js +1 -0
- package/dist/scheduling/index.js.map +1 -1
- package/dist/scheduling/registry.d.ts +147 -0
- package/dist/scheduling/registry.d.ts.map +1 -0
- package/dist/scheduling/registry.js +318 -0
- package/dist/scheduling/registry.js.map +1 -0
- package/dist/search/extract.d.ts +24 -0
- package/dist/search/extract.d.ts.map +1 -1
- package/dist/search/extract.js +63 -8
- package/dist/search/extract.js.map +1 -1
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +1 -9
- package/dist/search/index.js.map +1 -1
- package/dist/store/admin-theme-store.d.ts +26 -0
- package/dist/store/admin-theme-store.d.ts.map +1 -0
- package/dist/store/admin-theme-store.js +81 -0
- package/dist/store/admin-theme-store.js.map +1 -0
- package/dist/store/admin-theme-tables.d.ts +24 -0
- package/dist/store/admin-theme-tables.d.ts.map +1 -0
- package/dist/store/admin-theme-tables.js +41 -0
- package/dist/store/admin-theme-tables.js.map +1 -0
- package/dist/store/admin-theme-templates.d.ts +135 -0
- package/dist/store/admin-theme-templates.d.ts.map +1 -0
- package/dist/store/admin-theme-templates.js +217 -0
- package/dist/store/admin-theme-templates.js.map +1 -0
- package/dist/store/columns.d.ts.map +1 -1
- package/dist/store/columns.js +8 -2
- package/dist/store/columns.js.map +1 -1
- package/dist/store/diff.d.ts +40 -0
- package/dist/store/diff.d.ts.map +1 -1
- package/dist/store/diff.js +148 -0
- package/dist/store/diff.js.map +1 -1
- package/dist/store/index.d.ts +47 -4
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +26 -2
- package/dist/store/index.js.map +1 -1
- package/dist/store/maintenance-store.d.ts +34 -0
- package/dist/store/maintenance-store.d.ts.map +1 -0
- package/dist/store/maintenance-store.js +92 -0
- package/dist/store/maintenance-store.js.map +1 -0
- package/dist/store/menu-store.d.ts +146 -0
- package/dist/store/menu-store.d.ts.map +1 -0
- package/dist/store/menu-store.js +565 -0
- package/dist/store/menu-store.js.map +1 -0
- package/dist/store/menu-tables.d.ts +38 -0
- package/dist/store/menu-tables.d.ts.map +1 -0
- package/dist/store/menu-tables.js +117 -0
- package/dist/store/menu-tables.js.map +1 -0
- package/dist/store/naming.d.ts +1 -1
- package/dist/store/naming.d.ts.map +1 -1
- package/dist/store/naming.js +2 -0
- package/dist/store/naming.js.map +1 -1
- package/dist/store/pattern-store.d.ts +75 -0
- package/dist/store/pattern-store.d.ts.map +1 -0
- package/dist/store/pattern-store.js +118 -0
- package/dist/store/pattern-store.js.map +1 -0
- package/dist/store/pattern-tables.d.ts +29 -0
- package/dist/store/pattern-tables.d.ts.map +1 -0
- package/dist/store/pattern-tables.js +53 -0
- package/dist/store/pattern-tables.js.map +1 -0
- package/dist/store/read-only.d.ts +3 -3
- package/dist/store/read-only.d.ts.map +1 -1
- package/dist/store/read-only.js +4 -3
- package/dist/store/read-only.js.map +1 -1
- package/dist/store/redirect-tracking.d.ts +50 -0
- package/dist/store/redirect-tracking.d.ts.map +1 -0
- package/dist/store/redirect-tracking.js +91 -0
- package/dist/store/redirect-tracking.js.map +1 -0
- package/dist/store/review-transitions.d.ts +34 -0
- package/dist/store/review-transitions.d.ts.map +1 -0
- package/dist/store/review-transitions.js +51 -0
- package/dist/store/review-transitions.js.map +1 -0
- package/dist/store/role-permission-export.d.ts +22 -0
- package/dist/store/role-permission-export.d.ts.map +1 -0
- package/dist/store/role-permission-export.js +0 -0
- package/dist/store/role-permission-export.js.map +1 -0
- package/dist/store/role-permission-overlay.d.ts +27 -0
- package/dist/store/role-permission-overlay.d.ts.map +1 -0
- package/dist/store/role-permission-overlay.js +0 -0
- package/dist/store/role-permission-overlay.js.map +1 -0
- package/dist/store/role-permission-store.d.ts +72 -0
- package/dist/store/role-permission-store.d.ts.map +1 -0
- package/dist/store/role-permission-store.js +148 -0
- package/dist/store/role-permission-store.js.map +1 -0
- package/dist/store/role-permission-tables.d.ts +27 -0
- package/dist/store/role-permission-tables.d.ts.map +1 -0
- package/dist/store/role-permission-tables.js +52 -0
- package/dist/store/role-permission-tables.js.map +1 -0
- package/dist/store/scheduled-publish-enqueue.d.ts +37 -0
- package/dist/store/scheduled-publish-enqueue.d.ts.map +1 -0
- package/dist/store/scheduled-publish-enqueue.js +51 -0
- package/dist/store/scheduled-publish-enqueue.js.map +1 -0
- package/dist/store/scheduled-publish-failures.d.ts +36 -0
- package/dist/store/scheduled-publish-failures.d.ts.map +1 -0
- package/dist/store/scheduled-publish-failures.js +67 -0
- package/dist/store/scheduled-publish-failures.js.map +1 -0
- package/dist/store/schema-2-1-migration.d.ts +29 -0
- package/dist/store/schema-2-1-migration.d.ts.map +1 -0
- package/dist/store/schema-2-1-migration.js +71 -0
- package/dist/store/schema-2-1-migration.js.map +1 -0
- package/dist/store/search-console-store.d.ts +44 -0
- package/dist/store/search-console-store.d.ts.map +1 -0
- package/dist/store/search-console-store.js +90 -0
- package/dist/store/search-console-store.js.map +1 -0
- package/dist/store/search-console-tables.d.ts +14 -0
- package/dist/store/search-console-tables.d.ts.map +1 -0
- package/dist/store/search-console-tables.js +29 -0
- package/dist/store/search-console-tables.js.map +1 -0
- package/dist/store/search-indexing.d.ts +36 -0
- package/dist/store/search-indexing.d.ts.map +1 -1
- package/dist/store/search-indexing.js +33 -0
- package/dist/store/search-indexing.js.map +1 -1
- package/dist/store/site-settings-registry.d.ts +164 -0
- package/dist/store/site-settings-registry.d.ts.map +1 -0
- package/dist/store/site-settings-registry.js +1160 -0
- package/dist/store/site-settings-registry.js.map +1 -0
- package/dist/store/site-settings-store.d.ts +42 -0
- package/dist/store/site-settings-store.d.ts.map +1 -0
- package/dist/store/site-settings-store.js +97 -0
- package/dist/store/site-settings-store.js.map +1 -0
- package/dist/store/site-settings-tables.d.ts +29 -0
- package/dist/store/site-settings-tables.d.ts.map +1 -0
- package/dist/store/site-settings-tables.js +48 -0
- package/dist/store/site-settings-tables.js.map +1 -0
- package/dist/store/store.d.ts +57 -2
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +278 -37
- package/dist/store/store.js.map +1 -1
- package/dist/store/tables.d.ts.map +1 -1
- package/dist/store/tables.js +11 -0
- package/dist/store/tables.js.map +1 -1
- package/dist/store/taxonomy-store.d.ts.map +1 -1
- package/dist/store/taxonomy-store.js +90 -39
- package/dist/store/taxonomy-store.js.map +1 -1
- package/dist/store/taxonomy-usage.d.ts +47 -0
- package/dist/store/taxonomy-usage.d.ts.map +1 -0
- package/dist/store/taxonomy-usage.js +101 -0
- package/dist/store/taxonomy-usage.js.map +1 -0
- package/dist/store/theme-store.d.ts +73 -0
- package/dist/store/theme-store.d.ts.map +1 -0
- package/dist/store/theme-store.js +193 -0
- package/dist/store/theme-store.js.map +1 -0
- package/dist/store/types.d.ts +36 -1
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/values.d.ts.map +1 -1
- package/dist/store/values.js +28 -1
- package/dist/store/values.js.map +1 -1
- package/dist/system-fields.d.ts +8 -1
- package/dist/system-fields.d.ts.map +1 -1
- package/dist/system-fields.js +14 -1
- package/dist/system-fields.js.map +1 -1
- package/dist/types.d.ts +54 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import { CogentaError, identifier, sql, } from '@cogenta/core';
|
|
2
|
+
import { newId as uuidv7 } from '../id.js';
|
|
3
|
+
import { joinFragments } from './fragments.js';
|
|
4
|
+
import { MENU_TABLES } from './menu-tables.js';
|
|
5
|
+
import { childPath, depthOf, isBelow, isWithin, rebasedPath } from './taxonomy-path.js';
|
|
6
|
+
/** Deep enough for any real navigation; the path column is bounded to match. */
|
|
7
|
+
export const MAX_MENU_DEPTH = 8;
|
|
8
|
+
function text(value) {
|
|
9
|
+
return typeof value === 'string' ? value : String(value);
|
|
10
|
+
}
|
|
11
|
+
function nullableText(value) {
|
|
12
|
+
return value === null || value === undefined ? null : text(value);
|
|
13
|
+
}
|
|
14
|
+
function invalid(message, hint, details) {
|
|
15
|
+
return new CogentaError({
|
|
16
|
+
code: 'MENU_ITEM_INVALID',
|
|
17
|
+
message,
|
|
18
|
+
hint,
|
|
19
|
+
...(details ? { details } : {}),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function createMenuStore(options) {
|
|
23
|
+
const { db } = options;
|
|
24
|
+
const dialect = db.dialect;
|
|
25
|
+
const now = options.now ?? (() => new Date());
|
|
26
|
+
const newId = options.newId ?? uuidv7;
|
|
27
|
+
const menus = identifier(MENU_TABLES.menus, dialect);
|
|
28
|
+
const items = identifier(MENU_TABLES.items, dialect);
|
|
29
|
+
const idColumn = identifier('id', dialect);
|
|
30
|
+
const parentColumn = identifier('parent_id', dialect);
|
|
31
|
+
const menuIdColumn = identifier('menu_id', dialect);
|
|
32
|
+
const nameColumn = identifier('name', dialect);
|
|
33
|
+
const localeColumn = identifier('locale', dialect);
|
|
34
|
+
const locationColumn = identifier('location', dialect);
|
|
35
|
+
const pathColumn = identifier('path', dialect);
|
|
36
|
+
const positionColumn = identifier('position', dialect);
|
|
37
|
+
const stamp = () => now().toISOString();
|
|
38
|
+
function menuNotFound(id) {
|
|
39
|
+
return new CogentaError({
|
|
40
|
+
code: 'MENU_UNKNOWN',
|
|
41
|
+
message: `No menu "${id}".`,
|
|
42
|
+
hint: 'Check the identifier — list the menus of this site to find the right one.',
|
|
43
|
+
details: { id },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function itemNotFound(id) {
|
|
47
|
+
return new CogentaError({
|
|
48
|
+
code: 'MENU_ITEM_NOT_FOUND',
|
|
49
|
+
message: `No menu item "${id}".`,
|
|
50
|
+
hint: 'Check the identifier — it may already have been removed.',
|
|
51
|
+
details: { id },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function toMenu(row) {
|
|
55
|
+
return {
|
|
56
|
+
id: text(row['id']),
|
|
57
|
+
name: text(row['name']),
|
|
58
|
+
locale: text(row['locale']),
|
|
59
|
+
label: text(row['label']),
|
|
60
|
+
location: nullableText(row['location']),
|
|
61
|
+
createdAt: text(row['created_at']),
|
|
62
|
+
updatedAt: text(row['updated_at']),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function toItem(row) {
|
|
66
|
+
const path = text(row['path']);
|
|
67
|
+
return {
|
|
68
|
+
id: text(row['id']),
|
|
69
|
+
menuId: text(row['menu_id']),
|
|
70
|
+
parent: nullableText(row['parent_id']),
|
|
71
|
+
label: text(row['label']),
|
|
72
|
+
kind: text(row['kind']),
|
|
73
|
+
targetCollection: nullableText(row['target_collection']),
|
|
74
|
+
targetEntryId: nullableText(row['target_entry_id']),
|
|
75
|
+
targetTaxonomy: nullableText(row['target_taxonomy']),
|
|
76
|
+
targetTermId: nullableText(row['target_term_id']),
|
|
77
|
+
url: nullableText(row['url']),
|
|
78
|
+
title: nullableText(row['title']),
|
|
79
|
+
position: Number(row['position']),
|
|
80
|
+
depth: depthOf(path),
|
|
81
|
+
openInNewTab: text(row['open_in_new_tab']) === 'true',
|
|
82
|
+
createdAt: text(row['created_at']),
|
|
83
|
+
updatedAt: text(row['updated_at']),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async function menuRowOf(tx, id) {
|
|
87
|
+
const found = await tx.query(sql `select * from ${menus} where ${idColumn} = ${id}`);
|
|
88
|
+
return found.rows[0] ?? null;
|
|
89
|
+
}
|
|
90
|
+
async function itemRowOf(tx, id) {
|
|
91
|
+
const found = await tx.query(sql `select * from ${items} where ${idColumn} = ${id}`);
|
|
92
|
+
return found.rows[0] ?? null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A path is id-based (`taxonomy-path.ts`'s scheme, reused as-is): two
|
|
96
|
+
* siblings' paths diverge at their own id, which sorts them by creation
|
|
97
|
+
* order, not by `position`. That is fine for "everything under this term"
|
|
98
|
+
* — a `like` — but wrong for a flat listing a reorder button has to
|
|
99
|
+
* respect. So the tree is walked in application code instead: group by
|
|
100
|
+
* parent, sort each group by `position`, then depth-first from the roots.
|
|
101
|
+
* A menu is small (navigation, not a content table), so this costs nothing
|
|
102
|
+
* a database index would meaningfully save.
|
|
103
|
+
*/
|
|
104
|
+
function orderAsTree(rows) {
|
|
105
|
+
const byParent = new Map();
|
|
106
|
+
for (const row of rows) {
|
|
107
|
+
const siblings = byParent.get(row.parent) ?? [];
|
|
108
|
+
siblings.push(row);
|
|
109
|
+
byParent.set(row.parent, siblings);
|
|
110
|
+
}
|
|
111
|
+
for (const siblings of byParent.values())
|
|
112
|
+
siblings.sort((a, b) => a.position - b.position);
|
|
113
|
+
const ordered = [];
|
|
114
|
+
const visit = (parent) => {
|
|
115
|
+
for (const item of byParent.get(parent) ?? []) {
|
|
116
|
+
ordered.push(item);
|
|
117
|
+
visit(item.id);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
visit(null);
|
|
121
|
+
return ordered;
|
|
122
|
+
}
|
|
123
|
+
async function assertNameFree(tx, name, locale, exceptId) {
|
|
124
|
+
const found = await tx.query(sql `select ${idColumn} from ${menus} where ${nameColumn} = ${name} and ${localeColumn} = ${locale}`);
|
|
125
|
+
const clash = found.rows.find((row) => text(row['id']) !== exceptId);
|
|
126
|
+
if (clash === undefined)
|
|
127
|
+
return;
|
|
128
|
+
throw new CogentaError({
|
|
129
|
+
code: 'MENU_NAME_TAKEN',
|
|
130
|
+
message: `A menu called "${name}" already exists for locale "${locale}".`,
|
|
131
|
+
hint: 'A menu name is unique per locale. Pick another name, or edit the existing menu.',
|
|
132
|
+
details: { name, locale },
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function assertLocationFree(tx, location, locale, exceptId) {
|
|
136
|
+
const found = await tx.query(sql `select ${idColumn} from ${menus} where ${locationColumn} = ${location} and ${localeColumn} = ${locale}`);
|
|
137
|
+
const clash = found.rows.find((row) => text(row['id']) !== exceptId);
|
|
138
|
+
if (clash === undefined)
|
|
139
|
+
return;
|
|
140
|
+
throw new CogentaError({
|
|
141
|
+
code: 'MENU_LOCATION_TAKEN',
|
|
142
|
+
message: `Location "${location}" is already used by another menu for locale "${locale}".`,
|
|
143
|
+
hint: 'A location holds at most one menu per locale. Clear it from the other menu first, or edit that menu instead of creating a new one.',
|
|
144
|
+
details: { location, locale },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function validateItemShape(kind, body) {
|
|
148
|
+
if (kind === 'url') {
|
|
149
|
+
if (typeof body.url !== 'string' || body.url.length === 0) {
|
|
150
|
+
throw invalid('A URL item needs a non-empty "url".', 'Send { "kind": "url", "url": "https://…" }.');
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (kind === 'entry') {
|
|
155
|
+
if (typeof body.targetCollection !== 'string' || body.targetCollection.length === 0) {
|
|
156
|
+
throw invalid('An entry item needs "targetCollection".', 'Send { "kind": "entry", "targetCollection": "page", "targetEntryId": "…" }.');
|
|
157
|
+
}
|
|
158
|
+
if (typeof body.targetEntryId !== 'string' || body.targetEntryId.length === 0) {
|
|
159
|
+
throw invalid('An entry item needs "targetEntryId".', 'Send { "kind": "entry", "targetCollection": "page", "targetEntryId": "…" }.');
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (kind === 'taxonomy') {
|
|
164
|
+
if (typeof body.targetTaxonomy !== 'string' || body.targetTaxonomy.length === 0) {
|
|
165
|
+
throw invalid('A taxonomy item needs "targetTaxonomy".', 'Send { "kind": "taxonomy", "targetTaxonomy": "topic", "targetTermId": "…" }.');
|
|
166
|
+
}
|
|
167
|
+
if (typeof body.targetTermId !== 'string' || body.targetTermId.length === 0) {
|
|
168
|
+
throw invalid('A taxonomy item needs "targetTermId".', 'Send { "kind": "taxonomy", "targetTaxonomy": "topic", "targetTermId": "…" }.');
|
|
169
|
+
}
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// 'home' and 'submenu-placeholder': a label, no target of their own —
|
|
173
|
+
// 'home' always resolves to the site root, and a placeholder groups
|
|
174
|
+
// children under a heading with no link.
|
|
175
|
+
}
|
|
176
|
+
async function nextPosition(tx, menuId, parent) {
|
|
177
|
+
const found = await tx.query(parent === null
|
|
178
|
+
? sql `select ${positionColumn} from ${items} where ${menuIdColumn} = ${menuId} and ${parentColumn} is null`
|
|
179
|
+
: sql `select ${positionColumn} from ${items} where ${menuIdColumn} = ${menuId} and ${parentColumn} = ${parent}`);
|
|
180
|
+
return found.rows.reduce((highest, row) => Math.max(highest, Number(row['position']) + 1), 0);
|
|
181
|
+
}
|
|
182
|
+
async function parentOf(tx, menuId, parent) {
|
|
183
|
+
if (parent === null)
|
|
184
|
+
return null;
|
|
185
|
+
const row = await itemRowOf(tx, parent);
|
|
186
|
+
if (row === null || text(row['menu_id']) !== menuId) {
|
|
187
|
+
throw invalid(`The parent "${parent}" is not an item of this menu.`, 'A submenu item can only nest under an item of the same menu.', { parent, menuId });
|
|
188
|
+
}
|
|
189
|
+
return row;
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
create: async (input) => db.transaction(async (tx) => {
|
|
193
|
+
await assertNameFree(tx, input.name, input.locale);
|
|
194
|
+
if (input.location !== undefined && input.location !== null) {
|
|
195
|
+
await assertLocationFree(tx, input.location, input.locale);
|
|
196
|
+
}
|
|
197
|
+
const id = input.id ?? newId();
|
|
198
|
+
const at = stamp();
|
|
199
|
+
await tx.query(sql `insert into ${menus} (${joinFragments([
|
|
200
|
+
idColumn,
|
|
201
|
+
nameColumn,
|
|
202
|
+
localeColumn,
|
|
203
|
+
identifier('label', dialect),
|
|
204
|
+
locationColumn,
|
|
205
|
+
identifier('created_at', dialect),
|
|
206
|
+
identifier('updated_at', dialect),
|
|
207
|
+
], ', ')}) values (${id}, ${input.name}, ${input.locale}, ${input.label}, ${input.location ?? null}, ${at}, ${at})`);
|
|
208
|
+
const row = await menuRowOf(tx, id);
|
|
209
|
+
if (row === null)
|
|
210
|
+
throw menuNotFound(id);
|
|
211
|
+
return toMenu(row);
|
|
212
|
+
}, { immediate: true }),
|
|
213
|
+
read: async (id) => {
|
|
214
|
+
const row = await menuRowOf(db, id);
|
|
215
|
+
return row === null ? null : toMenu(row);
|
|
216
|
+
},
|
|
217
|
+
byName: async (name, locale) => {
|
|
218
|
+
const found = await db.query(sql `select * from ${menus} where ${nameColumn} = ${name} and ${localeColumn} = ${locale}`);
|
|
219
|
+
const row = found.rows[0];
|
|
220
|
+
return row === undefined ? null : toMenu(row);
|
|
221
|
+
},
|
|
222
|
+
byLocation: async (location, locale) => {
|
|
223
|
+
const found = await db.query(sql `select * from ${menus} where ${locationColumn} = ${location} and ${localeColumn} = ${locale}`);
|
|
224
|
+
const row = found.rows[0];
|
|
225
|
+
return row === undefined ? null : toMenu(row);
|
|
226
|
+
},
|
|
227
|
+
update: async (id, input) => db.transaction(async (tx) => {
|
|
228
|
+
const row = await menuRowOf(tx, id);
|
|
229
|
+
if (row === null)
|
|
230
|
+
throw menuNotFound(id);
|
|
231
|
+
if (input.location !== undefined && input.location !== null) {
|
|
232
|
+
await assertLocationFree(tx, input.location, text(row['locale']), id);
|
|
233
|
+
}
|
|
234
|
+
const assignments = [
|
|
235
|
+
sql `${identifier('updated_at', dialect)} = ${stamp()}`,
|
|
236
|
+
];
|
|
237
|
+
if (input.label !== undefined) {
|
|
238
|
+
assignments.push(sql `${identifier('label', dialect)} = ${input.label}`);
|
|
239
|
+
}
|
|
240
|
+
if (input.location !== undefined) {
|
|
241
|
+
assignments.push(sql `${locationColumn} = ${input.location}`);
|
|
242
|
+
}
|
|
243
|
+
await tx.query(sql `update ${menus} set ${joinFragments(assignments, ', ')} where ${idColumn} = ${id}`);
|
|
244
|
+
const after = await menuRowOf(tx, id);
|
|
245
|
+
if (after === null)
|
|
246
|
+
throw menuNotFound(id);
|
|
247
|
+
return toMenu(after);
|
|
248
|
+
}, { immediate: true }),
|
|
249
|
+
delete: async (id, deleteOptions) => db.transaction(async (tx) => {
|
|
250
|
+
const row = await menuRowOf(tx, id);
|
|
251
|
+
if (row === null)
|
|
252
|
+
return false;
|
|
253
|
+
const count = await tx.query(sql `select ${idColumn} from ${items} where ${menuIdColumn} = ${id}`);
|
|
254
|
+
if (count.rows.length > 0 && deleteOptions?.cascade !== true) {
|
|
255
|
+
throw new CogentaError({
|
|
256
|
+
code: 'MENU_ITEM_INVALID',
|
|
257
|
+
message: `The menu "${id}" still has ${count.rows.length} item(s).`,
|
|
258
|
+
hint: 'Remove them first, or pass { cascade: true } to delete the whole menu.',
|
|
259
|
+
details: { id, items: count.rows.length },
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
const removed = await tx.query(sql `delete from ${menus} where ${idColumn} = ${id}`);
|
|
263
|
+
return removed.rowsAffected > 0;
|
|
264
|
+
}, { immediate: true }),
|
|
265
|
+
list: async (listOptions = {}) => {
|
|
266
|
+
const found = await db.query(listOptions.locale === undefined
|
|
267
|
+
? sql `select * from ${menus} order by ${nameColumn} asc`
|
|
268
|
+
: sql `select * from ${menus} where ${localeColumn} = ${listOptions.locale} order by ${nameColumn} asc`);
|
|
269
|
+
return found.rows.map(toMenu);
|
|
270
|
+
},
|
|
271
|
+
createItem: async (menuId, input) => db.transaction(async (tx) => {
|
|
272
|
+
const menu = await menuRowOf(tx, menuId);
|
|
273
|
+
if (menu === null)
|
|
274
|
+
throw menuNotFound(menuId);
|
|
275
|
+
validateItemShape(input.kind, input);
|
|
276
|
+
const parent = input.parent ?? null;
|
|
277
|
+
const parentRow = await parentOf(tx, menuId, parent);
|
|
278
|
+
const parentPath = parentRow === null ? '' : text(parentRow['path']);
|
|
279
|
+
const id = input.id ?? newId();
|
|
280
|
+
const path = childPath(parentPath, id);
|
|
281
|
+
if (depthOf(path) >= MAX_MENU_DEPTH) {
|
|
282
|
+
throw invalid(`A menu item cannot be nested more than ${MAX_MENU_DEPTH} levels deep.`, 'Flatten this branch — a menu nobody can navigate is not a menu.', { depth: depthOf(path), max: MAX_MENU_DEPTH });
|
|
283
|
+
}
|
|
284
|
+
const position = input.position ?? (await nextPosition(tx, menuId, parent));
|
|
285
|
+
const at = stamp();
|
|
286
|
+
await tx.query(sql `insert into ${items} (${joinFragments([
|
|
287
|
+
idColumn,
|
|
288
|
+
menuIdColumn,
|
|
289
|
+
parentColumn,
|
|
290
|
+
identifier('label', dialect),
|
|
291
|
+
identifier('kind', dialect),
|
|
292
|
+
identifier('target_collection', dialect),
|
|
293
|
+
identifier('target_entry_id', dialect),
|
|
294
|
+
identifier('target_taxonomy', dialect),
|
|
295
|
+
identifier('target_term_id', dialect),
|
|
296
|
+
identifier('url', dialect),
|
|
297
|
+
identifier('title', dialect),
|
|
298
|
+
positionColumn,
|
|
299
|
+
pathColumn,
|
|
300
|
+
identifier('open_in_new_tab', dialect),
|
|
301
|
+
identifier('created_at', dialect),
|
|
302
|
+
identifier('updated_at', dialect),
|
|
303
|
+
], ', ')}) values (
|
|
304
|
+
${id}, ${menuId}, ${parent}, ${input.label}, ${input.kind},
|
|
305
|
+
${input.targetCollection ?? null}, ${input.targetEntryId ?? null},
|
|
306
|
+
${input.targetTaxonomy ?? null}, ${input.targetTermId ?? null},
|
|
307
|
+
${input.url ?? null}, ${input.title ?? null},
|
|
308
|
+
${position}, ${path}, ${input.openInNewTab === true ? 'true' : 'false'}, ${at}, ${at}
|
|
309
|
+
)`);
|
|
310
|
+
const row = await itemRowOf(tx, id);
|
|
311
|
+
if (row === null)
|
|
312
|
+
throw itemNotFound(id);
|
|
313
|
+
return toItem(row);
|
|
314
|
+
}, { immediate: true }),
|
|
315
|
+
readItem: async (id) => {
|
|
316
|
+
const row = await itemRowOf(db, id);
|
|
317
|
+
return row === null ? null : toItem(row);
|
|
318
|
+
},
|
|
319
|
+
updateItem: async (id, input) => db.transaction(async (tx) => {
|
|
320
|
+
const row = await itemRowOf(tx, id);
|
|
321
|
+
if (row === null)
|
|
322
|
+
throw itemNotFound(id);
|
|
323
|
+
const kind = (input.kind ?? text(row['kind']));
|
|
324
|
+
if (input.kind !== undefined ||
|
|
325
|
+
input.url !== undefined ||
|
|
326
|
+
input.targetCollection !== undefined ||
|
|
327
|
+
input.targetEntryId !== undefined ||
|
|
328
|
+
input.targetTaxonomy !== undefined ||
|
|
329
|
+
input.targetTermId !== undefined) {
|
|
330
|
+
validateItemShape(kind, {
|
|
331
|
+
url: input.url !== undefined ? input.url : nullableText(row['url']),
|
|
332
|
+
targetCollection: input.targetCollection !== undefined
|
|
333
|
+
? input.targetCollection
|
|
334
|
+
: nullableText(row['target_collection']),
|
|
335
|
+
targetEntryId: input.targetEntryId !== undefined
|
|
336
|
+
? input.targetEntryId
|
|
337
|
+
: nullableText(row['target_entry_id']),
|
|
338
|
+
targetTaxonomy: input.targetTaxonomy !== undefined
|
|
339
|
+
? input.targetTaxonomy
|
|
340
|
+
: nullableText(row['target_taxonomy']),
|
|
341
|
+
targetTermId: input.targetTermId !== undefined
|
|
342
|
+
? input.targetTermId
|
|
343
|
+
: nullableText(row['target_term_id']),
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
const assignments = [
|
|
347
|
+
sql `${identifier('updated_at', dialect)} = ${stamp()}`,
|
|
348
|
+
];
|
|
349
|
+
if (input.label !== undefined)
|
|
350
|
+
assignments.push(sql `${identifier('label', dialect)} = ${input.label}`);
|
|
351
|
+
if (input.kind !== undefined)
|
|
352
|
+
assignments.push(sql `${identifier('kind', dialect)} = ${input.kind}`);
|
|
353
|
+
if (input.targetCollection !== undefined) {
|
|
354
|
+
assignments.push(sql `${identifier('target_collection', dialect)} = ${input.targetCollection}`);
|
|
355
|
+
}
|
|
356
|
+
if (input.targetEntryId !== undefined) {
|
|
357
|
+
assignments.push(sql `${identifier('target_entry_id', dialect)} = ${input.targetEntryId}`);
|
|
358
|
+
}
|
|
359
|
+
if (input.targetTaxonomy !== undefined) {
|
|
360
|
+
assignments.push(sql `${identifier('target_taxonomy', dialect)} = ${input.targetTaxonomy}`);
|
|
361
|
+
}
|
|
362
|
+
if (input.targetTermId !== undefined) {
|
|
363
|
+
assignments.push(sql `${identifier('target_term_id', dialect)} = ${input.targetTermId}`);
|
|
364
|
+
}
|
|
365
|
+
if (input.url !== undefined)
|
|
366
|
+
assignments.push(sql `${identifier('url', dialect)} = ${input.url}`);
|
|
367
|
+
if (input.title !== undefined)
|
|
368
|
+
assignments.push(sql `${identifier('title', dialect)} = ${input.title}`);
|
|
369
|
+
if (input.openInNewTab !== undefined) {
|
|
370
|
+
assignments.push(sql `${identifier('open_in_new_tab', dialect)} = ${input.openInNewTab ? 'true' : 'false'}`);
|
|
371
|
+
}
|
|
372
|
+
await tx.query(sql `update ${items} set ${joinFragments(assignments, ', ')} where ${idColumn} = ${id}`);
|
|
373
|
+
const after = await itemRowOf(tx, id);
|
|
374
|
+
if (after === null)
|
|
375
|
+
throw itemNotFound(id);
|
|
376
|
+
return toItem(after);
|
|
377
|
+
}, { immediate: true }),
|
|
378
|
+
moveItem: async (id, parent) => db.transaction(async (tx) => {
|
|
379
|
+
const row = await itemRowOf(tx, id);
|
|
380
|
+
if (row === null)
|
|
381
|
+
throw itemNotFound(id);
|
|
382
|
+
const menuId = text(row['menu_id']);
|
|
383
|
+
const from = text(row['path']);
|
|
384
|
+
const parentRow = await parentOf(tx, menuId, parent);
|
|
385
|
+
const parentPath = parentRow === null ? '' : text(parentRow['path']);
|
|
386
|
+
if (parent !== null && isWithin(parentPath, from)) {
|
|
387
|
+
throw new CogentaError({
|
|
388
|
+
code: 'MENU_CYCLE',
|
|
389
|
+
message: `Moving "${id}" under "${parent}" would make it its own ancestor.`,
|
|
390
|
+
hint: 'Move the target out of this subtree first.',
|
|
391
|
+
details: { id, parent },
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
const to = childPath(parentPath, id);
|
|
395
|
+
if (to === from)
|
|
396
|
+
return toItem(row);
|
|
397
|
+
const subtree = await tx.query(sql `select * from ${items} where ${menuIdColumn} = ${menuId} and ${pathColumn} like ${`${from}%`}`);
|
|
398
|
+
for (const member of subtree.rows) {
|
|
399
|
+
const rebased = rebasedPath(text(member['path']), from, to);
|
|
400
|
+
if (depthOf(rebased) >= MAX_MENU_DEPTH) {
|
|
401
|
+
throw invalid(`Moving "${id}" would nest a descendant more than ${MAX_MENU_DEPTH} levels deep.`, 'Flatten the branch before moving it further down the tree.', { depth: depthOf(rebased), max: MAX_MENU_DEPTH });
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
const at = stamp();
|
|
405
|
+
for (const member of subtree.rows) {
|
|
406
|
+
const memberId = text(member['id']);
|
|
407
|
+
const rebased = rebasedPath(text(member['path']), from, to);
|
|
408
|
+
await tx.query(sql `update ${items}
|
|
409
|
+
set ${pathColumn} = ${rebased}, ${identifier('updated_at', dialect)} = ${at}
|
|
410
|
+
where ${idColumn} = ${memberId}`);
|
|
411
|
+
}
|
|
412
|
+
await tx.query(sql `update ${items}
|
|
413
|
+
set ${parentColumn} = ${parent}, ${positionColumn} = ${await nextPosition(tx, menuId, parent)}
|
|
414
|
+
where ${idColumn} = ${id}`);
|
|
415
|
+
const after = await itemRowOf(tx, id);
|
|
416
|
+
if (after === null)
|
|
417
|
+
throw itemNotFound(id);
|
|
418
|
+
return toItem(after);
|
|
419
|
+
}, { immediate: true }),
|
|
420
|
+
reorderItem: async (id, direction) => db.transaction(async (tx) => {
|
|
421
|
+
const row = await itemRowOf(tx, id);
|
|
422
|
+
if (row === null)
|
|
423
|
+
throw itemNotFound(id);
|
|
424
|
+
const menuId = text(row['menu_id']);
|
|
425
|
+
const parent = nullableText(row['parent_id']);
|
|
426
|
+
const siblings = await tx.query(parent === null
|
|
427
|
+
? sql `select * from ${items} where ${menuIdColumn} = ${menuId} and ${parentColumn} is null order by ${positionColumn} asc`
|
|
428
|
+
: sql `select * from ${items} where ${menuIdColumn} = ${menuId} and ${parentColumn} = ${parent} order by ${positionColumn} asc`);
|
|
429
|
+
const index = siblings.rows.findIndex((sibling) => text(sibling['id']) === id);
|
|
430
|
+
const swapIndex = direction === 'up' ? index - 1 : index + 1;
|
|
431
|
+
if (index === -1 || swapIndex < 0 || swapIndex >= siblings.rows.length) {
|
|
432
|
+
const after = await itemRowOf(tx, id);
|
|
433
|
+
if (after === null)
|
|
434
|
+
throw itemNotFound(id);
|
|
435
|
+
return toItem(after);
|
|
436
|
+
}
|
|
437
|
+
const neighbour = siblings.rows[swapIndex];
|
|
438
|
+
if (neighbour === undefined) {
|
|
439
|
+
const after = await itemRowOf(tx, id);
|
|
440
|
+
if (after === null)
|
|
441
|
+
throw itemNotFound(id);
|
|
442
|
+
return toItem(after);
|
|
443
|
+
}
|
|
444
|
+
const at = stamp();
|
|
445
|
+
const myPosition = row['position'];
|
|
446
|
+
const neighbourPosition = neighbour['position'];
|
|
447
|
+
await tx.query(sql `update ${items} set ${positionColumn} = ${neighbourPosition}, ${identifier('updated_at', dialect)} = ${at}
|
|
448
|
+
where ${idColumn} = ${id}`);
|
|
449
|
+
await tx.query(sql `update ${items} set ${positionColumn} = ${myPosition}, ${identifier('updated_at', dialect)} = ${at}
|
|
450
|
+
where ${idColumn} = ${text(neighbour['id'])}`);
|
|
451
|
+
const after = await itemRowOf(tx, id);
|
|
452
|
+
if (after === null)
|
|
453
|
+
throw itemNotFound(id);
|
|
454
|
+
return toItem(after);
|
|
455
|
+
}, { immediate: true }),
|
|
456
|
+
reorderItems: async (menuId, updates) => db.transaction(async (tx) => {
|
|
457
|
+
const menu = await menuRowOf(tx, menuId);
|
|
458
|
+
if (menu === null)
|
|
459
|
+
throw menuNotFound(menuId);
|
|
460
|
+
const allRows = (await tx.query(sql `select * from ${items} where ${menuIdColumn} = ${menuId}`)).rows;
|
|
461
|
+
const byId = new Map(allRows.map((row) => [text(row['id']), row]));
|
|
462
|
+
if (updates.length === 0)
|
|
463
|
+
return orderAsTree(allRows.map(toItem));
|
|
464
|
+
const updateById = new Map();
|
|
465
|
+
for (const update of updates) {
|
|
466
|
+
if (!byId.has(update.id))
|
|
467
|
+
throw itemNotFound(update.id);
|
|
468
|
+
if (update.parent !== null && !byId.has(update.parent)) {
|
|
469
|
+
throw invalid(`The parent "${update.parent}" is not an item of this menu.`, 'A submenu item can only nest under an item of the same menu.', { parent: update.parent, menuId });
|
|
470
|
+
}
|
|
471
|
+
updateById.set(update.id, update);
|
|
472
|
+
}
|
|
473
|
+
function effectiveParent(id) {
|
|
474
|
+
const update = updateById.get(id);
|
|
475
|
+
if (update !== undefined)
|
|
476
|
+
return update.parent;
|
|
477
|
+
const row = byId.get(id);
|
|
478
|
+
return row === undefined ? null : nullableText(row['parent_id']);
|
|
479
|
+
}
|
|
480
|
+
// Cycle check over the graph *as it will be after the whole
|
|
481
|
+
// batch* — an item moving under another item that is itself
|
|
482
|
+
// moving, in the same batch, is exactly the case a one-at-a-time
|
|
483
|
+
// check (`moveItem`'s) cannot see.
|
|
484
|
+
for (const update of updates) {
|
|
485
|
+
const seen = new Set([update.id]);
|
|
486
|
+
let cursor = update.parent;
|
|
487
|
+
while (cursor !== null) {
|
|
488
|
+
if (seen.has(cursor)) {
|
|
489
|
+
throw new CogentaError({
|
|
490
|
+
code: 'MENU_CYCLE',
|
|
491
|
+
message: `Moving "${update.id}" under "${update.parent}" would make it its own ancestor.`,
|
|
492
|
+
hint: 'Move the target out of this subtree first.',
|
|
493
|
+
details: { id: update.id, parent: update.parent },
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
seen.add(cursor);
|
|
497
|
+
cursor = effectiveParent(cursor);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// Every item's path once the batch is applied, computed
|
|
501
|
+
// recursively so a moved ancestor cascades to descendants that
|
|
502
|
+
// were never themselves named in `updates` — the same thing
|
|
503
|
+
// `moveItem`'s subtree rebase does for one item at a time.
|
|
504
|
+
const finalPath = new Map();
|
|
505
|
+
function pathOf(id) {
|
|
506
|
+
const cached = finalPath.get(id);
|
|
507
|
+
if (cached !== undefined)
|
|
508
|
+
return cached;
|
|
509
|
+
const parent = effectiveParent(id);
|
|
510
|
+
const parentPath = parent === null ? '' : pathOf(parent);
|
|
511
|
+
const computed = childPath(parentPath, id);
|
|
512
|
+
finalPath.set(id, computed);
|
|
513
|
+
return computed;
|
|
514
|
+
}
|
|
515
|
+
for (const id of byId.keys())
|
|
516
|
+
pathOf(id);
|
|
517
|
+
for (const [id, path] of finalPath) {
|
|
518
|
+
if (depthOf(path) >= MAX_MENU_DEPTH) {
|
|
519
|
+
throw invalid(`Moving "${id}" would nest it more than ${MAX_MENU_DEPTH} levels deep.`, 'Flatten the branch before moving it further down the tree.', { id, depth: depthOf(path), max: MAX_MENU_DEPTH });
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
const at = stamp();
|
|
523
|
+
for (const [id, path] of finalPath) {
|
|
524
|
+
const original = byId.get(id);
|
|
525
|
+
if (original === undefined || text(original['path']) === path)
|
|
526
|
+
continue;
|
|
527
|
+
await tx.query(sql `update ${items} set ${pathColumn} = ${path}, ${identifier('updated_at', dialect)} = ${at}
|
|
528
|
+
where ${idColumn} = ${id}`);
|
|
529
|
+
}
|
|
530
|
+
for (const update of updates) {
|
|
531
|
+
await tx.query(sql `update ${items}
|
|
532
|
+
set ${parentColumn} = ${update.parent}, ${positionColumn} = ${update.position},
|
|
533
|
+
${identifier('updated_at', dialect)} = ${at}
|
|
534
|
+
where ${idColumn} = ${update.id}`);
|
|
535
|
+
}
|
|
536
|
+
const after = await tx.query(sql `select * from ${items} where ${menuIdColumn} = ${menuId}`);
|
|
537
|
+
return orderAsTree(after.rows.map(toItem));
|
|
538
|
+
}, { immediate: true }),
|
|
539
|
+
deleteItem: async (id, deleteOptions) => db.transaction(async (tx) => {
|
|
540
|
+
const row = await itemRowOf(tx, id);
|
|
541
|
+
if (row === null)
|
|
542
|
+
return false;
|
|
543
|
+
const path = text(row['path']);
|
|
544
|
+
const menuId = text(row['menu_id']);
|
|
545
|
+
const descendants = await tx.query(sql `select ${idColumn}, ${pathColumn} from ${items}
|
|
546
|
+
where ${menuIdColumn} = ${menuId} and ${pathColumn} like ${`${path}%`}`);
|
|
547
|
+
const children = descendants.rows.filter((member) => isBelow(text(member['path']), path));
|
|
548
|
+
if (children.length > 0 && deleteOptions?.cascade !== true) {
|
|
549
|
+
throw new CogentaError({
|
|
550
|
+
code: 'MENU_ITEM_INVALID',
|
|
551
|
+
message: `The menu item "${id}" still has ${children.length} child item(s).`,
|
|
552
|
+
hint: 'Move them elsewhere first, or pass { cascade: true } to delete the whole branch.',
|
|
553
|
+
details: { id, descendants: children.length },
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
const removed = await tx.query(sql `delete from ${items} where ${idColumn} = ${id}`);
|
|
557
|
+
return removed.rowsAffected > 0;
|
|
558
|
+
}, { immediate: true }),
|
|
559
|
+
listItems: async (menuId) => {
|
|
560
|
+
const found = await db.query(sql `select * from ${items} where ${menuIdColumn} = ${menuId}`);
|
|
561
|
+
return orderAsTree(found.rows.map(toItem));
|
|
562
|
+
},
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
//# sourceMappingURL=menu-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-store.js","sourceRoot":"","sources":["../../src/store/menu-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type DatabaseHandle } from '@cogenta/core';
|
|
2
|
+
/**
|
|
3
|
+
* Navigation menus.
|
|
4
|
+
*
|
|
5
|
+
* Unlike a taxonomy, a menu is not declared in the site's schema — it is
|
|
6
|
+
* created and edited entirely at runtime, from the admin or the API. So it
|
|
7
|
+
* gets one fixed pair of tables (`ensureMarketplaceTables`'s pattern), not one
|
|
8
|
+
* table per name the way `taxonomyTable()` mints one per declared taxonomy.
|
|
9
|
+
*
|
|
10
|
+
* A menu belongs to a locale, the way a localised collection does (ADR-0014):
|
|
11
|
+
* a site with French and English navigation has two rows in `cogenta_menus`
|
|
12
|
+
* sharing a `name`, not one row carrying two labels.
|
|
13
|
+
*
|
|
14
|
+
* An item's tree is a materialised path exactly like `taxonomy-path.ts`'s,
|
|
15
|
+
* reusing its helpers rather than a second implementation: a menu is
|
|
16
|
+
* structurally the same shape (a named tree), just editable without a schema
|
|
17
|
+
* declaration.
|
|
18
|
+
*
|
|
19
|
+
* `location` (fiche 09, task 3): where a menu renders on the public site
|
|
20
|
+
* (`primary`, `footer`, …), carried by the menu row itself rather than by a
|
|
21
|
+
* contract D extension. A theme is not the one true source of navigation
|
|
22
|
+
* vocabulary — a future second theme must be able to declare its own
|
|
23
|
+
* locations without a data migration — so the column stores an arbitrary
|
|
24
|
+
* string, unique per locale when set, and nothing here or in the router
|
|
25
|
+
* hardcodes what values it may hold. `null` (the default) means "not slotted
|
|
26
|
+
* anywhere yet", exactly the state every menu created before this column
|
|
27
|
+
* existed is already in.
|
|
28
|
+
*/
|
|
29
|
+
export declare const MENU_TABLES: {
|
|
30
|
+
readonly menus: 'cogenta_menus';
|
|
31
|
+
readonly items: 'cogenta_menu_items';
|
|
32
|
+
};
|
|
33
|
+
/** Ids plus the deepest realistic nesting: `/`, then a UUID and a slash per level. */
|
|
34
|
+
export declare const MENU_ITEM_PATH_LENGTH: number;
|
|
35
|
+
/** How long a `location` key (`primary`, `footer`, …) may be. */
|
|
36
|
+
export declare const MENU_LOCATION_LENGTH = 64;
|
|
37
|
+
export declare function ensureMenuTables(db: DatabaseHandle): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=menu-tables.d.ts.map
|