@rovela-ai/sdk 0.1.25 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/CategoryForm.d.ts.map +1 -1
- package/dist/admin/components/CategoryForm.js +2 -2
- package/dist/admin/components/CategoryForm.js.map +1 -1
- package/dist/admin/components/ProductForm.d.ts.map +1 -1
- package/dist/admin/components/ProductForm.js +3 -35
- package/dist/admin/components/ProductForm.js.map +1 -1
- package/dist/admin/components/ProductTable.d.ts.map +1 -1
- package/dist/admin/components/ProductTable.js +6 -1
- package/dist/admin/components/ProductTable.js.map +1 -1
- package/dist/admin/server/admin-service.d.ts +3 -3
- package/dist/admin/server/admin-service.d.ts.map +1 -1
- package/dist/admin/server/admin-service.js +12 -22
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/auth/server/customer-service.d.ts +2 -2
- package/dist/auth/server/customer-service.d.ts.map +1 -1
- package/dist/auth/server/customer-service.js +11 -20
- package/dist/auth/server/customer-service.js.map +1 -1
- package/dist/auth/server/password-reset-service.d.ts +1 -0
- package/dist/auth/server/password-reset-service.d.ts.map +1 -1
- package/dist/auth/server/password-reset-service.js +5 -7
- package/dist/auth/server/password-reset-service.js.map +1 -1
- package/dist/auth/server/verification-service.d.ts +1 -0
- package/dist/auth/server/verification-service.d.ts.map +1 -1
- package/dist/auth/server/verification-service.js +6 -9
- package/dist/auth/server/verification-service.js.map +1 -1
- package/dist/core/db/client.d.ts +2 -44
- package/dist/core/db/client.d.ts.map +1 -1
- package/dist/core/db/client.js +2 -106
- package/dist/core/db/client.js.map +1 -1
- package/dist/core/db/index.d.ts +1 -1
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +2 -2
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/db/queries.d.ts +18 -35
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/queries.js +69 -110
- package/dist/core/db/queries.js.map +1 -1
- package/dist/core/db/schema.d.ts +1 -137
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +6 -23
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/server/index.d.ts +1 -1
- package/dist/core/server/index.d.ts.map +1 -1
- package/dist/core/server/index.js +1 -3
- package/dist/core/server/index.js.map +1 -1
- package/dist/core/types.d.ts +0 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/config.d.ts.map +1 -1
- package/dist/emails/config.js +11 -17
- package/dist/emails/config.js.map +1 -1
- package/dist/media/api/delete.d.ts +44 -0
- package/dist/media/api/delete.d.ts.map +1 -0
- package/dist/media/api/delete.js +134 -0
- package/dist/media/api/delete.js.map +1 -0
- package/dist/media/api/index.d.ts +17 -0
- package/dist/media/api/index.d.ts.map +1 -0
- package/dist/media/api/index.js +17 -0
- package/dist/media/api/index.js.map +1 -0
- package/dist/media/api/presign.d.ts +39 -0
- package/dist/media/api/presign.d.ts.map +1 -0
- package/dist/media/api/presign.js +138 -0
- package/dist/media/api/presign.js.map +1 -0
- package/dist/media/components/DropZone.d.ts +18 -0
- package/dist/media/components/DropZone.d.ts.map +1 -0
- package/dist/media/components/DropZone.js +112 -0
- package/dist/media/components/DropZone.js.map +1 -0
- package/dist/media/components/ImageGalleryUpload.d.ts +18 -0
- package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -0
- package/dist/media/components/ImageGalleryUpload.js +156 -0
- package/dist/media/components/ImageGalleryUpload.js.map +1 -0
- package/dist/media/components/ImageUpload.d.ts +17 -0
- package/dist/media/components/ImageUpload.d.ts.map +1 -0
- package/dist/media/components/ImageUpload.js +95 -0
- package/dist/media/components/ImageUpload.js.map +1 -0
- package/dist/media/components/index.d.ts +10 -0
- package/dist/media/components/index.d.ts.map +1 -0
- package/dist/media/components/index.js +9 -0
- package/dist/media/components/index.js.map +1 -0
- package/dist/media/config.d.ts +57 -0
- package/dist/media/config.d.ts.map +1 -0
- package/dist/media/config.js +142 -0
- package/dist/media/config.js.map +1 -0
- package/dist/media/hooks/index.d.ts +8 -0
- package/dist/media/hooks/index.d.ts.map +1 -0
- package/dist/media/hooks/index.js +7 -0
- package/dist/media/hooks/index.js.map +1 -0
- package/dist/media/hooks/useUpload.d.ts +32 -0
- package/dist/media/hooks/useUpload.d.ts.map +1 -0
- package/dist/media/hooks/useUpload.js +258 -0
- package/dist/media/hooks/useUpload.js.map +1 -0
- package/dist/media/index.d.ts +57 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +68 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/server/delete.d.ts +59 -0
- package/dist/media/server/delete.d.ts.map +1 -0
- package/dist/media/server/delete.js +176 -0
- package/dist/media/server/delete.js.map +1 -0
- package/dist/media/server/index.d.ts +10 -0
- package/dist/media/server/index.d.ts.map +1 -0
- package/dist/media/server/index.js +13 -0
- package/dist/media/server/index.js.map +1 -0
- package/dist/media/server/presign.d.ts +57 -0
- package/dist/media/server/presign.d.ts.map +1 -0
- package/dist/media/server/presign.js +112 -0
- package/dist/media/server/presign.js.map +1 -0
- package/dist/media/server/r2-client.d.ts +30 -0
- package/dist/media/server/r2-client.d.ts.map +1 -0
- package/dist/media/server/r2-client.js +76 -0
- package/dist/media/server/r2-client.js.map +1 -0
- package/dist/media/types.d.ts +271 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/types.js +52 -0
- package/dist/media/types.js.map +1 -0
- package/package.json +15 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript type definitions for media upload functionality.
|
|
5
|
+
* Supports product images, category covers, and variant swatches.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* R2/S3 storage configuration
|
|
9
|
+
*/
|
|
10
|
+
export interface MediaStorageConfig {
|
|
11
|
+
/** Cloudflare account ID (for R2) */
|
|
12
|
+
accountId: string;
|
|
13
|
+
/** S3-compatible access key */
|
|
14
|
+
accessKeyId: string;
|
|
15
|
+
/** S3-compatible secret key */
|
|
16
|
+
secretAccessKey: string;
|
|
17
|
+
/** Bucket name */
|
|
18
|
+
bucketName: string;
|
|
19
|
+
/** Public URL for accessing uploaded files */
|
|
20
|
+
publicUrl: string;
|
|
21
|
+
/** Store ID for path prefixing */
|
|
22
|
+
storeId: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Upload constraints configuration
|
|
26
|
+
*/
|
|
27
|
+
export interface UploadConfig {
|
|
28
|
+
/** Maximum file size in bytes (default: 10MB) */
|
|
29
|
+
maxSizeBytes: number;
|
|
30
|
+
/** Allowed MIME types */
|
|
31
|
+
allowedTypes: string[];
|
|
32
|
+
/** Maximum files for batch uploads */
|
|
33
|
+
maxFiles: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Default upload configuration
|
|
37
|
+
*/
|
|
38
|
+
export declare const DEFAULT_UPLOAD_CONFIG: UploadConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Folder types for organizing uploads
|
|
41
|
+
*/
|
|
42
|
+
export type MediaFolder = 'products' | 'categories' | 'variants' | 'general';
|
|
43
|
+
/**
|
|
44
|
+
* Request to generate a presigned upload URL
|
|
45
|
+
*/
|
|
46
|
+
export interface PresignedUrlRequest {
|
|
47
|
+
/** Original filename (used for extension) */
|
|
48
|
+
filename: string;
|
|
49
|
+
/** MIME type of the file */
|
|
50
|
+
contentType: string;
|
|
51
|
+
/** Target folder for organization */
|
|
52
|
+
folder: MediaFolder;
|
|
53
|
+
/** Optional entity ID (productId, categoryId, etc.) */
|
|
54
|
+
entityId?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Response containing presigned URL details
|
|
58
|
+
*/
|
|
59
|
+
export interface PresignedUrlResponse {
|
|
60
|
+
/** Presigned PUT URL for uploading */
|
|
61
|
+
uploadUrl: string;
|
|
62
|
+
/** Final public URL after upload completes */
|
|
63
|
+
publicUrl: string;
|
|
64
|
+
/** Generated unique key/path in storage */
|
|
65
|
+
key: string;
|
|
66
|
+
/** URL expiration timestamp */
|
|
67
|
+
expiresAt: Date;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Upload progress information
|
|
71
|
+
*/
|
|
72
|
+
export interface UploadProgress {
|
|
73
|
+
/** Bytes uploaded so far */
|
|
74
|
+
loaded: number;
|
|
75
|
+
/** Total bytes to upload */
|
|
76
|
+
total: number;
|
|
77
|
+
/** Progress percentage (0-100) */
|
|
78
|
+
percentage: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Status of an upload operation
|
|
82
|
+
*/
|
|
83
|
+
export type UploadStatus = 'idle' | 'preparing' | 'uploading' | 'success' | 'error';
|
|
84
|
+
/**
|
|
85
|
+
* Result of a completed upload
|
|
86
|
+
*/
|
|
87
|
+
export interface UploadResult {
|
|
88
|
+
/** Whether upload succeeded */
|
|
89
|
+
success: boolean;
|
|
90
|
+
/** Final public URL (only if success) */
|
|
91
|
+
url?: string;
|
|
92
|
+
/** Original filename */
|
|
93
|
+
filename: string;
|
|
94
|
+
/** File size in bytes */
|
|
95
|
+
size: number;
|
|
96
|
+
/** MIME type */
|
|
97
|
+
contentType: string;
|
|
98
|
+
/** Error message (only if failed) */
|
|
99
|
+
error?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* State for tracking an upload in progress
|
|
103
|
+
*/
|
|
104
|
+
export interface UploadState {
|
|
105
|
+
/** Current status */
|
|
106
|
+
status: UploadStatus;
|
|
107
|
+
/** Progress information (during upload) */
|
|
108
|
+
progress: UploadProgress | null;
|
|
109
|
+
/** Result (after completion) */
|
|
110
|
+
result: UploadResult | null;
|
|
111
|
+
/** Error message (if failed) */
|
|
112
|
+
error: string | null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* API request body for presign endpoint
|
|
116
|
+
*/
|
|
117
|
+
export interface PresignApiRequest {
|
|
118
|
+
filename: string;
|
|
119
|
+
contentType: string;
|
|
120
|
+
folder: MediaFolder;
|
|
121
|
+
entityId?: string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* API response from presign endpoint
|
|
125
|
+
*/
|
|
126
|
+
export interface PresignApiResponse {
|
|
127
|
+
success: boolean;
|
|
128
|
+
data?: PresignedUrlResponse;
|
|
129
|
+
error?: string;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* API request body for delete endpoint
|
|
133
|
+
*/
|
|
134
|
+
export interface DeleteApiRequest {
|
|
135
|
+
/** URL or key of the file to delete */
|
|
136
|
+
url: string;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* API response from delete endpoint
|
|
140
|
+
*/
|
|
141
|
+
export interface DeleteApiResponse {
|
|
142
|
+
success: boolean;
|
|
143
|
+
error?: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Standard API error response
|
|
147
|
+
*/
|
|
148
|
+
export interface MediaApiError {
|
|
149
|
+
success: false;
|
|
150
|
+
error: string;
|
|
151
|
+
code?: string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Options for useUpload hook
|
|
155
|
+
*/
|
|
156
|
+
export interface UseUploadOptions {
|
|
157
|
+
/** Target folder for uploads */
|
|
158
|
+
folder: MediaFolder;
|
|
159
|
+
/** Associated entity ID */
|
|
160
|
+
entityId?: string;
|
|
161
|
+
/** Upload configuration overrides */
|
|
162
|
+
config?: Partial<UploadConfig>;
|
|
163
|
+
/** Callback when upload completes */
|
|
164
|
+
onSuccess?: (result: UploadResult) => void;
|
|
165
|
+
/** Callback when upload fails */
|
|
166
|
+
onError?: (error: string) => void;
|
|
167
|
+
/** Callback for progress updates */
|
|
168
|
+
onProgress?: (progress: UploadProgress) => void;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Return type of useUpload hook
|
|
172
|
+
*/
|
|
173
|
+
export interface UseUploadReturn {
|
|
174
|
+
/** Upload a single file */
|
|
175
|
+
upload: (file: File) => Promise<UploadResult>;
|
|
176
|
+
/** Upload multiple files */
|
|
177
|
+
uploadMultiple: (files: File[]) => Promise<UploadResult[]>;
|
|
178
|
+
/** Current upload status */
|
|
179
|
+
status: UploadStatus;
|
|
180
|
+
/** Current progress (if uploading) */
|
|
181
|
+
progress: UploadProgress | null;
|
|
182
|
+
/** Whether currently uploading */
|
|
183
|
+
isUploading: boolean;
|
|
184
|
+
/** Current error (if any) */
|
|
185
|
+
error: string | null;
|
|
186
|
+
/** Reset state to idle */
|
|
187
|
+
reset: () => void;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Props for DropZone component
|
|
191
|
+
*/
|
|
192
|
+
export interface DropZoneProps {
|
|
193
|
+
/** Called when files are dropped/selected */
|
|
194
|
+
onFiles: (files: File[]) => void;
|
|
195
|
+
/** Whether to accept multiple files */
|
|
196
|
+
multiple?: boolean;
|
|
197
|
+
/** Accepted file types (MIME) */
|
|
198
|
+
accept?: string[];
|
|
199
|
+
/** Maximum file size in bytes */
|
|
200
|
+
maxSize?: number;
|
|
201
|
+
/** Whether the dropzone is disabled */
|
|
202
|
+
disabled?: boolean;
|
|
203
|
+
/** Additional CSS classes */
|
|
204
|
+
className?: string;
|
|
205
|
+
/** Custom content inside dropzone */
|
|
206
|
+
children?: React.ReactNode;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Props for ImageUpload component
|
|
210
|
+
*/
|
|
211
|
+
export interface ImageUploadProps {
|
|
212
|
+
/** Current image URL (null if no image) */
|
|
213
|
+
value: string | null;
|
|
214
|
+
/** Called when image changes */
|
|
215
|
+
onChange: (url: string | null) => void;
|
|
216
|
+
/** Target folder for uploads */
|
|
217
|
+
folder: MediaFolder;
|
|
218
|
+
/** Associated entity ID */
|
|
219
|
+
entityId?: string;
|
|
220
|
+
/** Maximum file size in MB */
|
|
221
|
+
maxSizeMB?: number;
|
|
222
|
+
/** Whether upload is disabled */
|
|
223
|
+
disabled?: boolean;
|
|
224
|
+
/** Additional CSS classes */
|
|
225
|
+
className?: string;
|
|
226
|
+
/** Placeholder text when no image */
|
|
227
|
+
placeholder?: string;
|
|
228
|
+
/** Aspect ratio for preview (e.g., "1/1", "16/9") */
|
|
229
|
+
aspectRatio?: string;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Props for ImageGalleryUpload component
|
|
233
|
+
*/
|
|
234
|
+
export interface ImageGalleryUploadProps {
|
|
235
|
+
/** Current array of image URLs */
|
|
236
|
+
value: string[];
|
|
237
|
+
/** Called when images change */
|
|
238
|
+
onChange: (urls: string[]) => void;
|
|
239
|
+
/** Target folder for uploads */
|
|
240
|
+
folder: MediaFolder;
|
|
241
|
+
/** Associated entity ID */
|
|
242
|
+
entityId?: string;
|
|
243
|
+
/** Maximum number of images allowed */
|
|
244
|
+
maxImages?: number;
|
|
245
|
+
/** Maximum file size per image in MB */
|
|
246
|
+
maxSizeMB?: number;
|
|
247
|
+
/** Whether upload is disabled */
|
|
248
|
+
disabled?: boolean;
|
|
249
|
+
/** Additional CSS classes */
|
|
250
|
+
className?: string;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* File validation result
|
|
254
|
+
*/
|
|
255
|
+
export interface FileValidation {
|
|
256
|
+
valid: boolean;
|
|
257
|
+
error?: string;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Validate a file against upload constraints
|
|
261
|
+
*/
|
|
262
|
+
export declare function validateFile(file: File, config?: UploadConfig): FileValidation;
|
|
263
|
+
/**
|
|
264
|
+
* Get file extension from filename
|
|
265
|
+
*/
|
|
266
|
+
export declare function getFileExtension(filename: string): string;
|
|
267
|
+
/**
|
|
268
|
+
* Generate a unique filename with timestamp and random suffix
|
|
269
|
+
*/
|
|
270
|
+
export declare function generateUniqueFilename(originalFilename: string): string;
|
|
271
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela-ai/sdk/media/types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript type definitions for media upload functionality.
|
|
5
|
+
* Supports product images, category covers, and variant swatches.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default upload configuration
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_UPLOAD_CONFIG = {
|
|
11
|
+
maxSizeBytes: 10 * 1024 * 1024, // 10MB
|
|
12
|
+
allowedTypes: ['image/jpeg', 'image/png', 'image/webp', 'image/gif'],
|
|
13
|
+
maxFiles: 10,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Validate a file against upload constraints
|
|
17
|
+
*/
|
|
18
|
+
export function validateFile(file, config = DEFAULT_UPLOAD_CONFIG) {
|
|
19
|
+
// Check file size
|
|
20
|
+
if (file.size > config.maxSizeBytes) {
|
|
21
|
+
const maxMB = Math.round(config.maxSizeBytes / (1024 * 1024));
|
|
22
|
+
return {
|
|
23
|
+
valid: false,
|
|
24
|
+
error: `File size exceeds ${maxMB}MB limit`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Check file type
|
|
28
|
+
if (!config.allowedTypes.includes(file.type)) {
|
|
29
|
+
return {
|
|
30
|
+
valid: false,
|
|
31
|
+
error: `File type ${file.type} is not allowed`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return { valid: true };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get file extension from filename
|
|
38
|
+
*/
|
|
39
|
+
export function getFileExtension(filename) {
|
|
40
|
+
const parts = filename.split('.');
|
|
41
|
+
return parts.length > 1 ? parts.pop().toLowerCase() : '';
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generate a unique filename with timestamp and random suffix
|
|
45
|
+
*/
|
|
46
|
+
export function generateUniqueFilename(originalFilename) {
|
|
47
|
+
const ext = getFileExtension(originalFilename);
|
|
48
|
+
const timestamp = Date.now();
|
|
49
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
50
|
+
return ext ? `${timestamp}_${random}.${ext}` : `${timestamp}_${random}`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoCH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,YAAY,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IACvC,YAAY,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;IACpE,QAAQ,EAAE,EAAE;CACb,CAAA;AAwQD;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,SAAuB,qBAAqB;IAE5C,kBAAkB;IAClB,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAA;QAC7D,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qBAAqB,KAAK,UAAU;SAC5C,CAAA;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,aAAa,IAAI,CAAC,IAAI,iBAAiB;SAC/C,CAAA;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,gBAAwB;IAC7D,MAAM,GAAG,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACzD,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,MAAM,EAAE,CAAA;AACzE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rovela-ai/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"description": "Rovela SDK - Pre-built e-commerce components for AI-powered store generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -147,6 +147,18 @@
|
|
|
147
147
|
"./emails": {
|
|
148
148
|
"types": "./dist/emails/index.d.ts",
|
|
149
149
|
"import": "./dist/emails/index.js"
|
|
150
|
+
},
|
|
151
|
+
"./media": {
|
|
152
|
+
"types": "./dist/media/index.d.ts",
|
|
153
|
+
"import": "./dist/media/index.js"
|
|
154
|
+
},
|
|
155
|
+
"./media/server": {
|
|
156
|
+
"types": "./dist/media/server/index.d.ts",
|
|
157
|
+
"import": "./dist/media/server/index.js"
|
|
158
|
+
},
|
|
159
|
+
"./media/api": {
|
|
160
|
+
"types": "./dist/media/api/index.d.ts",
|
|
161
|
+
"import": "./dist/media/api/index.js"
|
|
150
162
|
}
|
|
151
163
|
},
|
|
152
164
|
"scripts": {
|
|
@@ -159,6 +171,8 @@
|
|
|
159
171
|
"db:studio": "drizzle-kit studio"
|
|
160
172
|
},
|
|
161
173
|
"dependencies": {
|
|
174
|
+
"@aws-sdk/client-s3": "^3.700.0",
|
|
175
|
+
"@aws-sdk/s3-request-presigner": "^3.700.0",
|
|
162
176
|
"@neondatabase/serverless": "^1.0.0",
|
|
163
177
|
"@stripe/stripe-js": "^8.0.0",
|
|
164
178
|
"bcryptjs": "^3.0.0",
|