bun-query-builder 0.2.51 → 0.2.52

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.
@@ -1,823 +1,2 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- function __accessProp(key) {
7
- return this[key];
8
- }
9
- var __toCommonJS = (from) => {
10
- var entry = (__moduleCache ??= new WeakMap).get(from), desc;
11
- if (entry)
12
- return entry;
13
- entry = __defProp({}, "__esModule", { value: true });
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (var key of __getOwnPropNames(from))
16
- if (!__hasOwnProp.call(entry, key))
17
- __defProp(entry, key, {
18
- get: __accessProp.bind(from, key),
19
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
20
- });
21
- }
22
- __moduleCache.set(from, entry);
23
- return entry;
24
- };
25
- var __moduleCache;
26
- var __returnValue = (v) => v;
27
- function __exportSetter(name, newValue) {
28
- this[name] = __returnValue.bind(null, newValue);
29
- }
30
- var __export = (target, all) => {
31
- for (var name in all)
32
- __defProp(target, name, {
33
- get: all[name],
34
- enumerable: true,
35
- configurable: true,
36
- set: __exportSetter.bind(all, name)
37
- });
38
- };
39
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
40
- var __require = import.meta.require;
41
-
42
- // src/browser.ts
43
- function configureBrowser(config) {
44
- browserConfig = { ...browserConfig, ...config };
45
- }
46
- function getBrowserConfig() {
47
- return browserConfig;
48
- }
49
- function isBrowser() {
50
- return typeof window !== "undefined" && typeof document !== "undefined";
51
- }
52
- async function getAuthToken() {
53
- if (browserConfig.getToken) {
54
- const token = browserConfig.getToken();
55
- return token instanceof Promise ? token : token;
56
- }
57
- if (typeof localStorage !== "undefined") {
58
- return localStorage.getItem("auth_token");
59
- }
60
- return null;
61
- }
62
- async function buildHeaders() {
63
- const headers = {
64
- "Content-Type": "application/json",
65
- Accept: "application/json",
66
- ...browserConfig.headers
67
- };
68
- const token = await getAuthToken();
69
- if (token) {
70
- headers["Authorization"] = `Bearer ${token}`;
71
- }
72
- return headers;
73
- }
74
- async function handleResponse(response) {
75
- if (response.status === 401) {
76
- browserConfig.onUnauthorized?.();
77
- throw new BrowserQueryError("Unauthorized", 401);
78
- }
79
- if (!response.ok) {
80
- const error = await response.json().catch(() => ({ message: "Request failed" }));
81
- throw new BrowserQueryError(error.message || `HTTP ${response.status}`, response.status);
82
- }
83
- const data = await response.json();
84
- if (browserConfig.transformResponse) {
85
- return browserConfig.transformResponse(data);
86
- }
87
- return data;
88
- }
89
-
90
- class BrowserQueryBuilder {
91
- state;
92
- constructor(table) {
93
- this.state = {
94
- table,
95
- wheres: [],
96
- orderBy: [],
97
- selectColumns: ["*"],
98
- withRelations: []
99
- };
100
- }
101
- select(...columns) {
102
- this.state.selectColumns = columns;
103
- return this;
104
- }
105
- where(column, operatorOrValue, value) {
106
- if (value === undefined) {
107
- this.state.wheres.push({
108
- column,
109
- operator: "=",
110
- value: operatorOrValue,
111
- boolean: "and"
112
- });
113
- } else {
114
- this.state.wheres.push({
115
- column,
116
- operator: operatorOrValue,
117
- value,
118
- boolean: "and"
119
- });
120
- }
121
- return this;
122
- }
123
- orWhere(column, operatorOrValue, value) {
124
- if (value === undefined) {
125
- this.state.wheres.push({
126
- column,
127
- operator: "=",
128
- value: operatorOrValue,
129
- boolean: "or"
130
- });
131
- } else {
132
- this.state.wheres.push({
133
- column,
134
- operator: operatorOrValue,
135
- value,
136
- boolean: "or"
137
- });
138
- }
139
- return this;
140
- }
141
- andWhere(column, operatorOrValue, value) {
142
- return value === undefined ? this.where(column, operatorOrValue) : this.where(column, operatorOrValue, value);
143
- }
144
- whereNull(column) {
145
- return this.where(column, "is", null);
146
- }
147
- whereNotNull(column) {
148
- return this.where(column, "is not", null);
149
- }
150
- whereIn(column, values) {
151
- return this.where(column, "in", values);
152
- }
153
- whereNotIn(column, values) {
154
- return this.where(column, "not in", values);
155
- }
156
- orderBy(column, direction = "asc") {
157
- this.state.orderBy.push({ column, direction });
158
- return this;
159
- }
160
- orderByDesc(column) {
161
- return this.orderBy(column, "desc");
162
- }
163
- latest(column = "created_at") {
164
- return this.orderBy(column, "desc");
165
- }
166
- oldest(column = "created_at") {
167
- return this.orderBy(column, "asc");
168
- }
169
- limit(count) {
170
- this.state.limitValue = count;
171
- return this;
172
- }
173
- offset(count) {
174
- this.state.offsetValue = count;
175
- return this;
176
- }
177
- skip(count) {
178
- return this.offset(count);
179
- }
180
- take(count) {
181
- return this.limit(count);
182
- }
183
- with(...relations) {
184
- this.state.withRelations.push(...relations);
185
- return this;
186
- }
187
- buildQueryParams() {
188
- const params = new URLSearchParams;
189
- for (const where of this.state.wheres) {
190
- if (where.operator === "=") {
191
- params.append(where.column, String(where.value));
192
- } else if (where.operator === "in" && Array.isArray(where.value)) {
193
- params.append(`${where.column}[]`, where.value.join(","));
194
- } else if (where.operator === "is" && where.value === null) {
195
- params.append(`filter[${where.column}][is]`, "null");
196
- } else if (where.operator === "is not" && where.value === null) {
197
- params.append(`filter[${where.column}][is_not]`, "null");
198
- } else {
199
- params.append(`filter[${where.column}][${where.operator}]`, String(where.value));
200
- }
201
- }
202
- if (this.state.orderBy.length > 0) {
203
- const orderStr = this.state.orderBy.map((o) => `${o.direction === "desc" ? "-" : ""}${o.column}`).join(",");
204
- params.append("sort", orderStr);
205
- }
206
- if (this.state.limitValue !== undefined) {
207
- params.append("limit", String(this.state.limitValue));
208
- }
209
- if (this.state.offsetValue !== undefined) {
210
- params.append("offset", String(this.state.offsetValue));
211
- }
212
- if (this.state.selectColumns.length > 0 && !this.state.selectColumns.includes("*")) {
213
- params.append("fields", this.state.selectColumns.join(","));
214
- }
215
- if (this.state.withRelations.length > 0) {
216
- params.append("include", this.state.withRelations.join(","));
217
- }
218
- return params;
219
- }
220
- buildUrl(path) {
221
- const base = `${browserConfig.baseUrl}/${this.state.table}`;
222
- if (path !== undefined) {
223
- return `${base}/${path}`;
224
- }
225
- const params = this.buildQueryParams();
226
- const queryString = params.toString();
227
- return queryString ? `${base}?${queryString}` : base;
228
- }
229
- async get() {
230
- const url = this.buildUrl();
231
- const response = await fetch(url, {
232
- method: "GET",
233
- headers: await buildHeaders()
234
- });
235
- const result = await handleResponse(response);
236
- return Array.isArray(result) ? result : result.data;
237
- }
238
- async first() {
239
- this.limit(1);
240
- const results = await this.get();
241
- return results[0] ?? null;
242
- }
243
- async firstOrFail() {
244
- const result = await this.first();
245
- if (!result) {
246
- throw new BrowserQueryError(`No ${this.state.table} found`, 404);
247
- }
248
- return result;
249
- }
250
- async find(id) {
251
- const url = this.buildUrl(id);
252
- try {
253
- const response = await fetch(url, {
254
- method: "GET",
255
- headers: await buildHeaders()
256
- });
257
- if (response.status === 404) {
258
- return null;
259
- }
260
- const result = await handleResponse(response);
261
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
262
- } catch {
263
- return null;
264
- }
265
- }
266
- async findOrFail(id) {
267
- const result = await this.find(id);
268
- if (!result) {
269
- throw new BrowserQueryError(`${this.state.table} with id ${id} not found`, 404);
270
- }
271
- return result;
272
- }
273
- async count() {
274
- const params = this.buildQueryParams();
275
- params.append("count", "true");
276
- const url = `${browserConfig.baseUrl}/${this.state.table}?${params.toString()}`;
277
- const response = await fetch(url, {
278
- method: "GET",
279
- headers: await buildHeaders()
280
- });
281
- const result = await handleResponse(response);
282
- return result.count;
283
- }
284
- async exists() {
285
- const count = await this.count();
286
- return count > 0;
287
- }
288
- async create(data) {
289
- const url = `${browserConfig.baseUrl}/${this.state.table}`;
290
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
291
- const response = await fetch(url, {
292
- method: "POST",
293
- headers: await buildHeaders(),
294
- body: JSON.stringify(body)
295
- });
296
- const result = await handleResponse(response);
297
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
298
- }
299
- async insert(data) {
300
- return this.create(data);
301
- }
302
- async update(id, data) {
303
- const url = `${browserConfig.baseUrl}/${this.state.table}/${id}`;
304
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
305
- const response = await fetch(url, {
306
- method: "PATCH",
307
- headers: await buildHeaders(),
308
- body: JSON.stringify(body)
309
- });
310
- const result = await handleResponse(response);
311
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
312
- }
313
- async delete(id) {
314
- const url = `${browserConfig.baseUrl}/${this.state.table}/${id}`;
315
- const response = await fetch(url, {
316
- method: "DELETE",
317
- headers: await buildHeaders()
318
- });
319
- return response.ok;
320
- }
321
- async destroy(id) {
322
- return this.delete(id);
323
- }
324
- async paginate(page = 1, perPage = 15) {
325
- this.limit(perPage).offset((page - 1) * perPage);
326
- const params = this.buildQueryParams();
327
- params.append("paginate", "true");
328
- const url = `${browserConfig.baseUrl}/${this.state.table}?${params.toString()}`;
329
- const response = await fetch(url, {
330
- method: "GET",
331
- headers: await buildHeaders()
332
- });
333
- return handleResponse(response);
334
- }
335
- toState() {
336
- return { ...this.state };
337
- }
338
- }
339
- function browserQuery(table) {
340
- return new BrowserQueryBuilder(table);
341
- }
342
- function createBrowserDb() {
343
- return new Proxy({}, {
344
- get: (_target, prop) => {
345
- return () => browserQuery(prop);
346
- }
347
- });
348
- }
349
-
350
- class BrowserModelInstance {
351
- _attributes;
352
- _definition;
353
- constructor(definition, attributes = {}) {
354
- this._definition = definition;
355
- this._attributes = { ...attributes };
356
- }
357
- get(key) {
358
- return this._attributes[key];
359
- }
360
- set(key, value) {
361
- this._attributes[key] = value;
362
- }
363
- get attributes() {
364
- return { ...this._attributes };
365
- }
366
- get id() {
367
- const pk = this._definition.primaryKey || "id";
368
- return this._attributes[pk];
369
- }
370
- toJSON() {
371
- const hidden = new Set;
372
- for (const [key, attr] of Object.entries(this._definition.attributes)) {
373
- if (attr.hidden)
374
- hidden.add(key);
375
- }
376
- const json = {};
377
- for (const [key, value] of Object.entries(this._attributes)) {
378
- if (!hidden.has(key))
379
- json[key] = value;
380
- }
381
- return json;
382
- }
383
- }
384
-
385
- class BrowserModelQueryBuilder {
386
- _definition;
387
- _wheres = [];
388
- _orderBy = [];
389
- _limit;
390
- _offset;
391
- _select = ["*"];
392
- _withRelations = [];
393
- constructor(definition) {
394
- this._definition = definition;
395
- }
396
- getTablePath() {
397
- return typeof this._definition.traits?.useApi === "object" && this._definition.traits.useApi?.uri || this._definition.table;
398
- }
399
- where(column, operatorOrValue, value) {
400
- if (value === undefined) {
401
- this._wheres.push({ column, operator: "=", value: operatorOrValue, boolean: "and" });
402
- } else {
403
- this._wheres.push({ column, operator: operatorOrValue, value, boolean: "and" });
404
- }
405
- return this;
406
- }
407
- orWhere(column, operatorOrValue, value) {
408
- if (value === undefined) {
409
- this._wheres.push({ column, operator: "=", value: operatorOrValue, boolean: "or" });
410
- } else {
411
- this._wheres.push({ column, operator: operatorOrValue, value, boolean: "or" });
412
- }
413
- return this;
414
- }
415
- whereIn(column, values) {
416
- this._wheres.push({ column, operator: "in", value: values, boolean: "and" });
417
- return this;
418
- }
419
- whereNotIn(column, values) {
420
- this._wheres.push({ column, operator: "not in", value: values, boolean: "and" });
421
- return this;
422
- }
423
- whereNull(column) {
424
- this._wheres.push({ column, operator: "is", value: null, boolean: "and" });
425
- return this;
426
- }
427
- whereNotNull(column) {
428
- this._wheres.push({ column, operator: "is not", value: null, boolean: "and" });
429
- return this;
430
- }
431
- whereLike(column, pattern) {
432
- this._wheres.push({ column, operator: "like", value: pattern, boolean: "and" });
433
- return this;
434
- }
435
- orderBy(column, direction = "asc") {
436
- this._orderBy.push({ column, direction });
437
- return this;
438
- }
439
- orderByDesc(column) {
440
- return this.orderBy(column, "desc");
441
- }
442
- orderByAsc(column) {
443
- return this.orderBy(column, "asc");
444
- }
445
- limit(count) {
446
- this._limit = count;
447
- return this;
448
- }
449
- take(count) {
450
- return this.limit(count);
451
- }
452
- offset(count) {
453
- this._offset = count;
454
- return this;
455
- }
456
- skip(count) {
457
- return this.offset(count);
458
- }
459
- select(...columns) {
460
- this._select = columns;
461
- return this;
462
- }
463
- with(...relations) {
464
- this._withRelations.push(...relations);
465
- return this;
466
- }
467
- latest(column = "created_at") {
468
- return this.orderByDesc(column);
469
- }
470
- oldest(column = "created_at") {
471
- return this.orderByAsc(column);
472
- }
473
- buildQueryParams() {
474
- const params = new URLSearchParams;
475
- for (const where of this._wheres) {
476
- if (where.operator === "=") {
477
- params.append(where.column, String(where.value));
478
- } else if (where.operator === "in" && Array.isArray(where.value)) {
479
- params.append(`${where.column}[]`, where.value.join(","));
480
- } else if (where.operator === "is" && where.value === null) {
481
- params.append(`filter[${where.column}][is]`, "null");
482
- } else if (where.operator === "is not" && where.value === null) {
483
- params.append(`filter[${where.column}][is_not]`, "null");
484
- } else {
485
- params.append(`filter[${where.column}][${where.operator}]`, String(where.value));
486
- }
487
- }
488
- if (this._orderBy.length > 0) {
489
- const orderStr = this._orderBy.map((o) => `${o.direction === "desc" ? "-" : ""}${o.column}`).join(",");
490
- params.append("sort", orderStr);
491
- }
492
- if (this._limit !== undefined)
493
- params.append("limit", String(this._limit));
494
- if (this._offset !== undefined)
495
- params.append("offset", String(this._offset));
496
- if (this._select.length > 0 && !this._select.includes("*")) {
497
- params.append("fields", this._select.join(","));
498
- }
499
- if (this._withRelations.length > 0) {
500
- params.append("include", this._withRelations.join(","));
501
- }
502
- return params;
503
- }
504
- buildUrl(path) {
505
- const base = `${browserConfig.baseUrl}/${this.getTablePath()}`;
506
- if (path !== undefined)
507
- return `${base}/${path}`;
508
- const params = this.buildQueryParams();
509
- const queryString = params.toString();
510
- return queryString ? `${base}?${queryString}` : base;
511
- }
512
- async get() {
513
- const url = this.buildUrl();
514
- const response = await fetch(url, {
515
- method: "GET",
516
- headers: await buildHeaders()
517
- });
518
- const result = await handleResponse(response);
519
- const rows = Array.isArray(result) ? result : result.data;
520
- return rows.map((row) => new BrowserModelInstance(this._definition, row));
521
- }
522
- async first() {
523
- this._limit = 1;
524
- const results = await this.get();
525
- return results[0] ?? null;
526
- }
527
- async firstOrFail() {
528
- const result = await this.first();
529
- if (!result)
530
- throw new BrowserQueryError(`No ${this._definition.name} found`, 404);
531
- return result;
532
- }
533
- async find(id) {
534
- const url = this.buildUrl(id);
535
- try {
536
- const response = await fetch(url, {
537
- method: "GET",
538
- headers: await buildHeaders()
539
- });
540
- if (response.status === 404)
541
- return null;
542
- const result = await handleResponse(response);
543
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
544
- return new BrowserModelInstance(this._definition, row);
545
- } catch {
546
- return null;
547
- }
548
- }
549
- async findOrFail(id) {
550
- const result = await this.find(id);
551
- if (!result)
552
- throw new BrowserQueryError(`${this._definition.name} with id ${id} not found`, 404);
553
- return result;
554
- }
555
- async count() {
556
- const params = this.buildQueryParams();
557
- params.append("count", "true");
558
- const url = `${browserConfig.baseUrl}/${this.getTablePath()}?${params.toString()}`;
559
- const response = await fetch(url, {
560
- method: "GET",
561
- headers: await buildHeaders()
562
- });
563
- const result = await handleResponse(response);
564
- return result.count;
565
- }
566
- async exists() {
567
- const count = await this.count();
568
- return count > 0;
569
- }
570
- async pluck(column) {
571
- this._select = [column];
572
- const results = await this.get();
573
- return results.map((r) => r.get(column));
574
- }
575
- async paginate(page = 1, perPage = 15) {
576
- this._limit = perPage;
577
- this._offset = (page - 1) * perPage;
578
- const params = this.buildQueryParams();
579
- params.append("paginate", "true");
580
- const url = `${browserConfig.baseUrl}/${this.getTablePath()}?${params.toString()}`;
581
- const response = await fetch(url, {
582
- method: "GET",
583
- headers: await buildHeaders()
584
- });
585
- const result = await handleResponse(response);
586
- return {
587
- ...result,
588
- data: result.data.map((row) => new BrowserModelInstance(this._definition, row))
589
- };
590
- }
591
- }
592
- function createBrowserModel(definition) {
593
- const model = {
594
- query: () => new BrowserModelQueryBuilder(definition),
595
- where(column, operatorOrValue, value) {
596
- return new BrowserModelQueryBuilder(definition).where(column, operatorOrValue, value);
597
- },
598
- orWhere(column, operatorOrValue, value) {
599
- return new BrowserModelQueryBuilder(definition).orWhere(column, operatorOrValue, value);
600
- },
601
- whereIn(column, values) {
602
- return new BrowserModelQueryBuilder(definition).whereIn(column, values);
603
- },
604
- whereNotIn(column, values) {
605
- return new BrowserModelQueryBuilder(definition).whereNotIn(column, values);
606
- },
607
- whereNull(column) {
608
- return new BrowserModelQueryBuilder(definition).whereNull(column);
609
- },
610
- whereNotNull(column) {
611
- return new BrowserModelQueryBuilder(definition).whereNotNull(column);
612
- },
613
- whereLike(column, pattern) {
614
- return new BrowserModelQueryBuilder(definition).whereLike(column, pattern);
615
- },
616
- orderBy(column, direction = "asc") {
617
- return new BrowserModelQueryBuilder(definition).orderBy(column, direction);
618
- },
619
- orderByDesc(column) {
620
- return new BrowserModelQueryBuilder(definition).orderByDesc(column);
621
- },
622
- select(...columns) {
623
- return new BrowserModelQueryBuilder(definition).select(...columns);
624
- },
625
- limit: (count) => new BrowserModelQueryBuilder(definition).limit(count),
626
- take: (count) => new BrowserModelQueryBuilder(definition).take(count),
627
- skip: (count) => new BrowserModelQueryBuilder(definition).skip(count),
628
- latest: (column = "created_at") => new BrowserModelQueryBuilder(definition).latest(column),
629
- oldest: (column = "created_at") => new BrowserModelQueryBuilder(definition).oldest(column),
630
- async find(id) {
631
- return new BrowserModelQueryBuilder(definition).find(id);
632
- },
633
- async findOrFail(id) {
634
- return new BrowserModelQueryBuilder(definition).findOrFail(id);
635
- },
636
- async all() {
637
- return new BrowserModelQueryBuilder(definition).get();
638
- },
639
- async first() {
640
- return new BrowserModelQueryBuilder(definition).first();
641
- },
642
- async firstOrFail() {
643
- return new BrowserModelQueryBuilder(definition).firstOrFail();
644
- },
645
- async count() {
646
- return new BrowserModelQueryBuilder(definition).count();
647
- },
648
- async exists() {
649
- return new BrowserModelQueryBuilder(definition).exists();
650
- },
651
- async paginate(page, perPage) {
652
- return new BrowserModelQueryBuilder(definition).paginate(page, perPage);
653
- },
654
- async pluck(column) {
655
- return new BrowserModelQueryBuilder(definition).pluck(column);
656
- },
657
- async create(data) {
658
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
659
- const url = `${browserConfig.baseUrl}/${tablePath}`;
660
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
661
- const response = await fetch(url, {
662
- method: "POST",
663
- headers: await buildHeaders(),
664
- body: JSON.stringify(body)
665
- });
666
- const result = await handleResponse(response);
667
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
668
- return new BrowserModelInstance(definition, row);
669
- },
670
- async update(id, data) {
671
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
672
- const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
673
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
674
- const response = await fetch(url, {
675
- method: "PATCH",
676
- headers: await buildHeaders(),
677
- body: JSON.stringify(body)
678
- });
679
- const result = await handleResponse(response);
680
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
681
- return new BrowserModelInstance(definition, row);
682
- },
683
- async delete(id) {
684
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
685
- const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
686
- const response = await fetch(url, {
687
- method: "DELETE",
688
- headers: await buildHeaders()
689
- });
690
- return response.ok;
691
- },
692
- async destroy(id) {
693
- return this.delete(id);
694
- },
695
- getDefinition: () => definition,
696
- getTable: () => definition.table
697
- };
698
- return new Proxy(model, {
699
- get(target, prop) {
700
- if (typeof prop === "string" && prop.startsWith("where") && prop.length > 5) {
701
- const columnPascal = prop.slice(5);
702
- const column = columnPascal.charAt(0).toLowerCase() + columnPascal.slice(1);
703
- if (column in definition.attributes || column === "id" || column === definition.primaryKey) {
704
- return (value) => new BrowserModelQueryBuilder(definition).where(column, value);
705
- }
706
- }
707
- return Reflect.get(target, prop);
708
- }
709
- });
710
- }
711
- var browserConfig, BrowserQueryError, browserAuth, browser_default;
712
- var init_browser = __esm(() => {
713
- browserConfig = {
714
- baseUrl: ""
715
- };
716
- BrowserQueryError = class BrowserQueryError extends Error {
717
- status;
718
- constructor(message, status) {
719
- super(message);
720
- this.name = "BrowserQueryError";
721
- this.status = status;
722
- }
723
- };
724
- browserAuth = {
725
- async login(credentials) {
726
- const response = await fetch(`${browserConfig.baseUrl}/login`, {
727
- method: "POST",
728
- headers: {
729
- "Content-Type": "application/json",
730
- Accept: "application/json",
731
- ...browserConfig.headers
732
- },
733
- body: JSON.stringify(credentials)
734
- });
735
- if (!response.ok) {
736
- const error = await response.json().catch(() => ({ message: "Login failed" }));
737
- throw new BrowserQueryError(error.message || "Login failed", response.status);
738
- }
739
- const rawData = await response.json();
740
- const data = rawData.data || rawData;
741
- if (typeof localStorage !== "undefined" && data.token) {
742
- localStorage.setItem("auth_token", data.token);
743
- }
744
- return data;
745
- },
746
- async register(data) {
747
- const response = await fetch(`${browserConfig.baseUrl}/register`, {
748
- method: "POST",
749
- headers: {
750
- "Content-Type": "application/json",
751
- Accept: "application/json",
752
- ...browserConfig.headers
753
- },
754
- body: JSON.stringify(data)
755
- });
756
- if (!response.ok) {
757
- const error = await response.json().catch(() => ({ message: "Registration failed" }));
758
- throw new BrowserQueryError(error.message || "Registration failed", response.status);
759
- }
760
- const rawResult = await response.json();
761
- const result = rawResult.data || rawResult;
762
- if (typeof localStorage !== "undefined" && result.token) {
763
- localStorage.setItem("auth_token", result.token);
764
- }
765
- return result;
766
- },
767
- async logout() {
768
- const token = await getAuthToken();
769
- if (token) {
770
- try {
771
- await fetch(`${browserConfig.baseUrl}/logout`, {
772
- method: "POST",
773
- headers: await buildHeaders()
774
- });
775
- } catch {}
776
- }
777
- if (typeof localStorage !== "undefined") {
778
- localStorage.removeItem("auth_token");
779
- }
780
- },
781
- async user() {
782
- const token = await getAuthToken();
783
- if (!token)
784
- return null;
785
- try {
786
- const response = await fetch(`${browserConfig.baseUrl}/user`, {
787
- method: "GET",
788
- headers: await buildHeaders()
789
- });
790
- if (response.status === 401) {
791
- browserConfig.onUnauthorized?.();
792
- return null;
793
- }
794
- if (!response.ok)
795
- return null;
796
- const data = await response.json();
797
- return data.user || data;
798
- } catch {
799
- return null;
800
- }
801
- },
802
- async check() {
803
- const user = await this.user();
804
- return user !== null;
805
- },
806
- getToken: getAuthToken
807
- };
808
- browser_default = browserQuery;
809
- });
810
- init_browser();
811
-
812
- export {
813
- isBrowser,
814
- getBrowserConfig,
815
- browser_default as default,
816
- createBrowserModel,
817
- createBrowserDb,
818
- configureBrowser,
819
- browserQuery,
820
- browserAuth,
821
- BrowserQueryError,
822
- BrowserQueryBuilder
823
- };
2
+ var{defineProperty:x,getOwnPropertyNames:I,getOwnPropertyDescriptor:R}=Object,P=Object.prototype.hasOwnProperty;function H(z){return this[z]}var C=(z)=>{var F=(q??=new WeakMap).get(z),G;if(F)return F;if(F=x({},"__esModule",{value:!0}),z&&typeof z==="object"||typeof z==="function"){for(var J of I(z))if(!P.call(F,J))x(F,J,{get:H.bind(z,J),enumerable:!(G=R(z,J))||G.enumerable})}return q.set(z,F),F},q;var k=(z)=>z;function E(z,F){this[z]=k.bind(null,F)}var v=(z,F)=>{for(var G in F)x(z,G,{get:F[G],enumerable:!0,configurable:!0,set:E.bind(F,G)})};var O=(z,F)=>()=>(z&&(F=z(z=0)),F);var M=import.meta.require;function g(z){K={...K,...z}}function Q(){return K}function b(){return typeof window<"u"&&typeof document<"u"}async function D(){if(K.getToken){let z=K.getToken();return z instanceof Promise?z:z}if(typeof localStorage<"u")return localStorage.getItem("auth_token");return null}async function W(){let z={"Content-Type":"application/json",Accept:"application/json",...K.headers},F=await D();if(F)z.Authorization=`Bearer ${F}`;return z}async function X(z){if(z.status===401)throw K.onUnauthorized?.(),new Y("Unauthorized",401);if(!z.ok){let G=await z.json().catch(()=>({message:"Request failed"}));throw new Y(G.message||`HTTP ${z.status}`,z.status)}let F=await z.json();if(K.transformResponse)return K.transformResponse(F);return F}class A{state;constructor(z){this.state={table:z,wheres:[],orderBy:[],selectColumns:["*"],withRelations:[]}}select(...z){return this.state.selectColumns=z,this}where(z,F,G){if(G===void 0)this.state.wheres.push({column:z,operator:"=",value:F,boolean:"and"});else this.state.wheres.push({column:z,operator:F,value:G,boolean:"and"});return this}orWhere(z,F,G){if(G===void 0)this.state.wheres.push({column:z,operator:"=",value:F,boolean:"or"});else this.state.wheres.push({column:z,operator:F,value:G,boolean:"or"});return this}andWhere(z,F,G){return G===void 0?this.where(z,F):this.where(z,F,G)}whereNull(z){return this.where(z,"is",null)}whereNotNull(z){return this.where(z,"is not",null)}whereIn(z,F){return this.where(z,"in",F)}whereNotIn(z,F){return this.where(z,"not in",F)}orderBy(z,F="asc"){return this.state.orderBy.push({column:z,direction:F}),this}orderByDesc(z){return this.orderBy(z,"desc")}latest(z="created_at"){return this.orderBy(z,"desc")}oldest(z="created_at"){return this.orderBy(z,"asc")}limit(z){return this.state.limitValue=z,this}offset(z){return this.state.offsetValue=z,this}skip(z){return this.offset(z)}take(z){return this.limit(z)}with(...z){return this.state.withRelations.push(...z),this}buildQueryParams(){let z=new URLSearchParams;for(let F of this.state.wheres)if(F.operator==="=")z.append(F.column,String(F.value));else if(F.operator==="in"&&Array.isArray(F.value))z.append(`${F.column}[]`,F.value.join(","));else if(F.operator==="is"&&F.value===null)z.append(`filter[${F.column}][is]`,"null");else if(F.operator==="is not"&&F.value===null)z.append(`filter[${F.column}][is_not]`,"null");else z.append(`filter[${F.column}][${F.operator}]`,String(F.value));if(this.state.orderBy.length>0){let F=this.state.orderBy.map((G)=>`${G.direction==="desc"?"-":""}${G.column}`).join(",");z.append("sort",F)}if(this.state.limitValue!==void 0)z.append("limit",String(this.state.limitValue));if(this.state.offsetValue!==void 0)z.append("offset",String(this.state.offsetValue));if(this.state.selectColumns.length>0&&!this.state.selectColumns.includes("*"))z.append("fields",this.state.selectColumns.join(","));if(this.state.withRelations.length>0)z.append("include",this.state.withRelations.join(","));return z}buildUrl(z){let F=`${K.baseUrl}/${this.state.table}`;if(z!==void 0)return`${F}/${z}`;let J=this.buildQueryParams().toString();return J?`${F}?${J}`:F}async get(){let z=this.buildUrl(),F=await fetch(z,{method:"GET",headers:await W()}),G=await X(F);return Array.isArray(G)?G:G.data}async first(){return this.limit(1),(await this.get())[0]??null}async firstOrFail(){let z=await this.first();if(!z)throw new Y(`No ${this.state.table} found`,404);return z}async find(z){let F=this.buildUrl(z);try{let G=await fetch(F,{method:"GET",headers:await W()});if(G.status===404)return null;let J=await X(G);return"data"in J&&!Array.isArray(J.data)?J.data:J}catch{return null}}async findOrFail(z){let F=await this.find(z);if(!F)throw new Y(`${this.state.table} with id ${z} not found`,404);return F}async count(){let z=this.buildQueryParams();z.append("count","true");let F=`${K.baseUrl}/${this.state.table}?${z.toString()}`,G=await fetch(F,{method:"GET",headers:await W()});return(await X(G)).count}async exists(){return await this.count()>0}async create(z){let F=`${K.baseUrl}/${this.state.table}`,G=K.transformRequest?K.transformRequest(z):z,J=await fetch(F,{method:"POST",headers:await W(),body:JSON.stringify(G)}),L=await X(J);return"data"in L&&!Array.isArray(L.data)?L.data:L}async insert(z){return this.create(z)}async update(z,F){let G=`${K.baseUrl}/${this.state.table}/${z}`,J=K.transformRequest?K.transformRequest(F):F,L=await fetch(G,{method:"PATCH",headers:await W(),body:JSON.stringify(J)}),U=await X(L);return"data"in U&&!Array.isArray(U.data)?U.data:U}async delete(z){let F=`${K.baseUrl}/${this.state.table}/${z}`;return(await fetch(F,{method:"DELETE",headers:await W()})).ok}async destroy(z){return this.delete(z)}async paginate(z=1,F=15){this.limit(F).offset((z-1)*F);let G=this.buildQueryParams();G.append("paginate","true");let J=`${K.baseUrl}/${this.state.table}?${G.toString()}`,L=await fetch(J,{method:"GET",headers:await W()});return X(L)}toState(){return{...this.state}}}function T(z){return new A(z)}function y(){return new Proxy({},{get:(z,F)=>{return()=>T(F)}})}class j{_attributes;_definition;constructor(z,F={}){this._definition=z,this._attributes={...F}}get(z){return this._attributes[z]}set(z,F){this._attributes[z]=F}get attributes(){return{...this._attributes}}get id(){let z=this._definition.primaryKey||"id";return this._attributes[z]}toJSON(){let z=new Set;for(let[G,J]of Object.entries(this._definition.attributes))if(J.hidden)z.add(G);let F={};for(let[G,J]of Object.entries(this._attributes))if(!z.has(G))F[G]=J;return F}}class N{_definition;_wheres=[];_orderBy=[];_limit;_offset;_select=["*"];_withRelations=[];constructor(z){this._definition=z}getTablePath(){return typeof this._definition.traits?.useApi==="object"&&this._definition.traits.useApi?.uri||this._definition.table}where(z,F,G){if(G===void 0)this._wheres.push({column:z,operator:"=",value:F,boolean:"and"});else this._wheres.push({column:z,operator:F,value:G,boolean:"and"});return this}orWhere(z,F,G){if(G===void 0)this._wheres.push({column:z,operator:"=",value:F,boolean:"or"});else this._wheres.push({column:z,operator:F,value:G,boolean:"or"});return this}whereIn(z,F){return this._wheres.push({column:z,operator:"in",value:F,boolean:"and"}),this}whereNotIn(z,F){return this._wheres.push({column:z,operator:"not in",value:F,boolean:"and"}),this}whereNull(z){return this._wheres.push({column:z,operator:"is",value:null,boolean:"and"}),this}whereNotNull(z){return this._wheres.push({column:z,operator:"is not",value:null,boolean:"and"}),this}whereLike(z,F){return this._wheres.push({column:z,operator:"like",value:F,boolean:"and"}),this}orderBy(z,F="asc"){return this._orderBy.push({column:z,direction:F}),this}orderByDesc(z){return this.orderBy(z,"desc")}orderByAsc(z){return this.orderBy(z,"asc")}limit(z){return this._limit=z,this}take(z){return this.limit(z)}offset(z){return this._offset=z,this}skip(z){return this.offset(z)}select(...z){return this._select=z,this}with(...z){return this._withRelations.push(...z),this}latest(z="created_at"){return this.orderByDesc(z)}oldest(z="created_at"){return this.orderByAsc(z)}buildQueryParams(){let z=new URLSearchParams;for(let F of this._wheres)if(F.operator==="=")z.append(F.column,String(F.value));else if(F.operator==="in"&&Array.isArray(F.value))z.append(`${F.column}[]`,F.value.join(","));else if(F.operator==="is"&&F.value===null)z.append(`filter[${F.column}][is]`,"null");else if(F.operator==="is not"&&F.value===null)z.append(`filter[${F.column}][is_not]`,"null");else z.append(`filter[${F.column}][${F.operator}]`,String(F.value));if(this._orderBy.length>0){let F=this._orderBy.map((G)=>`${G.direction==="desc"?"-":""}${G.column}`).join(",");z.append("sort",F)}if(this._limit!==void 0)z.append("limit",String(this._limit));if(this._offset!==void 0)z.append("offset",String(this._offset));if(this._select.length>0&&!this._select.includes("*"))z.append("fields",this._select.join(","));if(this._withRelations.length>0)z.append("include",this._withRelations.join(","));return z}buildUrl(z){let F=`${K.baseUrl}/${this.getTablePath()}`;if(z!==void 0)return`${F}/${z}`;let J=this.buildQueryParams().toString();return J?`${F}?${J}`:F}async get(){let z=this.buildUrl(),F=await fetch(z,{method:"GET",headers:await W()}),G=await X(F);return(Array.isArray(G)?G:G.data).map((L)=>new j(this._definition,L))}async first(){return this._limit=1,(await this.get())[0]??null}async firstOrFail(){let z=await this.first();if(!z)throw new Y(`No ${this._definition.name} found`,404);return z}async find(z){let F=this.buildUrl(z);try{let G=await fetch(F,{method:"GET",headers:await W()});if(G.status===404)return null;let J=await X(G),L="data"in J&&!Array.isArray(J.data)?J.data:J;return new j(this._definition,L)}catch{return null}}async findOrFail(z){let F=await this.find(z);if(!F)throw new Y(`${this._definition.name} with id ${z} not found`,404);return F}async count(){let z=this.buildQueryParams();z.append("count","true");let F=`${K.baseUrl}/${this.getTablePath()}?${z.toString()}`,G=await fetch(F,{method:"GET",headers:await W()});return(await X(G)).count}async exists(){return await this.count()>0}async pluck(z){return this._select=[z],(await this.get()).map((G)=>G.get(z))}async paginate(z=1,F=15){this._limit=F,this._offset=(z-1)*F;let G=this.buildQueryParams();G.append("paginate","true");let J=`${K.baseUrl}/${this.getTablePath()}?${G.toString()}`,L=await fetch(J,{method:"GET",headers:await W()}),U=await X(L);return{...U,data:U.data.map((Z)=>new j(this._definition,Z))}}}function f(z){return new Proxy({query:()=>new N(z),where(G,J,L){return new N(z).where(G,J,L)},orWhere(G,J,L){return new N(z).orWhere(G,J,L)},whereIn(G,J){return new N(z).whereIn(G,J)},whereNotIn(G,J){return new N(z).whereNotIn(G,J)},whereNull(G){return new N(z).whereNull(G)},whereNotNull(G){return new N(z).whereNotNull(G)},whereLike(G,J){return new N(z).whereLike(G,J)},orderBy(G,J="asc"){return new N(z).orderBy(G,J)},orderByDesc(G){return new N(z).orderByDesc(G)},select(...G){return new N(z).select(...G)},limit:(G)=>new N(z).limit(G),take:(G)=>new N(z).take(G),skip:(G)=>new N(z).skip(G),latest:(G="created_at")=>new N(z).latest(G),oldest:(G="created_at")=>new N(z).oldest(G),async find(G){return new N(z).find(G)},async findOrFail(G){return new N(z).findOrFail(G)},async all(){return new N(z).get()},async first(){return new N(z).first()},async firstOrFail(){return new N(z).firstOrFail()},async count(){return new N(z).count()},async exists(){return new N(z).exists()},async paginate(G,J){return new N(z).paginate(G,J)},async pluck(G){return new N(z).pluck(G)},async create(G){let J=typeof z.traits?.useApi==="object"&&z.traits.useApi?.uri||z.table,L=`${K.baseUrl}/${J}`,U=K.transformRequest?K.transformRequest(G):G,Z=await fetch(L,{method:"POST",headers:await W(),body:JSON.stringify(U)}),_=await X(Z),$="data"in _&&!Array.isArray(_.data)?_.data:_;return new j(z,$)},async update(G,J){let L=typeof z.traits?.useApi==="object"&&z.traits.useApi?.uri||z.table,U=`${K.baseUrl}/${L}/${G}`,Z=K.transformRequest?K.transformRequest(J):J,_=await fetch(U,{method:"PATCH",headers:await W(),body:JSON.stringify(Z)}),$=await X(_),S="data"in $&&!Array.isArray($.data)?$.data:$;return new j(z,S)},async delete(G){let J=typeof z.traits?.useApi==="object"&&z.traits.useApi?.uri||z.table,L=`${K.baseUrl}/${J}/${G}`;return(await fetch(L,{method:"DELETE",headers:await W()})).ok},async destroy(G){return this.delete(G)},getDefinition:()=>z,getTable:()=>z.table},{get(G,J){if(typeof J==="string"&&J.startsWith("where")&&J.length>5){let L=J.slice(5),U=L.charAt(0).toLowerCase()+L.slice(1);if(U in z.attributes||U==="id"||U===z.primaryKey)return(Z)=>new N(z).where(U,Z)}return Reflect.get(G,J)}})}var K,Y,m,c;var V=O(()=>{K={baseUrl:""};Y=class Y extends Error{status;constructor(z,F){super(z);this.name="BrowserQueryError",this.status=F}};m={async login(z){let F=await fetch(`${K.baseUrl}/login`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...K.headers},body:JSON.stringify(z)});if(!F.ok){let L=await F.json().catch(()=>({message:"Login failed"}));throw new Y(L.message||"Login failed",F.status)}let G=await F.json(),J=G.data||G;if(typeof localStorage<"u"&&J.token)localStorage.setItem("auth_token",J.token);return J},async register(z){let F=await fetch(`${K.baseUrl}/register`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...K.headers},body:JSON.stringify(z)});if(!F.ok){let L=await F.json().catch(()=>({message:"Registration failed"}));throw new Y(L.message||"Registration failed",F.status)}let G=await F.json(),J=G.data||G;if(typeof localStorage<"u"&&J.token)localStorage.setItem("auth_token",J.token);return J},async logout(){if(await D())try{await fetch(`${K.baseUrl}/logout`,{method:"POST",headers:await W()})}catch{}if(typeof localStorage<"u")localStorage.removeItem("auth_token")},async user(){if(!await D())return null;try{let F=await fetch(`${K.baseUrl}/user`,{method:"GET",headers:await W()});if(F.status===401)return K.onUnauthorized?.(),null;if(!F.ok)return null;let G=await F.json();return G.user||G}catch{return null}},async check(){return await this.user()!==null},getToken:D},c=T});V();export{b as isBrowser,Q as getBrowserConfig,c as default,f as createBrowserModel,y as createBrowserDb,g as configureBrowser,T as browserQuery,m as browserAuth,Y as BrowserQueryError,A as BrowserQueryBuilder};