@plantops/contracts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/audit.d.ts +149 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +87 -0
- package/dist/bindings.d.ts +125 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +40 -0
- package/dist/clients.d.ts +240 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +49 -0
- package/dist/constants.d.ts +91 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +92 -0
- package/dist/entitlements.d.ts +135 -0
- package/dist/entitlements.d.ts.map +1 -0
- package/dist/entitlements.js +43 -0
- package/dist/errors.d.ts +68 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +83 -0
- package/dist/grants.d.ts +70 -0
- package/dist/grants.d.ts.map +1 -0
- package/dist/grants.js +13 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/jwt.d.ts +155 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +49 -0
- package/dist/lib/contracts.d.ts +2 -0
- package/dist/lib/contracts.d.ts.map +1 -0
- package/dist/lib/contracts.js +3 -0
- package/dist/manifest.d.ts +136 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +22 -0
- package/dist/nav.d.ts +53 -0
- package/dist/nav.d.ts.map +1 -0
- package/dist/nav.js +25 -0
- package/dist/pagination.d.ts +28 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +27 -0
- package/dist/registry.d.ts +183 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +24 -0
- package/dist/roles.d.ts +215 -0
- package/dist/roles.d.ts.map +1 -0
- package/dist/roles.js +45 -0
- package/dist/scopes.d.ts +220 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +108 -0
- package/dist/service-accounts.d.ts +81 -0
- package/dist/service-accounts.d.ts.map +1 -0
- package/dist/service-accounts.js +35 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/type-assertions.d.ts +18 -0
- package/dist/type-assertions.d.ts.map +1 -0
- package/dist/type-assertions.js +8 -0
- package/dist/users.d.ts +364 -0
- package/dist/users.d.ts.map +1 -0
- package/dist/users.js +134 -0
- package/package.json +39 -0
package/dist/scopes.d.ts
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope-tree contract — the WHERE of the access equation (Doc 01 §3.5,
|
|
3
|
+
* Doc 06 §6).
|
|
4
|
+
*
|
|
5
|
+
* A client's `scope_node` tree is the org structure a grant is anchored to:
|
|
6
|
+
* Group → Plant → Department → Gate. A role bound at a plant covers every
|
|
7
|
+
* department and gate beneath it, and that coverage is a prefix test on
|
|
8
|
+
* {@link ScopeNodeDTO.path} rather than a recursive walk (Doc 07 §7).
|
|
9
|
+
*
|
|
10
|
+
* ## Why `path` is published at all
|
|
11
|
+
*
|
|
12
|
+
* It is an implementation detail of coverage, and a consumer that tried to
|
|
13
|
+
* *parse* it would be doing the resolver's job badly. It is on the wire because
|
|
14
|
+
* the properties the labels guarantee are worth being able to check: the labels
|
|
15
|
+
* are `n_` + the node's UUID hex and never the display `name` (Doc 01 §3.5), so
|
|
16
|
+
* a rename cannot rewrite a path — and therefore cannot invalidate every grant
|
|
17
|
+
* beneath it. A UI that shows an operator *why* a move is more disruptive than a
|
|
18
|
+
* rename needs the value; nothing else should read it.
|
|
19
|
+
*
|
|
20
|
+
* Field naming is snake_case, matching every other published shape here.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* A node's kind — a **tenant-supplied display label**, not a closed set
|
|
24
|
+
* (ADR 0002 §6, migration 0021).
|
|
25
|
+
*
|
|
26
|
+
* It was a Postgres enum of `group | plant | department | gate` until a second
|
|
27
|
+
* vertical arrived wanting Company → Unit → Branch → Shed. The enum's cost
|
|
28
|
+
* scales with how many industries this IAM serves, and Postgres cannot drop an
|
|
29
|
+
* enum label, so the vocabulary became the tenant's.
|
|
30
|
+
*
|
|
31
|
+
* What did **not** change: the tree's *shape* is not constrained by kind —
|
|
32
|
+
* nothing stops a gate under a group, and nothing should, since tenants
|
|
33
|
+
* organise themselves differently. The kind is what a UI renders an icon from
|
|
34
|
+
* and what an operator reasons about; coverage is decided by the path alone.
|
|
35
|
+
*
|
|
36
|
+
* Consumers must treat this as free text: match it case-sensitively if they
|
|
37
|
+
* must, but always render an unknown label rather than dropping it. The only
|
|
38
|
+
* constraint the database applies is non-blank and at most 64 characters.
|
|
39
|
+
*/
|
|
40
|
+
export type ScopeNodeKind = string;
|
|
41
|
+
/** The longest a kind label may be, matching migration 0021's check constraint. */
|
|
42
|
+
export declare const SCOPE_NODE_KIND_MAX_LENGTH = 64;
|
|
43
|
+
/**
|
|
44
|
+
* The vocabulary the IAM suggests when a tenant has expressed no preference —
|
|
45
|
+
* the four labels the dropped enum carried.
|
|
46
|
+
*
|
|
47
|
+
* **Suggested, never enforced.** Nothing validates a kind against this list: a
|
|
48
|
+
* tenant typing a label it does not contain is modelling itself honestly, the
|
|
49
|
+
* same argument the scope-tree editor already makes about tree shape. A client
|
|
50
|
+
* that wants its own vocabulary sets `scope_node_kinds` in `client.config`;
|
|
51
|
+
* this is the fallback when it has not.
|
|
52
|
+
*
|
|
53
|
+
* Emphatically **not** a metering key. A tenant controls these values, so
|
|
54
|
+
* counting nodes by kind would be a billing quantity the customer can rename
|
|
55
|
+
* away — see migration 0020 and ADR 0002 §6.3, which meter `billable_site`
|
|
56
|
+
* instead.
|
|
57
|
+
*/
|
|
58
|
+
export declare const SUGGESTED_SCOPE_NODE_KINDS: readonly string[];
|
|
59
|
+
/** Where a client's own suggested vocabulary lives inside `ClientDTO.config`. */
|
|
60
|
+
export declare const SCOPE_NODE_KINDS_CONFIG_KEY = "scope_node_kinds";
|
|
61
|
+
/**
|
|
62
|
+
* How many labels a tenant may put in that list.
|
|
63
|
+
*
|
|
64
|
+
* The list is a *picker*, not a taxonomy: it is rendered as a dropdown on the
|
|
65
|
+
* add-node form and its whole job is to make the common answer one click away.
|
|
66
|
+
* A vocabulary of four hundred labels is not a vocabulary, it is a search
|
|
67
|
+
* problem, and it would arrive in every tree response for every tenant.
|
|
68
|
+
*
|
|
69
|
+
* Thirty-two is the same bound as {@link MAX_SCOPE_TREE_DEPTH} and for the
|
|
70
|
+
* same reason — eight times the deepest structure the spec describes, so it
|
|
71
|
+
* bounds the pathological case without being reachable by an organisation
|
|
72
|
+
* modelling itself honestly.
|
|
73
|
+
*/
|
|
74
|
+
export declare const MAX_SCOPE_NODE_KINDS = 32;
|
|
75
|
+
/**
|
|
76
|
+
* The kind vocabulary for a tenant, from its `client.config`.
|
|
77
|
+
*
|
|
78
|
+
* One implementation, used by the API when it answers `GET /iam/scopes` and
|
|
79
|
+
* available to anyone else who holds a config. The alternative — every caller
|
|
80
|
+
* deciding for itself what an absent, empty or malformed key means — is how
|
|
81
|
+
* two screens end up disagreeing about a tenant’s own vocabulary.
|
|
82
|
+
*
|
|
83
|
+
* Tolerant on read, because `config` is free-form `jsonb` that predates any
|
|
84
|
+
* validation of this key: rows written before {@link MAX_SCOPE_NODE_KINDS}
|
|
85
|
+
* existed can hold anything at all. Blank and non-string entries are dropped
|
|
86
|
+
* and duplicates collapse, so a half-right list degrades to the good part of
|
|
87
|
+
* itself rather than to an error on a screen a tenant cannot fix.
|
|
88
|
+
*
|
|
89
|
+
* Never returns empty: an empty picker is strictly worse than the suggested
|
|
90
|
+
* four, since a tenant with no vocabulary would be unable to name a node.
|
|
91
|
+
*/
|
|
92
|
+
export declare function scopeNodeKindsFrom(config: Record<string, unknown> | null | undefined): ScopeNodeKind[];
|
|
93
|
+
/**
|
|
94
|
+
* How deep a scope tree may go, root included.
|
|
95
|
+
*
|
|
96
|
+
* Not a database constraint and not a spec requirement — Doc 01 §3.5 bounds
|
|
97
|
+
* nothing. It is here because `path` is a materialized column on every
|
|
98
|
+
* descendant and every label costs 34 characters: an unbounded tree is an
|
|
99
|
+
* unbounded write amplification on a move and an unbounded GiST index entry. A
|
|
100
|
+
* limit of 32 is eight times the deepest structure the spec describes
|
|
101
|
+
* (Group → Plant → Department → Gate), so it bounds the pathological case
|
|
102
|
+
* without being reachable by an organisation that is modelling itself honestly.
|
|
103
|
+
*/
|
|
104
|
+
export declare const MAX_SCOPE_TREE_DEPTH = 32;
|
|
105
|
+
/**
|
|
106
|
+
* One node of a client's org tree, with its subtree inline.
|
|
107
|
+
*
|
|
108
|
+
* `children` is always present — empty on a leaf — so a consumer walking the
|
|
109
|
+
* tree needs no null check at the bottom of it. Same shape as
|
|
110
|
+
* {@link NavNodeCatalogDTO}, for the same reason.
|
|
111
|
+
*/
|
|
112
|
+
export interface ScopeNodeDTO {
|
|
113
|
+
id: string;
|
|
114
|
+
client_id: string;
|
|
115
|
+
/** `null` on a root. A client normally has exactly one (Doc 02 §3 step 3). */
|
|
116
|
+
parent_id: string | null;
|
|
117
|
+
kind: ScopeNodeKind;
|
|
118
|
+
/** Display only. Never appears in {@link ScopeNodeDTO.path}. */
|
|
119
|
+
name: string;
|
|
120
|
+
/**
|
|
121
|
+
* The materialized ltree path, e.g. `n_9f2c….n_4a1b…`. Every label is
|
|
122
|
+
* `n_` + a node id's UUID hex (Doc 01 §3.5) — a display name never reaches it.
|
|
123
|
+
*/
|
|
124
|
+
path: string;
|
|
125
|
+
/** Labels in {@link ScopeNodeDTO.path}: 1 for a root. `nlevel(path)`. */
|
|
126
|
+
depth: number;
|
|
127
|
+
/** Free-form per-node data (Doc 01 §3.5). Opaque to the IAM. */
|
|
128
|
+
metadata: Record<string, unknown>;
|
|
129
|
+
/**
|
|
130
|
+
* The site meter (Doc 11 §10.1, migration 0020). Read-only on this surface:
|
|
131
|
+
* the tenant cannot write it, and the platform tier marks it through
|
|
132
|
+
* `PATCH /iam/clients/:id/scopes/:scopeId/billable-site`.
|
|
133
|
+
*/
|
|
134
|
+
billable_site: boolean;
|
|
135
|
+
/** ISO-8601. */
|
|
136
|
+
created_at: string;
|
|
137
|
+
updated_at: string;
|
|
138
|
+
children: ScopeNodeDTO[];
|
|
139
|
+
}
|
|
140
|
+
/** `GET /iam/scopes` → the caller's whole tree (Doc 06 §6). */
|
|
141
|
+
export interface ScopeTreeResponse {
|
|
142
|
+
/** The caller's tenant, from the token — never from a query parameter. */
|
|
143
|
+
client_id: string;
|
|
144
|
+
/** Roots, ordered by name. Normally one. */
|
|
145
|
+
tree: ScopeNodeDTO[];
|
|
146
|
+
/**
|
|
147
|
+
* The tenant’s own kind vocabulary, already resolved (ADR 0002 §6, #78).
|
|
148
|
+
*
|
|
149
|
+
* Served here rather than read from `client.config` by the caller, for two
|
|
150
|
+
* reasons. There is no tenant-facing route that returns a client’s config —
|
|
151
|
+
* every `/iam/clients` route is `iam.platform.*` — and adding one would hand
|
|
152
|
+
* a tenant console the whole settings blob to get four strings out of it.
|
|
153
|
+
* And the fallback belongs in one place: a consumer left to decide what an
|
|
154
|
+
* absent key means is a consumer that can decide differently from the next.
|
|
155
|
+
*
|
|
156
|
+
* Never empty. Falls back to {@link SUGGESTED_SCOPE_NODE_KINDS} when the
|
|
157
|
+
* tenant has expressed no preference.
|
|
158
|
+
*
|
|
159
|
+
* Suggestions, not rules — the API still accepts any non-blank label, so a
|
|
160
|
+
* consumer must render a node whose kind is absent from this list rather
|
|
161
|
+
* than dropping or rejecting it.
|
|
162
|
+
*/
|
|
163
|
+
kinds: ScopeNodeKind[];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* `POST /iam/scopes` body (Doc 06 §6).
|
|
167
|
+
*
|
|
168
|
+
* `parent_id` is optional only in the case where the tenant has no tree at all:
|
|
169
|
+
* a client's root is normally created with its first administrator (Doc 02 §3
|
|
170
|
+
* step 3), and omitting the parent when a root already exists is a 409 rather
|
|
171
|
+
* than a second root. A tree with two roots would make "everything this admin
|
|
172
|
+
* covers" a question with two answers.
|
|
173
|
+
*/
|
|
174
|
+
export interface CreateScopeNodeRequest {
|
|
175
|
+
parent_id?: string;
|
|
176
|
+
kind: ScopeNodeKind;
|
|
177
|
+
name: string;
|
|
178
|
+
metadata?: Record<string, unknown>;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* `PATCH /iam/scopes/:id` body — rename and/or move (Doc 06 §6).
|
|
182
|
+
*
|
|
183
|
+
* The two are one endpoint because they are one row's edit, but they are not
|
|
184
|
+
* remotely the same operation:
|
|
185
|
+
*
|
|
186
|
+
* - **`name`** touches one column. `path` is untouched, so no grant, no cached
|
|
187
|
+
* resolution and no coverage test is affected (Doc 01 §3.5).
|
|
188
|
+
* - **`parent_id`** rewrites the `path` of the node *and its entire subtree*,
|
|
189
|
+
* which changes what every binding beneath it covers. Doc 04 §7.1 calls this
|
|
190
|
+
* the highest-risk concurrency case in the system and prescribes its ordering
|
|
191
|
+
* exactly: capture affected subjects → rewrite in one statement at
|
|
192
|
+
* `REPEATABLE READ` → commit → only then publish the invalidation.
|
|
193
|
+
*
|
|
194
|
+
* `parent_id` cannot be set to `null`: a node is never detached into a second
|
|
195
|
+
* root, for the reason {@link CreateScopeNodeRequest} gives. Nor may it name the
|
|
196
|
+
* node itself or anything beneath it — that is a cycle, and it would orphan the
|
|
197
|
+
* whole subtree from its own tree.
|
|
198
|
+
*
|
|
199
|
+
* `kind` and `metadata` are both absent, for the same reason from two
|
|
200
|
+
* directions. Doc 06 §6 defines this endpoint as "rename / move", and Doc 10 §4's
|
|
201
|
+
* catalog gives the scope tree exactly four actions —
|
|
202
|
+
* `created`/`moved`/`renamed`/`deleted`. An edit to either field would be a
|
|
203
|
+
* mutation with no honest action to record it under, and recording it as a
|
|
204
|
+
* rename would make the action filter that finds real renames useless. Both are
|
|
205
|
+
* set at creation; changing what a node *is* means creating the right node and
|
|
206
|
+
* moving what belongs under it.
|
|
207
|
+
*/
|
|
208
|
+
export interface UpdateScopeNodeRequest {
|
|
209
|
+
name?: string;
|
|
210
|
+
/**
|
|
211
|
+
* The tenant's own label for what this node is (ADR 0002 §6).
|
|
212
|
+
*
|
|
213
|
+
* Mutable since kind became text: a vocabulary a tenant can set but never
|
|
214
|
+
* correct would be worse than the enum it replaced. Changing it moves
|
|
215
|
+
* nothing and invalidates no grant — coverage is decided by `path`.
|
|
216
|
+
*/
|
|
217
|
+
kind?: string;
|
|
218
|
+
parent_id?: string;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=scopes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../src/scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAKvD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACjD,aAAa,EAAE,CAejB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/scopes.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope-tree contract — the WHERE of the access equation (Doc 01 §3.5,
|
|
3
|
+
* Doc 06 §6).
|
|
4
|
+
*
|
|
5
|
+
* A client's `scope_node` tree is the org structure a grant is anchored to:
|
|
6
|
+
* Group → Plant → Department → Gate. A role bound at a plant covers every
|
|
7
|
+
* department and gate beneath it, and that coverage is a prefix test on
|
|
8
|
+
* {@link ScopeNodeDTO.path} rather than a recursive walk (Doc 07 §7).
|
|
9
|
+
*
|
|
10
|
+
* ## Why `path` is published at all
|
|
11
|
+
*
|
|
12
|
+
* It is an implementation detail of coverage, and a consumer that tried to
|
|
13
|
+
* *parse* it would be doing the resolver's job badly. It is on the wire because
|
|
14
|
+
* the properties the labels guarantee are worth being able to check: the labels
|
|
15
|
+
* are `n_` + the node's UUID hex and never the display `name` (Doc 01 §3.5), so
|
|
16
|
+
* a rename cannot rewrite a path — and therefore cannot invalidate every grant
|
|
17
|
+
* beneath it. A UI that shows an operator *why* a move is more disruptive than a
|
|
18
|
+
* rename needs the value; nothing else should read it.
|
|
19
|
+
*
|
|
20
|
+
* Field naming is snake_case, matching every other published shape here.
|
|
21
|
+
*/
|
|
22
|
+
/** The longest a kind label may be, matching migration 0021's check constraint. */
|
|
23
|
+
export const SCOPE_NODE_KIND_MAX_LENGTH = 64;
|
|
24
|
+
/**
|
|
25
|
+
* The vocabulary the IAM suggests when a tenant has expressed no preference —
|
|
26
|
+
* the four labels the dropped enum carried.
|
|
27
|
+
*
|
|
28
|
+
* **Suggested, never enforced.** Nothing validates a kind against this list: a
|
|
29
|
+
* tenant typing a label it does not contain is modelling itself honestly, the
|
|
30
|
+
* same argument the scope-tree editor already makes about tree shape. A client
|
|
31
|
+
* that wants its own vocabulary sets `scope_node_kinds` in `client.config`;
|
|
32
|
+
* this is the fallback when it has not.
|
|
33
|
+
*
|
|
34
|
+
* Emphatically **not** a metering key. A tenant controls these values, so
|
|
35
|
+
* counting nodes by kind would be a billing quantity the customer can rename
|
|
36
|
+
* away — see migration 0020 and ADR 0002 §6.3, which meter `billable_site`
|
|
37
|
+
* instead.
|
|
38
|
+
*/
|
|
39
|
+
export const SUGGESTED_SCOPE_NODE_KINDS = [
|
|
40
|
+
'group',
|
|
41
|
+
'plant',
|
|
42
|
+
'department',
|
|
43
|
+
'gate',
|
|
44
|
+
];
|
|
45
|
+
/** Where a client's own suggested vocabulary lives inside `ClientDTO.config`. */
|
|
46
|
+
export const SCOPE_NODE_KINDS_CONFIG_KEY = 'scope_node_kinds';
|
|
47
|
+
/**
|
|
48
|
+
* How many labels a tenant may put in that list.
|
|
49
|
+
*
|
|
50
|
+
* The list is a *picker*, not a taxonomy: it is rendered as a dropdown on the
|
|
51
|
+
* add-node form and its whole job is to make the common answer one click away.
|
|
52
|
+
* A vocabulary of four hundred labels is not a vocabulary, it is a search
|
|
53
|
+
* problem, and it would arrive in every tree response for every tenant.
|
|
54
|
+
*
|
|
55
|
+
* Thirty-two is the same bound as {@link MAX_SCOPE_TREE_DEPTH} and for the
|
|
56
|
+
* same reason — eight times the deepest structure the spec describes, so it
|
|
57
|
+
* bounds the pathological case without being reachable by an organisation
|
|
58
|
+
* modelling itself honestly.
|
|
59
|
+
*/
|
|
60
|
+
export const MAX_SCOPE_NODE_KINDS = 32;
|
|
61
|
+
/**
|
|
62
|
+
* The kind vocabulary for a tenant, from its `client.config`.
|
|
63
|
+
*
|
|
64
|
+
* One implementation, used by the API when it answers `GET /iam/scopes` and
|
|
65
|
+
* available to anyone else who holds a config. The alternative — every caller
|
|
66
|
+
* deciding for itself what an absent, empty or malformed key means — is how
|
|
67
|
+
* two screens end up disagreeing about a tenant’s own vocabulary.
|
|
68
|
+
*
|
|
69
|
+
* Tolerant on read, because `config` is free-form `jsonb` that predates any
|
|
70
|
+
* validation of this key: rows written before {@link MAX_SCOPE_NODE_KINDS}
|
|
71
|
+
* existed can hold anything at all. Blank and non-string entries are dropped
|
|
72
|
+
* and duplicates collapse, so a half-right list degrades to the good part of
|
|
73
|
+
* itself rather than to an error on a screen a tenant cannot fix.
|
|
74
|
+
*
|
|
75
|
+
* Never returns empty: an empty picker is strictly worse than the suggested
|
|
76
|
+
* four, since a tenant with no vocabulary would be unable to name a node.
|
|
77
|
+
*/
|
|
78
|
+
export function scopeNodeKindsFrom(config) {
|
|
79
|
+
const raw = config?.[SCOPE_NODE_KINDS_CONFIG_KEY];
|
|
80
|
+
if (!Array.isArray(raw))
|
|
81
|
+
return [...SUGGESTED_SCOPE_NODE_KINDS];
|
|
82
|
+
const kinds = [];
|
|
83
|
+
for (const entry of raw) {
|
|
84
|
+
if (typeof entry !== 'string')
|
|
85
|
+
continue;
|
|
86
|
+
const kind = entry.trim();
|
|
87
|
+
if (kind.length === 0 || kind.length > SCOPE_NODE_KIND_MAX_LENGTH)
|
|
88
|
+
continue;
|
|
89
|
+
if (kinds.includes(kind))
|
|
90
|
+
continue;
|
|
91
|
+
kinds.push(kind);
|
|
92
|
+
if (kinds.length === MAX_SCOPE_NODE_KINDS)
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return kinds.length > 0 ? kinds : [...SUGGESTED_SCOPE_NODE_KINDS];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* How deep a scope tree may go, root included.
|
|
99
|
+
*
|
|
100
|
+
* Not a database constraint and not a spec requirement — Doc 01 §3.5 bounds
|
|
101
|
+
* nothing. It is here because `path` is a materialized column on every
|
|
102
|
+
* descendant and every label costs 34 characters: an unbounded tree is an
|
|
103
|
+
* unbounded write amplification on a move and an unbounded GiST index entry. A
|
|
104
|
+
* limit of 32 is eight times the deepest structure the spec describes
|
|
105
|
+
* (Group → Plant → Department → Gate), so it bounds the pathological case
|
|
106
|
+
* without being reachable by an organisation that is modelling itself honestly.
|
|
107
|
+
*/
|
|
108
|
+
export const MAX_SCOPE_TREE_DEPTH = 32;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-account contract — the machine-identity surface (Doc 06 §10) and the
|
|
3
|
+
* shape of what its client-credentials exchange consumes (Doc 03 §5).
|
|
4
|
+
*
|
|
5
|
+
* ## The secret appears in exactly one type
|
|
6
|
+
*
|
|
7
|
+
* {@link ServiceAccountDTO} is what every read returns and it has no secret in
|
|
8
|
+
* it, because only the hash is stored (Doc 03 §7) — there is nothing a read
|
|
9
|
+
* *could* return. {@link ServiceAccountSecretDTO} is the create and rotate
|
|
10
|
+
* response, and it is the one moment the secret exists outside the caller's
|
|
11
|
+
* hands. Splitting them at the type level is the cheap half of "shown once": a
|
|
12
|
+
* handler that returned the wrong one on a list would not compile.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* A machine identity's lifecycle states (Doc 01 §3.7).
|
|
16
|
+
*
|
|
17
|
+
* Two, not three: there is no `locked`. Locking exists for humans because a
|
|
18
|
+
* person can be told to contact an administrator and come back; a machine has
|
|
19
|
+
* nobody to ask, so the only useful states are "works" and "does not". Revoking
|
|
20
|
+
* fails the *next* `/auth/token` exchange (Doc 03 §5).
|
|
21
|
+
*
|
|
22
|
+
* Spelled here rather than imported from `@plantops/db`, which contracts must
|
|
23
|
+
* not depend on — it has zero dependencies by design (Doc 08 §3). The Postgres
|
|
24
|
+
* enum is the same two values, and `libs/db`'s `entities.spec.ts` asserts the
|
|
25
|
+
* two spellings against each other so they cannot drift into a status the API
|
|
26
|
+
* accepts and the column rejects.
|
|
27
|
+
*/
|
|
28
|
+
export declare const ServiceAccountStatus: {
|
|
29
|
+
readonly ACTIVE: "active";
|
|
30
|
+
readonly REVOKED: "revoked";
|
|
31
|
+
};
|
|
32
|
+
export type ServiceAccountStatus = (typeof ServiceAccountStatus)[keyof typeof ServiceAccountStatus];
|
|
33
|
+
export declare const SERVICE_ACCOUNT_STATUS_VALUES: readonly ["active", "revoked"];
|
|
34
|
+
/**
|
|
35
|
+
* One service account, as every read returns it (Doc 06 §10).
|
|
36
|
+
*
|
|
37
|
+
* `account_key` is the public half of the credential — the lookup handle the
|
|
38
|
+
* exchange takes, and the only way an operator can tell two accounts apart in a
|
|
39
|
+
* log. It is deliberately *not* a secret and is safe to display; `key_hash` is
|
|
40
|
+
* the secret's stored form and appears in no response at all, for the reason
|
|
41
|
+
* `SessionDTO` omits `refresh_token_hash` (Doc 10 §8).
|
|
42
|
+
*/
|
|
43
|
+
export interface ServiceAccountDTO {
|
|
44
|
+
id: string;
|
|
45
|
+
/** `null` = platform-level, outside any tenant (Doc 01 §3.7). */
|
|
46
|
+
client_id: string | null;
|
|
47
|
+
name: string;
|
|
48
|
+
/** The `account_key` of the client-credentials exchange (Doc 03 §5). */
|
|
49
|
+
account_key: string;
|
|
50
|
+
status: ServiceAccountStatus;
|
|
51
|
+
/** ISO-8601. */
|
|
52
|
+
created_at: string;
|
|
53
|
+
updated_at: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The create and rotate response — the only type in this contract that carries
|
|
57
|
+
* a secret, and the only time the secret exists anywhere but in the caller's
|
|
58
|
+
* hands (Doc 03 §7, Doc 06 §10: "secret returned once").
|
|
59
|
+
*
|
|
60
|
+
* A caller that loses it has not lost the account: rotate issues a new one. It
|
|
61
|
+
* cannot be re-read, because it was never stored.
|
|
62
|
+
*/
|
|
63
|
+
export interface ServiceAccountSecretDTO extends ServiceAccountDTO {
|
|
64
|
+
/** The `account_secret` of the exchange. Never returned again. */
|
|
65
|
+
account_secret: string;
|
|
66
|
+
}
|
|
67
|
+
/** `POST /iam/service-accounts` body (Doc 06 §10). */
|
|
68
|
+
export interface CreateServiceAccountRequest {
|
|
69
|
+
name: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* `PATCH /iam/service-accounts/:id` body (Doc 06 §10) — revoke, or reactivate.
|
|
73
|
+
*
|
|
74
|
+
* The status is the whole body: the name is not editable through this route and
|
|
75
|
+
* `account_key` never is, since it is the identifier a deployed consumer has
|
|
76
|
+
* already been configured with.
|
|
77
|
+
*/
|
|
78
|
+
export interface UpdateServiceAccountRequest {
|
|
79
|
+
status: ServiceAccountStatus;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=service-accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-accounts.d.ts","sourceRoot":"","sources":["../src/service-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB;;;CAGvB,CAAC;AACX,MAAM,MAAM,oBAAoB,GAC9B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE,eAAO,MAAM,6BAA6B,gCAGU,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,sDAAsD;AACtD,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,oBAAoB,CAAC;CAC9B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-account contract — the machine-identity surface (Doc 06 §10) and the
|
|
3
|
+
* shape of what its client-credentials exchange consumes (Doc 03 §5).
|
|
4
|
+
*
|
|
5
|
+
* ## The secret appears in exactly one type
|
|
6
|
+
*
|
|
7
|
+
* {@link ServiceAccountDTO} is what every read returns and it has no secret in
|
|
8
|
+
* it, because only the hash is stored (Doc 03 §7) — there is nothing a read
|
|
9
|
+
* *could* return. {@link ServiceAccountSecretDTO} is the create and rotate
|
|
10
|
+
* response, and it is the one moment the secret exists outside the caller's
|
|
11
|
+
* hands. Splitting them at the type level is the cheap half of "shown once": a
|
|
12
|
+
* handler that returned the wrong one on a list would not compile.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* A machine identity's lifecycle states (Doc 01 §3.7).
|
|
16
|
+
*
|
|
17
|
+
* Two, not three: there is no `locked`. Locking exists for humans because a
|
|
18
|
+
* person can be told to contact an administrator and come back; a machine has
|
|
19
|
+
* nobody to ask, so the only useful states are "works" and "does not". Revoking
|
|
20
|
+
* fails the *next* `/auth/token` exchange (Doc 03 §5).
|
|
21
|
+
*
|
|
22
|
+
* Spelled here rather than imported from `@plantops/db`, which contracts must
|
|
23
|
+
* not depend on — it has zero dependencies by design (Doc 08 §3). The Postgres
|
|
24
|
+
* enum is the same two values, and `libs/db`'s `entities.spec.ts` asserts the
|
|
25
|
+
* two spellings against each other so they cannot drift into a status the API
|
|
26
|
+
* accepts and the column rejects.
|
|
27
|
+
*/
|
|
28
|
+
export const ServiceAccountStatus = {
|
|
29
|
+
ACTIVE: 'active',
|
|
30
|
+
REVOKED: 'revoked',
|
|
31
|
+
};
|
|
32
|
+
export const SERVICE_ACCOUNT_STATUS_VALUES = [
|
|
33
|
+
ServiceAccountStatus.ACTIVE,
|
|
34
|
+
ServiceAccountStatus.REVOKED,
|
|
35
|
+
];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/tslib/modules/index.d.ts","../src/pagination.ts","../src/audit.ts","../src/jwt.ts","../src/bindings.ts","../src/clients.ts","../src/constants.ts","../src/entitlements.ts","../src/errors.ts","../src/grants.ts","../src/nav.ts","../src/manifest.ts","../src/registry.ts","../src/roles.ts","../src/scopes.ts","../src/service-accounts.ts","../src/users.ts","../src/type-assertions.ts","../src/index.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[61,62,82,137,154,155],[61,62,64,82,137,154,155],[61,82,137,154,155],[61,64,82,137,154,155],[61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,82,137,154,155],[61,71,82,137,154,155],[82,134,135,137,154,155],[82,136,137,154,155],[137,154,155],[82,137,142,154,155,173],[82,137,138,143,148,154,155,157,170,181],[82,137,138,139,148,154,155,157],[82,137,154,155],[82,137,140,154,155,182],[82,137,141,142,149,154,155,159],[82,137,142,154,155,170,178],[82,137,143,145,148,154,155,157],[82,136,137,144,154,155],[82,137,145,146,154,155],[82,137,147,148,154,155],[82,136,137,148,154,155],[82,137,148,149,150,154,155,170,181],[82,137,148,149,150,154,155,165,170,173],[82,129,137,145,148,151,154,155,157,170,181],[82,137,148,149,151,152,154,155,157,170,178,181],[82,137,151,153,154,155,170,178,181],[80,81,82,83,84,85,86,87,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[82,137,148,154,155],[82,137,154,155,156,181],[82,137,145,148,154,155,157,170],[82,137,154,155,159],[82,137,154,155,160],[82,136,137,154,155,161],[82,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187],[82,137,154,155,163],[82,137,154,155,164],[82,137,148,154,155,165,166],[82,137,154,155,165,167,182,184],[82,137,149,154,155],[82,137,148,154,155,170,171,173],[82,137,154,155,172,173],[82,137,154,155,170,171],[82,137,154,155,173],[82,137,154,155,174],[82,134,137,154,155,170,175,181],[82,137,148,154,155,176,177],[82,137,154,155,176,177],[82,137,142,154,155,157,170,178],[82,137,154,155,179],[82,137,154,155,157,180],[82,137,151,154,155,164,181],[82,137,142,154,155,182],[82,137,154,155,170,183],[82,137,154,155,156,184],[82,137,154,155,185],[82,137,142,154,155],[82,129,137,154,155],[82,137,154,155,186],[82,129,137,148,150,154,155,161,170,173,181,183,184,186],[82,137,154,155,170,187],[60,82,137,154,155],[82,94,97,100,101,137,154,155,181],[82,97,137,154,155,170,181],[82,97,101,137,154,155,181],[82,137,154,155,170],[82,91,137,154,155],[82,95,137,154,155],[82,93,94,97,137,154,155,181],[82,137,154,155,157,178],[82,137,154,155,188],[82,91,137,154,155,188],[82,93,97,137,154,155,157,181],[82,88,89,90,92,96,137,148,154,155,170,181],[82,97,106,114,137,154,155],[82,89,95,137,154,155],[82,97,123,124,137,154,155],[82,89,92,97,137,154,155,173,181,188],[82,97,137,154,155],[82,93,97,137,154,155,181],[82,88,137,154,155],[82,91,92,93,95,96,97,98,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,137,154,155],[82,97,116,119,137,145,154,155],[82,97,106,107,108,137,154,155],[82,95,97,107,109,137,154,155],[82,96,137,154,155],[82,89,91,97,137,154,155],[82,97,101,107,109,137,154,155],[82,101,137,154,155],[82,95,97,100,137,154,155,181],[82,89,93,97,106,137,154,155],[82,97,116,137,154,155],[82,109,137,154,155],[82,91,97,123,137,154,155,173,186,188]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"2a0dbbed64ad6e1031df611ab5e10b2650d35837a0fffccd7cf6293734d6a6bf","signature":"0787bad8965f33e14c457c927a9414f089358230ab013ace14d628672e9f1371","impliedFormat":99},{"version":"217cec53c6aae81ecb30ff0d5b0e7d681b530e8a4bbee82614bc4bdd5e0d5333","signature":"e1e1e6e0a027d1733330893d8bcff10ffa4bee5e9cf7830a2e30f6e1425f2769","impliedFormat":99},{"version":"1f4521e774dfb711ed03525c91a075e029e730fb16dc11a25e2d4668d6ac7e8c","signature":"ecc87f9707c193354f6d0d17a99f9c783b0bfd04c46de55fb55def8b9e2b282c","impliedFormat":99},{"version":"f9696da6978f5e7ba610d1155d51f34c16b60436f652bf07e839165f6e3b26d7","signature":"ddf71d20f14b99cc79742baf0931f3ad4ae77b6da4eaf4d96cc4df6376866614","impliedFormat":99},{"version":"db91a3661d92d6849d40417a00baa7b2c01f05c04941c1b281be7d200b661afb","signature":"894acbdbba0549194448cbc16b7939ba33029c6789ec6aaafd15cb627363a167","impliedFormat":99},{"version":"7ba012c2514e0ad713d0ad612a317dc916dfe56e7e6314e0c34ea16b0ed44777","signature":"0809b080db435bb7eaf782371ed4d96454082e76a82f348f2f9893d5255abcaf","impliedFormat":99},{"version":"cc872df071677ec58adf27cf4c6dc611d2b82fd446033134f3a1af17a42894c0","signature":"6fa457d5200d8bab3e0db67e04b5cea88f1691c2d88519a9353ac1684ac3f761","impliedFormat":99},{"version":"c433276cb26c0b894e6518830a733bb5995052b715101204554cb9eb1824af13","signature":"28c9aa6bb48decc48555e6526168ea26a02e119fda5b139d74f88ffc15ab41e7","impliedFormat":99},{"version":"aa493e152a4629d6916f7b6c254c10635647838a41aed3ace500a279fc1c8d1d","signature":"4ba594355c13972e44fcb30a457c40c461467745a8e571a15e14eda7da2257b3","impliedFormat":99},{"version":"2a3ae267383fc2f1fb6a6beefc319d97fde09e9d744900f3b72ac4802eb3a826","signature":"7724ca0fde7516f715d26728512db8c9eeb6336eaa1d355fee3f5fe773d9c349","impliedFormat":99},{"version":"bd696e297ba9f8156674b96f62a60105b9da13923116fb52c45e1ad0f5698eee","signature":"16d05cc4333b2868cd5ca4c4504cc08c2d60f134092cab3e0abe36cdc936e7d3","impliedFormat":99},{"version":"e564632e4088227bd78fa3663ad9e3baa4cb57f472755bc180942f00091a5fc8","signature":"4d1d4f9da536b54034fb6c3f9721a78b4b660709f582490f3c516ae8ce239dd1","impliedFormat":99},{"version":"3483138f8e1dd5356ff2024ff20d046dba7fc93110d279789bb66a7cc47d68db","signature":"ed43432219cc28fd013f14b5ccd2c75e04aa1bfddd6e66cd757f7cef1e70795f","impliedFormat":99},{"version":"144aa327c2b4178bf92f716d72648762ab566fb20446c2a892d309a315781813","signature":"7e781d0ce396f49c8767e893df4b159b2c77d0f7559c3953fa17ad4672c35435","impliedFormat":99},{"version":"d20049d6205a5458099ef364b05b540b9b69ff6e55bc9102900293a4cfc7b2dd","signature":"960d673592fd09c39a9a3eb99d42491232853f31bd827dcdbc524dda0ddd3998","impliedFormat":99},{"version":"c82bb9a6a16baecac4066dfc7529e9cd4d1a731ee7d34a49ddae1229673bc878","signature":"50db98ac542637161ba738c4f94a4c3a66275d044636bc989c809efa3b6d5c4e","impliedFormat":99},{"version":"ad77f3296b259bdf03c26fcb47d43b8256267be6895f2197d482808dcb8d0128","signature":"53fde18368af57fa8e0712889fd3ceee35f86c21b858d148401cd193e20c7355","impliedFormat":99},{"version":"689293a025a6d46e8899ae7ee959b4447902f0e1c202968619975340a6ce30c7","signature":"bb675cd786baef8bd4d5ca3cfcf22cb25052be4bf31b5979fa24972eb8dbce0e","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"1cbdcdef62bf42688e5d825898c3a59458466c48ad8a4ef3f88d8a1cd04310d6","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"67e435fa530778903f5525904e6645b7368eb5ac622055febd19bb399e328ccd","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"5b22bf96be06fca1e134e3a85351ffe7aa2edf0c9a5bd175b7239ee48186dbf5","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"5b48cc670da1dfe926036deaf349085caf822def460a6d50de23f1cc12a5f8cd","impliedFormat":1},{"version":"418f34087d52d001e2688a6282a5de9bf583ff771ed5546af0ae36e4f60a458b","affectsGlobalScope":true,"impliedFormat":1},{"version":"036c9a03b01281f99f8251fdc7088e894566be44b3f139a9d48501a978b611df","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1569ad5969ae0de6ad0bdfaaab0dabcd8878bc3147ab096206eed2019bb84e7f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"42a350ce4f6f291198dc89833afcc4fd078248b4e1fdc9d05c846c66a670f710","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"b03754211d839cdc48979996525a32eb62130682c2f9801dfc2f25533ce7238d","impliedFormat":1},{"version":"3910dab597c40e173bf0e0d419d3ce9682c54ebf6ae84849f9b829b1451a17ec","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"486c074a5c0f2254345c0d1c9540380f5463999e42d7e1a159305ea823d3c4b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"f4d99ac08c4097a3cc202bec2c7198c19dcdd80d4ec6c62d1356b10d03b119d5","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ca77e83162eccec633513723d178d4203bdd5465297267696be08013bab0aa1d","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"f61c153d5abbe4381a1fba0d41be0babdd5de51c626ee7ff14cede14dedc33f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7803171d745ab18e77f16bf82e742268ff72b7f7382ab191e4277527580c2d89","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e9ba65cd3d6d194bdda7343f9f2917f7144ead96a924ca58d1a14919992dc20","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"0b0dfb2d3e8420ead06f6a11acfb02ddcec42257e6ce391993e895ba0af86de4","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1}],"root":[[62,79]],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"esModuleInterop":false,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedSideEffectImports":false,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[63,1],[65,2],[66,3],[67,3],[68,3],[69,3],[70,4],[79,5],[64,3],[72,6],[71,3],[62,3],[73,6],[74,3],[75,3],[76,3],[78,3],[77,3],[134,7],[135,7],[136,8],[82,9],[137,10],[138,11],[139,12],[80,13],[140,14],[141,15],[142,16],[143,17],[144,18],[145,19],[146,19],[147,20],[148,21],[149,22],[150,23],[83,13],[81,13],[151,24],[152,25],[153,26],[188,27],[154,28],[155,13],[156,29],[157,30],[159,31],[160,32],[161,33],[162,34],[163,35],[164,36],[165,37],[166,37],[167,38],[168,13],[169,39],[170,40],[172,41],[171,42],[173,43],[174,44],[175,45],[176,46],[177,47],[178,48],[179,49],[180,50],[181,51],[182,52],[183,53],[184,54],[185,55],[84,13],[85,56],[86,13],[87,13],[130,57],[131,58],[132,13],[133,43],[186,59],[187,60],[158,13],[61,61],[60,13],[58,13],[59,13],[11,13],[10,13],[2,13],[12,13],[13,13],[14,13],[15,13],[16,13],[17,13],[18,13],[19,13],[3,13],[20,13],[21,13],[4,13],[22,13],[26,13],[23,13],[24,13],[25,13],[27,13],[28,13],[29,13],[5,13],[30,13],[31,13],[32,13],[33,13],[6,13],[37,13],[34,13],[35,13],[36,13],[38,13],[7,13],[39,13],[44,13],[45,13],[40,13],[41,13],[42,13],[43,13],[8,13],[49,13],[46,13],[47,13],[48,13],[50,13],[9,13],[51,13],[52,13],[53,13],[55,13],[54,13],[56,13],[1,13],[57,13],[106,62],[118,63],[103,64],[119,65],[128,66],[94,67],[95,68],[93,69],[127,70],[122,71],[126,72],[97,73],[115,74],[96,75],[125,76],[91,77],[92,71],[98,78],[99,13],[105,79],[102,78],[89,80],[129,81],[120,82],[109,83],[108,78],[110,84],[113,85],[107,86],[111,87],[123,70],[100,88],[101,89],[114,90],[90,65],[117,91],[116,78],[104,89],[112,92],[121,13],[88,13],[124,93]],"latestChangedDtsFile":"./jwt.d.ts","version":"6.0.3"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile-time assertion helpers for the type-level tests (Doc 08 §7).
|
|
3
|
+
*
|
|
4
|
+
* These are checked by `nx typecheck` (the spec files are compiled by
|
|
5
|
+
* `tsconfig.spec.json`); Jest's SWC transform strips types without checking
|
|
6
|
+
* them, so a broken contract fails typecheck, not the test run.
|
|
7
|
+
*/
|
|
8
|
+
/** Fails to compile unless `T` is exactly `true`. */
|
|
9
|
+
export type Expect<T extends true> = T;
|
|
10
|
+
/** Exact (invariant) type equality — distinguishes `any`, unions, optionality. */
|
|
11
|
+
export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
|
|
12
|
+
/** True when `X` is assignable to `Y`. */
|
|
13
|
+
export type Extends<X, Y> = X extends Y ? true : false;
|
|
14
|
+
/** Keys of `T` whose values are required. */
|
|
15
|
+
export type RequiredKeys<T> = {
|
|
16
|
+
[K in keyof T]-?: Record<string, never> extends Pick<T, K> ? never : K;
|
|
17
|
+
}[keyof T];
|
|
18
|
+
//# sourceMappingURL=type-assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-assertions.d.ts","sourceRoot":"","sources":["../src/type-assertions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,qDAAqD;AACrD,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;AAEvC,kFAAkF;AAClF,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,IACpB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,GAC/D,IAAI,GACJ,KAAK,CAAC;AAEZ,0CAA0C;AAC1C,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAEvD,6CAA6C;AAC7C,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;CACvE,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile-time assertion helpers for the type-level tests (Doc 08 §7).
|
|
3
|
+
*
|
|
4
|
+
* These are checked by `nx typecheck` (the spec files are compiled by
|
|
5
|
+
* `tsconfig.spec.json`); Jest's SWC transform strips types without checking
|
|
6
|
+
* them, so a broken contract fails typecheck, not the test run.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|