@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/schema.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Stack — Schema Utilities
|
|
3
3
|
* -------------------------------------------------------
|
|
4
|
-
*
|
|
4
|
+
* What can be said about a TypeSchema and a TypeId without a stack: a
|
|
5
|
+
* schema's hash, whether one schema reads as another, whether one is a
|
|
6
|
+
* legal in-place evolution of another, and how a TypeId splits into its
|
|
7
|
+
* family and version.
|
|
5
8
|
*
|
|
6
9
|
* Hashing produces a stable SHA-256 fingerprint of a TypeSchema
|
|
7
10
|
* by canonicalizing it first (alphabetical keys, minified JSON).
|
|
8
11
|
* This is used for drift detection — not type identity, which is
|
|
9
12
|
* the namespaced ID controlled by the app author.
|
|
10
13
|
*/
|
|
14
|
+
import { formatEnumValues } from './validate.js';
|
|
11
15
|
// -------------------------------------------------------
|
|
12
16
|
// Canonical schema serialization
|
|
13
17
|
// -------------------------------------------------------
|
|
@@ -51,11 +55,11 @@ const canonicalizeFieldDef = (def) => {
|
|
|
51
55
|
...(def.required !== undefined && { required: def.required }),
|
|
52
56
|
};
|
|
53
57
|
}
|
|
54
|
-
// Scalar.
|
|
58
|
+
// Scalar. An enum's `values` are sorted so reordering them is not a change.
|
|
55
59
|
return {
|
|
56
|
-
...(def.kind === 'string' && def.enum && { enum: [...def.enum].sort() }),
|
|
57
60
|
kind: def.kind,
|
|
58
61
|
...(def.required !== undefined && { required: def.required }),
|
|
62
|
+
...(def.kind === 'enum' && { values: [...def.values].sort() }),
|
|
59
63
|
};
|
|
60
64
|
};
|
|
61
65
|
const canonicalizeSchema = (schema) => {
|
|
@@ -83,20 +87,22 @@ export const hashSchema = async (schema) => {
|
|
|
83
87
|
// -------------------------------------------------------
|
|
84
88
|
/**
|
|
85
89
|
* Kinds acceptable in a candidate field, per required kind. `string` and
|
|
86
|
-
* `text` are mutually acceptable for reading
|
|
87
|
-
*
|
|
90
|
+
* `text` are mutually acceptable for reading, and either accepts an enum,
|
|
91
|
+
* whose values are strings; everything else requires an exact match. A
|
|
92
|
+
* required enum takes the subset rule in isFieldCompatible instead. See
|
|
93
|
+
* docs/spec/data-model.md § Type compatibility.
|
|
88
94
|
*/
|
|
89
95
|
const READ_COMPATIBLE = {
|
|
90
|
-
string: ['string', 'text'],
|
|
91
|
-
text: ['text', 'string'],
|
|
96
|
+
string: ['string', 'text', 'enum'],
|
|
97
|
+
text: ['text', 'string', 'enum'],
|
|
92
98
|
number: ['number'],
|
|
93
99
|
boolean: ['boolean'],
|
|
94
100
|
date: ['date'],
|
|
95
101
|
'record-ref': ['record-ref'],
|
|
96
102
|
'file-ref': ['file-ref'],
|
|
97
103
|
};
|
|
98
|
-
// Candidate schemas can come from another app's Type definition
|
|
99
|
-
//
|
|
104
|
+
// Candidate schemas can come from another app's Type definition, whose
|
|
105
|
+
// shape validation bounds its depth, so recursion into array
|
|
100
106
|
// items / object properties is depth-bounded — matches MAX_VALIDATION_DEPTH
|
|
101
107
|
// in validate.ts. Past the limit we can't verify compatibility, so we
|
|
102
108
|
// fail closed (treat as incompatible) rather than risk a stack overflow.
|
|
@@ -132,6 +138,13 @@ const isFieldCompatible = (candidate, required, depth) => {
|
|
|
132
138
|
}
|
|
133
139
|
if (candidate.kind === 'array' || candidate.kind === 'object')
|
|
134
140
|
return false;
|
|
141
|
+
// A consumer expecting an enum can handle only the values it lists.
|
|
142
|
+
if (required.kind === 'enum') {
|
|
143
|
+
if (candidate.kind !== 'enum')
|
|
144
|
+
return false;
|
|
145
|
+
const allowed = new Set(required.values);
|
|
146
|
+
return candidate.values.every((v) => allowed.has(v));
|
|
147
|
+
}
|
|
135
148
|
return READ_COMPATIBLE[required.kind].includes(candidate.kind);
|
|
136
149
|
};
|
|
137
150
|
const isCompatibleAtDepth = (candidateSchema, requiredSchema, depth) => {
|
|
@@ -162,7 +175,10 @@ const diffField = (path, stored, candidate, depth, violations) => {
|
|
|
162
175
|
violations.push({ path, message: 'exceeds max nesting depth; cannot verify additive change' });
|
|
163
176
|
return;
|
|
164
177
|
}
|
|
165
|
-
|
|
178
|
+
// An enum becoming a string accepts strictly more, so it is the one kind
|
|
179
|
+
// change that is additive.
|
|
180
|
+
const widensEnum = stored.kind === 'enum' && candidate.kind === 'string';
|
|
181
|
+
if (stored.kind !== candidate.kind && !widensEnum) {
|
|
166
182
|
violations.push({
|
|
167
183
|
path,
|
|
168
184
|
message: `kind changed from "${stored.kind}" to "${candidate.kind}"`,
|
|
@@ -175,21 +191,12 @@ const diffField = (path, stored, candidate, depth, violations) => {
|
|
|
175
191
|
message: `required changed from ${!!stored.required} to ${!!candidate.required}`,
|
|
176
192
|
});
|
|
177
193
|
}
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
else if (stored.enum && candidate.enum) {
|
|
185
|
-
const kept = new Set(candidate.enum);
|
|
186
|
-
const removed = stored.enum.filter((v) => !kept.has(v));
|
|
187
|
-
if (removed.length > 0) {
|
|
188
|
-
violations.push({
|
|
189
|
-
path,
|
|
190
|
-
message: `enum values removed: ${removed.map((v) => JSON.stringify(v)).join(', ')}`,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
194
|
+
// Losing a value narrows what an enum accepts; gaining one widens it.
|
|
195
|
+
if (stored.kind === 'enum' && candidate.kind === 'enum') {
|
|
196
|
+
const kept = new Set(candidate.values);
|
|
197
|
+
const removed = stored.values.filter((v) => !kept.has(v));
|
|
198
|
+
if (removed.length > 0) {
|
|
199
|
+
violations.push({ path, message: `enum values removed: ${formatEnumValues(removed)}` });
|
|
193
200
|
}
|
|
194
201
|
}
|
|
195
202
|
// Opening a declared container, or closing an open one, changes which
|
|
@@ -252,6 +259,14 @@ export const diffSchemas = (stored, candidate) => {
|
|
|
252
259
|
diffFields('', stored, candidate, 0, violations);
|
|
253
260
|
return violations;
|
|
254
261
|
};
|
|
262
|
+
/**
|
|
263
|
+
* A schema's top-level `file-ref` fields — the content half of what a
|
|
264
|
+
* record references, beside its attachment associations. A nested one is
|
|
265
|
+
* validated but is not a reference. See docs/spec/data-model.md § Types.
|
|
266
|
+
*/
|
|
267
|
+
export const fileRefFields = (schema) => Object.entries(schema)
|
|
268
|
+
.filter(([, def]) => def.kind === 'file-ref')
|
|
269
|
+
.map(([field]) => field);
|
|
255
270
|
// -------------------------------------------------------
|
|
256
271
|
// Type ID parsing
|
|
257
272
|
// -------------------------------------------------------
|
|
@@ -266,17 +281,31 @@ export const parseTypeId = (typeId) => {
|
|
|
266
281
|
return null;
|
|
267
282
|
return { baseId: match[1], version: parseInt(match[2], 10) };
|
|
268
283
|
};
|
|
269
|
-
/**
|
|
270
|
-
* Build a versioned TypeId from a base ID and version number.
|
|
271
|
-
* e.g. ("com.example.myapp/note", 2) → "com.example.myapp/note@2"
|
|
272
|
-
*/
|
|
273
|
-
export const buildTypeId = (baseId, version) => `${baseId}@${version}`;
|
|
274
284
|
/**
|
|
275
285
|
* Extract the base (family) ID from a TypeId, tolerating an already-bare
|
|
276
286
|
* baseId (no "@n" suffix) as a no-op. Used to compare across versions —
|
|
277
287
|
* e.g. a grant on "comment@1" and a record at "comment@2" share a baseId.
|
|
278
288
|
*/
|
|
279
289
|
export const baseIdOf = (typeId) => parseTypeId(typeId)?.baseId ?? typeId;
|
|
290
|
+
/**
|
|
291
|
+
* Why `migratesFrom` cannot be the lineage of `id`, or null if it can. A
|
|
292
|
+
* version migrates from an earlier version of its own family; a step into
|
|
293
|
+
* another family is a migration, not lineage. See docs/spec/data-model.md
|
|
294
|
+
* § Type migrations.
|
|
295
|
+
*/
|
|
296
|
+
export const lineageProblem = (id, migratesFrom) => {
|
|
297
|
+
if (migratesFrom === undefined)
|
|
298
|
+
return null;
|
|
299
|
+
const self = parseTypeId(id);
|
|
300
|
+
const from = typeof migratesFrom === 'string' ? parseTypeId(migratesFrom) : null;
|
|
301
|
+
if (!self || !from) {
|
|
302
|
+
return `migratesFrom must be a versioned TypeId, e.g. "com.example.myapp/note@1".`;
|
|
303
|
+
}
|
|
304
|
+
if (from.baseId !== self.baseId || from.version >= self.version) {
|
|
305
|
+
return `"${id}" cannot migrate from "${migratesFrom}": migratesFrom names an earlier version of the same family.`;
|
|
306
|
+
}
|
|
307
|
+
return null;
|
|
308
|
+
};
|
|
280
309
|
/**
|
|
281
310
|
* Why `value` cannot name a type family, or null if it can. A family is a
|
|
282
311
|
* bare `BaseId`; a versioned TypeId names one version and is refused with the
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope authority
|
|
3
|
+
* -------------------------------------------------------
|
|
4
|
+
* What one (principal, subject) pair may do, as questions with yes-or-no
|
|
5
|
+
* answers: may this request read the record, create this type, reshare,
|
|
6
|
+
* reach this file. ScopedStack turns the answers into refusals and
|
|
7
|
+
* forwards what passes to its Stack; nothing here throws a refusal or
|
|
8
|
+
* writes. See docs/spec/access-control.md § Delegation: principal and
|
|
9
|
+
* subject.
|
|
10
|
+
*/
|
|
11
|
+
import type { AccessMode } from '../access.js';
|
|
12
|
+
import { StackError } from '../errors.js';
|
|
13
|
+
import type { Actor, EntityId, GrantAction, GroupRole, StackRecord, TypeId } from '../types/index.js';
|
|
14
|
+
import type { Stack } from '../stack/stack.js';
|
|
15
|
+
export declare class ScopeAuthority {
|
|
16
|
+
private readonly stack;
|
|
17
|
+
/** Whose grants bound what this request may do — see ScopedStack.principalId. */
|
|
18
|
+
readonly principalId: EntityId | null;
|
|
19
|
+
/** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
|
|
20
|
+
readonly subjectId: EntityId | null;
|
|
21
|
+
constructor(stack: Stack,
|
|
22
|
+
/** Whose grants bound what this request may do — see ScopedStack.principalId. */
|
|
23
|
+
principalId: EntityId | null,
|
|
24
|
+
/** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
|
|
25
|
+
subjectId: EntityId | null);
|
|
26
|
+
private readonly resolveRecord;
|
|
27
|
+
/** Every `_grant` Record — see loadGrantRecords(). */
|
|
28
|
+
readonly loadGrants: () => Promise<StackRecord[]>;
|
|
29
|
+
/** Whether a delegated app is acting for someone other than itself. */
|
|
30
|
+
get delegated(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Whether any grant could name this request — the one question every
|
|
33
|
+
* prefetch asks before scanning the `_grant` family, since an anonymous
|
|
34
|
+
* requester is reached by none. Both identities are read: `asEntity()`
|
|
35
|
+
* refuses an anonymous principal acting for a subject, so they are null
|
|
36
|
+
* together, and saying so costs nothing.
|
|
37
|
+
*/
|
|
38
|
+
get identified(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Who this request is, for stamping onto whatever it mutates. Attribution
|
|
41
|
+
* follows record-level authorship: the subject is the actor, and the
|
|
42
|
+
* principal is named beside it only when the two differ.
|
|
43
|
+
* See docs/spec/data-model.md § Authorship and attribution.
|
|
44
|
+
*/
|
|
45
|
+
get requester(): Actor | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Whether unconditional owner authority applies — the owner acting as
|
|
48
|
+
* itself. The verbs resting on it are irreversible or disclose the sharing
|
|
49
|
+
* graph, so delegation never carries it, whichever side the owner is on.
|
|
50
|
+
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
51
|
+
*/
|
|
52
|
+
get ownerActingAlone(): boolean;
|
|
53
|
+
/** Whether the record's own permissions let the subject `mode` it. */
|
|
54
|
+
recordPermits(record: StackRecord, mode: AccessMode): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Whether `grantee` holds a _grant covering one of `actions` on the type's
|
|
57
|
+
* family. The flags are fixed per side of a delegation and mean nothing
|
|
58
|
+
* alone, so this is reached only through subjectAllows() and
|
|
59
|
+
* principalHolds(). See docs/spec/access-control.md § Who a grant reaches.
|
|
60
|
+
*/
|
|
61
|
+
private hasGrant;
|
|
62
|
+
/**
|
|
63
|
+
* The principal half of a delegated request's authority, which bounds
|
|
64
|
+
* what the subject's reaches so neither lends its reach to the other.
|
|
65
|
+
* Vacuously true without delegation. Default and group grants do not
|
|
66
|
+
* count — see docs/spec/access-control.md § Who a grant reaches.
|
|
67
|
+
*/
|
|
68
|
+
principalAllows(typeId: TypeId, actions: GrantAction[], prefetchedGrants?: StackRecord[]): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* principalAllows() without its shortcuts: whether the principal itself
|
|
71
|
+
* holds a grant naming it for these verbs, read the principal-side way.
|
|
72
|
+
* Also what an installed app's own migration authority rests on — see
|
|
73
|
+
* installMayMigrate().
|
|
74
|
+
*/
|
|
75
|
+
principalHolds(typeId: TypeId, actions: GrantAction[], prefetchedGrants?: StackRecord[]): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* The subject half: which records are reachable, with `-own` matching and
|
|
78
|
+
* default grants in force — the ordinary reading of a grant, since the
|
|
79
|
+
* subject is the entity a grant is written about.
|
|
80
|
+
*/
|
|
81
|
+
subjectAllows(typeId: TypeId, actions: GrantAction[], opts?: {
|
|
82
|
+
record?: StackRecord;
|
|
83
|
+
prefetchedGrants?: StackRecord[];
|
|
84
|
+
groupRoles?: Map<string, GroupRole | null>;
|
|
85
|
+
}): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* How to refuse a record this request addressed by ID: a permission error
|
|
88
|
+
* to a requester who can read it, the not-found answer to anyone else, so
|
|
89
|
+
* `message` only reaches someone holding the record already.
|
|
90
|
+
* See docs/spec/disclosure.md § Which refusal a Record answers with.
|
|
91
|
+
*/
|
|
92
|
+
denialFor(record: StackRecord, message: string): Promise<StackError>;
|
|
93
|
+
canRead(record: StackRecord, prefetchedGrants?: StackRecord[], groupRoles?: Map<string, GroupRole | null>): Promise<boolean>;
|
|
94
|
+
checkCreateGrant(typeId: TypeId): Promise<boolean>;
|
|
95
|
+
/**
|
|
96
|
+
* `_group` records are managed, not merely written: only the owner or an
|
|
97
|
+
* `admin` roster holder may mutate them — ordinary write permissions and
|
|
98
|
+
* grants don't apply. Asked of both identities under delegation, like
|
|
99
|
+
* a reshare. See docs/spec/identity.md § Group.
|
|
100
|
+
*/
|
|
101
|
+
isGroupManager(record: StackRecord): boolean;
|
|
102
|
+
/** Whether one identity, on its own, manages `record` — see isGroupManager(). */
|
|
103
|
+
private managesGroup;
|
|
104
|
+
/**
|
|
105
|
+
* Whether this request may reference `recordId` as a parent or target.
|
|
106
|
+
* Missing and unreadable are both false, so this probes nothing. The
|
|
107
|
+
* owner acting alone skips the lookup and leaves absence to `Stack`.
|
|
108
|
+
* See docs/spec/access-control.md § Reference-creation gating.
|
|
109
|
+
*/
|
|
110
|
+
canReadReferent(recordId: string): Promise<boolean>;
|
|
111
|
+
/**
|
|
112
|
+
* Whether this request can read some record referencing `fileId`, other
|
|
113
|
+
* than an `_attachment@1` record — otherwise one correct guess would
|
|
114
|
+
* unlock unlimited further metadata records for the file.
|
|
115
|
+
* See docs/spec/attachments.md § Creating `_attachment@1` records directly.
|
|
116
|
+
*/
|
|
117
|
+
hasReadableReference(fileId: string): Promise<boolean>;
|
|
118
|
+
/**
|
|
119
|
+
* Whether this request may reference or download `fileId` — the dual of
|
|
120
|
+
* getAttachment()'s access rule. Nonexistent and inaccessible are
|
|
121
|
+
* indistinguishable (both false), so no confirmation oracle for guessed
|
|
122
|
+
* hashes. See docs/spec/access-control.md § Reference-creation gating.
|
|
123
|
+
*/
|
|
124
|
+
canAccessFile(fileId: string): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Whether this request is an installed app, acting as itself, migrating
|
|
127
|
+
* `record` within families its one live install claims, to a version the
|
|
128
|
+
* owner approved, holding `update-any` on each directly.
|
|
129
|
+
* See docs/spec/apps.md § Migrating an installed app's types.
|
|
130
|
+
*/
|
|
131
|
+
installMayMigrate(record: StackRecord, toTypeId: TypeId): Promise<boolean>;
|
|
132
|
+
/** Names of the type's top-level file-ref fields — the content-reference half of referencesFileId matching. */
|
|
133
|
+
fileRefFieldNames(typeId: TypeId): Promise<string[]>;
|
|
134
|
+
/**
|
|
135
|
+
* Whether this request may widen who reaches a record, at create time or
|
|
136
|
+
* after. A delegated app may not, unless the owner is its principal:
|
|
137
|
+
* widening access is what containment most needs to hold.
|
|
138
|
+
* See docs/spec/access-control.md § Delegation: principal and subject.
|
|
139
|
+
*/
|
|
140
|
+
mayGrantAccess(): boolean;
|
|
141
|
+
/**
|
|
142
|
+
* Whether one identity, on its own, may decide who else reaches `record`
|
|
143
|
+
* — the owner-or-creator rule a reshare enforces, asked of one
|
|
144
|
+
* side at a time. See
|
|
145
|
+
* docs/spec/access-control.md § Delegation: principal and subject.
|
|
146
|
+
*/
|
|
147
|
+
private mayReshare;
|
|
148
|
+
/**
|
|
149
|
+
* Whether this request may decide who else reaches `record`: management
|
|
150
|
+
* for a `_group`, so a demoted creator keeps no side door; otherwise the
|
|
151
|
+
* owner-or-author rule, asked of both sides of a delegation.
|
|
152
|
+
* See docs/spec/access-control.md § Record-level permissions.
|
|
153
|
+
*/
|
|
154
|
+
canReshare(record: StackRecord): boolean;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=authority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authority.d.ts","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAA4C,MAAM,cAAc,CAAC;AAiBpF,OAAO,KAAK,EACV,KAAK,EAGL,QAAQ,EACR,WAAW,EAEX,SAAS,EAET,WAAW,EACX,MAAM,EACP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI;IACrC,uFAAuF;IACvF,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI;gBAJlB,KAAK,EAAE,KAAK;IAC7B,iFAAiF;IACxE,WAAW,EAAE,QAAQ,GAAG,IAAI;IACrC,uFAAuF;IAC9E,SAAS,EAAE,QAAQ,GAAG,IAAI;IAGrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CACiB;IAE/C,sDAAsD;IACtD,QAAQ,CAAC,UAAU,QAAO,OAAO,CAAC,WAAW,EAAE,CAAC,CAAiD;IAEjG,uEAAuE;IACvE,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;;;OAMG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;OAKG;IACH,IAAI,SAAS,IAAI,KAAK,GAAG,SAAS,CAKjC;IAED;;;;;OAKG;IACH,IAAI,gBAAgB,IAAI,OAAO,CAK9B;IAED,sEAAsE;IACtE,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAItE;;;;;OAKG;YACW,QAAQ;IAiEtB;;;;;OAKG;IACH,eAAe,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,gBAAgB,CAAC,EAAE,WAAW,EAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;IAMnB;;;;;OAKG;IACH,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,gBAAgB,CAAC,EAAE,WAAW,EAAE,GAC/B,OAAO,CAAC,OAAO,CAAC;IAUnB;;;;OAIG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,GAAE;QACJ,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,gBAAgB,CAAC,EAAE,WAAW,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC;KACvC,GACL,OAAO,CAAC,OAAO,CAAC;IASnB;;;;;OAKG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAUpE,OAAO,CACX,MAAM,EAAE,WAAW,EACnB,gBAAgB,CAAC,EAAE,WAAW,EAAE,EAChC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,GACzC,OAAO,CAAC,OAAO,CAAC;IAYb,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxD;;;;;OAKG;IACH,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAK5C,iFAAiF;IACjF,OAAO,CAAC,YAAY;IAMpB;;;;;OAKG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOzD;;;;;OAKG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB5D;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6CrD;;;;;OAKG;IACG,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmChF,+GAA+G;IACzG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK1D;;;;;OAKG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAKlB;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;CAKzC"}
|