@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.
Files changed (115) hide show
  1. package/dist/admin/components/CategoryForm.d.ts.map +1 -1
  2. package/dist/admin/components/CategoryForm.js +2 -2
  3. package/dist/admin/components/CategoryForm.js.map +1 -1
  4. package/dist/admin/components/ProductForm.d.ts.map +1 -1
  5. package/dist/admin/components/ProductForm.js +3 -35
  6. package/dist/admin/components/ProductForm.js.map +1 -1
  7. package/dist/admin/components/ProductTable.d.ts.map +1 -1
  8. package/dist/admin/components/ProductTable.js +6 -1
  9. package/dist/admin/components/ProductTable.js.map +1 -1
  10. package/dist/admin/server/admin-service.d.ts +3 -3
  11. package/dist/admin/server/admin-service.d.ts.map +1 -1
  12. package/dist/admin/server/admin-service.js +12 -22
  13. package/dist/admin/server/admin-service.js.map +1 -1
  14. package/dist/auth/server/customer-service.d.ts +2 -2
  15. package/dist/auth/server/customer-service.d.ts.map +1 -1
  16. package/dist/auth/server/customer-service.js +11 -20
  17. package/dist/auth/server/customer-service.js.map +1 -1
  18. package/dist/auth/server/password-reset-service.d.ts +1 -0
  19. package/dist/auth/server/password-reset-service.d.ts.map +1 -1
  20. package/dist/auth/server/password-reset-service.js +5 -7
  21. package/dist/auth/server/password-reset-service.js.map +1 -1
  22. package/dist/auth/server/verification-service.d.ts +1 -0
  23. package/dist/auth/server/verification-service.d.ts.map +1 -1
  24. package/dist/auth/server/verification-service.js +6 -9
  25. package/dist/auth/server/verification-service.js.map +1 -1
  26. package/dist/core/db/client.d.ts +2 -44
  27. package/dist/core/db/client.d.ts.map +1 -1
  28. package/dist/core/db/client.js +2 -106
  29. package/dist/core/db/client.js.map +1 -1
  30. package/dist/core/db/index.d.ts +1 -1
  31. package/dist/core/db/index.d.ts.map +1 -1
  32. package/dist/core/db/index.js +2 -2
  33. package/dist/core/db/index.js.map +1 -1
  34. package/dist/core/db/queries.d.ts +18 -35
  35. package/dist/core/db/queries.d.ts.map +1 -1
  36. package/dist/core/db/queries.js +69 -110
  37. package/dist/core/db/queries.js.map +1 -1
  38. package/dist/core/db/schema.d.ts +1 -137
  39. package/dist/core/db/schema.d.ts.map +1 -1
  40. package/dist/core/db/schema.js +6 -23
  41. package/dist/core/db/schema.js.map +1 -1
  42. package/dist/core/server/index.d.ts +1 -1
  43. package/dist/core/server/index.d.ts.map +1 -1
  44. package/dist/core/server/index.js +1 -3
  45. package/dist/core/server/index.js.map +1 -1
  46. package/dist/core/types.d.ts +0 -5
  47. package/dist/core/types.d.ts.map +1 -1
  48. package/dist/emails/config.d.ts.map +1 -1
  49. package/dist/emails/config.js +11 -17
  50. package/dist/emails/config.js.map +1 -1
  51. package/dist/media/api/delete.d.ts +44 -0
  52. package/dist/media/api/delete.d.ts.map +1 -0
  53. package/dist/media/api/delete.js +134 -0
  54. package/dist/media/api/delete.js.map +1 -0
  55. package/dist/media/api/index.d.ts +17 -0
  56. package/dist/media/api/index.d.ts.map +1 -0
  57. package/dist/media/api/index.js +17 -0
  58. package/dist/media/api/index.js.map +1 -0
  59. package/dist/media/api/presign.d.ts +39 -0
  60. package/dist/media/api/presign.d.ts.map +1 -0
  61. package/dist/media/api/presign.js +138 -0
  62. package/dist/media/api/presign.js.map +1 -0
  63. package/dist/media/components/DropZone.d.ts +18 -0
  64. package/dist/media/components/DropZone.d.ts.map +1 -0
  65. package/dist/media/components/DropZone.js +112 -0
  66. package/dist/media/components/DropZone.js.map +1 -0
  67. package/dist/media/components/ImageGalleryUpload.d.ts +18 -0
  68. package/dist/media/components/ImageGalleryUpload.d.ts.map +1 -0
  69. package/dist/media/components/ImageGalleryUpload.js +156 -0
  70. package/dist/media/components/ImageGalleryUpload.js.map +1 -0
  71. package/dist/media/components/ImageUpload.d.ts +17 -0
  72. package/dist/media/components/ImageUpload.d.ts.map +1 -0
  73. package/dist/media/components/ImageUpload.js +95 -0
  74. package/dist/media/components/ImageUpload.js.map +1 -0
  75. package/dist/media/components/index.d.ts +10 -0
  76. package/dist/media/components/index.d.ts.map +1 -0
  77. package/dist/media/components/index.js +9 -0
  78. package/dist/media/components/index.js.map +1 -0
  79. package/dist/media/config.d.ts +57 -0
  80. package/dist/media/config.d.ts.map +1 -0
  81. package/dist/media/config.js +142 -0
  82. package/dist/media/config.js.map +1 -0
  83. package/dist/media/hooks/index.d.ts +8 -0
  84. package/dist/media/hooks/index.d.ts.map +1 -0
  85. package/dist/media/hooks/index.js +7 -0
  86. package/dist/media/hooks/index.js.map +1 -0
  87. package/dist/media/hooks/useUpload.d.ts +32 -0
  88. package/dist/media/hooks/useUpload.d.ts.map +1 -0
  89. package/dist/media/hooks/useUpload.js +258 -0
  90. package/dist/media/hooks/useUpload.js.map +1 -0
  91. package/dist/media/index.d.ts +57 -0
  92. package/dist/media/index.d.ts.map +1 -0
  93. package/dist/media/index.js +68 -0
  94. package/dist/media/index.js.map +1 -0
  95. package/dist/media/server/delete.d.ts +59 -0
  96. package/dist/media/server/delete.d.ts.map +1 -0
  97. package/dist/media/server/delete.js +176 -0
  98. package/dist/media/server/delete.js.map +1 -0
  99. package/dist/media/server/index.d.ts +10 -0
  100. package/dist/media/server/index.d.ts.map +1 -0
  101. package/dist/media/server/index.js +13 -0
  102. package/dist/media/server/index.js.map +1 -0
  103. package/dist/media/server/presign.d.ts +57 -0
  104. package/dist/media/server/presign.d.ts.map +1 -0
  105. package/dist/media/server/presign.js +112 -0
  106. package/dist/media/server/presign.js.map +1 -0
  107. package/dist/media/server/r2-client.d.ts +30 -0
  108. package/dist/media/server/r2-client.d.ts.map +1 -0
  109. package/dist/media/server/r2-client.js +76 -0
  110. package/dist/media/server/r2-client.js.map +1 -0
  111. package/dist/media/types.d.ts +271 -0
  112. package/dist/media/types.d.ts.map +1 -0
  113. package/dist/media/types.js +52 -0
  114. package/dist/media/types.js.map +1 -0
  115. 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.25",
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",