@beechcms/core 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/LICENSE +21 -0
  2. package/dist/auth/login-request.d.ts +16 -0
  3. package/dist/auth/login-request.d.ts.map +1 -0
  4. package/dist/auth/login-request.js +22 -0
  5. package/dist/automations-grammar-words.d.ts +2 -0
  6. package/dist/automations-grammar-words.d.ts.map +1 -0
  7. package/dist/automations-grammar-words.js +8 -0
  8. package/dist/automations.repository.interface.d.ts +19 -0
  9. package/dist/automations.repository.interface.d.ts.map +1 -0
  10. package/dist/automations.repository.interface.js +3 -0
  11. package/dist/automations.runner.interface.d.ts +10 -0
  12. package/dist/automations.runner.interface.d.ts.map +1 -0
  13. package/dist/automations.runner.interface.js +3 -0
  14. package/dist/automations.runner.stub.d.ts +5 -0
  15. package/dist/automations.runner.stub.d.ts.map +1 -0
  16. package/dist/automations.runner.stub.js +7 -0
  17. package/dist/automations.types.d.ts +75 -0
  18. package/dist/automations.types.d.ts.map +1 -0
  19. package/dist/automations.types.js +3 -0
  20. package/dist/clock.d.ts +25 -0
  21. package/dist/clock.d.ts.map +1 -0
  22. package/dist/clock.js +11 -0
  23. package/dist/content/content.repository.d.ts +22 -22
  24. package/dist/content/content.repository.d.ts.map +1 -1
  25. package/dist/content/retention.d.ts +13 -0
  26. package/dist/content/retention.d.ts.map +1 -0
  27. package/dist/content/retention.js +20 -0
  28. package/dist/content/slug-utils.d.ts +7 -0
  29. package/dist/content/slug-utils.d.ts.map +1 -1
  30. package/dist/content/slug-utils.js +12 -0
  31. package/dist/content-scan.repository.d.ts +9 -0
  32. package/dist/content-scan.repository.d.ts.map +1 -0
  33. package/dist/content-scan.repository.js +3 -0
  34. package/dist/content.repository.d.ts +247 -0
  35. package/dist/content.repository.d.ts.map +1 -0
  36. package/dist/content.repository.js +59 -0
  37. package/dist/dashboard-layout/dashboard-layout.d.ts +2 -2
  38. package/dist/dashboard-layout/dashboard-layout.d.ts.map +1 -1
  39. package/dist/dashboard-layout/dashboard-layout.js +3 -3
  40. package/dist/dashboard-layout/relation-avatar.d.ts +12 -0
  41. package/dist/dashboard-layout/relation-avatar.d.ts.map +1 -0
  42. package/dist/dashboard-layout/relation-avatar.js +18 -0
  43. package/dist/dashboard-layout/seed-layout.d.ts.map +1 -1
  44. package/dist/dashboard-layout/seed-layout.js +17 -1
  45. package/dist/dashboard-layout.d.ts +154 -0
  46. package/dist/dashboard-layout.d.ts.map +1 -0
  47. package/dist/dashboard-layout.js +186 -0
  48. package/dist/dashboard-layout.repository.d.ts +18 -0
  49. package/dist/dashboard-layout.repository.d.ts.map +1 -0
  50. package/dist/dashboard-layout.repository.js +3 -0
  51. package/dist/dashboard-permissions.d.ts +3 -0
  52. package/dist/dashboard-permissions.d.ts.map +1 -0
  53. package/dist/dashboard-permissions.js +11 -0
  54. package/dist/dashboard-scopes.d.ts +12 -0
  55. package/dist/dashboard-scopes.d.ts.map +1 -0
  56. package/dist/dashboard-scopes.js +30 -0
  57. package/dist/define-seed.d.ts +3 -0
  58. package/dist/define-seed.d.ts.map +1 -0
  59. package/dist/define-seed.js +5 -0
  60. package/dist/demo-data.repository.d.ts +5 -0
  61. package/dist/demo-data.repository.d.ts.map +1 -0
  62. package/dist/demo-data.repository.js +3 -0
  63. package/dist/email.provider.d.ts +32 -0
  64. package/dist/email.provider.d.ts.map +1 -0
  65. package/dist/email.provider.js +4 -0
  66. package/dist/engine/ddl/ddl.d.ts +4 -6
  67. package/dist/engine/ddl/ddl.d.ts.map +1 -1
  68. package/dist/engine/ddl/ddl.js +13 -27
  69. package/dist/engine/ddl/seed-ddl.d.ts.map +1 -1
  70. package/dist/engine/ddl/seed-ddl.js +10 -2
  71. package/dist/engine/ddl.d.ts +0 -23
  72. package/dist/engine/ddl.d.ts.map +1 -1
  73. package/dist/engine/ddl.js +3 -59
  74. package/dist/engine/localization.d.ts +127 -0
  75. package/dist/engine/localization.d.ts.map +1 -0
  76. package/dist/engine/localization.js +212 -0
  77. package/dist/engine/privacy.service.d.ts.map +1 -1
  78. package/dist/engine/query/active-clause.d.ts +2 -3
  79. package/dist/engine/query/active-clause.d.ts.map +1 -1
  80. package/dist/engine/query/active-clause.js +3 -4
  81. package/dist/engine/query/query.js +8 -8
  82. package/dist/engine/query/search-support.d.ts +32 -0
  83. package/dist/engine/query/search-support.d.ts.map +1 -0
  84. package/dist/engine/query/search-support.js +34 -0
  85. package/dist/engine/query.d.ts.map +1 -1
  86. package/dist/engine/query.js +0 -12
  87. package/dist/engine/schema-fingerprint.d.ts +2 -0
  88. package/dist/engine/schema-fingerprint.d.ts.map +1 -1
  89. package/dist/engine/schema-fingerprint.js +2 -0
  90. package/dist/engine/seed-ddl.d.ts +1 -4
  91. package/dist/engine/seed-ddl.d.ts.map +1 -1
  92. package/dist/engine/seed-ddl.js +2 -17
  93. package/dist/engine/seed-registry.d.ts.map +1 -1
  94. package/dist/engine/seed-types-generator.d.ts +2 -17
  95. package/dist/engine/seed-types-generator.d.ts.map +1 -1
  96. package/dist/engine/seed-types-generator.js +3 -31
  97. package/dist/engine/seed-validation.d.ts.map +1 -1
  98. package/dist/engine/seed-validation.js +0 -10
  99. package/dist/engine/seeds/seed-definition-diff.d.ts +1 -1
  100. package/dist/engine/seeds/seed-definition-diff.d.ts.map +1 -1
  101. package/dist/engine/seeds/seed-definition-diff.js +2 -2
  102. package/dist/engine/seeds/seed-validation.d.ts.map +1 -1
  103. package/dist/engine/seeds/seed-validation.js +3 -12
  104. package/dist/engine/types.d.ts +7 -7
  105. package/dist/engine/types.d.ts.map +1 -1
  106. package/dist/engine.d.ts +144 -0
  107. package/dist/engine.d.ts.map +1 -0
  108. package/dist/engine.js +741 -0
  109. package/dist/file-types.d.ts +13 -0
  110. package/dist/file-types.d.ts.map +1 -0
  111. package/dist/file-types.js +85 -0
  112. package/dist/hooks.d.ts +29 -0
  113. package/dist/hooks.d.ts.map +1 -0
  114. package/dist/hooks.js +3 -0
  115. package/dist/id-generator.d.ts +26 -0
  116. package/dist/id-generator.d.ts.map +1 -0
  117. package/dist/id-generator.js +12 -0
  118. package/dist/idempotency.repository.d.ts +13 -0
  119. package/dist/idempotency.repository.d.ts.map +1 -0
  120. package/dist/idempotency.repository.js +3 -0
  121. package/dist/index.d.ts +1 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -0
  124. package/dist/kanban-position.repository.d.ts +19 -0
  125. package/dist/kanban-position.repository.d.ts.map +1 -0
  126. package/dist/kanban-position.repository.js +3 -0
  127. package/dist/kanban.d.ts +75 -0
  128. package/dist/kanban.d.ts.map +1 -0
  129. package/dist/kanban.js +82 -0
  130. package/dist/layout-permissions.d.ts +3 -0
  131. package/dist/layout-permissions.d.ts.map +1 -0
  132. package/dist/layout-permissions.js +11 -0
  133. package/dist/media.repository.d.ts +61 -0
  134. package/dist/media.repository.d.ts.map +1 -0
  135. package/dist/media.repository.js +3 -0
  136. package/dist/notifications/notification.repository.d.ts +6 -3
  137. package/dist/notifications/notification.repository.d.ts.map +1 -1
  138. package/dist/policies.d.ts +10 -0
  139. package/dist/policies.d.ts.map +1 -0
  140. package/dist/policies.js +33 -0
  141. package/dist/queue.interface.d.ts +39 -0
  142. package/dist/queue.interface.d.ts.map +1 -0
  143. package/dist/queue.interface.js +3 -0
  144. package/dist/queue.stub.d.ts +6 -0
  145. package/dist/queue.stub.d.ts.map +1 -0
  146. package/dist/queue.stub.js +8 -0
  147. package/dist/relations.d.ts +28 -0
  148. package/dist/relations.d.ts.map +1 -0
  149. package/dist/relations.js +25 -0
  150. package/dist/richtext-render.d.ts +11 -0
  151. package/dist/richtext-render.d.ts.map +1 -0
  152. package/dist/richtext-render.js +87 -0
  153. package/dist/richtext.d.ts +11 -0
  154. package/dist/richtext.d.ts.map +1 -0
  155. package/dist/richtext.js +13 -0
  156. package/dist/scheduler.interface.d.ts +4 -0
  157. package/dist/scheduler.interface.d.ts.map +1 -0
  158. package/dist/scheduler.interface.js +3 -0
  159. package/dist/scheduler.stub.d.ts +5 -0
  160. package/dist/scheduler.stub.d.ts.map +1 -0
  161. package/dist/scheduler.stub.js +7 -0
  162. package/dist/schema-mutator.d.ts +26 -0
  163. package/dist/schema-mutator.d.ts.map +1 -0
  164. package/dist/schema-mutator.js +3 -0
  165. package/dist/security/time-trap.d.ts +3 -2
  166. package/dist/security/time-trap.d.ts.map +1 -1
  167. package/dist/security/time-trap.js +5 -4
  168. package/dist/seed-ddl-destructive.d.ts +40 -0
  169. package/dist/seed-ddl-destructive.d.ts.map +1 -0
  170. package/dist/seed-ddl-destructive.js +149 -0
  171. package/dist/seed-ddl.d.ts +40 -0
  172. package/dist/seed-ddl.d.ts.map +1 -0
  173. package/dist/seed-ddl.js +100 -0
  174. package/dist/seed-layout.d.ts +145 -0
  175. package/dist/seed-layout.d.ts.map +1 -0
  176. package/dist/seed-layout.js +192 -0
  177. package/dist/seed-layout.repository.d.ts +22 -0
  178. package/dist/seed-layout.repository.d.ts.map +1 -0
  179. package/dist/seed-layout.repository.js +3 -0
  180. package/dist/seed-registry.d.ts +71 -0
  181. package/dist/seed-registry.d.ts.map +1 -0
  182. package/dist/seed-registry.js +143 -0
  183. package/dist/seed-types-generator.d.ts +1 -1
  184. package/dist/seed-types-generator.d.ts.map +1 -1
  185. package/dist/seed-validation.d.ts +23 -0
  186. package/dist/seed-validation.d.ts.map +1 -0
  187. package/dist/seed-validation.js +224 -0
  188. package/dist/seed.repository.d.ts +37 -0
  189. package/dist/seed.repository.d.ts.map +1 -0
  190. package/dist/seed.repository.js +3 -0
  191. package/dist/seeds.d.ts +20 -0
  192. package/dist/seeds.d.ts.map +1 -0
  193. package/dist/seeds.js +21 -0
  194. package/dist/settings/site-settings.repository.d.ts +2 -0
  195. package/dist/settings/site-settings.repository.d.ts.map +1 -1
  196. package/dist/site-settings.repository.d.ts +16 -0
  197. package/dist/site-settings.repository.d.ts.map +1 -0
  198. package/dist/site-settings.repository.js +3 -0
  199. package/dist/slug-utils.d.ts +18 -0
  200. package/dist/slug-utils.d.ts.map +1 -0
  201. package/dist/slug-utils.js +32 -0
  202. package/dist/storage.d.ts +46 -0
  203. package/dist/storage.d.ts.map +1 -0
  204. package/dist/storage.js +3 -0
  205. package/dist/types.d.ts +243 -0
  206. package/dist/types.d.ts.map +1 -0
  207. package/dist/types.js +3 -0
  208. package/dist/validation.d.ts +50 -0
  209. package/dist/validation.d.ts.map +1 -0
  210. package/dist/validation.js +660 -0
  211. package/dist/webhook-validation.d.ts +3 -0
  212. package/dist/webhook-validation.d.ts.map +1 -0
  213. package/dist/webhook-validation.js +6 -0
  214. package/package.json +1 -1
  215. package/dist/content/content-lock.repository.d.ts +0 -63
  216. package/dist/content/content-lock.repository.d.ts.map +0 -1
  217. package/dist/content/content-lock.repository.js +0 -15
@@ -0,0 +1,247 @@
1
+ import { Seed, SelectOptions } from './types.js';
2
+ /**
3
+ * One row of the cross-seed pending-drafts overview. Aggregates the minimum a
4
+ * reviewer needs to triage a draft without opening it: which seed it belongs to,
5
+ * a human title, when it was last touched, and who touched it.
6
+ */
7
+ export interface DraftSummary {
8
+ id: string;
9
+ seedSlug: string;
10
+ seedLabel: string;
11
+ title: string;
12
+ updatedAt: number;
13
+ lastModifiedBy: {
14
+ name: string | null;
15
+ email: string;
16
+ };
17
+ }
18
+ /**
19
+ * Base Repository Error
20
+ */
21
+ export declare class RepositoryError extends Error {
22
+ cause?: unknown | undefined;
23
+ constructor(message: string, cause?: unknown | undefined);
24
+ }
25
+ /**
26
+ * Thrown when an entry is not found by ID or Slug
27
+ */
28
+ export declare class EntryNotFoundError extends RepositoryError {
29
+ constructor(message: string);
30
+ }
31
+ /**
32
+ * Thrown when a slug already exists for a content type
33
+ */
34
+ export declare class SlugConflictError extends RepositoryError {
35
+ constructor(message: string);
36
+ }
37
+ /**
38
+ * Thrown by publishDraft when a non-null relation value points to a missing
39
+ * target row. Mapped to 422 Unprocessable Entity by the API problem-mapper.
40
+ */
41
+ export declare class RelationTargetNotFoundError extends RepositoryError {
42
+ readonly alias: string;
43
+ readonly targetSeed: string;
44
+ readonly value: string;
45
+ constructor(params: {
46
+ alias: string;
47
+ targetSeed: string;
48
+ value: string;
49
+ });
50
+ }
51
+ /**
52
+ * Thrown by lifecycle `before*` hooks to signal a business validation failure.
53
+ * Mapped to 422 Unprocessable Entity by the API problem-mapper.
54
+ */
55
+ export declare class HookValidationError extends RepositoryError {
56
+ readonly fields?: Array<{
57
+ field: string;
58
+ message: string;
59
+ }>;
60
+ constructor(message: string, fields?: Array<{
61
+ field: string;
62
+ message: string;
63
+ }>);
64
+ }
65
+ export type BulkFieldUpdate = {
66
+ kind: 'set';
67
+ value: unknown;
68
+ } | {
69
+ kind: 'array_replace';
70
+ value: string[];
71
+ } | {
72
+ kind: 'array_add';
73
+ value: string[];
74
+ } | {
75
+ kind: 'array_remove';
76
+ value: string[];
77
+ };
78
+ /**
79
+ * Options passed to write operations. Currently carries the acting user
80
+ * (extracted from the JWT) so lifecycle hooks can attribute changes.
81
+ */
82
+ export interface RepositoryOptions {
83
+ actor?: {
84
+ id: string;
85
+ role?: string;
86
+ email?: string;
87
+ };
88
+ }
89
+ /**
90
+ * Declarative multi-write operation translated into a single `db.batch` call.
91
+ * Used for coordinated writes across one or more seeds when D1's lack of
92
+ * interactive transactions makes a callback-based API impossible.
93
+ *
94
+ * NOTE: document-level lifecycle hooks do NOT run for operations inside a
95
+ * `runBatch` call — they would be non-atomic side-effects.
96
+ */
97
+ export type BatchWrite = {
98
+ kind: 'create';
99
+ seed: Seed;
100
+ id: string;
101
+ slug: string;
102
+ status: string;
103
+ data: Record<string, any>;
104
+ } | {
105
+ kind: 'update';
106
+ seed: Seed;
107
+ id: string;
108
+ data: Record<string, any>;
109
+ status?: string;
110
+ } | {
111
+ kind: 'mutateField';
112
+ seed: Seed;
113
+ id: string;
114
+ fieldName: string;
115
+ operation: {
116
+ type: 'increment' | 'decrement';
117
+ value: number;
118
+ };
119
+ options?: {
120
+ min?: number;
121
+ max?: number;
122
+ };
123
+ };
124
+ /**
125
+ * Interface defining the standard operations for content persistence.
126
+ * This is platform-agnostic and should be implemented for specific databases (e.g., D1).
127
+ */
128
+ export interface ContentRepository {
129
+ /**
130
+ * Retrieves a paginated and filtered list of entries.
131
+ */
132
+ findMany(seed: Seed, options: SelectOptions): Promise<{
133
+ items: Record<string, any>[];
134
+ total: number;
135
+ }>;
136
+ /**
137
+ * Finds a single entry by its unique ID.
138
+ * Throws EntryNotFoundError if not found.
139
+ */
140
+ findById(seed: Seed, id: string): Promise<Record<string, any>>;
141
+ /**
142
+ * Finds a single entry by its unique slug.
143
+ * Throws EntryNotFoundError if not found.
144
+ */
145
+ findBySlug(seed: Seed, slug: string): Promise<Record<string, any>>;
146
+ /**
147
+ * Computes facets (status counts and distinct tags) for a content type.
148
+ */
149
+ getFacets(seed: Seed): Promise<{
150
+ statuses: Record<string, number>;
151
+ tagsByColumn: Record<string, string[]>;
152
+ }>;
153
+ /**
154
+ * Creates a new content entry in the live table.
155
+ * Throws SlugConflictError if the slug is already taken.
156
+ */
157
+ create(seed: Seed, id: string, slug: string, status: string, data: Record<string, any>, options?: RepositoryOptions): Promise<void>;
158
+ /**
159
+ * Partially updates an existing entry in the live table.
160
+ * Throws EntryNotFoundError if the ID does not exist.
161
+ */
162
+ update(seed: Seed, id: string, data: Record<string, any>, status?: string, options?: RepositoryOptions): Promise<void>;
163
+ /**
164
+ * Deletes an entry from the live table.
165
+ * Returns the deleted row data (useful for media cleanup).
166
+ * Throws EntryNotFoundError if the ID does not exist.
167
+ */
168
+ delete(seed: Seed, id: string, options?: RepositoryOptions): Promise<{
169
+ row: Record<string, any>;
170
+ }>;
171
+ /**
172
+ * Atomically increments/decrements a numeric field with optional min/max guards.
173
+ * Bypasses document-level lifecycle hooks — it's a single UPDATE statement,
174
+ * used to prevent race conditions on counters (stock, balances).
175
+ * Throws RepositoryError if `fieldName` is not a numeric branch of `seed`, or
176
+ * if the guard conditions fail / the row does not exist.
177
+ */
178
+ mutateField(seed: Seed, id: string, fieldName: string, operation: {
179
+ type: 'increment' | 'decrement';
180
+ value: number;
181
+ }, options?: {
182
+ min?: number;
183
+ max?: number;
184
+ }): Promise<{
185
+ newValue: number;
186
+ }>;
187
+ /**
188
+ * Atomically applies an axis-value patch AND a kanban_positions upsert in one DB batch (KB-S04e).
189
+ * `patch` is null for same-column reorders (position only).
190
+ */
191
+ updateWithKanbanPosition(seed: Seed, id: string, patch: Record<string, unknown> | null, position: string, axisBranchId: string, ctx: {
192
+ actor: string;
193
+ }): Promise<{
194
+ success: boolean;
195
+ }>;
196
+ /**
197
+ * Executes a list of write operations atomically via a single `db.batch`.
198
+ * Document-level lifecycle hooks do NOT run for operations inside this call.
199
+ */
200
+ runBatch(operations: BatchWrite[]): Promise<void>;
201
+ /**
202
+ * Saves or updates a pending draft in the mirror table.
203
+ */
204
+ saveDraft(seed: Seed, entryId: string, data: Record<string, any>): Promise<void>;
205
+ /**
206
+ * Retrieves the pending draft for a given entry.
207
+ * Returns null if no draft exists.
208
+ */
209
+ getDraft(seed: Seed, entryId: string): Promise<Record<string, any> | null>;
210
+ /**
211
+ * Atomic promotion of a draft to the live table.
212
+ * Must use a transaction (db.batch) to update live and delete draft.
213
+ */
214
+ publishDraft(seed: Seed, entryId: string): Promise<void>;
215
+ /**
216
+ * Discards the pending draft.
217
+ */
218
+ deleteDraft(seed: Seed, entryId: string): Promise<void>;
219
+ /**
220
+ * Checks if a slug is already taken by another entry.
221
+ */
222
+ existsSlug(seed: Seed, slug: string, excludeId?: string): Promise<boolean>;
223
+ /**
224
+ * Checks if an entry has a pending draft.
225
+ */
226
+ hasDraft(seed: Seed, entryId: string): Promise<boolean>;
227
+ /**
228
+ * Aggregates pending drafts across every draft-enabled seed in a single round-trip.
229
+ * Exists so the unified /drafts view never issues one query per seed.
230
+ * @param seeds The draft-enabled seeds to scan (caller passes seedRegistry.draftEnabled()).
231
+ * @returns Drafts newest-first; empty array when no seeds or no drafts.
232
+ */
233
+ findPendingDrafts(seeds: Seed[]): Promise<DraftSummary[]>;
234
+ /**
235
+ * Apply the same field update to many entries. Returns per-id outcome.
236
+ * Caller is responsible for validation; this method assumes the payload is
237
+ * already shape-checked against the seed.
238
+ */
239
+ bulkUpdate(seedSlug: string, ids: string[], fields: Record<string, BulkFieldUpdate>): Promise<{
240
+ updated: number;
241
+ failed: Array<{
242
+ id: string;
243
+ reason: string;
244
+ }>;
245
+ }>;
246
+ }
247
+ //# sourceMappingURL=content.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.repository.d.ts","sourceRoot":"","sources":["../src/content.repository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACJ,KAAK,CAAC,EAAE,OAAO;gBAAvC,OAAO,EAAE,MAAM,EAAS,KAAK,CAAC,EAAE,OAAO,YAAA;CAIpD;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;gBACzC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,eAAe;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;CASzE;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;gBAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAKhF;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAE7C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACtD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE;QAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAE/K;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEtG;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IAE9D;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IAElE;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;KACvC,CAAC,CAAA;IAEF;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEnI;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtH;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAA;IAElG;;;;;;OAMG;IACH,WAAW,CACT,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE;QAAE,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAC7D,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEhC;;;OAGG;IACH,wBAAwB,CACtB,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACrC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAEhC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhF;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IAE1E;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAExD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAE1E;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvD;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAEzD;;;;OAIG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACtC,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CAC/E"}
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright (c) 2024–2026 Flavio De Musso
3
+ /**
4
+ * Base Repository Error
5
+ */
6
+ export class RepositoryError extends Error {
7
+ cause;
8
+ constructor(message, cause) {
9
+ super(message);
10
+ this.cause = cause;
11
+ this.name = 'RepositoryError';
12
+ }
13
+ }
14
+ /**
15
+ * Thrown when an entry is not found by ID or Slug
16
+ */
17
+ export class EntryNotFoundError extends RepositoryError {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'EntryNotFoundError';
21
+ }
22
+ }
23
+ /**
24
+ * Thrown when a slug already exists for a content type
25
+ */
26
+ export class SlugConflictError extends RepositoryError {
27
+ constructor(message) {
28
+ super(message);
29
+ this.name = 'SlugConflictError';
30
+ }
31
+ }
32
+ /**
33
+ * Thrown by publishDraft when a non-null relation value points to a missing
34
+ * target row. Mapped to 422 Unprocessable Entity by the API problem-mapper.
35
+ */
36
+ export class RelationTargetNotFoundError extends RepositoryError {
37
+ alias;
38
+ targetSeed;
39
+ value;
40
+ constructor(params) {
41
+ super(`Relation target not found: field '${params.alias}' references '${params.targetSeed}' id='${params.value}' which does not exist`);
42
+ this.name = 'RelationTargetNotFoundError';
43
+ this.alias = params.alias;
44
+ this.targetSeed = params.targetSeed;
45
+ this.value = params.value;
46
+ }
47
+ }
48
+ /**
49
+ * Thrown by lifecycle `before*` hooks to signal a business validation failure.
50
+ * Mapped to 422 Unprocessable Entity by the API problem-mapper.
51
+ */
52
+ export class HookValidationError extends RepositoryError {
53
+ fields;
54
+ constructor(message, fields) {
55
+ super(message);
56
+ this.name = 'HookValidationError';
57
+ this.fields = fields;
58
+ }
59
+ }
@@ -41,8 +41,8 @@ export interface DashboardLayout {
41
41
  /** Namespaced widget type — lowercase npm-name-compatible.
42
42
  * Built-ins use the 'core/' prefix; custom widgets '@scope/name'. */
43
43
  export declare const WIDGET_TYPE_REGEX: RegExp;
44
- /** Max serialized size of a single widget `config`
45
- * (`JSON.stringify(widget.config).length`) — guards D1 row bloat. */
44
+ /** Max serialized size of a single widget `config`, in UTF-8 bytes
45
+ * (`JSON.stringify(widget.config)` encoded) — guards D1 row bloat. */
46
46
  export declare const MAX_WIDGET_CONFIG_BYTES = 8192;
47
47
  /** Max serialized size of a whole layout. Keeps the `dashboard_layouts` row
48
48
  * far below D1's per-row limit and bounds the per-request cost of every GET. */
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-layout.d.ts","sourceRoot":"","sources":["../../src/dashboard-layout/dashboard-layout.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAM9C;;sEAEsE;AACtE,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B;gCAC4B;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B;AAMD;sEACsE;AACtE,eAAO,MAAM,iBAAiB,QAA6B,CAAA;AAE3D;sEACsE;AACtE,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAE3C;iFACiF;AACjF,eAAO,MAAM,0BAA0B,QAAa,CAAA;AAEpD,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAOxC,eAAO,MAAM,6BAA6B;;;;;iBAKxC,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;iBAGhC,CAAA;AACF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;iBAOjC,CAAA;AACF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAQ/B,CAAA;AAQH;;6DAE6D;AAC7D,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,MAAM,CAAA;CAAE,GAC7B,eAAe,CA2EjB;AAMD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B;uEACmE;IACnE,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACvC;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEjF;;;;mDAImD;AACnD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,sBAAsB,GAC1B,6BAA6B,CA2E/B"}
1
+ {"version":3,"file":"dashboard-layout.d.ts","sourceRoot":"","sources":["../../src/dashboard-layout/dashboard-layout.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAM9C;;sEAEsE;AACtE,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B;gCAC4B;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B;AAMD;sEACsE;AACtE,eAAO,MAAM,iBAAiB,QAA6B,CAAA;AAE3D;uEACuE;AACvE,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAE3C;iFACiF;AACjF,eAAO,MAAM,0BAA0B,QAAa,CAAA;AAEpD,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAOxC,eAAO,MAAM,6BAA6B;;;;;iBAKxC,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;iBAGhC,CAAA;AACF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;iBAOjC,CAAA;AACF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAQ/B,CAAA;AAQH;;6DAE6D;AAC7D,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,MAAM,CAAA;CAAE,GAC7B,eAAe,CA2EjB;AAMD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B;uEACmE;IACnE,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACvC;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEjF;;;;mDAImD;AACnD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,sBAAsB,GAC1B,6BAA6B,CA2E/B"}
@@ -7,8 +7,8 @@ import { z } from 'zod';
7
7
  /** Namespaced widget type — lowercase npm-name-compatible.
8
8
  * Built-ins use the 'core/' prefix; custom widgets '@scope/name'. */
9
9
  export const WIDGET_TYPE_REGEX = /^[a-z0-9@][a-z0-9@/_-]*$/;
10
- /** Max serialized size of a single widget `config`
11
- * (`JSON.stringify(widget.config).length`) — guards D1 row bloat. */
10
+ /** Max serialized size of a single widget `config`, in UTF-8 bytes
11
+ * (`JSON.stringify(widget.config)` encoded) — guards D1 row bloat. */
12
12
  export const MAX_WIDGET_CONFIG_BYTES = 8192;
13
13
  /** Max serialized size of a whole layout. Keeps the `dashboard_layouts` row
14
14
  * far below D1's per-row limit and bounds the per-request cost of every GET. */
@@ -177,7 +177,7 @@ export function validateDashboardLayout(layout, ctx) {
177
177
  else {
178
178
  seenWidgetIds.add(w.id);
179
179
  }
180
- if (JSON.stringify(w.config ?? {}).length > MAX_WIDGET_CONFIG_BYTES) {
180
+ if (new TextEncoder().encode(JSON.stringify(w.config ?? {})).length > MAX_WIDGET_CONFIG_BYTES) {
181
181
  errors.push(`Widget '${w.type}' (id=${w.id}): config exceeds ${MAX_WIDGET_CONFIG_BYTES} bytes when serialized.`);
182
182
  }
183
183
  if (ctx.knownWidgetTypes !== undefined && !ctx.knownWidgetTypes.has(w.type)) {
@@ -0,0 +1,12 @@
1
+ import type { Branch } from '../engine/types.js';
2
+ import type { SeedLookup } from '../engine/query/search-support.js';
3
+ /**
4
+ * The target-seed branch that supplies a relation's avatar image, or `null` when the relation has no
5
+ * avatar configured or the configuration no longer resolves (target gone, field renamed, retyped,
6
+ * hidden). Callers treat `null` as "no avatar" — a stale `avatarSource` degrades, it never throws.
7
+ *
8
+ * @param branch The relation branch carrying `avatarSource`.
9
+ * @param lookup Resolves the relation target.
10
+ */
11
+ export declare function resolveRelationAvatar(branch: Branch, lookup: SeedLookup): Branch | null;
12
+ //# sourceMappingURL=relation-avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-avatar.d.ts","sourceRoot":"","sources":["../../src/dashboard-layout/relation-avatar.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAGnE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAKvF"}
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright (c) 2024–2026 Flavio De Musso
3
+ import { isImageMediaBranch } from './seed-layout.js';
4
+ /**
5
+ * The target-seed branch that supplies a relation's avatar image, or `null` when the relation has no
6
+ * avatar configured or the configuration no longer resolves (target gone, field renamed, retyped,
7
+ * hidden). Callers treat `null` as "no avatar" — a stale `avatarSource` degrades, it never throws.
8
+ *
9
+ * @param branch The relation branch carrying `avatarSource`.
10
+ * @param lookup Resolves the relation target.
11
+ */
12
+ export function resolveRelationAvatar(branch, lookup) {
13
+ if (branch.type !== 'relation' || !branch.avatarSource || !branch.targetSeed)
14
+ return null;
15
+ const target = lookup(branch.targetSeed);
16
+ const source = target?.branches.find((b) => b.alias === branch.avatarSource);
17
+ return source && isImageMediaBranch(source) ? source : null;
18
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"seed-layout.d.ts","sourceRoot":"","sources":["../../src/dashboard-layout/seed-layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seed-layout.d.ts","sourceRoot":"","sources":["../../src/dashboard-layout/seed-layout.ts"],"names":[],"mappings":"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"}
@@ -163,6 +163,22 @@ export const formLayoutSchema = z
163
163
  })
164
164
  .refine((layout) => new TextEncoder().encode(JSON.stringify(layout)).length <= MAX_LAYOUT_BYTES, {
165
165
  message: `Layout exceeds the ${MAX_LAYOUT_BYTES / 1024} KB size limit.`,
166
+ })
167
+ .superRefine((layout, ctx) => {
168
+ // The builder keys tabs, sections and columns (and drag-and-drop targets) by id alone.
169
+ const seen = { tab: new Set(), section: new Set(), column: new Set() };
170
+ const claim = (kind, id, path) => {
171
+ if (seen[kind].has(id))
172
+ ctx.addIssue({ code: 'custom', path, message: `Duplicate ${kind} id '${id}'.` });
173
+ seen[kind].add(id);
174
+ };
175
+ layout.tabs.forEach((tab, ti) => {
176
+ claim('tab', tab.id, ['tabs', ti, 'id']);
177
+ tab.sections.forEach((section, si) => {
178
+ claim('section', section.id, ['tabs', ti, 'sections', si, 'id']);
179
+ section.columns.forEach((col, ci) => claim('column', col.id, ['tabs', ti, 'sections', si, 'columns', ci, 'id']));
180
+ });
181
+ });
166
182
  });
167
183
  // ---------------------------------------------------------------------------
168
184
  // Default layout generator
@@ -267,7 +283,7 @@ export function validateLayoutAgainstSeed(layout, seed) {
267
283
  const branch = findBranchById(seed, f.branchId);
268
284
  if (!branch)
269
285
  return false;
270
- if (UNSUPPORTED_BRANCH_TYPES.has(branch.type) || SYSTEM_ALIASES.has(branch.alias))
286
+ if (!isLayoutableBranch(branch))
271
287
  return false;
272
288
  return true;
273
289
  }),
@@ -0,0 +1,154 @@
1
+ import { z } from 'zod';
2
+ import type { Seed } from './types.js';
3
+ /** A placed widget. `type` is namespaced ('core/stat', '@acme/weather').
4
+ * `config` is opaque to core/API except for the optional `seedSlug` key,
5
+ * which enables auto-cleanup when the referenced seed disappears. */
6
+ export interface DashboardWidgetInstance {
7
+ id: string;
8
+ type: string;
9
+ title?: string;
10
+ config: Record<string, unknown>;
11
+ }
12
+ export interface DashboardColumn {
13
+ id: string;
14
+ widgets: DashboardWidgetInstance[];
15
+ }
16
+ export interface DashboardSection {
17
+ id: string;
18
+ label?: string;
19
+ hideLabel?: boolean;
20
+ collapsible?: boolean;
21
+ /** 1–4 columns. Enforced by validator. */
22
+ columns: DashboardColumn[];
23
+ /** Optional spans on a 12-unit grid, parallel to `columns`, must sum to 12.
24
+ * Absent = equal split. */
25
+ columnSpans?: number[];
26
+ }
27
+ export interface DashboardPageLayout {
28
+ id: string;
29
+ /** URL identity (?page=<slug>). Unique within the layout. */
30
+ slug: string;
31
+ label: string;
32
+ /** Lucide icon name, same convention as DashboardSeedConfig.icon. */
33
+ icon?: string;
34
+ sections: DashboardSection[];
35
+ }
36
+ export interface DashboardLayout {
37
+ /** Format version — bump when introducing breaking changes. */
38
+ version: 1;
39
+ pages: DashboardPageLayout[];
40
+ }
41
+ /** Namespaced widget type — lowercase npm-name-compatible.
42
+ * Built-ins use the 'core/' prefix; custom widgets '@scope/name'. */
43
+ export declare const WIDGET_TYPE_REGEX: RegExp;
44
+ /** Max serialized size of a single widget `config`
45
+ * (`JSON.stringify(widget.config).length`) — guards D1 row bloat. */
46
+ export declare const MAX_WIDGET_CONFIG_BYTES = 8192;
47
+ export declare const dashboardWidgetInstanceSchema: z.ZodObject<{
48
+ id: z.ZodString;
49
+ type: z.ZodString;
50
+ title: z.ZodOptional<z.ZodString>;
51
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
52
+ }, z.core.$strip>;
53
+ export declare const dashboardColumnSchema: z.ZodObject<{
54
+ id: z.ZodString;
55
+ widgets: z.ZodArray<z.ZodObject<{
56
+ id: z.ZodString;
57
+ type: z.ZodString;
58
+ title: z.ZodOptional<z.ZodString>;
59
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
60
+ }, z.core.$strip>>;
61
+ }, z.core.$strip>;
62
+ export declare const dashboardSectionSchema: z.ZodObject<{
63
+ id: z.ZodString;
64
+ label: z.ZodOptional<z.ZodString>;
65
+ hideLabel: z.ZodOptional<z.ZodBoolean>;
66
+ collapsible: z.ZodOptional<z.ZodBoolean>;
67
+ columns: z.ZodArray<z.ZodObject<{
68
+ id: z.ZodString;
69
+ widgets: z.ZodArray<z.ZodObject<{
70
+ id: z.ZodString;
71
+ type: z.ZodString;
72
+ title: z.ZodOptional<z.ZodString>;
73
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
74
+ }, z.core.$strip>>;
75
+ }, z.core.$strip>>;
76
+ columnSpans: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
77
+ }, z.core.$strip>;
78
+ export declare const dashboardPageSchema: z.ZodObject<{
79
+ id: z.ZodString;
80
+ slug: z.ZodString;
81
+ label: z.ZodString;
82
+ icon: z.ZodOptional<z.ZodString>;
83
+ sections: z.ZodArray<z.ZodObject<{
84
+ id: z.ZodString;
85
+ label: z.ZodOptional<z.ZodString>;
86
+ hideLabel: z.ZodOptional<z.ZodBoolean>;
87
+ collapsible: z.ZodOptional<z.ZodBoolean>;
88
+ columns: z.ZodArray<z.ZodObject<{
89
+ id: z.ZodString;
90
+ widgets: z.ZodArray<z.ZodObject<{
91
+ id: z.ZodString;
92
+ type: z.ZodString;
93
+ title: z.ZodOptional<z.ZodString>;
94
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
95
+ }, z.core.$strip>>;
96
+ }, z.core.$strip>>;
97
+ columnSpans: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
98
+ }, z.core.$strip>>;
99
+ }, z.core.$strip>;
100
+ export declare const dashboardLayoutSchema: z.ZodObject<{
101
+ version: z.ZodLiteral<1>;
102
+ pages: z.ZodArray<z.ZodObject<{
103
+ id: z.ZodString;
104
+ slug: z.ZodString;
105
+ label: z.ZodString;
106
+ icon: z.ZodOptional<z.ZodString>;
107
+ sections: z.ZodArray<z.ZodObject<{
108
+ id: z.ZodString;
109
+ label: z.ZodOptional<z.ZodString>;
110
+ hideLabel: z.ZodOptional<z.ZodBoolean>;
111
+ collapsible: z.ZodOptional<z.ZodBoolean>;
112
+ columns: z.ZodArray<z.ZodObject<{
113
+ id: z.ZodString;
114
+ widgets: z.ZodArray<z.ZodObject<{
115
+ id: z.ZodString;
116
+ type: z.ZodString;
117
+ title: z.ZodOptional<z.ZodString>;
118
+ config: z.ZodRecord<z.ZodString, z.ZodUnknown>;
119
+ }, z.core.$strip>>;
120
+ }, z.core.$strip>>;
121
+ columnSpans: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
122
+ }, z.core.$strip>>;
123
+ }, z.core.$strip>>;
124
+ }, z.core.$strip>;
125
+ /** Structural port of the legacy hardcoded dashboard config into a single
126
+ * 'Overview' page. Widgets fetch their own data: configs carry only the
127
+ * variant and (where relevant) the default seed binding. */
128
+ export declare function generateDefaultDashboardLayout(seeds: Seed[], opts?: {
129
+ newId: () => string;
130
+ }): DashboardLayout;
131
+ export interface DashboardLayoutContext {
132
+ /** Slugs of currently registered seeds (from ISeedRegistry.all()). */
133
+ seedSlugs: ReadonlySet<string>;
134
+ /** Optional: widget types known to the caller (frontend registry).
135
+ * When provided, unknown types produce WARNINGS, never strips. */
136
+ knownWidgetTypes?: ReadonlySet<string>;
137
+ }
138
+ export type ValidateDashboardLayoutResult = {
139
+ ok: true;
140
+ cleaned: DashboardLayout;
141
+ warnings: string[];
142
+ } | {
143
+ ok: false;
144
+ errors: string[];
145
+ cleaned: DashboardLayout;
146
+ warnings: string[];
147
+ };
148
+ /** Semantic validation on top of the Zod shape check (the caller's job).
149
+ * Widgets bound to a seed that no longer exists are silently stripped
150
+ * (auto-cleanup, recorded as a warning). Unknown widget types only warn —
151
+ * custom widgets are invisible to the Worker and must never be stripped.
152
+ * `cleaned` is always returned, errors or not. */
153
+ export declare function validateDashboardLayout(layout: DashboardLayout, ctx: DashboardLayoutContext): ValidateDashboardLayoutResult;
154
+ //# sourceMappingURL=dashboard-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-layout.d.ts","sourceRoot":"","sources":["../src/dashboard-layout.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAMtC;;sEAEsE;AACtE,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B;gCAC4B;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,OAAO,EAAE,CAAC,CAAA;IACV,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAC7B;AAMD;sEACsE;AACtE,eAAO,MAAM,iBAAiB,QAA6B,CAAA;AAE3D;sEACsE;AACtE,eAAO,MAAM,uBAAuB,OAAO,CAAA;AAM3C,eAAO,MAAM,6BAA6B;;;;;iBAKxC,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;iBAGhC,CAAA;AACF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;iBAOjC,CAAA;AACF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBAM9B,CAAA;AACF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAGhC,CAAA;AAQF;;6DAE6D;AAC7D,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,MAAM,CAAA;CAAE,GAC7B,eAAe,CA2EjB;AAMD,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B;uEACmE;IACnE,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACvC;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEjF;;;;mDAImD;AACnD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,sBAAsB,GAC1B,6BAA6B,CA2E/B"}