@pol-studios/db 1.0.54 → 1.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/{DataLayerContext-C7cJtiO8.d.ts → DataLayerContext-BYZtDD0g.d.ts} +1 -1
  2. package/dist/auth/context.js +6 -4
  3. package/dist/auth/hooks.js +7 -5
  4. package/dist/auth/index.js +7 -5
  5. package/dist/{chunk-FIAXWEBK.js → chunk-4EO55YV2.js} +10 -7
  6. package/dist/chunk-4EO55YV2.js.map +1 -0
  7. package/dist/{chunk-DP3YEVSX.js → chunk-6SDH7M7J.js} +26 -10
  8. package/dist/chunk-6SDH7M7J.js.map +1 -0
  9. package/dist/{chunk-UJWETW36.js → chunk-AKIRHA4Q.js} +527 -418
  10. package/dist/chunk-AKIRHA4Q.js.map +1 -0
  11. package/dist/{chunk-2XS2PM62.js → chunk-DDL63KLQ.js} +388 -107
  12. package/dist/chunk-DDL63KLQ.js.map +1 -0
  13. package/dist/{chunk-YA6MUTA7.js → chunk-FI6JAD5G.js} +3 -3
  14. package/dist/{chunk-WQLIGVQR.js → chunk-GWYTROSD.js} +98 -1
  15. package/dist/chunk-GWYTROSD.js.map +1 -0
  16. package/dist/chunk-JOULSXOI.js +415 -0
  17. package/dist/chunk-JOULSXOI.js.map +1 -0
  18. package/dist/{chunk-OKYHI6JG.js → chunk-LF3V3ERS.js} +3 -3
  19. package/dist/{chunk-FMYXG4VN.js → chunk-MEBT5YHA.js} +2 -2
  20. package/dist/{chunk-BZSAPFFB.js → chunk-N4KK5G5T.js} +116 -18
  21. package/dist/chunk-N4KK5G5T.js.map +1 -0
  22. package/dist/chunk-QYAFI34Q.js +64 -0
  23. package/dist/chunk-QYAFI34Q.js.map +1 -0
  24. package/dist/{chunk-3Q74DK5K.js → chunk-VYFAMTHI.js} +2 -2
  25. package/dist/chunk-W7PERM66.js +215 -0
  26. package/dist/chunk-W7PERM66.js.map +1 -0
  27. package/dist/{chunk-ZGQ7Q4ZU.js → chunk-WM25QE7E.js} +2 -2
  28. package/dist/{chunk-HZIVE5AZ.js → chunk-YRIPM2AN.js} +253 -338
  29. package/dist/chunk-YRIPM2AN.js.map +1 -0
  30. package/dist/chunk-YUX6RGLZ.js +1858 -0
  31. package/dist/chunk-YUX6RGLZ.js.map +1 -0
  32. package/dist/{chunk-Z3EJX3VG.js → chunk-Z456IHCB.js} +3 -3
  33. package/dist/core/index.d.ts +24 -1
  34. package/dist/{executor-YJw4m7Q7.d.ts → executor-D15yjeMo.d.ts} +20 -0
  35. package/dist/hooks/index.d.ts +3 -3
  36. package/dist/hooks/index.js +4 -2
  37. package/dist/{index-jVYdTeWx.d.ts → index-CFUuTzXO.d.ts} +1 -1
  38. package/dist/index.d.ts +5 -5
  39. package/dist/index.js +16 -14
  40. package/dist/index.native.d.ts +62 -8
  41. package/dist/index.native.js +16 -14
  42. package/dist/index.web.d.ts +10 -9
  43. package/dist/index.web.js +30 -19
  44. package/dist/index.web.js.map +1 -1
  45. package/dist/mutation/index.js +3 -3
  46. package/dist/parser/index.js +3 -3
  47. package/dist/powersync-bridge/index.d.ts +1 -1
  48. package/dist/query/index.d.ts +4 -83
  49. package/dist/query/index.js +17 -7
  50. package/dist/realtime/index.d.ts +80 -1
  51. package/dist/realtime/index.js +14 -12
  52. package/dist/realtime/index.js.map +1 -1
  53. package/dist/select-parser-BAV7fOaM.d.ts +144 -0
  54. package/dist/types/index.d.ts +3 -3
  55. package/dist/types/index.js +4 -4
  56. package/dist/{useDbCount-DHLJzmkO.d.ts → useDbCount-Ckb-FhZk.d.ts} +1 -1
  57. package/dist/{useResolveFeedback-B0UcYWVI.d.ts → useResolveFeedback-CuUkdHoR.d.ts} +13 -29
  58. package/dist/with-auth/index.js +9 -7
  59. package/dist/with-auth/index.js.map +1 -1
  60. package/package.json +9 -4
  61. package/dist/chunk-2XS2PM62.js.map +0 -1
  62. package/dist/chunk-BZSAPFFB.js.map +0 -1
  63. package/dist/chunk-CTRY7JDP.js +0 -4112
  64. package/dist/chunk-CTRY7JDP.js.map +0 -1
  65. package/dist/chunk-DP3YEVSX.js.map +0 -1
  66. package/dist/chunk-FIAXWEBK.js.map +0 -1
  67. package/dist/chunk-HZIVE5AZ.js.map +0 -1
  68. package/dist/chunk-INEUG6MC.js +0 -521
  69. package/dist/chunk-INEUG6MC.js.map +0 -1
  70. package/dist/chunk-UJWETW36.js.map +0 -1
  71. package/dist/chunk-WQLIGVQR.js.map +0 -1
  72. /package/dist/{chunk-YA6MUTA7.js.map → chunk-FI6JAD5G.js.map} +0 -0
  73. /package/dist/{chunk-OKYHI6JG.js.map → chunk-LF3V3ERS.js.map} +0 -0
  74. /package/dist/{chunk-FMYXG4VN.js.map → chunk-MEBT5YHA.js.map} +0 -0
  75. /package/dist/{chunk-3Q74DK5K.js.map → chunk-VYFAMTHI.js.map} +0 -0
  76. /package/dist/{chunk-ZGQ7Q4ZU.js.map → chunk-WM25QE7E.js.map} +0 -0
  77. /package/dist/{chunk-Z3EJX3VG.js.map → chunk-Z456IHCB.js.map} +0 -0
@@ -0,0 +1,415 @@
1
+ import {
2
+ deepEqual,
3
+ flatten,
4
+ src_default
5
+ } from "./chunk-AKIRHA4Q.js";
6
+
7
+ // src/parser/lib/sort-search-param.ts
8
+ var sortSearchParams = (params) => new URLSearchParams(Array.from(params.entries()).sort((a, b) => {
9
+ const x = `${a[0]}${a[1]}`;
10
+ const y = `${b[0]}${b[1]}`;
11
+ return x > y ? 1 : -1;
12
+ }));
13
+
14
+ // src/parser/lib/encode-object.ts
15
+ var encodeObject = (obj) => {
16
+ const sortedEntries = Object.entries(flatten(obj)).sort(([a], [b]) => a.length - b.length);
17
+ const bodyParams = new URLSearchParams();
18
+ sortedEntries.forEach(([key, value]) => {
19
+ bodyParams.append(key, String(value));
20
+ });
21
+ return sortSearchParams(bodyParams).toString();
22
+ };
23
+
24
+ // src/parser/lib/is-object.ts
25
+ var isObject = (v) => typeof v === "object" && !Array.isArray(v) && v !== null;
26
+
27
+ // src/parser/lib/find-last-index.ts
28
+ function findLastIndex(array, predicate) {
29
+ let l = array.length;
30
+ while (l--) {
31
+ if (predicate(array[l], l, array)) return l;
32
+ }
33
+ return -1;
34
+ }
35
+
36
+ // src/parser/lib/is-not-null.ts
37
+ var isNotNull = (i) => i !== null;
38
+
39
+ // src/parser/lib/operators.ts
40
+ var buildLikeRegex = (search) => new RegExp(`^${search.replace(/%/g, ".*")}$`);
41
+ var textSearch = (c, v) => {
42
+ const regExp = `^${v.split("&").map((v2) => v2.trim().toLowerCase()).join("|").replace(/:\*/g, ".*")}$`;
43
+ const tokens = c.match(/'(.*?)'/g).map((t) => t.replace(/'/g, "").toLowerCase());
44
+ return tokens.some((t) => new RegExp(regExp).test(t));
45
+ };
46
+ var ifDateGetTime = (v) => v instanceof Date ? v.getTime() : v;
47
+ var enclose = (v, char) => {
48
+ if (!v.startsWith(char)) v = `${char}${v}`;
49
+ if (!v.endsWith(char)) v = `${v}${char}`;
50
+ return v;
51
+ };
52
+ var OPERATOR_MAP = {
53
+ eq: (c, v) => ifDateGetTime(c) === ifDateGetTime(v),
54
+ neq: (c, v) => ifDateGetTime(c) !== ifDateGetTime(v),
55
+ gt: (c, v) => c > v,
56
+ gte: (c, v) => c >= v,
57
+ lt: (c, v) => c < v,
58
+ lte: (c, v) => c <= v,
59
+ like: (c, v) => buildLikeRegex(v).test(c.toString()),
60
+ ilike: (c, v) => buildLikeRegex(v.toLowerCase()).test(c.toString().toLowerCase()),
61
+ is: (c, v) => c === v,
62
+ in: (c, v) => {
63
+ const parsedValue = v.slice(1, -1).split(",");
64
+ return parsedValue.some((i) => i === c);
65
+ },
66
+ // contains
67
+ cs: (c, v) => {
68
+ if (!Array.isArray(c)) return false;
69
+ if (!Array.isArray(v)) v = v.slice(1, -1).split(",");
70
+ return v.every((i) => c.some((colVal) => deepEqual(colVal, i)));
71
+ },
72
+ // containedBy
73
+ cd: (c, v) => {
74
+ if (!Array.isArray(c)) return false;
75
+ if (!Array.isArray(v)) v = v.slice(1, -1).split(",");
76
+ return c.every((i) => v.some((cmpVal) => deepEqual(cmpVal, i)));
77
+ },
78
+ fts: textSearch,
79
+ plfts: (c, v) => buildLikeRegex(enclose(v.toLowerCase(), "%")).test(c.toString().toLowerCase())
80
+ };
81
+
82
+ // src/parser/lib/parse-select-param.ts
83
+ var parseSelectParam = (s, currentPath) => {
84
+ s = s.replace(/\s/g, "");
85
+ const foreignTables = src_default.matchRecursive(`,${s}`, ",[^,]*\\(", "\\)", "g", {
86
+ valueNames: {
87
+ "0": null,
88
+ "1": "tableName",
89
+ "2": "selectedColumns",
90
+ "3": null
91
+ }
92
+ }).reduce((prev, curr, idx, matches) => {
93
+ if (curr.name === "selectedColumns") {
94
+ const name = matches[idx - 1].value.slice(1, -1);
95
+ prev = {
96
+ ...prev,
97
+ [name]: curr.value
98
+ };
99
+ }
100
+ return prev;
101
+ }, {});
102
+ const columns = s.replace(new RegExp(`${Object.entries(foreignTables).map(([table, selectedColumns]) => `${table}(${selectedColumns})`.replace(/\(/g, "\\(").replace(/\)/g, "\\)")).join("|")}`, "g"), "").replace(/(,)\1+/g, ",").split(",").filter((c) => c.length > 0).map((c) => {
103
+ const split = c.split(":");
104
+ const hasAlias = split.length > 1;
105
+ return {
106
+ declaration: [currentPath?.declaration, c].filter(Boolean).join("."),
107
+ alias: hasAlias || currentPath?.alias ? [currentPath?.alias ?? currentPath?.path, split[0]].filter(Boolean).join(".") : void 0,
108
+ path: [currentPath?.path, split[hasAlias ? 1 : 0]].filter(Boolean).join(".")
109
+ };
110
+ });
111
+ return [...columns, ...Object.entries(foreignTables).flatMap(([currentDeclaration, selectedColumns]) => {
112
+ const aliasSplit = currentDeclaration.split(":");
113
+ const currentAliasElem = aliasSplit.length > 1 ? aliasSplit[0] : void 0;
114
+ const currentPathDeclaration = aliasSplit[aliasSplit.length - 1];
115
+ const currentPathElem = currentPathDeclaration.split("!")[0];
116
+ const path = [currentPath?.path, currentPathElem].filter(Boolean).join(".");
117
+ const alias = [currentPath?.alias ?? currentPath?.path, currentAliasElem ?? currentPathElem].filter(Boolean).join(".");
118
+ const declaration = [currentPath?.declaration, currentDeclaration].filter(Boolean).join(".");
119
+ return parseSelectParam(`${selectedColumns}`, {
120
+ path,
121
+ alias: currentPath?.alias || currentAliasElem ? alias : void 0,
122
+ declaration
123
+ });
124
+ })];
125
+ };
126
+
127
+ // src/parser/lib/is-iso-date-string.ts
128
+ var isISODateString = (v) => typeof v === "string" && /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/.test(v);
129
+
130
+ // src/parser/lib/parse-value.ts
131
+ var parseValue = (v) => {
132
+ if (isISODateString(v)) return new Date(v);
133
+ try {
134
+ return JSON.parse(v);
135
+ } catch {
136
+ return v;
137
+ }
138
+ };
139
+
140
+ // src/parser/postgrest-query-parser.ts
141
+ var SUPPORTED_OPERATORS = ["or", ...Object.keys(OPERATOR_MAP)];
142
+ var PostgrestQueryParser = class {
143
+ constructor(query, opts) {
144
+ this.opts = opts;
145
+ this._params = new URLSearchParams(query);
146
+ }
147
+ _params;
148
+ _filters;
149
+ _paths;
150
+ /**
151
+ * Getter that returns the paths and their aliases that the query selects. Will do the computation only once.
152
+ *
153
+ * ```js
154
+ * const p = new PostgrestParser(
155
+ * supabaseClient.from("test")
156
+ * .select(
157
+ * `name,
158
+ * city:cities (
159
+ * test:name
160
+ * ),
161
+ * countries (
162
+ * capital,
163
+ * population,
164
+ * some_ref (
165
+ * test:first,
166
+ * second
167
+ * )
168
+ * )`
169
+ * );
170
+ * console.log(p.paths);
171
+ * // [
172
+ * // { alias: undefined, path: "name" },
173
+ * // { alias: "city.test", path: "cities.name" },
174
+ * // { alias: undefined, path: "countries.capital" },
175
+ * // { alias: undefined, path: "countries.population" },
176
+ * // {
177
+ * // alias: "countries.some_ref.test",
178
+ * // path: "countries.some_ref.first",
179
+ * // },
180
+ * // { alias: undefined, path: "countries.some_ref.second" },
181
+ * // ];
182
+ * ```
183
+ *
184
+ * @returns an array of paths that the query selects, containing the columns and aliases
185
+ */
186
+ get paths() {
187
+ if (!this._paths) {
188
+ const select = this._params.get("select");
189
+ this._paths = select ? parseSelectParam(select) : [];
190
+ }
191
+ return this._paths;
192
+ }
193
+ /**
194
+ * Getter that returns the filters that this query applies in a json object.
195
+ *
196
+ * ```js
197
+ * const p = new PostgrestParser(
198
+ * supabaseClient.from("test").select('*')
199
+ * .or("full_name.eq.20,test.neq.true,and(full_name.eq.Test Name,email.eq.test@mail.com)")
200
+ * .eq("id", "123")
201
+ * .contains("id", "456")
202
+ * );
203
+ *
204
+ * console.log(p.filters);
205
+ *
206
+ * // [
207
+ * // {
208
+ * // or: [
209
+ * // {
210
+ * // path: "full_name",
211
+ * // negate: false,
212
+ * // operator: "eq",
213
+ * // value: 20,
214
+ * // },
215
+ * // {
216
+ * // path: "test",
217
+ * // negate: false,
218
+ * // operator: "neq",
219
+ * // value: true,
220
+ * // },
221
+ * // {
222
+ * // and: [
223
+ * // {
224
+ * // path: "full_name",
225
+ * // negate: false,
226
+ * // operator: "eq",
227
+ * // value: "Test Name",
228
+ * // },
229
+ * // {
230
+ * // path: "email",
231
+ * // negate: false,
232
+ * // operator: "eq",
233
+ * // value: "test@mail.com",
234
+ * // },
235
+ * // ],
236
+ * // },
237
+ * // ],
238
+ * // },
239
+ * // {
240
+ * // path: "id",
241
+ * // negate: false,
242
+ * // operator: "eq",
243
+ * // value: 123,
244
+ * // },
245
+ * // {
246
+ * // path: "id",
247
+ * // negate: false,
248
+ * // operator: "cs",
249
+ * // value: 456,
250
+ * // },
251
+ * // ];
252
+ * ```
253
+ *
254
+ * @returns a FilterDefinitions object
255
+ */
256
+ get filters() {
257
+ if (!this._filters) {
258
+ const filters = [];
259
+ this._params.forEach((value, key) => {
260
+ if (SUPPORTED_OPERATORS.some((f) => key === f || value.split(".").includes(f))) {
261
+ const filter = this.parseFilterString(`${key}.${value}`, void 0);
262
+ if (filter !== null) filters.push(filter);
263
+ }
264
+ });
265
+ this._filters = filters;
266
+ }
267
+ return this._filters;
268
+ }
269
+ parseFilterString(filter, prefix) {
270
+ if (filter.startsWith("and(") && filter.endsWith(")")) {
271
+ const andFilters = filter.slice(4, -1).split(",").map((s) => this.parseFilterString(s, prefix)).filter(isNotNull);
272
+ if (andFilters.length === 0) return null;
273
+ else return {
274
+ and: andFilters
275
+ };
276
+ }
277
+ const split = filter.split(".");
278
+ if ([split[0], split[1]].includes("or")) {
279
+ let foreignTable;
280
+ if (split[1] === "or") {
281
+ foreignTable = split[0];
282
+ }
283
+ const orFilters = filter.slice(4 + (foreignTable ? foreignTable.length + 1 : 0), -1).split(",").reduce((prev, curr, idx, filters) => {
284
+ if (curr.startsWith("and(")) {
285
+ prev = [...prev, [curr, filters[idx + 1]].join()];
286
+ } else if (!curr.endsWith(")")) {
287
+ prev = [...prev, curr];
288
+ }
289
+ return prev;
290
+ }, []).map((s) => this.parseFilterString(s, foreignTable)).filter(isNotNull);
291
+ if (orFilters.length === 0) return null;
292
+ else return {
293
+ or: orFilters
294
+ };
295
+ }
296
+ const operatorIdx = findLastIndex(split, (s) => SUPPORTED_OPERATORS.includes(s));
297
+ if (operatorIdx === -1) throw new Error(`Could not find a valid operator in ${split.join(".")}. Supported are ${SUPPORTED_OPERATORS.join(",")}.`);
298
+ const negate = split[operatorIdx - 1] === "not";
299
+ const pathOrAlias = [prefix, ...split.slice(0, negate ? operatorIdx - 1 : operatorIdx)].filter(Boolean).join(".").replace(/\s/g, "");
300
+ let path = pathOrAlias;
301
+ let alias;
302
+ for (const p of this.paths) {
303
+ if (p.path === pathOrAlias) {
304
+ alias = p.alias;
305
+ break;
306
+ }
307
+ if (p.alias === pathOrAlias) {
308
+ path = p.path;
309
+ alias = p.alias;
310
+ break;
311
+ }
312
+ }
313
+ if (this.opts && Array.isArray(this.opts.exclusivePaths) && !this.opts.exclusivePaths.includes(path)) {
314
+ return null;
315
+ }
316
+ const operator = split[operatorIdx];
317
+ const value = split.slice(operatorIdx + 1).join(".");
318
+ return {
319
+ path,
320
+ alias,
321
+ negate,
322
+ operator,
323
+ value: parseValue(value)
324
+ };
325
+ }
326
+ };
327
+
328
+ // src/parser/PostgrestParser.ts
329
+ var PostgrestParser = class extends PostgrestQueryParser {
330
+ constructor(fb, opts) {
331
+ super(new URL(fb["url"]).searchParams.toString(), opts);
332
+ this.opts = opts;
333
+ this._url = new URL(fb["url"]);
334
+ const headers = fb["headers"];
335
+ this._headers = Object.fromEntries(headers.entries());
336
+ this._body = isObject(fb["body"]) ? {
337
+ ...fb["body"]
338
+ } : void 0;
339
+ this.method = fb["method"];
340
+ this.searchParams = this._url.searchParams;
341
+ this.queryKey = sortSearchParams(this._url.searchParams).toString();
342
+ this.select = this._url.searchParams.get("select")?.toString() ?? "*";
343
+ this.table = this._url.toString().split("/rest/v1/").pop().split("?").shift();
344
+ if (this._body) {
345
+ this.bodyKey = encodeObject(this._body);
346
+ }
347
+ const preferHeaders = (this._headers["Prefer"] ?? "").split(",").reduce((prev, curr) => {
348
+ const s = curr.split("=");
349
+ return {
350
+ ...prev,
351
+ [s[0]]: s[1]
352
+ };
353
+ }, {});
354
+ this.count = preferHeaders["count"] ?? null;
355
+ this.schema = fb["schema"];
356
+ this.isHead = this.method === "HEAD";
357
+ const limit = this._url.searchParams.get("limit");
358
+ this.limit = limit ? Number(limit) : void 0;
359
+ const offset = this._url.searchParams.get("offset");
360
+ this.offset = offset ? Number(offset) : void 0;
361
+ this._url.searchParams.forEach((value, key) => {
362
+ const split = key.split(".");
363
+ if (split[split.length === 2 ? 1 : 0] === "order") {
364
+ const orderByDefs = value.split(",");
365
+ orderByDefs.forEach((def) => {
366
+ const [column, ascending, nullsFirst] = def.split(".");
367
+ this.orderBy.push({
368
+ ascending: ascending === "asc",
369
+ column,
370
+ nullsFirst: nullsFirst === "nullsfirst",
371
+ foreignTable: split.length === 2 ? split[0] : void 0
372
+ });
373
+ });
374
+ }
375
+ });
376
+ this.orderByKey = this.orderBy.map(({
377
+ column,
378
+ ascending,
379
+ nullsFirst,
380
+ foreignTable
381
+ }) => `${foreignTable ? `${foreignTable}.` : ""}${column}:${ascending ? "asc" : "desc"}.${nullsFirst ? "nullsFirst" : "nullsLast"}`).join("|");
382
+ }
383
+ _url;
384
+ _headers;
385
+ _body;
386
+ method;
387
+ select;
388
+ queryKey;
389
+ bodyKey;
390
+ count;
391
+ schema;
392
+ table;
393
+ isHead;
394
+ limit;
395
+ offset;
396
+ orderBy = [];
397
+ orderByKey;
398
+ searchParams;
399
+ };
400
+
401
+ export {
402
+ sortSearchParams,
403
+ encodeObject,
404
+ isObject,
405
+ findLastIndex,
406
+ isNotNull,
407
+ OPERATOR_MAP,
408
+ parseSelectParam,
409
+ isISODateString,
410
+ parseValue,
411
+ SUPPORTED_OPERATORS,
412
+ PostgrestQueryParser,
413
+ PostgrestParser
414
+ };
415
+ //# sourceMappingURL=chunk-JOULSXOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parser/lib/sort-search-param.ts","../src/parser/lib/encode-object.ts","../src/parser/lib/is-object.ts","../src/parser/lib/find-last-index.ts","../src/parser/lib/is-not-null.ts","../src/parser/lib/operators.ts","../src/parser/lib/parse-select-param.ts","../src/parser/lib/is-iso-date-string.ts","../src/parser/lib/parse-value.ts","../src/parser/postgrest-query-parser.ts","../src/parser/PostgrestParser.ts"],"sourcesContent":["export const sortSearchParams = (params: URLSearchParams) => new URLSearchParams(Array.from(params.entries()).sort((a, b) => {\n const x = `${a[0]}${a[1]}`;\n const y = `${b[0]}${b[1]}`;\n return x > y ? 1 : -1;\n}));","import { flatten } from \"flat\";\nimport { sortSearchParams } from \"./sort-search-param\";\n\n/**\n * Encodes an object by url-encoding an ordered lists of all paths and their values.\n */\nexport const encodeObject = (obj: Record<string, unknown>): string => {\n const sortedEntries = Object.entries(flatten(obj) as Record<string, unknown>).sort(([a], [b]) => a.length - b.length);\n const bodyParams = new URLSearchParams();\n sortedEntries.forEach(([key, value]) => {\n bodyParams.append(key, String(value));\n });\n return sortSearchParams(bodyParams).toString();\n};","export const isObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && !Array.isArray(v) && v !== null;","/**\n * Returns the index of the last element in the array where predicate is true, and -1\n * otherwise.\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLastIndex<T>(array: T[], predicate: (value: T, index: number, obj: T[]) => boolean): number {\n let l = array.length;\n while (l--) {\n if (predicate(array[l], l, array)) return l;\n }\n return -1;\n}","/**\n *\n * @param i Ahhh gotta love typescript\n * @returns\n */\nexport const isNotNull = <I,>(i: I | null): i is I => i !== null;","import { deepEqual } from 'fast-equals';\nimport { PostgrestFilterOperator, OperatorFn } from './query-types';\n\n/**\n * Builds a regex for a (i)like postgres operator by replacing the \"%\" with a regex wildcard \".*\"\n * @param search The search value\n * @returns A RegExp representing the (i)like operation\n */\nconst buildLikeRegex = (search: string) => new RegExp(`^${search.replace(/%/g, '.*')}$`);\n\n/**\n * A poor humans attempt to implement postgres text search in javascript.\n * Converts the search string into a regex before testing it against all tokens.\n */\nconst textSearch: OperatorFn = (c, v) => {\n const regExp = `^${v.split('&').map((v: string) => v.trim().toLowerCase()).join('|').replace(/:\\*/g, '.*')}$`;\n const tokens = c.match(/'(.*?)'/g).map((t: string) => t.replace(/'/g, '').toLowerCase());\n return tokens.some((t: string) => new RegExp(regExp).test(t));\n};\n\n/**\n * Date instances do not work with equality operators, which is why their times are compared instead.\n *\n * ref: https://stackoverflow.com/questions/492994/compare-two-dates-with-javascript\n * @param v The input value\n * @returns If the input value is an instanceof Date, return v.getTime(), else the input value\n */\nconst ifDateGetTime = (v: any) => v instanceof Date ? v.getTime() : v;\nconst enclose = (v: string, char: string) => {\n if (!v.startsWith(char)) v = `${char}${v}`;\n if (!v.endsWith(char)) v = `${v}${char}`;\n return v;\n};\n\n/**\n * An object containing all PostgrestFilterOperator implementations\n */\nexport const OPERATOR_MAP: { [Key in PostgrestFilterOperator]?: OperatorFn } = {\n eq: (c, v) => ifDateGetTime(c) === ifDateGetTime(v),\n neq: (c, v) => ifDateGetTime(c) !== ifDateGetTime(v),\n gt: (c, v) => c > v,\n gte: (c, v) => c >= v,\n lt: (c, v) => c < v,\n lte: (c, v) => c <= v,\n like: (c, v) => buildLikeRegex(v).test(c.toString()),\n ilike: (c, v) => buildLikeRegex(v.toLowerCase()).test(c.toString().toLowerCase()),\n is: (c, v) => c === v,\n in: (c, v) => {\n const parsedValue = v.slice(1, -1).split(',');\n return parsedValue.some((i: string) => i === c);\n },\n // contains\n cs: (c, v) => {\n if (!Array.isArray(c)) return false;\n if (!Array.isArray(v)) v = v.slice(1, -1).split(',');\n return v.every((i: string) => c.some(colVal => deepEqual(colVal, i)));\n },\n // containedBy\n cd: (c, v) => {\n if (!Array.isArray(c)) return false;\n if (!Array.isArray(v)) v = v.slice(1, -1).split(',');\n return c.every((i: string) => v.some((cmpVal: any) => deepEqual(cmpVal, i)));\n },\n fts: textSearch,\n plfts: (c, v) => buildLikeRegex(enclose(v.toLowerCase(), '%')).test(c.toString().toLowerCase())\n};","import XRegExp from \"xregexp\";\nimport { Path } from \"./query-types\";\nexport const parseSelectParam = (s: string, currentPath?: Path): Path[] => {\n s = s.replace(/\\s/g, \"\");\n const foreignTables = XRegExp.matchRecursive(`,${s}`, \",[^,]*\\\\(\", \"\\\\)\", \"g\", {\n valueNames: {\n \"0\": null,\n \"1\": \"tableName\",\n \"2\": \"selectedColumns\",\n \"3\": null\n }\n }).reduce((prev, curr, idx, matches) => {\n if (curr.name === \"selectedColumns\") {\n const name = matches[idx - 1].value.slice(1, -1);\n prev = {\n ...prev,\n [name]: curr.value\n };\n }\n return prev;\n }, {});\n const columns = s.replace(new RegExp(`${Object.entries(foreignTables).map(([table, selectedColumns]) => `${table}(${selectedColumns})`.replace(/\\(/g, \"\\\\(\").replace(/\\)/g, \"\\\\)\")).join(\"|\")}`, \"g\"), \"\").replace(/(,)\\1+/g, \",\").split(\",\").filter(c => c.length > 0).map(c => {\n const split = c.split(\":\");\n const hasAlias = split.length > 1;\n return {\n declaration: [currentPath?.declaration, c].filter(Boolean).join(\".\"),\n alias: hasAlias || currentPath?.alias ? [currentPath?.alias ?? currentPath?.path, split[0]].filter(Boolean).join(\".\") : undefined,\n path: [currentPath?.path, split[hasAlias ? 1 : 0]].filter(Boolean).join(\".\")\n };\n });\n\n // if (columns.find((c) => c.path.includes('*')))\n // throw new Error('Wildcard selector is not supported');\n\n return [...columns, ...Object.entries(foreignTables).flatMap(([currentDeclaration, selectedColumns]) => {\n // example for declaration\n // alias:organisation!contact_organisation_id_fkey!inner\n const aliasSplit = currentDeclaration.split(\":\");\n const currentAliasElem = aliasSplit.length > 1 ? aliasSplit[0] : undefined;\n const currentPathDeclaration = aliasSplit[aliasSplit.length - 1];\n const currentPathElem = currentPathDeclaration.split(\"!\")[0];\n const path = [currentPath?.path, currentPathElem].filter(Boolean).join(\".\");\n const alias = [currentPath?.alias ?? currentPath?.path, currentAliasElem ?? currentPathElem].filter(Boolean).join(\".\");\n const declaration = [currentPath?.declaration, currentDeclaration].filter(Boolean).join(\".\");\n return parseSelectParam(`${selectedColumns}`, {\n path,\n alias: currentPath?.alias || currentAliasElem ? alias : undefined,\n declaration\n });\n })];\n};","/**\n * Check if a value is a valid ISO DateTime string\n * @param v\n * @returns\n */\nexport const isISODateString = (v: unknown): boolean => typeof v === 'string' && /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/.test(v);","import { isISODateString } from './is-iso-date-string';\nimport { ValueType } from './query-types';\n\n/**\n * Safely parse any value to a ValueType\n * @param v Any value\n * @returns a ValueType\n */\nexport const parseValue = (v: any): ValueType => {\n if (isISODateString(v)) return new Date(v);\n try {\n return JSON.parse(v);\n } catch {\n return v;\n }\n};","import { findLastIndex } from './lib/find-last-index';\nimport { isNotNull } from './lib/is-not-null';\nimport { OPERATOR_MAP } from './lib/operators';\nimport { parseSelectParam } from './lib/parse-select-param';\nimport { parseValue } from './lib/parse-value';\nimport { FilterDefinition, FilterDefinitions, PostgrestFilterOperator, Path } from './lib/query-types';\nexport const SUPPORTED_OPERATORS = ['or', ...Object.keys(OPERATOR_MAP)];\nexport type PostgrestQueryParserOptions = {\n /**\n * If defined, will use only filters that apply to the given paths\n */\n exclusivePaths?: string[];\n};\nexport class PostgrestQueryParser {\n private readonly _params: URLSearchParams;\n private _filters: FilterDefinitions | undefined;\n private _paths: Path[] | undefined;\n constructor(query: string, public readonly opts?: PostgrestQueryParserOptions) {\n this._params = new URLSearchParams(query);\n }\n\n /**\n * Getter that returns the paths and their aliases that the query selects. Will do the computation only once.\n *\n * ```js\n * const p = new PostgrestParser(\n * supabaseClient.from(\"test\")\n * .select(\n * `name,\n * city:cities (\n * test:name\n * ),\n * countries (\n * capital,\n * population,\n * some_ref (\n * test:first,\n * second\n * )\n * )`\n * );\n * console.log(p.paths);\n * // [\n * // { alias: undefined, path: \"name\" },\n * // { alias: \"city.test\", path: \"cities.name\" },\n * // { alias: undefined, path: \"countries.capital\" },\n * // { alias: undefined, path: \"countries.population\" },\n * // {\n * // alias: \"countries.some_ref.test\",\n * // path: \"countries.some_ref.first\",\n * // },\n * // { alias: undefined, path: \"countries.some_ref.second\" },\n * // ];\n * ```\n *\n * @returns an array of paths that the query selects, containing the columns and aliases\n */\n get paths(): Path[] {\n if (!this._paths) {\n const select = this._params.get('select');\n this._paths = select ? parseSelectParam(select) : [];\n }\n return this._paths;\n }\n\n /**\n * Getter that returns the filters that this query applies in a json object.\n *\n * ```js\n * const p = new PostgrestParser(\n * supabaseClient.from(\"test\").select('*')\n * .or(\"full_name.eq.20,test.neq.true,and(full_name.eq.Test Name,email.eq.test@mail.com)\")\n * .eq(\"id\", \"123\")\n * .contains(\"id\", \"456\")\n * );\n *\n * console.log(p.filters);\n *\n * // [\n * // {\n * // or: [\n * // {\n * // path: \"full_name\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: 20,\n * // },\n * // {\n * // path: \"test\",\n * // negate: false,\n * // operator: \"neq\",\n * // value: true,\n * // },\n * // {\n * // and: [\n * // {\n * // path: \"full_name\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: \"Test Name\",\n * // },\n * // {\n * // path: \"email\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: \"test@mail.com\",\n * // },\n * // ],\n * // },\n * // ],\n * // },\n * // {\n * // path: \"id\",\n * // negate: false,\n * // operator: \"eq\",\n * // value: 123,\n * // },\n * // {\n * // path: \"id\",\n * // negate: false,\n * // operator: \"cs\",\n * // value: 456,\n * // },\n * // ];\n * ```\n *\n * @returns a FilterDefinitions object\n */\n get filters(): FilterDefinitions {\n if (!this._filters) {\n const filters: FilterDefinitions = [];\n this._params.forEach((value, key) => {\n if (SUPPORTED_OPERATORS.some(f => key === f || value.split('.').includes(f))) {\n const filter = this.parseFilterString(`${key}.${value}`, undefined);\n if (filter !== null) filters.push(filter);\n }\n });\n this._filters = filters;\n }\n return this._filters;\n }\n private parseFilterString(filter: string, prefix?: string): FilterDefinition | {\n or: FilterDefinitions;\n } | {\n and: FilterDefinitions;\n } | null {\n if (filter.startsWith('and(') && filter.endsWith(')')) {\n // nested and\n const andFilters = filter.slice(4, -1).split(',').map(s => this.parseFilterString(s, prefix)).filter(isNotNull);\n if (andFilters.length === 0) return null;else return {\n and: andFilters\n };\n }\n const split = filter.split('.');\n\n // or\n if ([split[0], split[1]].includes('or')) {\n let foreignTable: string | undefined;\n if (split[1] === 'or') {\n // with foreign table\n foreignTable = split[0];\n }\n const orFilters = filter.slice(4 + (foreignTable ? foreignTable.length + 1 : 0), -1).split(',').reduce<string[]>((prev, curr, idx, filters) => {\n if (curr.startsWith('and(')) {\n // nested and\n prev = [...prev, [curr, filters[idx + 1]].join()];\n } else if (!curr.endsWith(')')) {\n prev = [...prev, curr];\n }\n return prev;\n }, []).map(s => this.parseFilterString(s, foreignTable)).filter(isNotNull);\n if (orFilters.length === 0) return null;else return {\n or: orFilters\n };\n }\n const operatorIdx = findLastIndex(split, s => SUPPORTED_OPERATORS.includes(s));\n if (operatorIdx === -1) throw new Error(`Could not find a valid operator in ${split.join('.')}. Supported are ${SUPPORTED_OPERATORS.join(',')}.`);\n const negate = split[operatorIdx - 1] === 'not';\n const pathOrAlias = [prefix, ...split.slice(0, negate ? operatorIdx - 1 : operatorIdx)].filter(Boolean).join('.').replace(/\\s/g, '');\n let path = pathOrAlias;\n let alias;\n // filter paths can use either the real path or the alias\n // search for alias and path in paths of query\n // if none is found, its a path because the alias would need to be defined\n // in the query\n for (const p of this.paths) {\n if (p.path === pathOrAlias) {\n alias = p.alias;\n break;\n }\n if (p.alias === pathOrAlias) {\n path = p.path;\n alias = p.alias;\n break;\n }\n }\n if (this.opts && Array.isArray(this.opts.exclusivePaths) && !this.opts.exclusivePaths.includes(path)) {\n return null;\n }\n const operator = split[operatorIdx] as PostgrestFilterOperator;\n const value = split.slice(operatorIdx + 1).join('.');\n return {\n path,\n alias,\n negate,\n operator,\n value: parseValue(value)\n };\n }\n}","import { PostgrestBuilder } from \"@supabase/postgrest-js\";\nimport { encodeObject } from \"./lib/encode-object\";\nimport { isObject } from \"./lib/is-object\";\nimport { OrderDefinition } from \"./lib/query-types\";\nimport { sortSearchParams } from \"./lib/sort-search-param\";\nimport { PostgrestQueryParser, PostgrestQueryParserOptions } from \"./postgrest-query-parser\";\nexport class PostgrestParser<Result> extends PostgrestQueryParser {\n private readonly _url: URL;\n private readonly _headers: {\n [key: string]: string;\n };\n private readonly _body: object | undefined;\n public readonly method: \"GET\" | \"HEAD\" | \"POST\" | \"PATCH\" | \"DELETE\";\n public readonly select: string;\n public readonly queryKey: string;\n public readonly bodyKey: string | undefined;\n public readonly count: string | null;\n public readonly schema: string;\n public readonly table: string;\n public readonly isHead: boolean | undefined;\n public readonly limit: number | undefined;\n public readonly offset: number | undefined;\n public readonly orderBy: OrderDefinition[] = [];\n public readonly orderByKey: string;\n public readonly searchParams: URLSearchParams;\n constructor(fb: PostgrestBuilder<any, Result>, public readonly opts?: PostgrestQueryParserOptions) {\n super(new URL(fb[\"url\"]).searchParams.toString(), opts);\n this._url = new URL(fb[\"url\"]);\n // Convert Headers object to plain object\n const headers = fb[\"headers\"] as Headers;\n this._headers = Object.fromEntries(headers.entries());\n this._body = isObject(fb[\"body\"]) ? {\n ...fb[\"body\"]\n } : undefined;\n this.method = fb[\"method\"];\n this.searchParams = this._url.searchParams;\n this.queryKey = sortSearchParams(this._url.searchParams).toString();\n this.select = this._url.searchParams.get(\"select\")?.toString() ?? \"*\";\n this.table = (this._url.toString().split(\"/rest/v1/\").pop() as string).split(\"?\").shift() as string;\n if (this._body) {\n this.bodyKey = encodeObject(this._body as Record<string, unknown>);\n }\n\n // 'Prefer': return=minimal|representation,count=exact|planned|estimated\n const preferHeaders: Record<string, string> = (this._headers[\"Prefer\"] ?? \"\").split(\",\").reduce<Record<string, string>>((prev, curr) => {\n const s = curr.split(\"=\");\n return {\n ...prev,\n [s[0]]: s[1]\n };\n }, {});\n this.count = preferHeaders[\"count\"] ?? null;\n this.schema = fb[\"schema\"] as string;\n this.isHead = this.method === \"HEAD\";\n const limit = this._url.searchParams.get(\"limit\");\n this.limit = limit ? Number(limit) : undefined;\n const offset = this._url.searchParams.get(\"offset\");\n this.offset = offset ? Number(offset) : undefined;\n this._url.searchParams.forEach((value, key) => {\n const split = key.split(\".\");\n if (split[split.length === 2 ? 1 : 0] === \"order\") {\n // separated by ,\n const orderByDefs = value.split(\",\");\n orderByDefs.forEach(def => {\n const [column, ascending, nullsFirst] = def.split(\".\");\n this.orderBy.push({\n ascending: ascending === \"asc\",\n column,\n nullsFirst: nullsFirst === \"nullsfirst\",\n foreignTable: split.length === 2 ? split[0] : undefined\n });\n });\n }\n });\n this.orderByKey = this.orderBy.map(({\n column,\n ascending,\n nullsFirst,\n foreignTable\n }) => `${foreignTable ? `${foreignTable}.` : \"\"}${column}:${ascending ? \"asc\" : \"desc\"}.${nullsFirst ? \"nullsFirst\" : \"nullsLast\"}`).join(\"|\");\n }\n}"],"mappings":"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","names":["v"]}
@@ -3,11 +3,11 @@ import {
3
3
  } from "./chunk-GC3TBUWE.js";
4
4
  import {
5
5
  PostgrestParser
6
- } from "./chunk-UJWETW36.js";
6
+ } from "./chunk-JOULSXOI.js";
7
7
  import {
8
8
  encode,
9
9
  useQuery
10
- } from "./chunk-CTRY7JDP.js";
10
+ } from "./chunk-YUX6RGLZ.js";
11
11
  import {
12
12
  generateUUID,
13
13
  useSupabase
@@ -958,4 +958,4 @@ export {
958
958
  useInfiniteQuery,
959
959
  usePartialAdvancedQuery
960
960
  };
961
- //# sourceMappingURL=chunk-OKYHI6JG.js.map
961
+ //# sourceMappingURL=chunk-LF3V3ERS.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  permissionContext,
3
3
  setupAuthContext
4
- } from "./chunk-DP3YEVSX.js";
4
+ } from "./chunk-6SDH7M7J.js";
5
5
 
6
6
  // src/auth/hooks/useAuth.ts
7
7
  import { isUsable } from "@pol-studios/utils";
@@ -205,4 +205,4 @@ export {
205
205
  useInvalidatePermission,
206
206
  usePermissionLoading
207
207
  };
208
- //# sourceMappingURL=chunk-FMYXG4VN.js.map
208
+ //# sourceMappingURL=chunk-MEBT5YHA.js.map