@stacksjs/browser 0.70.57 → 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.
- package/dist/index.js +66 -1053
- 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
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
62
|
+
"@stacksjs/utils": "0.70.58"
|
|
63
63
|
}
|
|
64
64
|
}
|