@stacksjs/browser 0.70.57 → 0.70.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2543 +1,16 @@
1
- var __defProp = Object.defineProperty;
2
- var __returnValue = (v) => v;
3
- function __exportSetter(name, newValue) {
4
- this[name] = __returnValue.bind(null, newValue);
5
- }
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true,
11
- configurable: true,
12
- set: __exportSetter.bind(all, name)
13
- });
14
- };
1
+ import"./auto-init";
15
2
 
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();
789
-
790
- // src/composables/index.ts
791
- var exports_composables = {};
792
- __export(exports_composables, {
793
- useWindowSize: () => useWindowSize,
794
- useWindowScroll: () => useWindowScroll,
795
- useWindowFocus: () => useWindowFocus,
796
- useWebWorkerFn: () => useWebWorkerFn,
797
- useWebWorker: () => useWebWorker,
798
- useWebSocket: () => useWebSocket,
799
- useWebNotification: () => useWebNotification,
800
- useWakeLock: () => useWakeLock,
801
- useVibrate: () => useVibrate,
802
- useUrlSearchParams: () => useUrlSearchParams,
803
- useTransition: () => useTransition,
804
- useToggle: () => useToggle,
805
- useTitle: () => useTitle,
806
- useTimestamp: () => useTimestamp,
807
- useTimeoutPoll: () => useTimeoutPoll,
808
- useTimeoutFn: () => useTimeoutFn,
809
- useTimeout: () => useTimeout,
810
- useTimeAgo: () => useTimeAgo,
811
- useThrottleFn: () => useThrottleFn,
812
- useTextSelection: () => useTextSelection,
813
- useTextDirection: () => useTextDirection,
814
- useSwipe: () => useSwipe,
815
- useSupported: () => useSupported,
816
- useStorage: () => useStorage2,
817
- useStepper: () => useStepper,
818
- useShare: () => useShare,
819
- useSessionStorage: () => useSessionStorage,
820
- useScrollLock: () => useScrollLock,
821
- useScroll: () => useScroll,
822
- useScreenOrientation: () => useScreenOrientation,
823
- useRafFn: () => useRafFn,
824
- usePreferredReducedMotion: () => usePreferredReducedMotion,
825
- usePreferredLanguages: () => usePreferredLanguages,
826
- usePreferredDark: () => usePreferredDark,
827
- usePreferredContrast: () => usePreferredContrast,
828
- usePreferredColorScheme: () => usePreferredColorScheme,
829
- usePointerSwipe: () => usePointerSwipe,
830
- usePointer: () => usePointer,
831
- usePermission: () => usePermission,
832
- usePageLeave: () => usePageLeave,
833
- useOnline: () => useOnline,
834
- useObjectUrl: () => useObjectUrl,
835
- useNow: () => useNow,
836
- useNetwork: () => useNetwork,
837
- useNavigatorLanguage: () => useNavigatorLanguage,
838
- useMousePressed: () => useMousePressed,
839
- useMouseInElement: () => useMouseInElement,
840
- useMouse: () => useMouse,
841
- useMounted: () => useMounted,
842
- useMemoize: () => useMemoize,
843
- useMediaQuery: () => useMediaQuery,
844
- useMagicKeys: () => useMagicKeys,
845
- useLocalStorage: () => useLocalStorage,
846
- useKeyModifier: () => useKeyModifier,
847
- useIntervalFn: () => useIntervalFn,
848
- useInterval: () => useInterval,
849
- useInfiniteScroll: () => useInfiniteScroll,
850
- useImage: () => useImage,
851
- useIdle: () => useIdle,
852
- useGeolocation: () => useGeolocation,
853
- useFullscreen: () => useFullscreen,
854
- useFocusWithin: () => useFocusWithin,
855
- useFocus: () => useFocus,
856
- useFileDialog: () => useFileDialog,
857
- useFetch: () => useFetch,
858
- useFavicon: () => useFavicon,
859
- useEyeDropper: () => useEyeDropper,
860
- useEventSource: () => useEventSource,
861
- useEventListener: () => useEventListener,
862
- useEventBus: () => useEventBus,
863
- useElementVisibility: () => useElementVisibility,
864
- useElementSize: () => useElementSize,
865
- useElementHover: () => useElementHover,
866
- useElementBounding: () => useElementBounding,
867
- useDropZone: () => useDropZone,
868
- useDraggable: () => useDraggable,
869
- useDocumentVisibility: () => useDocumentVisibility,
870
- useDevicePixelRatio: () => useDevicePixelRatio,
871
- useDeviceOrientation: () => useDeviceOrientation,
872
- useDeviceMotion: () => useDeviceMotion,
873
- useDebounceFn: () => useDebounceFn,
874
- useDateFormat: () => useDateFormat,
875
- useDark: () => useDark,
876
- useCycleList: () => useCycleList,
877
- useCssVar: () => useCssVar,
878
- useCounter: () => useCounter,
879
- useConfirmDialog: () => useConfirmDialog,
880
- useColorMode: () => useColorMode,
881
- useClipboardItems: () => useClipboardItems,
882
- useClipboard: () => useClipboard,
883
- useBrowserLocation: () => useBrowserLocation,
884
- useBroadcastChannel: () => useBroadcastChannel,
885
- useBreakpoints: () => useBreakpoints,
886
- useBattery: () => useBattery,
887
- useBase64: () => useBase64,
888
- useAuth: () => useAuth,
889
- useAnimate: () => useAnimate,
890
- useActiveElement: () => useActiveElement,
891
- onStartTyping: () => onStartTyping,
892
- onLongPress: () => onLongPress,
893
- onKeyUp: () => onKeyUp,
894
- onKeyStroke: () => onKeyStroke,
895
- onKeyDown: () => onKeyDown,
896
- onClickOutside: () => onClickOutside,
897
- initApi: () => initApi,
898
- getRelativeTime: () => getRelativeTime,
899
- formatElevation: () => formatElevation,
900
- formatDuration: () => formatDuration,
901
- formatDistance: () => formatDistance,
902
- formatAreaSize: () => formatAreaSize,
903
- fetchData: () => fetchData,
904
- breakpointsTailwind: () => breakpointsTailwind,
905
- breakpointsBootstrapV5: () => breakpointsBootstrapV5,
906
- authGuard: () => authGuard,
907
- auth: () => auth,
908
- TransitionPresets: () => TransitionPresets
909
- });
910
-
911
- // src/composables/useAuth.ts
912
- import { useStorage } from "@stacksjs/composables";
913
- import { ref } from "@stacksjs/stx";
914
- var token = useStorage("token", "");
915
- var stacksConfig = globalThis.__STACKS_CONFIG__ || {};
916
- var baseUrl = stacksConfig.API_URL || (typeof window !== "undefined" ? window.location.origin : `http://localhost:${process.env.PORT_API || "3008"}`);
917
- var user = ref(null);
918
- var isAuthenticated = ref(false);
919
- function useAuth() {
920
- async function fetchAuthUser() {
921
- try {
922
- if (!token.value) {
923
- isAuthenticated.value = false;
924
- user.value = null;
925
- return null;
926
- }
927
- const response = await fetch(`${baseUrl}/me`, {
928
- headers: {
929
- Authorization: `Bearer ${token.value}`,
930
- Accept: "application/json"
931
- }
932
- });
933
- if (!response.ok) {
934
- token.value = "";
935
- isAuthenticated.value = false;
936
- user.value = null;
937
- return null;
938
- }
939
- const data = await response.json();
940
- user.value = data;
941
- isAuthenticated.value = true;
942
- return data;
943
- } catch (error) {
944
- console.error("Error fetching user:", error);
945
- token.value = "";
946
- isAuthenticated.value = false;
947
- user.value = null;
948
- return null;
949
- }
950
- }
951
- async function checkAuthentication() {
952
- try {
953
- const userData = await fetchAuthUser();
954
- return userData !== null;
955
- } catch (error) {
956
- console.error("Error checking authentication:", error);
957
- return false;
958
- }
959
- }
960
- async function register(user2) {
961
- const url = `${baseUrl}/register`;
962
- const response = await fetch(url, {
963
- method: "POST",
964
- headers: {
965
- "Content-Type": "application/json"
966
- },
967
- body: JSON.stringify(user2)
968
- });
969
- const data = await response.json();
970
- if (isRegisterError(data)) {
971
- return data;
972
- }
973
- if (isRegisterResponse(data)) {
974
- token.value = data.token;
975
- return data;
976
- }
977
- return data;
978
- }
979
- function isRegisterError(data) {
980
- return "errors" in data;
981
- }
982
- function isRegisterResponse(data) {
983
- return "token" in data && "user" in data;
984
- }
985
- async function login(user2) {
986
- try {
987
- const url = `${baseUrl}/login`;
988
- const response = await fetch(url, {
989
- method: "POST",
990
- headers: {
991
- "Content-Type": "application/json"
992
- },
993
- body: JSON.stringify(user2)
994
- });
995
- if (!response.ok) {
996
- const errorData = await response.json();
997
- throw new Error(errorData.message || `HTTP error! status: ${response.status}`);
998
- }
999
- const data = await response.json();
1000
- token.value = data.token;
1001
- await fetchAuthUser();
1002
- return data;
1003
- } catch (error) {
1004
- return error;
1005
- }
1006
- }
1007
- async function logout() {
1008
- try {
1009
- const currentToken = token.value;
1010
- if (currentToken) {
1011
- await fetch(`${baseUrl}/logout`, {
1012
- method: "POST",
1013
- headers: {
1014
- Authorization: `Bearer ${currentToken}`,
1015
- Accept: "application/json"
1016
- }
1017
- });
1018
- }
1019
- } catch (error) {
1020
- console.error("Error during logout:", error);
1021
- } finally {
1022
- token.value = "";
1023
- user.value = null;
1024
- isAuthenticated.value = false;
1025
- }
1026
- }
1027
- return {
1028
- user,
1029
- isAuthenticated,
1030
- token,
1031
- getToken: () => token.value,
1032
- register,
1033
- login,
1034
- logout,
1035
- fetchAuthUser,
1036
- checkAuthentication
1037
- };
1038
- }
1039
- function authGuard(options = {}) {
1040
- const guest = options.guest ?? false;
1041
- const { isAuthenticated: isAuthenticated2 } = useAuth();
1042
- if (guest) {
1043
- if (isAuthenticated2.value) {
1044
- window.location.replace("/");
1045
- }
1046
- return;
1047
- }
1048
- if (!isAuthenticated2.value) {
1049
- window.location.replace("/login");
1050
- }
1051
- }
1052
- // src/composables/useApi.ts
1053
- function initApi(options) {
1054
- const stacksConfig2 = globalThis.__STACKS_CONFIG__ || {};
1055
- const baseUrl2 = options?.baseUrl || (typeof window !== "undefined" ? `${window.location.origin}/api` : `http://localhost:${process.env.PORT_API || "3008"}/api`);
1056
- configureBrowser({
1057
- baseUrl: baseUrl2,
1058
- getToken: () => {
1059
- if (typeof localStorage !== "undefined") {
1060
- return localStorage.getItem("token");
1061
- }
1062
- return null;
1063
- },
1064
- onUnauthorized: options?.onUnauthorized || (() => {
1065
- if (typeof window !== "undefined") {
1066
- window.location.href = "/login";
1067
- }
1068
- }),
1069
- transformResponse: (data) => {
1070
- return data?.data ?? data;
1071
- }
1072
- });
1073
- }
1074
- var auth = browserAuth;
1075
- function formatAreaSize(sqMeters) {
1076
- if (sqMeters >= 1e6) {
1077
- return `${(sqMeters / 1e6).toFixed(2)} km²`;
1078
- }
1079
- if (sqMeters >= 1e4) {
1080
- return `${(sqMeters / 1e4).toFixed(2)} ha`;
1081
- }
1082
- return `${sqMeters.toLocaleString()} m²`;
1083
- }
1084
- function formatDistance(miles) {
1085
- return `${miles.toFixed(1)} mi`;
1086
- }
1087
- function formatElevation(feet) {
1088
- return `${feet.toLocaleString()} ft`;
1089
- }
1090
- function formatDuration(seconds) {
1091
- const hours = Math.floor(seconds / 3600);
1092
- const minutes = Math.floor(seconds % 3600 / 60);
1093
- const secs = seconds % 60;
1094
- if (hours > 0) {
1095
- return `${hours}h ${minutes}m`;
1096
- }
1097
- if (minutes > 0) {
1098
- return `${minutes}m ${secs}s`;
1099
- }
1100
- return `${secs}s`;
1101
- }
1102
- function getRelativeTime(dateString) {
1103
- const date = new Date(dateString);
1104
- const now = new Date;
1105
- const diffMs = now.getTime() - date.getTime();
1106
- const diffSeconds = Math.floor(diffMs / 1000);
1107
- const diffMinutes = Math.floor(diffSeconds / 60);
1108
- const diffHours = Math.floor(diffMinutes / 60);
1109
- const diffDays = Math.floor(diffHours / 24);
1110
- const diffWeeks = Math.floor(diffDays / 7);
1111
- if (diffSeconds < 60)
1112
- return "just now";
1113
- if (diffMinutes < 60)
1114
- return `${diffMinutes} minute${diffMinutes === 1 ? "" : "s"} ago`;
1115
- if (diffHours < 24)
1116
- return `${diffHours} hour${diffHours === 1 ? "" : "s"} ago`;
1117
- if (diffDays < 7)
1118
- return `${diffDays} day${diffDays === 1 ? "" : "s"} ago`;
1119
- if (diffWeeks < 4)
1120
- return `${diffWeeks} week${diffWeeks === 1 ? "" : "s"} ago`;
1121
- return date.toLocaleDateString();
1122
- }
1123
- async function fetchData(fetcher, options) {
1124
- try {
1125
- return await fetcher();
1126
- } catch (error) {
1127
- if (options?.onError) {
1128
- options.onError(error);
1129
- } else {
1130
- console.error("API Error:", error);
1131
- }
1132
- return options?.fallback;
1133
- }
1134
- }
1135
-
1136
- // src/composables/index.ts
1137
- import {
1138
- useColorMode,
1139
- useDark,
1140
- usePreferredColorScheme,
1141
- usePreferredContrast,
1142
- usePreferredDark,
1143
- usePreferredReducedMotion,
1144
- useDateFormat,
1145
- useNow,
1146
- useTimeAgo,
1147
- useTimestamp,
1148
- useFetch,
1149
- useNetwork,
1150
- useOnline,
1151
- useLocalStorage,
1152
- useSessionStorage,
1153
- useStorage as useStorage2,
1154
- useToggle,
1155
- useCounter,
1156
- useStepper,
1157
- useCycleList,
1158
- useActiveElement,
1159
- useClipboard,
1160
- useClipboardItems,
1161
- useCssVar,
1162
- useDocumentVisibility,
1163
- useElementBounding,
1164
- useElementHover,
1165
- useElementSize,
1166
- useElementVisibility,
1167
- useFocus,
1168
- useFocusWithin,
1169
- useFullscreen,
1170
- useScroll,
1171
- useScrollLock,
1172
- useTitle,
1173
- useWindowFocus,
1174
- useWindowScroll,
1175
- useWindowSize,
1176
- onClickOutside,
1177
- onKeyDown,
1178
- onKeyStroke,
1179
- onKeyUp,
1180
- onLongPress,
1181
- onStartTyping,
1182
- useEventListener,
1183
- useKeyModifier,
1184
- useMagicKeys,
1185
- useDraggable,
1186
- useDropZone,
1187
- useMouse,
1188
- useMouseInElement,
1189
- useMousePressed,
1190
- usePointer,
1191
- usePointerSwipe,
1192
- useSwipe,
1193
- useBattery,
1194
- useDeviceMotion,
1195
- useDeviceOrientation,
1196
- useDevicePixelRatio,
1197
- useGeolocation,
1198
- useBreakpoints,
1199
- useMediaQuery,
1200
- breakpointsTailwind,
1201
- breakpointsBootstrapV5,
1202
- useBrowserLocation,
1203
- useIdle,
1204
- useInfiniteScroll,
1205
- useNavigatorLanguage,
1206
- usePageLeave,
1207
- usePreferredLanguages,
1208
- useScreenOrientation,
1209
- useTextDirection,
1210
- useTextSelection,
1211
- useUrlSearchParams,
1212
- useDebounceFn,
1213
- useInterval,
1214
- useIntervalFn,
1215
- useRafFn,
1216
- useThrottleFn,
1217
- useTimeout,
1218
- useTimeoutFn,
1219
- useTimeoutPoll,
1220
- useAnimate,
1221
- useTransition,
1222
- TransitionPresets,
1223
- useBase64,
1224
- useBroadcastChannel,
1225
- useConfirmDialog,
1226
- useEventBus,
1227
- useEventSource,
1228
- useEyeDropper,
1229
- useFavicon,
1230
- useFileDialog,
1231
- useImage,
1232
- useObjectUrl,
1233
- usePermission,
1234
- useShare,
1235
- useVibrate,
1236
- useWakeLock,
1237
- useWebNotification,
1238
- useWebSocket,
1239
- useWebWorker,
1240
- useWebWorkerFn,
1241
- useSupported,
1242
- useMemoize,
1243
- useMounted
1244
- } from "@stacksjs/composables";
1245
-
1246
- // src/model-loader.ts
1247
- var modelModules = typeof import.meta.glob === "function" ? import.meta.glob("~/app/Models/*.ts", { eager: true }) : {};
1248
- function loadBrowserModels() {
1249
- if (typeof window === "undefined")
1250
- return;
1251
- if (!window.StacksBrowser) {
1252
- window.StacksBrowser = {};
1253
- }
1254
- for (const [path, module] of Object.entries(modelModules)) {
1255
- const definition = module.default;
1256
- if (!definition || !definition.name) {
1257
- console.warn(`[model-loader] Skipping ${path}: no valid model definition`);
1258
- continue;
1259
- }
1260
- if (!definition.traits?.useApi?.uri) {
1261
- continue;
1262
- }
1263
- try {
1264
- const browserModel = createBrowserModel({
1265
- name: definition.name,
1266
- table: definition.table,
1267
- primaryKey: definition.primaryKey || "id",
1268
- traits: {
1269
- useUuid: definition.traits?.useUuid ?? false,
1270
- useTimestamps: definition.traits?.useTimestamps ?? true,
1271
- useSoftDeletes: definition.traits?.useSoftDeletes ?? false,
1272
- useApi: definition.traits?.useApi
1273
- },
1274
- attributes: extractBrowserAttributes(definition.attributes ?? {})
1275
- });
1276
- window.StacksBrowser[definition.name] = browserModel;
1277
- } catch (error) {
1278
- console.error(`[model-loader] Failed to create browser model for ${definition.name}:`, error);
1279
- }
1280
- }
1281
- }
1282
- function extractBrowserAttributes(attributes) {
1283
- const browserAttrs = {};
1284
- for (const [name, attr] of Object.entries(attributes)) {
1285
- browserAttrs[name] = {
1286
- fillable: attr.fillable ?? false,
1287
- hidden: attr.hidden ?? false,
1288
- guarded: attr.guarded ?? false,
1289
- nullable: attr.nullable ?? false
1290
- };
1291
- }
1292
- return browserAttrs;
1293
- }
1294
- function getBrowserModel(name) {
1295
- if (typeof window === "undefined")
1296
- return null;
1297
- return window.StacksBrowser?.[name] ?? null;
1298
- }
1299
- function getBrowserModelNames() {
1300
- if (typeof window === "undefined")
1301
- return [];
1302
- const stacksBrowser = window.StacksBrowser;
1303
- if (!stacksBrowser)
1304
- return [];
1305
- return Object.keys(stacksBrowser).filter((key) => {
1306
- const value = stacksBrowser[key];
1307
- return value != null && typeof value.all === "function" && typeof value.find === "function";
1308
- });
1309
- }
1310
-
1311
- // src/auto-init.ts
1312
- var isInitialized = false;
1313
- function autoInit() {
1314
- if (isInitialized)
1315
- return;
1316
- if (typeof window === "undefined")
1317
- return;
1318
- if (typeof document === "undefined")
1319
- return;
1320
- isInitialized = true;
1321
- const baseUrl2 = window.__STACKS_API_URL__ || `${window.location.origin}/api`;
1322
- configureBrowser({
1323
- baseUrl: baseUrl2,
1324
- getToken: () => {
1325
- try {
1326
- return localStorage.getItem("token");
1327
- } catch {
1328
- return null;
1329
- }
1330
- },
1331
- onUnauthorized: () => {
1332
- const loginUrl = window.__STACKS_LOGIN_URL__ || "/login";
1333
- if (!window.location.pathname.startsWith(loginUrl)) {
1334
- window.location.href = loginUrl;
1335
- }
1336
- },
1337
- transformResponse: (data) => {
1338
- return data?.data ?? data;
1339
- }
1340
- });
1341
- window.StacksBrowser = {
1342
- browserQuery,
1343
- BrowserQueryBuilder,
1344
- BrowserQueryError,
1345
- browserAuth,
1346
- configureBrowser,
1347
- getBrowserConfig,
1348
- createBrowserDb,
1349
- createBrowserModel,
1350
- isBrowser,
1351
- ...exports_composables
1352
- };
1353
- loadBrowserModels();
1354
- window.dispatchEvent(new CustomEvent("stacks:api-ready"));
1355
- if (window.__STACKS_DEBUG__) {
1356
- console.debug("[Stacks] Browser API initialized:", baseUrl2);
1357
- }
1358
- }
1359
- autoInit();
1360
- // src/utils/base.ts
1361
- import { toString } from "@stacksjs/strings";
1362
- async function loop(times, callback) {
1363
- Array.from({ length: times }).forEach(async (_, i) => await callback(i));
1364
- }
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
- // src/utils/billable.ts
1533
- var stacksConfig2 = globalThis.__STACKS_CONFIG__ || {};
1534
- var publishableKey = stacksConfig2.FRONTEND_STRIPE_PUBLIC_KEY || "";
1535
- var client;
1536
- async function loadCardElement(clientSecret) {
1537
- client = await loadStripe(publishableKey);
1538
- const elements = client.elements({ clientSecret });
1539
- const cardElement = elements.create("card");
1540
- cardElement.mount("#card-element");
1541
- return cardElement;
1542
- }
1543
- async function loadPaymentElement(clientSecret) {
1544
- client = await loadStripe(publishableKey);
1545
- const elements = client.elements({ clientSecret });
1546
- const paymentElement = elements.create("payment", {
1547
- fields: { billingDetails: "auto" }
1548
- });
1549
- paymentElement.mount("#payment-element");
1550
- return elements;
1551
- }
1552
- async function confirmCardSetup(clientSecret, elements) {
1553
- const data = await client.confirmCardSetup(clientSecret, { payment_method: { card: elements } });
1554
- const { setupIntent, error } = data;
1555
- return { setupIntent, error };
1556
- }
1557
- async function confirmCardPayment(clientSecret, elements) {
1558
- try {
1559
- const data = await client.confirmCardPayment(clientSecret, {
1560
- payment_method: {
1561
- card: elements,
1562
- billing_details: {
1563
- name: stacksConfig2.USER_NAME || ""
1564
- }
1565
- }
1566
- });
1567
- const { paymentIntent, error } = data;
1568
- return { paymentIntent, error };
1569
- } catch (err) {
1570
- console.error("Error confirming card payment:", err);
1571
- return { paymentIntent: null, error: err };
1572
- }
1573
- }
1574
- async function createPaymentMethod(elements) {
1575
- try {
1576
- const data = await client.createPaymentMethod({
1577
- type: "card",
1578
- card: elements
1579
- });
1580
- const { paymentIntent, error } = data;
1581
- return { paymentIntent, error };
1582
- } catch (err) {
1583
- console.error("Error confirming card payment:", err);
1584
- return { paymentIntent: null, error: err };
1585
- }
1586
- }
1587
- async function confirmPayment(elements) {
1588
- try {
1589
- const data = await client.confirmPayment({
1590
- elements,
1591
- confirmParams: {
1592
- return_url: `${window.location.origin}/settings/billing`
1593
- }
1594
- });
1595
- const { paymentIntent, error } = data;
1596
- return { paymentIntent, error };
1597
- } catch (err) {
1598
- console.error("Error confirming card payment:", err);
1599
- return { paymentIntent: null, error: err };
1600
- }
1601
- }
1602
- // src/utils/date.ts
1603
- import { useDateFormat as useDateFormat2, useNow as useNow2 } from "@stacksjs/composables";
1604
- import { format, parse } from "@stacksjs/datetime";
1605
- // src/utils/debounce.ts
1606
- function debounce(fn, wait = 0, options = {}) {
1607
- const { leading = false, trailing = true } = options;
1608
- let timeout = null;
1609
- let lastArgs = null;
1610
- let lastThis = null;
1611
- let result;
1612
- const invokeFunc = () => {
1613
- if (lastArgs) {
1614
- result = fn.apply(lastThis, lastArgs);
1615
- lastArgs = null;
1616
- lastThis = null;
1617
- }
1618
- return result;
1619
- };
1620
- const cancel = () => {
1621
- if (timeout) {
1622
- clearTimeout(timeout);
1623
- timeout = null;
1624
- }
1625
- lastArgs = null;
1626
- lastThis = null;
1627
- };
1628
- const flush = () => {
1629
- if (timeout) {
1630
- clearTimeout(timeout);
1631
- timeout = null;
1632
- return invokeFunc();
1633
- }
1634
- return result;
1635
- };
1636
- const debounced = function(...args) {
1637
- lastArgs = args;
1638
- lastThis = this;
1639
- const shouldCallNow = leading && !timeout;
1640
- if (timeout)
1641
- clearTimeout(timeout);
1642
- timeout = setTimeout(() => {
1643
- timeout = null;
1644
- if (trailing && lastArgs)
1645
- invokeFunc();
1646
- }, wait);
1647
- if (shouldCallNow)
1648
- return invokeFunc();
1649
- return result;
1650
- };
1651
- debounced.cancel = cancel;
1652
- debounced.flush = flush;
1653
- return debounced;
1654
- }
1655
- // src/utils/fetch.ts
1656
- var loading = false;
1657
- var token2 = "";
1658
- var baseURL = "/";
1659
- function appendParam(search, key, value) {
1660
- if (value === undefined || value === null)
1661
- return;
1662
- if (Array.isArray(value)) {
1663
- for (const v of value)
1664
- appendParam(search, key, v);
1665
- return;
1666
- }
1667
- if (typeof value === "object") {
1668
- search.append(key, JSON.stringify(value));
1669
- return;
1670
- }
1671
- search.append(key, String(value));
1672
- }
1673
- function buildUrl(url, params) {
1674
- const absolute = /^https?:\/\//i.test(url);
1675
- const full = absolute ? url : `${baseURL.replace(/\/$/, "")}/${url.replace(/^\//, "")}`;
1676
- if (!params || Object.keys(params).length === 0)
1677
- return full;
1678
- const search = new URLSearchParams;
1679
- for (const [key, value] of Object.entries(params))
1680
- appendParam(search, key, value);
1681
- const qs = search.toString();
1682
- if (!qs)
1683
- return full;
1684
- return full.includes("?") ? `${full}&${qs}` : `${full}?${qs}`;
1685
- }
1686
- function applyAuth(headers) {
1687
- const h = headers ?? new Headers;
1688
- if (token2 && !h.has("Authorization"))
1689
- h.set("Authorization", `Bearer ${token2}`);
1690
- return h;
1691
- }
1692
- async function parseBody(response) {
1693
- const contentType = response.headers.get("content-type") ?? "";
1694
- if (contentType.includes("application/json"))
1695
- return await response.json();
1696
- if (contentType.startsWith("text/") || contentType.includes("xml"))
1697
- return await response.text();
1698
- return await response.blob();
1699
- }
1700
- async function request(method, url, params, headers) {
1701
- const sendsBody = method !== "GET" && method !== "DELETE";
1702
- const finalUrl = sendsBody ? buildUrl(url) : buildUrl(url, params);
1703
- const finalHeaders = applyAuth(headers);
1704
- const init = { method, headers: finalHeaders };
1705
- if (sendsBody && params !== undefined) {
1706
- if (!finalHeaders.has("Content-Type"))
1707
- finalHeaders.set("Content-Type", "application/json");
1708
- init.body = JSON.stringify(params);
1709
- }
1710
- if (sendsBody)
1711
- loading = true;
1712
- try {
1713
- const response = await fetch(finalUrl, init);
1714
- if (!response.ok) {
1715
- const errorBody = await parseBody(response).catch(() => null);
1716
- const error = new Error(`Request failed with status ${response.status}`);
1717
- error.status = response.status;
1718
- error.data = errorBody;
1719
- throw error;
1720
- }
1721
- return await parseBody(response);
1722
- } finally {
1723
- if (sendsBody)
1724
- loading = false;
1725
- }
1726
- }
1727
- async function get(url, params, headers) {
1728
- return await request("GET", url, params, headers);
1729
- }
1730
- async function post(url, params, headers) {
1731
- return await request("POST", url, params, headers);
1732
- }
1733
- async function patch(url, params, headers) {
1734
- return await request("PATCH", url, params, headers);
1735
- }
1736
- async function put(url, params, headers) {
1737
- return await request("PUT", url, params, headers);
1738
- }
1739
- async function destroy(url, params, headers) {
1740
- return await request("DELETE", url, params, headers);
1741
- }
1742
- function setToken(authToken) {
1743
- token2 = authToken;
1744
- }
1745
- var Fetch = {
1746
- get,
1747
- post,
1748
- patch,
1749
- put,
1750
- destroy,
1751
- baseURL,
1752
- token: token2,
1753
- setToken,
1754
- loading
1755
- };
1756
- // src/utils/function.ts
1757
- function batchInvoke(functions) {
1758
- functions.forEach((fn) => fn?.());
1759
- }
1760
- function tap(value, callback) {
1761
- callback(value);
1762
- return value;
1763
- }
1764
- // src/utils/guards.ts
1765
- function notNullish(v) {
1766
- return v != null;
1767
- }
1768
- function noNull(v) {
1769
- return v !== null;
1770
- }
1771
- function notUndefined(v) {
1772
- return v !== undefined;
1773
- }
1774
- function isTruthy(v) {
1775
- return Boolean(v);
1776
- }
1777
- // src/utils/lazy.ts
1778
- function lazy(getter) {
1779
- return {
1780
- get value() {
1781
- const value = getter();
1782
- Object.defineProperty(this, "value", { value });
1783
- return value;
1784
- }
1785
- };
1786
- }
1787
- // src/utils/math.ts
1788
- import {
1789
- and,
1790
- logicNot,
1791
- logicOr,
1792
- or,
1793
- useAbs,
1794
- useAverage,
1795
- useCeil,
1796
- useClamp,
1797
- useFloor,
1798
- useMax,
1799
- useMin,
1800
- usePrecision,
1801
- useRound,
1802
- useSum,
1803
- useTrunc
1804
- } from "@stacksjs/composables";
1805
- var clamp = (n, min, max) => Math.min(max, Math.max(min, n));
1806
- function rand(min, max) {
1807
- min = Math.ceil(min);
1808
- max = Math.floor(max);
1809
- return Math.floor(Math.random() * (max - min + 1)) + min;
1810
- }
1811
- // src/utils/plans.ts
1812
- var saas = {
1813
- plans: [
1814
- {
1815
- productName: "Stacks Hobby",
1816
- description: "All the Stacks features.",
1817
- pricing: [
1818
- {
1819
- key: "stacks_hobby_early_monthly",
1820
- price: 1900,
1821
- interval: "month",
1822
- currency: "usd"
1823
- },
1824
- {
1825
- key: "stacks_hobby_launch_monthly",
1826
- price: 2900,
1827
- interval: "month",
1828
- currency: "usd"
1829
- },
1830
- {
1831
- key: "stacks_hobby_monthly",
1832
- price: 3900,
1833
- interval: "month",
1834
- currency: "usd"
1835
- },
1836
- {
1837
- key: "stacks_hobby_yearly",
1838
- price: 37900,
1839
- interval: "year",
1840
- currency: "usd"
1841
- }
1842
- ],
1843
- metadata: {
1844
- createdBy: "admin",
1845
- version: "1.0.0"
1846
- }
1847
- },
1848
- {
1849
- productName: "Stacks Pro",
1850
- description: "All the Stacks features, including being able to invite team members.",
1851
- pricing: [
1852
- {
1853
- key: "stacks_pro_early_monthly",
1854
- price: 3900,
1855
- interval: "month",
1856
- currency: "usd"
1857
- },
1858
- {
1859
- key: "stacks_pro_monthly",
1860
- price: 5900,
1861
- interval: "month",
1862
- currency: "usd"
1863
- },
1864
- {
1865
- key: "stacks_pro_yearly",
1866
- price: 57900,
1867
- interval: "year",
1868
- currency: "usd"
1869
- },
1870
- {
1871
- key: "stacks_pro_early_yearly",
1872
- price: 39000,
1873
- interval: "year",
1874
- currency: "usd"
1875
- }
1876
- ],
1877
- metadata: {
1878
- createdBy: "admin",
1879
- version: "1.0.0"
1880
- }
1881
- },
1882
- {
1883
- productName: "Stacks Lifetime",
1884
- description: "One-time lifetime access to all Stacks features.",
1885
- pricing: [
1886
- {
1887
- key: "stacks_hobby_early_lifetime",
1888
- price: 17900,
1889
- currency: "usd"
1890
- },
1891
- {
1892
- key: "stacks_hobby_launch_lifetime",
1893
- price: 27900,
1894
- currency: "usd"
1895
- },
1896
- {
1897
- key: "stacks_hobby_lifetime",
1898
- price: 47900,
1899
- currency: "usd"
1900
- },
1901
- {
1902
- key: "stacks_pro_early_lifetime",
1903
- price: 27900,
1904
- currency: "usd"
1905
- },
1906
- {
1907
- key: "stacks_pro_launch_lifetime",
1908
- price: 37900,
1909
- currency: "usd"
1910
- },
1911
- {
1912
- key: "stacks_pro_lifetime",
1913
- price: 74900,
1914
- currency: "usd"
1915
- }
1916
- ],
1917
- metadata: {
1918
- createdBy: "admin",
1919
- version: "1.0.0"
1920
- }
1921
- }
1922
- ],
1923
- webhook: {
1924
- endpoint: "your-webhook-endpoint",
1925
- secret: "your-webhook-secret"
1926
- },
1927
- currencies: ["usd"],
1928
- coupons: [],
1929
- products: [
1930
- {
1931
- name: "Stacks Hobby",
1932
- description: "All the Stacks features.",
1933
- images: ["image-url"]
1934
- },
1935
- {
1936
- name: "Stacks Pro",
1937
- description: "All the Stacks features, including team invites.",
1938
- images: ["image-url"]
1939
- },
1940
- {
1941
- name: "Stacks Lifetime",
1942
- description: "Lifetime access to Stacks features.",
1943
- images: ["image-url"]
1944
- }
1945
- ]
1946
- };
1947
- // src/utils/promise.ts
1948
- function createSingletonPromise(fn) {
1949
- let _promise;
1950
- function wrapper() {
1951
- if (!_promise)
1952
- _promise = fn();
1953
- return _promise;
1954
- }
1955
- wrapper.reset = async () => {
1956
- const _prev = _promise;
1957
- _promise = undefined;
1958
- if (_prev)
1959
- await _prev;
1960
- };
1961
- return wrapper;
1962
- }
1963
- function createPromiseLock() {
1964
- let currentPromise = Promise.resolve();
1965
- const queue = [];
1966
- return {
1967
- async run(fn) {
1968
- const runTask = async () => {
1969
- await currentPromise;
1970
- return fn();
1971
- };
1972
- const taskPromise = runTask();
1973
- queue.push(taskPromise);
1974
- currentPromise = taskPromise.catch(() => {}).finally(() => {
1975
- const index = queue.indexOf(taskPromise);
1976
- if (index > -1)
1977
- queue.splice(index, 1);
1978
- });
1979
- return taskPromise;
1980
- },
1981
- async wait() {
1982
- while (queue.length > 0) {
1983
- await Promise.all(queue);
1984
- }
1985
- },
1986
- isWaiting() {
1987
- return queue.length > 0;
1988
- },
1989
- clear() {
1990
- queue.length = 0;
1991
- currentPromise = Promise.resolve();
1992
- }
1993
- };
1994
- }
1995
- function createControlledPromise() {
1996
- let resolve;
1997
- let reject;
1998
- const promise = new Promise((_resolve, _reject) => {
1999
- resolve = _resolve;
2000
- reject = _reject;
2001
- });
2002
- promise.resolve = resolve;
2003
- promise.reject = reject;
2004
- return promise;
2005
- }
2006
- // src/utils/random.ts
2007
- var POOL_SIZE_MULTIPLIER = 128;
2008
- var pool = null;
2009
- var poolOffset = 0;
2010
- var urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
2011
- function fillPool(bytes) {
2012
- if (!pool || pool.length < bytes) {
2013
- pool = new Uint8Array(bytes * POOL_SIZE_MULTIPLIER);
2014
- globalThis.crypto.getRandomValues(pool);
2015
- poolOffset = 0;
2016
- } else if (poolOffset + bytes > pool.length) {
2017
- globalThis.crypto.getRandomValues(pool);
2018
- poolOffset = 0;
2019
- }
2020
- poolOffset += bytes;
2021
- }
2022
- function randomPool(bytes) {
2023
- fillPool(bytes |= 0);
2024
- if (!pool) {
2025
- throw new Error("Pool is not initialized");
2026
- }
2027
- return pool.subarray(poolOffset - bytes, poolOffset);
2028
- }
2029
- function customRandom(alphabet, defaultSize, getRandom) {
2030
- const mask = (2 << 31 - Math.clz32(alphabet.length - 1 | 1)) - 1;
2031
- const step = Math.ceil(1.6 * mask * defaultSize / alphabet.length);
2032
- return (size = defaultSize) => {
2033
- let id = "";
2034
- while (true) {
2035
- const bytes = getRandom(step);
2036
- let i = step;
2037
- while (i--) {
2038
- const byte = bytes[i];
2039
- if (byte === undefined)
2040
- continue;
2041
- id += alphabet[byte & mask] || "";
2042
- if (id.length >= size)
2043
- return id;
2044
- }
2045
- }
2046
- };
2047
- }
2048
- function customAlphabet(alphabet, size = 21) {
2049
- return customRandom(alphabet, size, randomPool);
2050
- }
2051
- function randomNonSecure(size = 21) {
2052
- let id = "";
2053
- let i = size | 0;
2054
- while (i--) {
2055
- id += urlAlphabet[Math.random() * 64 | 0];
2056
- }
2057
- return id;
2058
- }
2059
- function random(size = 21) {
2060
- fillPool(size |= 0);
2061
- if (!pool) {
2062
- return "";
2063
- }
2064
- let id = "";
2065
- for (let i = poolOffset - size;i < poolOffset; i++) {
2066
- const byte = pool[i];
2067
- if (byte === undefined)
2068
- continue;
2069
- id += urlAlphabet[byte & 63];
2070
- }
2071
- return id;
2072
- }
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
- // src/utils/regex.ts
2174
- function createRegExp(pattern, options = {}) {
2175
- return new RegExp(pattern, options.flags);
2176
- }
2177
- // src/utils/retry.ts
2178
- function retry(fn, options = {}) {
2179
- const { retries = 3, initialDelay = 1000, backoffFactor = 2, jitter = true } = options;
2180
- return new Promise((resolve, reject) => {
2181
- let attemptCount = 0;
2182
- const attempt = async () => {
2183
- try {
2184
- resolve(await fn());
2185
- } catch (err) {
2186
- if (attemptCount >= retries) {
2187
- reject(err);
2188
- } else {
2189
- const delay = calculateDelay(attemptCount, initialDelay, backoffFactor, jitter);
2190
- setTimeout(() => attempt(), delay);
2191
- attemptCount++;
2192
- }
2193
- }
2194
- };
2195
- attempt();
2196
- });
2197
- }
2198
- function calculateDelay(attemptCount, initialDelay, backoffFactor, jitter) {
2199
- let delay = initialDelay * backoffFactor ** attemptCount;
2200
- if (jitter) {
2201
- const random2 = Math.random();
2202
- const jitterValue = delay * 0.3;
2203
- delay = delay + jitterValue * (random2 - 0.5) * 2;
2204
- }
2205
- return delay;
2206
- }
2207
- // src/utils/sleep.ts
2208
- function sleep(ms) {
2209
- if (ms < 0 || !Number.isInteger(ms)) {
2210
- throw new Error("sleep() requires a non-negative integer");
2211
- }
2212
- return new Promise((resolve) => setTimeout(resolve, ms));
2213
- }
2214
- function wait(ms) {
2215
- if (ms < 0 || !Number.isInteger(ms)) {
2216
- throw new Error("wait() requires a non-negative integer");
2217
- }
2218
- return new Promise((resolve) => setTimeout(resolve, ms));
2219
- }
2220
- function delay(ms) {
2221
- if (ms < 0 || !Number.isInteger(ms)) {
2222
- throw new Error("delay() requires a non-negative integer");
2223
- }
2224
- return new Promise((resolve) => setTimeout(resolve, ms));
2225
- }
2226
- function waitUntil(condition, options = {}) {
2227
- return new Promise((resolve) => {
2228
- const { interval, timeout } = normalizeOptions(options);
2229
- if (condition()) {
2230
- resolve();
2231
- return;
2232
- }
2233
- const check = () => {
2234
- if (condition()) {
2235
- resolve();
2236
- } else {
2237
- setTimeout(check, interval);
2238
- }
2239
- };
2240
- if (timeout) {
2241
- setTimeout(resolve, timeout);
2242
- }
2243
- check();
2244
- });
2245
- }
2246
- function normalizeOptions(options) {
2247
- if (typeof options === "number") {
2248
- return { interval: options, timeout: 0 };
2249
- }
2250
- return {
2251
- interval: options.interval ?? 100,
2252
- timeout: options.timeout ?? 0
2253
- };
2254
- }
2255
- function waitWhile(condition, options = {}) {
2256
- return new Promise((resolve) => {
2257
- const { interval = 100, timeout = 0 } = options;
2258
- if (!condition()) {
2259
- resolve();
2260
- return;
2261
- }
2262
- const check = () => {
2263
- if (!condition()) {
2264
- resolve();
2265
- } else {
2266
- setTimeout(check, interval);
2267
- }
2268
- };
2269
- if (timeout) {
2270
- setTimeout(resolve, timeout);
2271
- }
2272
- check();
2273
- });
2274
- }
2275
- // src/utils/throttle.ts
2276
- function throttle(fn, wait2 = 300) {
2277
- let inThrottle;
2278
- let lastFn;
2279
- let lastTime;
2280
- return function(...args) {
2281
- if (!inThrottle) {
2282
- fn.apply(this, args);
2283
- lastTime = Date.now();
2284
- inThrottle = true;
2285
- } else {
2286
- clearTimeout(lastFn);
2287
- lastFn = setTimeout(() => {
2288
- if (Date.now() - lastTime >= wait2) {
2289
- fn.apply(this, args);
2290
- lastTime = Date.now();
2291
- }
2292
- }, Math.max(wait2 - (Date.now() - lastTime), 0));
2293
- }
2294
- };
2295
- }
2296
- // src/utils/vendors.ts
2297
- import {
2298
- useDark as useDark2,
2299
- useDateFormat as useDateFormat3,
2300
- useFetch as useFetch2,
2301
- useNow as useNow3,
2302
- useOnline as useOnline2,
2303
- usePreferredDark as usePreferredDark2,
2304
- useStorage as useStorage3,
2305
- useToggle as useToggle2
2306
- } from "@stacksjs/composables";
2307
- import {
2308
- useHead,
2309
- useHead as useHead2,
2310
- renderHead
2311
- } from "@stacksjs/stx";
2312
- var DECIMAL_UNITS = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
2313
- var BINARY_UNITS = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
2314
- function readableSize(bytes, options = {}) {
2315
- const {
2316
- precision = 1,
2317
- binary = false,
2318
- space = true,
2319
- locale = "en-US",
2320
- minimumFractionDigits = 0,
2321
- maximumFractionDigits = precision
2322
- } = options;
2323
- if (!Number.isFinite(bytes))
2324
- throw new TypeError(`Expected a finite number, got ${typeof bytes}: ${bytes}`);
2325
- const isNegative = bytes < 0;
2326
- const prefix = isNegative ? "-" : "";
2327
- if (isNegative)
2328
- bytes = -bytes;
2329
- if (bytes < 1) {
2330
- const numberString2 = bytes.toLocaleString(locale, { minimumFractionDigits, maximumFractionDigits });
2331
- return `${prefix}${numberString2}${space ? " " : ""}B`;
2332
- }
2333
- const base = binary ? 1024 : 1000;
2334
- const units = binary ? BINARY_UNITS : DECIMAL_UNITS;
2335
- const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);
2336
- const value = bytes / base ** exponent;
2337
- const numberString = value.toLocaleString(locale, { minimumFractionDigits, maximumFractionDigits });
2338
- return `${prefix}${numberString}${space ? " " : ""}${units[exponent]}`;
2339
- }
3
+ export * from "./composables";
4
+ export * from "./utils";
5
+ export * from "./model-loader";
2340
6
  export {
2341
- wordChar,
2342
- wordBoundary,
2343
- word,
2344
- withIndices,
2345
- whitespace,
2346
- waitWhile,
2347
- waitUntil,
2348
- wait,
2349
- useWindowSize,
2350
- useWindowScroll,
2351
- useWindowFocus,
2352
- useWebWorkerFn,
2353
- useWebWorker,
2354
- useWebSocket,
2355
- useWebNotification,
2356
- useWakeLock,
2357
- useVibrate,
2358
- useUrlSearchParams,
2359
- useTrunc,
2360
- useTransition,
2361
- useTitle,
2362
- useTimestamp,
2363
- useTimeoutPoll,
2364
- useTimeoutFn,
2365
- useTimeout,
2366
- useTimeAgo,
2367
- useThrottleFn,
2368
- useTextSelection,
2369
- useTextDirection,
2370
- useSwipe,
2371
- useSupported,
2372
- useSum,
2373
- useStepper,
2374
- useShare,
2375
- useSessionStorage,
2376
- useScrollLock,
2377
- useScroll,
2378
- useScreenOrientation,
2379
- useRound,
2380
- useRafFn,
2381
- usePreferredReducedMotion,
2382
- usePreferredLanguages,
2383
- usePreferredContrast,
2384
- usePreferredColorScheme,
2385
- usePrecision,
2386
- usePointerSwipe,
2387
- usePointer,
2388
- usePermission,
2389
- usePageLeave,
2390
- useObjectUrl,
2391
- useNetwork,
2392
- useNavigatorLanguage,
2393
- useMousePressed,
2394
- useMouseInElement,
2395
- useMouse,
2396
- useMounted,
2397
- useMin,
2398
- useMemoize,
2399
- useMediaQuery,
2400
- useMax,
2401
- useMagicKeys,
2402
- useLocalStorage,
2403
- useKeyModifier,
2404
- useIntervalFn,
2405
- useInterval,
2406
- useInfiniteScroll,
2407
- useImage,
2408
- useIdle,
2409
- useGeolocation,
2410
- useFullscreen,
2411
- useFocusWithin,
2412
- useFocus,
2413
- useFloor,
2414
- useFileDialog,
2415
- useFavicon,
2416
- useEyeDropper,
2417
- useEventSource,
2418
- useEventListener,
2419
- useEventBus,
2420
- useElementVisibility,
2421
- useElementSize,
2422
- useElementHover,
2423
- useElementBounding,
2424
- useDropZone,
2425
- useDraggable,
2426
- useDocumentVisibility,
2427
- useDevicePixelRatio,
2428
- useDeviceOrientation,
2429
- useDeviceMotion,
2430
- useDebounceFn,
2431
- useCycleList,
2432
- useCssVar,
2433
- useCounter,
2434
- useConfirmDialog,
2435
- useColorMode,
2436
- useClipboardItems,
2437
- useClipboard,
2438
- useClamp,
2439
- useCeil,
2440
- useBrowserLocation,
2441
- useBroadcastChannel,
2442
- useBreakpoints,
2443
- useBattery,
2444
- useBase64,
2445
- useAverage,
2446
- useAuth,
2447
- useAnimate,
2448
- useActiveElement,
2449
- useAbs,
2450
- unicode,
2451
- toString,
2452
- throttle,
2453
- tap,
2454
- tab,
2455
- sticky,
2456
- sleep,
2457
- saas,
2458
- retry,
2459
- renderHead as renderHeadToString,
2460
- readableSize,
2461
- randomNonSecure,
2462
- random,
2463
- rand,
2464
- publishableKey,
2465
- parse,
2466
- or,
2467
- oneOrMore,
2468
- onStartTyping,
2469
- onLongPress,
2470
- onKeyUp,
2471
- onKeyStroke,
2472
- onKeyDown,
2473
- onClickOutside,
2474
- notUndefined,
2475
- notNullish,
2476
- not,
2477
- noNull,
2478
- multiline,
2479
- maybe,
2480
- loop,
2481
- logicOr,
2482
- logicNot,
2483
- loadPaymentElement,
2484
- loadCardElement,
2485
- loadBrowserModels,
2486
- linefeed,
2487
- letter,
2488
- lazy,
2489
- isTruthy,
2490
- isBrowser,
2491
- initApi,
2492
- global,
2493
- getRelativeTime,
2494
- getBrowserModelNames,
2495
- getBrowserModel,
2496
- getBrowserConfig,
2497
- formatElevation,
2498
- formatDuration,
2499
- formatDistance,
2500
- formatAreaSize,
2501
- format,
2502
- fetchData,
2503
- exactly,
2504
- dotAll,
2505
- digit,
2506
- delay,
2507
- debounce,
2508
- customRandom,
2509
- customAlphabet,
2510
- createSingletonPromise,
2511
- createRegExp,
2512
- createPromiseLock,
2513
- createPaymentMethod,
2514
- useHead as createHead,
2515
- createControlledPromise,
2516
- createBrowserModel,
2517
- createBrowserDb,
2518
- confirmPayment,
2519
- confirmCardSetup,
2520
- confirmCardPayment,
2521
- configureBrowser,
2522
- clamp,
2523
- charNotIn,
2524
- charIn,
2525
- char,
2526
- caseInsensitive,
2527
- carriageReturn,
2528
- calculateDelay,
2529
7
  browserQuery,
2530
- browserAuth,
2531
- breakpointsTailwind,
2532
- breakpointsBootstrapV5,
2533
- batchInvoke,
2534
- authGuard,
2535
- auth,
2536
- anyOf,
2537
- and,
2538
- TransitionPresets,
2539
- useHead2 as Head,
2540
- Fetch,
8
+ BrowserQueryBuilder,
2541
9
  BrowserQueryError,
2542
- BrowserQueryBuilder
2543
- };
10
+ browserAuth,
11
+ configureBrowser,
12
+ getBrowserConfig,
13
+ createBrowserDb,
14
+ createBrowserModel,
15
+ isBrowser
16
+ } from "bun-query-builder/browser";