@percher/shared 1.1.0 → 1.3.0

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 (80) hide show
  1. package/dist/data-filter.d.ts +27 -0
  2. package/dist/data-filter.d.ts.map +1 -0
  3. package/dist/data-filter.js +288 -0
  4. package/dist/data-filter.js.map +1 -0
  5. package/dist/data-records.d.ts +359 -0
  6. package/dist/data-records.d.ts.map +1 -0
  7. package/dist/data-records.js +124 -0
  8. package/dist/data-records.js.map +1 -0
  9. package/dist/deployment-security.d.ts +32 -0
  10. package/dist/deployment-security.d.ts.map +1 -0
  11. package/dist/deployment-security.js +146 -0
  12. package/dist/deployment-security.js.map +1 -0
  13. package/dist/disposable-email-domains.d.ts +11 -0
  14. package/dist/disposable-email-domains.d.ts.map +1 -0
  15. package/dist/disposable-email-domains.js +112 -0
  16. package/dist/disposable-email-domains.js.map +1 -0
  17. package/dist/email-budget.d.ts +60 -0
  18. package/dist/email-budget.d.ts.map +1 -0
  19. package/dist/email-budget.js +135 -0
  20. package/dist/email-budget.js.map +1 -0
  21. package/dist/email-change.d.ts +11 -0
  22. package/dist/email-change.d.ts.map +1 -0
  23. package/dist/email-change.js +23 -0
  24. package/dist/email-change.js.map +1 -0
  25. package/dist/email-template.d.ts +19 -0
  26. package/dist/email-template.d.ts.map +1 -0
  27. package/dist/email-template.js +53 -0
  28. package/dist/email-template.js.map +1 -0
  29. package/dist/image-rejection.d.ts +45 -0
  30. package/dist/image-rejection.d.ts.map +1 -0
  31. package/dist/image-rejection.js +27 -0
  32. package/dist/image-rejection.js.map +1 -0
  33. package/dist/index.d.ts +14 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +14 -2
  36. package/dist/index.js.map +1 -1
  37. package/dist/internal-sig.d.ts +2 -2
  38. package/dist/internal-sig.js +2 -2
  39. package/dist/ip-prefix.d.ts +43 -0
  40. package/dist/ip-prefix.d.ts.map +1 -0
  41. package/dist/ip-prefix.js +225 -0
  42. package/dist/ip-prefix.js.map +1 -0
  43. package/dist/legal-changes.d.ts +4 -2
  44. package/dist/legal-changes.d.ts.map +1 -1
  45. package/dist/legal-changes.js +124 -0
  46. package/dist/legal-changes.js.map +1 -1
  47. package/dist/legal.d.ts +14 -14
  48. package/dist/legal.d.ts.map +1 -1
  49. package/dist/legal.js +13 -13
  50. package/dist/legal.js.map +1 -1
  51. package/dist/limits.d.ts +11 -0
  52. package/dist/limits.d.ts.map +1 -1
  53. package/dist/limits.js +11 -0
  54. package/dist/limits.js.map +1 -1
  55. package/dist/oauth-scopes.d.ts +8 -0
  56. package/dist/oauth-scopes.d.ts.map +1 -1
  57. package/dist/oauth-scopes.js +11 -13
  58. package/dist/oauth-scopes.js.map +1 -1
  59. package/dist/platform.d.ts +3 -3
  60. package/dist/platform.js +3 -3
  61. package/dist/signup-capacity.d.ts +12 -0
  62. package/dist/signup-capacity.d.ts.map +1 -0
  63. package/dist/signup-capacity.js +29 -0
  64. package/dist/signup-capacity.js.map +1 -0
  65. package/dist/signup-day.d.ts +7 -0
  66. package/dist/signup-day.d.ts.map +1 -0
  67. package/dist/signup-day.js +42 -0
  68. package/dist/signup-day.js.map +1 -0
  69. package/dist/switches.d.ts.map +1 -1
  70. package/dist/switches.js +2 -1
  71. package/dist/switches.js.map +1 -1
  72. package/dist/verified-signup.d.ts +24 -0
  73. package/dist/verified-signup.d.ts.map +1 -0
  74. package/dist/verified-signup.js +58 -0
  75. package/dist/verified-signup.js.map +1 -0
  76. package/dist/waitlist-token.d.ts +49 -0
  77. package/dist/waitlist-token.d.ts.map +1 -0
  78. package/dist/waitlist-token.js +71 -0
  79. package/dist/waitlist-token.js.map +1 -0
  80. package/package.json +6 -1
@@ -0,0 +1,27 @@
1
+ /** What the parser needs from the resolved collection's schema. */
2
+ export interface DataSchemaField {
3
+ name: string;
4
+ hidden: boolean;
5
+ }
6
+ export type DataExpressionErrorReason = "empty" | "too_long" | "backslash" | "forbidden_character" | "unterminated_string" | "invalid_number" | "syntax" | "reserved_word" | "unknown_field" | "hidden_field" | "shadowed_literal" | "too_deep" | "too_many_comparisons" | "too_many_items";
7
+ /** `extra` on 400 `DATA_QUERY_INVALID`: diagnostics only, never the input text. */
8
+ export interface DataQueryInvalidExtra {
9
+ param: "filter" | "sort" | "fields";
10
+ reason: DataExpressionErrorReason;
11
+ at: number;
12
+ }
13
+ export type DataExpressionResult = {
14
+ ok: true;
15
+ canonical: string;
16
+ } | {
17
+ ok: false;
18
+ reason: DataExpressionErrorReason;
19
+ at: number;
20
+ };
21
+ /** Parse a filter against the collection's schema; forward only `canonical`. */
22
+ export declare function parseDataFilter(input: string, schema: readonly DataSchemaField[]): DataExpressionResult;
23
+ /** Parse a sort list (`[-+]?field`, comma-separated, at most `sortMaxItems`) against the schema. */
24
+ export declare function parseDataSort(input: string, schema: readonly DataSchemaField[]): DataExpressionResult;
25
+ /** Parse a fields list (comma-separated field names) against the schema. */
26
+ export declare function parseDataFields(input: string, schema: readonly DataSchemaField[]): DataExpressionResult;
27
+ //# sourceMappingURL=data-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-filter.d.ts","sourceRoot":"","sources":["../src/data-filter.ts"],"names":[],"mappings":"AAyBA,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,yBAAyB,GACjC,OAAO,GACP,UAAU,GACV,WAAW,GACX,qBAAqB,GACrB,qBAAqB,GACrB,gBAAgB,GAChB,QAAQ,GACR,eAAe,GACf,eAAe,GACf,cAAc,GACd,kBAAkB,GAClB,UAAU,GACV,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,yBAAyB,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,yBAAyB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAiOjE,gFAAgF;AAChF,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,oBAAoB,CAKtB;AAgCD,oGAAoG;AACpG,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,oBAAoB,CAEtB;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,oBAAoB,CAEtB"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * The filter, sort and fields grammar for the data tools (spec §4.2).
3
+ *
4
+ * PocketBase's own filter language reaches far past one collection: `@`
5
+ * references, dotted relation and back-relation paths, `:each`/`:length`
6
+ * modifiers and functions, and a superuser sees hidden fields through all of
7
+ * them. So the input is parsed whole into a much smaller language and only the
8
+ * re-serialised canonical string is forwarded:
9
+ *
10
+ * expr := term (("&&" | "||") term)*
11
+ * term := "(" expr ")" | comparison
12
+ * comparison := field op literal
13
+ * op := = != > >= < <= ~ !~ ?= ?!= ?~ ?!~
14
+ * literal := '...' | "..." | -?digits(.digits)? | true | false | null
15
+ *
16
+ * A field is a NON-HIDDEN field of the resolved collection, by exact name.
17
+ * No backslash anywhere, so PocketBase's escape handling never applies. Outside
18
+ * a quoted literal only printable ASCII and the plain space are allowed; `@`,
19
+ * dots and non-ASCII are fine inside one. Parentheses are kept as written, so
20
+ * the canonical string groups exactly as the input did.
21
+ *
22
+ * Errors carry a reason and an offset, never the input text.
23
+ */
24
+ import { DATA_LIMITS } from "./data-records.js";
25
+ class ExpressionError extends Error {
26
+ reason;
27
+ at;
28
+ constructor(reason, at) {
29
+ super(reason);
30
+ this.reason = reason;
31
+ this.at = at;
32
+ }
33
+ }
34
+ const FIELD_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
35
+ const IDENT_STICKY = /[A-Za-z_][A-Za-z0-9_]*/y;
36
+ const NUMBER_STICKY = /-?[0-9]+(?:\.[0-9]+)?/y;
37
+ const RESERVED = new Set(["true", "false", "null"]);
38
+ // Longest first, so `?!=` is never read as `?` + `!=`.
39
+ const OPERATORS = ["?!~", "?!=", "?~", "?=", "!=", "!~", ">=", "<=", "=", ">", "<", "~"];
40
+ /**
41
+ * Offset of the first character a literal may not hold: a C0 or C1 control,
42
+ * DEL, or an unpaired surrogate (which has no UTF-8 encoding). -1 if none.
43
+ */
44
+ function badLiteralChar(body) {
45
+ for (let i = 0; i < body.length; i++) {
46
+ const c = body.charCodeAt(i);
47
+ if (c < 0x20 || (c >= 0x7f && c <= 0x9f))
48
+ return i;
49
+ if (c >= 0xdc00 && c <= 0xdfff)
50
+ return i;
51
+ if (c >= 0xd800 && c <= 0xdbff) {
52
+ const low = body.charCodeAt(i + 1);
53
+ if (!(low >= 0xdc00 && low <= 0xdfff))
54
+ return i;
55
+ i++;
56
+ }
57
+ }
58
+ return -1;
59
+ }
60
+ function checkBounds(input) {
61
+ if (input.length > DATA_LIMITS.expressionChars) {
62
+ throw new ExpressionError("too_long", DATA_LIMITS.expressionChars);
63
+ }
64
+ const slash = input.indexOf("\\");
65
+ if (slash !== -1)
66
+ throw new ExpressionError("backslash", slash);
67
+ if (input.trim() === "")
68
+ throw new ExpressionError("empty", 0);
69
+ }
70
+ function tokenize(input) {
71
+ const tokens = [];
72
+ let i = 0;
73
+ while (i < input.length) {
74
+ const c = input[i];
75
+ if (c === " ") {
76
+ i++;
77
+ continue;
78
+ }
79
+ if (c === "(" || c === ")") {
80
+ tokens.push({ kind: c, text: c, at: i });
81
+ i++;
82
+ continue;
83
+ }
84
+ if (c === '"' || c === "'") {
85
+ const end = input.indexOf(c, i + 1);
86
+ if (end === -1)
87
+ throw new ExpressionError("unterminated_string", i);
88
+ const body = input.slice(i + 1, end);
89
+ const bad = badLiteralChar(body);
90
+ if (bad !== -1)
91
+ throw new ExpressionError("forbidden_character", i + 1 + bad);
92
+ tokens.push({ kind: "string", text: input.slice(i, end + 1), at: i });
93
+ i = end + 1;
94
+ continue;
95
+ }
96
+ if (input.startsWith("&&", i) || input.startsWith("||", i)) {
97
+ tokens.push({ kind: "join", text: input.slice(i, i + 2), at: i });
98
+ i += 2;
99
+ continue;
100
+ }
101
+ const op = OPERATORS.find((o) => input.startsWith(o, i));
102
+ if (op) {
103
+ tokens.push({ kind: "op", text: op, at: i });
104
+ i += op.length;
105
+ continue;
106
+ }
107
+ NUMBER_STICKY.lastIndex = i;
108
+ const num = NUMBER_STICKY.exec(input);
109
+ if (num) {
110
+ const next = input[i + num[0].length];
111
+ if (next !== undefined && /[A-Za-z0-9_.]/.test(next)) {
112
+ throw new ExpressionError("invalid_number", i);
113
+ }
114
+ tokens.push({ kind: "number", text: num[0], at: i });
115
+ i += num[0].length;
116
+ continue;
117
+ }
118
+ IDENT_STICKY.lastIndex = i;
119
+ const ident = IDENT_STICKY.exec(input);
120
+ if (ident) {
121
+ if (!FIELD_RE.test(ident[0]))
122
+ throw new ExpressionError("syntax", i);
123
+ tokens.push({ kind: "ident", text: ident[0], at: i });
124
+ i += ident[0].length;
125
+ continue;
126
+ }
127
+ throw new ExpressionError("forbidden_character", i);
128
+ }
129
+ return tokens;
130
+ }
131
+ class SchemaIndex {
132
+ visible = new Set();
133
+ hidden = new Set();
134
+ lowered = new Set();
135
+ constructor(fields) {
136
+ for (const f of fields) {
137
+ (f.hidden ? this.hidden : this.visible).add(f.name);
138
+ this.lowered.add(f.name.toLowerCase());
139
+ }
140
+ }
141
+ /** A field reference: never a reserved word, always a visible field by exact name. */
142
+ checkField(name, at) {
143
+ if (RESERVED.has(name.toLowerCase()))
144
+ throw new ExpressionError("reserved_word", at);
145
+ if (this.visible.has(name))
146
+ return;
147
+ throw new ExpressionError(this.hidden.has(name) ? "hidden_field" : "unknown_field", at);
148
+ }
149
+ /**
150
+ * PocketBase reads a bare `true`/`false`/`null` as a FIELD when the
151
+ * collection has one by that name, so the literal is refused there.
152
+ */
153
+ checkKeywordLiteral(word, at) {
154
+ if (this.lowered.has(word))
155
+ throw new ExpressionError("shadowed_literal", at);
156
+ }
157
+ }
158
+ class FilterParser {
159
+ tokens;
160
+ schema;
161
+ inputLength;
162
+ pos = 0;
163
+ comparisons = 0;
164
+ constructor(tokens, schema, inputLength) {
165
+ this.tokens = tokens;
166
+ this.schema = schema;
167
+ this.inputLength = inputLength;
168
+ }
169
+ parse() {
170
+ const out = this.expr(0);
171
+ const extra = this.tokens[this.pos];
172
+ if (extra)
173
+ throw new ExpressionError("syntax", extra.at);
174
+ return out;
175
+ }
176
+ peek() {
177
+ return this.tokens[this.pos];
178
+ }
179
+ take() {
180
+ const t = this.tokens[this.pos];
181
+ if (!t)
182
+ throw new ExpressionError("syntax", this.inputLength);
183
+ this.pos++;
184
+ return t;
185
+ }
186
+ expr(depth) {
187
+ let out = this.term(depth);
188
+ for (let t = this.peek(); t?.kind === "join"; t = this.peek()) {
189
+ this.pos++;
190
+ out += ` ${t.text} ${this.term(depth)}`;
191
+ }
192
+ return out;
193
+ }
194
+ term(depth) {
195
+ const t = this.take();
196
+ if (t.kind === "(") {
197
+ if (depth + 1 > DATA_LIMITS.filterMaxDepth)
198
+ throw new ExpressionError("too_deep", t.at);
199
+ const inner = this.expr(depth + 1);
200
+ const close = this.take();
201
+ if (close.kind !== ")")
202
+ throw new ExpressionError("syntax", close.at);
203
+ return `(${inner})`;
204
+ }
205
+ if (t.kind !== "ident")
206
+ throw new ExpressionError("syntax", t.at);
207
+ this.schema.checkField(t.text, t.at);
208
+ const op = this.take();
209
+ if (op.kind !== "op")
210
+ throw new ExpressionError("syntax", op.at);
211
+ const lit = this.take();
212
+ if (lit.kind === "ident") {
213
+ if (!RESERVED.has(lit.text)) {
214
+ throw new ExpressionError(RESERVED.has(lit.text.toLowerCase()) ? "reserved_word" : "syntax", lit.at);
215
+ }
216
+ this.schema.checkKeywordLiteral(lit.text, lit.at);
217
+ }
218
+ else if (lit.kind !== "string" && lit.kind !== "number") {
219
+ throw new ExpressionError("syntax", lit.at);
220
+ }
221
+ this.comparisons++;
222
+ if (this.comparisons > DATA_LIMITS.filterMaxComparisons) {
223
+ throw new ExpressionError("too_many_comparisons", t.at);
224
+ }
225
+ return `${t.text} ${op.text} ${lit.text}`;
226
+ }
227
+ }
228
+ /**
229
+ * The cap holds for what is FORWARDED, not only for what arrived: the filter's
230
+ * canonical form adds spaces, so a compact input under the cap can expand past
231
+ * it. Checking the output also keeps parsing idempotent: every canonical
232
+ * string parses again to itself.
233
+ */
234
+ function run(fn) {
235
+ try {
236
+ const canonical = fn();
237
+ if (canonical.length > DATA_LIMITS.expressionChars) {
238
+ return { ok: false, reason: "too_long", at: DATA_LIMITS.expressionChars };
239
+ }
240
+ return { ok: true, canonical };
241
+ }
242
+ catch (err) {
243
+ if (err instanceof ExpressionError)
244
+ return { ok: false, reason: err.reason, at: err.at };
245
+ throw err;
246
+ }
247
+ }
248
+ /** Parse a filter against the collection's schema; forward only `canonical`. */
249
+ export function parseDataFilter(input, schema) {
250
+ return run(() => {
251
+ checkBounds(input);
252
+ return new FilterParser(tokenize(input), new SchemaIndex(schema), input.length).parse();
253
+ });
254
+ }
255
+ /** Comma-separated items, each `prefix? field`; spaces around items are dropped. */
256
+ function parseFieldList(input, schema, allowDirection) {
257
+ checkBounds(input);
258
+ const index = new SchemaIndex(schema);
259
+ const items = [];
260
+ let at = 0;
261
+ for (const raw of input.split(",")) {
262
+ const lead = raw.length - raw.replace(/^ +/, "").length;
263
+ const item = raw.replace(/^ +| +$/g, "");
264
+ const itemAt = at + lead;
265
+ const prefix = allowDirection && (item[0] === "-" || item[0] === "+") ? item[0] : "";
266
+ const name = item.slice(prefix.length);
267
+ if (!FIELD_RE.test(name)) {
268
+ const bad = /[^ -~]|[@.:()]/.exec(item);
269
+ throw new ExpressionError(bad ? "forbidden_character" : "syntax", itemAt + (bad?.index ?? 0));
270
+ }
271
+ index.checkField(name, itemAt + prefix.length);
272
+ items.push(prefix + name);
273
+ if (allowDirection && items.length > DATA_LIMITS.sortMaxItems) {
274
+ throw new ExpressionError("too_many_items", itemAt);
275
+ }
276
+ at += raw.length + 1;
277
+ }
278
+ return items.join(",");
279
+ }
280
+ /** Parse a sort list (`[-+]?field`, comma-separated, at most `sortMaxItems`) against the schema. */
281
+ export function parseDataSort(input, schema) {
282
+ return run(() => parseFieldList(input, schema, true));
283
+ }
284
+ /** Parse a fields list (comma-separated field names) against the schema. */
285
+ export function parseDataFields(input, schema) {
286
+ return run(() => parseFieldList(input, schema, false));
287
+ }
288
+ //# sourceMappingURL=data-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-filter.js","sourceRoot":"","sources":["../src/data-filter.ts"],"names":[],"mappings":"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"}