@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.
Files changed (60) hide show
  1. package/README.md +11 -0
  2. package/dist/audit.d.ts +149 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +87 -0
  5. package/dist/bindings.d.ts +125 -0
  6. package/dist/bindings.d.ts.map +1 -0
  7. package/dist/bindings.js +40 -0
  8. package/dist/clients.d.ts +240 -0
  9. package/dist/clients.d.ts.map +1 -0
  10. package/dist/clients.js +49 -0
  11. package/dist/constants.d.ts +91 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +92 -0
  14. package/dist/entitlements.d.ts +135 -0
  15. package/dist/entitlements.d.ts.map +1 -0
  16. package/dist/entitlements.js +43 -0
  17. package/dist/errors.d.ts +68 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +83 -0
  20. package/dist/grants.d.ts +70 -0
  21. package/dist/grants.d.ts.map +1 -0
  22. package/dist/grants.js +13 -0
  23. package/dist/index.d.ts +34 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +33 -0
  26. package/dist/jwt.d.ts +155 -0
  27. package/dist/jwt.d.ts.map +1 -0
  28. package/dist/jwt.js +49 -0
  29. package/dist/lib/contracts.d.ts +2 -0
  30. package/dist/lib/contracts.d.ts.map +1 -0
  31. package/dist/lib/contracts.js +3 -0
  32. package/dist/manifest.d.ts +136 -0
  33. package/dist/manifest.d.ts.map +1 -0
  34. package/dist/manifest.js +22 -0
  35. package/dist/nav.d.ts +53 -0
  36. package/dist/nav.d.ts.map +1 -0
  37. package/dist/nav.js +25 -0
  38. package/dist/pagination.d.ts +28 -0
  39. package/dist/pagination.d.ts.map +1 -0
  40. package/dist/pagination.js +27 -0
  41. package/dist/registry.d.ts +183 -0
  42. package/dist/registry.d.ts.map +1 -0
  43. package/dist/registry.js +24 -0
  44. package/dist/roles.d.ts +215 -0
  45. package/dist/roles.d.ts.map +1 -0
  46. package/dist/roles.js +45 -0
  47. package/dist/scopes.d.ts +220 -0
  48. package/dist/scopes.d.ts.map +1 -0
  49. package/dist/scopes.js +108 -0
  50. package/dist/service-accounts.d.ts +81 -0
  51. package/dist/service-accounts.d.ts.map +1 -0
  52. package/dist/service-accounts.js +35 -0
  53. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  54. package/dist/type-assertions.d.ts +18 -0
  55. package/dist/type-assertions.d.ts.map +1 -0
  56. package/dist/type-assertions.js +8 -0
  57. package/dist/users.d.ts +364 -0
  58. package/dist/users.d.ts.map +1 -0
  59. package/dist/users.js +134 -0
  60. package/package.json +39 -0
@@ -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 {};