@haverstack/core 0.40.0 → 0.42.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.
- package/README.md +121 -59
- package/dist/access.d.ts +34 -36
- package/dist/access.d.ts.map +1 -1
- package/dist/access.js +65 -42
- package/dist/access.js.map +1 -1
- package/dist/{combine.d.ts → adapter/combine.d.ts} +8 -1
- package/dist/adapter/combine.d.ts.map +1 -0
- package/dist/{combine.js → adapter/combine.js} +7 -0
- package/dist/adapter/combine.js.map +1 -0
- package/dist/{adapter-entry.d.ts → adapter/index.d.ts} +6 -5
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/{adapter-entry.js → adapter/index.js} +5 -4
- package/dist/adapter/index.js.map +1 -0
- package/dist/{sort.d.ts → adapter/sort.d.ts} +20 -20
- package/dist/adapter/sort.d.ts.map +1 -0
- package/dist/{sort.js → adapter/sort.js} +37 -27
- package/dist/adapter/sort.js.map +1 -0
- package/dist/associations/identity.d.ts +93 -0
- package/dist/associations/identity.d.ts.map +1 -0
- package/dist/associations/identity.js +198 -0
- package/dist/associations/identity.js.map +1 -0
- package/dist/associations/validation.d.ts +90 -0
- package/dist/associations/validation.d.ts.map +1 -0
- package/dist/associations/validation.js +339 -0
- package/dist/associations/validation.js.map +1 -0
- package/dist/attachment-records.d.ts +48 -0
- package/dist/attachment-records.d.ts.map +1 -0
- package/dist/attachment-records.js +52 -0
- package/dist/attachment-records.js.map +1 -0
- package/dist/collection.d.ts +182 -0
- package/dist/collection.d.ts.map +1 -0
- package/dist/collection.js +407 -0
- package/dist/collection.js.map +1 -0
- package/dist/content-match.d.ts +25 -0
- package/dist/content-match.d.ts.map +1 -0
- package/dist/content-match.js +51 -0
- package/dist/content-match.js.map +1 -0
- package/dist/content-translation.d.ts +42 -0
- package/dist/content-translation.d.ts.map +1 -0
- package/dist/content-translation.js +108 -0
- package/dist/content-translation.js.map +1 -0
- package/dist/did/did.d.ts.map +1 -0
- package/dist/{did.js → did/did.js} +3 -4
- package/dist/did/did.js.map +1 -0
- package/dist/{did-entry.d.ts → did/index.d.ts} +1 -1
- package/dist/did/index.d.ts.map +1 -0
- package/dist/{did-entry.js → did/index.js} +3 -3
- package/dist/did/index.js.map +1 -0
- package/dist/errors.d.ts +36 -63
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +35 -58
- package/dist/errors.js.map +1 -1
- package/dist/grants.d.ts +20 -43
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js +71 -134
- package/dist/grants.js.map +1 -1
- package/dist/id.d.ts +13 -31
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +13 -31
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +14 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +141 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +219 -0
- package/dist/install.js.map +1 -0
- package/dist/merge.d.ts.map +1 -1
- package/dist/merge.js +5 -11
- package/dist/merge.js.map +1 -1
- package/dist/migration-steps.d.ts +102 -0
- package/dist/migration-steps.d.ts.map +1 -0
- package/dist/migration-steps.js +293 -0
- package/dist/migration-steps.js.map +1 -0
- package/dist/query-validation.d.ts +28 -94
- package/dist/query-validation.d.ts.map +1 -1
- package/dist/query-validation.js +156 -336
- package/dist/query-validation.js.map +1 -1
- package/dist/record-changes.d.ts +2 -117
- package/dist/record-changes.d.ts.map +1 -1
- package/dist/record-changes.js +10 -212
- package/dist/record-changes.js.map +1 -1
- package/dist/schema.d.ts +18 -7
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +59 -30
- package/dist/schema.js.map +1 -1
- package/dist/scoped-stack/authority.d.ts +156 -0
- package/dist/scoped-stack/authority.d.ts.map +1 -0
- package/dist/scoped-stack/authority.js +384 -0
- package/dist/scoped-stack/authority.js.map +1 -0
- package/dist/scoped-stack/scoped-stack.d.ts +338 -0
- package/dist/scoped-stack/scoped-stack.d.ts.map +1 -0
- package/dist/scoped-stack/scoped-stack.js +776 -0
- package/dist/scoped-stack/scoped-stack.js.map +1 -0
- package/dist/scoped-stack/subscription.d.ts +55 -0
- package/dist/scoped-stack/subscription.d.ts.map +1 -0
- package/dist/scoped-stack/subscription.js +110 -0
- package/dist/scoped-stack/subscription.js.map +1 -0
- package/dist/stack/attachments.d.ts +24 -0
- package/dist/stack/attachments.d.ts.map +1 -0
- package/dist/stack/attachments.js +113 -0
- package/dist/stack/attachments.js.map +1 -0
- package/dist/{changes.d.ts → stack/changes.d.ts} +29 -65
- package/dist/stack/changes.d.ts.map +1 -0
- package/dist/{changes.js → stack/changes.js} +32 -66
- package/dist/stack/changes.js.map +1 -0
- package/dist/stack/client.d.ts +271 -0
- package/dist/stack/client.d.ts.map +1 -0
- package/dist/stack/client.js +9 -0
- package/dist/stack/client.js.map +1 -0
- package/dist/stack/identity-bindings.d.ts.map +1 -0
- package/dist/{identity-bindings.js → stack/identity-bindings.js} +8 -14
- package/dist/stack/identity-bindings.js.map +1 -0
- package/dist/stack/install-app.d.ts +22 -0
- package/dist/stack/install-app.d.ts.map +1 -0
- package/dist/stack/install-app.js +260 -0
- package/dist/stack/install-app.js.map +1 -0
- package/dist/stack/integrity.d.ts +94 -0
- package/dist/stack/integrity.d.ts.map +1 -0
- package/dist/stack/integrity.js +268 -0
- package/dist/stack/integrity.js.map +1 -0
- package/dist/{limits.d.ts → stack/limits.d.ts} +2 -5
- package/dist/stack/limits.d.ts.map +1 -0
- package/dist/{limits.js → stack/limits.js} +3 -6
- package/dist/stack/limits.js.map +1 -0
- package/dist/stack/migrations.d.ts +59 -0
- package/dist/stack/migrations.d.ts.map +1 -0
- package/dist/stack/migrations.js +141 -0
- package/dist/stack/migrations.js.map +1 -0
- package/dist/{stack-reads.d.ts → stack/reads.d.ts} +33 -6
- package/dist/stack/reads.d.ts.map +1 -0
- package/dist/{stack-reads.js → stack/reads.js} +49 -7
- package/dist/stack/reads.js.map +1 -0
- package/dist/stack/record-id.d.ts +35 -0
- package/dist/stack/record-id.d.ts.map +1 -0
- package/dist/stack/record-id.js +82 -0
- package/dist/stack/record-id.js.map +1 -0
- package/dist/stack/stack.d.ts +438 -0
- package/dist/stack/stack.d.ts.map +1 -0
- package/dist/stack/stack.js +1366 -0
- package/dist/stack/stack.js.map +1 -0
- package/dist/stack/system-types.d.ts +16 -0
- package/dist/stack/system-types.d.ts.map +1 -0
- package/dist/stack/system-types.js +111 -0
- package/dist/stack/system-types.js.map +1 -0
- package/dist/stack/type-grants.d.ts +20 -0
- package/dist/stack/type-grants.d.ts.map +1 -0
- package/dist/stack/type-grants.js +69 -0
- package/dist/stack/type-grants.js.map +1 -0
- package/dist/stack/write-expectation.d.ts +78 -0
- package/dist/stack/write-expectation.d.ts.map +1 -0
- package/dist/stack/write-expectation.js +71 -0
- package/dist/stack/write-expectation.js.map +1 -0
- package/dist/testing.d.ts +21 -26
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +50 -70
- package/dist/testing.js.map +1 -1
- package/dist/type-handle.d.ts +67 -78
- package/dist/type-handle.d.ts.map +1 -1
- package/dist/type-handle.js +44 -111
- package/dist/type-handle.js.map +1 -1
- package/dist/types/adapter.d.ts +223 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +5 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/associations.d.ts +156 -0
- package/dist/types/associations.d.ts.map +1 -0
- package/dist/types/associations.js +13 -0
- package/dist/types/associations.js.map +1 -0
- package/dist/types/capabilities.d.ts +89 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +5 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/events.d.ts +155 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +5 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/ids.d.ts +43 -0
- package/dist/types/ids.d.ts.map +1 -0
- package/dist/types/ids.js +5 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/journal.d.ts +47 -0
- package/dist/types/journal.d.ts.map +1 -0
- package/dist/types/journal.js +5 -0
- package/dist/types/journal.js.map +1 -0
- package/dist/types/query.d.ts +185 -0
- package/dist/types/query.d.ts.map +1 -0
- package/dist/types/query.js +10 -0
- package/dist/types/query.js.map +1 -0
- package/dist/types/records.d.ts +76 -0
- package/dist/types/records.d.ts.map +1 -0
- package/dist/types/records.js +5 -0
- package/dist/types/records.js.map +1 -0
- package/dist/types/schema.d.ts +74 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +5 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/types/system.d.ts +161 -0
- package/dist/types/system.d.ts.map +1 -0
- package/dist/types/system.js +32 -0
- package/dist/types/system.js.map +1 -0
- package/dist/types/tokens.d.ts +39 -0
- package/dist/types/tokens.d.ts.map +1 -0
- package/dist/types/tokens.js +5 -0
- package/dist/types/tokens.js.map +1 -0
- package/dist/validate.d.ts +29 -70
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +65 -97
- package/dist/validate.js.map +1 -1
- package/dist/{attachment-download.d.ts → wire/attachment-download.d.ts} +0 -57
- package/dist/wire/attachment-download.d.ts.map +1 -0
- package/dist/{attachment-download.js → wire/attachment-download.js} +0 -61
- package/dist/wire/attachment-download.js.map +1 -0
- package/dist/{auth.d.ts → wire/auth.d.ts} +5 -8
- package/dist/wire/auth.d.ts.map +1 -0
- package/dist/{auth.js → wire/auth.js} +5 -8
- package/dist/wire/auth.js.map +1 -0
- package/dist/{wire-body.d.ts → wire/body.d.ts} +13 -5
- package/dist/wire/body.d.ts.map +1 -0
- package/dist/{wire-body.js → wire/body.js} +65 -7
- package/dist/wire/body.js.map +1 -0
- package/dist/{wire-entry.d.ts → wire/index.d.ts} +12 -12
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/{wire-entry.js → wire/index.js} +13 -17
- package/dist/wire/index.js.map +1 -0
- package/dist/{wire-record.d.ts → wire/record.d.ts} +10 -22
- package/dist/wire/record.d.ts.map +1 -0
- package/dist/{wire-record.js → wire/record.js} +12 -24
- package/dist/wire/record.js.map +1 -0
- package/dist/{wire-request.d.ts → wire/request.d.ts} +20 -37
- package/dist/wire/request.d.ts.map +1 -0
- package/dist/{wire-request.js → wire/request.js} +79 -54
- package/dist/wire/request.js.map +1 -0
- package/package.json +7 -7
- package/dist/adapter-entry.d.ts.map +0 -1
- package/dist/adapter-entry.js.map +0 -1
- package/dist/attachment-download.d.ts.map +0 -1
- package/dist/attachment-download.js.map +0 -1
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/changes.d.ts.map +0 -1
- package/dist/changes.js.map +0 -1
- package/dist/combine.d.ts.map +0 -1
- package/dist/combine.js.map +0 -1
- package/dist/did-entry.d.ts.map +0 -1
- package/dist/did-entry.js.map +0 -1
- package/dist/did.d.ts.map +0 -1
- package/dist/did.js.map +0 -1
- package/dist/identity-bindings.d.ts.map +0 -1
- package/dist/identity-bindings.js.map +0 -1
- package/dist/limits.d.ts.map +0 -1
- package/dist/limits.js.map +0 -1
- package/dist/record-id.d.ts +0 -70
- package/dist/record-id.d.ts.map +0 -1
- package/dist/record-id.js +0 -127
- package/dist/record-id.js.map +0 -1
- package/dist/scoped-stack.d.ts +0 -532
- package/dist/scoped-stack.d.ts.map +0 -1
- package/dist/scoped-stack.js +0 -1219
- package/dist/scoped-stack.js.map +0 -1
- package/dist/sort.d.ts.map +0 -1
- package/dist/sort.js.map +0 -1
- package/dist/stack-reads.d.ts.map +0 -1
- package/dist/stack-reads.js.map +0 -1
- package/dist/stack.d.ts +0 -971
- package/dist/stack.d.ts.map +0 -1
- package/dist/stack.js +0 -2012
- package/dist/stack.js.map +0 -1
- package/dist/types.d.ts +0 -1250
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -49
- package/dist/types.js.map +0 -1
- package/dist/wire-body.d.ts.map +0 -1
- package/dist/wire-body.js.map +0 -1
- package/dist/wire-entry.d.ts.map +0 -1
- package/dist/wire-entry.js.map +0 -1
- package/dist/wire-record.d.ts.map +0 -1
- package/dist/wire-record.js.map +0 -1
- package/dist/wire-request.d.ts.map +0 -1
- package/dist/wire-request.js.map +0 -1
- /package/dist/{did.d.ts → did/did.d.ts} +0 -0
- /package/dist/{identity-bindings.d.ts → stack/identity-bindings.d.ts} +0 -0
package/dist/query-validation.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Query
|
|
2
|
+
* Query validation
|
|
3
3
|
* -------------------------------------------------------
|
|
4
|
-
* The sanitizers a query passes through before any adapter sees it
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* raw JSON that no compiler has seen.
|
|
4
|
+
* The sanitizers a query passes through before any adapter sees it. A
|
|
5
|
+
* `QuerySort` field or a filter's discriminated union is a compile-time
|
|
6
|
+
* promise, and a server mapping a request onto either supplies raw JSON
|
|
7
|
+
* that no compiler has seen.
|
|
9
8
|
*
|
|
10
9
|
* These live in the invariant layer for the reason validation and
|
|
11
10
|
* `_config` protection do — so no adapter can forget one. `assertQueryCapabilities`
|
|
@@ -16,11 +15,11 @@
|
|
|
16
15
|
* the query — one rule, one answer.
|
|
17
16
|
* See docs/spec/data-model.md § Capability-gated filters.
|
|
18
17
|
*/
|
|
19
|
-
import { StackBadRequestError, StackValidationError } from './errors.js';
|
|
20
|
-
import { familyIdProblem } from './schema.js';
|
|
21
|
-
import {
|
|
22
|
-
import { CONTENT_SEGMENT_METACHARACTERS, SEGMENT_METACHARACTER_RE } from './validate.js';
|
|
23
|
-
import { NATIVE_SORT_FIELDS } from './types.js';
|
|
18
|
+
import { ARGUMENTS_INVALID, StackBadRequestError, StackValidationError } from './errors.js';
|
|
19
|
+
import { familyIdProblem, parseTypeId } from './schema.js';
|
|
20
|
+
import { targetErrors } from './associations/validation.js';
|
|
21
|
+
import { CONTENT_SEGMENT_METACHARACTERS, SEGMENT_METACHARACTER_RE, isPlainObject, } from './validate.js';
|
|
22
|
+
import { NATIVE_SORT_FIELDS } from './types/index.js';
|
|
24
23
|
/**
|
|
25
24
|
* Fail loud rather than silently widen: a filter the adapter can't honor
|
|
26
25
|
* would otherwise be dropped, returning an unfiltered superset presented
|
|
@@ -29,30 +28,90 @@ import { NATIVE_SORT_FIELDS } from './types.js';
|
|
|
29
28
|
* § Capability-gated filters.
|
|
30
29
|
*/
|
|
31
30
|
export function assertQueryCapabilities(filter, capabilities) {
|
|
32
|
-
const { content: reach, contentPresent, search } = capabilities.filter;
|
|
31
|
+
const { content: reach, contentPresent, contentByType, search } = capabilities.filter;
|
|
33
32
|
if (filter?.search && !search) {
|
|
34
33
|
throw new StackBadRequestError('Query uses filter.search, but this adapter does not declare the filter.search capability.', 'filter.search');
|
|
35
34
|
}
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
// An arm's keys are gated as the same keys at the top of the filter are.
|
|
36
|
+
const arms = Object.values(filter?.contentByType ?? {});
|
|
37
|
+
const parts = [filter ?? {}, ...arms];
|
|
38
|
+
const keys = parts.flatMap((part) => Object.keys(part.content ?? {}));
|
|
39
|
+
const present = parts.flatMap((part) => part.contentPresent ?? []);
|
|
40
|
+
if (!filter?.content && present.length === 0 && arms.length === 0)
|
|
38
41
|
return;
|
|
39
42
|
if (reach === 'none') {
|
|
40
43
|
// Named as `filter.content` whichever key the query used: the reach
|
|
41
44
|
// is what is absent, and it is the entry to look at in discovery.
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
const used = arms.length > 0
|
|
46
|
+
? 'filter.contentByType'
|
|
47
|
+
: present.length > 0 && !filter?.content
|
|
48
|
+
? 'filter.contentPresent'
|
|
49
|
+
: 'filter.content';
|
|
50
|
+
throw new StackBadRequestError(`Query uses ${used}, but this adapter declares filter.content: "none".`, 'filter.content');
|
|
44
51
|
}
|
|
45
|
-
if (
|
|
52
|
+
if (arms.length > contentByType) {
|
|
53
|
+
throw new StackBadRequestError(contentByType === 0
|
|
54
|
+
? 'Query uses filter.contentByType, but this adapter does not declare the ' +
|
|
55
|
+
'filter.contentByType capability.'
|
|
56
|
+
: `Query uses ${arms.length} filter.contentByType arms, but this adapter takes at ` +
|
|
57
|
+
`most ${contentByType}.`, 'filter.contentByType');
|
|
58
|
+
}
|
|
59
|
+
if (present.length > 0 && !contentPresent) {
|
|
46
60
|
throw new StackBadRequestError('Query uses filter.contentPresent, but this adapter does not declare the ' +
|
|
47
61
|
'filter.contentPresent capability.', 'filter.contentPresent');
|
|
48
62
|
}
|
|
49
|
-
for (const key of [...
|
|
63
|
+
for (const key of [...keys, ...present]) {
|
|
50
64
|
if (parseContentFilterKey(key).length > 1 && reach !== 'path') {
|
|
51
65
|
throw new StackBadRequestError(`Query uses the nested content path "${key}", but this adapter declares ` +
|
|
52
66
|
`filter.content: "${reach}".`, 'filter.content');
|
|
53
67
|
}
|
|
54
68
|
}
|
|
55
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Hold `filter.contentByType` to a split along Types: at least one arm,
|
|
72
|
+
* each pinned to a TypeId and flat, and never beside a top-level content
|
|
73
|
+
* predicate, whose relation to the arms would be ambiguous. A map that
|
|
74
|
+
* could arrive empty would match everything once it crossed the wire. See
|
|
75
|
+
* docs/spec/data-model.md § Content by type.
|
|
76
|
+
*/
|
|
77
|
+
export function assertValidContentByType(filter) {
|
|
78
|
+
const arms = filter?.contentByType;
|
|
79
|
+
if (arms === undefined)
|
|
80
|
+
return;
|
|
81
|
+
if (!isPlainObject(arms) || Object.keys(arms).length === 0) {
|
|
82
|
+
throw new StackBadRequestError('filter.contentByType must name at least one typeId.');
|
|
83
|
+
}
|
|
84
|
+
if (filter.content !== undefined || filter.contentPresent !== undefined) {
|
|
85
|
+
throw new StackBadRequestError('filter.contentByType cannot be combined with filter.content or filter.contentPresent.');
|
|
86
|
+
}
|
|
87
|
+
for (const [typeId, arm] of Object.entries(arms)) {
|
|
88
|
+
if (!parseTypeId(typeId)) {
|
|
89
|
+
throw new StackBadRequestError(`filter.contentByType key "${typeId}" is not a versioned TypeId.`);
|
|
90
|
+
}
|
|
91
|
+
if (!isPlainObject(arm)) {
|
|
92
|
+
throw new StackBadRequestError(`filter.contentByType["${typeId}"] must be an object.`);
|
|
93
|
+
}
|
|
94
|
+
for (const key of Object.keys(arm)) {
|
|
95
|
+
if (key !== 'content' && key !== 'contentPresent') {
|
|
96
|
+
throw new StackBadRequestError(`filter.contentByType["${typeId}"] takes content and contentPresent only, not "${key}".`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (arm.content !== undefined && !isPlainObject(arm.content)) {
|
|
100
|
+
throw new StackBadRequestError(`filter.contentByType["${typeId}"].content must be an object.`);
|
|
101
|
+
}
|
|
102
|
+
if (arm.contentPresent !== undefined &&
|
|
103
|
+
(!Array.isArray(arm.contentPresent) ||
|
|
104
|
+
!arm.contentPresent.every((path) => typeof path === 'string'))) {
|
|
105
|
+
throw new StackBadRequestError(`filter.contentByType["${typeId}"].contentPresent must be an array of strings.`);
|
|
106
|
+
}
|
|
107
|
+
for (const key of [
|
|
108
|
+
...Object.keys(arm.content ?? {}),
|
|
109
|
+
...(arm.contentPresent ?? []),
|
|
110
|
+
]) {
|
|
111
|
+
parseContentFilterKey(key);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
56
115
|
/**
|
|
57
116
|
* Whether a single-segment content filter can be pushed down to the
|
|
58
117
|
* adapter. Callers that read a content field pair this with an in-memory
|
|
@@ -100,39 +159,70 @@ const VALID_SORT_FIELDS = new Set(NATIVE_SORT_FIELDS);
|
|
|
100
159
|
/** The only two sort directions; see assertValidSort. */
|
|
101
160
|
const VALID_SORT_DIRECTIONS = new Set(['asc', 'desc']);
|
|
102
161
|
/**
|
|
103
|
-
* Reject a sort
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* adapter interpolates the direction straight into `ORDER BY`, so an
|
|
108
|
-
* unvalidated value there is a SQL-injection sink reachable from every
|
|
109
|
-
* untrusted caller. Validating in the invariant layer — the same reason
|
|
110
|
-
* emission and _config protection live here — means no adapter can forget
|
|
111
|
-
* it. See docs/spec/data-model.md § Sorting and pagination.
|
|
162
|
+
* Reject a sort outside the closed set the types promise. A type is not a
|
|
163
|
+
* runtime guard, and a SQLite adapter interpolates the direction straight
|
|
164
|
+
* into `ORDER BY`, so an unvalidated one is an injection sink reachable by
|
|
165
|
+
* any untrusted caller. See docs/spec/data-model.md § Sorting and pagination.
|
|
112
166
|
*/
|
|
113
167
|
export function assertValidSort(sort) {
|
|
114
168
|
if (!sort)
|
|
115
169
|
return;
|
|
116
|
-
|
|
117
|
-
|
|
170
|
+
const named = [sort.field, sort.contentField, sort.contentFieldByType].filter((member) => member !== undefined);
|
|
171
|
+
if (named.length > 1) {
|
|
172
|
+
throw new StackBadRequestError('A sort names one of a native field, a content field or a content field per type.');
|
|
118
173
|
}
|
|
119
174
|
if (sort.field !== undefined && !VALID_SORT_FIELDS.has(sort.field)) {
|
|
120
175
|
throw new StackBadRequestError(`Invalid sort field "${sort.field}": expected one of ${NATIVE_SORT_FIELDS.join(', ')}.`);
|
|
121
176
|
}
|
|
122
|
-
if (sort.contentField !== undefined)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
// position to order its record by (docs/spec/data-model.md
|
|
127
|
-
// § Sorting by a content field).
|
|
128
|
-
if (parseContentFilterKey(sort.contentField).length > 1) {
|
|
129
|
-
throw new StackBadRequestError(`Invalid sort content field "${sort.contentField}": sorting reaches top-level fields only.`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
177
|
+
if (sort.contentField !== undefined)
|
|
178
|
+
assertSortableField(sort.contentField);
|
|
179
|
+
if (sort.contentFieldByType !== undefined)
|
|
180
|
+
assertValidSortByType(sort.contentFieldByType);
|
|
132
181
|
if (sort.direction !== undefined && !VALID_SORT_DIRECTIONS.has(sort.direction)) {
|
|
133
182
|
throw new StackBadRequestError(`Invalid sort direction "${sort.direction}": expected "asc" or "desc".`);
|
|
134
183
|
}
|
|
135
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Parsed by the same rule a filter key is, so a name a filter could never
|
|
187
|
+
* address is not one a sort can either — then held to one segment, because
|
|
188
|
+
* a value inside an array or object has no single position to order its
|
|
189
|
+
* record by (docs/spec/data-model.md § Sorting by a content field).
|
|
190
|
+
*/
|
|
191
|
+
const assertSortableField = (field) => {
|
|
192
|
+
if (typeof field !== 'string') {
|
|
193
|
+
throw new StackBadRequestError('Invalid sort content field: expected a string.');
|
|
194
|
+
}
|
|
195
|
+
if (parseContentFilterKey(field).length > 1) {
|
|
196
|
+
throw new StackBadRequestError(`Invalid sort content field "${field}": sorting reaches top-level fields only.`);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Each key names a TypeId and orders by one field of it or one reduced
|
|
201
|
+
* constant. See docs/spec/data-model.md § Sorting by a content field.
|
|
202
|
+
*/
|
|
203
|
+
const assertValidSortByType = (byType) => {
|
|
204
|
+
if (!isPlainObject(byType) || Object.keys(byType).length === 0) {
|
|
205
|
+
throw new StackBadRequestError('sort.contentFieldByType must name at least one typeId.');
|
|
206
|
+
}
|
|
207
|
+
for (const [typeId, key] of Object.entries(byType)) {
|
|
208
|
+
if (!parseTypeId(typeId)) {
|
|
209
|
+
throw new StackBadRequestError(`sort.contentFieldByType key "${typeId}" is not a versioned TypeId.`);
|
|
210
|
+
}
|
|
211
|
+
const shape = isPlainObject(key) ? Object.keys(key) : [];
|
|
212
|
+
if (shape.length !== 1 || (shape[0] !== 'field' && shape[0] !== 'value')) {
|
|
213
|
+
throw new StackBadRequestError(`sort.contentFieldByType["${typeId}"] must be { field } or { value }.`);
|
|
214
|
+
}
|
|
215
|
+
const { field, value } = key;
|
|
216
|
+
if (shape[0] === 'field') {
|
|
217
|
+
assertSortableField(field);
|
|
218
|
+
}
|
|
219
|
+
else if (value !== null &&
|
|
220
|
+
typeof value !== 'string' &&
|
|
221
|
+
!(typeof value === 'number' && Number.isFinite(value))) {
|
|
222
|
+
throw new StackBadRequestError(`sort.contentFieldByType["${typeId}"].value must be a string, a finite number or null.`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
};
|
|
136
226
|
/**
|
|
137
227
|
* The sort every adapter receives: a named sort with no `direction` is
|
|
138
228
|
* ascending, resolved here so no adapter carries its own default. No sort
|
|
@@ -155,6 +245,17 @@ export function normalizeSort(sort) {
|
|
|
155
245
|
export function assertSortCapability(sort, capabilities) {
|
|
156
246
|
if (!sort)
|
|
157
247
|
return;
|
|
248
|
+
if (sort.contentFieldByType !== undefined) {
|
|
249
|
+
const keys = Object.keys(sort.contentFieldByType).length;
|
|
250
|
+
const cap = capabilities.sort.contentFieldByType;
|
|
251
|
+
if (keys > cap) {
|
|
252
|
+
throw new StackBadRequestError(cap === 0
|
|
253
|
+
? 'Query uses sort.contentFieldByType, but this adapter does not declare the ' +
|
|
254
|
+
'sort.contentFieldByType capability.'
|
|
255
|
+
: `Query uses ${keys} sort.contentFieldByType keys, but this adapter takes at most ${cap}.`, 'sort.contentFieldByType');
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
158
259
|
if (sort.contentField !== undefined) {
|
|
159
260
|
if (!capabilities.sort.contentField) {
|
|
160
261
|
throw new StackBadRequestError('Query uses sort.contentField, but this adapter does not declare the sort.contentField ' +
|
|
@@ -167,291 +268,6 @@ export function assertSortCapability(sort, capabilities) {
|
|
|
167
268
|
throw new StackBadRequestError(`Query sorts by "${field}", which this adapter does not declare in sort.fields.`, 'sort.fields');
|
|
168
269
|
}
|
|
169
270
|
}
|
|
170
|
-
/** The identifier spaces a relationship target may name. */
|
|
171
|
-
const TARGET_KINDS = new Set(['record', 'entity', 'external']);
|
|
172
|
-
/**
|
|
173
|
-
* The keys of one arm of a union, listed as an object so the compiler
|
|
174
|
-
* holds the list to the type: a field added to the arm fails to compile
|
|
175
|
-
* here until it is listed.
|
|
176
|
-
*/
|
|
177
|
-
const keysOf = (keys) => Object.keys(keys);
|
|
178
|
-
/** Every key each relationship target arm defines. */
|
|
179
|
-
export const TARGET_KEYS = {
|
|
180
|
-
record: keysOf({ kind: true, recordId: true, stackUrl: true }),
|
|
181
|
-
entity: keysOf({ kind: true, entityId: true }),
|
|
182
|
-
external: keysOf({ kind: true, ns: true, id: true }),
|
|
183
|
-
};
|
|
184
|
-
/** Every key each association kind defines. */
|
|
185
|
-
const ASSOCIATION_KEYS = {
|
|
186
|
-
tag: keysOf({ kind: true, label: true }),
|
|
187
|
-
attachment: keysOf({
|
|
188
|
-
kind: true,
|
|
189
|
-
label: true,
|
|
190
|
-
fileId: true,
|
|
191
|
-
attachmentRecordId: true,
|
|
192
|
-
}),
|
|
193
|
-
relationship: keysOf({ kind: true, label: true, target: true }),
|
|
194
|
-
permission: keysOf({ kind: true, label: true, grantee: true }),
|
|
195
|
-
anyone: keysOf({ kind: true, label: true }),
|
|
196
|
-
};
|
|
197
|
-
/** Every key each grantee arm defines, the default tier included. */
|
|
198
|
-
export const GRANTEE_KEYS = {
|
|
199
|
-
entity: keysOf({ kind: true, entityId: true }),
|
|
200
|
-
group: keysOf({ kind: true, groupId: true, role: true }),
|
|
201
|
-
authenticated: keysOf({ kind: true }),
|
|
202
|
-
};
|
|
203
|
-
/**
|
|
204
|
-
* The keys of `value` its arm does not define. An element carrying one is
|
|
205
|
-
* refused rather than stored: an adapter keeps only the keys it has
|
|
206
|
-
* columns for, so the rest would answer 200 and then vanish.
|
|
207
|
-
* See docs/spec/data-model.md § Associations.
|
|
208
|
-
*/
|
|
209
|
-
export function unknownKeys(value, keys) {
|
|
210
|
-
return Object.keys(value).filter((key) => !keys.includes(key));
|
|
211
|
-
}
|
|
212
|
-
/** unknownKeys() as a refusal. 400, not 422: the key addresses nothing. */
|
|
213
|
-
export function assertKnownKeys(value, keys, path) {
|
|
214
|
-
const unknown = unknownKeys(value, keys);
|
|
215
|
-
if (unknown.length > 0)
|
|
216
|
-
throw new StackBadRequestError(`Unknown key${unknown.length > 1 ? 's' : ''} in ${path}: ${unknown.join(', ')}`);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Collect what makes a relationship target malformed. Absence is
|
|
220
|
-
* meaningful on `stackUrl` and an external `id` — this stack, and the
|
|
221
|
-
* whole namespace — so every part that names something must be non-empty:
|
|
222
|
-
* an empty string stores and matches as though it were absent.
|
|
223
|
-
* See docs/spec/data-model.md § Relationship targets.
|
|
224
|
-
*/
|
|
225
|
-
function targetErrors(target, path, opts = {}) {
|
|
226
|
-
const fail = (message) => [{ path, message }];
|
|
227
|
-
if (!target || typeof target !== 'object')
|
|
228
|
-
return fail('A relationship target must be an object.');
|
|
229
|
-
if (!TARGET_KINDS.has(target.kind)) {
|
|
230
|
-
return fail(`Unknown relationship target kind "${target.kind}": expected "record", "entity" or "external".`);
|
|
231
|
-
}
|
|
232
|
-
assertKnownKeys(target, TARGET_KEYS[target.kind], path);
|
|
233
|
-
if (target.kind === 'record') {
|
|
234
|
-
if (!target.recordId)
|
|
235
|
-
return fail('A record target requires a non-empty recordId.');
|
|
236
|
-
if (target.stackUrl !== undefined && !target.stackUrl) {
|
|
237
|
-
return fail("A record target's stackUrl must be non-empty; omit it to name this stack.");
|
|
238
|
-
}
|
|
239
|
-
return [];
|
|
240
|
-
}
|
|
241
|
-
if (target.kind === 'entity') {
|
|
242
|
-
return target.entityId ? [] : fail('An entity target requires a non-empty entityId.');
|
|
243
|
-
}
|
|
244
|
-
if (!target.ns)
|
|
245
|
-
return fail('An external target requires a non-empty ns.');
|
|
246
|
-
if (target.id === undefined) {
|
|
247
|
-
return opts.externalIdOptional ? [] : fail('An external target requires an id.');
|
|
248
|
-
}
|
|
249
|
-
return target.id ? [] : fail("An external target's id must be non-empty when present.");
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Reject a relationship target outside the closed set the types promise.
|
|
253
|
-
* A discriminated union is not a runtime guard — a server mapping a
|
|
254
|
-
* request body onto an association supplies raw JSON — and an
|
|
255
|
-
* unrecognized kind would otherwise be stored under the one arm that
|
|
256
|
-
* names a Record in this stack. See docs/spec/data-model.md
|
|
257
|
-
* § Relationship targets.
|
|
258
|
-
*
|
|
259
|
-
* A key the element's kind does not define is thrown as a 400 rather than
|
|
260
|
-
* collected, at every depth: it addresses nothing, the way an unknown key
|
|
261
|
-
* on a request body does. See docs/spec/data-model.md § Associations.
|
|
262
|
-
*/
|
|
263
|
-
export function validateAssociation(association, path = 'association') {
|
|
264
|
-
if (!namesKind(association)) {
|
|
265
|
-
return [
|
|
266
|
-
{
|
|
267
|
-
path: `${path}.kind`,
|
|
268
|
-
message: `Unknown association kind "${String(association?.kind)}": expected ${[...ASSOCIATION_KINDS].map((k) => `"${k}"`).join(', ')}.`,
|
|
269
|
-
},
|
|
270
|
-
];
|
|
271
|
-
}
|
|
272
|
-
assertKnownKeys(association, ASSOCIATION_KEYS[association.kind], path);
|
|
273
|
-
if (association.kind === 'permission') {
|
|
274
|
-
return granteeErrors(association, `${path}.grantee`);
|
|
275
|
-
}
|
|
276
|
-
if (association.kind === 'anyone') {
|
|
277
|
-
return association.label === 'read'
|
|
278
|
-
? []
|
|
279
|
-
: [{ path: `${path}.label`, message: 'An `anyone` association carries only `read`.' }];
|
|
280
|
-
}
|
|
281
|
-
if (association.kind !== 'relationship')
|
|
282
|
-
return [];
|
|
283
|
-
return targetErrors(association.target, `${path}.target`);
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Who a duplicated permission names, since kind and label alone don't
|
|
287
|
-
* distinguish two grants of the same bit to different grantees.
|
|
288
|
-
*/
|
|
289
|
-
function granteeSuffix(association) {
|
|
290
|
-
if (association.kind !== 'permission')
|
|
291
|
-
return '';
|
|
292
|
-
const g = association.grantee;
|
|
293
|
-
return g.kind === 'entity' ? ` for "${g.entityId}"` : ` for ${g.role}s of "${g.groupId}"`;
|
|
294
|
-
}
|
|
295
|
-
/** The kinds an association may name — the closed set every surface reads. */
|
|
296
|
-
const ASSOCIATION_KINDS = new Set(['tag', 'attachment', 'relationship', 'permission', 'anyone']);
|
|
297
|
-
/**
|
|
298
|
-
* Whether a value is an association at all. Asked ahead of the partition
|
|
299
|
-
* checks, so a malformed element is named as one rather than reported as
|
|
300
|
-
* the wrong surface for a kind it never had — a request body supplies raw
|
|
301
|
-
* JSON, and `null` or `{}` is neither half of the partition.
|
|
302
|
-
*/
|
|
303
|
-
function namesKind(association) {
|
|
304
|
-
return (!!association &&
|
|
305
|
-
typeof association === 'object' &&
|
|
306
|
-
ASSOCIATION_KINDS.has(association.kind));
|
|
307
|
-
}
|
|
308
|
-
/** The bits a permission element may name — the whole of its meaning. */
|
|
309
|
-
const PERMISSION_LABELS = new Set(['read', 'write']);
|
|
310
|
-
/**
|
|
311
|
-
* Collect what makes a permission element malformed. `role` is required on
|
|
312
|
-
* a group grantee: there is no "any member" default to fall back on, so an
|
|
313
|
-
* absent one would otherwise widen or narrow silently depending on how the
|
|
314
|
-
* reader broke the tie. See docs/spec/access-control.md
|
|
315
|
-
* § Record-level permissions.
|
|
316
|
-
*/
|
|
317
|
-
function granteeErrors(association, path) {
|
|
318
|
-
const fail = (message) => [{ path, message }];
|
|
319
|
-
if (!PERMISSION_LABELS.has(association.label)) {
|
|
320
|
-
return [
|
|
321
|
-
{
|
|
322
|
-
path: `${path.slice(0, -'.grantee'.length)}.label`,
|
|
323
|
-
message: `Unknown permission label "${association.label}": expected "read" or "write".`,
|
|
324
|
-
},
|
|
325
|
-
];
|
|
326
|
-
}
|
|
327
|
-
const grantee = association.grantee;
|
|
328
|
-
if (!grantee || typeof grantee !== 'object')
|
|
329
|
-
return fail('A permission requires a grantee.');
|
|
330
|
-
if (grantee.kind === 'entity' || grantee.kind === 'group')
|
|
331
|
-
assertKnownKeys(grantee, GRANTEE_KEYS[grantee.kind], path);
|
|
332
|
-
if (grantee.kind === 'entity') {
|
|
333
|
-
return grantee.entityId ? [] : fail('An entity grantee requires a non-empty entityId.');
|
|
334
|
-
}
|
|
335
|
-
if (grantee.kind === 'group') {
|
|
336
|
-
if (!grantee.groupId)
|
|
337
|
-
return fail('A group grantee requires a non-empty groupId.');
|
|
338
|
-
return grantee.role === 'member' || grantee.role === 'admin'
|
|
339
|
-
? []
|
|
340
|
-
: fail('A group grantee requires a role of "member" or "admin".');
|
|
341
|
-
}
|
|
342
|
-
return fail(`Unknown permission grantee kind "${String(grantee.kind)}": expected "entity" or "group".`);
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Refuse an authority element reaching the data half of the partition.
|
|
346
|
-
* The two share a table, a delta shape and a durability tier; they never
|
|
347
|
-
* share a call, because an app editing tags would otherwise be able to
|
|
348
|
-
* replace an ACL it was never shown. Thrown rather than collected: the
|
|
349
|
-
* caller named the wrong surface, not a malformed value, and the verb it
|
|
350
|
-
* wanted is `grantAccess()`/`revokeAccess()`.
|
|
351
|
-
*
|
|
352
|
-
* Lives here, in the invariant layer, so an unscoped `Stack`, an import
|
|
353
|
-
* and a server mapping a request body are all held to it.
|
|
354
|
-
* See docs/spec/access-control.md § Record-level permissions.
|
|
355
|
-
*/
|
|
356
|
-
export function assertDataAssociations(associations, surface) {
|
|
357
|
-
const authority = associations.find((a) => namesKind(a) && isAuthorityAssociation(a));
|
|
358
|
-
if (!authority)
|
|
359
|
-
return;
|
|
360
|
-
throw new StackBadRequestError(`${surface} does not carry authority: a "${authority.kind}" association belongs to the ` +
|
|
361
|
-
'`permissions` surface — use grantAccess()/revokeAccess(), or the `permissions` change-set key.');
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* The mirror of assertDataAssociations(): the `permissions` surface takes
|
|
365
|
-
* authority kinds alone, so a tag routed through it is refused rather than
|
|
366
|
-
* quietly becoming an ACL entry the `associations` projection never shows.
|
|
367
|
-
*/
|
|
368
|
-
export function assertAuthorityAssociations(permissions, surface) {
|
|
369
|
-
const data = permissions.find((a) => namesKind(a) && !isAuthorityAssociation(a));
|
|
370
|
-
if (!data)
|
|
371
|
-
return;
|
|
372
|
-
throw new StackBadRequestError(`${surface} carries authority alone: a "${data.kind}" association belongs to the ` +
|
|
373
|
-
'`associations` surface — use associate()/dissociate(), or the `associations` change-set key.');
|
|
374
|
-
}
|
|
375
|
-
/** validateAssociation() over a create's `associations` array. */
|
|
376
|
-
/**
|
|
377
|
-
* Every association in a list, plus the one rule a list has that a single
|
|
378
|
-
* association does not: **identities are distinct**. A list naming one
|
|
379
|
-
* identity twice describes a state no store can hold — an adapter keys
|
|
380
|
-
* associations by identity, so the second entry displaces the first — and
|
|
381
|
-
* which of the two the record ends up with is a question the caller did
|
|
382
|
-
* not mean to ask. Refused rather than collapsed, for the reason an empty
|
|
383
|
-
* change set is refused: every way of producing one is a caller bug.
|
|
384
|
-
* See docs/spec/data-model.md § Associations.
|
|
385
|
-
*/
|
|
386
|
-
export function validateAssociations(associations, path = 'associations') {
|
|
387
|
-
const list = associations ?? [];
|
|
388
|
-
return [
|
|
389
|
-
...list.flatMap((a, i) => validateAssociation(a, `${path}[${i}]`)),
|
|
390
|
-
...list.flatMap((a, i) => list.slice(0, i).some((b) => associationEqual(a, b))
|
|
391
|
-
? [
|
|
392
|
-
{
|
|
393
|
-
path: `${path}[${i}]`,
|
|
394
|
-
message: `Duplicate association identity: ${a.kind} "${a.label}"${granteeSuffix(a)} is named more than once.`,
|
|
395
|
-
},
|
|
396
|
-
]
|
|
397
|
-
: []),
|
|
398
|
-
];
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* Hold an association edit list to the rules every verb shares: non-empty,
|
|
402
|
-
* every element a known `op` over a well-formed association, one surface,
|
|
403
|
-
* and each identity named once — a list that both removes and adds one
|
|
404
|
-
* identity is the same ambiguity as naming it twice. `repoint` is the
|
|
405
|
-
* journal's word, never a request. Asked of the whole list before anything
|
|
406
|
-
* is read or written. See docs/spec/data-model.md § Mutations.
|
|
407
|
-
*/
|
|
408
|
-
export function assertAssociationEdits(changes, surface, half) {
|
|
409
|
-
if (!Array.isArray(changes) || changes.length === 0) {
|
|
410
|
-
throw new StackValidationError([
|
|
411
|
-
{ path: 'changes', message: `${surface} names at least one change.` },
|
|
412
|
-
]);
|
|
413
|
-
}
|
|
414
|
-
const errors = [];
|
|
415
|
-
changes.forEach((raw, i) => {
|
|
416
|
-
const path = `changes[${i}]`;
|
|
417
|
-
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
418
|
-
errors.push({ path, message: `${path} must be an object.` });
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
const edit = raw;
|
|
422
|
-
if (edit.op !== 'repoint')
|
|
423
|
-
assertKnownKeys(edit, ['op', 'association'], path);
|
|
424
|
-
if (edit.op === 'repoint') {
|
|
425
|
-
errors.push({
|
|
426
|
-
path: `${path}.op`,
|
|
427
|
-
message: 'op: "repoint" is recorded by the journal, not requested. ' +
|
|
428
|
-
"Send { op: 'add', association }: an add naming an attachment the record already holds re-points it in place.",
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
else if (edit.op !== 'add' && edit.op !== 'remove') {
|
|
432
|
-
errors.push({ path: `${path}.op`, message: 'op must be "add" or "remove".' });
|
|
433
|
-
}
|
|
434
|
-
errors.push(...validateAssociation(edit.association, `${path}.association`));
|
|
435
|
-
});
|
|
436
|
-
if (errors.length > 0)
|
|
437
|
-
throw new StackValidationError(errors);
|
|
438
|
-
const associations = changes.map((c) => c.association);
|
|
439
|
-
if (half === 'data')
|
|
440
|
-
assertDataAssociations(associations, surface);
|
|
441
|
-
else
|
|
442
|
-
assertAuthorityAssociations(associations, surface);
|
|
443
|
-
const duplicates = [];
|
|
444
|
-
associations.forEach((a, i) => {
|
|
445
|
-
if (associations.slice(0, i).some((b) => associationEqual(a, b))) {
|
|
446
|
-
duplicates.push({
|
|
447
|
-
path: `changes[${i}]`,
|
|
448
|
-
message: `Duplicate association identity: ${a.kind} "${a.label}"${granteeSuffix(a)} is named more than once.`,
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
if (duplicates.length > 0)
|
|
453
|
-
throw new StackValidationError(duplicates);
|
|
454
|
-
}
|
|
455
271
|
/**
|
|
456
272
|
* Reject an association filter that names neither of its halves, or whose
|
|
457
273
|
* relationship target is malformed. `RelatedToFilter` and `AttachmentFilter`
|
|
@@ -478,6 +294,17 @@ export function assertValidAssociationFilters(filter) {
|
|
|
478
294
|
if (errors.length > 0)
|
|
479
295
|
throw new StackBadRequestError(errors[0].message);
|
|
480
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Refuse a `baseId` argument that cannot name a type family, as an
|
|
299
|
+
* argument error prefixed with the `surface` it was passed to. See
|
|
300
|
+
* familyIdProblem().
|
|
301
|
+
*/
|
|
302
|
+
export function assertFamilyId(baseId, surface) {
|
|
303
|
+
const problem = familyIdProblem(baseId, surface);
|
|
304
|
+
if (problem) {
|
|
305
|
+
throw new StackValidationError([{ path: 'baseId', message: problem }], ARGUMENTS_INVALID);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
481
308
|
/**
|
|
482
309
|
* Refuse a `baseId` carrying an `@version` suffix. A family filter resolves
|
|
483
310
|
* against registered families, so a TypeId there would match nothing and
|
|
@@ -491,20 +318,13 @@ export function assertValidBaseIdFilter(filter) {
|
|
|
491
318
|
.filter((m) => m !== null)
|
|
492
319
|
.map((message) => ({ path: 'filter.baseId', message }));
|
|
493
320
|
if (errors.length > 0)
|
|
494
|
-
throw new StackValidationError(errors);
|
|
321
|
+
throw new StackValidationError(errors, ARGUMENTS_INVALID);
|
|
495
322
|
}
|
|
496
323
|
/**
|
|
497
|
-
* Hold a journal window to
|
|
498
|
-
*
|
|
499
|
-
*
|
|
500
|
-
*
|
|
501
|
-
* LIMIT as "no ceiling" and returns the whole log. Neither is what the
|
|
502
|
-
* caller asked for, and the disagreement is invisible until a stack
|
|
503
|
-
* changes adapters. Refuse at the surface so no adapter has to guess.
|
|
504
|
-
*
|
|
505
|
-
* No ceiling is imposed: unlike a query, omitting `limit` reads the whole
|
|
506
|
-
* log by contract, so a clamp would silently truncate exactly the caller
|
|
507
|
-
* reconstructing an association's full history.
|
|
324
|
+
* Hold a journal window to a shape both adapters honor identically: a
|
|
325
|
+
* negative `limit` drops the newest entry from a JS slice but reads as no
|
|
326
|
+
* ceiling in SQLite. No ceiling is imposed — omitting `limit` reads the
|
|
327
|
+
* whole log by contract, which a clamp would silently truncate.
|
|
508
328
|
*/
|
|
509
329
|
export function assertValidJournalQuery(query) {
|
|
510
330
|
if (!query)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-validation.js","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-validation.js","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"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"}
|