@baasix/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1197 -0
  3. package/dist/client-DeXa-R9w.d.ts +680 -0
  4. package/dist/client-VT7NckyI.d.cts +680 -0
  5. package/dist/index.cjs +4567 -0
  6. package/dist/index.cjs.map +1 -0
  7. package/dist/index.d.cts +1788 -0
  8. package/dist/index.d.ts +1788 -0
  9. package/dist/index.js +4543 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/modules/auth.cjs +650 -0
  12. package/dist/modules/auth.cjs.map +1 -0
  13. package/dist/modules/auth.d.cts +384 -0
  14. package/dist/modules/auth.d.ts +384 -0
  15. package/dist/modules/auth.js +648 -0
  16. package/dist/modules/auth.js.map +1 -0
  17. package/dist/modules/files.cjs +269 -0
  18. package/dist/modules/files.cjs.map +1 -0
  19. package/dist/modules/files.d.cts +187 -0
  20. package/dist/modules/files.d.ts +187 -0
  21. package/dist/modules/files.js +267 -0
  22. package/dist/modules/files.js.map +1 -0
  23. package/dist/modules/items.cjs +640 -0
  24. package/dist/modules/items.cjs.map +1 -0
  25. package/dist/modules/items.d.cts +465 -0
  26. package/dist/modules/items.d.ts +465 -0
  27. package/dist/modules/items.js +637 -0
  28. package/dist/modules/items.js.map +1 -0
  29. package/dist/modules/schemas.cjs +322 -0
  30. package/dist/modules/schemas.cjs.map +1 -0
  31. package/dist/modules/schemas.d.cts +260 -0
  32. package/dist/modules/schemas.d.ts +260 -0
  33. package/dist/modules/schemas.js +320 -0
  34. package/dist/modules/schemas.js.map +1 -0
  35. package/dist/storage/index.cjs +162 -0
  36. package/dist/storage/index.cjs.map +1 -0
  37. package/dist/storage/index.d.cts +96 -0
  38. package/dist/storage/index.d.ts +96 -0
  39. package/dist/storage/index.js +157 -0
  40. package/dist/storage/index.js.map +1 -0
  41. package/dist/types-BdjsGANq.d.cts +40 -0
  42. package/dist/types-BdjsGANq.d.ts +40 -0
  43. package/package.json +108 -0
@@ -0,0 +1,640 @@
1
+ 'use strict';
2
+
3
+ // src/modules/items.ts
4
+ var QueryBuilder = class {
5
+ collection;
6
+ client;
7
+ queryParams = {};
8
+ constructor(collection, client) {
9
+ this.collection = collection;
10
+ this.client = client;
11
+ }
12
+ /**
13
+ * Select specific fields to return
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * items.select(['id', 'name', 'author.*'])
18
+ * items.select('*', 'category.name')
19
+ * ```
20
+ */
21
+ select(...fields) {
22
+ const flatFields = fields.length === 1 && Array.isArray(fields[0]) ? fields[0] : fields;
23
+ this.queryParams.fields = flatFields;
24
+ return this;
25
+ }
26
+ /**
27
+ * Alias for select()
28
+ */
29
+ fields(...fields) {
30
+ return this.select(...fields);
31
+ }
32
+ /**
33
+ * Add filter conditions
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * // Simple equality
38
+ * items.filter({ status: { eq: 'active' } })
39
+ *
40
+ * // Multiple conditions
41
+ * items.filter({
42
+ * AND: [
43
+ * { status: { eq: 'active' } },
44
+ * { price: { gte: 100 } }
45
+ * ]
46
+ * })
47
+ *
48
+ * // Relation filtering
49
+ * items.filter({ 'author.name': { like: 'John' } })
50
+ * ```
51
+ */
52
+ filter(filter) {
53
+ this.queryParams.filter = filter;
54
+ return this;
55
+ }
56
+ /**
57
+ * Alias for filter()
58
+ */
59
+ where(filter) {
60
+ return this.filter(filter);
61
+ }
62
+ /**
63
+ * Sort results
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // Object notation
68
+ * items.sort({ createdAt: 'desc', name: 'asc' })
69
+ *
70
+ * // Array notation with prefix
71
+ * items.sort(['-createdAt', 'name'])
72
+ *
73
+ * // String shorthand
74
+ * items.sort('createdAt:desc')
75
+ * ```
76
+ */
77
+ sort(sort) {
78
+ this.queryParams.sort = sort;
79
+ return this;
80
+ }
81
+ /**
82
+ * Alias for sort()
83
+ */
84
+ orderBy(sort) {
85
+ return this.sort(sort);
86
+ }
87
+ /**
88
+ * Limit number of results
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * items.limit(20)
93
+ * items.limit(-1) // All results
94
+ * ```
95
+ */
96
+ limit(limit) {
97
+ this.queryParams.limit = limit;
98
+ return this;
99
+ }
100
+ /**
101
+ * Set page number (1-indexed)
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * items.page(2).limit(20)
106
+ * ```
107
+ */
108
+ page(page) {
109
+ this.queryParams.page = page;
110
+ return this;
111
+ }
112
+ /**
113
+ * Skip a number of results
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * items.offset(20)
118
+ * ```
119
+ */
120
+ offset(offset) {
121
+ this.queryParams.offset = offset;
122
+ return this;
123
+ }
124
+ /**
125
+ * Full-text search
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * items.search('keyword', ['title', 'description'])
130
+ * ```
131
+ */
132
+ search(query, fields) {
133
+ this.queryParams.search = query;
134
+ if (fields) {
135
+ this.queryParams.searchFields = fields;
136
+ }
137
+ return this;
138
+ }
139
+ /**
140
+ * Include soft-deleted items
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * items.withDeleted()
145
+ * ```
146
+ */
147
+ withDeleted() {
148
+ this.queryParams.paranoid = false;
149
+ return this;
150
+ }
151
+ /**
152
+ * Filter related items in O2M/M2M relations
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * // Only show approved comments
157
+ * items.relFilter({
158
+ * comments: { approved: { eq: true } }
159
+ * })
160
+ * ```
161
+ */
162
+ relFilter(conditions) {
163
+ this.queryParams.relConditions = conditions;
164
+ return this;
165
+ }
166
+ /**
167
+ * Get the built query parameters
168
+ */
169
+ getQuery() {
170
+ return { ...this.queryParams };
171
+ }
172
+ /**
173
+ * Execute the query and return results
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * const { data, totalCount } = await items
178
+ * .filter({ status: { eq: 'active' } })
179
+ * .sort({ createdAt: 'desc' })
180
+ * .limit(10)
181
+ * .get();
182
+ * ```
183
+ */
184
+ async get() {
185
+ return this.client.get(`/items/${this.collection}`, {
186
+ params: this.buildParams()
187
+ });
188
+ }
189
+ /**
190
+ * Execute the query and return the first result
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const item = await items
195
+ * .filter({ slug: { eq: 'my-post' } })
196
+ * .first();
197
+ * ```
198
+ */
199
+ async first() {
200
+ const result = await this.limit(1).get();
201
+ return result.data[0] || null;
202
+ }
203
+ /**
204
+ * Count matching items
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * const count = await items.filter({ status: { eq: 'active' } }).count();
209
+ * ```
210
+ */
211
+ async count() {
212
+ const result = await this.client.get(
213
+ `/items/${this.collection}`,
214
+ {
215
+ params: {
216
+ ...this.buildParams(),
217
+ limit: 0
218
+ }
219
+ }
220
+ );
221
+ return result.totalCount || 0;
222
+ }
223
+ /**
224
+ * Build query parameters for the request
225
+ */
226
+ buildParams() {
227
+ const params = {};
228
+ if (this.queryParams.fields) {
229
+ params.fields = this.queryParams.fields;
230
+ }
231
+ if (this.queryParams.filter) {
232
+ params.filter = this.queryParams.filter;
233
+ }
234
+ if (this.queryParams.sort) {
235
+ params.sort = this.queryParams.sort;
236
+ }
237
+ if (this.queryParams.limit !== void 0) {
238
+ params.limit = this.queryParams.limit;
239
+ }
240
+ if (this.queryParams.page !== void 0) {
241
+ params.page = this.queryParams.page;
242
+ }
243
+ if (this.queryParams.offset !== void 0) {
244
+ params.offset = this.queryParams.offset;
245
+ }
246
+ if (this.queryParams.search) {
247
+ params.search = this.queryParams.search;
248
+ }
249
+ if (this.queryParams.searchFields) {
250
+ params.searchFields = this.queryParams.searchFields;
251
+ }
252
+ if (this.queryParams.paranoid !== void 0) {
253
+ params.paranoid = this.queryParams.paranoid;
254
+ }
255
+ if (this.queryParams.relConditions) {
256
+ params.relConditions = this.queryParams.relConditions;
257
+ }
258
+ if (this.queryParams.aggregate) {
259
+ params.aggregate = this.queryParams.aggregate;
260
+ }
261
+ if (this.queryParams.groupBy) {
262
+ params.groupBy = this.queryParams.groupBy;
263
+ }
264
+ return params;
265
+ }
266
+ };
267
+ var ItemsModule = class {
268
+ collection;
269
+ client;
270
+ constructor(collection, config) {
271
+ this.collection = collection;
272
+ this.client = config.client;
273
+ }
274
+ /**
275
+ * Create a query builder for fluent query construction
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * const results = await baasix.items('posts')
280
+ * .query()
281
+ * .select('*', 'author.*')
282
+ * .filter({ status: { eq: 'published' } })
283
+ * .sort({ createdAt: 'desc' })
284
+ * .limit(10)
285
+ * .get();
286
+ * ```
287
+ */
288
+ query() {
289
+ return new QueryBuilder(this.collection, this.client);
290
+ }
291
+ /**
292
+ * Find items with optional query parameters
293
+ *
294
+ * @example
295
+ * ```typescript
296
+ * // Simple query
297
+ * const { data } = await items.find();
298
+ *
299
+ * // With parameters
300
+ * const { data, totalCount } = await items.find({
301
+ * filter: { status: { eq: 'active' } },
302
+ * sort: { createdAt: 'desc' },
303
+ * limit: 20,
304
+ * page: 1,
305
+ * fields: ['id', 'name', 'price']
306
+ * });
307
+ * ```
308
+ */
309
+ async find(params) {
310
+ return this.client.get(`/items/${this.collection}`, {
311
+ params
312
+ });
313
+ }
314
+ /**
315
+ * Alias for find()
316
+ */
317
+ async findMany(params) {
318
+ return this.find(params);
319
+ }
320
+ /**
321
+ * Find a single item by ID
322
+ *
323
+ * @example
324
+ * ```typescript
325
+ * const product = await items.findOne('product-uuid');
326
+ *
327
+ * // With specific fields
328
+ * const product = await items.findOne('product-uuid', {
329
+ * fields: ['id', 'name', 'category.*']
330
+ * });
331
+ * ```
332
+ */
333
+ async findOne(id, params) {
334
+ const response = await this.client.get(
335
+ `/items/${this.collection}/${id}`,
336
+ { params }
337
+ );
338
+ return response.data;
339
+ }
340
+ /**
341
+ * Alias for findOne()
342
+ */
343
+ async get(id, params) {
344
+ return this.findOne(id, params);
345
+ }
346
+ /**
347
+ * Create a new item
348
+ *
349
+ * @example
350
+ * ```typescript
351
+ * const id = await items.create({
352
+ * name: 'New Product',
353
+ * price: 29.99,
354
+ * status: 'draft'
355
+ * });
356
+ * ```
357
+ */
358
+ async create(data) {
359
+ const response = await this.client.post(
360
+ `/items/${this.collection}`,
361
+ data
362
+ );
363
+ return response.data;
364
+ }
365
+ /**
366
+ * Alias for create()
367
+ */
368
+ async insert(data) {
369
+ return this.create(data);
370
+ }
371
+ /**
372
+ * Create multiple items at once
373
+ *
374
+ * @example
375
+ * ```typescript
376
+ * const ids = await items.createMany([
377
+ * { name: 'Product 1', price: 10 },
378
+ * { name: 'Product 2', price: 20 }
379
+ * ]);
380
+ * ```
381
+ */
382
+ async createMany(data) {
383
+ const response = await this.client.post(
384
+ `/items/${this.collection}/bulk`,
385
+ data
386
+ );
387
+ return response.data;
388
+ }
389
+ /**
390
+ * Alias for createMany()
391
+ */
392
+ async insertMany(data) {
393
+ return this.createMany(data);
394
+ }
395
+ /**
396
+ * Update an existing item
397
+ *
398
+ * @example
399
+ * ```typescript
400
+ * await items.update('product-uuid', {
401
+ * price: 24.99,
402
+ * status: 'published'
403
+ * });
404
+ * ```
405
+ */
406
+ async update(id, data) {
407
+ const response = await this.client.patch(
408
+ `/items/${this.collection}/${id}`,
409
+ data
410
+ );
411
+ return response.data;
412
+ }
413
+ /**
414
+ * Update multiple items at once
415
+ *
416
+ * @example
417
+ * ```typescript
418
+ * // Update by IDs with same data
419
+ * await items.updateMany(['id1', 'id2'], { status: 'archived' });
420
+ * ```
421
+ */
422
+ async updateMany(ids, data) {
423
+ const updates = ids.map((id) => ({ id, data }));
424
+ const response = await this.client.patch(
425
+ `/items/${this.collection}/bulk`,
426
+ updates
427
+ );
428
+ return response.data;
429
+ }
430
+ /**
431
+ * Upsert an item (create if not exists, update if exists)
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * const id = await items.upsert(
436
+ * { sku: 'WIDGET-001' },
437
+ * { name: 'Widget', price: 29.99, sku: 'WIDGET-001' }
438
+ * );
439
+ * ```
440
+ */
441
+ async upsert(filter, data) {
442
+ const existing = await this.find({ filter, limit: 1 });
443
+ if (existing.data.length > 0) {
444
+ return this.update(existing.data[0].id, data);
445
+ }
446
+ return this.create(data);
447
+ }
448
+ /**
449
+ * Delete an item by ID
450
+ *
451
+ * @example
452
+ * ```typescript
453
+ * await items.delete('product-uuid');
454
+ * ```
455
+ */
456
+ async delete(id) {
457
+ await this.client.delete(`/items/${this.collection}/${id}`);
458
+ }
459
+ /**
460
+ * Delete multiple items
461
+ *
462
+ * @example
463
+ * ```typescript
464
+ * await items.deleteMany(['id1', 'id2', 'id3']);
465
+ * ```
466
+ */
467
+ async deleteMany(ids) {
468
+ await this.client.delete(`/items/${this.collection}/bulk`, {
469
+ body: JSON.stringify(ids)
470
+ });
471
+ }
472
+ /**
473
+ * Soft delete an item (if paranoid mode is enabled)
474
+ *
475
+ * @example
476
+ * ```typescript
477
+ * await items.softDelete('product-uuid');
478
+ * ```
479
+ */
480
+ async softDelete(id) {
481
+ await this.update(id, { deletedAt: (/* @__PURE__ */ new Date()).toISOString() });
482
+ }
483
+ /**
484
+ * Restore a soft-deleted item
485
+ *
486
+ * @example
487
+ * ```typescript
488
+ * await items.restore('product-uuid');
489
+ * ```
490
+ */
491
+ async restore(id) {
492
+ await this.update(id, { deletedAt: null });
493
+ }
494
+ /**
495
+ * Aggregate data with grouping
496
+ *
497
+ * @example
498
+ * ```typescript
499
+ * const results = await items.aggregate({
500
+ * aggregate: {
501
+ * total: { function: 'sum', field: 'amount' },
502
+ * count: { function: 'count', field: 'id' },
503
+ * avgPrice: { function: 'avg', field: 'price' }
504
+ * },
505
+ * groupBy: ['category', 'status'],
506
+ * filter: { createdAt: { gte: '$NOW-DAYS_30' } }
507
+ * });
508
+ * ```
509
+ */
510
+ async aggregate(params) {
511
+ const response = await this.client.get(
512
+ `/items/${this.collection}`,
513
+ { params }
514
+ );
515
+ return response.data;
516
+ }
517
+ // ===================
518
+ // Import Operations
519
+ // ===================
520
+ /**
521
+ * Import items from a CSV file
522
+ *
523
+ * @example
524
+ * ```typescript
525
+ * // Browser
526
+ * const fileInput = document.querySelector('input[type="file"]');
527
+ * const file = fileInput.files[0];
528
+ *
529
+ * const result = await baasix.items('products').importCSV(file);
530
+ *
531
+ * console.log(`Imported ${result.imported} items`);
532
+ * ```
533
+ */
534
+ async importCSV(file) {
535
+ const formData = new FormData();
536
+ if (file instanceof File) {
537
+ formData.append("csvFile", file);
538
+ } else {
539
+ formData.append("csvFile", file);
540
+ }
541
+ const response = await this.client.post(
542
+ `/items/${this.collection}/import-csv`,
543
+ formData
544
+ );
545
+ return response.results;
546
+ }
547
+ /**
548
+ * Import items from a JSON file
549
+ *
550
+ * @example
551
+ * ```typescript
552
+ * const file = fileInput.files[0]; // JSON file
553
+ * const result = await baasix.items('products').importJSON(file);
554
+ *
555
+ * console.log(`Imported ${result.imported} items`);
556
+ * ```
557
+ */
558
+ async importJSON(file) {
559
+ const formData = new FormData();
560
+ if (file instanceof File) {
561
+ formData.append("jsonFile", file);
562
+ } else {
563
+ formData.append("jsonFile", file);
564
+ }
565
+ const response = await this.client.post(
566
+ `/items/${this.collection}/import-json`,
567
+ formData
568
+ );
569
+ return response.results;
570
+ }
571
+ /**
572
+ * Import items from an array of objects
573
+ *
574
+ * @example
575
+ * ```typescript
576
+ * const data = [
577
+ * { name: 'Product 1', price: 29.99 },
578
+ * { name: 'Product 2', price: 39.99 }
579
+ * ];
580
+ *
581
+ * const result = await baasix.items('products').importData(data);
582
+ * ```
583
+ */
584
+ async importData(data) {
585
+ const response = await this.client.post(
586
+ `/items/${this.collection}/bulk`,
587
+ data
588
+ );
589
+ return response;
590
+ }
591
+ // ===================
592
+ // Sort Operations
593
+ // ===================
594
+ /**
595
+ * Sort/reorder items (move item before or after another)
596
+ *
597
+ * @example
598
+ * ```typescript
599
+ * // Move item1 before item2
600
+ * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid');
601
+ *
602
+ * // Move item1 after item2
603
+ * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid', 'after');
604
+ * ```
605
+ */
606
+ async sortItem(itemId, targetItemId, mode = "before") {
607
+ await this.client.post(`/utils/sort/${this.collection}`, {
608
+ item: itemId,
609
+ to: targetItemId,
610
+ mode
611
+ });
612
+ }
613
+ /**
614
+ * Reorder multiple items
615
+ *
616
+ * @example
617
+ * ```typescript
618
+ * // Set explicit order
619
+ * await baasix.items('products').reorder([
620
+ * 'item3-uuid',
621
+ * 'item1-uuid',
622
+ * 'item2-uuid'
623
+ * ]);
624
+ * ```
625
+ */
626
+ async reorder(orderedIds) {
627
+ for (let i = 1; i < orderedIds.length; i++) {
628
+ await this.client.post(`/utils/sort/${this.collection}`, {
629
+ item: orderedIds[i],
630
+ to: orderedIds[i - 1],
631
+ mode: "after"
632
+ });
633
+ }
634
+ }
635
+ };
636
+
637
+ exports.ItemsModule = ItemsModule;
638
+ exports.QueryBuilder = QueryBuilder;
639
+ //# sourceMappingURL=items.cjs.map
640
+ //# sourceMappingURL=items.cjs.map
@@ -0,0 +1 @@
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 with same data\n * await items.updateMany(['id1', 'id2'], { status: 'archived' });\n * ```\n */\n async updateMany(ids: string[], data: Partial<T>): Promise<string[]> {\n // Transform to array format expected by API: [{id, data}, {id, data}, ...]\n const updates = ids.map(id => ({ id, data }));\n const response = await this.client.patch<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n updates\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 body: JSON.stringify(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"]}