@tspvivek/baasix-sdk 0.1.0-alpha.3 → 0.1.0-alpha.5
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/README.md +166 -3
- package/dist/{client-aXK_gEyr.d.cts → client-BeD1V4Xg.d.cts} +54 -4
- package/dist/{client-CzF9B60b.d.ts → client-C7qJEINh.d.ts} +54 -4
- package/dist/index.cjs +77 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +69 -16
- package/dist/index.d.ts +69 -16
- package/dist/index.js +77 -48
- package/dist/index.js.map +1 -1
- package/dist/modules/auth.cjs.map +1 -1
- package/dist/modules/auth.d.cts +1 -1
- package/dist/modules/auth.d.ts +1 -1
- package/dist/modules/auth.js.map +1 -1
- package/dist/modules/files.cjs +1 -34
- package/dist/modules/files.cjs.map +1 -1
- package/dist/modules/files.d.cts +1 -1
- package/dist/modules/files.d.ts +1 -1
- package/dist/modules/files.js +1 -34
- package/dist/modules/files.js.map +1 -1
- package/dist/modules/items.cjs +1 -34
- package/dist/modules/items.cjs.map +1 -1
- package/dist/modules/items.d.cts +2 -2
- package/dist/modules/items.d.ts +2 -2
- package/dist/modules/items.js +1 -34
- package/dist/modules/items.js.map +1 -1
- package/dist/modules/schemas.d.cts +1 -1
- package/dist/modules/schemas.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/sort.ts","../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.cjs","sourcesContent":["import type { Sort, SortDirection } from \"../types\";\n\n/**\n * Normalize sort parameter to string format \"field:direction,field2:direction2\"\n * This is the format expected by the API for query string parameters.\n * \n * @example\n * ```typescript\n * normalizeSort({ name: 'asc', createdAt: 'desc' })\n * // Returns: \"name:asc,createdAt:desc\"\n * \n * normalizeSort(['-createdAt', 'name'])\n * // Returns: \"createdAt:desc,name:asc\"\n * \n * normalizeSort('name:asc')\n * // Returns: \"name:asc\"\n * ```\n */\nexport function normalizeSort(sort: Sort | undefined): string | undefined {\n if (!sort) return undefined;\n\n // Already a string\n if (typeof sort === \"string\") {\n return sort;\n }\n\n // Array of strings like ['-createdAt', 'name']\n if (Array.isArray(sort)) {\n if (sort.length === 0) return undefined;\n \n // Check if it's array of objects { column, order }\n if (typeof sort[0] === \"object\" && \"column\" in sort[0]) {\n return (sort as { column: string; order: SortDirection }[])\n .map((s) => `${s.column}:${s.order.toLowerCase()}`)\n .join(\",\");\n }\n \n // Array of strings like ['-name', 'createdAt']\n return (sort as string[])\n .map((s) => {\n if (s.startsWith(\"-\")) {\n return `${s.substring(1)}:desc`;\n }\n if (s.includes(\":\")) {\n return s;\n }\n return `${s}:asc`;\n })\n .join(\",\");\n }\n\n // Object like { name: 'asc', createdAt: 'desc' }\n if (typeof sort === \"object\") {\n const entries = Object.entries(sort as Record<string, SortDirection>);\n if (entries.length === 0) return undefined;\n \n return entries\n .map(([field, direction]) => `${field}:${direction.toLowerCase()}`)\n .join(\",\");\n }\n\n return undefined;\n}\n","import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\nimport { normalizeSort } from \"../utils/sort\";\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 { onProgress: options?.onProgress }\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 const normalizedParams = params ? {\n ...params,\n sort: normalizeSort(params.sort),\n } : undefined;\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: normalizedParams 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 { onProgress: options?.onProgress }\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"]}
|
package/dist/modules/files.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-
|
|
1
|
+
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-BeD1V4Xg.cjs';
|
|
2
2
|
import '../types-BdjsGANq.cjs';
|
|
3
3
|
|
|
4
4
|
interface FilesModuleConfig {
|
package/dist/modules/files.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-
|
|
1
|
+
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-C7qJEINh.js';
|
|
2
2
|
import '../types-BdjsGANq.js';
|
|
3
3
|
|
|
4
4
|
interface FilesModuleConfig {
|
package/dist/modules/files.js
CHANGED
|
@@ -1,32 +1,3 @@
|
|
|
1
|
-
// src/utils/sort.ts
|
|
2
|
-
function normalizeSort(sort) {
|
|
3
|
-
if (!sort) return void 0;
|
|
4
|
-
if (typeof sort === "string") {
|
|
5
|
-
return sort;
|
|
6
|
-
}
|
|
7
|
-
if (Array.isArray(sort)) {
|
|
8
|
-
if (sort.length === 0) return void 0;
|
|
9
|
-
if (typeof sort[0] === "object" && "column" in sort[0]) {
|
|
10
|
-
return sort.map((s) => `${s.column}:${s.order.toLowerCase()}`).join(",");
|
|
11
|
-
}
|
|
12
|
-
return sort.map((s) => {
|
|
13
|
-
if (s.startsWith("-")) {
|
|
14
|
-
return `${s.substring(1)}:desc`;
|
|
15
|
-
}
|
|
16
|
-
if (s.includes(":")) {
|
|
17
|
-
return s;
|
|
18
|
-
}
|
|
19
|
-
return `${s}:asc`;
|
|
20
|
-
}).join(",");
|
|
21
|
-
}
|
|
22
|
-
if (typeof sort === "object") {
|
|
23
|
-
const entries = Object.entries(sort);
|
|
24
|
-
if (entries.length === 0) return void 0;
|
|
25
|
-
return entries.map(([field, direction]) => `${field}:${direction.toLowerCase()}`).join(",");
|
|
26
|
-
}
|
|
27
|
-
return void 0;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
1
|
// src/modules/files.ts
|
|
31
2
|
var FilesModule = class {
|
|
32
3
|
client;
|
|
@@ -118,12 +89,8 @@ var FilesModule = class {
|
|
|
118
89
|
* ```
|
|
119
90
|
*/
|
|
120
91
|
async find(params) {
|
|
121
|
-
const normalizedParams = params ? {
|
|
122
|
-
...params,
|
|
123
|
-
sort: normalizeSort(params.sort)
|
|
124
|
-
} : void 0;
|
|
125
92
|
return this.client.get("/files", {
|
|
126
|
-
params
|
|
93
|
+
params
|
|
127
94
|
});
|
|
128
95
|
}
|
|
129
96
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/sort.ts","../../src/modules/files.ts"],"names":[],"mappings":"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","file":"files.js","sourcesContent":["import type { Sort, SortDirection } from \"../types\";\n\n/**\n * Normalize sort parameter to string format \"field:direction,field2:direction2\"\n * This is the format expected by the API for query string parameters.\n * \n * @example\n * ```typescript\n * normalizeSort({ name: 'asc', createdAt: 'desc' })\n * // Returns: \"name:asc,createdAt:desc\"\n * \n * normalizeSort(['-createdAt', 'name'])\n * // Returns: \"createdAt:desc,name:asc\"\n * \n * normalizeSort('name:asc')\n * // Returns: \"name:asc\"\n * ```\n */\nexport function normalizeSort(sort: Sort | undefined): string | undefined {\n if (!sort) return undefined;\n\n // Already a string\n if (typeof sort === \"string\") {\n return sort;\n }\n\n // Array of strings like ['-createdAt', 'name']\n if (Array.isArray(sort)) {\n if (sort.length === 0) return undefined;\n \n // Check if it's array of objects { column, order }\n if (typeof sort[0] === \"object\" && \"column\" in sort[0]) {\n return (sort as { column: string; order: SortDirection }[])\n .map((s) => `${s.column}:${s.order.toLowerCase()}`)\n .join(\",\");\n }\n \n // Array of strings like ['-name', 'createdAt']\n return (sort as string[])\n .map((s) => {\n if (s.startsWith(\"-\")) {\n return `${s.substring(1)}:desc`;\n }\n if (s.includes(\":\")) {\n return s;\n }\n return `${s}:asc`;\n })\n .join(\",\");\n }\n\n // Object like { name: 'asc', createdAt: 'desc' }\n if (typeof sort === \"object\") {\n const entries = Object.entries(sort as Record<string, SortDirection>);\n if (entries.length === 0) return undefined;\n \n return entries\n .map(([field, direction]) => `${field}:${direction.toLowerCase()}`)\n .join(\",\");\n }\n\n return undefined;\n}\n","import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\nimport { normalizeSort } from \"../utils/sort\";\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 { onProgress: options?.onProgress }\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 const normalizedParams = params ? {\n ...params,\n sort: normalizeSort(params.sort),\n } : undefined;\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: normalizedParams 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":";AAgCO,IAAM,cAAN,MAAkB;AAAA,EACf,MAAA;AAAA,EAER,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAG9B,IAAA,IAAI,IAAA,YAAgB,IAAA,IAAQ,IAAA,YAAgB,IAAA,EAAM;AAChD,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAuB,CAAA;AAAA,IACjD;AAGA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,QAAA,CAAS,MAAA,CAAO,aAAA,EAAe,OAAA,CAAQ,WAAW,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,QAAA,CAAS,MAAA,CAAO,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,OAAA,EAAS,aAAa,MAAA,EAAW;AACnC,MAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,QAAA,CAAS,OAAO,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA;AAAA,MACjC,QAAA;AAAA,MACA,QAAA;AAAA,MACA,EAAE,UAAA,EAAY,OAAA,EAAS,UAAA;AAAW,KACpC;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,UAAA,CACJ,KAAA,EACA,OAAA,EACyB;AACzB,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,MAAM,YACJ,KAAA,YAAiB,QAAA,GACb,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,GAChB,KAAA;AAEN,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AAChD,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KAAK,MAAA,EAAgE;AACzE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAqC,QAAA,EAAU;AAAA,MAChE;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAQ,EAAA,EAAmC;AAC/C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,GAAA,CAA4B,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,CACJ,EAAA,EACA,IAAA,EACuB;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACjC,UAAU,EAAE,CAAA,CAAA;AAAA,MACZ;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAA,OAAA,EAAU,EAAE,CAAA,CAAE,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAW,GAAA,EAA8B;AAC7C,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,WAAA,CAAY,IAAY,OAAA,EAAyC;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACvC,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,CAAA,QAAA,EAAW,EAAE,IAAI,OAAO,CAAA;AAE5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,GAAA,CAAI,aAAa,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,GAAA,CAAI,aAAa,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACvD;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,GAAA,CAAI,aAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,QAAA,CAAS,EAAA,EAAY,OAAA,EAAgD;AACzE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,OAAO,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAA,CAAS,EAAA,EAAY,OAAA,EAAkD;AAC3E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AAC5C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,YAAY,MAAM;AACvB,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAClC,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,CAAA;AACA,MAAA,MAAA,CAAO,OAAA,GAAU,MAAA;AACjB,MAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,aAAA,CACJ,GAAA,EACA,OAAA,EACuB;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,eAAA;AAAA,MACA;AAAA,QACE,GAAA;AAAA,QACA,GAAG;AAAA;AACL,KACF;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF","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 { onProgress: options?.onProgress }\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"]}
|
package/dist/modules/items.cjs
CHANGED
|
@@ -1,34 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// src/utils/sort.ts
|
|
4
|
-
function normalizeSort(sort) {
|
|
5
|
-
if (!sort) return void 0;
|
|
6
|
-
if (typeof sort === "string") {
|
|
7
|
-
return sort;
|
|
8
|
-
}
|
|
9
|
-
if (Array.isArray(sort)) {
|
|
10
|
-
if (sort.length === 0) return void 0;
|
|
11
|
-
if (typeof sort[0] === "object" && "column" in sort[0]) {
|
|
12
|
-
return sort.map((s) => `${s.column}:${s.order.toLowerCase()}`).join(",");
|
|
13
|
-
}
|
|
14
|
-
return sort.map((s) => {
|
|
15
|
-
if (s.startsWith("-")) {
|
|
16
|
-
return `${s.substring(1)}:desc`;
|
|
17
|
-
}
|
|
18
|
-
if (s.includes(":")) {
|
|
19
|
-
return s;
|
|
20
|
-
}
|
|
21
|
-
return `${s}:asc`;
|
|
22
|
-
}).join(",");
|
|
23
|
-
}
|
|
24
|
-
if (typeof sort === "object") {
|
|
25
|
-
const entries = Object.entries(sort);
|
|
26
|
-
if (entries.length === 0) return void 0;
|
|
27
|
-
return entries.map(([field, direction]) => `${field}:${direction.toLowerCase()}`).join(",");
|
|
28
|
-
}
|
|
29
|
-
return void 0;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
3
|
// src/modules/items.ts
|
|
33
4
|
var QueryBuilder = class {
|
|
34
5
|
collection;
|
|
@@ -336,12 +307,8 @@ var ItemsModule = class {
|
|
|
336
307
|
* ```
|
|
337
308
|
*/
|
|
338
309
|
async find(params) {
|
|
339
|
-
const normalizedParams = params ? {
|
|
340
|
-
...params,
|
|
341
|
-
sort: normalizeSort(params.sort)
|
|
342
|
-
} : void 0;
|
|
343
310
|
return this.client.get(`/items/${this.collection}`, {
|
|
344
|
-
params
|
|
311
|
+
params
|
|
345
312
|
});
|
|
346
313
|
}
|
|
347
314
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/sort.ts","../../src/modules/items.ts"],"names":[],"mappings":"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","file":"items.cjs","sourcesContent":["import type { Sort, SortDirection } from \"../types\";\n\n/**\n * Normalize sort parameter to string format \"field:direction,field2:direction2\"\n * This is the format expected by the API for query string parameters.\n * \n * @example\n * ```typescript\n * normalizeSort({ name: 'asc', createdAt: 'desc' })\n * // Returns: \"name:asc,createdAt:desc\"\n * \n * normalizeSort(['-createdAt', 'name'])\n * // Returns: \"createdAt:desc,name:asc\"\n * \n * normalizeSort('name:asc')\n * // Returns: \"name:asc\"\n * ```\n */\nexport function normalizeSort(sort: Sort | undefined): string | undefined {\n if (!sort) return undefined;\n\n // Already a string\n if (typeof sort === \"string\") {\n return sort;\n }\n\n // Array of strings like ['-createdAt', 'name']\n if (Array.isArray(sort)) {\n if (sort.length === 0) return undefined;\n \n // Check if it's array of objects { column, order }\n if (typeof sort[0] === \"object\" && \"column\" in sort[0]) {\n return (sort as { column: string; order: SortDirection }[])\n .map((s) => `${s.column}:${s.order.toLowerCase()}`)\n .join(\",\");\n }\n \n // Array of strings like ['-name', 'createdAt']\n return (sort as string[])\n .map((s) => {\n if (s.startsWith(\"-\")) {\n return `${s.substring(1)}:desc`;\n }\n if (s.includes(\":\")) {\n return s;\n }\n return `${s}:asc`;\n })\n .join(\",\");\n }\n\n // Object like { name: 'asc', createdAt: 'desc' }\n if (typeof sort === \"object\") {\n const entries = Object.entries(sort as Record<string, SortDirection>);\n if (entries.length === 0) return undefined;\n \n return entries\n .map(([field, direction]) => `${field}:${direction.toLowerCase()}`)\n .join(\",\");\n }\n\n return undefined;\n}\n","import type { HttpClient } from \"../client\";\nimport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n} from \"../types\";\nimport { normalizeSort } from \"../utils/sort\";\n\nexport interface ItemsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Query builder for constructing type-safe queries\n */\nexport class QueryBuilder<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n private queryParams: QueryParams = {};\n\n constructor(collection: string, client: HttpClient) {\n this.collection = collection;\n this.client = client;\n }\n\n /**\n * Select specific fields to return\n *\n * @example\n * ```typescript\n * items.select(['id', 'name', 'author.*'])\n * items.select('*', 'category.name')\n * ```\n */\n select(...fields: string[] | [string[]]): this {\n const flatFields = fields.length === 1 && Array.isArray(fields[0])\n ? fields[0]\n : (fields as string[]);\n this.queryParams.fields = flatFields;\n return this;\n }\n\n /**\n * Alias for select()\n */\n fields(...fields: string[] | [string[]]): this {\n return this.select(...fields);\n }\n\n /**\n * Add filter conditions\n *\n * @example\n * ```typescript\n * // Simple equality\n * items.filter({ status: { eq: 'active' } })\n *\n * // Multiple conditions\n * items.filter({\n * AND: [\n * { status: { eq: 'active' } },\n * { price: { gte: 100 } }\n * ]\n * })\n *\n * // Relation filtering\n * items.filter({ 'author.name': { like: 'John' } })\n * ```\n */\n filter(filter: Filter): this {\n this.queryParams.filter = filter;\n return this;\n }\n\n /**\n * Alias for filter()\n */\n where(filter: Filter): this {\n return this.filter(filter);\n }\n\n /**\n * Sort results\n *\n * @example\n * ```typescript\n * // Object notation\n * items.sort({ createdAt: 'desc', name: 'asc' })\n *\n * // Array notation with prefix\n * items.sort(['-createdAt', 'name'])\n *\n * // String shorthand\n * items.sort('createdAt:desc')\n * ```\n */\n sort(sort: Sort): this {\n this.queryParams.sort = sort;\n return this;\n }\n\n /**\n * Alias for sort()\n */\n orderBy(sort: Sort): this {\n return this.sort(sort);\n }\n\n /**\n * Limit number of results\n *\n * @example\n * ```typescript\n * items.limit(20)\n * items.limit(-1) // All results\n * ```\n */\n limit(limit: number): this {\n this.queryParams.limit = limit;\n return this;\n }\n\n /**\n * Set page number (1-indexed)\n *\n * @example\n * ```typescript\n * items.page(2).limit(20)\n * ```\n */\n page(page: number): this {\n this.queryParams.page = page;\n return this;\n }\n\n /**\n * Skip a number of results\n *\n * @example\n * ```typescript\n * items.offset(20)\n * ```\n */\n offset(offset: number): this {\n this.queryParams.offset = offset;\n return this;\n }\n\n /**\n * Full-text search\n *\n * @example\n * ```typescript\n * items.search('keyword', ['title', 'description'])\n * ```\n */\n search(query: string, fields?: string[]): this {\n this.queryParams.search = query;\n if (fields) {\n this.queryParams.searchFields = fields;\n }\n return this;\n }\n\n /**\n * Include soft-deleted items\n *\n * @example\n * ```typescript\n * items.withDeleted()\n * ```\n */\n withDeleted(): this {\n this.queryParams.paranoid = false;\n return this;\n }\n\n /**\n * Filter related items in O2M/M2M relations\n *\n * @example\n * ```typescript\n * // Only show approved comments\n * items.relFilter({\n * comments: { approved: { eq: true } }\n * })\n * ```\n */\n relFilter(conditions: Record<string, Filter>): this {\n this.queryParams.relConditions = conditions;\n return this;\n }\n\n /**\n * Get the built query parameters\n */\n getQuery(): QueryParams {\n return { ...this.queryParams };\n }\n\n /**\n * Execute the query and return results\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await items\n * .filter({ status: { eq: 'active' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n async get(): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: this.buildParams(),\n });\n }\n\n /**\n * Execute the query and return the first result\n *\n * @example\n * ```typescript\n * const item = await items\n * .filter({ slug: { eq: 'my-post' } })\n * .first();\n * ```\n */\n async first(): Promise<T | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n /**\n * Count matching items\n *\n * @example\n * ```typescript\n * const count = await items.filter({ status: { eq: 'active' } }).count();\n * ```\n */\n async count(): Promise<number> {\n const result = await this.client.get<PaginatedResponse<T>>(\n `/items/${this.collection}`,\n {\n params: {\n ...this.buildParams(),\n limit: 0,\n },\n }\n );\n return result.totalCount || 0;\n }\n\n /**\n * Build query parameters for the request\n */\n private buildParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (this.queryParams.fields) {\n params.fields = this.queryParams.fields;\n }\n if (this.queryParams.filter) {\n params.filter = this.queryParams.filter;\n }\n if (this.queryParams.sort) {\n params.sort = this.queryParams.sort;\n }\n if (this.queryParams.limit !== undefined) {\n params.limit = this.queryParams.limit;\n }\n if (this.queryParams.page !== undefined) {\n params.page = this.queryParams.page;\n }\n if (this.queryParams.offset !== undefined) {\n params.offset = this.queryParams.offset;\n }\n if (this.queryParams.search) {\n params.search = this.queryParams.search;\n }\n if (this.queryParams.searchFields) {\n params.searchFields = this.queryParams.searchFields;\n }\n if (this.queryParams.paranoid !== undefined) {\n params.paranoid = this.queryParams.paranoid;\n }\n if (this.queryParams.relConditions) {\n params.relConditions = this.queryParams.relConditions;\n }\n if (this.queryParams.aggregate) {\n params.aggregate = this.queryParams.aggregate;\n }\n if (this.queryParams.groupBy) {\n params.groupBy = this.queryParams.groupBy;\n }\n\n return params;\n }\n}\n\n/**\n * Items module for CRUD operations on collections.\n *\n * @example\n * ```typescript\n * const items = baasix.items('products');\n *\n * // List items\n * const products = await items.find({ filter: { status: { eq: 'active' } } });\n *\n * // Get single item\n * const product = await items.findOne('product-id');\n *\n * // Create item\n * const newProduct = await items.create({ name: 'Widget', price: 29.99 });\n *\n * // Update item\n * await items.update('product-id', { price: 24.99 });\n *\n * // Delete item\n * await items.delete('product-id');\n * ```\n */\nexport class ItemsModule<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n\n constructor(collection: string, config: ItemsModuleConfig) {\n this.collection = collection;\n this.client = config.client;\n }\n\n /**\n * Create a query builder for fluent query construction\n *\n * @example\n * ```typescript\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n query(): QueryBuilder<T> {\n return new QueryBuilder<T>(this.collection, this.client);\n }\n\n /**\n * Find items with optional query parameters\n *\n * @example\n * ```typescript\n * // Simple query\n * const { data } = await items.find();\n *\n * // With parameters\n * const { data, totalCount } = await items.find({\n * filter: { status: { eq: 'active' } },\n * sort: { createdAt: 'desc' },\n * limit: 20,\n * page: 1,\n * fields: ['id', 'name', 'price']\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<T>> {\n const normalizedParams = params ? {\n ...params,\n sort: normalizeSort(params.sort),\n } : undefined;\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: normalizedParams as Record<string, unknown>,\n });\n }\n\n /**\n * Alias for find()\n */\n async findMany(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.find(params);\n }\n\n /**\n * Find a single item by ID\n *\n * @example\n * ```typescript\n * const product = await items.findOne('product-uuid');\n *\n * // With specific fields\n * const product = await items.findOne('product-uuid', {\n * fields: ['id', 'name', 'category.*']\n * });\n * ```\n */\n async findOne(\n id: string,\n params?: Pick<QueryParams, \"fields\">\n ): Promise<T> {\n const response = await this.client.get<SingleResponse<T>>(\n `/items/${this.collection}/${id}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n /**\n * Alias for findOne()\n */\n async get(id: string, params?: Pick<QueryParams, \"fields\">): Promise<T> {\n return this.findOne(id, params);\n }\n\n /**\n * Create a new item\n *\n * @example\n * ```typescript\n * const id = await items.create({\n * name: 'New Product',\n * price: 29.99,\n * status: 'draft'\n * });\n * ```\n */\n async create(data: Partial<T>): Promise<string> {\n const response = await this.client.post<MutationResponse<string>>(\n `/items/${this.collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for create()\n */\n async insert(data: Partial<T>): Promise<string> {\n return this.create(data);\n }\n\n /**\n * Create multiple items at once\n *\n * @example\n * ```typescript\n * const ids = await items.createMany([\n * { name: 'Product 1', price: 10 },\n * { name: 'Product 2', price: 20 }\n * ]);\n * ```\n */\n async createMany(data: Partial<T>[]): Promise<string[]> {\n const response = await this.client.post<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for createMany()\n */\n async insertMany(data: Partial<T>[]): Promise<string[]> {\n return this.createMany(data);\n }\n\n /**\n * Update an existing item\n *\n * @example\n * ```typescript\n * await items.update('product-uuid', {\n * price: 24.99,\n * status: 'published'\n * });\n * ```\n */\n async update(id: string, data: Partial<T>): Promise<string> {\n const response = await this.client.patch<MutationResponse<string>>(\n `/items/${this.collection}/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Update multiple items at once\n *\n * @example\n * ```typescript\n * // Update by IDs\n * await items.updateMany(['id1', 'id2'], { status: 'archived' });\n * ```\n */\n async updateMany(ids: string[], data: Partial<T>): Promise<string[]> {\n const response = await this.client.patch<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n { ids, data }\n );\n return response.data;\n }\n\n /**\n * Upsert an item (create if not exists, update if exists)\n *\n * @example\n * ```typescript\n * const id = await items.upsert(\n * { sku: 'WIDGET-001' },\n * { name: 'Widget', price: 29.99, sku: 'WIDGET-001' }\n * );\n * ```\n */\n async upsert(\n filter: Filter,\n data: Partial<T>\n ): Promise<string> {\n // Try to find existing\n const existing = await this.find({ filter, limit: 1 });\n if (existing.data.length > 0) {\n return this.update(existing.data[0].id, data);\n }\n return this.create(data);\n }\n\n /**\n * Delete an item by ID\n *\n * @example\n * ```typescript\n * await items.delete('product-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Delete multiple items\n *\n * @example\n * ```typescript\n * await items.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/bulk`, {\n params: { ids },\n });\n }\n\n /**\n * Soft delete an item (if paranoid mode is enabled)\n *\n * @example\n * ```typescript\n * await items.softDelete('product-uuid');\n * ```\n */\n async softDelete(id: string): Promise<void> {\n await this.update(id, { deletedAt: new Date().toISOString() } as unknown as Partial<T>);\n }\n\n /**\n * Restore a soft-deleted item\n *\n * @example\n * ```typescript\n * await items.restore('product-uuid');\n * ```\n */\n async restore(id: string): Promise<void> {\n await this.update(id, { deletedAt: null } as unknown as Partial<T>);\n }\n\n /**\n * Aggregate data with grouping\n *\n * @example\n * ```typescript\n * const results = await items.aggregate({\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * avgPrice: { function: 'avg', field: 'price' }\n * },\n * groupBy: ['category', 'status'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n params: Pick<QueryParams, \"aggregate\" | \"groupBy\" | \"filter\">\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<PaginatedResponse<Record<string, unknown>>>(\n `/items/${this.collection}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n // ===================\n // Import Operations\n // ===================\n\n /**\n * Import items from a CSV file\n *\n * @example\n * ```typescript\n * // Browser\n * const fileInput = document.querySelector('input[type=\"file\"]');\n * const file = fileInput.files[0];\n * \n * const result = await baasix.items('products').importCSV(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importCSV(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"csvFile\", file);\n } else {\n // React Native style file\n formData.append(\"csvFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-csv`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from a JSON file\n *\n * @example\n * ```typescript\n * const file = fileInput.files[0]; // JSON file\n * const result = await baasix.items('products').importJSON(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importJSON(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"jsonFile\", file);\n } else {\n formData.append(\"jsonFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-json`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from an array of objects\n *\n * @example\n * ```typescript\n * const data = [\n * { name: 'Product 1', price: 29.99 },\n * { name: 'Product 2', price: 39.99 }\n * ];\n * \n * const result = await baasix.items('products').importData(data);\n * ```\n */\n async importData(data: Partial<T>[]): Promise<BulkResponse> {\n const response = await this.client.post<BulkResponse>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response;\n }\n\n // ===================\n // Sort Operations\n // ===================\n\n /**\n * Sort/reorder items (move item before or after another)\n *\n * @example\n * ```typescript\n * // Move item1 before item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid');\n * \n * // Move item1 after item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid', 'after');\n * ```\n */\n async sortItem(\n itemId: string,\n targetItemId: string,\n mode: \"before\" | \"after\" = \"before\"\n ): Promise<void> {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: itemId,\n to: targetItemId,\n mode,\n });\n }\n\n /**\n * Reorder multiple items\n *\n * @example\n * ```typescript\n * // Set explicit order\n * await baasix.items('products').reorder([\n * 'item3-uuid',\n * 'item1-uuid',\n * 'item2-uuid'\n * ]);\n * ```\n */\n async reorder(orderedIds: string[]): Promise<void> {\n // Sort items one by one to achieve the desired order\n for (let i = 1; i < orderedIds.length; i++) {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: orderedIds[i],\n to: orderedIds[i - 1],\n mode: \"after\",\n });\n }\n }\n}\n\nexport interface ImportResult {\n imported: number;\n failed: number;\n errors: Array<{ row: number; data: Record<string, unknown>; error: string }>;\n}\n\n// Re-export types from types.ts\nexport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/modules/items.ts"],"names":[],"mappings":"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","file":"items.cjs","sourcesContent":["import type { HttpClient } from \"../client\";\nimport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n} from \"../types\";\n\nexport interface ItemsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Query builder for constructing type-safe queries\n */\nexport class QueryBuilder<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n private queryParams: QueryParams = {};\n\n constructor(collection: string, client: HttpClient) {\n this.collection = collection;\n this.client = client;\n }\n\n /**\n * Select specific fields to return\n *\n * @example\n * ```typescript\n * items.select(['id', 'name', 'author.*'])\n * items.select('*', 'category.name')\n * ```\n */\n select(...fields: string[] | [string[]]): this {\n const flatFields = fields.length === 1 && Array.isArray(fields[0])\n ? fields[0]\n : (fields as string[]);\n this.queryParams.fields = flatFields;\n return this;\n }\n\n /**\n * Alias for select()\n */\n fields(...fields: string[] | [string[]]): this {\n return this.select(...fields);\n }\n\n /**\n * Add filter conditions\n *\n * @example\n * ```typescript\n * // Simple equality\n * items.filter({ status: { eq: 'active' } })\n *\n * // Multiple conditions\n * items.filter({\n * AND: [\n * { status: { eq: 'active' } },\n * { price: { gte: 100 } }\n * ]\n * })\n *\n * // Relation filtering\n * items.filter({ 'author.name': { like: 'John' } })\n * ```\n */\n filter(filter: Filter): this {\n this.queryParams.filter = filter;\n return this;\n }\n\n /**\n * Alias for filter()\n */\n where(filter: Filter): this {\n return this.filter(filter);\n }\n\n /**\n * Sort results\n *\n * @example\n * ```typescript\n * // Object notation\n * items.sort({ createdAt: 'desc', name: 'asc' })\n *\n * // Array notation with prefix\n * items.sort(['-createdAt', 'name'])\n *\n * // String shorthand\n * items.sort('createdAt:desc')\n * ```\n */\n sort(sort: Sort): this {\n this.queryParams.sort = sort;\n return this;\n }\n\n /**\n * Alias for sort()\n */\n orderBy(sort: Sort): this {\n return this.sort(sort);\n }\n\n /**\n * Limit number of results\n *\n * @example\n * ```typescript\n * items.limit(20)\n * items.limit(-1) // All results\n * ```\n */\n limit(limit: number): this {\n this.queryParams.limit = limit;\n return this;\n }\n\n /**\n * Set page number (1-indexed)\n *\n * @example\n * ```typescript\n * items.page(2).limit(20)\n * ```\n */\n page(page: number): this {\n this.queryParams.page = page;\n return this;\n }\n\n /**\n * Skip a number of results\n *\n * @example\n * ```typescript\n * items.offset(20)\n * ```\n */\n offset(offset: number): this {\n this.queryParams.offset = offset;\n return this;\n }\n\n /**\n * Full-text search\n *\n * @example\n * ```typescript\n * items.search('keyword', ['title', 'description'])\n * ```\n */\n search(query: string, fields?: string[]): this {\n this.queryParams.search = query;\n if (fields) {\n this.queryParams.searchFields = fields;\n }\n return this;\n }\n\n /**\n * Include soft-deleted items\n *\n * @example\n * ```typescript\n * items.withDeleted()\n * ```\n */\n withDeleted(): this {\n this.queryParams.paranoid = false;\n return this;\n }\n\n /**\n * Filter related items in O2M/M2M relations\n *\n * @example\n * ```typescript\n * // Only show approved comments\n * items.relFilter({\n * comments: { approved: { eq: true } }\n * })\n * ```\n */\n relFilter(conditions: Record<string, Filter>): this {\n this.queryParams.relConditions = conditions;\n return this;\n }\n\n /**\n * Get the built query parameters\n */\n getQuery(): QueryParams {\n return { ...this.queryParams };\n }\n\n /**\n * Execute the query and return results\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await items\n * .filter({ status: { eq: 'active' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n async get(): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: this.buildParams(),\n });\n }\n\n /**\n * Execute the query and return the first result\n *\n * @example\n * ```typescript\n * const item = await items\n * .filter({ slug: { eq: 'my-post' } })\n * .first();\n * ```\n */\n async first(): Promise<T | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n /**\n * Count matching items\n *\n * @example\n * ```typescript\n * const count = await items.filter({ status: { eq: 'active' } }).count();\n * ```\n */\n async count(): Promise<number> {\n const result = await this.client.get<PaginatedResponse<T>>(\n `/items/${this.collection}`,\n {\n params: {\n ...this.buildParams(),\n limit: 0,\n },\n }\n );\n return result.totalCount || 0;\n }\n\n /**\n * Build query parameters for the request\n */\n private buildParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (this.queryParams.fields) {\n params.fields = this.queryParams.fields;\n }\n if (this.queryParams.filter) {\n params.filter = this.queryParams.filter;\n }\n if (this.queryParams.sort) {\n params.sort = this.queryParams.sort;\n }\n if (this.queryParams.limit !== undefined) {\n params.limit = this.queryParams.limit;\n }\n if (this.queryParams.page !== undefined) {\n params.page = this.queryParams.page;\n }\n if (this.queryParams.offset !== undefined) {\n params.offset = this.queryParams.offset;\n }\n if (this.queryParams.search) {\n params.search = this.queryParams.search;\n }\n if (this.queryParams.searchFields) {\n params.searchFields = this.queryParams.searchFields;\n }\n if (this.queryParams.paranoid !== undefined) {\n params.paranoid = this.queryParams.paranoid;\n }\n if (this.queryParams.relConditions) {\n params.relConditions = this.queryParams.relConditions;\n }\n if (this.queryParams.aggregate) {\n params.aggregate = this.queryParams.aggregate;\n }\n if (this.queryParams.groupBy) {\n params.groupBy = this.queryParams.groupBy;\n }\n\n return params;\n }\n}\n\n/**\n * Items module for CRUD operations on collections.\n *\n * @example\n * ```typescript\n * const items = baasix.items('products');\n *\n * // List items\n * const products = await items.find({ filter: { status: { eq: 'active' } } });\n *\n * // Get single item\n * const product = await items.findOne('product-id');\n *\n * // Create item\n * const newProduct = await items.create({ name: 'Widget', price: 29.99 });\n *\n * // Update item\n * await items.update('product-id', { price: 24.99 });\n *\n * // Delete item\n * await items.delete('product-id');\n * ```\n */\nexport class ItemsModule<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n\n constructor(collection: string, config: ItemsModuleConfig) {\n this.collection = collection;\n this.client = config.client;\n }\n\n /**\n * Create a query builder for fluent query construction\n *\n * @example\n * ```typescript\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n query(): QueryBuilder<T> {\n return new QueryBuilder<T>(this.collection, this.client);\n }\n\n /**\n * Find items with optional query parameters\n *\n * @example\n * ```typescript\n * // Simple query\n * const { data } = await items.find();\n *\n * // With parameters\n * const { data, totalCount } = await items.find({\n * filter: { status: { eq: 'active' } },\n * sort: { createdAt: 'desc' },\n * limit: 20,\n * page: 1,\n * fields: ['id', 'name', 'price']\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Alias for find()\n */\n async findMany(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.find(params);\n }\n\n /**\n * Find a single item by ID\n *\n * @example\n * ```typescript\n * const product = await items.findOne('product-uuid');\n *\n * // With specific fields\n * const product = await items.findOne('product-uuid', {\n * fields: ['id', 'name', 'category.*']\n * });\n * ```\n */\n async findOne(\n id: string,\n params?: Pick<QueryParams, \"fields\">\n ): Promise<T> {\n const response = await this.client.get<SingleResponse<T>>(\n `/items/${this.collection}/${id}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n /**\n * Alias for findOne()\n */\n async get(id: string, params?: Pick<QueryParams, \"fields\">): Promise<T> {\n return this.findOne(id, params);\n }\n\n /**\n * Create a new item\n *\n * @example\n * ```typescript\n * const id = await items.create({\n * name: 'New Product',\n * price: 29.99,\n * status: 'draft'\n * });\n * ```\n */\n async create(data: Partial<T>): Promise<string> {\n const response = await this.client.post<MutationResponse<string>>(\n `/items/${this.collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for create()\n */\n async insert(data: Partial<T>): Promise<string> {\n return this.create(data);\n }\n\n /**\n * Create multiple items at once\n *\n * @example\n * ```typescript\n * const ids = await items.createMany([\n * { name: 'Product 1', price: 10 },\n * { name: 'Product 2', price: 20 }\n * ]);\n * ```\n */\n async createMany(data: Partial<T>[]): Promise<string[]> {\n const response = await this.client.post<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for createMany()\n */\n async insertMany(data: Partial<T>[]): Promise<string[]> {\n return this.createMany(data);\n }\n\n /**\n * Update an existing item\n *\n * @example\n * ```typescript\n * await items.update('product-uuid', {\n * price: 24.99,\n * status: 'published'\n * });\n * ```\n */\n async update(id: string, data: Partial<T>): Promise<string> {\n const response = await this.client.patch<MutationResponse<string>>(\n `/items/${this.collection}/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Update multiple items at once\n *\n * @example\n * ```typescript\n * // Update by IDs\n * await items.updateMany(['id1', 'id2'], { status: 'archived' });\n * ```\n */\n async updateMany(ids: string[], data: Partial<T>): Promise<string[]> {\n const response = await this.client.patch<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n { ids, data }\n );\n return response.data;\n }\n\n /**\n * Upsert an item (create if not exists, update if exists)\n *\n * @example\n * ```typescript\n * const id = await items.upsert(\n * { sku: 'WIDGET-001' },\n * { name: 'Widget', price: 29.99, sku: 'WIDGET-001' }\n * );\n * ```\n */\n async upsert(\n filter: Filter,\n data: Partial<T>\n ): Promise<string> {\n // Try to find existing\n const existing = await this.find({ filter, limit: 1 });\n if (existing.data.length > 0) {\n return this.update(existing.data[0].id, data);\n }\n return this.create(data);\n }\n\n /**\n * Delete an item by ID\n *\n * @example\n * ```typescript\n * await items.delete('product-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Delete multiple items\n *\n * @example\n * ```typescript\n * await items.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/bulk`, {\n params: { ids },\n });\n }\n\n /**\n * Soft delete an item (if paranoid mode is enabled)\n *\n * @example\n * ```typescript\n * await items.softDelete('product-uuid');\n * ```\n */\n async softDelete(id: string): Promise<void> {\n await this.update(id, { deletedAt: new Date().toISOString() } as unknown as Partial<T>);\n }\n\n /**\n * Restore a soft-deleted item\n *\n * @example\n * ```typescript\n * await items.restore('product-uuid');\n * ```\n */\n async restore(id: string): Promise<void> {\n await this.update(id, { deletedAt: null } as unknown as Partial<T>);\n }\n\n /**\n * Aggregate data with grouping\n *\n * @example\n * ```typescript\n * const results = await items.aggregate({\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * avgPrice: { function: 'avg', field: 'price' }\n * },\n * groupBy: ['category', 'status'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n params: Pick<QueryParams, \"aggregate\" | \"groupBy\" | \"filter\">\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<PaginatedResponse<Record<string, unknown>>>(\n `/items/${this.collection}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n // ===================\n // Import Operations\n // ===================\n\n /**\n * Import items from a CSV file\n *\n * @example\n * ```typescript\n * // Browser\n * const fileInput = document.querySelector('input[type=\"file\"]');\n * const file = fileInput.files[0];\n * \n * const result = await baasix.items('products').importCSV(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importCSV(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"csvFile\", file);\n } else {\n // React Native style file\n formData.append(\"csvFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-csv`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from a JSON file\n *\n * @example\n * ```typescript\n * const file = fileInput.files[0]; // JSON file\n * const result = await baasix.items('products').importJSON(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importJSON(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"jsonFile\", file);\n } else {\n formData.append(\"jsonFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-json`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from an array of objects\n *\n * @example\n * ```typescript\n * const data = [\n * { name: 'Product 1', price: 29.99 },\n * { name: 'Product 2', price: 39.99 }\n * ];\n * \n * const result = await baasix.items('products').importData(data);\n * ```\n */\n async importData(data: Partial<T>[]): Promise<BulkResponse> {\n const response = await this.client.post<BulkResponse>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response;\n }\n\n // ===================\n // Sort Operations\n // ===================\n\n /**\n * Sort/reorder items (move item before or after another)\n *\n * @example\n * ```typescript\n * // Move item1 before item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid');\n * \n * // Move item1 after item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid', 'after');\n * ```\n */\n async sortItem(\n itemId: string,\n targetItemId: string,\n mode: \"before\" | \"after\" = \"before\"\n ): Promise<void> {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: itemId,\n to: targetItemId,\n mode,\n });\n }\n\n /**\n * Reorder multiple items\n *\n * @example\n * ```typescript\n * // Set explicit order\n * await baasix.items('products').reorder([\n * 'item3-uuid',\n * 'item1-uuid',\n * 'item2-uuid'\n * ]);\n * ```\n */\n async reorder(orderedIds: string[]): Promise<void> {\n // Sort items one by one to achieve the desired order\n for (let i = 1; i < orderedIds.length; i++) {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: orderedIds[i],\n to: orderedIds[i - 1],\n mode: \"after\",\n });\n }\n }\n}\n\nexport interface ImportResult {\n imported: number;\n failed: number;\n errors: Array<{ row: number; data: Record<string, unknown>; error: string }>;\n}\n\n// Re-export types from types.ts\nexport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n};\n"]}
|
package/dist/modules/items.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-
|
|
2
|
-
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-
|
|
1
|
+
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-BeD1V4Xg.cjs';
|
|
2
|
+
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-BeD1V4Xg.cjs';
|
|
3
3
|
import '../types-BdjsGANq.cjs';
|
|
4
4
|
|
|
5
5
|
interface ItemsModuleConfig {
|
package/dist/modules/items.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-
|
|
2
|
-
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-
|
|
1
|
+
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-C7qJEINh.js';
|
|
2
|
+
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-C7qJEINh.js';
|
|
3
3
|
import '../types-BdjsGANq.js';
|
|
4
4
|
|
|
5
5
|
interface ItemsModuleConfig {
|
package/dist/modules/items.js
CHANGED
|
@@ -1,32 +1,3 @@
|
|
|
1
|
-
// src/utils/sort.ts
|
|
2
|
-
function normalizeSort(sort) {
|
|
3
|
-
if (!sort) return void 0;
|
|
4
|
-
if (typeof sort === "string") {
|
|
5
|
-
return sort;
|
|
6
|
-
}
|
|
7
|
-
if (Array.isArray(sort)) {
|
|
8
|
-
if (sort.length === 0) return void 0;
|
|
9
|
-
if (typeof sort[0] === "object" && "column" in sort[0]) {
|
|
10
|
-
return sort.map((s) => `${s.column}:${s.order.toLowerCase()}`).join(",");
|
|
11
|
-
}
|
|
12
|
-
return sort.map((s) => {
|
|
13
|
-
if (s.startsWith("-")) {
|
|
14
|
-
return `${s.substring(1)}:desc`;
|
|
15
|
-
}
|
|
16
|
-
if (s.includes(":")) {
|
|
17
|
-
return s;
|
|
18
|
-
}
|
|
19
|
-
return `${s}:asc`;
|
|
20
|
-
}).join(",");
|
|
21
|
-
}
|
|
22
|
-
if (typeof sort === "object") {
|
|
23
|
-
const entries = Object.entries(sort);
|
|
24
|
-
if (entries.length === 0) return void 0;
|
|
25
|
-
return entries.map(([field, direction]) => `${field}:${direction.toLowerCase()}`).join(",");
|
|
26
|
-
}
|
|
27
|
-
return void 0;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
1
|
// src/modules/items.ts
|
|
31
2
|
var QueryBuilder = class {
|
|
32
3
|
collection;
|
|
@@ -334,12 +305,8 @@ var ItemsModule = class {
|
|
|
334
305
|
* ```
|
|
335
306
|
*/
|
|
336
307
|
async find(params) {
|
|
337
|
-
const normalizedParams = params ? {
|
|
338
|
-
...params,
|
|
339
|
-
sort: normalizeSort(params.sort)
|
|
340
|
-
} : void 0;
|
|
341
308
|
return this.client.get(`/items/${this.collection}`, {
|
|
342
|
-
params
|
|
309
|
+
params
|
|
343
310
|
});
|
|
344
311
|
}
|
|
345
312
|
/**
|