@baasix/sdk 0.1.12 → 0.1.13

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.
@@ -154,6 +154,16 @@ var FilesModule = class {
154
154
  /**
155
155
  * Get the URL for an asset with optional transformations
156
156
  *
157
+ * @param id - File UUID
158
+ * @param options - Optional transformation options
159
+ * @param options.width - Target width in pixels
160
+ * @param options.height - Target height in pixels
161
+ * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')
162
+ * @param options.quality - Output quality 1–100 (default: 80)
163
+ * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').
164
+ * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.
165
+ * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions
166
+ *
157
167
  * @example
158
168
  * ```typescript
159
169
  * // Original file
@@ -167,11 +177,21 @@ var FilesModule = class {
167
177
  * quality: 80
168
178
  * });
169
179
  *
170
- * // Convert to WebP
180
+ * // Convert to WebP (preserves transparency)
171
181
  * const webpUrl = baasix.files.getAssetUrl('file-uuid', {
172
182
  * format: 'webp',
173
183
  * quality: 85
174
184
  * });
185
+ *
186
+ * // Resize and convert to WebP
187
+ * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {
188
+ * width: 800,
189
+ * height: 600,
190
+ * fit: 'cover',
191
+ * format: 'webp',
192
+ * quality: 80,
193
+ * withoutEnlargement: true
194
+ * });
175
195
  * ```
176
196
  */
177
197
  getAssetUrl(id, options) {
@@ -225,7 +245,10 @@ var FilesModule = class {
225
245
  * @example
226
246
  * ```typescript
227
247
  * const base64 = await baasix.files.toBase64('file-uuid');
228
- * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />
248
+ * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />
249
+ *
250
+ * // Convert to WebP first for smaller payload
251
+ * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });
229
252
  * ```
230
253
  */
231
254
  async toBase64(id, options) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.cjs","sourcesContent":["import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { \n onProgress: options?.onProgress,\n timeout: options?.timeout \n }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n"]}
1
+ {"version":3,"sources":["../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.cjs","sourcesContent":["import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { \n onProgress: options?.onProgress,\n timeout: options?.timeout \n }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @param id - File UUID\n * @param options - Optional transformation options\n * @param options.width - Target width in pixels\n * @param options.height - Target height in pixels\n * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')\n * @param options.quality - Output quality 1–100 (default: 80)\n * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').\n * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.\n * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP (preserves transparency)\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n *\n * // Resize and convert to WebP\n * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 800,\n * height: 600,\n * fit: 'cover',\n * format: 'webp',\n * quality: 80,\n * withoutEnlargement: true\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />\n *\n * // Convert to WebP first for smaller payload\n * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n"]}
@@ -125,6 +125,16 @@ declare class FilesModule {
125
125
  /**
126
126
  * Get the URL for an asset with optional transformations
127
127
  *
128
+ * @param id - File UUID
129
+ * @param options - Optional transformation options
130
+ * @param options.width - Target width in pixels
131
+ * @param options.height - Target height in pixels
132
+ * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')
133
+ * @param options.quality - Output quality 1–100 (default: 80)
134
+ * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').
135
+ * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.
136
+ * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions
137
+ *
128
138
  * @example
129
139
  * ```typescript
130
140
  * // Original file
@@ -138,11 +148,21 @@ declare class FilesModule {
138
148
  * quality: 80
139
149
  * });
140
150
  *
141
- * // Convert to WebP
151
+ * // Convert to WebP (preserves transparency)
142
152
  * const webpUrl = baasix.files.getAssetUrl('file-uuid', {
143
153
  * format: 'webp',
144
154
  * quality: 85
145
155
  * });
156
+ *
157
+ * // Resize and convert to WebP
158
+ * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {
159
+ * width: 800,
160
+ * height: 600,
161
+ * fit: 'cover',
162
+ * format: 'webp',
163
+ * quality: 80,
164
+ * withoutEnlargement: true
165
+ * });
146
166
  * ```
147
167
  */
148
168
  getAssetUrl(id: string, options?: AssetTransformOptions): string;
@@ -168,7 +188,10 @@ declare class FilesModule {
168
188
  * @example
169
189
  * ```typescript
170
190
  * const base64 = await baasix.files.toBase64('file-uuid');
171
- * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />
191
+ * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />
192
+ *
193
+ * // Convert to WebP first for smaller payload
194
+ * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });
172
195
  * ```
173
196
  */
174
197
  toBase64(id: string, options?: AssetTransformOptions): Promise<string>;
@@ -125,6 +125,16 @@ declare class FilesModule {
125
125
  /**
126
126
  * Get the URL for an asset with optional transformations
127
127
  *
128
+ * @param id - File UUID
129
+ * @param options - Optional transformation options
130
+ * @param options.width - Target width in pixels
131
+ * @param options.height - Target height in pixels
132
+ * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')
133
+ * @param options.quality - Output quality 1–100 (default: 80)
134
+ * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').
135
+ * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.
136
+ * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions
137
+ *
128
138
  * @example
129
139
  * ```typescript
130
140
  * // Original file
@@ -138,11 +148,21 @@ declare class FilesModule {
138
148
  * quality: 80
139
149
  * });
140
150
  *
141
- * // Convert to WebP
151
+ * // Convert to WebP (preserves transparency)
142
152
  * const webpUrl = baasix.files.getAssetUrl('file-uuid', {
143
153
  * format: 'webp',
144
154
  * quality: 85
145
155
  * });
156
+ *
157
+ * // Resize and convert to WebP
158
+ * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {
159
+ * width: 800,
160
+ * height: 600,
161
+ * fit: 'cover',
162
+ * format: 'webp',
163
+ * quality: 80,
164
+ * withoutEnlargement: true
165
+ * });
146
166
  * ```
147
167
  */
148
168
  getAssetUrl(id: string, options?: AssetTransformOptions): string;
@@ -168,7 +188,10 @@ declare class FilesModule {
168
188
  * @example
169
189
  * ```typescript
170
190
  * const base64 = await baasix.files.toBase64('file-uuid');
171
- * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />
191
+ * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />
192
+ *
193
+ * // Convert to WebP first for smaller payload
194
+ * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });
172
195
  * ```
173
196
  */
174
197
  toBase64(id: string, options?: AssetTransformOptions): Promise<string>;
@@ -152,6 +152,16 @@ var FilesModule = class {
152
152
  /**
153
153
  * Get the URL for an asset with optional transformations
154
154
  *
155
+ * @param id - File UUID
156
+ * @param options - Optional transformation options
157
+ * @param options.width - Target width in pixels
158
+ * @param options.height - Target height in pixels
159
+ * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')
160
+ * @param options.quality - Output quality 1–100 (default: 80)
161
+ * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').
162
+ * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.
163
+ * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions
164
+ *
155
165
  * @example
156
166
  * ```typescript
157
167
  * // Original file
@@ -165,11 +175,21 @@ var FilesModule = class {
165
175
  * quality: 80
166
176
  * });
167
177
  *
168
- * // Convert to WebP
178
+ * // Convert to WebP (preserves transparency)
169
179
  * const webpUrl = baasix.files.getAssetUrl('file-uuid', {
170
180
  * format: 'webp',
171
181
  * quality: 85
172
182
  * });
183
+ *
184
+ * // Resize and convert to WebP
185
+ * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {
186
+ * width: 800,
187
+ * height: 600,
188
+ * fit: 'cover',
189
+ * format: 'webp',
190
+ * quality: 80,
191
+ * withoutEnlargement: true
192
+ * });
173
193
  * ```
174
194
  */
175
195
  getAssetUrl(id, options) {
@@ -223,7 +243,10 @@ var FilesModule = class {
223
243
  * @example
224
244
  * ```typescript
225
245
  * const base64 = await baasix.files.toBase64('file-uuid');
226
- * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />
246
+ * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />
247
+ *
248
+ * // Convert to WebP first for smaller payload
249
+ * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });
227
250
  * ```
228
251
  */
229
252
  async toBase64(id, options) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.js","sourcesContent":["import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { \n onProgress: options?.onProgress,\n timeout: options?.timeout \n }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n"]}
1
+ {"version":3,"sources":["../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.js","sourcesContent":["import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { \n onProgress: options?.onProgress,\n timeout: options?.timeout \n }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @param id - File UUID\n * @param options - Optional transformation options\n * @param options.width - Target width in pixels\n * @param options.height - Target height in pixels\n * @param options.fit - Resize fit mode: 'cover' | 'contain' | 'fill' | 'inside' | 'outside' (default: 'cover')\n * @param options.quality - Output quality 1–100 (default: 80)\n * @param options.format - Output format: 'jpeg' | 'png' | 'webp' | 'avif' (default: 'jpeg').\n * 'webp' and 'png' preserve alpha transparency; 'jpeg' composites transparency over a white background.\n * @param options.withoutEnlargement - When true, prevents upscaling images smaller than the target dimensions\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP (preserves transparency)\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n *\n * // Resize and convert to WebP\n * const optimizedUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 800,\n * height: 600,\n * fit: 'cover',\n * format: 'webp',\n * quality: 80,\n * withoutEnlargement: true\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/webp;base64,${base64}` }} />\n *\n * // Convert to WebP first for smaller payload\n * const base64Webp = await baasix.files.toBase64('file-uuid', { format: 'webp', quality: 80 });\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baasix/sdk",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Official JavaScript/TypeScript SDK for Baasix Backend-as-a-Service",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",