@nxgt/janus 0.1.1 → 0.1.2

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 CHANGED
@@ -618,7 +618,7 @@ could not answer: that is a denial made of an outage.
618
618
 
619
619
  ## Type safety, counted
620
620
 
621
- **Seventy-five plausible mistakes, seventy-five refused at compile time — and
621
+ **Eighty-five plausible mistakes, eighty-five refused at compile time — and
622
622
  one gap, named.**
623
623
 
624
624
  The lists are typechecked and never run, with one `@ts-expect-error` per
@@ -626,13 +626,20 @@ mistake beside the shapes that must keep compiling:
626
626
  `test/types/refusals.ts` (fourteen, on the shared vocabulary),
627
627
  `test/types/port.ts` (fifteen, on the identity stores' port, from the point
628
628
  of view of the person implementing it), `test/types/auth.ts` (twenty, on
629
- `janus()`, from the point of view of the application) and `test/types/permissions.ts` (twenty-six, on the
629
+ `janus()`, from the point of view of the application) and `test/types/permissions.ts` (thirty-six, on the
630
630
  permission model and the questions asked of it). The rule
631
631
  comes from `nxgt-data`, and so does the reason to
632
632
  distrust the claim without the files: when it was last measured on
633
633
  `@nxgt/mongo`, *seven of twelve plausible mistakes still compiled*. A count
634
634
  that goes down is a visible regression.
635
635
 
636
+ Refusing a wrong name is half of it; offering the right ones is the other.
637
+ `src/permissions/completions.spec.ts` asks the TypeScript language service —
638
+ the one every editor asks — what it completes inside `defineModel`: subject
639
+ types and subject sets in a relation, subject types in `fromField`, relations,
640
+ permissions and arrows in a rule and in `when`. It also checks that a wrong
641
+ name's error lists the names it could have been.
642
+
636
643
  The gap, since a measurement that only reports wins is not a measurement:
637
644
  `'30 m'` **satisfies `Duration`**, because TypeScript's `${number}` placeholder
638
645
  tolerates trailing whitespace inside the number. `parseDuration` refuses it, and
@@ -18,7 +18,7 @@
18
18
  * `@nxgt/janus/conformance`.
19
19
  */
20
20
  export { type PermissionsOptions, permissions } from './engine';
21
- export { type Can, type CheckableOf, type ConfigOf, type CtxOf, defineModel, type FieldsOf, type FromField, fromField, type Grant, type GrantableOf, type HolderOf, type List, type ListPage, type Lookup, type LookupGap, type ModelConfig, type ObjectRef, type ObjectTypeDef, type ObjectTypeOf, type PermissionModel, type Permissions, type RelationDef, type ReversibleFromField, type RuleDef, type SubjectRef, type UserTypeOf, type When, when, } from './model';
21
+ export { type Can, type CheckableOf, type ConfigOf, type CtxOf, defineModel, type FieldsOf, type FromField, fromField, type Grant, type GrantableOf, type HolderOf, type List, type ListPage, type Lookup, type LookupGap, type ModelConfig, type ModelTypesOf, type ObjectRef, type ObjectTypeDef, type ObjectTypeOf, type PermissionModel, type Permissions, type RelationDef, type ReversibleFromField, type RuleDef, type SubjectRef, type UserTypeOf, type When, when, } from './model';
22
22
  export { createMemoryRelations } from './port/memory';
23
23
  export type { ObjectPageRequest, RelationChanges, RelationStore, } from './port/types';
24
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EACN,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,SAAS,EACT,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,IAAI,EACT,IAAI,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,GACb,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EACN,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,SAAS,EACT,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,IAAI,EACT,IAAI,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACX,iBAAiB,EACjB,eAAe,EACf,aAAa,GACb,MAAM,cAAc,CAAC"}
@@ -4,12 +4,12 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * A model, resolved: every string parsed once, every reference checked, every\n * refusal a `TypeError` naming where it is.\n *\n * The types refuse most of these first. This is what refuses them for a model\n * built at run time or written in JavaScript, and what refuses what the types\n * cannot see: names, and a permission that reaches itself without crossing a\n * relation.\n */\n\nimport type { Subject } from '../subjects/subject';\nimport type { ModelConfig } from './model';\n\n/** Who may hold a stored relation: a subject type, or a subject set. */\nexport type Holder =\n\t| { readonly kind: 'type'; readonly type: string }\n\t| { readonly kind: 'set'; readonly type: string; readonly relation: string };\n\n/**\n * Whether a stored relation admits `subject` as a holder: an entity of a\n * declared type, or a set of a declared `type#relation`. One rule for what\n * `grant()` writes and what `can()` and `list()` follow — a tuple the model\n * does not admit grants nothing, however it was stored.\n */\nexport function admits(holders: readonly Holder[], subject: Subject): boolean {\n\treturn holders.some((holder) =>\n\t\tholder.kind === 'type'\n\t\t\t? !('relation' in subject) && holder.type === subject.type\n\t\t\t: 'relation' in subject &&\n\t\t\t\tholder.type === subject.type &&\n\t\t\t\tholder.relation === subject.relation,\n\t);\n}\n\nexport type ResolvedRelation =\n\t| { readonly kind: 'stored'; readonly holders: readonly Holder[] }\n\t| {\n\t\t\treadonly kind: 'fromField';\n\t\t\treadonly field: string;\n\t\t\treadonly subject: string;\n\t\t\t/** What `list()` reverses it with. Absent: `list()` cannot reach through it. */\n\t\t\treadonly lookup?: (subjectId: string) => Promise<readonly string[]>;\n\t };\n\n/** One rule of a permission. `test`, when present, must pass for it to grant. */\nexport type ResolvedRule = (\n\t| { readonly kind: 'name'; readonly name: string }\n\t| {\n\t\t\treadonly kind: 'arrow';\n\t\t\treadonly relation: string;\n\t\t\treadonly target: string;\n\t }\n) & { readonly test?: (ctx: never) => boolean };\n\nexport interface ResolvedObjectType {\n\treadonly name: string;\n\treadonly relations: ReadonlyMap<string, ResolvedRelation>;\n\treadonly permissions: ReadonlyMap<string, readonly ResolvedRule[]>;\n}\n\nexport interface ResolvedModel {\n\treadonly subjects: ReadonlySet<string>;\n\treadonly types: ReadonlyMap<string, ResolvedObjectType>;\n}\n\n/** camelCase, as every name in this package — and never `#`, `-`, `>` or `:`, which the notation uses. */\nconst NAME = /^[a-z][A-Za-z0-9]*$/;\n/** A field `fromField` reads: a top-level property. */\nconst FIELD = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport function resolveModel(\n\tconfig: ModelConfig,\n\twhere: string,\n): ResolvedModel {\n\tconst refuse = (message: string) => new TypeError(`${where}: ${message}`);\n\n\tif (!isRecord(config)) throw refuse('pass { subjects, types }');\n\tif (!Array.isArray(config.subjects)) {\n\t\tthrow refuse(\n\t\t\t'subjects must be an array of subject type names — auth.types from janus(), or your own',\n\t\t);\n\t}\n\tfor (const subject of config.subjects) {\n\t\tif (typeof subject !== 'string' || !NAME.test(subject)) {\n\t\t\tthrow refuse(\n\t\t\t\t`the subject type \"${String(subject)}\" must be a camelCase name`,\n\t\t\t);\n\t\t}\n\t}\n\tconst subjects = new Set<string>(config.subjects);\n\n\tif (!isRecord(config.types) || Object.keys(config.types).length === 0) {\n\t\tthrow refuse('types declares no object type');\n\t}\n\tconst typeNames = new Set(Object.keys(config.types));\n\tfor (const name of typeNames) {\n\t\tif (!NAME.test(name)) {\n\t\t\tthrow refuse(\n\t\t\t\t`the object type \"${name}\" must be a camelCase name — letters and digits, starting with a lowercase letter`,\n\t\t\t);\n\t\t}\n\t\tif (subjects.has(name)) {\n\t\t\tthrow refuse(\n\t\t\t\t`\"${name}\" names a user type and an object type; a subject of type \"${name}\" would be ambiguous`,\n\t\t\t);\n\t\t}\n\t}\n\n\t// The relation names first: a subject set or an arrow may name a relation\n\t// of a type declared further down.\n\tconst relationNames = new Map<string, Set<string>>();\n\tconst permissionNames = new Map<string, Set<string>>();\n\tfor (const [name, def] of Object.entries(config.types)) {\n\t\tconst at = `types.${name}`;\n\t\tif (!isRecord(def)) throw refuse(`${at} must be an object`);\n\t\tfor (const key of Object.keys(def)) {\n\t\t\tif (key !== 'relations' && key !== 'permissions') {\n\t\t\t\tthrow refuse(`${at}.${key} is not a key of an object type`);\n\t\t\t}\n\t\t}\n\t\trelationNames.set(name, namesIn(def.relations, `${at}.relations`, refuse));\n\t\tconst permissions = namesIn(def.permissions, `${at}.permissions`, refuse);\n\t\tfor (const permission of permissions) {\n\t\t\tif (relationNames.get(name)?.has(permission)) {\n\t\t\t\tthrow refuse(\n\t\t\t\t\t`${at}: \"${permission}\" names a relation and a permission; rename one`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tpermissionNames.set(name, permissions);\n\t}\n\n\tconst isSubjectType = (type: string) =>\n\t\tsubjects.has(type) || typeNames.has(type);\n\tconst namesOf = (type: string) =>\n\t\tnew Set([\n\t\t\t...(relationNames.get(type) ?? []),\n\t\t\t...(permissionNames.get(type) ?? []),\n\t\t]);\n\n\tconst types = new Map<string, ResolvedObjectType>();\n\tfor (const [name, def] of Object.entries(config.types)) {\n\t\tconst at = `types.${name}`;\n\t\tconst relations = new Map<string, ResolvedRelation>();\n\n\t\tfor (const [relation, holders] of Object.entries(def.relations ?? {})) {\n\t\t\tconst here = `${at}.relations.${relation}`;\n\t\t\trelations.set(\n\t\t\t\trelation,\n\t\t\t\tresolveRelation(holders, here, {\n\t\t\t\t\trefuse,\n\t\t\t\t\tisSubjectType,\n\t\t\t\t\trelationNames,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tconst permissions = new Map<string, readonly ResolvedRule[]>();\n\t\tfor (const [permission, rules] of Object.entries(def.permissions ?? {})) {\n\t\t\tconst here = `${at}.permissions.${permission}`;\n\t\t\tif (!Array.isArray(rules) || rules.length === 0) {\n\t\t\t\tthrow refuse(`${here} must be a non-empty array of rules`);\n\t\t\t}\n\t\t\tpermissions.set(\n\t\t\t\tpermission,\n\t\t\t\trules.map((rule: unknown, index: number) =>\n\t\t\t\t\tresolveRule(rule, `${here}[${index}]`, {\n\t\t\t\t\t\trefuse,\n\t\t\t\t\t\town: namesOf(name),\n\t\t\t\t\t\trelations,\n\t\t\t\t\t\ttypeNames,\n\t\t\t\t\t\tnamesOf,\n\t\t\t\t\t\tself: name,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\ttypes.set(name, { name, relations, permissions });\n\t}\n\n\trefuseLoops(types, refuse);\n\trefuseDataBeyondRoot(types, refuse);\n\n\treturn { subjects, types };\n}\n\nfunction namesIn(\n\tvalue: unknown,\n\tat: string,\n\trefuse: (message: string) => TypeError,\n): Set<string> {\n\tif (value === undefined) return new Set();\n\tif (!isRecord(value)) throw refuse(`${at} must be an object`);\n\tfor (const name of Object.keys(value)) {\n\t\tif (!NAME.test(name)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${at}: \"${name}\" must be a camelCase name — letters and digits, starting with a lowercase letter`,\n\t\t\t);\n\t\t}\n\t}\n\treturn new Set(Object.keys(value));\n}\n\nfunction resolveRelation(\n\tvalue: unknown,\n\there: string,\n\t{\n\t\trefuse,\n\t\tisSubjectType,\n\t\trelationNames,\n\t}: {\n\t\trefuse: (message: string) => TypeError;\n\t\tisSubjectType: (type: string) => boolean;\n\t\trelationNames: ReadonlyMap<string, ReadonlySet<string>>;\n\t},\n): ResolvedRelation {\n\tif (isRecord(value) && value.kind === 'fromField') {\n\t\tconst { field, subject, lookup } = value;\n\t\tif (typeof field !== 'string' || !FIELD.test(field)) {\n\t\t\tthrow refuse(`${here}: fromField must name a top-level field`);\n\t\t}\n\t\tif (typeof subject !== 'string' || !isSubjectType(subject)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${here}: fromField names \"${String(subject)}\", which is not a subject type`,\n\t\t\t);\n\t\t}\n\t\tif (lookup !== undefined && typeof lookup !== 'function') {\n\t\t\tthrow refuse(`${here}: fromField's lookup must be a function`);\n\t\t}\n\t\treturn lookup === undefined\n\t\t\t? { kind: 'fromField', field, subject }\n\t\t\t: {\n\t\t\t\t\tkind: 'fromField',\n\t\t\t\t\tfield,\n\t\t\t\t\tsubject,\n\t\t\t\t\tlookup: lookup as (subjectId: string) => Promise<readonly string[]>,\n\t\t\t\t};\n\t}\n\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\tthrow refuse(\n\t\t\t`${here} must be a non-empty array of subject types, or fromField()`,\n\t\t);\n\t}\n\tconst holders = value.map((holder: unknown): Holder => {\n\t\tif (typeof holder !== 'string') {\n\t\t\tthrow refuse(`${here}: a holder must be a string`);\n\t\t}\n\t\tconst hash = holder.indexOf('#');\n\t\tif (hash < 0) {\n\t\t\tif (!isSubjectType(holder)) {\n\t\t\t\tthrow refuse(`${here}: \"${holder}\" is not a subject type`);\n\t\t\t}\n\t\t\treturn { kind: 'type', type: holder };\n\t\t}\n\t\tconst type = holder.slice(0, hash);\n\t\tconst relation = holder.slice(hash + 1);\n\t\tif (!relationNames.get(type)?.has(relation)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${here}: \"${holder}\" is not a subject set — it must name an object type and one of its relations`,\n\t\t\t);\n\t\t}\n\t\treturn { kind: 'set', type, relation };\n\t});\n\treturn { kind: 'stored', holders };\n}\n\nfunction resolveRule(\n\tvalue: unknown,\n\there: string,\n\tcontext: {\n\t\trefuse: (message: string) => TypeError;\n\t\town: ReadonlySet<string>;\n\t\trelations: ReadonlyMap<string, ResolvedRelation>;\n\t\ttypeNames: ReadonlySet<string>;\n\t\tnamesOf: (type: string) => ReadonlySet<string>;\n\t\tself: string;\n\t},\n): ResolvedRule {\n\tconst { refuse } = context;\n\n\tif (isRecord(value) && value.kind === 'when') {\n\t\tif (typeof value.test !== 'function') {\n\t\t\tthrow refuse(`${here}: when() takes a function as its test`);\n\t\t}\n\t\tconst inner = resolveRule(value.rule, here, context);\n\t\treturn { ...inner, test: value.test as (ctx: never) => boolean };\n\t}\n\tif (typeof value !== 'string') {\n\t\tthrow refuse(`${here}: a rule is a name, an arrow, or when()`);\n\t}\n\n\tconst arrow = value.indexOf('->');\n\tif (arrow < 0) {\n\t\tif (!context.own.has(value)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${here}: \"${value}\" is not a relation or a permission of ${context.self}`,\n\t\t\t);\n\t\t}\n\t\treturn { kind: 'name', name: value };\n\t}\n\n\tconst relation = value.slice(0, arrow);\n\tconst target = value.slice(arrow + 2);\n\tconst through = context.relations.get(relation);\n\tif (through === undefined) {\n\t\tthrow refuse(\n\t\t\t`${here}: \"${value}\" goes through \"${relation}\", which is not a relation of ${context.self}`,\n\t\t);\n\t}\n\tconst targets =\n\t\tthrough.kind === 'fromField'\n\t\t\t? [through.subject]\n\t\t\t: through.holders.map((holder) =>\n\t\t\t\t\tholder.kind === 'type' ? holder.type : null,\n\t\t\t\t);\n\tfor (const type of targets) {\n\t\t// A subject set, or a user type, has no permissions to follow.\n\t\tif (type === null || !context.typeNames.has(type)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${here}: \"${value}\" goes through \"${relation}\", which can hold ${type === null ? 'a subject set' : `a ${type}`}; an arrow follows object types only`,\n\t\t\t);\n\t\t}\n\t\tif (!context.namesOf(type).has(target)) {\n\t\t\tthrow refuse(\n\t\t\t\t`${here}: \"${value}\" names \"${target}\", which ${type} does not declare`,\n\t\t\t);\n\t\t}\n\t}\n\treturn { kind: 'arrow', relation, target };\n}\n\n/**\n * A permission that reaches itself through names alone — `view: ['edit']`,\n * `edit: ['view']` — never reaches a relation, so no data could end the walk.\n * Refused here rather than cut at run time: it is a model's bug, not a\n * user's data.\n */\nfunction refuseLoops(\n\ttypes: ReadonlyMap<string, ResolvedObjectType>,\n\trefuse: (message: string) => TypeError,\n): void {\n\tfor (const type of types.values()) {\n\t\tconst visiting: string[] = [];\n\t\tconst done = new Set<string>();\n\n\t\tconst visit = (permission: string): void => {\n\t\t\tif (done.has(permission)) return;\n\t\t\tconst loop = visiting.indexOf(permission);\n\t\t\tif (loop >= 0) {\n\t\t\t\tthrow refuse(\n\t\t\t\t\t`types.${type.name}.permissions: ${[...visiting.slice(loop), permission].join(' → ')} is a loop no relation ends`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tvisiting.push(permission);\n\t\t\tfor (const rule of type.permissions.get(permission) ?? []) {\n\t\t\t\tif (rule.kind === 'name' && type.permissions.has(rule.name)) {\n\t\t\t\t\tvisit(rule.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvisiting.pop();\n\t\t\tdone.add(permission);\n\t\t};\n\n\t\tfor (const permission of type.permissions.keys()) visit(permission);\n\t}\n}\n\n/**\n * A `fromField` is read from the object `can()` was given — the route loaded\n * it (decided 2026-09-24). An object reached through a subject set or an arrow\n * was loaded by nobody, so a rule that needs its data could never be decided.\n * Refused here, where it is a sentence, rather than at the first check that\n * reaches it, where it would be a denial nobody can explain.\n */\nfunction refuseDataBeyondRoot(\n\ttypes: ReadonlyMap<string, ResolvedObjectType>,\n\trefuse: (message: string) => TypeError,\n): void {\n\t/** The field `name` of `type` reads, directly or through its own rules; `null` when none. */\n\tconst fieldRead = (type: ResolvedObjectType, name: string): string | null => {\n\t\tconst relation = type.relations.get(name);\n\t\tif (relation !== undefined) {\n\t\t\treturn relation.kind === 'fromField' ? relation.field : null;\n\t\t}\n\t\tfor (const rule of type.permissions.get(name) ?? []) {\n\t\t\tconst field =\n\t\t\t\trule.kind === 'name'\n\t\t\t\t\t? fieldRead(type, rule.name)\n\t\t\t\t\t: // An arrow reads its own relation on this object.\n\t\t\t\t\t\tfieldRead(type, rule.relation);\n\t\t\tif (field !== null) return field;\n\t\t}\n\t\treturn null;\n\t};\n\n\tfor (const type of types.values()) {\n\t\tfor (const [relation, def] of type.relations) {\n\t\t\tif (def.kind !== 'stored') continue;\n\t\t\tfor (const holder of def.holders) {\n\t\t\t\tif (holder.kind !== 'set') continue;\n\t\t\t\tconst target = types.get(holder.type);\n\t\t\t\tconst field =\n\t\t\t\t\ttarget === undefined ? null : fieldRead(target, holder.relation);\n\t\t\t\tif (field !== null) {\n\t\t\t\t\tthrow refuse(\n\t\t\t\t\t\t`types.${type.name}.relations.${relation}: \"${holder.type}#${holder.relation}\" reads ${holder.type}.${field}, and a subject set reaches ${holder.type}s nobody passed to can() — store that relation instead of reading it`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const [permission, rules] of type.permissions) {\n\t\t\tfor (const rule of rules) {\n\t\t\t\tif (rule.kind !== 'arrow') continue;\n\t\t\t\tconst through = type.relations.get(rule.relation);\n\t\t\t\tconst targets =\n\t\t\t\t\tthrough?.kind === 'fromField'\n\t\t\t\t\t\t? [through.subject]\n\t\t\t\t\t\t: (through?.holders ?? []).map((holder) => holder.type);\n\t\t\t\tfor (const name of targets) {\n\t\t\t\t\tconst target = types.get(name);\n\t\t\t\t\tconst field =\n\t\t\t\t\t\ttarget === undefined ? null : fieldRead(target, rule.target);\n\t\t\t\t\tif (field !== null) {\n\t\t\t\t\t\tthrow refuse(\n\t\t\t\t\t\t\t`types.${type.name}.permissions.${permission}: \"${rule.relation}->${rule.target}\" reaches ${name}.${rule.target}, which reads ${name}.${field}, and only the object passed to can() carries its data — store that relation instead of reading it`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n",
6
6
  "/** Reading what a caller passed to `can()`, `list()`, `grant()` and `revoke()`. */\n\nimport type { Subject } from '../subjects/subject';\nimport { admits, type ResolvedModel, type ResolvedObjectType } from './resolve';\n\n/** What no part of an id may hold: the notation would read it two ways. */\nconst RESERVED = /[@#()]/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nexport function idOf(value: unknown, what: string, where: string): string {\n\tif (typeof value !== 'string' || value === '' || RESERVED.test(value)) {\n\t\tthrow new TypeError(\n\t\t\t`${where}: ${what} must be a non-empty string without @, # or parentheses`,\n\t\t);\n\t}\n\treturn value;\n}\n\nexport function typeOf(\n\tmodel: ResolvedModel,\n\tname: string,\n\twhere: string,\n): ResolvedObjectType {\n\tconst type = model.types.get(name);\n\tif (type === undefined) {\n\t\tthrow new TypeError(\n\t\t\t`${where}: \"${name}\" is not an object type of the model`,\n\t\t);\n\t}\n\treturn type;\n}\n\nexport function objectOf(\n\tmodel: ResolvedModel,\n\tvalue: unknown,\n\twhere: string,\n): {\n\treadonly type: string;\n\treadonly id: string;\n\treadonly data: Readonly<Record<string, unknown>>;\n} {\n\tif (!isRecord(value) || typeof value.type !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`${where}: the object must be { type, id, …its fields }`,\n\t\t);\n\t}\n\ttypeOf(model, value.type, where);\n\treturn {\n\t\ttype: value.type,\n\t\tid: idOf(value.id, 'the object id', where),\n\t\tdata: value,\n\t};\n}\n\n/**\n * The subject as the store compares it: `{ type, id }` for a user or an\n * object, and `{ type, id, relation }` for a subject set.\n *\n * Decided by the type, not the shape: a user's fields are flat on it, and one\n * named `relation` must not make a user read as a set. A user type is never a\n * set; an object type is one when `relation` is given.\n */\nexport function subjectOf(\n\tmodel: ResolvedModel,\n\tvalue: unknown,\n\twhere: string,\n): Subject {\n\tif (!isRecord(value) || typeof value.type !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`${where}: the subject must be a user, or { type, id }`,\n\t\t);\n\t}\n\tconst id = idOf(value.id, 'the subject id', where);\n\tif (model.subjects.has(value.type)) return { type: value.type, id };\n\n\tconst type = typeOf(model, value.type, where);\n\tif (typeof value.relation !== 'string') return { type: type.name, id };\n\tif (!type.relations.has(value.relation)) {\n\t\tthrow new TypeError(\n\t\t\t`${where}: \"${value.relation}\" is not a relation of ${type.name}, so ${type.name}:${id}#${value.relation} is no subject set`,\n\t\t);\n\t}\n\treturn { type: type.name, id, relation: value.relation };\n}\n\n/** A tuple `grant` or `revoke` may write: a stored relation, and a holder it admits. */\nexport function tupleOf(\n\tmodel: ResolvedModel,\n\tobject: unknown,\n\trelation: string,\n\tsubject: unknown,\n\twhere: string,\n) {\n\tconst target = objectOf(model, object, where);\n\tconst type = typeOf(model, target.type, where);\n\tconst def = type.relations.get(relation);\n\tif (def === undefined) {\n\t\tthrow new TypeError(\n\t\t\t`${where}: \"${relation}\" is not a relation of ${type.name}`,\n\t\t);\n\t}\n\tif (def.kind === 'fromField') {\n\t\tthrow new TypeError(\n\t\t\t`${where}: ${type.name}.${relation} is read from ${def.field}; there is nothing to store — change the ${type.name} instead`,\n\t\t);\n\t}\n\n\tconst who = subjectOf(model, subject, where);\n\tif (!admits(def.holders, who)) {\n\t\tthrow new TypeError(\n\t\t\t`${where}: ${type.name}.${relation} is not held by ${'relation' in who ? `${who.type}#${who.relation}` : who.type}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tobject: { type: target.type, id: target.id },\n\t\trelation,\n\t\tsubject: who,\n\t};\n}\n",
7
- "/**\n * The permission model: which object types exist, which relations they hold,\n * and which permissions those relations grant — written in TypeScript, and\n * typed from itself.\n *\n * **ReBAC, embedded.** Zanzibar's data model — relations between objects and\n * subjects, permissions computed from them — without its infrastructure: the\n * database is the application's own, so reads follow writes and there is\n * nothing to cache or sequence. Two things go beyond Zanzibar's descendants:\n *\n * - **`fromField`**, a relation read from the object's own data — a record's\n * `doctorId` — rather than a tuple to keep in sync with it. Two sources of\n * truth for one fact is the first trap of a Zanzibar deployment;\n * - **`when`**, a condition written in TypeScript and typed: its `ctx` is what\n * `can()` then requires, and only for the permissions whose rules reach it.\n *\n * The model is a flat `const` literal, and everything the compiler can check\n * about it is checked here: a relation naming a subject type that does not\n * exist, a permission naming a relation that does not exist, an arrow to a\n * permission its target does not have. What only running it can check —\n * names, cycles — is refused by {@link defineModel} with a `TypeError`.\n */\n\nimport type { CursorPage } from '../pagination/cursor-page';\nimport { type ResolvedModel, resolveModel } from './resolve';\n\n// ─── The two building blocks ──────────────────────────────────────────────\n\n/**\n * The ids of the objects whose field names this subject id — what `list()`\n * needs to reverse a `fromField`: `(doctorId) => db.records.ids({ doctorId })`.\n * Unpaged; a failure throws, as a store's does.\n */\nexport type Lookup = (subjectId: string) => Promise<readonly string[]>;\n\n/**\n * A relation read from the object's own data: `fromField('doctorId', 'staff')`\n * holds for the subject of type `staff` whose id is `object.doctorId`.\n *\n * Nothing is stored. `can()` receives the object — the route has already\n * loaded it — and the compiler requires the field on it. `list()` cannot read\n * a field of objects it has not found yet, so it asks `lookup` instead; a\n * `list()` that would need one it was not given is a compile error.\n */\nexport interface FromField<\n\tField extends string = string,\n\tSubject extends string = string,\n> {\n\treadonly kind: 'fromField';\n\treadonly field: Field;\n\treadonly subject: Subject;\n\treadonly lookup?: Lookup;\n}\n\n/** A `fromField` `list()` can reverse. */\nexport interface ReversibleFromField<\n\tField extends string = string,\n\tSubject extends string = string,\n> extends FromField<Field, Subject> {\n\treadonly lookup: Lookup;\n}\n\nexport function fromField<\n\tconst Field extends string,\n\tconst Subject extends string,\n>(field: Field, subject: Subject): FromField<Field, Subject>;\nexport function fromField<\n\tconst Field extends string,\n\tconst Subject extends string,\n>(\n\tfield: Field,\n\tsubject: Subject,\n\toptions: { readonly lookup: Lookup },\n): ReversibleFromField<Field, Subject>;\nexport function fromField(\n\tfield: string,\n\tsubject: string,\n\toptions?: { readonly lookup: Lookup },\n): FromField {\n\treturn Object.freeze(\n\t\toptions === undefined\n\t\t\t? { kind: 'fromField' as const, field, subject }\n\t\t\t: { kind: 'fromField' as const, field, subject, lookup: options.lookup },\n\t);\n}\n\n/**\n * A rule that grants only when `test(ctx)` is true: `when('doctor', (ctx:\n * { onShift: boolean }) => ctx.onShift)`.\n *\n * `rule` is any rule of the same object type — a relation, a permission, an\n * arrow. The test is synchronous and pure: it decides on what the caller\n * passes, and reads nothing, so it can never fail the way a store can.\n */\nexport interface When<Rule extends string = string, Ctx = never> {\n\treadonly kind: 'when';\n\treadonly rule: Rule;\n\treadonly test: (ctx: Ctx) => boolean;\n}\n\nexport function when<const Rule extends string, Ctx>(\n\trule: Rule,\n\ttest: (ctx: Ctx) => boolean,\n): When<Rule, Ctx> {\n\treturn Object.freeze({ kind: 'when', rule, test });\n}\n\n// ─── The shape of a model ─────────────────────────────────────────────────\n\n/**\n * Who may hold a relation: subject types — `'staff'`, a user type, or `'team'`,\n * an object type — and subject sets, `'team#member'`: every member of a team.\n * Or a relation read from the object's data.\n */\nexport type RelationDef = readonly string[] | FromField;\n\n/**\n * One way to hold a permission: a relation or a permission of the same object\n * type (`'doctor'`, `'manage'`), an arrow to a permission of a related object\n * (`'team->view'`: who can view the record's team), or one of those under a\n * condition.\n */\nexport type RuleDef = string | When<string, never>;\n\nexport interface ObjectTypeDef {\n\treadonly relations?: { readonly [name: string]: RelationDef };\n\t/** Each permission is the union of its rules. */\n\treadonly permissions?: { readonly [name: string]: readonly RuleDef[] };\n}\n\nexport interface ModelConfig {\n\t/**\n\t * The user types that can be subjects — pass `auth.types` from `janus()`,\n\t * so a user type and a subject type are one name.\n\t */\n\treadonly subjects: readonly string[];\n\treadonly types: { readonly [name: string]: ObjectTypeDef };\n}\n\n// ─── Reading a model's types ──────────────────────────────────────────────\n\ntype TypesOf<C extends ModelConfig> = C['types'];\n\n/** The object types a model declares. */\nexport type ObjectTypeOf<C extends ModelConfig> = keyof TypesOf<C> & string;\n\n/** The user types a model accepts as subjects. */\nexport type UserTypeOf<C extends ModelConfig> = C['subjects'][number];\n\ntype RelationsOf<Ts, T> = T extends keyof Ts\n\t? Ts[T] extends { readonly relations: infer R }\n\t\t? keyof R & string\n\t\t: never\n\t: never;\n\ntype PermissionsOf<Ts, T> = T extends keyof Ts\n\t? Ts[T] extends { readonly permissions: infer P }\n\t\t? keyof P & string\n\t\t: never\n\t: never;\n\ntype NamesOf<Ts, T> = RelationsOf<Ts, T> | PermissionsOf<Ts, T>;\n\ntype RelationDefOf<Ts, T, R> = T extends keyof Ts\n\t? Ts[T] extends { readonly relations: infer Rs }\n\t\t? R extends keyof Rs\n\t\t\t? Rs[R]\n\t\t\t: never\n\t\t: never\n\t: never;\n\n/** The relations of `T` that are stored as tuples: every one but its `fromField`s. */\ntype StoredRelationsOf<Ts, T> = {\n\t[R in RelationsOf<Ts, T>]: RelationDefOf<Ts, T, R> extends FromField\n\t\t? never\n\t\t: R;\n}[RelationsOf<Ts, T>];\n\n/**\n * `'team#member'` for every stored relation of every object type. Not a\n * `fromField`: a subject set reaches objects nobody passed to `can()`, so there\n * is no data to read the field from.\n */\ntype SubjectSetOf<Ts> = {\n\t[T in keyof Ts & string]: `${T}#${StoredRelationsOf<Ts, T>}`;\n}[keyof Ts & string];\n\ntype SubjectRefOf<S extends string, Ts> =\n\t| S\n\t| (keyof Ts & string)\n\t| SubjectSetOf<Ts>;\n\n/** The object types an arrow through `R` reaches: its direct subject types. */\ntype ArrowTargets<Ts, T, R> =\n\tRelationDefOf<Ts, T, R> extends FromField<string, infer Sub>\n\t\t? Sub\n\t\t: RelationDefOf<Ts, T, R> extends readonly (infer E)[]\n\t\t\t? E extends `${string}#${string}`\n\t\t\t\t? never\n\t\t\t\t: E\n\t\t\t: never;\n\n/** The names every one of `Targets` declares. */\ntype CommonNames<Ts, Targets> =\n\tNamesOf<Ts, Targets> extends infer N\n\t\t? N extends string\n\t\t\t? [Targets] extends [TypesNaming<Ts, N>]\n\t\t\t\t? N\n\t\t\t\t: never\n\t\t\t: never\n\t\t: never;\n\ntype TypesNaming<Ts, N> = {\n\t[X in keyof Ts]: N extends NamesOf<Ts, X> ? X : never;\n}[keyof Ts];\n\n/** `'team->view'`, for each relation whose targets are all object types. */\ntype ArrowsOf<Ts, T> = {\n\t[R in RelationsOf<Ts, T>]: [ArrowTargets<Ts, T, R>] extends [never]\n\t\t? never\n\t\t: [ArrowTargets<Ts, T, R>] extends [keyof Ts]\n\t\t\t? `${R}->${CommonNames<Ts, ArrowTargets<Ts, T, R>>}`\n\t\t\t: never;\n}[RelationsOf<Ts, T>];\n\n/** Every string a rule of `T` may be. */\ntype RuleRefOf<Ts, T> = NamesOf<Ts, T> | ArrowsOf<Ts, T>;\n\n/** What `can()` accepts for an object type: its relations and its permissions. */\nexport type CheckableOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n> = NamesOf<TypesOf<C>, T>;\n\n/** The fields an object of type `T` must carry: those its `fromField`s read. */\nexport type FieldsOf<C extends ModelConfig, T extends ObjectTypeOf<C>> = {\n\t[R in RelationsOf<TypesOf<C>, T>]: RelationDefOf<\n\t\tTypesOf<C>,\n\t\tT,\n\t\tR\n\t> extends FromField<infer F, string>\n\t\t? F\n\t\t: never;\n}[RelationsOf<TypesOf<C>, T>];\n\n/**\n * An object, as `can()` takes it: its type and id, and **every field a\n * `fromField` of its type reads** — required, so an object passed without\n * them is a compile error rather than a silent denial. `null` is a field\n * holding nobody.\n */\nexport type ObjectRef<C extends ModelConfig, T extends ObjectTypeOf<C>> = {\n\treadonly type: T;\n\treadonly id: string;\n} & { readonly [F in FieldsOf<C, T>]: string | null };\n\n/** A subject: a user from `janus()` as it is, or an object. */\nexport interface SubjectRef<C extends ModelConfig> {\n\treadonly type: UserTypeOf<C> | ObjectTypeOf<C>;\n\treadonly id: string;\n}\n\n// ─── The context a check requires ─────────────────────────────────────────\n\ntype UnionToIntersection<U> = (\n\tU extends unknown\n\t\t? (union: U) => void\n\t\t: never\n) extends (intersection: infer I) => void\n\t? I\n\t: never;\n\ntype CtxOfRule<E> = E extends When<string, infer X> ? X : never;\n\ntype NameOfRule<E> = E extends string\n\t? E\n\t: E extends When<infer R, never>\n\t\t? R\n\t\t: never;\n\ntype CtxOfName<Ts, T, N, Seen> = N extends `${infer R}->${infer P}`\n\t? CtxOfPermission<Ts, ArrowTargets<Ts, T, R>, P, Seen>\n\t: CtxOfPermission<Ts, T, N, Seen>;\n\n/**\n * The union of the `ctx` types a permission's rules reach — through its own\n * rules, the permissions they name, and arrows into other types. `Seen` stops\n * the walk on a cycle.\n */\ntype CtxOfPermission<Ts, T, P, Seen> = T extends keyof Ts & string\n\t? P extends string\n\t\t? `${T}.${P}` extends Seen\n\t\t\t? never\n\t\t\t: Ts[T] extends { readonly permissions: infer Ps }\n\t\t\t\t? P extends keyof Ps\n\t\t\t\t\t? Ps[P] extends readonly (infer E)[]\n\t\t\t\t\t\t? CtxOfRule<E> | CtxOfName<Ts, T, NameOfRule<E>, Seen | `${T}.${P}`>\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t\t\t: never\n\t\t: never\n\t: never;\n\n/**\n * What `can(…, permission, object)` requires as `ctx`: every condition its\n * rules can reach, intersected. `never` when none — and then `can()` takes no\n * `ctx` at all.\n */\nexport type CtxOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CtxOfPermission<TypesOf<C>, T, P, never>] extends [never]\n\t? never\n\t: UnionToIntersection<CtxOfPermission<TypesOf<C>, T, P, never>>;\n\n/**\n * The options of a check: `ctx` required exactly when a condition is\n * reachable.\n *\n * Loose when `T` or `P` is its whole constraint — what the compiler falls back\n * to when the argument was wrong. Requiring `ctx` there would report a missing\n * argument instead of the wrong type or permission that caused it; the\n * refusal on that argument is the one worth reading. A `when` reached with no\n * `ctx` still throws at run time.\n */\nexport type CheckArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [ObjectTypeOf<C>] extends [T]\n\t? [ObjectTypeOf<C>] extends [never]\n\t\t? [options?: { readonly ctx?: unknown }]\n\t\t: IsSingle<ObjectTypeOf<C>> extends true\n\t\t\t? // One object type: `T` is its constraint and right; `P` may not be.\n\t\t\t\tPermissionArgs<C, T, P>\n\t\t\t: [options?: { readonly ctx?: unknown }]\n\t: PermissionArgs<C, T, P>;\n\n/** `CheckArgs` once `T` is known right: loose when `P` is its whole constraint. */\ntype PermissionArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CheckableOf<C, T>] extends [P]\n\t? IsSingle<CheckableOf<C, T>> extends true\n\t\t? Strict<C, T, P>\n\t\t: [options?: { readonly ctx?: unknown }]\n\t: Strict<C, T, P>;\n\ntype Strict<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CtxOf<C, T, P>] extends [never]\n\t? [options?: { readonly ctx?: never }]\n\t: [options: { readonly ctx: CtxOf<C, T, P> }];\n\n/** Whether `U` is one type rather than a union of several. */\ntype IsSingle<U> = [U] extends [UnionToIntersection<U>] ? true : false;\n\n/**\n * The signature of `can()`, typed from the model: the permission must be one\n * the object's type declares, the object must carry every field its\n * `fromField`s read, and `ctx` is required exactly when a condition is\n * reachable. `null` is anonymous, and answers `false`.\n */\nexport type Can<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tP extends CheckableOf<C, T>,\n>(\n\tsubject: SubjectRef<C> | null,\n\tpermission: P,\n\tobject: ObjectRef<C, T>,\n\t...options: CheckArgs<C, T, P>\n) => Promise<boolean>;\n\n// ─── What list() can reverse ──────────────────────────────────────────────\n\n/** `'record.doctor'` when relation `R` of `T` is a `fromField` with no `lookup`. */\ntype GapOfRelation<Ts, T, R> =\n\tRelationDefOf<Ts, T, R> extends { readonly lookup: Lookup }\n\t\t? never\n\t\t: RelationDefOf<Ts, T, R> extends FromField\n\t\t\t? `${T & string}.${R & string}`\n\t\t\t: never;\n\ntype GapOfName<Ts, T, N, Seen> = N extends `${infer R}->${infer P}`\n\t?\n\t\t\t| GapOfRelation<Ts, T, R>\n\t\t\t| GapOfPermission<Ts, ArrowTargets<Ts, T, R>, P, Seen>\n\t: GapOfPermission<Ts, T, N, Seen>;\n\n/**\n * The `fromField`s without a `lookup` that `list(…, P, T)` would have to\n * reverse — through `P`'s rules, the names they reach, and arrows. A subject\n * set never reaches one: `defineModel` refuses that.\n */\ntype GapOfPermission<Ts, T, P, Seen> = T extends keyof Ts & string\n\t? P extends string\n\t\t? `${T}.${P}` extends Seen\n\t\t\t? never\n\t\t\t: P extends RelationsOf<Ts, T>\n\t\t\t\t? GapOfRelation<Ts, T, P>\n\t\t\t\t: Ts[T] extends { readonly permissions: infer Ps }\n\t\t\t\t\t? P extends keyof Ps\n\t\t\t\t\t\t? Ps[P] extends readonly (infer E)[]\n\t\t\t\t\t\t\t? GapOfName<Ts, T, NameOfRule<E>, Seen | `${T}.${P}`>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t: never\n\t: never;\n\n/** Every `fromField` without a `lookup` that `list(…, P, T)` would reach; `never` when none. */\nexport type LookupGap<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = GapOfPermission<TypesOf<C>, T, P, never>;\n\n/** What a permission must also be for `list()`: reversible. */\ntype ListCheck<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [LookupGap<C, T, P>] extends [never]\n\t? unknown\n\t: Refusal<\n\t\t\t`list cannot reverse ${LookupGap<C, T, P>}: give that fromField a lookup`,\n\t\t\tnever\n\t\t>;\n\n/** Where a page of `list()` starts, and how much it holds. */\nexport interface ListPage {\n\t/** The `nextCursor` of the previous page; absent or `null` for the first. */\n\treadonly after?: string | null;\n\t/** Between 1 and 100; 20 when absent. */\n\treadonly limit?: number;\n}\n\n/** `CheckArgs`, with a page. */\ntype ListArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> =\n\tCheckArgs<C, T, P> extends [infer O]\n\t\t? [options: O & ListPage]\n\t\t: CheckArgs<C, T, P> extends [options?: infer O]\n\t\t\t? [options?: O & ListPage]\n\t\t\t: never;\n\n/**\n * The signature of `list()`: the ids of the objects of `type` on which\n * `subject` holds `permission`, in ascending order, by pages. Typed like\n * `can()`, and refuses a permission that reaches a `fromField` with no\n * `lookup`: nothing could find the objects whose field names the subject.\n */\nexport type List<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tP extends CheckableOf<C, T>,\n>(\n\tsubject: SubjectRef<C> | null,\n\tpermission: P & ListCheck<C, T, P>,\n\ttype: T,\n\t...options: ListArgs<C, T, P>\n) => Promise<CursorPage<string>>;\n\n/** The relations of an object type that `grant` can write: not its `fromField`s. */\nexport type GrantableOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n> = StoredRelationsOf<TypesOf<C>, T>;\n\n/**\n * Who may be granted relation `R` on an object of type `T`: an entity of each\n * subject type it names, and a subject set for each set it names.\n */\nexport type HolderOf<C extends ModelConfig, T extends ObjectTypeOf<C>, R> =\n\tRelationDefOf<TypesOf<C>, T, R> extends readonly (infer E)[]\n\t\t? E extends `${infer SetType}#${infer SetRelation}`\n\t\t\t? {\n\t\t\t\t\treadonly type: SetType;\n\t\t\t\t\treadonly id: string;\n\t\t\t\t\treadonly relation: SetRelation;\n\t\t\t\t}\n\t\t\t: { readonly type: E; readonly id: string }\n\t\t: never;\n\n/** Writes one tuple, or removes it: typed like `can()`. */\nexport type Grant<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tR extends GrantableOf<C, T>,\n>(\n\tobject: { readonly type: T; readonly id: string },\n\trelation: R,\n\tsubject: HolderOf<C, T, R>,\n) => Promise<void>;\n\n/** What `permissions()` answers. */\nexport interface Permissions<C extends ModelConfig> {\n\treadonly model: PermissionModel<C>;\n\t/**\n\t * Whether `subject` holds `permission` on `object`: `true` or `false`, and\n\t * **a failure throws** — a store that cannot answer is `STORE_FAILED`, never\n\t * a denial. `null` is anonymous, and `false` before any store call.\n\t */\n\treadonly can: Can<C>;\n\t/**\n\t * The ids of the objects of `type` on which `subject` holds `permission`,\n\t * ascending, by pages — what `can()` answers `true` for, found without\n\t * naming them. `null` is anonymous, and an empty page before any store call.\n\t * A failure throws, as for `can()`.\n\t */\n\treadonly list: List<C>;\n\t/** Stores that `subject` holds `relation` on `object`. Idempotent. */\n\treadonly grant: Grant<C>;\n\t/** Removes it. Idempotent: revoking what is not held is not an error. */\n\treadonly revoke: Grant<C>;\n}\n\n/** The configuration a model was defined from. */\nexport type ConfigOf<M> = M extends PermissionModel<infer C> ? C : never;\n\n// ─── The checks, as types ─────────────────────────────────────────────────\n\ntype Refusal<Text extends string, Expected> = {\n\treadonly [K in Text]: Expected;\n};\n\ntype CheckRelation<C extends ModelConfig, Def> =\n\tDef extends FromField<string, infer Sub>\n\t\t? Sub extends UserTypeOf<C> | ObjectTypeOf<C>\n\t\t\t? unknown\n\t\t\t: {\n\t\t\t\t\treadonly subject: Refusal<\n\t\t\t\t\t\t`\"${Sub}\" is not a subject type; name one of`,\n\t\t\t\t\t\tUserTypeOf<C> | ObjectTypeOf<C>\n\t\t\t\t\t>;\n\t\t\t\t}\n\t\t: {\n\t\t\t\treadonly [I in keyof Def]: Def[I] extends SubjectRefOf<\n\t\t\t\t\tUserTypeOf<C>,\n\t\t\t\t\tTypesOf<C>\n\t\t\t\t>\n\t\t\t\t\t? unknown\n\t\t\t\t\t: Refusal<\n\t\t\t\t\t\t\t`\"${Def[I] & string}\" is not a subject type or a subject set; name one of`,\n\t\t\t\t\t\t\tSubjectRefOf<UserTypeOf<C>, TypesOf<C>>\n\t\t\t\t\t\t>;\n\t\t\t};\n\ntype CheckRules<Ts, T, Rules> = {\n\treadonly [I in keyof Rules]: Rules[I] extends string\n\t\t? Rules[I] extends RuleRefOf<Ts, T>\n\t\t\t? unknown\n\t\t\t: Refusal<\n\t\t\t\t\t`\"${Rules[I]}\" is not a relation, a permission or an arrow of ${T & string}; name one of`,\n\t\t\t\t\tRuleRefOf<Ts, T>\n\t\t\t\t>\n\t\t: Rules[I] extends When<infer R, never>\n\t\t\t? R extends RuleRefOf<Ts, T>\n\t\t\t\t? unknown\n\t\t\t\t: {\n\t\t\t\t\t\treadonly rule: Refusal<\n\t\t\t\t\t\t\t`\"${R}\" is not a relation, a permission or an arrow of ${T & string}; name one of`,\n\t\t\t\t\t\t\tRuleRefOf<Ts, T>\n\t\t\t\t\t\t>;\n\t\t\t\t\t}\n\t\t\t: unknown;\n};\n\ntype CheckObjectType<C extends ModelConfig, T> = (TypesOf<C>[T &\n\tkeyof TypesOf<C>] extends { readonly relations: infer Rs }\n\t? {\n\t\t\treadonly relations: {\n\t\t\t\treadonly [R in keyof Rs]: CheckRelation<C, Rs[R]>;\n\t\t\t};\n\t\t}\n\t: unknown) &\n\t(TypesOf<C>[T & keyof TypesOf<C>] extends { readonly permissions: infer Ps }\n\t\t? {\n\t\t\t\treadonly permissions: {\n\t\t\t\t\treadonly [P in keyof Ps]: P extends RelationsOf<TypesOf<C>, T>\n\t\t\t\t\t\t? Refusal<\n\t\t\t\t\t\t\t\t`\"${P & string}\" names a relation and a permission of ${T & string}; rename one`,\n\t\t\t\t\t\t\t\tnever\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t: CheckRules<TypesOf<C>, T, Ps[P]>;\n\t\t\t\t};\n\t\t\t}\n\t\t: unknown);\n\n/**\n * The compile-time checks `defineModel` intersects into its parameter — the\n * `C & Checked<C>` pattern of `janus()`: a wrong value is unassignable **on\n * the offending key**, and the reason is the type the compiler prints.\n */\nexport type CheckedModel<C extends ModelConfig> = {\n\treadonly types: {\n\t\treadonly [T in keyof TypesOf<C>]: CheckObjectType<C, T>;\n\t};\n};\n\n// ─── Defining one ─────────────────────────────────────────────────────────\n\n/** A model, checked and resolved. What `permissions()` will take. */\nexport interface PermissionModel<C extends ModelConfig = ModelConfig> {\n\t/** The user types it accepts as subjects. */\n\treadonly subjects: readonly UserTypeOf<C>[];\n\t/** The object types it declares. */\n\treadonly types: readonly ObjectTypeOf<C>[];\n\t/** The definition, as written. Frozen. */\n\treadonly definition: C;\n}\n\n// Keyed by the frozen model itself: nothing outside this module can reach it.\nconst RESOLVED = new WeakMap<object, ResolvedModel>();\n\n/**\n * Checks a model and resolves it. Connects to nothing.\n *\n * ```ts\n * export const model = defineModel({\n * subjects: auth.types,\n * types: {\n * team: {\n * relations: { member: ['staff', 'team#member'], lead: ['staff'] },\n * permissions: { manage: ['lead'], view: ['member', 'manage'] },\n * },\n * record: {\n * relations: {\n * doctor: fromField('doctorId', 'staff'),\n * team: ['team'],\n * },\n * permissions: {\n * view: ['doctor', 'team->view'],\n * edit: [when('doctor', (ctx: { onShift: boolean }) => ctx.onShift)],\n * },\n * },\n * },\n * });\n * ```\n *\n * Refuses with a `TypeError` what only running it can see: a name that is not\n * camelCase, an object type named like a user type, a permission that reaches\n * itself without crossing a relation — which no data could ever end.\n */\nexport function defineModel<const C extends ModelConfig>(\n\tconfig: C & CheckedModel<C>,\n): PermissionModel<C> {\n\tconst resolved = resolveModel(config, 'defineModel');\n\tconst model: PermissionModel<C> = Object.freeze({\n\t\tsubjects: [...resolved.subjects] as UserTypeOf<C>[],\n\t\ttypes: [...resolved.types.keys()] as ObjectTypeOf<C>[],\n\t\tdefinition: config,\n\t});\n\tRESOLVED.set(model, resolved);\n\treturn model;\n}\n\n/** The resolved form of a model this module defined. Internal. */\nexport function resolvedOf(model: object): ResolvedModel {\n\tconst resolved = RESOLVED.get(model);\n\tif (resolved === undefined) {\n\t\tthrow new TypeError(\n\t\t\t'permissions: this model was not made by defineModel() — pass what defineModel() answered',\n\t\t);\n\t}\n\treturn resolved;\n}\n",
7
+ "/**\n * The permission model: which object types exist, which relations they hold,\n * and which permissions those relations grant — written in TypeScript, and\n * typed from itself.\n *\n * **ReBAC, embedded.** Zanzibar's data model — relations between objects and\n * subjects, permissions computed from them — without its infrastructure: the\n * database is the application's own, so reads follow writes and there is\n * nothing to cache or sequence. Two things go beyond Zanzibar's descendants:\n *\n * - **`fromField`**, a relation read from the object's own data — a record's\n * `doctorId` — rather than a tuple to keep in sync with it. Two sources of\n * truth for one fact is the first trap of a Zanzibar deployment;\n * - **`when`**, a condition written in TypeScript and typed: its `ctx` is what\n * `can()` then requires, and only for the permissions whose rules reach it.\n *\n * The model is a flat `const` literal, and everything the compiler can check\n * about it is checked here: a relation naming a subject type that does not\n * exist, a permission naming a relation that does not exist, an arrow to a\n * permission its target does not have. What only running it can check —\n * names, cycles — is refused by {@link defineModel} with a `TypeError`.\n */\n\nimport type { CursorPage } from '../pagination/cursor-page';\nimport { type ResolvedModel, resolveModel } from './resolve';\n\n// ─── The two building blocks ──────────────────────────────────────────────\n\n/**\n * The ids of the objects whose field names this subject id — what `list()`\n * needs to reverse a `fromField`: `(doctorId) => db.records.ids({ doctorId })`.\n * Unpaged; a failure throws, as a store's does.\n */\nexport type Lookup = (subjectId: string) => Promise<readonly string[]>;\n\n/**\n * A relation read from the object's own data: `fromField('doctorId', 'staff')`\n * holds for the subject of type `staff` whose id is `object.doctorId`.\n *\n * Nothing is stored. `can()` receives the object — the route has already\n * loaded it — and the compiler requires the field on it. `list()` cannot read\n * a field of objects it has not found yet, so it asks `lookup` instead; a\n * `list()` that would need one it was not given is a compile error.\n */\nexport interface FromField<\n\tField extends string = string,\n\tSubject extends string = string,\n> {\n\treadonly kind: 'fromField';\n\treadonly field: Field;\n\treadonly subject: Subject;\n\treadonly lookup?: Lookup;\n}\n\n/** A `fromField` `list()` can reverse. */\nexport interface ReversibleFromField<\n\tField extends string = string,\n\tSubject extends string = string,\n> extends FromField<Field, Subject> {\n\treadonly lookup: Lookup;\n}\n\nexport function fromField<\n\tconst Field extends string,\n\tconst Subject extends string,\n>(field: Field, subject: Subject): FromField<Field, Subject>;\nexport function fromField<\n\tconst Field extends string,\n\tconst Subject extends string,\n>(\n\tfield: Field,\n\tsubject: Subject,\n\toptions: { readonly lookup: Lookup },\n): ReversibleFromField<Field, Subject>;\nexport function fromField(\n\tfield: string,\n\tsubject: string,\n\toptions?: { readonly lookup: Lookup },\n): FromField {\n\treturn Object.freeze(\n\t\toptions === undefined\n\t\t\t? { kind: 'fromField' as const, field, subject }\n\t\t\t: { kind: 'fromField' as const, field, subject, lookup: options.lookup },\n\t);\n}\n\n/**\n * A rule that grants only when `test(ctx)` is true: `when('doctor', (ctx:\n * { onShift: boolean }) => ctx.onShift)`.\n *\n * `rule` is any rule of the same object type — a relation, a permission, an\n * arrow. The test is synchronous and pure: it decides on what the caller\n * passes, and reads nothing, so it can never fail the way a store can.\n */\nexport interface When<Rule extends string = string, Ctx = never> {\n\treadonly kind: 'when';\n\treadonly rule: Rule;\n\treadonly test: (ctx: Ctx) => boolean;\n}\n\nexport function when<const Rule extends string, Ctx>(\n\trule: Rule,\n\ttest: (ctx: Ctx) => boolean,\n): When<Rule, Ctx> {\n\treturn Object.freeze({ kind: 'when', rule, test });\n}\n\n// ─── The shape of a model ─────────────────────────────────────────────────\n\n/**\n * Who may hold a relation: subject types — `'staff'`, a user type, or `'team'`,\n * an object type — and subject sets, `'team#member'`: every member of a team.\n * Or a relation read from the object's data.\n */\nexport type RelationDef = readonly string[] | FromField;\n\n/**\n * One way to hold a permission: a relation or a permission of the same object\n * type (`'doctor'`, `'manage'`), an arrow to a permission of a related object\n * (`'team->view'`: who can view the record's team), or one of those under a\n * condition.\n */\nexport type RuleDef = string | When<string, never>;\n\nexport interface ObjectTypeDef {\n\treadonly relations?: { readonly [name: string]: RelationDef };\n\t/** Each permission is the union of its rules. */\n\treadonly permissions?: { readonly [name: string]: readonly RuleDef[] };\n}\n\nexport interface ModelConfig {\n\t/**\n\t * The user types that can be subjects — pass `auth.types` from `janus()`,\n\t * so a user type and a subject type are one name.\n\t */\n\treadonly subjects: readonly string[];\n\treadonly types: { readonly [name: string]: ObjectTypeDef };\n}\n\n// ─── Reading a model's types ──────────────────────────────────────────────\n\ntype TypesOf<C extends ModelConfig> = C['types'];\n\n/** The object types a model declares. */\nexport type ObjectTypeOf<C extends ModelConfig> = keyof TypesOf<C> & string;\n\n/** The user types a model accepts as subjects. */\nexport type UserTypeOf<C extends ModelConfig> = C['subjects'][number];\n\ntype RelationsOf<Ts, T> = T extends keyof Ts\n\t? Ts[T] extends { readonly relations: infer R }\n\t\t? keyof R & string\n\t\t: never\n\t: never;\n\ntype PermissionsOf<Ts, T> = T extends keyof Ts\n\t? Ts[T] extends { readonly permissions: infer P }\n\t\t? keyof P & string\n\t\t: never\n\t: never;\n\ntype NamesOf<Ts, T> = RelationsOf<Ts, T> | PermissionsOf<Ts, T>;\n\ntype RelationDefOf<Ts, T, R> = T extends keyof Ts\n\t? Ts[T] extends { readonly relations: infer Rs }\n\t\t? R extends keyof Rs\n\t\t\t? Rs[R]\n\t\t\t: never\n\t\t: never\n\t: never;\n\n/** The relations of `T` that are stored as tuples: every one but its `fromField`s. */\ntype StoredRelationsOf<Ts, T> = {\n\t[R in RelationsOf<Ts, T>]: RelationDefOf<Ts, T, R> extends FromField\n\t\t? never\n\t\t: R;\n}[RelationsOf<Ts, T>];\n\n/**\n * `'team#member'` for every stored relation of every object type. Not a\n * `fromField`: a subject set reaches objects nobody passed to `can()`, so there\n * is no data to read the field from.\n */\ntype SubjectSetOf<Ts> = {\n\t[T in keyof Ts & string]: `${T}#${StoredRelationsOf<Ts, T>}`;\n}[keyof Ts & string];\n\ntype SubjectRefOf<S extends string, Ts> =\n\t| S\n\t| (keyof Ts & string)\n\t| SubjectSetOf<Ts>;\n\n/** The object types an arrow through `R` reaches: its direct subject types. */\ntype ArrowTargets<Ts, T, R> =\n\tRelationDefOf<Ts, T, R> extends FromField<string, infer Sub>\n\t\t? Sub\n\t\t: RelationDefOf<Ts, T, R> extends readonly (infer E)[]\n\t\t\t? E extends `${string}#${string}`\n\t\t\t\t? never\n\t\t\t\t: E\n\t\t\t: never;\n\n/** The names every one of `Targets` declares. */\ntype CommonNames<Ts, Targets> =\n\tNamesOf<Ts, Targets> extends infer N\n\t\t? N extends string\n\t\t\t? [Targets] extends [TypesNaming<Ts, N>]\n\t\t\t\t? N\n\t\t\t\t: never\n\t\t\t: never\n\t\t: never;\n\ntype TypesNaming<Ts, N> = {\n\t[X in keyof Ts]: N extends NamesOf<Ts, X> ? X : never;\n}[keyof Ts];\n\n/** `'team->view'`, for each relation whose targets are all object types. */\ntype ArrowsOf<Ts, T> = {\n\t[R in RelationsOf<Ts, T>]: [ArrowTargets<Ts, T, R>] extends [never]\n\t\t? never\n\t\t: [ArrowTargets<Ts, T, R>] extends [keyof Ts]\n\t\t\t? `${R}->${CommonNames<Ts, ArrowTargets<Ts, T, R>>}`\n\t\t\t: never;\n}[RelationsOf<Ts, T>];\n\n/** Every string a rule of `T` may be. */\ntype RuleRefOf<Ts, T> = NamesOf<Ts, T> | ArrowsOf<Ts, T>;\n\n/** What `can()` accepts for an object type: its relations and its permissions. */\nexport type CheckableOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n> = NamesOf<TypesOf<C>, T>;\n\n/** The fields an object of type `T` must carry: those its `fromField`s read. */\nexport type FieldsOf<C extends ModelConfig, T extends ObjectTypeOf<C>> = {\n\t[R in RelationsOf<TypesOf<C>, T>]: RelationDefOf<\n\t\tTypesOf<C>,\n\t\tT,\n\t\tR\n\t> extends FromField<infer F, string>\n\t\t? F\n\t\t: never;\n}[RelationsOf<TypesOf<C>, T>];\n\n/**\n * An object, as `can()` takes it: its type and id, and **every field a\n * `fromField` of its type reads** — required, so an object passed without\n * them is a compile error rather than a silent denial. `null` is a field\n * holding nobody.\n */\nexport type ObjectRef<C extends ModelConfig, T extends ObjectTypeOf<C>> = {\n\treadonly type: T;\n\treadonly id: string;\n} & { readonly [F in FieldsOf<C, T>]: string | null };\n\n/** A subject: a user from `janus()` as it is, or an object. */\nexport interface SubjectRef<C extends ModelConfig> {\n\treadonly type: UserTypeOf<C> | ObjectTypeOf<C>;\n\treadonly id: string;\n}\n\n// ─── The context a check requires ─────────────────────────────────────────\n\ntype UnionToIntersection<U> = (\n\tU extends unknown\n\t\t? (union: U) => void\n\t\t: never\n) extends (intersection: infer I) => void\n\t? I\n\t: never;\n\ntype CtxOfRule<E> = E extends When<string, infer X> ? X : never;\n\ntype NameOfRule<E> = E extends string\n\t? E\n\t: E extends When<infer R, never>\n\t\t? R\n\t\t: never;\n\ntype CtxOfName<Ts, T, N, Seen> = N extends `${infer R}->${infer P}`\n\t? CtxOfPermission<Ts, ArrowTargets<Ts, T, R>, P, Seen>\n\t: CtxOfPermission<Ts, T, N, Seen>;\n\n/**\n * The union of the `ctx` types a permission's rules reach — through its own\n * rules, the permissions they name, and arrows into other types. `Seen` stops\n * the walk on a cycle.\n */\ntype CtxOfPermission<Ts, T, P, Seen> = T extends keyof Ts & string\n\t? P extends string\n\t\t? `${T}.${P}` extends Seen\n\t\t\t? never\n\t\t\t: Ts[T] extends { readonly permissions: infer Ps }\n\t\t\t\t? P extends keyof Ps\n\t\t\t\t\t? Ps[P] extends readonly (infer E)[]\n\t\t\t\t\t\t? CtxOfRule<E> | CtxOfName<Ts, T, NameOfRule<E>, Seen | `${T}.${P}`>\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t\t\t: never\n\t\t: never\n\t: never;\n\n/**\n * What `can(…, permission, object)` requires as `ctx`: every condition its\n * rules can reach, intersected. `never` when none — and then `can()` takes no\n * `ctx` at all.\n */\nexport type CtxOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CtxOfPermission<TypesOf<C>, T, P, never>] extends [never]\n\t? never\n\t: UnionToIntersection<CtxOfPermission<TypesOf<C>, T, P, never>>;\n\n/**\n * The options of a check: `ctx` required exactly when a condition is\n * reachable.\n *\n * Loose when `T` or `P` is its whole constraint — what the compiler falls back\n * to when the argument was wrong. Requiring `ctx` there would report a missing\n * argument instead of the wrong type or permission that caused it; the\n * refusal on that argument is the one worth reading. A `when` reached with no\n * `ctx` still throws at run time.\n */\nexport type CheckArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [ObjectTypeOf<C>] extends [T]\n\t? [ObjectTypeOf<C>] extends [never]\n\t\t? [options?: { readonly ctx?: unknown }]\n\t\t: IsSingle<ObjectTypeOf<C>> extends true\n\t\t\t? // One object type: `T` is its constraint and right; `P` may not be.\n\t\t\t\tPermissionArgs<C, T, P>\n\t\t\t: [options?: { readonly ctx?: unknown }]\n\t: PermissionArgs<C, T, P>;\n\n/** `CheckArgs` once `T` is known right: loose when `P` is its whole constraint. */\ntype PermissionArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CheckableOf<C, T>] extends [P]\n\t? IsSingle<CheckableOf<C, T>> extends true\n\t\t? Strict<C, T, P>\n\t\t: [options?: { readonly ctx?: unknown }]\n\t: Strict<C, T, P>;\n\ntype Strict<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [CtxOf<C, T, P>] extends [never]\n\t? [options?: { readonly ctx?: never }]\n\t: [options: { readonly ctx: CtxOf<C, T, P> }];\n\n/** Whether `U` is one type rather than a union of several. */\ntype IsSingle<U> = [U] extends [UnionToIntersection<U>] ? true : false;\n\n/**\n * The signature of `can()`, typed from the model: the permission must be one\n * the object's type declares, the object must carry every field its\n * `fromField`s read, and `ctx` is required exactly when a condition is\n * reachable. `null` is anonymous, and answers `false`.\n */\nexport type Can<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tP extends CheckableOf<C, T>,\n>(\n\tsubject: SubjectRef<C> | null,\n\tpermission: P,\n\tobject: ObjectRef<C, T>,\n\t...options: CheckArgs<C, T, P>\n) => Promise<boolean>;\n\n// ─── What list() can reverse ──────────────────────────────────────────────\n\n/** `'record.doctor'` when relation `R` of `T` is a `fromField` with no `lookup`. */\ntype GapOfRelation<Ts, T, R> =\n\tRelationDefOf<Ts, T, R> extends { readonly lookup: Lookup }\n\t\t? never\n\t\t: RelationDefOf<Ts, T, R> extends FromField\n\t\t\t? `${T & string}.${R & string}`\n\t\t\t: never;\n\ntype GapOfName<Ts, T, N, Seen> = N extends `${infer R}->${infer P}`\n\t?\n\t\t\t| GapOfRelation<Ts, T, R>\n\t\t\t| GapOfPermission<Ts, ArrowTargets<Ts, T, R>, P, Seen>\n\t: GapOfPermission<Ts, T, N, Seen>;\n\n/**\n * The `fromField`s without a `lookup` that `list(…, P, T)` would have to\n * reverse — through `P`'s rules, the names they reach, and arrows. A subject\n * set never reaches one: `defineModel` refuses that.\n */\ntype GapOfPermission<Ts, T, P, Seen> = T extends keyof Ts & string\n\t? P extends string\n\t\t? `${T}.${P}` extends Seen\n\t\t\t? never\n\t\t\t: P extends RelationsOf<Ts, T>\n\t\t\t\t? GapOfRelation<Ts, T, P>\n\t\t\t\t: Ts[T] extends { readonly permissions: infer Ps }\n\t\t\t\t\t? P extends keyof Ps\n\t\t\t\t\t\t? Ps[P] extends readonly (infer E)[]\n\t\t\t\t\t\t\t? GapOfName<Ts, T, NameOfRule<E>, Seen | `${T}.${P}`>\n\t\t\t\t\t\t\t: never\n\t\t\t\t\t\t: never\n\t\t\t\t\t: never\n\t\t: never\n\t: never;\n\n/** Every `fromField` without a `lookup` that `list(…, P, T)` would reach; `never` when none. */\nexport type LookupGap<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = GapOfPermission<TypesOf<C>, T, P, never>;\n\n/** What a permission must also be for `list()`: reversible. */\ntype ListCheck<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> = [LookupGap<C, T, P>] extends [never]\n\t? unknown\n\t: Refusal<\n\t\t\t`list cannot reverse ${LookupGap<C, T, P>}: give that fromField a lookup`,\n\t\t\tnever\n\t\t>;\n\n/** Where a page of `list()` starts, and how much it holds. */\nexport interface ListPage {\n\t/** The `nextCursor` of the previous page; absent or `null` for the first. */\n\treadonly after?: string | null;\n\t/** Between 1 and 100; 20 when absent. */\n\treadonly limit?: number;\n}\n\n/** `CheckArgs`, with a page. */\ntype ListArgs<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n\tP extends string,\n> =\n\tCheckArgs<C, T, P> extends [infer O]\n\t\t? [options: O & ListPage]\n\t\t: CheckArgs<C, T, P> extends [options?: infer O]\n\t\t\t? [options?: O & ListPage]\n\t\t\t: never;\n\n/**\n * The signature of `list()`: the ids of the objects of `type` on which\n * `subject` holds `permission`, in ascending order, by pages. Typed like\n * `can()`, and refuses a permission that reaches a `fromField` with no\n * `lookup`: nothing could find the objects whose field names the subject.\n */\nexport type List<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tP extends CheckableOf<C, T>,\n>(\n\tsubject: SubjectRef<C> | null,\n\tpermission: P & ListCheck<C, T, P>,\n\ttype: T,\n\t...options: ListArgs<C, T, P>\n) => Promise<CursorPage<string>>;\n\n/** The relations of an object type that `grant` can write: not its `fromField`s. */\nexport type GrantableOf<\n\tC extends ModelConfig,\n\tT extends ObjectTypeOf<C>,\n> = StoredRelationsOf<TypesOf<C>, T>;\n\n/**\n * Who may be granted relation `R` on an object of type `T`: an entity of each\n * subject type it names, and a subject set for each set it names.\n */\nexport type HolderOf<C extends ModelConfig, T extends ObjectTypeOf<C>, R> =\n\tRelationDefOf<TypesOf<C>, T, R> extends readonly (infer E)[]\n\t\t? E extends `${infer SetType}#${infer SetRelation}`\n\t\t\t? {\n\t\t\t\t\treadonly type: SetType;\n\t\t\t\t\treadonly id: string;\n\t\t\t\t\treadonly relation: SetRelation;\n\t\t\t\t}\n\t\t\t: { readonly type: E; readonly id: string }\n\t\t: never;\n\n/** Writes one tuple, or removes it: typed like `can()`. */\nexport type Grant<C extends ModelConfig> = <\n\tT extends ObjectTypeOf<C>,\n\tR extends GrantableOf<C, T>,\n>(\n\tobject: { readonly type: T; readonly id: string },\n\trelation: R,\n\tsubject: HolderOf<C, T, R>,\n) => Promise<void>;\n\n/** What `permissions()` answers. */\nexport interface Permissions<C extends ModelConfig> {\n\treadonly model: PermissionModel<C>;\n\t/**\n\t * Whether `subject` holds `permission` on `object`: `true` or `false`, and\n\t * **a failure throws** — a store that cannot answer is `STORE_FAILED`, never\n\t * a denial. `null` is anonymous, and `false` before any store call.\n\t */\n\treadonly can: Can<C>;\n\t/**\n\t * The ids of the objects of `type` on which `subject` holds `permission`,\n\t * ascending, by pages — what `can()` answers `true` for, found without\n\t * naming them. `null` is anonymous, and an empty page before any store call.\n\t * A failure throws, as for `can()`.\n\t */\n\treadonly list: List<C>;\n\t/** Stores that `subject` holds `relation` on `object`. Idempotent. */\n\treadonly grant: Grant<C>;\n\t/** Removes it. Idempotent: revoking what is not held is not an error. */\n\treadonly revoke: Grant<C>;\n}\n\n/** The configuration a model was defined from. */\nexport type ConfigOf<M> = M extends PermissionModel<infer C> ? C : never;\n\n// ─── The checks, as types ─────────────────────────────────────────────────\n\ntype Refusal<Text extends string, Expected> = {\n\treadonly [K in Text]: Expected;\n};\n\n/**\n * The same names, spelled out: a union the compiler prints as its members —\n * `\"patient\" | \"staff\" | \"team#member\"` — rather than as the alias that\n * computed it, so an error lists what the name could have been.\n */\ntype Spelled<U> = [U] extends [infer V extends string]\n\t? { [K in V]: K }[V]\n\t: never;\n\n/**\n * What `defineModel` offers and accepts for each object type, given the\n * subject types `S` and every object type `Ts`: the constraint of its `types`.\n *\n * **A constraint, so that an editor completes it.** The names a relation, a\n * rule, a `fromField` or a `when` may take are unions of literals here, and an\n * editor reads a type parameter's constraint to offer them — `'patient'`,\n * `'team#member'`, `'team->view'`. A check intersected into the parameter\n * instead (`C & Checked<C>`) refuses the same mistakes, but meets the literal\n * being typed and completes nothing: measured with the language service.\n *\n * A wrong name is unassignable **on that name** — on the whole `fromField(…)`\n * or `when(…)` call for those two — and the error lists the ones it could\n * have been, with \"Did you mean\" when one is close.\n */\nexport type ModelTypesOf<S extends string, Ts> = {\n\treadonly [T in keyof Ts]: {\n\t\treadonly relations?: {\n\t\t\treadonly [name: string]:\n\t\t\t\t| readonly Spelled<SubjectRefOf<S, Ts>>[]\n\t\t\t\t| FromField<string, Spelled<S | (keyof Ts & string)>>;\n\t\t};\n\t\treadonly permissions?: {\n\t\t\treadonly [P in PermissionsOf<Ts, T>]: P extends RelationsOf<Ts, T>\n\t\t\t\t? Refusal<\n\t\t\t\t\t\t`\"${P}\" names a relation and a permission of ${T & string}; rename one`,\n\t\t\t\t\t\tnever\n\t\t\t\t\t>\n\t\t\t\t: readonly (\n\t\t\t\t\t\t| Spelled<RuleRefOf<Ts, T>>\n\t\t\t\t\t\t| When<Spelled<RuleRefOf<Ts, T>>, never>\n\t\t\t\t\t)[];\n\t\t};\n\t};\n};\n\n// ─── Defining one ─────────────────────────────────────────────────────────\n\n/** A model, checked and resolved. What `permissions()` will take. */\nexport interface PermissionModel<C extends ModelConfig = ModelConfig> {\n\t/** The user types it accepts as subjects. */\n\treadonly subjects: readonly UserTypeOf<C>[];\n\t/** The object types it declares. */\n\treadonly types: readonly ObjectTypeOf<C>[];\n\t/** The definition, as written. Frozen. */\n\treadonly definition: C;\n}\n\n// Keyed by the frozen model itself: nothing outside this module can reach it.\nconst RESOLVED = new WeakMap<object, ResolvedModel>();\n\n/**\n * Checks a model and resolves it. Connects to nothing.\n *\n * ```ts\n * export const model = defineModel({\n * subjects: auth.types,\n * types: {\n * team: {\n * relations: { member: ['staff', 'team#member'], lead: ['staff'] },\n * permissions: { manage: ['lead'], view: ['member', 'manage'] },\n * },\n * record: {\n * relations: {\n * doctor: fromField('doctorId', 'staff'),\n * team: ['team'],\n * },\n * permissions: {\n * view: ['doctor', 'team->view'],\n * edit: [when('doctor', (ctx: { onShift: boolean }) => ctx.onShift)],\n * },\n * },\n * },\n * });\n * ```\n *\n * Refuses with a `TypeError` what only running it can see: a name that is not\n * camelCase, an object type named like a user type, a permission that reaches\n * itself without crossing a relation — which no data could ever end.\n */\nexport function defineModel<\n\tconst Subjects extends readonly string[],\n\tconst Ts extends ModelConfig['types'] & ModelTypesOf<Subjects[number], Ts>,\n>(config: {\n\treadonly subjects: Subjects;\n\treadonly types: Ts;\n}): PermissionModel<{ readonly subjects: Subjects; readonly types: Ts }>;\nexport function defineModel<const C extends ModelConfig>(\n\tconfig: C,\n): PermissionModel<C> {\n\tconst resolved = resolveModel(config, 'defineModel');\n\tconst model: PermissionModel<C> = Object.freeze({\n\t\tsubjects: [...resolved.subjects] as UserTypeOf<C>[],\n\t\ttypes: [...resolved.types.keys()] as ObjectTypeOf<C>[],\n\t\tdefinition: config,\n\t});\n\tRESOLVED.set(model, resolved);\n\treturn model;\n}\n\n/** The resolved form of a model this module defined. Internal. */\nexport function resolvedOf(model: object): ResolvedModel {\n\tconst resolved = RESOLVED.get(model);\n\tif (resolved === undefined) {\n\t\tthrow new TypeError(\n\t\t\t'permissions: this model was not made by defineModel() — pass what defineModel() answered',\n\t\t);\n\t}\n\treturn resolved;\n}\n",
8
8
  "import { PermissionDepthError } from '../errors/janus-error';\nimport type { CursorPage } from '../pagination/cursor-page';\nimport { MAX_PAGE_SIZE } from '../pagination/cursor-page';\nimport type { Subject } from '../subjects/subject';\nimport type { RelationStore } from './port/types';\nimport {\n\tadmits,\n\ttype ResolvedModel,\n\ttype ResolvedObjectType,\n\ttype ResolvedRule,\n} from './resolve';\n\n/**\n * One `list()`: the objects a subject holds a name on, found backwards —\n * from the subject to the tuples naming it, through the sets and arrows the\n * model declares, to the objects.\n *\n * **A least fixpoint.** `objects(type, name)` is a union of what its rules\n * reach, and a rule can reach its own name again — a folder viewable through\n * its parent, a team member through a team. Such a name, met again on the\n * current path, answers what the previous round found; rounds repeat until\n * none adds an id. That is exactly the set of objects with a derivation that\n * does not loop — what `can()`'s cut finds, one object at a time. A round\n * that met no loop is final.\n *\n * **Depth.** Each round past the first follows the loops one relation\n * further; more than `maxDepth` rounds is `PERMISSION_DEPTH`, as crossing more\n * than `maxDepth` relations is for `can()`.\n *\n * **Cost.** Every page of `findObjects` for every id each step reaches, every\n * round. Linear in what the subject can reach — fine for the objects of one\n * user, not for a subject set holding most of the database.\n */\nexport class Reverse {\n\tprivate previous = new Map<string, ReadonlySet<string>>();\n\tprivate current = new Map<string, ReadonlySet<string>>();\n\tprivate readonly path = new Set<string>();\n\tprivate looped = false;\n\n\tconstructor(\n\t\tprivate readonly model: ResolvedModel,\n\t\tprivate readonly store: RelationStore,\n\t\tprivate readonly maxDepth: number,\n\t\tprivate readonly ctx: unknown,\n\t\tprivate readonly subject: Subject,\n\t\tprivate readonly question: string,\n\t) {}\n\n\tasync objects(type: string, name: string): Promise<ReadonlySet<string>> {\n\t\tfor (let round = 0; round <= this.maxDepth; round += 1) {\n\t\t\tthis.current = new Map();\n\t\t\tthis.looped = false;\n\t\t\tconst found = await this.reach(type, name);\n\t\t\tif (!this.looped || this.same()) return found;\n\t\t\tthis.previous = this.current;\n\t\t}\n\t\tthrow new PermissionDepthError(\n\t\t\t`list: listing ${this.question} crossed more than ${this.maxDepth} relations without an answer`,\n\t\t\t{ permission: this.question, maxDepth: this.maxDepth },\n\t\t);\n\t}\n\n\t/** Whether this round found what the previous one did: nothing more to find. */\n\tprivate same(): boolean {\n\t\tfor (const [key, ids] of this.current) {\n\t\t\tif ((this.previous.get(key)?.size ?? 0) !== ids.size) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/** The ids of the objects of `typeName` on which the subject holds `name`. */\n\tprivate async reach(\n\t\ttypeName: string,\n\t\tname: string,\n\t): Promise<ReadonlySet<string>> {\n\t\tconst key = `${typeName}#${name}`;\n\t\tconst done = this.current.get(key);\n\t\tif (done !== undefined) return done;\n\t\tif (this.path.has(key)) {\n\t\t\tthis.looped = true;\n\t\t\treturn this.previous.get(key) ?? new Set();\n\t\t}\n\n\t\tconst type = this.model.types.get(typeName);\n\t\tif (type === undefined) return new Set();\n\n\t\tthis.path.add(key);\n\t\ttry {\n\t\t\tconst found = type.permissions.has(name)\n\t\t\t\t? await this.permission(type, name)\n\t\t\t\t: await this.relation(type, name);\n\t\t\tthis.current.set(key, found);\n\t\t\treturn found;\n\t\t} finally {\n\t\t\tthis.path.delete(key);\n\t\t}\n\t}\n\n\tprivate async relation(\n\t\ttype: ResolvedObjectType,\n\t\tname: string,\n\t): Promise<Set<string>> {\n\t\tconst relation = type.relations.get(name);\n\t\tif (relation === undefined) return new Set();\n\n\t\tif (relation.kind === 'fromField') {\n\t\t\tconst subject = this.subject;\n\t\t\treturn 'relation' in subject || subject.type !== relation.subject\n\t\t\t\t? new Set()\n\t\t\t\t: new Set(await this.lookup(type, name, subject.id));\n\t\t}\n\n\t\t// A direct tuple counts only when the model admits the subject here.\n\t\tconst found = new Set(\n\t\t\tadmits(relation.holders, this.subject)\n\t\t\t\t? await this.holding(type.name, name, this.subject)\n\t\t\t\t: [],\n\t\t);\n\t\tfor (const holder of relation.holders) {\n\t\t\tif (holder.kind !== 'set') continue;\n\t\t\tfor (const id of await this.reach(holder.type, holder.relation)) {\n\t\t\t\tconst set = { type: holder.type, id, relation: holder.relation };\n\t\t\t\tfor (const object of await this.holding(type.name, name, set)) {\n\t\t\t\t\tfound.add(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn found;\n\t}\n\n\tprivate async permission(\n\t\ttype: ResolvedObjectType,\n\t\tname: string,\n\t): Promise<Set<string>> {\n\t\tconst found = new Set<string>();\n\t\tfor (const rule of type.permissions.get(name) ?? []) {\n\t\t\tif (rule.test !== undefined && !this.passes(rule, type, name)) continue;\n\n\t\t\tif (rule.kind === 'name') {\n\t\t\t\tfor (const id of await this.reach(type.name, rule.name)) found.add(id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const id of await this.arrow(type, rule.relation, rule.target)) {\n\t\t\t\tfound.add(id);\n\t\t\t}\n\t\t}\n\t\treturn found;\n\t}\n\n\t/** The objects of `type` whose `relation` reaches an object on which the subject holds `target`. */\n\tprivate async arrow(\n\t\ttype: ResolvedObjectType,\n\t\trelation: string,\n\t\ttarget: string,\n\t): Promise<Set<string>> {\n\t\tconst through = type.relations.get(relation);\n\t\tconst found = new Set<string>();\n\t\tif (through === undefined) return found;\n\n\t\tif (through.kind === 'fromField') {\n\t\t\tfor (const id of await this.reach(through.subject, target)) {\n\t\t\t\tfor (const object of await this.lookup(type, relation, id)) {\n\t\t\t\t\tfound.add(object);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn found;\n\t\t}\n\t\tfor (const holder of through.holders) {\n\t\t\t// An arrow follows entities; a user type holds no permission.\n\t\t\tif (holder.kind !== 'type' || !this.model.types.has(holder.type)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const id of await this.reach(holder.type, target)) {\n\t\t\t\tconst entity = { type: holder.type, id };\n\t\t\t\tfor (const object of await this.holding(type.name, relation, entity)) {\n\t\t\t\t\tfound.add(object);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn found;\n\t}\n\n\t/** Every id of every page of `findObjects`. */\n\tprivate async holding(\n\t\ttype: string,\n\t\trelation: string,\n\t\tsubject: Subject,\n\t): Promise<string[]> {\n\t\tconst ids: string[] = [];\n\t\tlet after: string | null = null;\n\t\tdo {\n\t\t\tconst page: CursorPage<string> = await this.store.findObjects({\n\t\t\t\ttype,\n\t\t\t\trelation,\n\t\t\t\tsubject,\n\t\t\t\tafter,\n\t\t\t\tlimit: MAX_PAGE_SIZE,\n\t\t\t});\n\t\t\tids.push(...page.items);\n\t\t\tafter = page.nextCursor;\n\t\t} while (after !== null);\n\t\treturn ids;\n\t}\n\n\t/** The objects whose field names `id`, from the `fromField`'s lookup. */\n\tprivate async lookup(\n\t\ttype: ResolvedObjectType,\n\t\trelation: string,\n\t\tid: string,\n\t): Promise<readonly string[]> {\n\t\tconst def = type.relations.get(relation);\n\t\tif (def?.kind !== 'fromField' || def.lookup === undefined) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`list: ${type.name}.${relation} is read from a field, and has no lookup to find the ${type.name}s naming ${id} — fromField('${def?.kind === 'fromField' ? def.field : relation}', '${def?.kind === 'fromField' ? def.subject : ''}', { lookup })`,\n\t\t\t);\n\t\t}\n\t\tconst ids = await def.lookup(id);\n\t\tif (!Array.isArray(ids) || ids.some((each) => typeof each !== 'string')) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`list: the lookup of ${type.name}.${relation} must answer an array of ids`,\n\t\t\t);\n\t\t}\n\t\treturn ids;\n\t}\n\n\t/** The condition, run on the caller's `ctx`, as for `can()`. */\n\tprivate passes(\n\t\trule: ResolvedRule,\n\t\ttype: ResolvedObjectType,\n\t\tname: string,\n\t): boolean {\n\t\tif (this.ctx === undefined) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`list: ${type.name}.${name} reaches a condition, and no ctx was passed — pass { ctx }`,\n\t\t\t);\n\t\t}\n\t\treturn (rule.test as (ctx: unknown) => boolean)(this.ctx) === true;\n\t}\n}\n",
9
9
  "/** The walk behind `can()`: from an object, through its rules, to a subject. */\n\nimport { PermissionDepthError } from '../errors/janus-error';\nimport { formatEntity } from '../subjects/notation';\nimport type { Entity, Subject } from '../subjects/subject';\nimport type { RelationStore } from './port/types';\nimport {\n\tadmits,\n\ttype ResolvedModel,\n\ttype ResolvedObjectType,\n\ttype ResolvedRule,\n} from './resolve';\n\n/** An object on the walk: its entity, and its data when the caller passed it. */\nexport interface Node {\n\treadonly entity: Entity;\n\treadonly data: Readonly<Record<string, unknown>> | null;\n}\n\n/** One check: its context, its path, and the depth it may reach. */\nexport class Walk {\n\t/** The nodes on the current path. The walk is sequential, so one set is the stack. */\n\tprivate readonly path = new Set<string>();\n\n\tconstructor(\n\t\tprivate readonly model: ResolvedModel,\n\t\tprivate readonly store: RelationStore,\n\t\tprivate readonly maxDepth: number,\n\t\tprivate readonly ctx: unknown,\n\t\tprivate readonly question: string,\n\t) {}\n\n\t/** Whether `subject` holds `name` — a relation or a permission — on `node`. */\n\tasync holds(\n\t\tsubject: Subject,\n\t\tnode: Node,\n\t\tname: string,\n\t\tdepth: number,\n\t): Promise<boolean> {\n\t\tif (depth > this.maxDepth) {\n\t\t\tthrow new PermissionDepthError(\n\t\t\t\t`can: checking ${this.question} crossed more than ${this.maxDepth} relations without an answer`,\n\t\t\t\t{ permission: this.question, maxDepth: this.maxDepth },\n\t\t\t);\n\t\t}\n\n\t\tconst key = `${formatEntity(node.entity)}#${name}`;\n\t\t// A cycle in the data: this branch grants nothing, and it is not an error.\n\t\tif (this.path.has(key)) return false;\n\n\t\tconst type = this.model.types.get(node.entity.type);\n\t\t// A stored tuple naming a type the model no longer declares grants nothing.\n\t\tif (type === undefined) return false;\n\n\t\tthis.path.add(key);\n\t\ttry {\n\t\t\treturn type.permissions.has(name)\n\t\t\t\t? await this.permission(subject, type, node, name, depth)\n\t\t\t\t: await this.relation(subject, type, node, name, depth);\n\t\t} finally {\n\t\t\tthis.path.delete(key);\n\t\t}\n\t}\n\n\tprivate async relation(\n\t\tsubject: Subject,\n\t\ttype: ResolvedObjectType,\n\t\tnode: Node,\n\t\tname: string,\n\t\tdepth: number,\n\t): Promise<boolean> {\n\t\tconst relation = type.relations.get(name);\n\t\tif (relation === undefined) return false;\n\n\t\tif (relation.kind === 'fromField') {\n\t\t\tconst id = fieldOf(node, relation.field, `${type.name}.${name}`);\n\t\t\treturn (\n\t\t\t\tid !== null &&\n\t\t\t\t!('relation' in subject) &&\n\t\t\t\tsubject.type === relation.subject &&\n\t\t\t\tsubject.id === id\n\t\t\t);\n\t\t}\n\n\t\t// What the model does not admit here grants nothing, however it was stored.\n\t\tif (\n\t\t\tadmits(relation.holders, subject) &&\n\t\t\t(await this.store.has({ object: node.entity, relation: name, subject }))\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tfor (const set of await this.store.findSubjectSets(node.entity, name)) {\n\t\t\tif (!admits(relation.holders, set)) continue;\n\t\t\tconst through = { entity: { type: set.type, id: set.id }, data: null };\n\t\t\tif (await this.holds(subject, through, set.relation, depth + 1)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate async permission(\n\t\tsubject: Subject,\n\t\ttype: ResolvedObjectType,\n\t\tnode: Node,\n\t\tname: string,\n\t\tdepth: number,\n\t): Promise<boolean> {\n\t\tfor (const rule of type.permissions.get(name) ?? []) {\n\t\t\tif (rule.test !== undefined && !this.passes(rule, type, name)) continue;\n\n\t\t\tif (rule.kind === 'name') {\n\t\t\t\tif (await this.holds(subject, node, rule.name, depth)) return true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const target of await this.targets(type, node, rule.relation)) {\n\t\t\t\tif (await this.holds(subject, target, rule.target, depth + 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** The condition, run on the caller's `ctx`. Its absence is a caller's bug, not a denial. */\n\tprivate passes(\n\t\trule: ResolvedRule,\n\t\ttype: ResolvedObjectType,\n\t\tname: string,\n\t): boolean {\n\t\tif (this.ctx === undefined) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`can: ${type.name}.${name} reaches a condition, and no ctx was passed — pass { ctx }`,\n\t\t\t);\n\t\t}\n\t\treturn (rule.test as (ctx: unknown) => boolean)(this.ctx) === true;\n\t}\n\n\t/** The objects an arrow through `relation` reaches from `node`. */\n\tprivate async targets(\n\t\ttype: ResolvedObjectType,\n\t\tnode: Node,\n\t\trelation: string,\n\t): Promise<Node[]> {\n\t\tconst through = type.relations.get(relation);\n\t\tif (through === undefined) return [];\n\n\t\tif (through.kind === 'fromField') {\n\t\t\tconst id = fieldOf(node, through.field, `${type.name}.${relation}`);\n\t\t\treturn id === null\n\t\t\t\t? []\n\t\t\t\t: [{ entity: { type: through.subject, id }, data: null }];\n\t\t}\n\t\t// An entity of a type the model does not admit here is no target.\n\t\treturn (await this.store.findEntities(node.entity, relation))\n\t\t\t.filter((entity) => admits(through.holders, entity))\n\t\t\t.map((entity) => ({\n\t\t\t\tentity: { type: entity.type, id: entity.id },\n\t\t\t\tdata: null,\n\t\t\t}));\n\t}\n}\n\n/** The id a `fromField` reads, or `null` for nobody. A missing field is the caller's bug. */\nfunction fieldOf(node: Node, field: string, what: string): string | null {\n\tif (node.data === null) {\n\t\t// resolveModel refuses a model that could get here.\n\t\tthrow new TypeError(\n\t\t\t`can: ${what} reads ${field} from an object nobody passed`,\n\t\t);\n\t}\n\tconst value = node.data[field];\n\tif (value === null) return null;\n\tif (typeof value !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`can: ${what} reads ${field}, which the object ${value === undefined ? 'does not carry — pass the loaded object, spread' : 'holds as something other than a string id'}`,\n\t\t);\n\t}\n\treturn value;\n}\n",
10
10
  "/**\n * The engine: `permissions({ model, store })`, the traversal behind `can()`,\n * and the same traversal run backwards behind `list()` — `walk.ts` and\n * `reverse.ts`; what a caller passes is read in `input.ts`.\n *\n * **The invariant, permission side.** A denial is `false` — never a thrown\n * error, which is how Keto's historical endpoint answers and why a denial and\n * an outage look alike there. A failure throws — never `false`, which would\n * deny everybody everything during an outage and say nothing. The store is\n * reached only through `guardRelations`, and `outage.spec.ts` refuses a `catch`\n * anywhere in this directory.\n *\n * **What is walked.** A relation holds when the tuple is stored, or through a\n * subject set holding it (`team:t1#member`), or — for a `fromField` — when the\n * object's field names the subject. A permission holds when any of its rules\n * does: a name of the same object, an arrow to a related object's permission,\n * either under a condition. The walk is sequential and stops at the first\n * grant, so a check reads no more than it needs.\n *\n * **Cycles and depth.** A node already on the current path — a team member of\n * a team member of itself — is cut: that branch grants nothing, and it is not\n * an error, because it is data. Crossing more than `maxDepth` relations *is*\n * an error, `PERMISSION_DEPTH`: an evaluation that stopped half-way decided\n * nothing, and `false` would hide it.\n */\n\nimport type { CursorPage } from '../pagination/cursor-page';\nimport { pageLimit } from '../pagination/cursor-page';\nimport { guardRelations } from '../stores/guard';\nimport { objectOf, subjectOf, tupleOf, typeOf } from './input';\nimport type { ModelConfig, PermissionModel, Permissions } from './model';\nimport { resolvedOf } from './model';\nimport type { RelationStore } from './port/types';\nimport { Reverse } from './reverse';\nimport { Walk } from './walk';\n\n/** Deep enough for any hierarchy a person draws; OpenFGA's default too. */\nconst DEFAULT_MAX_DEPTH = 25;\n\nconst REQUIRED = [\n\t'write',\n\t'has',\n\t'findSubjectSets',\n\t'findEntities',\n\t'findObjects',\n\t'deleteEntity',\n] as const;\n\nexport interface PermissionsOptions<C extends ModelConfig> {\n\t/** What `defineModel()` answered. */\n\treadonly model: PermissionModel<C>;\n\t/** Where tuples live. `createMemoryRelations()` in tests. */\n\treadonly store: RelationStore;\n\t/** How many relations a check may cross. `25` when absent. */\n\treadonly maxDepth?: number;\n}\n\n/**\n * Binds a model to a relation store. Connects to nothing.\n *\n * ```ts\n * const access = permissions({ model, store: createMemoryRelations() });\n * await access.grant({ type: 'team', id: 't1' }, 'member', staff);\n * await access.can(staff, 'view', { type: 'record', ...record }, { ctx: { onShift } });\n * ```\n */\nexport function permissions<C extends ModelConfig>(\n\toptions: PermissionsOptions<C>,\n): Permissions<C> {\n\tconst where = 'permissions';\n\tconst model = resolvedOf(options.model);\n\tconst maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n\tif (!Number.isInteger(maxDepth) || maxDepth < 1) {\n\t\tthrow new TypeError(`${where}: maxDepth must be a positive integer`);\n\t}\n\tconst raw = options.store as unknown as Record<string, unknown> | undefined;\n\tfor (const method of REQUIRED) {\n\t\tif (typeof raw?.[method] !== 'function') {\n\t\t\tthrow new TypeError(`${where}: store.${method} is missing`);\n\t\t}\n\t}\n\tconst store = guardRelations(options.store);\n\n\tconst check = async (\n\t\tsubject: unknown,\n\t\tpermission: string,\n\t\tobject: unknown,\n\t\toptions?: { readonly ctx?: unknown },\n\t): Promise<boolean> => {\n\t\t// Anonymous, before anything else — and before the store.\n\t\tif (subject === null || subject === undefined) return false;\n\n\t\tconst root = objectOf(model, object, 'can');\n\t\tconst type = typeOf(model, root.type, 'can');\n\t\tif (!type.relations.has(permission) && !type.permissions.has(permission)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`can: \"${permission}\" is not a relation or a permission of ${type.name}`,\n\t\t\t);\n\t\t}\n\n\t\treturn new Walk(\n\t\t\tmodel,\n\t\t\tstore,\n\t\t\tmaxDepth,\n\t\t\toptions?.ctx,\n\t\t\t`${type.name}#${permission}`,\n\t\t).holds(\n\t\t\tsubjectOf(model, subject, 'can'),\n\t\t\t{ entity: { type: root.type, id: root.id }, data: root.data },\n\t\t\tpermission,\n\t\t\t0,\n\t\t);\n\t};\n\n\tconst list = async (\n\t\tsubject: unknown,\n\t\tpermission: string,\n\t\ttypeName: unknown,\n\t\toptions?: {\n\t\t\treadonly ctx?: unknown;\n\t\t\treadonly after?: string | null;\n\t\t\treadonly limit?: number;\n\t\t},\n\t): Promise<CursorPage<string>> => {\n\t\tconst limit = pageLimit(options?.limit, 'list');\n\t\tconst after = options?.after ?? null;\n\t\tif (after !== null && typeof after !== 'string') {\n\t\t\tthrow new TypeError(\n\t\t\t\t'list: after must be the nextCursor of a page, or null',\n\t\t\t);\n\t\t}\n\t\t// Anonymous holds nothing, and the store is not asked.\n\t\tif (subject === null || subject === undefined) {\n\t\t\treturn { items: [], nextCursor: null };\n\t\t}\n\n\t\tif (typeof typeName !== 'string') {\n\t\t\tthrow new TypeError('list: the type must be an object type of the model');\n\t\t}\n\t\tconst type = typeOf(model, typeName, 'list');\n\t\tif (!type.relations.has(permission) && !type.permissions.has(permission)) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`list: \"${permission}\" is not a relation or a permission of ${type.name}`,\n\t\t\t);\n\t\t}\n\n\t\tconst ids = await new Reverse(\n\t\t\tmodel,\n\t\t\tstore,\n\t\t\tmaxDepth,\n\t\t\toptions?.ctx,\n\t\t\tsubjectOf(model, subject, 'list'),\n\t\t\t`${type.name}#${permission}`,\n\t\t).objects(type.name, permission);\n\n\t\tconst rest = [...ids].sort().filter((id) => after === null || id > after);\n\t\tconst items = rest.slice(0, limit);\n\t\tconst last = items.at(-1);\n\t\treturn {\n\t\t\titems,\n\t\t\tnextCursor: rest.length > limit && last !== undefined ? last : null,\n\t\t};\n\t};\n\n\tconst change =\n\t\t(operation: 'grant' | 'revoke') =>\n\t\tasync (object: unknown, relation: string, subject: unknown) => {\n\t\t\tconst tuple = tupleOf(model, object, relation, subject, operation);\n\t\t\tawait store.write(\n\t\t\t\toperation === 'grant' ? { add: [tuple] } : { remove: [tuple] },\n\t\t\t);\n\t\t};\n\n\treturn Object.freeze({\n\t\tmodel: options.model,\n\t\tcan: check as Permissions<C>['can'],\n\t\tlist: list as Permissions<C>['list'],\n\t\tgrant: change('grant') as Permissions<C>['grant'],\n\t\trevoke: change('revoke') as Permissions<C>['revoke'],\n\t});\n}\n"
11
11
  ],
12
- "mappings": ";;;;;;;;;;;;;;AAwBO,SAAS,MAAM,CAAC,SAA4B,SAA2B;AAAA,EAC7E,OAAO,QAAQ,KAAK,CAAC,WACpB,OAAO,SAAS,SACb,EAAE,cAAc,YAAY,OAAO,SAAS,QAAQ,QACpD,cAAc,YACf,OAAO,SAAS,QAAQ,QACxB,OAAO,aAAa,QAAQ,QAC/B;AAAA;AAmCD,IAAM,OAAO;AAEb,IAAM,QAAQ;AAEd,IAAM,WAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAE7D,SAAS,YAAY,CAC3B,QACA,OACgB;AAAA,EAChB,MAAM,SAAS,CAAC,YAAoB,IAAI,UAAU,GAAG,UAAU,SAAS;AAAA,EAExE,IAAI,CAAC,SAAS,MAAM;AAAA,IAAG,MAAM,OAAO,0BAA0B;AAAA,EAC9D,IAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAAA,IACpC,MAAM,OACL,wFACD;AAAA,EACD;AAAA,EACA,WAAW,WAAW,OAAO,UAAU;AAAA,IACtC,IAAI,OAAO,YAAY,YAAY,CAAC,KAAK,KAAK,OAAO,GAAG;AAAA,MACvD,MAAM,OACL,qBAAqB,OAAO,OAAO,6BACpC;AAAA,IACD;AAAA,EACD;AAAA,EACA,MAAM,WAAW,IAAI,IAAY,OAAO,QAAQ;AAAA,EAEhD,IAAI,CAAC,SAAS,OAAO,KAAK,KAAK,OAAO,KAAK,OAAO,KAAK,EAAE,WAAW,GAAG;AAAA,IACtE,MAAM,OAAO,+BAA+B;AAAA,EAC7C;AAAA,EACA,MAAM,YAAY,IAAI,IAAI,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,EACnD,WAAW,QAAQ,WAAW;AAAA,IAC7B,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG;AAAA,MACrB,MAAM,OACL,oBAAoB,uFACrB;AAAA,IACD;AAAA,IACA,IAAI,SAAS,IAAI,IAAI,GAAG;AAAA,MACvB,MAAM,OACL,IAAI,kEAAkE,0BACvE;AAAA,IACD;AAAA,EACD;AAAA,EAIA,MAAM,gBAAgB,IAAI;AAAA,EAC1B,MAAM,kBAAkB,IAAI;AAAA,EAC5B,YAAY,MAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,IACvD,MAAM,KAAK,SAAS;AAAA,IACpB,IAAI,CAAC,SAAS,GAAG;AAAA,MAAG,MAAM,OAAO,GAAG,sBAAsB;AAAA,IAC1D,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,MACnC,IAAI,QAAQ,eAAe,QAAQ,eAAe;AAAA,QACjD,MAAM,OAAO,GAAG,MAAM,oCAAoC;AAAA,MAC3D;AAAA,IACD;AAAA,IACA,cAAc,IAAI,MAAM,QAAQ,IAAI,WAAW,GAAG,gBAAgB,MAAM,CAAC;AAAA,IACzE,MAAM,cAAc,QAAQ,IAAI,aAAa,GAAG,kBAAkB,MAAM;AAAA,IACxE,WAAW,cAAc,aAAa;AAAA,MACrC,IAAI,cAAc,IAAI,IAAI,GAAG,IAAI,UAAU,GAAG;AAAA,QAC7C,MAAM,OACL,GAAG,QAAQ,2DACZ;AAAA,MACD;AAAA,IACD;AAAA,IACA,gBAAgB,IAAI,MAAM,WAAW;AAAA,EACtC;AAAA,EAEA,MAAM,gBAAgB,CAAC,SACtB,SAAS,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI;AAAA,EACzC,MAAM,UAAU,CAAC,SAChB,IAAI,IAAI;AAAA,IACP,GAAI,cAAc,IAAI,IAAI,KAAK,CAAC;AAAA,IAChC,GAAI,gBAAgB,IAAI,IAAI,KAAK,CAAC;AAAA,EACnC,CAAC;AAAA,EAEF,MAAM,QAAQ,IAAI;AAAA,EAClB,YAAY,MAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,IACvD,MAAM,KAAK,SAAS;AAAA,IACpB,MAAM,YAAY,IAAI;AAAA,IAEtB,YAAY,UAAU,YAAY,OAAO,QAAQ,IAAI,aAAa,CAAC,CAAC,GAAG;AAAA,MACtE,MAAM,OAAO,GAAG,gBAAgB;AAAA,MAChC,UAAU,IACT,UACA,gBAAgB,SAAS,MAAM;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC,CACF;AAAA,IACD;AAAA,IAEA,MAAM,cAAc,IAAI;AAAA,IACxB,YAAY,YAAY,UAAU,OAAO,QAAQ,IAAI,eAAe,CAAC,CAAC,GAAG;AAAA,MACxE,MAAM,OAAO,GAAG,kBAAkB;AAAA,MAClC,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAAA,QAChD,MAAM,OAAO,GAAG,yCAAyC;AAAA,MAC1D;AAAA,MACA,YAAY,IACX,YACA,MAAM,IAAI,CAAC,MAAe,UACzB,YAAY,MAAM,GAAG,QAAQ,UAAU;AAAA,QACtC;AAAA,QACA,KAAK,QAAQ,IAAI;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACP,CAAC,CACF,CACD;AAAA,IACD;AAAA,IAEA,MAAM,IAAI,MAAM,EAAE,MAAM,WAAW,YAAY,CAAC;AAAA,EACjD;AAAA,EAEA,YAAY,OAAO,MAAM;AAAA,EACzB,qBAAqB,OAAO,MAAM;AAAA,EAElC,OAAO,EAAE,UAAU,MAAM;AAAA;AAG1B,SAAS,OAAO,CACf,OACA,IACA,QACc;AAAA,EACd,IAAI,UAAU;AAAA,IAAW,OAAO,IAAI;AAAA,EACpC,IAAI,CAAC,SAAS,KAAK;AAAA,IAAG,MAAM,OAAO,GAAG,sBAAsB;AAAA,EAC5D,WAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AAAA,IACtC,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG;AAAA,MACrB,MAAM,OACL,GAAG,QAAQ,uFACZ;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA;AAGlC,SAAS,eAAe,CACvB,OACA;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,GAMkB;AAAA,EACnB,IAAI,SAAS,KAAK,KAAK,MAAM,SAAS,aAAa;AAAA,IAClD,QAAQ,OAAO,SAAS,WAAW;AAAA,IACnC,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,GAAG;AAAA,MACpD,MAAM,OAAO,GAAG,6CAA6C;AAAA,IAC9D;AAAA,IACA,IAAI,OAAO,YAAY,YAAY,CAAC,cAAc,OAAO,GAAG;AAAA,MAC3D,MAAM,OACL,GAAG,0BAA0B,OAAO,OAAO,iCAC5C;AAAA,IACD;AAAA,IACA,IAAI,WAAW,aAAa,OAAO,WAAW,YAAY;AAAA,MACzD,MAAM,OAAO,GAAG,6CAA6C;AAAA,IAC9D;AAAA,IACA,OAAO,WAAW,YACf,EAAE,MAAM,aAAa,OAAO,QAAQ,IACpC;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACH;AAAA,EAEA,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAAA,IAChD,MAAM,OACL,GAAG,iEACJ;AAAA,EACD;AAAA,EACA,MAAM,UAAU,MAAM,IAAI,CAAC,WAA4B;AAAA,IACtD,IAAI,OAAO,WAAW,UAAU;AAAA,MAC/B,MAAM,OAAO,GAAG,iCAAiC;AAAA,IAClD;AAAA,IACA,MAAM,OAAO,OAAO,QAAQ,GAAG;AAAA,IAC/B,IAAI,OAAO,GAAG;AAAA,MACb,IAAI,CAAC,cAAc,MAAM,GAAG;AAAA,QAC3B,MAAM,OAAO,GAAG,UAAU,+BAA+B;AAAA,MAC1D;AAAA,MACA,OAAO,EAAE,MAAM,QAAQ,MAAM,OAAO;AAAA,IACrC;AAAA,IACA,MAAM,OAAO,OAAO,MAAM,GAAG,IAAI;AAAA,IACjC,MAAM,WAAW,OAAO,MAAM,OAAO,CAAC;AAAA,IACtC,IAAI,CAAC,cAAc,IAAI,IAAI,GAAG,IAAI,QAAQ,GAAG;AAAA,MAC5C,MAAM,OACL,GAAG,UAAU,qFACd;AAAA,IACD;AAAA,IACA,OAAO,EAAE,MAAM,OAAO,MAAM,SAAS;AAAA,GACrC;AAAA,EACD,OAAO,EAAE,MAAM,UAAU,QAAQ;AAAA;AAGlC,SAAS,WAAW,CACnB,OACA,MACA,SAQe;AAAA,EACf,QAAQ,WAAW;AAAA,EAEnB,IAAI,SAAS,KAAK,KAAK,MAAM,SAAS,QAAQ;AAAA,IAC7C,IAAI,OAAO,MAAM,SAAS,YAAY;AAAA,MACrC,MAAM,OAAO,GAAG,2CAA2C;AAAA,IAC5D;AAAA,IACA,MAAM,QAAQ,YAAY,MAAM,MAAM,MAAM,OAAO;AAAA,IACnD,OAAO,KAAK,OAAO,MAAM,MAAM,KAAgC;AAAA,EAChE;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC9B,MAAM,OAAO,GAAG,6CAA6C;AAAA,EAC9D;AAAA,EAEA,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAAA,EAChC,IAAI,QAAQ,GAAG;AAAA,IACd,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,GAAG;AAAA,MAC5B,MAAM,OACL,GAAG,UAAU,+CAA+C,QAAQ,MACrE;AAAA,IACD;AAAA,IACA,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK;AAAA,EACrC,MAAM,SAAS,MAAM,MAAM,QAAQ,CAAC;AAAA,EACpC,MAAM,UAAU,QAAQ,UAAU,IAAI,QAAQ;AAAA,EAC9C,IAAI,YAAY,WAAW;AAAA,IAC1B,MAAM,OACL,GAAG,UAAU,wBAAwB,yCAAyC,QAAQ,MACvF;AAAA,EACD;AAAA,EACA,MAAM,UACL,QAAQ,SAAS,cACd,CAAC,QAAQ,OAAO,IAChB,QAAQ,QAAQ,IAAI,CAAC,WACrB,OAAO,SAAS,SAAS,OAAO,OAAO,IACxC;AAAA,EACH,WAAW,QAAQ,SAAS;AAAA,IAE3B,IAAI,SAAS,QAAQ,CAAC,QAAQ,UAAU,IAAI,IAAI,GAAG;AAAA,MAClD,MAAM,OACL,GAAG,UAAU,wBAAwB,6BAA6B,SAAS,OAAO,kBAAkB,KAAK,4CAC1G;AAAA,IACD;AAAA,IACA,IAAI,CAAC,QAAQ,QAAQ,IAAI,EAAE,IAAI,MAAM,GAAG;AAAA,MACvC,MAAM,OACL,GAAG,UAAU,iBAAiB,kBAAkB,uBACjD;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO,EAAE,MAAM,SAAS,UAAU,OAAO;AAAA;AAS1C,SAAS,WAAW,CACnB,OACA,QACO;AAAA,EACP,WAAW,QAAQ,MAAM,OAAO,GAAG;AAAA,IAClC,MAAM,WAAqB,CAAC;AAAA,IAC5B,MAAM,OAAO,IAAI;AAAA,IAEjB,MAAM,QAAQ,CAAC,eAA6B;AAAA,MAC3C,IAAI,KAAK,IAAI,UAAU;AAAA,QAAG;AAAA,MAC1B,MAAM,OAAO,SAAS,QAAQ,UAAU;AAAA,MACxC,IAAI,QAAQ,GAAG;AAAA,QACd,MAAM,OACL,SAAS,KAAK,qBAAqB,CAAC,GAAG,SAAS,MAAM,IAAI,GAAG,UAAU,EAAE,KAAK,KAAK,8BACpF;AAAA,MACD;AAAA,MACA,SAAS,KAAK,UAAU;AAAA,MACxB,WAAW,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC,GAAG;AAAA,QAC1D,IAAI,KAAK,SAAS,UAAU,KAAK,YAAY,IAAI,KAAK,IAAI,GAAG;AAAA,UAC5D,MAAM,KAAK,IAAI;AAAA,QAChB;AAAA,MACD;AAAA,MACA,SAAS,IAAI;AAAA,MACb,KAAK,IAAI,UAAU;AAAA;AAAA,IAGpB,WAAW,cAAc,KAAK,YAAY,KAAK;AAAA,MAAG,MAAM,UAAU;AAAA,EACnE;AAAA;AAUD,SAAS,oBAAoB,CAC5B,OACA,QACO;AAAA,EAEP,MAAM,YAAY,CAAC,MAA0B,SAAgC;AAAA,IAC5E,MAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AAAA,IACxC,IAAI,aAAa,WAAW;AAAA,MAC3B,OAAO,SAAS,SAAS,cAAc,SAAS,QAAQ;AAAA,IACzD;AAAA,IACA,WAAW,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC,GAAG;AAAA,MACpD,MAAM,QACL,KAAK,SAAS,SACX,UAAU,MAAM,KAAK,IAAI,IAE1B,UAAU,MAAM,KAAK,QAAQ;AAAA,MAChC,IAAI,UAAU;AAAA,QAAM,OAAO;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA;AAAA,EAGR,WAAW,QAAQ,MAAM,OAAO,GAAG;AAAA,IAClC,YAAY,UAAU,QAAQ,KAAK,WAAW;AAAA,MAC7C,IAAI,IAAI,SAAS;AAAA,QAAU;AAAA,MAC3B,WAAW,UAAU,IAAI,SAAS;AAAA,QACjC,IAAI,OAAO,SAAS;AAAA,UAAO;AAAA,QAC3B,MAAM,SAAS,MAAM,IAAI,OAAO,IAAI;AAAA,QACpC,MAAM,QACL,WAAW,YAAY,OAAO,UAAU,QAAQ,OAAO,QAAQ;AAAA,QAChE,IAAI,UAAU,MAAM;AAAA,UACnB,MAAM,OACL,SAAS,KAAK,kBAAkB,cAAc,OAAO,QAAQ,OAAO,mBAAmB,OAAO,QAAQ,oCAAoC,OAAO,0EAClJ;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,IACA,YAAY,YAAY,UAAU,KAAK,aAAa;AAAA,MACnD,WAAW,QAAQ,OAAO;AAAA,QACzB,IAAI,KAAK,SAAS;AAAA,UAAS;AAAA,QAC3B,MAAM,UAAU,KAAK,UAAU,IAAI,KAAK,QAAQ;AAAA,QAChD,MAAM,UACL,SAAS,SAAS,cACf,CAAC,QAAQ,OAAO,KACf,SAAS,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,QACxD,WAAW,QAAQ,SAAS;AAAA,UAC3B,MAAM,SAAS,MAAM,IAAI,IAAI;AAAA,UAC7B,MAAM,QACL,WAAW,YAAY,OAAO,UAAU,QAAQ,KAAK,MAAM;AAAA,UAC5D,IAAI,UAAU,MAAM;AAAA,YACnB,MAAM,OACL,SAAS,KAAK,oBAAoB,gBAAgB,KAAK,aAAa,KAAK,mBAAmB,QAAQ,KAAK,uBAAuB,QAAQ,yGACzI;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;;;AC7aD,IAAM,WAAW;AAEjB,IAAM,YAAW,CAAC,UACjB,OAAO,UAAU,YAAY,UAAU;AAEjC,SAAS,IAAI,CAAC,OAAgB,MAAc,OAAuB;AAAA,EACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,SAAS,KAAK,KAAK,GAAG;AAAA,IACtE,MAAM,IAAI,UACT,GAAG,UAAU,6DACd;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,MAAM,CACrB,OACA,MACA,OACqB;AAAA,EACrB,MAAM,OAAO,MAAM,MAAM,IAAI,IAAI;AAAA,EACjC,IAAI,SAAS,WAAW;AAAA,IACvB,MAAM,IAAI,UACT,GAAG,WAAW,0CACf;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,QAAQ,CACvB,OACA,OACA,OAKC;AAAA,EACD,IAAI,CAAC,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AAAA,IACvD,MAAM,IAAI,UACT,GAAG,qDACJ;AAAA,EACD;AAAA,EACA,OAAO,OAAO,MAAM,MAAM,KAAK;AAAA,EAC/B,OAAO;AAAA,IACN,MAAM,MAAM;AAAA,IACZ,IAAI,KAAK,MAAM,IAAI,iBAAiB,KAAK;AAAA,IACzC,MAAM;AAAA,EACP;AAAA;AAWM,SAAS,SAAS,CACxB,OACA,OACA,OACU;AAAA,EACV,IAAI,CAAC,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AAAA,IACvD,MAAM,IAAI,UACT,GAAG,oDACJ;AAAA,EACD;AAAA,EACA,MAAM,KAAK,KAAK,MAAM,IAAI,kBAAkB,KAAK;AAAA,EACjD,IAAI,MAAM,SAAS,IAAI,MAAM,IAAI;AAAA,IAAG,OAAO,EAAE,MAAM,MAAM,MAAM,GAAG;AAAA,EAElE,MAAM,OAAO,OAAO,OAAO,MAAM,MAAM,KAAK;AAAA,EAC5C,IAAI,OAAO,MAAM,aAAa;AAAA,IAAU,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG;AAAA,EACrE,IAAI,CAAC,KAAK,UAAU,IAAI,MAAM,QAAQ,GAAG;AAAA,IACxC,MAAM,IAAI,UACT,GAAG,WAAW,MAAM,kCAAkC,KAAK,YAAY,KAAK,QAAQ,MAAM,MAAM,4BACjG;AAAA,EACD;AAAA,EACA,OAAO,EAAE,MAAM,KAAK,MAAM,IAAI,UAAU,MAAM,SAAS;AAAA;AAIjD,SAAS,OAAO,CACtB,OACA,QACA,UACA,SACA,OACC;AAAA,EACD,MAAM,SAAS,SAAS,OAAO,QAAQ,KAAK;AAAA,EAC5C,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EAC7C,MAAM,MAAM,KAAK,UAAU,IAAI,QAAQ;AAAA,EACvC,IAAI,QAAQ,WAAW;AAAA,IACtB,MAAM,IAAI,UACT,GAAG,WAAW,kCAAkC,KAAK,MACtD;AAAA,EACD;AAAA,EACA,IAAI,IAAI,SAAS,aAAa;AAAA,IAC7B,MAAM,IAAI,UACT,GAAG,UAAU,KAAK,QAAQ,yBAAyB,IAAI,iDAAiD,KAAK,cAC9G;AAAA,EACD;AAAA,EAEA,MAAM,MAAM,UAAU,OAAO,SAAS,KAAK;AAAA,EAC3C,IAAI,CAAC,OAAO,IAAI,SAAS,GAAG,GAAG;AAAA,IAC9B,MAAM,IAAI,UACT,GAAG,UAAU,KAAK,QAAQ,2BAA2B,cAAc,MAAM,GAAG,IAAI,QAAQ,IAAI,aAAa,IAAI,MAC9G;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN,QAAQ,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG;AAAA,IAC3C;AAAA,IACA,SAAS;AAAA,EACV;AAAA;;;AC9CM,SAAS,SAAS,CACxB,OACA,SACA,SACY;AAAA,EACZ,OAAO,OAAO,OACb,YAAY,YACT,EAAE,MAAM,aAAsB,OAAO,QAAQ,IAC7C,EAAE,MAAM,aAAsB,OAAO,SAAS,QAAQ,QAAQ,OAAO,CACzE;AAAA;AAiBM,SAAS,IAAoC,CACnD,MACA,MACkB;AAAA,EAClB,OAAO,OAAO,OAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA;AAkgBlD,IAAM,WAAW,IAAI;AA+Bd,SAAS,WAAwC,CACvD,QACqB;AAAA,EACrB,MAAM,WAAW,aAAa,QAAQ,aAAa;AAAA,EACnD,MAAM,QAA4B,OAAO,OAAO;AAAA,IAC/C,UAAU,CAAC,GAAG,SAAS,QAAQ;AAAA,IAC/B,OAAO,CAAC,GAAG,SAAS,MAAM,KAAK,CAAC;AAAA,IAChC,YAAY;AAAA,EACb,CAAC;AAAA,EACD,SAAS,IAAI,OAAO,QAAQ;AAAA,EAC5B,OAAO;AAAA;AAID,SAAS,UAAU,CAAC,OAA8B;AAAA,EACxD,MAAM,WAAW,SAAS,IAAI,KAAK;AAAA,EACnC,IAAI,aAAa,WAAW;AAAA,IAC3B,MAAM,IAAI,UACT,0FACD;AAAA,EACD;AAAA,EACA,OAAO;AAAA;;;AC7nBD,MAAM,QAAQ;AAAA,EAMpB,WAAW,CACO,OACA,OACA,UACA,KACA,SACA,UAChB;AAAA,IANgB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAXV,gBAAW,IAAI;AAAA,IACf,eAAU,IAAI;AAAA,IACL,YAAO,IAAI;AAAA,IACpB,cAAS;AAAA;AAAA,OAWX,QAAO,CAAC,MAAc,MAA4C;AAAA,IACvE,SAAS,QAAQ,EAAG,SAAS,KAAK,UAAU,SAAS,GAAG;AAAA,MACvD,KAAK,UAAU,IAAI;AAAA,MACnB,KAAK,SAAS;AAAA,MACd,MAAM,QAAQ,MAAM,KAAK,MAAM,MAAM,IAAI;AAAA,MACzC,IAAI,CAAC,KAAK,UAAU,KAAK,KAAK;AAAA,QAAG,OAAO;AAAA,MACxC,KAAK,WAAW,KAAK;AAAA,IACtB;AAAA,IACA,MAAM,IAAI,sBACT,iBAAiB,KAAK,8BAA8B,KAAK,wCACzD,EAAE,YAAY,KAAK,UAAU,UAAU,KAAK,SAAS,CACtD;AAAA;AAAA,EAIO,IAAI,GAAY;AAAA,IACvB,YAAY,KAAK,QAAQ,KAAK,SAAS;AAAA,MACtC,KAAK,KAAK,SAAS,IAAI,GAAG,GAAG,QAAQ,OAAO,IAAI;AAAA,QAAM,OAAO;AAAA,IAC9D;AAAA,IACA,OAAO;AAAA;AAAA,OAIM,MAAK,CAClB,UACA,MAC+B;AAAA,IAC/B,MAAM,MAAM,GAAG,YAAY;AAAA,IAC3B,MAAM,OAAO,KAAK,QAAQ,IAAI,GAAG;AAAA,IACjC,IAAI,SAAS;AAAA,MAAW,OAAO;AAAA,IAC/B,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG;AAAA,MACvB,KAAK,SAAS;AAAA,MACd,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;AAAA,IACtC;AAAA,IAEA,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI,QAAQ;AAAA,IAC1C,IAAI,SAAS;AAAA,MAAW,OAAO,IAAI;AAAA,IAEnC,KAAK,KAAK,IAAI,GAAG;AAAA,IACjB,IAAI;AAAA,MACH,MAAM,QAAQ,KAAK,YAAY,IAAI,IAAI,IACpC,MAAM,KAAK,WAAW,MAAM,IAAI,IAChC,MAAM,KAAK,SAAS,MAAM,IAAI;AAAA,MACjC,KAAK,QAAQ,IAAI,KAAK,KAAK;AAAA,MAC3B,OAAO;AAAA,cACN;AAAA,MACD,KAAK,KAAK,OAAO,GAAG;AAAA;AAAA;AAAA,OAIR,SAAQ,CACrB,MACA,MACuB;AAAA,IACvB,MAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AAAA,IACxC,IAAI,aAAa;AAAA,MAAW,OAAO,IAAI;AAAA,IAEvC,IAAI,SAAS,SAAS,aAAa;AAAA,MAClC,MAAM,UAAU,KAAK;AAAA,MACrB,OAAO,cAAc,WAAW,QAAQ,SAAS,SAAS,UACvD,IAAI,MACJ,IAAI,IAAI,MAAM,KAAK,OAAO,MAAM,MAAM,QAAQ,EAAE,CAAC;AAAA,IACrD;AAAA,IAGA,MAAM,QAAQ,IAAI,IACjB,OAAO,SAAS,SAAS,KAAK,OAAO,IAClC,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,OAAO,IAChD,CAAC,CACL;AAAA,IACA,WAAW,UAAU,SAAS,SAAS;AAAA,MACtC,IAAI,OAAO,SAAS;AAAA,QAAO;AAAA,MAC3B,WAAW,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,OAAO,QAAQ,GAAG;AAAA,QAChE,MAAM,MAAM,EAAE,MAAM,OAAO,MAAM,IAAI,UAAU,OAAO,SAAS;AAAA,QAC/D,WAAW,UAAU,MAAM,KAAK,QAAQ,KAAK,MAAM,MAAM,GAAG,GAAG;AAAA,UAC9D,MAAM,IAAI,MAAM;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,OAGM,WAAU,CACvB,MACA,MACuB;AAAA,IACvB,MAAM,QAAQ,IAAI;AAAA,IAClB,WAAW,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC,GAAG;AAAA,MACpD,IAAI,KAAK,SAAS,aAAa,CAAC,KAAK,OAAO,MAAM,MAAM,IAAI;AAAA,QAAG;AAAA,MAE/D,IAAI,KAAK,SAAS,QAAQ;AAAA,QACzB,WAAW,MAAM,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,UAAG,MAAM,IAAI,EAAE;AAAA,QACrE;AAAA,MACD;AAAA,MACA,WAAW,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,UAAU,KAAK,MAAM,GAAG;AAAA,QACpE,MAAM,IAAI,EAAE;AAAA,MACb;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,OAIM,MAAK,CAClB,MACA,UACA,QACuB;AAAA,IACvB,MAAM,UAAU,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC3C,MAAM,QAAQ,IAAI;AAAA,IAClB,IAAI,YAAY;AAAA,MAAW,OAAO;AAAA,IAElC,IAAI,QAAQ,SAAS,aAAa;AAAA,MACjC,WAAW,MAAM,MAAM,KAAK,MAAM,QAAQ,SAAS,MAAM,GAAG;AAAA,QAC3D,WAAW,UAAU,MAAM,KAAK,OAAO,MAAM,UAAU,EAAE,GAAG;AAAA,UAC3D,MAAM,IAAI,MAAM;AAAA,QACjB;AAAA,MACD;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IACA,WAAW,UAAU,QAAQ,SAAS;AAAA,MAErC,IAAI,OAAO,SAAS,UAAU,CAAC,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,GAAG;AAAA,QACjE;AAAA,MACD;AAAA,MACA,WAAW,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,MAAM,GAAG;AAAA,QACvD,MAAM,SAAS,EAAE,MAAM,OAAO,MAAM,GAAG;AAAA,QACvC,WAAW,UAAU,MAAM,KAAK,QAAQ,KAAK,MAAM,UAAU,MAAM,GAAG;AAAA,UACrE,MAAM,IAAI,MAAM;AAAA,QACjB;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,OAIM,QAAO,CACpB,MACA,UACA,SACoB;AAAA,IACpB,MAAM,MAAgB,CAAC;AAAA,IACvB,IAAI,QAAuB;AAAA,IAC3B,GAAG;AAAA,MACF,MAAM,OAA2B,MAAM,KAAK,MAAM,YAAY;AAAA,QAC7D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACR,CAAC;AAAA,MACD,IAAI,KAAK,GAAG,KAAK,KAAK;AAAA,MACtB,QAAQ,KAAK;AAAA,IACd,SAAS,UAAU;AAAA,IACnB,OAAO;AAAA;AAAA,OAIM,OAAM,CACnB,MACA,UACA,IAC6B;AAAA,IAC7B,MAAM,MAAM,KAAK,UAAU,IAAI,QAAQ;AAAA,IACvC,IAAI,KAAK,SAAS,eAAe,IAAI,WAAW,WAAW;AAAA,MAC1D,MAAM,IAAI,UACT,SAAS,KAAK,QAAQ,gEAAgE,KAAK,gBAAgB,mBAAmB,KAAK,SAAS,cAAc,IAAI,QAAQ,eAAe,KAAK,SAAS,cAAc,IAAI,UAAU,kBAChO;AAAA,IACD;AAAA,IACA,MAAM,MAAM,MAAM,IAAI,OAAO,EAAE;AAAA,IAC/B,IAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAAA,MACxE,MAAM,IAAI,UACT,uBAAuB,KAAK,QAAQ,sCACrC;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAIA,MAAM,CACb,MACA,MACA,MACU;AAAA,IACV,IAAI,KAAK,QAAQ,WAAW;AAAA,MAC3B,MAAM,IAAI,UACT,SAAS,KAAK,QAAQ,gEACvB;AAAA,IACD;AAAA,IACA,OAAQ,KAAK,KAAmC,KAAK,GAAG,MAAM;AAAA;AAEhE;;;AC1NO,MAAM,KAAK;AAAA,EAIjB,WAAW,CACO,OACA,OACA,UACA,KACA,UAChB;AAAA,IALgB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAPD,YAAO,IAAI;AAAA;AAAA,OAWtB,MAAK,CACV,SACA,MACA,MACA,OACmB;AAAA,IACnB,IAAI,QAAQ,KAAK,UAAU;AAAA,MAC1B,MAAM,IAAI,sBACT,iBAAiB,KAAK,8BAA8B,KAAK,wCACzD,EAAE,YAAY,KAAK,UAAU,UAAU,KAAK,SAAS,CACtD;AAAA,IACD;AAAA,IAEA,MAAM,MAAM,GAAG,cAAa,KAAK,MAAM,KAAK;AAAA,IAE5C,IAAI,KAAK,KAAK,IAAI,GAAG;AAAA,MAAG,OAAO;AAAA,IAE/B,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI,KAAK,OAAO,IAAI;AAAA,IAElD,IAAI,SAAS;AAAA,MAAW,OAAO;AAAA,IAE/B,KAAK,KAAK,IAAI,GAAG;AAAA,IACjB,IAAI;AAAA,MACH,OAAO,KAAK,YAAY,IAAI,IAAI,IAC7B,MAAM,KAAK,WAAW,SAAS,MAAM,MAAM,MAAM,KAAK,IACtD,MAAM,KAAK,SAAS,SAAS,MAAM,MAAM,MAAM,KAAK;AAAA,cACtD;AAAA,MACD,KAAK,KAAK,OAAO,GAAG;AAAA;AAAA;AAAA,OAIR,SAAQ,CACrB,SACA,MACA,MACA,MACA,OACmB;AAAA,IACnB,MAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AAAA,IACxC,IAAI,aAAa;AAAA,MAAW,OAAO;AAAA,IAEnC,IAAI,SAAS,SAAS,aAAa;AAAA,MAClC,MAAM,KAAK,QAAQ,MAAM,SAAS,OAAO,GAAG,KAAK,QAAQ,MAAM;AAAA,MAC/D,OACC,OAAO,QACP,EAAE,cAAc,YAChB,QAAQ,SAAS,SAAS,WAC1B,QAAQ,OAAO;AAAA,IAEjB;AAAA,IAGA,IACC,OAAO,SAAS,SAAS,OAAO,KAC/B,MAAM,KAAK,MAAM,IAAI,EAAE,QAAQ,KAAK,QAAQ,UAAU,MAAM,QAAQ,CAAC,GACrE;AAAA,MACD,OAAO;AAAA,IACR;AAAA,IACA,WAAW,OAAO,MAAM,KAAK,MAAM,gBAAgB,KAAK,QAAQ,IAAI,GAAG;AAAA,MACtE,IAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAAA,QAAG;AAAA,MACpC,MAAM,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,MAAM,KAAK;AAAA,MACrE,IAAI,MAAM,KAAK,MAAM,SAAS,SAAS,IAAI,UAAU,QAAQ,CAAC,GAAG;AAAA,QAChE,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,OAGM,WAAU,CACvB,SACA,MACA,MACA,MACA,OACmB;AAAA,IACnB,WAAW,QAAQ,KAAK,YAAY,IAAI,IAAI,KAAK,CAAC,GAAG;AAAA,MACpD,IAAI,KAAK,SAAS,aAAa,CAAC,KAAK,OAAO,MAAM,MAAM,IAAI;AAAA,QAAG;AAAA,MAE/D,IAAI,KAAK,SAAS,QAAQ;AAAA,QACzB,IAAI,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AAAA,UAAG,OAAO;AAAA,QAC9D;AAAA,MACD;AAAA,MACA,WAAW,UAAU,MAAM,KAAK,QAAQ,MAAM,MAAM,KAAK,QAAQ,GAAG;AAAA,QACnE,IAAI,MAAM,KAAK,MAAM,SAAS,QAAQ,KAAK,QAAQ,QAAQ,CAAC,GAAG;AAAA,UAC9D,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO;AAAA;AAAA,EAIA,MAAM,CACb,MACA,MACA,MACU;AAAA,IACV,IAAI,KAAK,QAAQ,WAAW;AAAA,MAC3B,MAAM,IAAI,UACT,QAAQ,KAAK,QAAQ,gEACtB;AAAA,IACD;AAAA,IACA,OAAQ,KAAK,KAAmC,KAAK,GAAG,MAAM;AAAA;AAAA,OAIjD,QAAO,CACpB,MACA,MACA,UACkB;AAAA,IAClB,MAAM,UAAU,KAAK,UAAU,IAAI,QAAQ;AAAA,IAC3C,IAAI,YAAY;AAAA,MAAW,OAAO,CAAC;AAAA,IAEnC,IAAI,QAAQ,SAAS,aAAa;AAAA,MACjC,MAAM,KAAK,QAAQ,MAAM,QAAQ,OAAO,GAAG,KAAK,QAAQ,UAAU;AAAA,MAClE,OAAO,OAAO,OACX,CAAC,IACD,CAAC,EAAE,QAAQ,EAAE,MAAM,QAAQ,SAAS,GAAG,GAAG,MAAM,KAAK,CAAC;AAAA,IAC1D;AAAA,IAEA,QAAQ,MAAM,KAAK,MAAM,aAAa,KAAK,QAAQ,QAAQ,GACzD,OAAO,CAAC,WAAW,OAAO,QAAQ,SAAS,MAAM,CAAC,EAClD,IAAI,CAAC,YAAY;AAAA,MACjB,QAAQ,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG;AAAA,MAC3C,MAAM;AAAA,IACP,EAAE;AAAA;AAEL;AAGA,SAAS,OAAO,CAAC,MAAY,OAAe,MAA6B;AAAA,EACxE,IAAI,KAAK,SAAS,MAAM;AAAA,IAEvB,MAAM,IAAI,UACT,QAAQ,cAAc,oCACvB;AAAA,EACD;AAAA,EACA,MAAM,QAAQ,KAAK,KAAK;AAAA,EACxB,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,IAAI,OAAO,UAAU,UAAU;AAAA,IAC9B,MAAM,IAAI,UACT,QAAQ,cAAc,2BAA2B,UAAU,YAAY,oDAAoD,6CAC5H;AAAA,EACD;AAAA,EACA,OAAO;AAAA;;;AC7IR,IAAM,oBAAoB;AAE1B,IAAM,WAAW;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAoBO,SAAS,WAAkC,CACjD,SACiB;AAAA,EACjB,MAAM,QAAQ;AAAA,EACd,MAAM,QAAQ,WAAW,QAAQ,KAAK;AAAA,EACtC,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,IAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAAG;AAAA,IAChD,MAAM,IAAI,UAAU,GAAG,4CAA4C;AAAA,EACpE;AAAA,EACA,MAAM,MAAM,QAAQ;AAAA,EACpB,WAAW,UAAU,UAAU;AAAA,IAC9B,IAAI,OAAO,MAAM,YAAY,YAAY;AAAA,MACxC,MAAM,IAAI,UAAU,GAAG,gBAAgB,mBAAmB;AAAA,IAC3D;AAAA,EACD;AAAA,EACA,MAAM,QAAQ,eAAe,QAAQ,KAAK;AAAA,EAE1C,MAAM,QAAQ,OACb,SACA,YACA,QACA,YACsB;AAAA,IAEtB,IAAI,YAAY,QAAQ,YAAY;AAAA,MAAW,OAAO;AAAA,IAEtD,MAAM,OAAO,SAAS,OAAO,QAAQ,KAAK;AAAA,IAC1C,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM,KAAK;AAAA,IAC3C,IAAI,CAAC,KAAK,UAAU,IAAI,UAAU,KAAK,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AAAA,MACzE,MAAM,IAAI,UACT,SAAS,oDAAoD,KAAK,MACnE;AAAA,IACD;AAAA,IAEA,OAAO,IAAI,KACV,OACA,OACA,UACA,SAAS,KACT,GAAG,KAAK,QAAQ,YACjB,EAAE,MACD,UAAU,OAAO,SAAS,KAAK,GAC/B,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,MAAM,KAAK,KAAK,GAC5D,YACA,CACD;AAAA;AAAA,EAGD,MAAM,OAAO,OACZ,SACA,YACA,UACA,YAKiC;AAAA,IACjC,MAAM,QAAQ,WAAU,SAAS,OAAO,MAAM;AAAA,IAC9C,MAAM,QAAQ,SAAS,SAAS;AAAA,IAChC,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAAA,MAChD,MAAM,IAAI,UACT,uDACD;AAAA,IACD;AAAA,IAEA,IAAI,YAAY,QAAQ,YAAY,WAAW;AAAA,MAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,YAAY,KAAK;AAAA,IACtC;AAAA,IAEA,IAAI,OAAO,aAAa,UAAU;AAAA,MACjC,MAAM,IAAI,UAAU,oDAAoD;AAAA,IACzE;AAAA,IACA,MAAM,OAAO,OAAO,OAAO,UAAU,MAAM;AAAA,IAC3C,IAAI,CAAC,KAAK,UAAU,IAAI,UAAU,KAAK,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AAAA,MACzE,MAAM,IAAI,UACT,UAAU,oDAAoD,KAAK,MACpE;AAAA,IACD;AAAA,IAEA,MAAM,MAAM,MAAM,IAAI,QACrB,OACA,OACA,UACA,SAAS,KACT,UAAU,OAAO,SAAS,MAAM,GAChC,GAAG,KAAK,QAAQ,YACjB,EAAE,QAAQ,KAAK,MAAM,UAAU;AAAA,IAE/B,MAAM,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,UAAU,QAAQ,KAAK,KAAK;AAAA,IACxE,MAAM,QAAQ,KAAK,MAAM,GAAG,KAAK;AAAA,IACjC,MAAM,OAAO,MAAM,GAAG,EAAE;AAAA,IACxB,OAAO;AAAA,MACN;AAAA,MACA,YAAY,KAAK,SAAS,SAAS,SAAS,YAAY,OAAO;AAAA,IAChE;AAAA;AAAA,EAGD,MAAM,SACL,CAAC,cACD,OAAO,QAAiB,UAAkB,YAAqB;AAAA,IAC9D,MAAM,QAAQ,QAAQ,OAAO,QAAQ,UAAU,SAAS,SAAS;AAAA,IACjE,MAAM,MAAM,MACX,cAAc,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,CAC9D;AAAA;AAAA,EAGF,OAAO,OAAO,OAAO;AAAA,IACpB,OAAO,QAAQ;AAAA,IACf,KAAK;AAAA,IACL;AAAA,IACA,OAAO,OAAO,OAAO;AAAA,IACrB,QAAQ,OAAO,QAAQ;AAAA,EACxB,CAAC;AAAA;",
12
+ "mappings": "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",
13
13
  "debugId": "B13C4A414094D54564756E2164756E21",
14
14
  "names": []
15
15
  }
@@ -290,37 +290,37 @@ export type ConfigOf<M> = M extends PermissionModel<infer C> ? C : never;
290
290
  type Refusal<Text extends string, Expected> = {
291
291
  readonly [K in Text]: Expected;
292
292
  };
293
- type CheckRelation<C extends ModelConfig, Def> = Def extends FromField<string, infer Sub> ? Sub extends UserTypeOf<C> | ObjectTypeOf<C> ? unknown : {
294
- readonly subject: Refusal<`"${Sub}" is not a subject type; name one of`, UserTypeOf<C> | ObjectTypeOf<C>>;
295
- } : {
296
- readonly [I in keyof Def]: Def[I] extends SubjectRefOf<UserTypeOf<C>, TypesOf<C>> ? unknown : Refusal<`"${Def[I] & string}" is not a subject type or a subject set; name one of`, SubjectRefOf<UserTypeOf<C>, TypesOf<C>>>;
297
- };
298
- type CheckRules<Ts, T, Rules> = {
299
- readonly [I in keyof Rules]: Rules[I] extends string ? Rules[I] extends RuleRefOf<Ts, T> ? unknown : Refusal<`"${Rules[I]}" is not a relation, a permission or an arrow of ${T & string}; name one of`, RuleRefOf<Ts, T>> : Rules[I] extends When<infer R, never> ? R extends RuleRefOf<Ts, T> ? unknown : {
300
- readonly rule: Refusal<`"${R}" is not a relation, a permission or an arrow of ${T & string}; name one of`, RuleRefOf<Ts, T>>;
301
- } : unknown;
302
- };
303
- type CheckObjectType<C extends ModelConfig, T> = (TypesOf<C>[T & keyof TypesOf<C>] extends {
304
- readonly relations: infer Rs;
305
- } ? {
306
- readonly relations: {
307
- readonly [R in keyof Rs]: CheckRelation<C, Rs[R]>;
308
- };
309
- } : unknown) & (TypesOf<C>[T & keyof TypesOf<C>] extends {
310
- readonly permissions: infer Ps;
311
- } ? {
312
- readonly permissions: {
313
- readonly [P in keyof Ps]: P extends RelationsOf<TypesOf<C>, T> ? Refusal<`"${P & string}" names a relation and a permission of ${T & string}; rename one`, never> : CheckRules<TypesOf<C>, T, Ps[P]>;
314
- };
315
- } : unknown);
316
293
  /**
317
- * The compile-time checks `defineModel` intersects into its parameter — the
318
- * `C & Checked<C>` pattern of `janus()`: a wrong value is unassignable **on
319
- * the offending key**, and the reason is the type the compiler prints.
294
+ * The same names, spelled out: a union the compiler prints as its members —
295
+ * `"patient" | "staff" | "team#member"` — rather than as the alias that
296
+ * computed it, so an error lists what the name could have been.
320
297
  */
321
- export type CheckedModel<C extends ModelConfig> = {
322
- readonly types: {
323
- readonly [T in keyof TypesOf<C>]: CheckObjectType<C, T>;
298
+ type Spelled<U> = [U] extends [infer V extends string] ? {
299
+ [K in V]: K;
300
+ }[V] : never;
301
+ /**
302
+ * What `defineModel` offers and accepts for each object type, given the
303
+ * subject types `S` and every object type `Ts`: the constraint of its `types`.
304
+ *
305
+ * **A constraint, so that an editor completes it.** The names a relation, a
306
+ * rule, a `fromField` or a `when` may take are unions of literals here, and an
307
+ * editor reads a type parameter's constraint to offer them — `'patient'`,
308
+ * `'team#member'`, `'team->view'`. A check intersected into the parameter
309
+ * instead (`C & Checked<C>`) refuses the same mistakes, but meets the literal
310
+ * being typed and completes nothing: measured with the language service.
311
+ *
312
+ * A wrong name is unassignable **on that name** — on the whole `fromField(…)`
313
+ * or `when(…)` call for those two — and the error lists the ones it could
314
+ * have been, with "Did you mean" when one is close.
315
+ */
316
+ export type ModelTypesOf<S extends string, Ts> = {
317
+ readonly [T in keyof Ts]: {
318
+ readonly relations?: {
319
+ readonly [name: string]: readonly Spelled<SubjectRefOf<S, Ts>>[] | FromField<string, Spelled<S | (keyof Ts & string)>>;
320
+ };
321
+ readonly permissions?: {
322
+ readonly [P in PermissionsOf<Ts, T>]: P extends RelationsOf<Ts, T> ? Refusal<`"${P}" names a relation and a permission of ${T & string}; rename one`, never> : readonly (Spelled<RuleRefOf<Ts, T>> | When<Spelled<RuleRefOf<Ts, T>>, never>)[];
323
+ };
324
324
  };
325
325
  };
326
326
  /** A model, checked and resolved. What `permissions()` will take. */
@@ -361,7 +361,13 @@ export interface PermissionModel<C extends ModelConfig = ModelConfig> {
361
361
  * camelCase, an object type named like a user type, a permission that reaches
362
362
  * itself without crossing a relation — which no data could ever end.
363
363
  */
364
- export declare function defineModel<const C extends ModelConfig>(config: C & CheckedModel<C>): PermissionModel<C>;
364
+ export declare function defineModel<const Subjects extends readonly string[], const Ts extends ModelConfig['types'] & ModelTypesOf<Subjects[number], Ts>>(config: {
365
+ readonly subjects: Subjects;
366
+ readonly types: Ts;
367
+ }): PermissionModel<{
368
+ readonly subjects: Subjects;
369
+ readonly types: Ts;
370
+ }>;
365
371
  /** The resolved form of a model this module defined. Internal. */
366
372
  export declare function resolvedOf(model: object): ResolvedModel;
367
373
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/permissions/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/permissions/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,WAAW,CAAC;AAI7D;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAEvE;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS,CACzB,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,MAAM;IAE/B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB,CACnC,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,MAAM,CAC9B,SAAQ,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,SAAS,CACxB,KAAK,CAAC,KAAK,SAAS,MAAM,EAC1B,KAAK,CAAC,OAAO,SAAS,MAAM,EAC3B,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7D,wBAAgB,SAAS,CACxB,KAAK,CAAC,KAAK,SAAS,MAAM,EAC1B,KAAK,CAAC,OAAO,SAAS,MAAM,EAE5B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAavC;;;;;;;GAOG;AACH,MAAM,WAAW,IAAI,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,KAAK;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrC;AAED,wBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,EAAE,GAAG,EAClD,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GACzB,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAEjB;AAID;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;KAAE,CAAC;IAC9D,iDAAiD;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAAA;KAAE,CAAC;CACvE;AAED,MAAM,WAAW,WAAW;IAC3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAA;KAAE,CAAC;CAC3D;AAID,KAAK,OAAO,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAEjD,yCAAyC;AACzC,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAE5E,kDAAkD;AAClD,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,KAAK,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,GACzC,EAAE,CAAC,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5C,MAAM,CAAC,GAAG,MAAM,GAChB,KAAK,GACN,KAAK,CAAC;AAET,KAAK,aAAa,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,GAC3C,EAAE,CAAC,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;CAAE,GAC9C,MAAM,CAAC,GAAG,MAAM,GAChB,KAAK,GACN,KAAK,CAAC;AAET,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhE,KAAK,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,GAC9C,EAAE,CAAC,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7C,CAAC,SAAS,MAAM,EAAE,GACjB,EAAE,CAAC,CAAC,CAAC,GACL,KAAK,GACN,KAAK,GACN,KAAK,CAAC;AAET,sFAAsF;AACtF,KAAK,iBAAiB,CAAC,EAAE,EAAE,CAAC,IAAI;KAC9B,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,GACjE,KAAK,GACL,CAAC;CACJ,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAEtB;;;;GAIG;AACH,KAAK,YAAY,CAAC,EAAE,IAAI;KACtB,CAAC,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,GAAG,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;CAC5D,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;AAErB,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,IACnC,CAAC,GACD,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GACnB,YAAY,CAAC,EAAE,CAAC,CAAC;AAEpB,+EAA+E;AAC/E,KAAK,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IACzB,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,GACzD,GAAG,GACH,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACnD,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,EAAE,GAC9B,KAAK,GACL,CAAC,GACF,KAAK,CAAC;AAEX,iDAAiD;AACjD,KAAK,WAAW,CAAC,EAAE,EAAE,OAAO,IAC3B,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,MAAM,CAAC,GACjC,CAAC,SAAS,MAAM,GACf,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GACrC,CAAC,GACD,KAAK,GACN,KAAK,GACN,KAAK,CAAC;AAEV,KAAK,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI;KACxB,CAAC,IAAI,MAAM,EAAE,GAAG,CAAC,SAAS,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACrD,CAAC,MAAM,EAAE,CAAC,CAAC;AAEZ,4EAA4E;AAC5E,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC,IAAI;KACrB,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAChE,KAAK,GACL,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAC1C,GAAG,CAAC,KAAK,WAAW,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAClD,KAAK;CACT,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAEtB,yCAAyC;AACzC,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzD,kFAAkF;AAClF,MAAM,MAAM,WAAW,CACtB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IACtB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3B,gFAAgF;AAChF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;KACvE,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAC/C,OAAO,CAAC,CAAC,CAAC,EACV,CAAC,EACD,CAAC,CACD,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,GACjC,CAAC,GACD,KAAK;CACR,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB,GAAG;IAAE,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI;CAAE,CAAC;AAEtD,+DAA+D;AAC/D,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACpB;AAID,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAC7B,CAAC,SAAS,OAAO,GACd,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAClB,KAAK,CACR,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,IAAI,GACtC,CAAC,GACD,KAAK,CAAC;AAET,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEhE,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAClC,CAAC,GACD,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,GAC7B,CAAC,GACD,KAAK,CAAC;AAEV,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,GAChE,eAAe,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GACpD,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAEnC;;;;GAIG;AACH,KAAK,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,GAC/D,CAAC,SAAS,MAAM,GACf,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,GACvB,KAAK,GACL,EAAE,CAAC,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C,CAAC,SAAS,MAAM,EAAE,GACjB,EAAE,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACjC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAClE,KAAK,GACN,KAAK,GACN,KAAK,GACP,KAAK,GACN,KAAK,CAAC;AAET;;;;GAIG;AACH,MAAM,MAAM,KAAK,CAChB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAC3D,KAAK,GACL,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,CACpB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAC9B,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAChC,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACtC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,GAEtC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACtB,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACxC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3B,mFAAmF;AACnF,KAAK,cAAc,CAClB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAChC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,GACvC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACf,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACvC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnB,KAAK,MAAM,CACV,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACjC,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACpC,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAAC,CAAC;AAE/C,8DAA8D;AAC9D,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,WAAW,IAAI,CACxC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAE3B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,EAC7B,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACvB,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AAItB,oFAAoF;AACpF,KAAK,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAC1B,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD,KAAK,GACL,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,GACxC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,GAC7B,KAAK,CAAC;AAEX,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,GAE9D,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GACvB,eAAe,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GACtD,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAEnC;;;;GAIG;AACH,KAAK,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,GAC/D,CAAC,SAAS,MAAM,GACf,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,GACvB,KAAK,GACL,CAAC,SAAS,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAC3B,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GACvB,EAAE,CAAC,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/C,CAAC,SAAS,MAAM,EAAE,GACjB,EAAE,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACjC,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GACnD,KAAK,GACN,KAAK,GACN,KAAK,GACR,KAAK,GACN,KAAK,CAAC;AAET,gGAAgG;AAChG,MAAM,MAAM,SAAS,CACpB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAE7C,+DAA+D;AAC/D,KAAK,SAAS,CACb,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IACb,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACrC,OAAO,GACP,OAAO,CACP,uBAAuB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,gCAAgC,EACzE,KAAK,CACL,CAAC;AAEJ,8DAA8D;AAC9D,MAAM,WAAW,QAAQ;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,yCAAyC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,gCAAgC;AAChC,KAAK,QAAQ,CACZ,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,MAAM,IAEhB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GACjC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,GACvB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,GAC7C,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,GACxB,KAAK,CAAC;AAEX;;;;;GAKG;AACH,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,WAAW,IAAI,CACzC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAE3B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,EAC7B,UAAU,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAClC,IAAI,EAAE,CAAC,EACP,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACzB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAEjC,oFAAoF;AACpF,MAAM,MAAM,WAAW,CACtB,CAAC,SAAS,WAAW,EACrB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IACtB,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IACvE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACzD,CAAC,SAAS,GAAG,MAAM,OAAO,IAAI,MAAM,WAAW,EAAE,GAChD;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAC/B,GACA;IAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1C,KAAK,CAAC;AAEV,2DAA2D;AAC3D,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI,CAC1C,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,EACzB,CAAC,SAAS,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAE3B,MAAM,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EACjD,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,oCAAoC;AACpC,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,WAAW;IACjD,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CAC1B;AAED,kDAAkD;AAClD,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAIzE,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI;IAC7C,QAAQ,EAAE,CAAC,IAAI,IAAI,GAAG,QAAQ;CAC9B,CAAC;AAEF;;;;GAIG;AACH,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,GACnD;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAAC,CAAC,CAAC,GAClB,KAAK,CAAC;AAET;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,IAAI;IAChD,QAAQ,EAAE,CAAC,IAAI,MAAM,EAAE,GAAG;QACzB,QAAQ,CAAC,SAAS,CAAC,EAAE;YACpB,QAAQ,EAAE,IAAI,EAAE,MAAM,GACnB,SAAS,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GACvC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;SACvD,CAAC;QACF,QAAQ,CAAC,WAAW,CAAC,EAAE;YACtB,QAAQ,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,GAC/D,OAAO,CACP,IAAI,CAAC,0CAA0C,CAAC,GAAG,MAAM,cAAc,EACvE,KAAK,CACL,GACA,SAAS,CACP,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GACzB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CACxC,EAAE;SACL,CAAC;KACF;CACD,CAAC;AAIF,qEAAqE;AACrE,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACnE,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,0CAA0C;IAC1C,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;CACvB;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CAC1B,KAAK,CAAC,QAAQ,SAAS,SAAS,MAAM,EAAE,EACxC,KAAK,CAAC,EAAE,SAAS,WAAW,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EACzE,MAAM,EAAE;IACT,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;CACnB,GAAG,eAAe,CAAC;IAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAA;CAAE,CAAC,CAAC;AAczE,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAQvD"}
@@ -51,7 +51,11 @@ await access.can(grace, 'view', team); // false
51
51
  ## The model
52
52
 
53
53
  ```ts
54
- function defineModel<const C extends ModelConfig>(config: C & CheckedModel<C>): PermissionModel<C>;
54
+ function defineModel<
55
+ const Subjects extends readonly string[], // auth.types
56
+ const Ts extends ModelConfig['types'] & ModelTypesOf<Subjects[number], Ts>, // what your editor completes
57
+ >(config: { readonly subjects: Subjects; readonly types: Ts }): PermissionModel<{ readonly subjects: Subjects; readonly types: Ts }>;
58
+ // ModelTypesOf<S, Ts>: the names each relation and rule of each type may take
55
59
 
56
60
  interface ModelConfig {
57
61
  readonly subjects: readonly string[]; // pass auth.types
@@ -89,15 +93,23 @@ like a permission.
89
93
 
90
94
  A relation naming a type that does not exist, a rule naming nothing, an arrow
91
95
  to a permission its target lacks, a name that is both a relation and a
92
- permission: each is a compile error **on the offending key**, and the error
93
- lists what you could have written.
96
+ permission: each is a compile error **on the offending name** — on the whole
97
+ `fromField(…)` or `when(…)` call for those two. Except for that last one,
98
+ which says to rename one, the error lists what you could have written, with
99
+ "Did you mean" when one is close.
100
+
101
+ Your editor offers those names as you type — subject types and subject sets
102
+ in a relation, subject types in `fromField`, relations, permissions and arrows
103
+ in a rule and in `when` — because `defineModel` types its `types` with a
104
+ constraint an editor reads, not only with a check. A spec asks the TypeScript
105
+ language service what it completes, so a change that loses it fails.
94
106
 
95
107
  ```ts
96
108
  defineModel({
97
109
  subjects: ['staff'],
98
110
  types: {
99
111
  team: {
100
- // @ts-expect-error — '"staf" is not a subject type or a subject set; name one of' …
112
+ // @ts-expect-error — Type '"staf"' is not assignable to type '"staff" | "team" | "team#member"'. Did you mean '"staff"'?
101
113
  relations: { member: ['staf'] },
102
114
  },
103
115
  },
@@ -43,6 +43,9 @@ either finds this row.
43
43
  | **credential** | What a caller presents to prove who they are: a login and a password at sign-in (`CredentialError`, `CREDENTIALS_INVALID`), or a token on a request — always written *session credential* | |
44
44
  | **password policy** | The rules a new password must meet: `minLength`, `normalize` | the model |
45
45
  | **session** | A signed-in period, carried by a **session token** | |
46
+ | **lapsed**, **revoked**, **renewed** | A session past its `expiresAt`; one ended by a sign-out or a password reset; one whose `expiresAt` moved in passing (`renewAfter`) | "expired" — kept for `TOKEN_EXPIRED`, a one-time token |
47
+ | **anonymous** | A request that presents no session credential, or one that authenticates nobody: `authenticate` answers `null` | "unauthenticated", "guest", "logged out" |
48
+ | **bearer client** | A client that sends its session token as `Authorization: Bearer` rather than in a cookie | |
46
49
  | **one-time token** | A single-use token sent by e-mail, for verification or a password reset | "code" — `code` is an error's code |
47
50
  | **token** | Never alone in prose: a *session token* or a *one-time token*. The `tokens` store and the `TOKEN_*` codes are one-time tokens only | |
48
51
  | **e-mail flow** | `verifyEmail` or `resetPassword`: send a one-time token, then confirm it | |
@@ -64,6 +67,7 @@ either finds this row.
64
67
  | **arrow** | A rule that follows a relation to another object's permission: `'team->view'` | |
65
68
  | **condition** | A predicate on a rule, written with `when`, run on the `ctx` passed to `can()` and `list()` | |
66
69
  | **tuple** | One stored fact — object, relation, subject: `document:d1#viewer@user:u1` | "grant", "ACL entry" |
70
+ | **guarded route** | A route that runs only when its subject holds a permission on the object it serves — `permission()` in `@nxgt/janus-hono` | |
67
71
 
68
72
  ### Stores
69
73
 
@@ -72,6 +76,7 @@ either finds this row.
72
76
  | **store** | Where a side keeps its data, behind a port. The **identity stores** are `users`, `sessions` and `tokens`; the **relation store** holds the tuples | "database", "repository" |
73
77
  | **port** | The interface a store implements: `JanusStores` for the identity stores — named after the package, not the side — and `RelationStore` | "driver" |
74
78
  | **adapter** | A package implementing the ports for one database: `@nxgt/janus-mongo` | "plugin", "connector" |
79
+ | **integration** | A package fitting Janus into one web framework: `@nxgt/janus-hono`. It implements no port | "plugin", "adapter" |
75
80
 
76
81
  ### Answers
77
82
 
package/docs/roadmap.md CHANGED
@@ -5,7 +5,10 @@ dates here, and the version something shipped in is the only number.
5
5
 
6
6
  ## Now
7
7
 
8
- Nothing in progress.
8
+ - **A Hono integration** — in a package of its own, `@nxgt/janus-hono`:
9
+ the session middleware, the cookie, a route guarded by a permission, the
10
+ instances on the context, and every error as its status. Built, not yet
11
+ published.
9
12
 
10
13
  ## Next
11
14
 
@@ -60,6 +63,11 @@ Nothing yet.
60
63
 
61
64
  The first public release, v0.1.
62
65
 
66
+ - **`defineModel` completed by your editor** — subject types and subject sets
67
+ in a relation, subject types in `fromField`, relations, permissions and
68
+ arrows in a rule and in `when`; a wrong name's error lists the names it
69
+ could have been. — v0.1.2
70
+
63
71
  - **The model decides what a stored tuple grants** — `can()` and `list()` follow
64
72
  only the holders a relation admits, as `grant()` writes only those: a tuple
65
73
  stored past `grant()`, by an older model or by hand, grants nothing. — v0.1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxgt/janus",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Embeddable, type-safe identities and permissions: bring your own database",
5
5
  "license": "MIT",
6
6
  "type": "module",