@haverstack/core 0.22.0 → 0.24.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.
@@ -0,0 +1,435 @@
1
+ /**
2
+ * Stack — Wire Request Parsing
3
+ * -------------------------------------------------------
4
+ * The parse half of the request encoding `adapter-api` builds: URL search
5
+ * params and JSON bodies in, the core types `Stack` takes out. Core has no
6
+ * HTTP server of its own — this module exists so every server
7
+ * implementation shares one decoding of the query grammar rather than
8
+ * transcribing docs/spec/wire-format.md § Records' parameter table and
9
+ * re-deriving its rules, which is where a miss produces a query that
10
+ * silently widens rather than one that fails.
11
+ *
12
+ * Three things this deliberately does not do:
13
+ *
14
+ * - **No clamping.** A `limit` ceiling is deployment policy, not wire
15
+ * contract, so the requested limit is reported as asked and the server
16
+ * applies its own cap afterwards.
17
+ * - **No capability gating.** `assertQueryCapabilities()` in
18
+ * `@haverstack/core/adapter` stays a separate, deliberate call.
19
+ * - **No value validation beyond shape.** An ID's or a cursor's legality is
20
+ * `Stack`'s to judge, and judging it twice would let the two answers
21
+ * drift.
22
+ *
23
+ * Everything here throws `StackQueryError` on malformed input, which
24
+ * servers already map to 400 — see docs/spec/wire-format.md § Error
25
+ * responses.
26
+ */
27
+ import { StackQueryError } from './stack.js';
28
+ // -------------------------------------------------------
29
+ // Shared primitives
30
+ // -------------------------------------------------------
31
+ /** Parse an ISO date string from a wire body; undefined if absent or invalid. */
32
+ export function parseDate(val) {
33
+ if (typeof val !== 'string')
34
+ return undefined;
35
+ const d = new Date(val);
36
+ return isNaN(d.getTime()) ? undefined : d;
37
+ }
38
+ const POSITIVE_INTEGER = /^\d+$/;
39
+ const SORT_FIELDS = new Set(['createdAt', 'updatedAt', 'version']);
40
+ const SORT_DIRECTIONS = new Set(['asc', 'desc']);
41
+ const CHANGE_KINDS = new Set(['created', 'changed', 'deleted', 'purged']);
42
+ const TARGET_SCOPES = new Set(['record', 'entity', 'external']);
43
+ /**
44
+ * Strict positive-integer parse for a URL param — rejects "1abc", "2.7",
45
+ * "-5". Also serves the `:version` path params, which share this
46
+ * "malformed, don't silently coerce" requirement.
47
+ */
48
+ export function parsePositiveInt(raw, label) {
49
+ if (!POSITIVE_INTEGER.test(raw))
50
+ throw new StackQueryError(`Invalid ${label}: "${raw}"`);
51
+ return parseInt(raw, 10);
52
+ }
53
+ function requireDate(raw, label) {
54
+ const d = parseDate(raw);
55
+ if (!d)
56
+ throw new StackQueryError(`Invalid ${label}: ${JSON.stringify(raw)}`);
57
+ return d;
58
+ }
59
+ function requireSortField(raw) {
60
+ if (typeof raw !== 'string' || !SORT_FIELDS.has(raw))
61
+ throw new StackQueryError(`Invalid sort field: ${JSON.stringify(raw)}`);
62
+ return raw;
63
+ }
64
+ function requireSortDirection(raw) {
65
+ if (typeof raw !== 'string' || !SORT_DIRECTIONS.has(raw))
66
+ throw new StackQueryError(`Invalid sort direction: ${JSON.stringify(raw)}`);
67
+ return raw;
68
+ }
69
+ function requireString(raw, label) {
70
+ if (typeof raw !== 'string')
71
+ throw new StackQueryError(`Invalid ${label}: expected a string`);
72
+ return raw;
73
+ }
74
+ function requireStringOrArray(raw, label) {
75
+ if (typeof raw === 'string')
76
+ return raw;
77
+ if (Array.isArray(raw) && raw.every((v) => typeof v === 'string'))
78
+ return raw;
79
+ throw new StackQueryError(`Invalid ${label}: expected a string or array of strings`);
80
+ }
81
+ function requireStringArray(raw, label) {
82
+ if (!Array.isArray(raw) || !raw.every((v) => typeof v === 'string'))
83
+ throw new StackQueryError(`Invalid ${label}: expected an array of strings`);
84
+ return raw;
85
+ }
86
+ function requirePlainObject(raw, label) {
87
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
88
+ throw new StackQueryError(`Invalid ${label}: expected an object`);
89
+ return raw;
90
+ }
91
+ // -------------------------------------------------------
92
+ // Filter fields that never travel
93
+ // -------------------------------------------------------
94
+ const BASE_ID_REFUSAL = 'baseId is resolved client-side against registered Types and never travels — send the ' +
95
+ 'concrete typeId set it resolves to. See docs/spec/data-model.md § Filter.';
96
+ const PRESENT_AT_REFUSAL = 'presentAt applies migration functions, which are app code rather than server code, so no ' +
97
+ 'server can honor it — read records as stored and migrate them client-side. See ' +
98
+ 'docs/spec/data-model.md § Type migrations.';
99
+ /**
100
+ * Refuse the two `StackQuery` fields with no wire encoding, rather than
101
+ * dropping them. Both would otherwise return a result the caller believes
102
+ * is narrower (`baseId`) or migrated (`presentAt`) than what it holds —
103
+ * the same silent degradation `assertQueryCapabilities()` refuses for a
104
+ * capability-gated filter. See docs/spec/wire-format.md § Records.
105
+ */
106
+ function assertNoUntravelableFields(hasBaseId, hasPresentAt) {
107
+ if (hasBaseId)
108
+ throw new StackQueryError(BASE_ID_REFUSAL);
109
+ if (hasPresentAt)
110
+ throw new StackQueryError(PRESENT_AT_REFUSAL);
111
+ }
112
+ // -------------------------------------------------------
113
+ // Relationship filter
114
+ // -------------------------------------------------------
115
+ /**
116
+ * Route a `filter.relatedTo.target` by scope. Core validates the
117
+ * non-emptiness of whichever fields the scope names, so this only rejects
118
+ * a scope it does not recognize.
119
+ */
120
+ function parseRelatedToTarget(raw) {
121
+ const t = requirePlainObject(raw, 'filter.relatedTo.target');
122
+ if (typeof t.scope !== 'string' || !TARGET_SCOPES.has(t.scope))
123
+ throw new StackQueryError(`Invalid filter.relatedTo.target.scope: ${JSON.stringify(t.scope)}`);
124
+ if (t.scope === 'record') {
125
+ return {
126
+ scope: 'record',
127
+ recordId: requireString(t.recordId, 'filter.relatedTo.target.recordId'),
128
+ ...(t.stackUrl !== undefined && {
129
+ stackUrl: requireString(t.stackUrl, 'filter.relatedTo.target.stackUrl'),
130
+ }),
131
+ };
132
+ }
133
+ if (t.scope === 'entity') {
134
+ return {
135
+ scope: 'entity',
136
+ entityId: requireString(t.entityId, 'filter.relatedTo.target.entityId'),
137
+ };
138
+ }
139
+ return {
140
+ scope: 'external',
141
+ ns: requireString(t.ns, 'filter.relatedTo.target.ns'),
142
+ ...(t.id !== undefined && { id: requireString(t.id, 'filter.relatedTo.target.id') }),
143
+ };
144
+ }
145
+ /** A label, a target, or both — the body form of the same filter. */
146
+ function parseRelatedToBody(raw) {
147
+ const r = requirePlainObject(raw, 'filter.relatedTo');
148
+ const label = r.label !== undefined ? requireString(r.label, 'filter.relatedTo.label') : undefined;
149
+ const target = r.target !== undefined ? parseRelatedToTarget(r.target) : undefined;
150
+ return {
151
+ ...(label !== undefined && { label }),
152
+ ...(target !== undefined && { target }),
153
+ };
154
+ }
155
+ /**
156
+ * The `relatedTo*` URL params. Scope is implied by which of them appear and
157
+ * the three are mutually exclusive. An empty value passes through raw
158
+ * rather than as absent — that is what lets core's target validation tell
159
+ * "omitted" from "empty" for `relatedToStack` and `relatedToId`, where the
160
+ * two mean different things and neither is a wildcard.
161
+ * See docs/spec/wire-format.md § Records.
162
+ */
163
+ function parseRelatedToParams(url) {
164
+ const hasRecord = url.searchParams.has('relatedTo');
165
+ const hasStack = url.searchParams.has('relatedToStack');
166
+ const hasEntity = url.searchParams.has('relatedToEntity');
167
+ const hasNs = url.searchParams.has('relatedToNs');
168
+ const hasId = url.searchParams.has('relatedToId');
169
+ const label = url.searchParams.get('relatedToLabel');
170
+ if ([hasRecord, hasEntity, hasNs].filter(Boolean).length > 1) {
171
+ throw new StackQueryError('relatedTo, relatedToEntity and relatedToNs name different target scopes and are mutually exclusive');
172
+ }
173
+ if (hasStack && !hasRecord)
174
+ throw new StackQueryError('relatedToStack is only valid alongside relatedTo');
175
+ if (hasId && !hasNs)
176
+ throw new StackQueryError('relatedToId is only valid alongside relatedToNs');
177
+ let target;
178
+ if (hasRecord) {
179
+ target = {
180
+ scope: 'record',
181
+ recordId: url.searchParams.get('relatedTo'),
182
+ ...(hasStack && { stackUrl: url.searchParams.get('relatedToStack') }),
183
+ };
184
+ }
185
+ else if (hasEntity) {
186
+ target = { scope: 'entity', entityId: url.searchParams.get('relatedToEntity') };
187
+ }
188
+ else if (hasNs) {
189
+ target = {
190
+ scope: 'external',
191
+ ns: url.searchParams.get('relatedToNs'),
192
+ ...(hasId && { id: url.searchParams.get('relatedToId') }),
193
+ };
194
+ }
195
+ if (target === undefined && !label)
196
+ return undefined;
197
+ return {
198
+ ...(target !== undefined && { target }),
199
+ ...(label && { label }),
200
+ };
201
+ }
202
+ // -------------------------------------------------------
203
+ // GET /records
204
+ // -------------------------------------------------------
205
+ /**
206
+ * Build a `StackQuery` from `GET /records` search params — the inverse of
207
+ * what `APIAdapter` encodes for a server without `contentFieldQuery`.
208
+ * `parentId=null` is the literal string, the sentinel for "top level":
209
+ * Crockford base-32 excludes `u` and `l`, so no record ID can collide
210
+ * with it. See docs/spec/wire-format.md § Records.
211
+ */
212
+ export function parseQueryParams(url) {
213
+ assertNoUntravelableFields(url.searchParams.has('baseId'), url.searchParams.has('presentAt'));
214
+ const filter = {};
215
+ const typeIds = url.searchParams.getAll('typeId');
216
+ if (typeIds.length)
217
+ filter.typeId = typeIds.length === 1 ? typeIds[0] : typeIds;
218
+ const parentId = url.searchParams.get('parentId');
219
+ if (parentId !== null)
220
+ filter.parentId = parentId === 'null' ? null : parentId;
221
+ const appIds = url.searchParams.getAll('appId');
222
+ if (appIds.length)
223
+ filter.appId = appIds.length === 1 ? appIds[0] : appIds;
224
+ const entityIds = url.searchParams.getAll('entityId');
225
+ if (entityIds.length)
226
+ filter.entityId = entityIds.length === 1 ? entityIds[0] : entityIds;
227
+ const principalIds = url.searchParams.getAll('principalId');
228
+ if (principalIds.length)
229
+ filter.principalId = principalIds.length === 1 ? principalIds[0] : principalIds;
230
+ const tags = url.searchParams.getAll('tag');
231
+ if (tags.length)
232
+ filter.tags = tags;
233
+ const hasAttachment = url.searchParams.get('hasAttachment');
234
+ if (hasAttachment)
235
+ filter.hasAttachment = hasAttachment;
236
+ const attachmentFileId = url.searchParams.get('attachmentFileId');
237
+ if (attachmentFileId)
238
+ filter.attachmentFileId = attachmentFileId;
239
+ const relatedTo = parseRelatedToParams(url);
240
+ if (relatedTo)
241
+ filter.relatedTo = relatedTo;
242
+ const search = url.searchParams.get('search');
243
+ if (search)
244
+ filter.search = search;
245
+ const createdBefore = url.searchParams.get('createdBefore');
246
+ const createdAfter = url.searchParams.get('createdAfter');
247
+ if (createdBefore || createdAfter) {
248
+ filter.createdAt = {
249
+ ...(createdBefore && { before: requireDate(createdBefore, 'createdBefore') }),
250
+ ...(createdAfter && { after: requireDate(createdAfter, 'createdAfter') }),
251
+ };
252
+ }
253
+ const updatedBefore = url.searchParams.get('updatedBefore');
254
+ const updatedAfter = url.searchParams.get('updatedAfter');
255
+ if (updatedBefore || updatedAfter) {
256
+ filter.updatedAt = {
257
+ ...(updatedBefore && { before: requireDate(updatedBefore, 'updatedBefore') }),
258
+ ...(updatedAfter && { after: requireDate(updatedAfter, 'updatedAfter') }),
259
+ };
260
+ }
261
+ if (url.searchParams.get('includeDeleted') === 'true')
262
+ filter.includeDeleted = true;
263
+ if (url.searchParams.get('includeUnlisted') === 'true')
264
+ filter.includeUnlisted = true;
265
+ const query = {};
266
+ if (Object.keys(filter).length)
267
+ query.filter = filter;
268
+ const sort = url.searchParams.get('sort');
269
+ const direction = url.searchParams.get('direction');
270
+ if (sort)
271
+ query.sort = {
272
+ field: requireSortField(sort),
273
+ ...(direction && { direction: requireSortDirection(direction) }),
274
+ };
275
+ const limit = url.searchParams.get('limit');
276
+ if (limit)
277
+ query.limit = parsePositiveInt(limit, 'limit');
278
+ const cursor = url.searchParams.get('cursor');
279
+ if (cursor)
280
+ query.cursor = cursor;
281
+ return query;
282
+ }
283
+ // -------------------------------------------------------
284
+ // POST /records/query
285
+ // -------------------------------------------------------
286
+ /** Validate a limit that already arrived as a JSON number. */
287
+ function parseLimitValue(raw) {
288
+ if (typeof raw !== 'number' || !Number.isInteger(raw) || raw <= 0)
289
+ throw new StackQueryError(`Invalid limit: ${JSON.stringify(raw)}`);
290
+ return raw;
291
+ }
292
+ /**
293
+ * Build a `StackQuery` from a `POST /records/query` JSON body — the
294
+ * superset form, which additionally carries `filter.content`. Dates arrive
295
+ * as the ISO strings `JSON.stringify` made of them and are decoded back to
296
+ * `Date`. See docs/spec/wire-format.md § Records.
297
+ */
298
+ export function parseQueryBody(raw) {
299
+ if (!raw || typeof raw !== 'object')
300
+ return {};
301
+ const body = raw;
302
+ const f = body.filter !== undefined ? requirePlainObject(body.filter, 'filter') : undefined;
303
+ assertNoUntravelableFields(f !== undefined && 'baseId' in f, 'presentAt' in body);
304
+ const query = {};
305
+ if (f) {
306
+ const filter = {};
307
+ if (f.typeId !== undefined)
308
+ filter.typeId = requireStringOrArray(f.typeId, 'filter.typeId');
309
+ if (f.parentId !== undefined)
310
+ filter.parentId = f.parentId === null ? null : requireString(f.parentId, 'filter.parentId');
311
+ if (f.appId !== undefined)
312
+ filter.appId = requireStringOrArray(f.appId, 'filter.appId');
313
+ if (f.entityId !== undefined)
314
+ filter.entityId = requireStringOrArray(f.entityId, 'filter.entityId');
315
+ if (f.principalId !== undefined)
316
+ filter.principalId = requireStringOrArray(f.principalId, 'filter.principalId');
317
+ if (f.tags !== undefined)
318
+ filter.tags = requireStringArray(f.tags, 'filter.tags');
319
+ if (f.hasAttachment !== undefined)
320
+ filter.hasAttachment = requireString(f.hasAttachment, 'filter.hasAttachment');
321
+ if (f.attachmentFileId !== undefined)
322
+ filter.attachmentFileId = requireString(f.attachmentFileId, 'filter.attachmentFileId');
323
+ if (f.relatedTo !== undefined)
324
+ filter.relatedTo = parseRelatedToBody(f.relatedTo);
325
+ if (f.content !== undefined)
326
+ filter.content = requirePlainObject(f.content, 'filter.content');
327
+ if (f.search !== undefined)
328
+ filter.search = requireString(f.search, 'filter.search');
329
+ if (f.includeDeleted)
330
+ filter.includeDeleted = true;
331
+ if (f.includeUnlisted)
332
+ filter.includeUnlisted = true;
333
+ if (f.createdAt) {
334
+ const r = requirePlainObject(f.createdAt, 'filter.createdAt');
335
+ filter.createdAt = {
336
+ ...(r.before !== undefined && { before: requireDate(r.before, 'filter.createdAt.before') }),
337
+ ...(r.after !== undefined && { after: requireDate(r.after, 'filter.createdAt.after') }),
338
+ };
339
+ }
340
+ if (f.updatedAt) {
341
+ const r = requirePlainObject(f.updatedAt, 'filter.updatedAt');
342
+ filter.updatedAt = {
343
+ ...(r.before !== undefined && { before: requireDate(r.before, 'filter.updatedAt.before') }),
344
+ ...(r.after !== undefined && { after: requireDate(r.after, 'filter.updatedAt.after') }),
345
+ };
346
+ }
347
+ query.filter = filter;
348
+ }
349
+ if (body.sort) {
350
+ const s = requirePlainObject(body.sort, 'sort');
351
+ query.sort = {
352
+ field: requireSortField(s.field),
353
+ ...(s.direction !== undefined && { direction: requireSortDirection(s.direction) }),
354
+ };
355
+ }
356
+ if (body.limit !== undefined)
357
+ query.limit = parseLimitValue(body.limit);
358
+ if (typeof body.cursor === 'string')
359
+ query.cursor = body.cursor;
360
+ return query;
361
+ }
362
+ /**
363
+ * Parse `GET /changes`' query params. The resume cursor is deliberately
364
+ * absent: `Last-Event-ID` outranks `?since=`, and reconciling the two is
365
+ * the server's own resumption machinery rather than request encoding.
366
+ */
367
+ export function parseChangeParams(url) {
368
+ const filter = {};
369
+ const typeIds = url.searchParams.getAll('typeId');
370
+ if (typeIds.length)
371
+ filter.typeId = typeIds.length === 1 ? typeIds[0] : typeIds;
372
+ const parentId = url.searchParams.get('parentId');
373
+ if (parentId !== null)
374
+ filter.parentId = parentId === 'null' ? null : parentId;
375
+ const entityId = url.searchParams.get('entityId');
376
+ if (entityId !== null)
377
+ filter.entityId = entityId;
378
+ const kinds = url.searchParams.getAll('kind');
379
+ if (kinds.length) {
380
+ for (const kind of kinds) {
381
+ if (!CHANGE_KINDS.has(kind))
382
+ throw new StackQueryError(`Invalid kind: "${kind}"`);
383
+ }
384
+ filter.kinds = kinds;
385
+ }
386
+ const include = url.searchParams.get('include');
387
+ if (include !== null && include !== 'record')
388
+ throw new StackQueryError(`Invalid include: "${include}"`);
389
+ return {
390
+ filter,
391
+ includeRecords: include === 'record',
392
+ includeUnlisted: url.searchParams.get('includeUnlisted') === 'true',
393
+ };
394
+ }
395
+ // -------------------------------------------------------
396
+ // Headers
397
+ // -------------------------------------------------------
398
+ /**
399
+ * Parse an `If-Match: "5"` header into the version for `ifVersion`.
400
+ * A value that is not a bare, optionally quoted version is refused rather
401
+ * than read as absent: the header exists to fence a write, so degrading a
402
+ * malformed one to an unconditional last-writer-wins mutation defeats the
403
+ * only thing it was sent to do. Weak comparators (`W/"5"`) are refused for
404
+ * the same reason — a version match is exact or it is nothing.
405
+ * See docs/spec/wire-format.md § Records.
406
+ */
407
+ export function parseIfMatch(header) {
408
+ if (header === undefined)
409
+ return undefined;
410
+ const trimmed = header.trim();
411
+ const unquoted = /^"(.*)"$/.exec(trimmed)?.[1] ?? trimmed;
412
+ return parsePositiveInt(unquoted, 'If-Match');
413
+ }
414
+ /**
415
+ * Read an upload's filename from its `Content-Disposition`. Prefers the
416
+ * RFC 5987 extended form (`filename*=UTF-8''name.txt`), which is what a
417
+ * client carrying a non-ASCII name sends, and falls back to the plain
418
+ * quoted form. See docs/spec/wire-format.md § Upload.
419
+ */
420
+ export function parseUploadFilename(header) {
421
+ if (!header)
422
+ return undefined;
423
+ const extended = /filename\*\s*=\s*[^']*'[^']*'([^;]+)/i.exec(header);
424
+ if (extended) {
425
+ try {
426
+ return decodeURIComponent(extended[1].trim());
427
+ }
428
+ catch {
429
+ // Malformed percent-encoding — fall through to the plain form.
430
+ }
431
+ }
432
+ const plain = /filename\s*=\s*"([^"]+)"/i.exec(header);
433
+ return plain ? plain[1] : undefined;
434
+ }
435
+ //# sourceMappingURL=wire-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-request.js","sourceRoot":"","sources":["../src/wire-request.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haverstack/core",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "Core library for Haverstack — portable personal data stack",
5
5
  "type": "module",
6
6
  "exports": {