@stacksjs/browser 0.70.56 → 0.70.58

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 (2) hide show
  1. package/dist/index.js +66 -1053
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -13,779 +13,18 @@ var __export = (target, all) => {
13
13
  });
14
14
  };
15
15
 
16
- // ../../../../node_modules/bun-query-builder/dist/src/browser.js
17
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
- function configureBrowser(config) {
19
- browserConfig = { ...browserConfig, ...config };
20
- }
21
- function getBrowserConfig() {
22
- return browserConfig;
23
- }
24
- function isBrowser() {
25
- return typeof window !== "undefined" && typeof document !== "undefined";
26
- }
27
- async function getAuthToken() {
28
- if (browserConfig.getToken) {
29
- const token = browserConfig.getToken();
30
- return token instanceof Promise ? token : token;
31
- }
32
- if (typeof localStorage !== "undefined") {
33
- return localStorage.getItem("auth_token");
34
- }
35
- return null;
36
- }
37
- async function buildHeaders() {
38
- const headers = {
39
- "Content-Type": "application/json",
40
- Accept: "application/json",
41
- ...browserConfig.headers
42
- };
43
- const token = await getAuthToken();
44
- if (token) {
45
- headers["Authorization"] = `Bearer ${token}`;
46
- }
47
- return headers;
48
- }
49
- async function handleResponse(response) {
50
- if (response.status === 401) {
51
- browserConfig.onUnauthorized?.();
52
- throw new BrowserQueryError("Unauthorized", 401);
53
- }
54
- if (!response.ok) {
55
- const error = await response.json().catch(() => ({ message: "Request failed" }));
56
- throw new BrowserQueryError(error.message || `HTTP ${response.status}`, response.status);
57
- }
58
- const data = await response.json();
59
- if (browserConfig.transformResponse) {
60
- return browserConfig.transformResponse(data);
61
- }
62
- return data;
63
- }
64
-
65
- class BrowserQueryBuilder {
66
- state;
67
- constructor(table) {
68
- this.state = {
69
- table,
70
- wheres: [],
71
- orderBy: [],
72
- selectColumns: ["*"],
73
- withRelations: []
74
- };
75
- }
76
- select(...columns) {
77
- this.state.selectColumns = columns;
78
- return this;
79
- }
80
- where(column, operatorOrValue, value) {
81
- if (value === undefined) {
82
- this.state.wheres.push({
83
- column,
84
- operator: "=",
85
- value: operatorOrValue,
86
- boolean: "and"
87
- });
88
- } else {
89
- this.state.wheres.push({
90
- column,
91
- operator: operatorOrValue,
92
- value,
93
- boolean: "and"
94
- });
95
- }
96
- return this;
97
- }
98
- orWhere(column, operatorOrValue, value) {
99
- if (value === undefined) {
100
- this.state.wheres.push({
101
- column,
102
- operator: "=",
103
- value: operatorOrValue,
104
- boolean: "or"
105
- });
106
- } else {
107
- this.state.wheres.push({
108
- column,
109
- operator: operatorOrValue,
110
- value,
111
- boolean: "or"
112
- });
113
- }
114
- return this;
115
- }
116
- andWhere(column, operatorOrValue, value) {
117
- return this.where(column, operatorOrValue, value);
118
- }
119
- whereNull(column) {
120
- return this.where(column, "is", null);
121
- }
122
- whereNotNull(column) {
123
- return this.where(column, "is not", null);
124
- }
125
- whereIn(column, values) {
126
- return this.where(column, "in", values);
127
- }
128
- whereNotIn(column, values) {
129
- return this.where(column, "not in", values);
130
- }
131
- orderBy(column, direction = "asc") {
132
- this.state.orderBy.push({ column, direction });
133
- return this;
134
- }
135
- orderByDesc(column) {
136
- return this.orderBy(column, "desc");
137
- }
138
- latest(column = "created_at") {
139
- return this.orderBy(column, "desc");
140
- }
141
- oldest(column = "created_at") {
142
- return this.orderBy(column, "asc");
143
- }
144
- limit(count) {
145
- this.state.limitValue = count;
146
- return this;
147
- }
148
- offset(count) {
149
- this.state.offsetValue = count;
150
- return this;
151
- }
152
- skip(count) {
153
- return this.offset(count);
154
- }
155
- take(count) {
156
- return this.limit(count);
157
- }
158
- with(...relations) {
159
- this.state.withRelations.push(...relations);
160
- return this;
161
- }
162
- buildQueryParams() {
163
- const params = new URLSearchParams;
164
- for (const where of this.state.wheres) {
165
- if (where.operator === "=") {
166
- params.append(where.column, String(where.value));
167
- } else if (where.operator === "in" && Array.isArray(where.value)) {
168
- params.append(`${where.column}[]`, where.value.join(","));
169
- } else if (where.operator === "is" && where.value === null) {
170
- params.append(`filter[${where.column}][is]`, "null");
171
- } else if (where.operator === "is not" && where.value === null) {
172
- params.append(`filter[${where.column}][is_not]`, "null");
173
- } else {
174
- params.append(`filter[${where.column}][${where.operator}]`, String(where.value));
175
- }
176
- }
177
- if (this.state.orderBy.length > 0) {
178
- const orderStr = this.state.orderBy.map((o) => `${o.direction === "desc" ? "-" : ""}${o.column}`).join(",");
179
- params.append("sort", orderStr);
180
- }
181
- if (this.state.limitValue !== undefined) {
182
- params.append("limit", String(this.state.limitValue));
183
- }
184
- if (this.state.offsetValue !== undefined) {
185
- params.append("offset", String(this.state.offsetValue));
186
- }
187
- if (this.state.selectColumns.length > 0 && !this.state.selectColumns.includes("*")) {
188
- params.append("fields", this.state.selectColumns.join(","));
189
- }
190
- if (this.state.withRelations.length > 0) {
191
- params.append("include", this.state.withRelations.join(","));
192
- }
193
- return params;
194
- }
195
- buildUrl(path) {
196
- const base = `${browserConfig.baseUrl}/${this.state.table}`;
197
- if (path !== undefined) {
198
- return `${base}/${path}`;
199
- }
200
- const params = this.buildQueryParams();
201
- const queryString = params.toString();
202
- return queryString ? `${base}?${queryString}` : base;
203
- }
204
- async get() {
205
- const url = this.buildUrl();
206
- const response = await fetch(url, {
207
- method: "GET",
208
- headers: await buildHeaders()
209
- });
210
- const result = await handleResponse(response);
211
- return Array.isArray(result) ? result : result.data;
212
- }
213
- async first() {
214
- this.limit(1);
215
- const results = await this.get();
216
- return results[0] ?? null;
217
- }
218
- async firstOrFail() {
219
- const result = await this.first();
220
- if (!result) {
221
- throw new BrowserQueryError(`No ${this.state.table} found`, 404);
222
- }
223
- return result;
224
- }
225
- async find(id) {
226
- const url = this.buildUrl(id);
227
- try {
228
- const response = await fetch(url, {
229
- method: "GET",
230
- headers: await buildHeaders()
231
- });
232
- if (response.status === 404) {
233
- return null;
234
- }
235
- const result = await handleResponse(response);
236
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
237
- } catch {
238
- return null;
239
- }
240
- }
241
- async findOrFail(id) {
242
- const result = await this.find(id);
243
- if (!result) {
244
- throw new BrowserQueryError(`${this.state.table} with id ${id} not found`, 404);
245
- }
246
- return result;
247
- }
248
- async count() {
249
- const params = this.buildQueryParams();
250
- params.append("count", "true");
251
- const url = `${browserConfig.baseUrl}/${this.state.table}?${params.toString()}`;
252
- const response = await fetch(url, {
253
- method: "GET",
254
- headers: await buildHeaders()
255
- });
256
- const result = await handleResponse(response);
257
- return result.count;
258
- }
259
- async exists() {
260
- const count = await this.count();
261
- return count > 0;
262
- }
263
- async create(data) {
264
- const url = `${browserConfig.baseUrl}/${this.state.table}`;
265
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
266
- const response = await fetch(url, {
267
- method: "POST",
268
- headers: await buildHeaders(),
269
- body: JSON.stringify(body)
270
- });
271
- const result = await handleResponse(response);
272
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
273
- }
274
- async insert(data) {
275
- return this.create(data);
276
- }
277
- async update(id, data) {
278
- const url = `${browserConfig.baseUrl}/${this.state.table}/${id}`;
279
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
280
- const response = await fetch(url, {
281
- method: "PATCH",
282
- headers: await buildHeaders(),
283
- body: JSON.stringify(body)
284
- });
285
- const result = await handleResponse(response);
286
- return "data" in result && !Array.isArray(result.data) ? result.data : result;
287
- }
288
- async delete(id) {
289
- const url = `${browserConfig.baseUrl}/${this.state.table}/${id}`;
290
- const response = await fetch(url, {
291
- method: "DELETE",
292
- headers: await buildHeaders()
293
- });
294
- return response.ok;
295
- }
296
- async destroy(id) {
297
- return this.delete(id);
298
- }
299
- async paginate(page = 1, perPage = 15) {
300
- this.limit(perPage).offset((page - 1) * perPage);
301
- const params = this.buildQueryParams();
302
- params.append("paginate", "true");
303
- const url = `${browserConfig.baseUrl}/${this.state.table}?${params.toString()}`;
304
- const response = await fetch(url, {
305
- method: "GET",
306
- headers: await buildHeaders()
307
- });
308
- return handleResponse(response);
309
- }
310
- toState() {
311
- return { ...this.state };
312
- }
313
- }
314
- function browserQuery(table) {
315
- return new BrowserQueryBuilder(table);
316
- }
317
- function createBrowserDb() {
318
- return new Proxy({}, {
319
- get: (_target, prop) => {
320
- return () => browserQuery(prop);
321
- }
322
- });
323
- }
324
-
325
- class BrowserModelInstance {
326
- _attributes;
327
- _definition;
328
- constructor(definition, attributes = {}) {
329
- this._definition = definition;
330
- this._attributes = { ...attributes };
331
- }
332
- get(key) {
333
- return this._attributes[key];
334
- }
335
- set(key, value) {
336
- this._attributes[key] = value;
337
- }
338
- get attributes() {
339
- return { ...this._attributes };
340
- }
341
- get id() {
342
- const pk = this._definition.primaryKey || "id";
343
- return this._attributes[pk];
344
- }
345
- toJSON() {
346
- const hidden = new Set;
347
- for (const [key, attr] of Object.entries(this._definition.attributes)) {
348
- if (attr.hidden)
349
- hidden.add(key);
350
- }
351
- const json = {};
352
- for (const [key, value] of Object.entries(this._attributes)) {
353
- if (!hidden.has(key))
354
- json[key] = value;
355
- }
356
- return json;
357
- }
358
- }
359
-
360
- class BrowserModelQueryBuilder {
361
- _definition;
362
- _wheres = [];
363
- _orderBy = [];
364
- _limit;
365
- _offset;
366
- _select = ["*"];
367
- _withRelations = [];
368
- constructor(definition) {
369
- this._definition = definition;
370
- }
371
- getTablePath() {
372
- return typeof this._definition.traits?.useApi === "object" && this._definition.traits.useApi?.uri || this._definition.table;
373
- }
374
- where(column, operatorOrValue, value) {
375
- if (value === undefined) {
376
- this._wheres.push({ column, operator: "=", value: operatorOrValue, boolean: "and" });
377
- } else {
378
- this._wheres.push({ column, operator: operatorOrValue, value, boolean: "and" });
379
- }
380
- return this;
381
- }
382
- orWhere(column, operatorOrValue, value) {
383
- if (value === undefined) {
384
- this._wheres.push({ column, operator: "=", value: operatorOrValue, boolean: "or" });
385
- } else {
386
- this._wheres.push({ column, operator: operatorOrValue, value, boolean: "or" });
387
- }
388
- return this;
389
- }
390
- whereIn(column, values) {
391
- this._wheres.push({ column, operator: "in", value: values, boolean: "and" });
392
- return this;
393
- }
394
- whereNotIn(column, values) {
395
- this._wheres.push({ column, operator: "not in", value: values, boolean: "and" });
396
- return this;
397
- }
398
- whereNull(column) {
399
- this._wheres.push({ column, operator: "is", value: null, boolean: "and" });
400
- return this;
401
- }
402
- whereNotNull(column) {
403
- this._wheres.push({ column, operator: "is not", value: null, boolean: "and" });
404
- return this;
405
- }
406
- whereLike(column, pattern) {
407
- this._wheres.push({ column, operator: "like", value: pattern, boolean: "and" });
408
- return this;
409
- }
410
- orderBy(column, direction = "asc") {
411
- this._orderBy.push({ column, direction });
412
- return this;
413
- }
414
- orderByDesc(column) {
415
- return this.orderBy(column, "desc");
416
- }
417
- orderByAsc(column) {
418
- return this.orderBy(column, "asc");
419
- }
420
- limit(count) {
421
- this._limit = count;
422
- return this;
423
- }
424
- take(count) {
425
- return this.limit(count);
426
- }
427
- offset(count) {
428
- this._offset = count;
429
- return this;
430
- }
431
- skip(count) {
432
- return this.offset(count);
433
- }
434
- select(...columns) {
435
- this._select = columns;
436
- return this;
437
- }
438
- with(...relations) {
439
- this._withRelations.push(...relations);
440
- return this;
441
- }
442
- latest(column = "created_at") {
443
- return this.orderByDesc(column);
444
- }
445
- oldest(column = "created_at") {
446
- return this.orderByAsc(column);
447
- }
448
- buildQueryParams() {
449
- const params = new URLSearchParams;
450
- for (const where of this._wheres) {
451
- if (where.operator === "=") {
452
- params.append(where.column, String(where.value));
453
- } else if ((where.operator === "in" || where.operator === "not in") && Array.isArray(where.value)) {
454
- params.append(`${where.column}[]`, where.value.join(","));
455
- } else if (where.operator === "is" && where.value === null) {
456
- params.append(`filter[${where.column}][is]`, "null");
457
- } else if (where.operator === "is not" && where.value === null) {
458
- params.append(`filter[${where.column}][is_not]`, "null");
459
- } else {
460
- params.append(`filter[${where.column}][${where.operator}]`, String(where.value));
461
- }
462
- }
463
- if (this._orderBy.length > 0) {
464
- const orderStr = this._orderBy.map((o) => `${o.direction === "desc" ? "-" : ""}${o.column}`).join(",");
465
- params.append("sort", orderStr);
466
- }
467
- if (this._limit !== undefined)
468
- params.append("limit", String(this._limit));
469
- if (this._offset !== undefined)
470
- params.append("offset", String(this._offset));
471
- if (this._select.length > 0 && !this._select.includes("*")) {
472
- params.append("fields", this._select.join(","));
473
- }
474
- if (this._withRelations.length > 0) {
475
- params.append("include", this._withRelations.join(","));
476
- }
477
- return params;
478
- }
479
- buildUrl(path) {
480
- const base = `${browserConfig.baseUrl}/${this.getTablePath()}`;
481
- if (path !== undefined)
482
- return `${base}/${path}`;
483
- const params = this.buildQueryParams();
484
- const queryString = params.toString();
485
- return queryString ? `${base}?${queryString}` : base;
486
- }
487
- async get() {
488
- const url = this.buildUrl();
489
- const response = await fetch(url, {
490
- method: "GET",
491
- headers: await buildHeaders()
492
- });
493
- const result = await handleResponse(response);
494
- const rows = Array.isArray(result) ? result : result.data;
495
- return rows.map((row) => new BrowserModelInstance(this._definition, row));
496
- }
497
- async first() {
498
- this._limit = 1;
499
- const results = await this.get();
500
- return results[0] ?? null;
501
- }
502
- async firstOrFail() {
503
- const result = await this.first();
504
- if (!result)
505
- throw new BrowserQueryError(`No ${this._definition.name} found`, 404);
506
- return result;
507
- }
508
- async find(id) {
509
- const url = this.buildUrl(id);
510
- try {
511
- const response = await fetch(url, {
512
- method: "GET",
513
- headers: await buildHeaders()
514
- });
515
- if (response.status === 404)
516
- return null;
517
- const result = await handleResponse(response);
518
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
519
- return new BrowserModelInstance(this._definition, row);
520
- } catch {
521
- return null;
522
- }
523
- }
524
- async findOrFail(id) {
525
- const result = await this.find(id);
526
- if (!result)
527
- throw new BrowserQueryError(`${this._definition.name} with id ${id} not found`, 404);
528
- return result;
529
- }
530
- async count() {
531
- const params = this.buildQueryParams();
532
- params.append("count", "true");
533
- const url = `${browserConfig.baseUrl}/${this.getTablePath()}?${params.toString()}`;
534
- const response = await fetch(url, {
535
- method: "GET",
536
- headers: await buildHeaders()
537
- });
538
- const result = await handleResponse(response);
539
- return result.count;
540
- }
541
- async exists() {
542
- const count = await this.count();
543
- return count > 0;
544
- }
545
- async pluck(column) {
546
- this._select = [column];
547
- const results = await this.get();
548
- return results.map((r) => r.get(column));
549
- }
550
- async paginate(page = 1, perPage = 15) {
551
- this._limit = perPage;
552
- this._offset = (page - 1) * perPage;
553
- const params = this.buildQueryParams();
554
- params.append("paginate", "true");
555
- const url = `${browserConfig.baseUrl}/${this.getTablePath()}?${params.toString()}`;
556
- const response = await fetch(url, {
557
- method: "GET",
558
- headers: await buildHeaders()
559
- });
560
- const result = await handleResponse(response);
561
- return {
562
- ...result,
563
- data: result.data.map((row) => new BrowserModelInstance(this._definition, row))
564
- };
565
- }
566
- }
567
- function createBrowserModel(definition) {
568
- const model = {
569
- query: () => new BrowserModelQueryBuilder(definition),
570
- where(column, operatorOrValue, value) {
571
- return new BrowserModelQueryBuilder(definition).where(column, operatorOrValue, value);
572
- },
573
- orWhere(column, operatorOrValue, value) {
574
- return new BrowserModelQueryBuilder(definition).orWhere(column, operatorOrValue, value);
575
- },
576
- whereIn(column, values) {
577
- return new BrowserModelQueryBuilder(definition).whereIn(column, values);
578
- },
579
- whereNotIn(column, values) {
580
- return new BrowserModelQueryBuilder(definition).whereNotIn(column, values);
581
- },
582
- whereNull(column) {
583
- return new BrowserModelQueryBuilder(definition).whereNull(column);
584
- },
585
- whereNotNull(column) {
586
- return new BrowserModelQueryBuilder(definition).whereNotNull(column);
587
- },
588
- whereLike(column, pattern) {
589
- return new BrowserModelQueryBuilder(definition).whereLike(column, pattern);
590
- },
591
- orderBy(column, direction = "asc") {
592
- return new BrowserModelQueryBuilder(definition).orderBy(column, direction);
593
- },
594
- orderByDesc(column) {
595
- return new BrowserModelQueryBuilder(definition).orderByDesc(column);
596
- },
597
- select(...columns) {
598
- return new BrowserModelQueryBuilder(definition).select(...columns);
599
- },
600
- limit: (count) => new BrowserModelQueryBuilder(definition).limit(count),
601
- take: (count) => new BrowserModelQueryBuilder(definition).take(count),
602
- skip: (count) => new BrowserModelQueryBuilder(definition).skip(count),
603
- latest: (column = "created_at") => new BrowserModelQueryBuilder(definition).latest(column),
604
- oldest: (column = "created_at") => new BrowserModelQueryBuilder(definition).oldest(column),
605
- async find(id) {
606
- return new BrowserModelQueryBuilder(definition).find(id);
607
- },
608
- async findOrFail(id) {
609
- return new BrowserModelQueryBuilder(definition).findOrFail(id);
610
- },
611
- async all() {
612
- return new BrowserModelQueryBuilder(definition).get();
613
- },
614
- async first() {
615
- return new BrowserModelQueryBuilder(definition).first();
616
- },
617
- async firstOrFail() {
618
- return new BrowserModelQueryBuilder(definition).firstOrFail();
619
- },
620
- async count() {
621
- return new BrowserModelQueryBuilder(definition).count();
622
- },
623
- async exists() {
624
- return new BrowserModelQueryBuilder(definition).exists();
625
- },
626
- async paginate(page, perPage) {
627
- return new BrowserModelQueryBuilder(definition).paginate(page, perPage);
628
- },
629
- async pluck(column) {
630
- return new BrowserModelQueryBuilder(definition).pluck(column);
631
- },
632
- async create(data) {
633
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
634
- const url = `${browserConfig.baseUrl}/${tablePath}`;
635
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
636
- const response = await fetch(url, {
637
- method: "POST",
638
- headers: await buildHeaders(),
639
- body: JSON.stringify(body)
640
- });
641
- const result = await handleResponse(response);
642
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
643
- return new BrowserModelInstance(definition, row);
644
- },
645
- async update(id, data) {
646
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
647
- const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
648
- const body = browserConfig.transformRequest ? browserConfig.transformRequest(data) : data;
649
- const response = await fetch(url, {
650
- method: "PATCH",
651
- headers: await buildHeaders(),
652
- body: JSON.stringify(body)
653
- });
654
- const result = await handleResponse(response);
655
- const row = "data" in result && !Array.isArray(result.data) ? result.data : result;
656
- return new BrowserModelInstance(definition, row);
657
- },
658
- async delete(id) {
659
- const tablePath = typeof definition.traits?.useApi === "object" && definition.traits.useApi?.uri || definition.table;
660
- const url = `${browserConfig.baseUrl}/${tablePath}/${id}`;
661
- const response = await fetch(url, {
662
- method: "DELETE",
663
- headers: await buildHeaders()
664
- });
665
- return response.ok;
666
- },
667
- async destroy(id) {
668
- return this.delete(id);
669
- },
670
- getDefinition: () => definition,
671
- getTable: () => definition.table
672
- };
673
- return new Proxy(model, {
674
- get(target, prop) {
675
- if (typeof prop === "string" && prop.startsWith("where") && prop.length > 5) {
676
- const columnPascal = prop.slice(5);
677
- const column = columnPascal.charAt(0).toLowerCase() + columnPascal.slice(1);
678
- if (column in definition.attributes || column === "id" || column === definition.primaryKey) {
679
- return (value) => new BrowserModelQueryBuilder(definition).where(column, value);
680
- }
681
- }
682
- return Reflect.get(target, prop);
683
- }
684
- });
685
- }
686
- var browserConfig;
687
- var BrowserQueryError;
688
- var browserAuth;
689
- var browser_default;
690
- var init_browser = __esm(() => {
691
- browserConfig = {
692
- baseUrl: ""
693
- };
694
- BrowserQueryError = class BrowserQueryError2 extends Error {
695
- status;
696
- constructor(message, status) {
697
- super(message);
698
- this.name = "BrowserQueryError";
699
- this.status = status;
700
- }
701
- };
702
- browserAuth = {
703
- async login(credentials) {
704
- const response = await fetch(`${browserConfig.baseUrl}/login`, {
705
- method: "POST",
706
- headers: {
707
- "Content-Type": "application/json",
708
- Accept: "application/json",
709
- ...browserConfig.headers
710
- },
711
- body: JSON.stringify(credentials)
712
- });
713
- if (!response.ok) {
714
- const error = await response.json().catch(() => ({ message: "Login failed" }));
715
- throw new BrowserQueryError(error.message || "Login failed", response.status);
716
- }
717
- const rawData = await response.json();
718
- const data = rawData.data || rawData;
719
- if (typeof localStorage !== "undefined" && data.token) {
720
- localStorage.setItem("auth_token", data.token);
721
- }
722
- return data;
723
- },
724
- async register(data) {
725
- const response = await fetch(`${browserConfig.baseUrl}/register`, {
726
- method: "POST",
727
- headers: {
728
- "Content-Type": "application/json",
729
- Accept: "application/json",
730
- ...browserConfig.headers
731
- },
732
- body: JSON.stringify(data)
733
- });
734
- if (!response.ok) {
735
- const error = await response.json().catch(() => ({ message: "Registration failed" }));
736
- throw new BrowserQueryError(error.message || "Registration failed", response.status);
737
- }
738
- const rawResult = await response.json();
739
- const result = rawResult.data || rawResult;
740
- if (typeof localStorage !== "undefined" && result.token) {
741
- localStorage.setItem("auth_token", result.token);
742
- }
743
- return result;
744
- },
745
- async logout() {
746
- const token = await getAuthToken();
747
- if (token) {
748
- try {
749
- await fetch(`${browserConfig.baseUrl}/logout`, {
750
- method: "POST",
751
- headers: await buildHeaders()
752
- });
753
- } catch {}
754
- }
755
- if (typeof localStorage !== "undefined") {
756
- localStorage.removeItem("auth_token");
757
- }
758
- },
759
- async user() {
760
- const token = await getAuthToken();
761
- if (!token)
762
- return null;
763
- try {
764
- const response = await fetch(`${browserConfig.baseUrl}/user`, {
765
- method: "GET",
766
- headers: await buildHeaders()
767
- });
768
- if (response.status === 401) {
769
- browserConfig.onUnauthorized?.();
770
- return null;
771
- }
772
- if (!response.ok)
773
- return null;
774
- const data = await response.json();
775
- return data.user || data;
776
- } catch {
777
- return null;
778
- }
779
- },
780
- async check() {
781
- const user = await this.user();
782
- return user !== null;
783
- },
784
- getToken: getAuthToken
785
- };
786
- browser_default = browserQuery;
787
- });
788
- init_browser();
16
+ // src/auto-init.ts
17
+ import {
18
+ browserQuery,
19
+ BrowserQueryBuilder,
20
+ BrowserQueryError,
21
+ browserAuth as browserAuth2,
22
+ configureBrowser as configureBrowser2,
23
+ getBrowserConfig,
24
+ createBrowserDb,
25
+ createBrowserModel as createBrowserModel2,
26
+ isBrowser
27
+ } from "bun-query-builder/browser";
789
28
 
790
29
  // src/composables/index.ts
791
30
  var exports_composables = {};
@@ -1050,6 +289,7 @@ function authGuard(options = {}) {
1050
289
  }
1051
290
  }
1052
291
  // src/composables/useApi.ts
292
+ import { configureBrowser, browserAuth } from "bun-query-builder/browser";
1053
293
  function initApi(options) {
1054
294
  const stacksConfig2 = globalThis.__STACKS_CONFIG__ || {};
1055
295
  const baseUrl2 = options?.baseUrl || (typeof window !== "undefined" ? `${window.location.origin}/api` : `http://localhost:${process.env.PORT_API || "3008"}/api`);
@@ -1244,6 +484,7 @@ import {
1244
484
  } from "@stacksjs/composables";
1245
485
 
1246
486
  // src/model-loader.ts
487
+ import { createBrowserModel } from "bun-query-builder/browser";
1247
488
  var modelModules = typeof import.meta.glob === "function" ? import.meta.glob("~/app/Models/*.ts", { eager: true }) : {};
1248
489
  function loadBrowserModels() {
1249
490
  if (typeof window === "undefined")
@@ -1319,7 +560,7 @@ function autoInit() {
1319
560
  return;
1320
561
  isInitialized = true;
1321
562
  const baseUrl2 = window.__STACKS_API_URL__ || `${window.location.origin}/api`;
1322
- configureBrowser({
563
+ configureBrowser2({
1323
564
  baseUrl: baseUrl2,
1324
565
  getToken: () => {
1325
566
  try {
@@ -1342,11 +583,11 @@ function autoInit() {
1342
583
  browserQuery,
1343
584
  BrowserQueryBuilder,
1344
585
  BrowserQueryError,
1345
- browserAuth,
1346
- configureBrowser,
586
+ browserAuth: browserAuth2,
587
+ configureBrowser: configureBrowser2,
1347
588
  getBrowserConfig,
1348
589
  createBrowserDb,
1349
- createBrowserModel,
590
+ createBrowserModel: createBrowserModel2,
1350
591
  isBrowser,
1351
592
  ...exports_composables
1352
593
  };
@@ -1362,174 +603,8 @@ import { toString } from "@stacksjs/strings";
1362
603
  async function loop(times, callback) {
1363
604
  Array.from({ length: times }).forEach(async (_, i) => await callback(i));
1364
605
  }
1365
- // ../../../../pantry/@stripe/stripe-js/dist/index.mjs
1366
- function _typeof(obj) {
1367
- "@babel/helpers - typeof";
1368
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
1369
- _typeof = function(obj2) {
1370
- return typeof obj2;
1371
- };
1372
- } else {
1373
- _typeof = function(obj2) {
1374
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
1375
- };
1376
- }
1377
- return _typeof(obj);
1378
- }
1379
- var RELEASE_TRAIN = "clover";
1380
- var runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion2(version) {
1381
- return version === 3 ? "v3" : version;
1382
- };
1383
- var ORIGIN = "https://js.stripe.com";
1384
- var STRIPE_JS_URL = "".concat(ORIGIN, "/").concat(RELEASE_TRAIN, "/stripe.js");
1385
- var V3_URL_REGEX = /^https:\/\/js\.stripe\.com\/v3\/?(\?.*)?$/;
1386
- var STRIPE_JS_URL_REGEX = /^https:\/\/js\.stripe\.com\/(v3|[a-z]+)\/stripe\.js(\?.*)?$/;
1387
- var EXISTING_SCRIPT_MESSAGE = "loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used";
1388
- var isStripeJSURL = function isStripeJSURL2(url) {
1389
- return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);
1390
- };
1391
- var findScript = function findScript2() {
1392
- var scripts = document.querySelectorAll('script[src^="'.concat(ORIGIN, '"]'));
1393
- for (var i = 0;i < scripts.length; i++) {
1394
- var script = scripts[i];
1395
- if (!isStripeJSURL(script.src)) {
1396
- continue;
1397
- }
1398
- return script;
1399
- }
1400
- return null;
1401
- };
1402
- var injectScript = function injectScript2(params) {
1403
- var queryString = params && !params.advancedFraudSignals ? "?advancedFraudSignals=false" : "";
1404
- var script = document.createElement("script");
1405
- script.src = "".concat(STRIPE_JS_URL).concat(queryString);
1406
- var headOrBody = document.head || document.body;
1407
- if (!headOrBody) {
1408
- throw new Error("Expected document.body not to be null. Stripe.js requires a <body> element.");
1409
- }
1410
- headOrBody.appendChild(script);
1411
- return script;
1412
- };
1413
- var registerWrapper = function registerWrapper2(stripe, startTime) {
1414
- if (!stripe || !stripe._registerWrapper) {
1415
- return;
1416
- }
1417
- stripe._registerWrapper({
1418
- name: "stripe-js",
1419
- version: "8.11.0",
1420
- startTime
1421
- });
1422
- };
1423
- var stripePromise$1 = null;
1424
- var onErrorListener = null;
1425
- var onLoadListener = null;
1426
- var onError = function onError2(reject) {
1427
- return function(cause) {
1428
- reject(new Error("Failed to load Stripe.js", {
1429
- cause
1430
- }));
1431
- };
1432
- };
1433
- var onLoad = function onLoad2(resolve, reject) {
1434
- return function() {
1435
- if (window.Stripe) {
1436
- resolve(window.Stripe);
1437
- } else {
1438
- reject(new Error("Stripe.js not available"));
1439
- }
1440
- };
1441
- };
1442
- var loadScript = function loadScript2(params) {
1443
- if (stripePromise$1 !== null) {
1444
- return stripePromise$1;
1445
- }
1446
- stripePromise$1 = new Promise(function(resolve, reject) {
1447
- if (typeof window === "undefined" || typeof document === "undefined") {
1448
- resolve(null);
1449
- return;
1450
- }
1451
- if (window.Stripe && params) {
1452
- console.warn(EXISTING_SCRIPT_MESSAGE);
1453
- }
1454
- if (window.Stripe) {
1455
- resolve(window.Stripe);
1456
- return;
1457
- }
1458
- try {
1459
- var script = findScript();
1460
- if (script && params) {
1461
- console.warn(EXISTING_SCRIPT_MESSAGE);
1462
- } else if (!script) {
1463
- script = injectScript(params);
1464
- } else if (script && onLoadListener !== null && onErrorListener !== null) {
1465
- var _script$parentNode;
1466
- script.removeEventListener("load", onLoadListener);
1467
- script.removeEventListener("error", onErrorListener);
1468
- (_script$parentNode = script.parentNode) === null || _script$parentNode === undefined || _script$parentNode.removeChild(script);
1469
- script = injectScript(params);
1470
- }
1471
- onLoadListener = onLoad(resolve, reject);
1472
- onErrorListener = onError(reject);
1473
- script.addEventListener("load", onLoadListener);
1474
- script.addEventListener("error", onErrorListener);
1475
- } catch (error) {
1476
- reject(error);
1477
- return;
1478
- }
1479
- });
1480
- return stripePromise$1["catch"](function(error) {
1481
- stripePromise$1 = null;
1482
- return Promise.reject(error);
1483
- });
1484
- };
1485
- var initStripe = function initStripe2(maybeStripe, args, startTime) {
1486
- if (maybeStripe === null) {
1487
- return null;
1488
- }
1489
- var pk = args[0];
1490
- if (typeof pk !== "string") {
1491
- throw new Error("Expected publishable key to be of type string, got type ".concat(_typeof(pk), " instead."));
1492
- }
1493
- var isTestKey = pk.match(/^pk_test/);
1494
- var version = runtimeVersionToUrlVersion(maybeStripe.version);
1495
- var expectedVersion = RELEASE_TRAIN;
1496
- if (isTestKey && version !== expectedVersion) {
1497
- console.warn("Stripe.js@".concat(version, " was loaded on the page, but @stripe/stripe-js@").concat("8.11.0", " expected Stripe.js@").concat(expectedVersion, ". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning"));
1498
- }
1499
- var stripe = maybeStripe.apply(undefined, args);
1500
- registerWrapper(stripe, startTime);
1501
- return stripe;
1502
- };
1503
- var stripePromise;
1504
- var loadCalled = false;
1505
- var getStripePromise = function getStripePromise2() {
1506
- if (stripePromise) {
1507
- return stripePromise;
1508
- }
1509
- stripePromise = loadScript(null)["catch"](function(error) {
1510
- stripePromise = null;
1511
- return Promise.reject(error);
1512
- });
1513
- return stripePromise;
1514
- };
1515
- Promise.resolve().then(function() {
1516
- return getStripePromise();
1517
- })["catch"](function(error) {
1518
- if (!loadCalled) {
1519
- console.warn(error);
1520
- }
1521
- });
1522
- var loadStripe = function loadStripe2() {
1523
- for (var _len = arguments.length, args = new Array(_len), _key = 0;_key < _len; _key++) {
1524
- args[_key] = arguments[_key];
1525
- }
1526
- loadCalled = true;
1527
- var startTime = Date.now();
1528
- return getStripePromise().then(function(maybeStripe) {
1529
- return initStripe(maybeStripe, args, startTime);
1530
- });
1531
- };
1532
606
  // src/utils/billable.ts
607
+ import { loadStripe } from "@stripe/stripe-js";
1533
608
  var stacksConfig2 = globalThis.__STACKS_CONFIG__ || {};
1534
609
  var publishableKey = stacksConfig2.FRONTEND_STRIPE_PUBLIC_KEY || "";
1535
610
  var client;
@@ -2070,107 +1145,33 @@ function random(size = 21) {
2070
1145
  }
2071
1146
  return id;
2072
1147
  }
2073
- // ../../../../pantry/magic-regexp/dist/flags-BP1_fHjc.mjs
2074
- var NO_WRAP_RE = /^(?:\(.*\)|\\?.)$/;
2075
- function wrap(s) {
2076
- const v = s.toString();
2077
- return NO_WRAP_RE.test(v) ? v : `(?:${v})`;
2078
- }
2079
- var GROUPED_AS_REPLACE_RE = /^(?:\(\?:(.+)\)|(.+))$/;
2080
- var GROUPED_REPLACE_RE = /^(?:\(\?:(.+)\)([?+*]|\{[\d,]+\})?|(.+))$/;
2081
- function createInput(s) {
2082
- const groupedAsFn = (key) => createInput(`(?<${key}>${`${s}`.replace(GROUPED_AS_REPLACE_RE, "$1$2")})`);
2083
- return {
2084
- toString: () => s.toString(),
2085
- and: Object.assign((...inputs) => createInput(`${s}${exactly(...inputs)}`), { referenceTo: (groupName) => createInput(`${s}\\k<${groupName}>`) }),
2086
- or: (...inputs) => createInput(`(?:${s}|${inputs.map((v) => exactly(v)).join("|")})`),
2087
- after: (...input) => createInput(`(?<=${exactly(...input)})${s}`),
2088
- before: (...input) => createInput(`${s}(?=${exactly(...input)})`),
2089
- notAfter: (...input) => createInput(`(?<!${exactly(...input)})${s}`),
2090
- notBefore: (...input) => createInput(`${s}(?!${exactly(...input)})`),
2091
- times: Object.assign((number) => createInput(`${wrap(s)}{${number}}`), {
2092
- any: () => createInput(`${wrap(s)}*`),
2093
- atLeast: (min) => createInput(`${wrap(s)}{${min},}`),
2094
- atMost: (max) => createInput(`${wrap(s)}{0,${max}}`),
2095
- between: (min, max) => createInput(`${wrap(s)}{${min},${max}}`)
2096
- }),
2097
- optionally: () => createInput(`${wrap(s)}?`),
2098
- as: groupedAsFn,
2099
- groupedAs: groupedAsFn,
2100
- grouped: () => createInput(`${s}`.replace(GROUPED_REPLACE_RE, "($1$3)$2")),
2101
- at: {
2102
- lineStart: () => createInput(`^${s}`),
2103
- lineEnd: () => createInput(`${s}$`)
2104
- }
2105
- };
2106
- }
2107
- var ESCAPE_REPLACE_RE = /[.*+?^${}()|[\]\\/]/g;
2108
- function createCharInput(raw) {
2109
- const input = createInput(`[${raw}]`);
2110
- const from = (charFrom, charTo) => createCharInput(`${raw}${escapeCharInput(charFrom)}-${escapeCharInput(charTo)}`);
2111
- const orChar = Object.assign((chars) => createCharInput(`${raw}${escapeCharInput(chars)}`), { from });
2112
- return Object.assign(input, {
2113
- orChar,
2114
- from
2115
- });
2116
- }
2117
- function escapeCharInput(raw) {
2118
- return raw.replace(/[-\\^\]]/g, "\\$&");
2119
- }
2120
- var charIn = Object.assign((chars) => {
2121
- return createCharInput(escapeCharInput(chars));
2122
- }, createCharInput(""));
2123
- var charNotIn = Object.assign((chars) => {
2124
- return createCharInput(`^${escapeCharInput(chars)}`);
2125
- }, createCharInput("^"));
2126
- function anyOf(...inputs) {
2127
- return createInput(`(?:${inputs.map((a) => exactly(a)).join("|")})`);
2128
- }
2129
- var char = createInput(".");
2130
- var word = createInput("\\b\\w+\\b");
2131
- var wordChar = createInput("\\w");
2132
- var wordBoundary = createInput("\\b");
2133
- var digit = createInput("\\d");
2134
- var whitespace = createInput("\\s");
2135
- var letter = Object.assign(createInput("[a-zA-Z]"), {
2136
- lowercase: createInput("[a-z]"),
2137
- uppercase: createInput("[A-Z]")
2138
- });
2139
- var tab = createInput("\\t");
2140
- var linefeed = createInput("\\n");
2141
- var carriageReturn = createInput("\\r");
2142
- var not = {
2143
- word: createInput("\\W+"),
2144
- wordChar: createInput("\\W"),
2145
- wordBoundary: createInput("\\B"),
2146
- digit: createInput("\\D"),
2147
- whitespace: createInput("\\S"),
2148
- letter: Object.assign(createInput("[^a-zA-Z]"), {
2149
- lowercase: createInput("[^a-z]"),
2150
- uppercase: createInput("[^A-Z]")
2151
- }),
2152
- tab: createInput("[^\\t]"),
2153
- linefeed: createInput("[^\\n]"),
2154
- carriageReturn: createInput("[^\\r]")
2155
- };
2156
- function maybe(...inputs) {
2157
- return createInput(`${wrap(exactly(...inputs))}?`);
2158
- }
2159
- function exactly(...inputs) {
2160
- return createInput(inputs.map((input) => typeof input === "string" ? input.replace(ESCAPE_REPLACE_RE, "\\$&") : input).join(""));
2161
- }
2162
- function oneOrMore(...inputs) {
2163
- return createInput(`${wrap(exactly(...inputs))}+`);
2164
- }
2165
- var withIndices = "d";
2166
- var caseInsensitive = "i";
2167
- var global = "g";
2168
- var multiline = "m";
2169
- var dotAll = "s";
2170
- var unicode = "u";
2171
- var sticky = "y";
2172
-
2173
1148
  // src/utils/regex.ts
1149
+ import {
1150
+ anyOf,
1151
+ carriageReturn,
1152
+ caseInsensitive,
1153
+ char,
1154
+ charIn,
1155
+ charNotIn,
1156
+ digit,
1157
+ dotAll,
1158
+ exactly,
1159
+ global,
1160
+ letter,
1161
+ linefeed,
1162
+ maybe,
1163
+ multiline,
1164
+ not,
1165
+ oneOrMore,
1166
+ sticky,
1167
+ tab,
1168
+ unicode,
1169
+ whitespace,
1170
+ withIndices,
1171
+ word,
1172
+ wordBoundary,
1173
+ wordChar
1174
+ } from "magic-regexp";
2174
1175
  function createRegExp(pattern, options = {}) {
2175
1176
  return new RegExp(pattern, options.flags);
2176
1177
  }
@@ -2337,6 +1338,18 @@ function readableSize(bytes, options = {}) {
2337
1338
  const numberString = value.toLocaleString(locale, { minimumFractionDigits, maximumFractionDigits });
2338
1339
  return `${prefix}${numberString}${space ? " " : ""}${units[exponent]}`;
2339
1340
  }
1341
+ // src/index.ts
1342
+ import {
1343
+ browserQuery as browserQuery2,
1344
+ BrowserQueryBuilder as BrowserQueryBuilder2,
1345
+ BrowserQueryError as BrowserQueryError2,
1346
+ browserAuth as browserAuth3,
1347
+ configureBrowser as configureBrowser3,
1348
+ getBrowserConfig as getBrowserConfig2,
1349
+ createBrowserDb as createBrowserDb2,
1350
+ createBrowserModel as createBrowserModel3,
1351
+ isBrowser as isBrowser2
1352
+ } from "bun-query-builder/browser";
2340
1353
  export {
2341
1354
  wordChar,
2342
1355
  wordBoundary,
@@ -2487,13 +1500,13 @@ export {
2487
1500
  letter,
2488
1501
  lazy,
2489
1502
  isTruthy,
2490
- isBrowser,
1503
+ isBrowser2 as isBrowser,
2491
1504
  initApi,
2492
1505
  global,
2493
1506
  getRelativeTime,
2494
1507
  getBrowserModelNames,
2495
1508
  getBrowserModel,
2496
- getBrowserConfig,
1509
+ getBrowserConfig2 as getBrowserConfig,
2497
1510
  formatElevation,
2498
1511
  formatDuration,
2499
1512
  formatDistance,
@@ -2513,12 +1526,12 @@ export {
2513
1526
  createPaymentMethod,
2514
1527
  useHead as createHead,
2515
1528
  createControlledPromise,
2516
- createBrowserModel,
2517
- createBrowserDb,
1529
+ createBrowserModel3 as createBrowserModel,
1530
+ createBrowserDb2 as createBrowserDb,
2518
1531
  confirmPayment,
2519
1532
  confirmCardSetup,
2520
1533
  confirmCardPayment,
2521
- configureBrowser,
1534
+ configureBrowser3 as configureBrowser,
2522
1535
  clamp,
2523
1536
  charNotIn,
2524
1537
  charIn,
@@ -2526,8 +1539,8 @@ export {
2526
1539
  caseInsensitive,
2527
1540
  carriageReturn,
2528
1541
  calculateDelay,
2529
- browserQuery,
2530
- browserAuth,
1542
+ browserQuery2 as browserQuery,
1543
+ browserAuth3 as browserAuth,
2531
1544
  breakpointsTailwind,
2532
1545
  breakpointsBootstrapV5,
2533
1546
  batchInvoke,
@@ -2538,6 +1551,6 @@ export {
2538
1551
  TransitionPresets,
2539
1552
  useHead2 as Head,
2540
1553
  Fetch,
2541
- BrowserQueryError,
2542
- BrowserQueryBuilder
1554
+ BrowserQueryError2 as BrowserQueryError,
1555
+ BrowserQueryBuilder2 as BrowserQueryBuilder
2543
1556
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/browser",
3
3
  "type": "module",
4
- "version": "0.70.56",
4
+ "version": "0.70.58",
5
5
  "description": "Stacks core frontend/browser functionalities.",
6
6
  "author": "Chris Breuer",
7
7
  "contributors": [
@@ -51,7 +51,7 @@
51
51
  "prepublishOnly": "bun run build"
52
52
  },
53
53
  "dependencies": {
54
- "@stacksjs/composables": "0.70.56",
54
+ "@stacksjs/composables": "0.70.58",
55
55
  "@stacksjs/stx": "^0.2.82",
56
56
  "@stripe/stripe-js": "^9.0.0",
57
57
  "bun-query-builder": "^0.1.38",
@@ -59,6 +59,6 @@
59
59
  },
60
60
  "devDependencies": {
61
61
  "better-dx": "^0.2.12",
62
- "@stacksjs/utils": "0.70.56"
62
+ "@stacksjs/utils": "0.70.58"
63
63
  }
64
64
  }