@revealui/contracts 1.0.0

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 (191) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/a2a/index.d.ts +383 -0
  4. package/dist/a2a/index.d.ts.map +1 -0
  5. package/dist/a2a/index.js +276 -0
  6. package/dist/a2a/index.js.map +1 -0
  7. package/dist/actions/action-validator.d.ts +48 -0
  8. package/dist/actions/action-validator.d.ts.map +1 -0
  9. package/dist/actions/action-validator.js +288 -0
  10. package/dist/actions/action-validator.js.map +1 -0
  11. package/dist/actions/index.d.ts +7 -0
  12. package/dist/actions/index.d.ts.map +1 -0
  13. package/dist/actions/index.js +7 -0
  14. package/dist/actions/index.js.map +1 -0
  15. package/dist/agents/index.d.ts +628 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +511 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/types.d.ts +22 -0
  20. package/dist/agents/types.d.ts.map +1 -0
  21. package/dist/agents/types.js +2 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/api/auth.d.ts +60 -0
  24. package/dist/api/auth.d.ts.map +1 -0
  25. package/dist/api/auth.js +84 -0
  26. package/dist/api/auth.js.map +1 -0
  27. package/dist/api/chat.d.ts +45 -0
  28. package/dist/api/chat.d.ts.map +1 -0
  29. package/dist/api/chat.js +55 -0
  30. package/dist/api/chat.js.map +1 -0
  31. package/dist/api/gdpr.d.ts +39 -0
  32. package/dist/api/gdpr.d.ts.map +1 -0
  33. package/dist/api/gdpr.js +53 -0
  34. package/dist/api/gdpr.js.map +1 -0
  35. package/dist/cms/collection.d.ts +108 -0
  36. package/dist/cms/collection.d.ts.map +1 -0
  37. package/dist/cms/collection.js +144 -0
  38. package/dist/cms/collection.js.map +1 -0
  39. package/dist/cms/compat.d.ts +128 -0
  40. package/dist/cms/compat.d.ts.map +1 -0
  41. package/dist/cms/compat.js +141 -0
  42. package/dist/cms/compat.js.map +1 -0
  43. package/dist/cms/config-contract.d.ts +278 -0
  44. package/dist/cms/config-contract.d.ts.map +1 -0
  45. package/dist/cms/config-contract.js +220 -0
  46. package/dist/cms/config-contract.js.map +1 -0
  47. package/dist/cms/config.d.ts +351 -0
  48. package/dist/cms/config.d.ts.map +1 -0
  49. package/dist/cms/config.js +50 -0
  50. package/dist/cms/config.js.map +1 -0
  51. package/dist/cms/errors.d.ts +122 -0
  52. package/dist/cms/errors.d.ts.map +1 -0
  53. package/dist/cms/errors.js +163 -0
  54. package/dist/cms/errors.js.map +1 -0
  55. package/dist/cms/extensibility.d.ts +211 -0
  56. package/dist/cms/extensibility.d.ts.map +1 -0
  57. package/dist/cms/extensibility.js +313 -0
  58. package/dist/cms/extensibility.js.map +1 -0
  59. package/dist/cms/field.d.ts +69 -0
  60. package/dist/cms/field.d.ts.map +1 -0
  61. package/dist/cms/field.js +94 -0
  62. package/dist/cms/field.js.map +1 -0
  63. package/dist/cms/functions.d.ts +466 -0
  64. package/dist/cms/functions.d.ts.map +1 -0
  65. package/dist/cms/functions.js +19 -0
  66. package/dist/cms/functions.js.map +1 -0
  67. package/dist/cms/global.d.ts +45 -0
  68. package/dist/cms/global.d.ts.map +1 -0
  69. package/dist/cms/global.js +62 -0
  70. package/dist/cms/global.js.map +1 -0
  71. package/dist/cms/index.d.ts +23 -0
  72. package/dist/cms/index.d.ts.map +1 -0
  73. package/dist/cms/index.js +42 -0
  74. package/dist/cms/index.js.map +1 -0
  75. package/dist/cms/structure.d.ts +1601 -0
  76. package/dist/cms/structure.d.ts.map +1 -0
  77. package/dist/cms/structure.js +757 -0
  78. package/dist/cms/structure.js.map +1 -0
  79. package/dist/content/index.d.ts +1542 -0
  80. package/dist/content/index.d.ts.map +1 -0
  81. package/dist/content/index.js +522 -0
  82. package/dist/content/index.js.map +1 -0
  83. package/dist/database/bridge.d.ts +177 -0
  84. package/dist/database/bridge.d.ts.map +1 -0
  85. package/dist/database/bridge.js +139 -0
  86. package/dist/database/bridge.js.map +1 -0
  87. package/dist/database/index.d.ts +8 -0
  88. package/dist/database/index.d.ts.map +1 -0
  89. package/dist/database/index.js +9 -0
  90. package/dist/database/index.js.map +1 -0
  91. package/dist/database/type-bridge.d.ts +178 -0
  92. package/dist/database/type-bridge.d.ts.map +1 -0
  93. package/dist/database/type-bridge.js +154 -0
  94. package/dist/database/type-bridge.js.map +1 -0
  95. package/dist/entities/agent-context.d.ts +280 -0
  96. package/dist/entities/agent-context.d.ts.map +1 -0
  97. package/dist/entities/agent-context.js +390 -0
  98. package/dist/entities/agent-context.js.map +1 -0
  99. package/dist/entities/agent-memory.d.ts +661 -0
  100. package/dist/entities/agent-memory.d.ts.map +1 -0
  101. package/dist/entities/agent-memory.js +544 -0
  102. package/dist/entities/agent-memory.js.map +1 -0
  103. package/dist/entities/board.d.ts +95 -0
  104. package/dist/entities/board.d.ts.map +1 -0
  105. package/dist/entities/board.js +99 -0
  106. package/dist/entities/board.js.map +1 -0
  107. package/dist/entities/code-provenance.d.ts +270 -0
  108. package/dist/entities/code-provenance.d.ts.map +1 -0
  109. package/dist/entities/code-provenance.js +339 -0
  110. package/dist/entities/code-provenance.js.map +1 -0
  111. package/dist/entities/index.d.ts +22 -0
  112. package/dist/entities/index.d.ts.map +1 -0
  113. package/dist/entities/index.js +22 -0
  114. package/dist/entities/index.js.map +1 -0
  115. package/dist/entities/media.d.ts +485 -0
  116. package/dist/entities/media.d.ts.map +1 -0
  117. package/dist/entities/media.js +606 -0
  118. package/dist/entities/media.js.map +1 -0
  119. package/dist/entities/page-revision.d.ts +390 -0
  120. package/dist/entities/page-revision.d.ts.map +1 -0
  121. package/dist/entities/page-revision.js +406 -0
  122. package/dist/entities/page-revision.js.map +1 -0
  123. package/dist/entities/page.d.ts +2349 -0
  124. package/dist/entities/page.d.ts.map +1 -0
  125. package/dist/entities/page.js +377 -0
  126. package/dist/entities/page.js.map +1 -0
  127. package/dist/entities/post.d.ts +619 -0
  128. package/dist/entities/post.d.ts.map +1 -0
  129. package/dist/entities/post.js +555 -0
  130. package/dist/entities/post.js.map +1 -0
  131. package/dist/entities/price.d.ts +772 -0
  132. package/dist/entities/price.d.ts.map +1 -0
  133. package/dist/entities/price.js +308 -0
  134. package/dist/entities/price.js.map +1 -0
  135. package/dist/entities/product.d.ts +753 -0
  136. package/dist/entities/product.d.ts.map +1 -0
  137. package/dist/entities/product.js +307 -0
  138. package/dist/entities/product.js.map +1 -0
  139. package/dist/entities/session.d.ts +222 -0
  140. package/dist/entities/session.d.ts.map +1 -0
  141. package/dist/entities/session.js +253 -0
  142. package/dist/entities/session.js.map +1 -0
  143. package/dist/entities/site.d.ts +387 -0
  144. package/dist/entities/site.d.ts.map +1 -0
  145. package/dist/entities/site.js +348 -0
  146. package/dist/entities/site.js.map +1 -0
  147. package/dist/entities/ticket-comment.d.ts +49 -0
  148. package/dist/entities/ticket-comment.d.ts.map +1 -0
  149. package/dist/entities/ticket-comment.js +58 -0
  150. package/dist/entities/ticket-comment.js.map +1 -0
  151. package/dist/entities/ticket-label.d.ts +64 -0
  152. package/dist/entities/ticket-label.d.ts.map +1 -0
  153. package/dist/entities/ticket-label.js +77 -0
  154. package/dist/entities/ticket-label.js.map +1 -0
  155. package/dist/entities/ticket.d.ts +204 -0
  156. package/dist/entities/ticket.d.ts.map +1 -0
  157. package/dist/entities/ticket.js +205 -0
  158. package/dist/entities/ticket.js.map +1 -0
  159. package/dist/entities/user.d.ts +336 -0
  160. package/dist/entities/user.d.ts.map +1 -0
  161. package/dist/entities/user.js +255 -0
  162. package/dist/entities/user.js.map +1 -0
  163. package/dist/foundation/contract.d.ts +221 -0
  164. package/dist/foundation/contract.d.ts.map +1 -0
  165. package/dist/foundation/contract.js +133 -0
  166. package/dist/foundation/contract.js.map +1 -0
  167. package/dist/foundation/index.d.ts +7 -0
  168. package/dist/foundation/index.d.ts.map +1 -0
  169. package/dist/foundation/index.js +7 -0
  170. package/dist/foundation/index.js.map +1 -0
  171. package/dist/generated/contracts.d.ts +1514 -0
  172. package/dist/generated/contracts.d.ts.map +1 -0
  173. package/dist/generated/contracts.js +959 -0
  174. package/dist/generated/contracts.js.map +1 -0
  175. package/dist/generated/database.d.ts +48 -0
  176. package/dist/generated/database.d.ts.map +1 -0
  177. package/dist/generated/database.js +17 -0
  178. package/dist/generated/database.js.map +1 -0
  179. package/dist/generated/zod-schemas.d.ts +14793 -0
  180. package/dist/generated/zod-schemas.d.ts.map +1 -0
  181. package/dist/generated/zod-schemas.js +547 -0
  182. package/dist/generated/zod-schemas.js.map +1 -0
  183. package/dist/index.d.ts +50 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +81 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/representation/index.d.ts +304 -0
  188. package/dist/representation/index.d.ts.map +1 -0
  189. package/dist/representation/index.js +280 -0
  190. package/dist/representation/index.js.map +1 -0
  191. package/package.json +117 -0
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Media Entity Contract
3
+ *
4
+ * Manages file uploads with metadata, image dimensions, focal points, and thumbnails.
5
+ * Media files are stored in Vercel Blob or other storage providers with rich metadata
6
+ * for responsive images, accessibility, and content management.
7
+ *
8
+ * Business Rules:
9
+ * - MIME type validation for security
10
+ * - Image dimensions required for images
11
+ * - Focal point for smart cropping (0-1 coordinates)
12
+ * - Multiple sizes/thumbnails generated for responsive images
13
+ * - Alt text required for accessibility
14
+ * - Uploaded by tracks user ownership
15
+ * - Cascading null on user deletion
16
+ */
17
+ import { z } from 'zod/v4';
18
+ // =============================================================================
19
+ // Constants
20
+ // =============================================================================
21
+ export const MEDIA_SCHEMA_VERSION = 1;
22
+ // Supported MIME types
23
+ export const IMAGE_MIME_TYPES = [
24
+ 'image/jpeg',
25
+ 'image/jpg',
26
+ 'image/png',
27
+ 'image/gif',
28
+ 'image/webp',
29
+ 'image/svg+xml',
30
+ ];
31
+ export const VIDEO_MIME_TYPES = ['video/mp4', 'video/webm', 'video/ogg'];
32
+ export const AUDIO_MIME_TYPES = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg'];
33
+ export const DOCUMENT_MIME_TYPES = [
34
+ 'application/pdf',
35
+ 'application/msword',
36
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
37
+ 'application/vnd.ms-excel',
38
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
39
+ ];
40
+ export const ALL_MIME_TYPES = [
41
+ ...IMAGE_MIME_TYPES,
42
+ ...VIDEO_MIME_TYPES,
43
+ ...AUDIO_MIME_TYPES,
44
+ ...DOCUMENT_MIME_TYPES,
45
+ ];
46
+ // Media type categories
47
+ export const MEDIA_TYPES = ['image', 'video', 'audio', 'document', 'other'];
48
+ // File size limits (bytes)
49
+ export const FILE_SIZE_LIMITS = {
50
+ IMAGE: 10 * 1024 * 1024, // 10MB
51
+ VIDEO: 100 * 1024 * 1024, // 100MB
52
+ AUDIO: 20 * 1024 * 1024, // 20MB
53
+ DOCUMENT: 10 * 1024 * 1024, // 10MB
54
+ DEFAULT: 10 * 1024 * 1024, // 10MB
55
+ };
56
+ // Image dimension limits
57
+ export const IMAGE_LIMITS = {
58
+ MIN_WIDTH: 1,
59
+ MIN_HEIGHT: 1,
60
+ MAX_WIDTH: 10000,
61
+ MAX_HEIGHT: 10000,
62
+ };
63
+ // Focal point constraints
64
+ export const FOCAL_POINT_LIMITS = {
65
+ MIN: 0,
66
+ MAX: 1,
67
+ };
68
+ // =============================================================================
69
+ // Base Schemas
70
+ // =============================================================================
71
+ /**
72
+ * Focal point schema (normalized coordinates 0-1)
73
+ */
74
+ export const FocalPointSchema = z.object({
75
+ x: z.number().min(FOCAL_POINT_LIMITS.MIN).max(FOCAL_POINT_LIMITS.MAX),
76
+ y: z.number().min(FOCAL_POINT_LIMITS.MIN).max(FOCAL_POINT_LIMITS.MAX),
77
+ });
78
+ /**
79
+ * Image size/thumbnail schema
80
+ */
81
+ export const ImageSizeSchema = z.object({
82
+ name: z.string(),
83
+ width: z.number().int().positive(),
84
+ height: z.number().int().positive(),
85
+ url: z.string().url(),
86
+ filesize: z.number().int().optional(),
87
+ });
88
+ // =============================================================================
89
+ // Base Media Schema
90
+ // =============================================================================
91
+ /**
92
+ * Media object schema
93
+ */
94
+ export const MediaObjectSchema = z.object({
95
+ id: z.string().min(1),
96
+ schemaVersion: z.string().default(String(MEDIA_SCHEMA_VERSION)),
97
+ filename: z.string().min(1, 'Filename is required'),
98
+ mimeType: z.string().min(1, 'MIME type is required'),
99
+ filesize: z.number().int().positive().nullable().optional(),
100
+ url: z.string().url('URL must be valid'),
101
+ alt: z.string().nullable().optional(),
102
+ width: z.number().int().positive().nullable().optional(),
103
+ height: z.number().int().positive().nullable().optional(),
104
+ focalPoint: FocalPointSchema.nullable().optional(),
105
+ sizes: z.array(ImageSizeSchema).nullable().optional(),
106
+ uploadedBy: z.string().nullable().optional(),
107
+ createdAt: z.date(),
108
+ updatedAt: z.date(),
109
+ });
110
+ /**
111
+ * Media schema with validation rules
112
+ */
113
+ export const MediaBaseSchema = MediaObjectSchema.refine((data) => {
114
+ // Images must have dimensions
115
+ if (isImageMimeType(data.mimeType)) {
116
+ return data.width !== null && data.height !== null;
117
+ }
118
+ return true;
119
+ }, {
120
+ message: 'Images must have width and height',
121
+ path: ['width'],
122
+ })
123
+ .refine((data) => {
124
+ // Validate dimensions are within limits
125
+ if (data.width !== null && data.width !== undefined) {
126
+ return data.width >= IMAGE_LIMITS.MIN_WIDTH && data.width <= IMAGE_LIMITS.MAX_WIDTH;
127
+ }
128
+ return true;
129
+ }, {
130
+ message: `Width must be between ${IMAGE_LIMITS.MIN_WIDTH} and ${IMAGE_LIMITS.MAX_WIDTH}`,
131
+ path: ['width'],
132
+ })
133
+ .refine((data) => {
134
+ // Validate dimensions are within limits
135
+ if (data.height !== null && data.height !== undefined) {
136
+ return data.height >= IMAGE_LIMITS.MIN_HEIGHT && data.height <= IMAGE_LIMITS.MAX_HEIGHT;
137
+ }
138
+ return true;
139
+ }, {
140
+ message: `Height must be between ${IMAGE_LIMITS.MIN_HEIGHT} and ${IMAGE_LIMITS.MAX_HEIGHT}`,
141
+ path: ['height'],
142
+ });
143
+ export const MediaSchema = MediaBaseSchema;
144
+ // =============================================================================
145
+ // Insert Schema
146
+ // =============================================================================
147
+ /**
148
+ * Schema for creating new media
149
+ */
150
+ export const MediaInsertSchema = MediaObjectSchema.omit({
151
+ createdAt: true,
152
+ updatedAt: true,
153
+ }).extend({
154
+ createdAt: z.date().optional(),
155
+ updatedAt: z.date().optional(),
156
+ });
157
+ // =============================================================================
158
+ // MIME Type Helpers
159
+ // =============================================================================
160
+ /**
161
+ * Check if MIME type is an image
162
+ */
163
+ export function isImageMimeType(mimeType) {
164
+ return IMAGE_MIME_TYPES.includes(mimeType);
165
+ }
166
+ /**
167
+ * Check if MIME type is a video
168
+ */
169
+ export function isVideoMimeType(mimeType) {
170
+ return VIDEO_MIME_TYPES.includes(mimeType);
171
+ }
172
+ /**
173
+ * Check if MIME type is audio
174
+ */
175
+ export function isAudioMimeType(mimeType) {
176
+ return AUDIO_MIME_TYPES.includes(mimeType);
177
+ }
178
+ /**
179
+ * Check if MIME type is a document
180
+ */
181
+ export function isDocumentMimeType(mimeType) {
182
+ return DOCUMENT_MIME_TYPES.includes(mimeType);
183
+ }
184
+ /**
185
+ * Get media type from MIME type
186
+ */
187
+ export function getMediaType(mimeType) {
188
+ if (isImageMimeType(mimeType))
189
+ return 'image';
190
+ if (isVideoMimeType(mimeType))
191
+ return 'video';
192
+ if (isAudioMimeType(mimeType))
193
+ return 'audio';
194
+ if (isDocumentMimeType(mimeType))
195
+ return 'document';
196
+ return 'other';
197
+ }
198
+ /**
199
+ * Check if MIME type is allowed
200
+ */
201
+ export function isAllowedMimeType(mimeType) {
202
+ return ALL_MIME_TYPES.includes(mimeType);
203
+ }
204
+ /**
205
+ * Get file extension from filename
206
+ */
207
+ export function getFileExtension(filename) {
208
+ const parts = filename.split('.');
209
+ return parts.length > 1 ? (parts[parts.length - 1]?.toLowerCase() ?? '') : '';
210
+ }
211
+ /**
212
+ * Get MIME type from file extension
213
+ */
214
+ export function getMimeTypeFromExtension(extension) {
215
+ const ext = extension.toLowerCase();
216
+ const mimeTypeMap = {
217
+ jpg: 'image/jpeg',
218
+ jpeg: 'image/jpeg',
219
+ png: 'image/png',
220
+ gif: 'image/gif',
221
+ webp: 'image/webp',
222
+ svg: 'image/svg+xml',
223
+ mp4: 'video/mp4',
224
+ webm: 'video/webm',
225
+ ogg: 'video/ogg',
226
+ mp3: 'audio/mpeg',
227
+ wav: 'audio/wav',
228
+ pdf: 'application/pdf',
229
+ doc: 'application/msword',
230
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
231
+ xls: 'application/vnd.ms-excel',
232
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
233
+ };
234
+ return mimeTypeMap[ext] ?? null;
235
+ }
236
+ // =============================================================================
237
+ // Media Type Helpers
238
+ // =============================================================================
239
+ /**
240
+ * Check if media is an image
241
+ */
242
+ export function isImage(media) {
243
+ return isImageMimeType(media.mimeType);
244
+ }
245
+ /**
246
+ * Check if media is a video
247
+ */
248
+ export function isVideo(media) {
249
+ return isVideoMimeType(media.mimeType);
250
+ }
251
+ /**
252
+ * Check if media is audio
253
+ */
254
+ export function isAudio(media) {
255
+ return isAudioMimeType(media.mimeType);
256
+ }
257
+ /**
258
+ * Check if media is a document
259
+ */
260
+ export function isDocument(media) {
261
+ return isDocumentMimeType(media.mimeType);
262
+ }
263
+ // =============================================================================
264
+ // Dimension Helpers
265
+ // =============================================================================
266
+ /**
267
+ * Check if media has dimensions
268
+ */
269
+ export function hasDimensions(media) {
270
+ return (media.width !== null &&
271
+ media.width !== undefined &&
272
+ media.height !== null &&
273
+ media.height !== undefined);
274
+ }
275
+ /**
276
+ * Get aspect ratio
277
+ */
278
+ export function getAspectRatio(media) {
279
+ if (!hasDimensions(media))
280
+ return null;
281
+ return (media.width ?? 1) / (media.height ?? 1);
282
+ }
283
+ /**
284
+ * Check if image is landscape
285
+ */
286
+ export function isLandscape(media) {
287
+ const ratio = getAspectRatio(media);
288
+ return ratio !== null && ratio > 1;
289
+ }
290
+ /**
291
+ * Check if image is portrait
292
+ */
293
+ export function isPortrait(media) {
294
+ const ratio = getAspectRatio(media);
295
+ return ratio !== null && ratio < 1;
296
+ }
297
+ /**
298
+ * Check if image is square
299
+ */
300
+ export function isSquare(media) {
301
+ const ratio = getAspectRatio(media);
302
+ return ratio !== null && Math.abs(ratio - 1) < 0.01;
303
+ }
304
+ /**
305
+ * Calculate scaled dimensions
306
+ */
307
+ export function calculateScaledDimensions(media, maxWidth, maxHeight) {
308
+ if (!hasDimensions(media))
309
+ return null;
310
+ const width = media.width ?? 0;
311
+ const height = media.height ?? 0;
312
+ const ratio = width / height;
313
+ let newWidth = width;
314
+ let newHeight = height;
315
+ if (newWidth > maxWidth) {
316
+ newWidth = maxWidth;
317
+ newHeight = Math.round(newWidth / ratio);
318
+ }
319
+ if (newHeight > maxHeight) {
320
+ newHeight = maxHeight;
321
+ newWidth = Math.round(newHeight * ratio);
322
+ }
323
+ return { width: Math.round(newWidth), height: Math.round(newHeight) };
324
+ }
325
+ // =============================================================================
326
+ // Focal Point Helpers
327
+ // =============================================================================
328
+ /**
329
+ * Check if media has focal point
330
+ */
331
+ export function hasFocalPoint(media) {
332
+ return media.focalPoint !== null && media.focalPoint !== undefined;
333
+ }
334
+ /**
335
+ * Get focal point or default center
336
+ */
337
+ export function getFocalPoint(media) {
338
+ return media.focalPoint ?? { x: 0.5, y: 0.5 };
339
+ }
340
+ /**
341
+ * Convert normalized focal point to pixel coordinates
342
+ */
343
+ export function focalPointToPixels(media) {
344
+ if (!hasDimensions(media))
345
+ return null;
346
+ const focal = getFocalPoint(media);
347
+ return {
348
+ x: Math.round((media.width ?? 0) * focal.x),
349
+ y: Math.round((media.height ?? 0) * focal.y),
350
+ };
351
+ }
352
+ /**
353
+ * Create focal point from pixel coordinates
354
+ */
355
+ export function pixelsToFocalPoint(width, height, x, y) {
356
+ return {
357
+ x: Math.max(0, Math.min(1, x / width)),
358
+ y: Math.max(0, Math.min(1, y / height)),
359
+ };
360
+ }
361
+ // =============================================================================
362
+ // Size/Thumbnail Helpers
363
+ // =============================================================================
364
+ /**
365
+ * Check if media has generated sizes
366
+ */
367
+ export function hasSizes(media) {
368
+ return media.sizes !== null && media.sizes !== undefined && media.sizes.length > 0;
369
+ }
370
+ /**
371
+ * Get size by name
372
+ */
373
+ export function getSizeByName(media, name) {
374
+ return media.sizes?.find((size) => size.name === name);
375
+ }
376
+ /**
377
+ * Get all size names
378
+ */
379
+ export function getSizeNames(media) {
380
+ return media.sizes?.map((size) => size.name) ?? [];
381
+ }
382
+ /**
383
+ * Find best size for dimensions
384
+ */
385
+ export function findBestSize(media, targetWidth, targetHeight) {
386
+ if (!hasSizes(media))
387
+ return null;
388
+ const sizes = media.sizes ?? [];
389
+ let bestSize = null;
390
+ let bestScore = Number.POSITIVE_INFINITY;
391
+ for (const size of sizes) {
392
+ const widthDiff = Math.abs(size.width - targetWidth);
393
+ const heightDiff = Math.abs(size.height - targetHeight);
394
+ const score = widthDiff + heightDiff;
395
+ if (score < bestScore) {
396
+ bestScore = score;
397
+ bestSize = size;
398
+ }
399
+ }
400
+ return bestSize;
401
+ }
402
+ // =============================================================================
403
+ // File Size Helpers
404
+ // =============================================================================
405
+ /**
406
+ * Format file size in human-readable format
407
+ */
408
+ export function formatFileSize(bytes) {
409
+ if (bytes === 0)
410
+ return '0 B';
411
+ const k = 1024;
412
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
413
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
414
+ return `${(bytes / k ** i).toFixed(2)} ${sizes[i]}`;
415
+ }
416
+ /**
417
+ * Check if file size is within limit
418
+ */
419
+ export function isWithinSizeLimit(media) {
420
+ if (!media.filesize)
421
+ return true;
422
+ const mediaType = getMediaType(media.mimeType);
423
+ const limit = FILE_SIZE_LIMITS[mediaType.toUpperCase()] ??
424
+ FILE_SIZE_LIMITS.DEFAULT;
425
+ return media.filesize <= limit;
426
+ }
427
+ /**
428
+ * Get size limit for media type
429
+ */
430
+ export function getSizeLimit(mimeType) {
431
+ const mediaType = getMediaType(mimeType);
432
+ return (FILE_SIZE_LIMITS[mediaType.toUpperCase()] ??
433
+ FILE_SIZE_LIMITS.DEFAULT);
434
+ }
435
+ // =============================================================================
436
+ // Accessibility Helpers
437
+ // =============================================================================
438
+ /**
439
+ * Check if media has alt text
440
+ */
441
+ export function hasAltText(media) {
442
+ return media.alt !== null && media.alt !== undefined && media.alt.length > 0;
443
+ }
444
+ /**
445
+ * Check if alt text is meaningful (not just filename)
446
+ */
447
+ export function hasMeaningfulAltText(media) {
448
+ if (!hasAltText(media))
449
+ return false;
450
+ const alt = media.alt ?? '';
451
+ const filename = media.filename.toLowerCase();
452
+ // Check if alt is just the filename or similar
453
+ return alt.toLowerCase() !== filename && alt.length > 3;
454
+ }
455
+ // =============================================================================
456
+ // Ownership Helpers
457
+ // =============================================================================
458
+ /**
459
+ * Check if media has uploader
460
+ */
461
+ export function hasUploader(media) {
462
+ return media.uploadedBy !== null && media.uploadedBy !== undefined;
463
+ }
464
+ /**
465
+ * Check if media was uploaded by specific user
466
+ */
467
+ export function isUploadedBy(media, userId) {
468
+ return media.uploadedBy === userId;
469
+ }
470
+ // =============================================================================
471
+ // Media Creation
472
+ // =============================================================================
473
+ /**
474
+ * Create media insert data
475
+ */
476
+ export function createMediaInsert(filename, mimeType, url, options) {
477
+ const now = new Date();
478
+ return {
479
+ id: options?.id ?? crypto.randomUUID(),
480
+ schemaVersion: String(MEDIA_SCHEMA_VERSION),
481
+ filename,
482
+ mimeType,
483
+ filesize: options?.filesize ?? null,
484
+ url,
485
+ alt: options?.alt ?? null,
486
+ width: options?.width ?? null,
487
+ height: options?.height ?? null,
488
+ focalPoint: options?.focalPoint ?? null,
489
+ sizes: options?.sizes ?? null,
490
+ uploadedBy: options?.uploadedBy ?? null,
491
+ createdAt: now,
492
+ updatedAt: now,
493
+ };
494
+ }
495
+ /**
496
+ * Update media data
497
+ */
498
+ export function updateMedia(updates) {
499
+ const result = {
500
+ updatedAt: new Date(),
501
+ };
502
+ if (updates.alt !== undefined)
503
+ result.alt = updates.alt;
504
+ if (updates.focalPoint !== undefined)
505
+ result.focalPoint = updates.focalPoint;
506
+ if (updates.sizes !== undefined)
507
+ result.sizes = updates.sizes;
508
+ return result;
509
+ }
510
+ /**
511
+ * Convert media to format with computed fields
512
+ */
513
+ export function mediaToHuman(media) {
514
+ return {
515
+ ...media,
516
+ _computed: {
517
+ mediaType: getMediaType(media.mimeType),
518
+ isImage: isImage(media),
519
+ isVideo: isVideo(media),
520
+ isAudio: isAudio(media),
521
+ isDocument: isDocument(media),
522
+ hasDimensions: hasDimensions(media),
523
+ aspectRatio: getAspectRatio(media),
524
+ isLandscape: isLandscape(media),
525
+ isPortrait: isPortrait(media),
526
+ isSquare: isSquare(media),
527
+ hasFocalPoint: hasFocalPoint(media),
528
+ hasSizes: hasSizes(media),
529
+ hasAltText: hasAltText(media),
530
+ hasMeaningfulAltText: hasMeaningfulAltText(media),
531
+ hasUploader: hasUploader(media),
532
+ isWithinSizeLimit: isWithinSizeLimit(media),
533
+ formattedFileSize: formatFileSize(media.filesize ?? 0),
534
+ extension: getFileExtension(media.filename),
535
+ },
536
+ };
537
+ }
538
+ /**
539
+ * Convert media to agent-compatible format
540
+ */
541
+ export function mediaToAgent(media) {
542
+ const ratio = getAspectRatio(media);
543
+ let orientation = null;
544
+ if (ratio !== null) {
545
+ if (Math.abs(ratio - 1) < 0.01)
546
+ orientation = 'square';
547
+ else if (ratio > 1)
548
+ orientation = 'landscape';
549
+ else
550
+ orientation = 'portrait';
551
+ }
552
+ return {
553
+ ...media,
554
+ metadata: {
555
+ type: getMediaType(media.mimeType),
556
+ extension: getFileExtension(media.filename),
557
+ hasAlt: hasAltText(media),
558
+ dimensionsPresent: hasDimensions(media),
559
+ aspectRatio: ratio,
560
+ orientation,
561
+ sizesAvailable: media.sizes?.length ?? 0,
562
+ withinSizeLimit: isWithinSizeLimit(media),
563
+ },
564
+ };
565
+ }
566
+ /**
567
+ * Zod schema for media with computed fields
568
+ */
569
+ export const MediaWithComputedSchema = MediaSchema.and(z.object({
570
+ _computed: z.object({
571
+ mediaType: z.enum(MEDIA_TYPES),
572
+ isImage: z.boolean(),
573
+ isVideo: z.boolean(),
574
+ isAudio: z.boolean(),
575
+ isDocument: z.boolean(),
576
+ hasDimensions: z.boolean(),
577
+ aspectRatio: z.number().nullable(),
578
+ isLandscape: z.boolean(),
579
+ isPortrait: z.boolean(),
580
+ isSquare: z.boolean(),
581
+ hasFocalPoint: z.boolean(),
582
+ hasSizes: z.boolean(),
583
+ hasAltText: z.boolean(),
584
+ hasMeaningfulAltText: z.boolean(),
585
+ hasUploader: z.boolean(),
586
+ isWithinSizeLimit: z.boolean(),
587
+ formattedFileSize: z.string(),
588
+ extension: z.string(),
589
+ }),
590
+ }));
591
+ /**
592
+ * Zod schema for media with agent metadata
593
+ */
594
+ export const MediaAgentSchema = MediaSchema.and(z.object({
595
+ metadata: z.object({
596
+ type: z.enum(MEDIA_TYPES),
597
+ extension: z.string(),
598
+ hasAlt: z.boolean(),
599
+ dimensionsPresent: z.boolean(),
600
+ aspectRatio: z.number().nullable(),
601
+ orientation: z.enum(['landscape', 'portrait', 'square']).nullable(),
602
+ sizesAvailable: z.number().int(),
603
+ withinSizeLimit: z.boolean(),
604
+ }),
605
+ }));
606
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/entities/media.ts"],"names":[],"mappings":"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"}