@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.
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/dist/a2a/index.d.ts +383 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +276 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/actions/action-validator.d.ts +48 -0
- package/dist/actions/action-validator.d.ts.map +1 -0
- package/dist/actions/action-validator.js +288 -0
- package/dist/actions/action-validator.js.map +1 -0
- package/dist/actions/index.d.ts +7 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +7 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/agents/index.d.ts +628 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +511 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +22 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/api/auth.d.ts +60 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +84 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/chat.d.ts +45 -0
- package/dist/api/chat.d.ts.map +1 -0
- package/dist/api/chat.js +55 -0
- package/dist/api/chat.js.map +1 -0
- package/dist/api/gdpr.d.ts +39 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +53 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/cms/collection.d.ts +108 -0
- package/dist/cms/collection.d.ts.map +1 -0
- package/dist/cms/collection.js +144 -0
- package/dist/cms/collection.js.map +1 -0
- package/dist/cms/compat.d.ts +128 -0
- package/dist/cms/compat.d.ts.map +1 -0
- package/dist/cms/compat.js +141 -0
- package/dist/cms/compat.js.map +1 -0
- package/dist/cms/config-contract.d.ts +278 -0
- package/dist/cms/config-contract.d.ts.map +1 -0
- package/dist/cms/config-contract.js +220 -0
- package/dist/cms/config-contract.js.map +1 -0
- package/dist/cms/config.d.ts +351 -0
- package/dist/cms/config.d.ts.map +1 -0
- package/dist/cms/config.js +50 -0
- package/dist/cms/config.js.map +1 -0
- package/dist/cms/errors.d.ts +122 -0
- package/dist/cms/errors.d.ts.map +1 -0
- package/dist/cms/errors.js +163 -0
- package/dist/cms/errors.js.map +1 -0
- package/dist/cms/extensibility.d.ts +211 -0
- package/dist/cms/extensibility.d.ts.map +1 -0
- package/dist/cms/extensibility.js +313 -0
- package/dist/cms/extensibility.js.map +1 -0
- package/dist/cms/field.d.ts +69 -0
- package/dist/cms/field.d.ts.map +1 -0
- package/dist/cms/field.js +94 -0
- package/dist/cms/field.js.map +1 -0
- package/dist/cms/functions.d.ts +466 -0
- package/dist/cms/functions.d.ts.map +1 -0
- package/dist/cms/functions.js +19 -0
- package/dist/cms/functions.js.map +1 -0
- package/dist/cms/global.d.ts +45 -0
- package/dist/cms/global.d.ts.map +1 -0
- package/dist/cms/global.js +62 -0
- package/dist/cms/global.js.map +1 -0
- package/dist/cms/index.d.ts +23 -0
- package/dist/cms/index.d.ts.map +1 -0
- package/dist/cms/index.js +42 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/cms/structure.d.ts +1601 -0
- package/dist/cms/structure.d.ts.map +1 -0
- package/dist/cms/structure.js +757 -0
- package/dist/cms/structure.js.map +1 -0
- package/dist/content/index.d.ts +1542 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +522 -0
- package/dist/content/index.js.map +1 -0
- package/dist/database/bridge.d.ts +177 -0
- package/dist/database/bridge.d.ts.map +1 -0
- package/dist/database/bridge.js +139 -0
- package/dist/database/bridge.js.map +1 -0
- package/dist/database/index.d.ts +8 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +9 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/type-bridge.d.ts +178 -0
- package/dist/database/type-bridge.d.ts.map +1 -0
- package/dist/database/type-bridge.js +154 -0
- package/dist/database/type-bridge.js.map +1 -0
- package/dist/entities/agent-context.d.ts +280 -0
- package/dist/entities/agent-context.d.ts.map +1 -0
- package/dist/entities/agent-context.js +390 -0
- package/dist/entities/agent-context.js.map +1 -0
- package/dist/entities/agent-memory.d.ts +661 -0
- package/dist/entities/agent-memory.d.ts.map +1 -0
- package/dist/entities/agent-memory.js +544 -0
- package/dist/entities/agent-memory.js.map +1 -0
- package/dist/entities/board.d.ts +95 -0
- package/dist/entities/board.d.ts.map +1 -0
- package/dist/entities/board.js +99 -0
- package/dist/entities/board.js.map +1 -0
- package/dist/entities/code-provenance.d.ts +270 -0
- package/dist/entities/code-provenance.d.ts.map +1 -0
- package/dist/entities/code-provenance.js +339 -0
- package/dist/entities/code-provenance.js.map +1 -0
- package/dist/entities/index.d.ts +22 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +22 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/media.d.ts +485 -0
- package/dist/entities/media.d.ts.map +1 -0
- package/dist/entities/media.js +606 -0
- package/dist/entities/media.js.map +1 -0
- package/dist/entities/page-revision.d.ts +390 -0
- package/dist/entities/page-revision.d.ts.map +1 -0
- package/dist/entities/page-revision.js +406 -0
- package/dist/entities/page-revision.js.map +1 -0
- package/dist/entities/page.d.ts +2349 -0
- package/dist/entities/page.d.ts.map +1 -0
- package/dist/entities/page.js +377 -0
- package/dist/entities/page.js.map +1 -0
- package/dist/entities/post.d.ts +619 -0
- package/dist/entities/post.d.ts.map +1 -0
- package/dist/entities/post.js +555 -0
- package/dist/entities/post.js.map +1 -0
- package/dist/entities/price.d.ts +772 -0
- package/dist/entities/price.d.ts.map +1 -0
- package/dist/entities/price.js +308 -0
- package/dist/entities/price.js.map +1 -0
- package/dist/entities/product.d.ts +753 -0
- package/dist/entities/product.d.ts.map +1 -0
- package/dist/entities/product.js +307 -0
- package/dist/entities/product.js.map +1 -0
- package/dist/entities/session.d.ts +222 -0
- package/dist/entities/session.d.ts.map +1 -0
- package/dist/entities/session.js +253 -0
- package/dist/entities/session.js.map +1 -0
- package/dist/entities/site.d.ts +387 -0
- package/dist/entities/site.d.ts.map +1 -0
- package/dist/entities/site.js +348 -0
- package/dist/entities/site.js.map +1 -0
- package/dist/entities/ticket-comment.d.ts +49 -0
- package/dist/entities/ticket-comment.d.ts.map +1 -0
- package/dist/entities/ticket-comment.js +58 -0
- package/dist/entities/ticket-comment.js.map +1 -0
- package/dist/entities/ticket-label.d.ts +64 -0
- package/dist/entities/ticket-label.d.ts.map +1 -0
- package/dist/entities/ticket-label.js +77 -0
- package/dist/entities/ticket-label.js.map +1 -0
- package/dist/entities/ticket.d.ts +204 -0
- package/dist/entities/ticket.d.ts.map +1 -0
- package/dist/entities/ticket.js +205 -0
- package/dist/entities/ticket.js.map +1 -0
- package/dist/entities/user.d.ts +336 -0
- package/dist/entities/user.d.ts.map +1 -0
- package/dist/entities/user.js +255 -0
- package/dist/entities/user.js.map +1 -0
- package/dist/foundation/contract.d.ts +221 -0
- package/dist/foundation/contract.d.ts.map +1 -0
- package/dist/foundation/contract.js +133 -0
- package/dist/foundation/contract.js.map +1 -0
- package/dist/foundation/index.d.ts +7 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +7 -0
- package/dist/foundation/index.js.map +1 -0
- package/dist/generated/contracts.d.ts +1514 -0
- package/dist/generated/contracts.d.ts.map +1 -0
- package/dist/generated/contracts.js +959 -0
- package/dist/generated/contracts.js.map +1 -0
- package/dist/generated/database.d.ts +48 -0
- package/dist/generated/database.d.ts.map +1 -0
- package/dist/generated/database.js +17 -0
- package/dist/generated/database.js.map +1 -0
- package/dist/generated/zod-schemas.d.ts +14793 -0
- package/dist/generated/zod-schemas.d.ts.map +1 -0
- package/dist/generated/zod-schemas.js +547 -0
- package/dist/generated/zod-schemas.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/representation/index.d.ts +304 -0
- package/dist/representation/index.d.ts.map +1 -0
- package/dist/representation/index.js +280 -0
- package/dist/representation/index.js.map +1 -0
- 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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"}
|