@asturiu/v0-sdk 0.0.0-stage → 1.0.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 (239) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +5 -0
  4. package/README.md +82 -2
  5. package/contract/assertion-vectors.json +90 -0
  6. package/contract/schemas/branding.schema.json +46 -0
  7. package/contract/schemas/definitions.schema.json +376 -0
  8. package/contract/schemas/portal.schema.json +56 -0
  9. package/contract/tenant-api-routes.json +165 -0
  10. package/dist/branding.d.ts +131 -0
  11. package/dist/branding.d.ts.map +1 -0
  12. package/dist/branding.js +206 -0
  13. package/dist/branding.js.map +1 -0
  14. package/dist/changesets.d.ts +58 -0
  15. package/dist/changesets.d.ts.map +1 -0
  16. package/dist/changesets.js +18 -0
  17. package/dist/changesets.js.map +1 -0
  18. package/dist/cli/bin.d.ts +3 -0
  19. package/dist/cli/bin.d.ts.map +1 -0
  20. package/dist/cli/bin.js +12 -0
  21. package/dist/cli/bin.js.map +1 -0
  22. package/dist/cli/changesets.d.ts +14 -0
  23. package/dist/cli/changesets.d.ts.map +1 -0
  24. package/dist/cli/changesets.js +252 -0
  25. package/dist/cli/changesets.js.map +1 -0
  26. package/dist/cli/cli.d.ts +37 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +415 -0
  29. package/dist/cli/cli.js.map +1 -0
  30. package/dist/cli/context.d.ts +147 -0
  31. package/dist/cli/context.d.ts.map +1 -0
  32. package/dist/cli/context.js +258 -0
  33. package/dist/cli/context.js.map +1 -0
  34. package/dist/cli/engine.d.ts +59 -0
  35. package/dist/cli/engine.d.ts.map +1 -0
  36. package/dist/cli/engine.js +85 -0
  37. package/dist/cli/engine.js.map +1 -0
  38. package/dist/cli/feedback.d.ts +40 -0
  39. package/dist/cli/feedback.d.ts.map +1 -0
  40. package/dist/cli/feedback.js +420 -0
  41. package/dist/cli/feedback.js.map +1 -0
  42. package/dist/cli/files.d.ts +83 -0
  43. package/dist/cli/files.d.ts.map +1 -0
  44. package/dist/cli/files.js +389 -0
  45. package/dist/cli/files.js.map +1 -0
  46. package/dist/cli/index.d.ts +8 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +8 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/cli/overview.d.ts +6 -0
  51. package/dist/cli/overview.d.ts.map +1 -0
  52. package/dist/cli/overview.js +379 -0
  53. package/dist/cli/overview.js.map +1 -0
  54. package/dist/cli/parts.d.ts +5 -0
  55. package/dist/cli/parts.d.ts.map +1 -0
  56. package/dist/cli/parts.js +414 -0
  57. package/dist/cli/parts.js.map +1 -0
  58. package/dist/cli/sources.d.ts +37 -0
  59. package/dist/cli/sources.d.ts.map +1 -0
  60. package/dist/cli/sources.js +91 -0
  61. package/dist/cli/sources.js.map +1 -0
  62. package/dist/cli/terminal.d.ts +135 -0
  63. package/dist/cli/terminal.d.ts.map +1 -0
  64. package/dist/cli/terminal.js +353 -0
  65. package/dist/cli/terminal.js.map +1 -0
  66. package/dist/cli/ui-page.d.ts +8 -0
  67. package/dist/cli/ui-page.d.ts.map +1 -0
  68. package/dist/cli/ui-page.js +216 -0
  69. package/dist/cli/ui-page.js.map +1 -0
  70. package/dist/cli/ui.d.ts +54 -0
  71. package/dist/cli/ui.d.ts.map +1 -0
  72. package/dist/cli/ui.js +251 -0
  73. package/dist/cli/ui.js.map +1 -0
  74. package/dist/client.d.ts +88 -0
  75. package/dist/client.d.ts.map +1 -0
  76. package/dist/client.js +165 -0
  77. package/dist/client.js.map +1 -0
  78. package/dist/contacts.d.ts +43 -0
  79. package/dist/contacts.d.ts.map +1 -0
  80. package/dist/contacts.js +46 -0
  81. package/dist/contacts.js.map +1 -0
  82. package/dist/definition-set.d.ts +731 -0
  83. package/dist/definition-set.d.ts.map +1 -0
  84. package/dist/definition-set.js +659 -0
  85. package/dist/definition-set.js.map +1 -0
  86. package/dist/definitions.d.ts +42 -0
  87. package/dist/definitions.d.ts.map +1 -0
  88. package/dist/definitions.js +154 -0
  89. package/dist/definitions.js.map +1 -0
  90. package/dist/enrolment.d.ts +9 -0
  91. package/dist/enrolment.d.ts.map +1 -0
  92. package/dist/enrolment.js +8 -0
  93. package/dist/enrolment.js.map +1 -0
  94. package/dist/fill.d.ts +73 -0
  95. package/dist/fill.d.ts.map +1 -0
  96. package/dist/fill.js +46 -0
  97. package/dist/fill.js.map +1 -0
  98. package/dist/index.d.ts +39 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +39 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/notifications.d.ts +33 -0
  103. package/dist/notifications.d.ts.map +1 -0
  104. package/dist/notifications.js +36 -0
  105. package/dist/notifications.js.map +1 -0
  106. package/dist/oidc.d.ts +122 -0
  107. package/dist/oidc.d.ts.map +1 -0
  108. package/dist/oidc.js +150 -0
  109. package/dist/oidc.js.map +1 -0
  110. package/dist/overlay.d.ts +109 -0
  111. package/dist/overlay.d.ts.map +1 -0
  112. package/dist/overlay.js +58 -0
  113. package/dist/overlay.js.map +1 -0
  114. package/dist/passes.d.ts +95 -0
  115. package/dist/passes.d.ts.map +1 -0
  116. package/dist/passes.js +140 -0
  117. package/dist/passes.js.map +1 -0
  118. package/dist/portal-options.d.ts +65 -0
  119. package/dist/portal-options.d.ts.map +1 -0
  120. package/dist/portal-options.js +120 -0
  121. package/dist/portal-options.js.map +1 -0
  122. package/dist/reads.d.ts +41 -0
  123. package/dist/reads.d.ts.map +1 -0
  124. package/dist/reads.js +44 -0
  125. package/dist/reads.js.map +1 -0
  126. package/dist/recovery-words.d.ts +8 -0
  127. package/dist/recovery-words.d.ts.map +1 -0
  128. package/dist/recovery-words.js +136 -0
  129. package/dist/recovery-words.js.map +1 -0
  130. package/dist/recovery.d.ts +198 -0
  131. package/dist/recovery.d.ts.map +1 -0
  132. package/dist/recovery.js +112 -0
  133. package/dist/recovery.js.map +1 -0
  134. package/dist/reveal.d.ts +35 -0
  135. package/dist/reveal.d.ts.map +1 -0
  136. package/dist/reveal.js +66 -0
  137. package/dist/reveal.js.map +1 -0
  138. package/dist/seal.d.ts +15 -0
  139. package/dist/seal.d.ts.map +1 -0
  140. package/dist/seal.js +0 -0
  141. package/dist/seal.js.map +1 -0
  142. package/dist/session.d.ts +66 -0
  143. package/dist/session.d.ts.map +1 -0
  144. package/dist/session.js +61 -0
  145. package/dist/session.js.map +1 -0
  146. package/dist/signing-in-mark.d.ts +14 -0
  147. package/dist/signing-in-mark.d.ts.map +1 -0
  148. package/dist/signing-in-mark.js +24 -0
  149. package/dist/signing-in-mark.js.map +1 -0
  150. package/dist/signing-in.d.ts +22 -0
  151. package/dist/signing-in.d.ts.map +1 -0
  152. package/dist/signing-in.js +203 -0
  153. package/dist/signing-in.js.map +1 -0
  154. package/dist/tags.d.ts +96 -0
  155. package/dist/tags.d.ts.map +1 -0
  156. package/dist/tags.js +88 -0
  157. package/dist/tags.js.map +1 -0
  158. package/dist/tenant-subscription.d.ts +47 -0
  159. package/dist/tenant-subscription.d.ts.map +1 -0
  160. package/dist/tenant-subscription.js +7 -0
  161. package/dist/tenant-subscription.js.map +1 -0
  162. package/dist/testing/index.d.ts +125 -0
  163. package/dist/testing/index.d.ts.map +1 -0
  164. package/dist/testing/index.js +320 -0
  165. package/dist/testing/index.js.map +1 -0
  166. package/dist/theme.d.ts +237 -0
  167. package/dist/theme.d.ts.map +1 -0
  168. package/dist/theme.js +504 -0
  169. package/dist/theme.js.map +1 -0
  170. package/dist/tickets.d.ts +152 -0
  171. package/dist/tickets.d.ts.map +1 -0
  172. package/dist/tickets.js +65 -0
  173. package/dist/tickets.js.map +1 -0
  174. package/dist/tiers.d.ts +168 -0
  175. package/dist/tiers.d.ts.map +1 -0
  176. package/dist/tiers.js +341 -0
  177. package/dist/tiers.js.map +1 -0
  178. package/dist/types.d.ts +885 -0
  179. package/dist/types.d.ts.map +1 -0
  180. package/dist/types.js +12 -0
  181. package/dist/types.js.map +1 -0
  182. package/dist/urlid.d.ts +50 -0
  183. package/dist/urlid.d.ts.map +1 -0
  184. package/dist/urlid.js +78 -0
  185. package/dist/urlid.js.map +1 -0
  186. package/dist/version.d.ts +15 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +15 -0
  189. package/dist/version.js.map +1 -0
  190. package/make/asturiu.mk +43 -0
  191. package/package.json +63 -4
  192. package/src/branding.ts +221 -0
  193. package/src/changesets.ts +61 -0
  194. package/src/cli/bin.ts +12 -0
  195. package/src/cli/changesets.ts +233 -0
  196. package/src/cli/cli.ts +425 -0
  197. package/src/cli/context.ts +299 -0
  198. package/src/cli/engine.ts +112 -0
  199. package/src/cli/feedback.ts +406 -0
  200. package/src/cli/files.ts +371 -0
  201. package/src/cli/index.ts +7 -0
  202. package/src/cli/overview.ts +343 -0
  203. package/src/cli/parts.ts +371 -0
  204. package/src/cli/sources.ts +111 -0
  205. package/src/cli/terminal.ts +384 -0
  206. package/src/cli/ui-page.ts +215 -0
  207. package/src/cli/ui.ts +266 -0
  208. package/src/client.ts +202 -0
  209. package/src/contacts.ts +61 -0
  210. package/src/definition-set.ts +965 -0
  211. package/src/definitions.ts +156 -0
  212. package/src/enrolment.ts +10 -0
  213. package/src/fill.ts +83 -0
  214. package/src/index.ts +38 -0
  215. package/src/notifications.ts +55 -0
  216. package/src/oidc.ts +199 -0
  217. package/src/overlay.ts +137 -0
  218. package/src/passes.ts +168 -0
  219. package/src/portal-options.ts +125 -0
  220. package/src/reads.ts +71 -0
  221. package/src/recovery-words.ts +137 -0
  222. package/src/recovery.ts +269 -0
  223. package/src/reveal.ts +72 -0
  224. package/src/seal.ts +0 -0
  225. package/src/session.ts +93 -0
  226. package/src/signing-in-mark.ts +23 -0
  227. package/src/signing-in.ts +213 -0
  228. package/src/tags.ts +146 -0
  229. package/src/tenant-subscription.ts +44 -0
  230. package/src/testing/index.ts +337 -0
  231. package/src/theme.ts +628 -0
  232. package/src/tickets.ts +195 -0
  233. package/src/tiers.ts +397 -0
  234. package/src/types.ts +847 -0
  235. package/src/urlid.ts +77 -0
  236. package/src/version.ts +15 -0
  237. package/templates/asturiu/branding.json +4 -0
  238. package/templates/asturiu/definitions.json +23 -0
  239. package/templates/asturiu/portal.json +16 -0
package/dist/tiers.js ADDED
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Tiers (ADR-061). A tier is a named set of features. Engine features come
3
+ * from the closed catalogue below and the Engine enforces them; Tenant
4
+ * features are the Tenant's own, and the Engine stores and returns them
5
+ * without reading them. Dependency-free, so the Admin UI, the Customer Portal
6
+ * and a Tenant's application draw from the same list the Interface API
7
+ * enforces.
8
+ */
9
+ import { PASS_LIMITS } from "./passes.js";
10
+ export const TIER_LIMITS = {
11
+ tiers: 32,
12
+ label: 120,
13
+ /** Tenant features on one tier. */
14
+ tenantFeatures: 64,
15
+ tenantFeatureString: 200,
16
+ graceDays: 365,
17
+ /** A file removal gives a person time to act (§6). */
18
+ storageGraceDaysMin: 30,
19
+ };
20
+ export const TIER_KEY_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;
21
+ export const TENANT_FEATURE_KEY_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;
22
+ /** ADR-061 §4. A feature joins this list when the Engine can enforce it. */
23
+ export const ENGINE_FEATURES = [
24
+ { key: "wallets", kind: "stock", unit: "count", default: true, scope: "vault", pooled: true, label: "Wallets" },
25
+ { key: "entries", kind: "stock", unit: "count", default: true, scope: "vault", pooled: true, label: "Entries" },
26
+ { key: "storage", kind: "stock", unit: "bytes", default: true, scope: "vault", pooled: true, label: "Storage" },
27
+ { key: "file_size", kind: "size", unit: "bytes", default: true, scope: "upload", pooled: false, label: "Largest file" },
28
+ { key: "sharing", kind: "stock", unit: "people", default: true, scope: "vault", pooled: false, label: "People shared with" },
29
+ { key: "conditional_sharing", kind: "toggle", unit: null, default: true, scope: null, pooled: false, label: "Conditional sharing" },
30
+ { key: "groups", kind: "stock", unit: "count", default: true, scope: "vault", pooled: true, label: "Groups" },
31
+ { key: "contacts", kind: "stock", unit: "count", default: true, scope: "customer", pooled: true, label: "Contacts" },
32
+ { key: "messages", kind: "monthly", unit: "count", default: true, scope: "customer", pooled: true, label: "Messages a month" },
33
+ { key: "transfers", kind: "monthly", unit: "count", default: true, scope: "customer", pooled: true, label: "Transfers a month" },
34
+ { key: "passes", kind: "stock", unit: "count", default: 0, scope: "vault", pooled: false, max: PASS_LIMITS.passesPerLevelMax, label: "Live guest passes" },
35
+ { key: "triggers", kind: "stock", unit: "count", default: true, scope: "vault", pooled: true, label: "Triggers" },
36
+ { key: "recovery", kind: "toggle", unit: null, default: true, scope: null, pooled: false, label: "Vault recovery" },
37
+ { key: "tickets", kind: "toggle", unit: null, default: true, scope: null, pooled: false, label: "Support tickets" },
38
+ { key: "sms", kind: "toggle", unit: null, default: true, scope: null, pooled: false, label: "SMS" },
39
+ { key: "trash_days", kind: "window", unit: "days", default: true, scope: null, pooled: false, label: "Days to restore" },
40
+ { key: "portfolios", kind: "stock", unit: "count", default: true, scope: "vault", pooled: true, label: "Portfolios" },
41
+ { key: "rename", kind: "toggle", unit: null, default: false, scope: null, pooled: false, label: "Rename fields" },
42
+ { key: "arrange", kind: "toggle", unit: null, default: false, scope: null, pooled: false, label: "Arrange fields" },
43
+ { key: "custom_fields", kind: "stock", unit: "count", default: 0, scope: "wallet", pooled: false, max: 200, label: "Custom fields per Wallet" },
44
+ { key: "secret_custom_fields", kind: "toggle", unit: null, default: false, scope: null, pooled: false, label: "Secret custom fields" },
45
+ { key: "searchable_custom_fields", kind: "stock", unit: "count", default: 0, scope: "wallet", pooled: false, max: 50, label: "Searchable custom fields per Wallet" },
46
+ ];
47
+ const CATALOGUE = new Map(ENGINE_FEATURES.map((f) => [f.key, f]));
48
+ export function engineFeature(key) {
49
+ return CATALOGUE.get(key);
50
+ }
51
+ export const TRIGGER_RULE_MODES = ["freeze", "pause"];
52
+ export const STORAGE_RULE_MODES = ["keep", "remove"];
53
+ export function defaultTierRules() {
54
+ return { triggers: { mode: "freeze", grace_days: 0 }, storage: { mode: "keep", grace_days: 90 } };
55
+ }
56
+ /** What a Tenant record with no tiers reads as (§3): one tier that creates from every Wallet type. */
57
+ export function defaultTierSet() {
58
+ return { tiers: { free: { wallet_types: ["*"] } }, default_tier: "free", tier_rules: defaultTierRules() };
59
+ }
60
+ const isObject = (v) => !!v && typeof v === "object" && !Array.isArray(v);
61
+ /** One tier's overlay limits from `Tenant.customization` (ADR-028), as Engine features. */
62
+ function featuresFromCustomization(raw) {
63
+ if (!isObject(raw))
64
+ return {};
65
+ const out = {};
66
+ if (raw.rename === true)
67
+ out.rename = true;
68
+ if (raw.arrange === true)
69
+ out.arrange = true;
70
+ if (typeof raw.extra_fields === "number" && raw.extra_fields > 0)
71
+ out.custom_fields = raw.extra_fields;
72
+ if (raw.secret_fields === true)
73
+ out.secret_custom_fields = true;
74
+ if (typeof raw.searchable_fields === "number" && raw.searchable_fields > 0)
75
+ out.searchable_custom_fields = raw.searchable_fields;
76
+ return out;
77
+ }
78
+ /**
79
+ * Tiers from the four fields they replace (§11). Each default is the one the
80
+ * old field had, so nothing changes for a Customer. ARIDs in `scoping` become
81
+ * Wallet type keys through the Tenant's Definition map; one the map does not
82
+ * know stays an ARID, which `walletTypeArids` still honours.
83
+ */
84
+ export function tiersFromLegacy(raw) {
85
+ const scoping = isObject(raw.scoping) ? raw.scoping : {};
86
+ const customization = isObject(raw.customization) ? raw.customization : {};
87
+ const passes = isObject(raw.passes) && isObject(raw.passes.levels) ? raw.passes.levels : {};
88
+ const map = isObject(raw.definitions) && isObject(raw.definitions.map) ? raw.definitions.map : {};
89
+ const keyOf = new Map(Object.entries(map).filter(([k]) => k.startsWith("wallet:")).map(([k, arid]) => [arid, k.slice("wallet:".length)]));
90
+ const levels = [...new Set([...Object.keys(scoping), ...Object.keys(customization), ...Object.keys(passes)])].filter((l) => TIER_KEY_PATTERN.test(l));
91
+ const free = isObject(raw.billing) && typeof raw.billing.free_level === "string" ? raw.billing.free_level : "free";
92
+ if (!levels.length)
93
+ return { ...defaultTierSet(), default_tier: "free" };
94
+ const tiers = {};
95
+ for (const level of levels) {
96
+ const list = Array.isArray(scoping[level]) ? scoping[level].filter((a) => typeof a === "string") : [];
97
+ const engine_features = featuresFromCustomization(customization[level]);
98
+ const allowed = isObject(passes[level]) ? passes[level].passes : undefined;
99
+ if (typeof allowed === "number" && allowed > 0)
100
+ engine_features.passes = allowed;
101
+ tiers[level] = { wallet_types: list.map((a) => (a === "*" ? a : (keyOf.get(a) ?? a))), ...(Object.keys(engine_features).length ? { engine_features } : {}) };
102
+ }
103
+ // The old fall-back read the key `free`, then nothing: a level that was named nowhere stays empty.
104
+ const default_tier = free in tiers ? free : "free" in tiers ? "free" : free;
105
+ if (!(default_tier in tiers))
106
+ tiers[default_tier] = { wallet_types: [] };
107
+ return { tiers, default_tier, tier_rules: defaultTierRules() };
108
+ }
109
+ function readRules(raw) {
110
+ const out = defaultTierRules();
111
+ if (!isObject(raw))
112
+ return out;
113
+ const t = raw.triggers;
114
+ if (isObject(t)) {
115
+ if (TRIGGER_RULE_MODES.includes(t.mode))
116
+ out.triggers.mode = t.mode;
117
+ if (Number.isInteger(t.grace_days) && t.grace_days >= 0 && t.grace_days <= TIER_LIMITS.graceDays)
118
+ out.triggers.grace_days = t.grace_days;
119
+ }
120
+ const s = raw.storage;
121
+ if (isObject(s)) {
122
+ if (STORAGE_RULE_MODES.includes(s.mode))
123
+ out.storage.mode = s.mode;
124
+ if (Number.isInteger(s.grace_days) && s.grace_days >= TIER_LIMITS.storageGraceDaysMin && s.grace_days <= TIER_LIMITS.graceDays)
125
+ out.storage.grace_days = s.grace_days;
126
+ }
127
+ if (typeof raw.changed_at === "string")
128
+ out.changed_at = raw.changed_at;
129
+ return out;
130
+ }
131
+ /** A stored `tiers` block, read leniently: what cannot be read is left out, never a broken page. */
132
+ function readTiers(raw) {
133
+ const out = {};
134
+ if (!isObject(raw))
135
+ return out;
136
+ for (const [key, t] of Object.entries(raw)) {
137
+ if (!TIER_KEY_PATTERN.test(key) || !isObject(t))
138
+ continue;
139
+ const tier = { wallet_types: Array.isArray(t.wallet_types) ? t.wallet_types.filter((w) => typeof w === "string") : [] };
140
+ if (typeof t.label === "string")
141
+ tier.label = t.label;
142
+ if (isObject(t.engine_features)) {
143
+ const features = {};
144
+ for (const [k, v] of Object.entries(t.engine_features))
145
+ if (CATALOGUE.has(k) && (typeof v === "boolean" || typeof v === "number"))
146
+ features[k] = v;
147
+ if (Object.keys(features).length)
148
+ tier.engine_features = features;
149
+ }
150
+ if (isObject(t.tenant_features))
151
+ tier.tenant_features = t.tenant_features;
152
+ out[key] = tier;
153
+ }
154
+ return out;
155
+ }
156
+ /** A Tenant's tiers, from `tiers` when the record has them, otherwise from the fields they replace. */
157
+ export function tierSetOf(raw) {
158
+ const tiers = readTiers(raw.tiers);
159
+ const keys = Object.keys(tiers);
160
+ if (!keys.length)
161
+ return tiersFromLegacy(raw);
162
+ const stored = typeof raw.default_tier === "string" ? raw.default_tier : "";
163
+ return { tiers, default_tier: stored in tiers ? stored : keys[0], tier_rules: readRules(raw.tier_rules) };
164
+ }
165
+ /** The tier in force: the stored key, or `default_tier` when there is none or it no longer exists (§3). */
166
+ export function tierKeyOf(set, stored) {
167
+ return stored && stored in set.tiers ? stored : set.default_tier;
168
+ }
169
+ export function tierOf(set, stored) {
170
+ return set.tiers[tierKeyOf(set, stored)] ?? { wallet_types: [] };
171
+ }
172
+ /** A feature's value on a tier: as written, or the catalogue's default. */
173
+ export function featureValue(tier, key) {
174
+ const stored = tier.engine_features?.[key];
175
+ if (stored !== undefined)
176
+ return stored;
177
+ return CATALOGUE.get(key)?.default ?? false;
178
+ }
179
+ /** `null`: no limit. `0`: off. Otherwise the number (§2). */
180
+ export function featureLimit(value) {
181
+ if (value === true)
182
+ return null;
183
+ if (value === false)
184
+ return 0;
185
+ return value;
186
+ }
187
+ /** Whether a Customer may use a feature at all. */
188
+ export function featureIsOn(value) {
189
+ return value === true || (typeof value === "number" && value > 0);
190
+ }
191
+ /** The Wallet type ARIDs a tier may create from. `map` is the Tenant's Definition map; a key not in it is skipped (§3). */
192
+ export function walletTypeArids(tier, map, all) {
193
+ if (tier.wallet_types.includes("*"))
194
+ return new Set(all);
195
+ const out = new Set();
196
+ for (const w of tier.wallet_types) {
197
+ const arid = map[`wallet:${w}`] ?? (all.includes(w) ? w : undefined);
198
+ if (arid)
199
+ out.add(arid);
200
+ }
201
+ return out;
202
+ }
203
+ /** Whether any tier switches a Wallet overlay feature on: the Tenant has customisation at all (ADR-028). */
204
+ export function overlaysOn(set) {
205
+ return Object.values(set.tiers).some((t) => ["rename", "arrange", "custom_fields", "secret_custom_fields", "searchable_custom_fields"].some((k) => featureIsOn(featureValue(t, k))));
206
+ }
207
+ /** What a tier may add to a Wallet overlay, in the shape the overlay code checks against. */
208
+ export function overlayLimitsOf(tier) {
209
+ const count = (key) => {
210
+ const limit = featureLimit(featureValue(tier, key));
211
+ return limit === null ? (CATALOGUE.get(key)?.max ?? 0) : limit;
212
+ };
213
+ return { rename: featureIsOn(featureValue(tier, "rename")), arrange: featureIsOn(featureValue(tier, "arrange")), extra_fields: count("custom_fields"), secret_fields: featureIsOn(featureValue(tier, "secret_custom_fields")), searchable_fields: count("searchable_custom_fields") };
214
+ }
215
+ /** Strict checks on a block being written (§3). One entry per problem, with its path. */
216
+ export function tierProblems(raw) {
217
+ const out = [];
218
+ if (!isObject(raw.tiers))
219
+ return [{ path: ["tiers"], message: "tiers is an object of tier keys" }];
220
+ const keys = Object.keys(raw.tiers);
221
+ if (!keys.length)
222
+ out.push({ path: ["tiers"], message: "a Tenant needs at least one tier" });
223
+ if (keys.length > TIER_LIMITS.tiers)
224
+ out.push({ path: ["tiers"], message: `at most ${TIER_LIMITS.tiers} tiers` });
225
+ if (typeof raw.default_tier !== "string" || !keys.includes(raw.default_tier))
226
+ out.push({ path: ["default_tier"], message: "default_tier must be a tier key" });
227
+ for (const key of keys) {
228
+ const at = (...rest) => ["tiers", key, ...rest];
229
+ if (!TIER_KEY_PATTERN.test(key))
230
+ out.push({ path: at(), message: "a tier key is lowercase letters, digits, - and _, starting with a letter, at most 64" });
231
+ const t = raw.tiers[key];
232
+ if (!isObject(t)) {
233
+ out.push({ path: at(), message: "a tier is an object" });
234
+ continue;
235
+ }
236
+ for (const k of Object.keys(t))
237
+ if (!["label", "wallet_types", "engine_features", "tenant_features"].includes(k))
238
+ out.push({ path: at(k), message: "unknown key" });
239
+ if (t.label !== undefined && (typeof t.label !== "string" || t.label.length > TIER_LIMITS.label))
240
+ out.push({ path: at("label"), message: `a label is text of at most ${TIER_LIMITS.label} characters` });
241
+ if (!Array.isArray(t.wallet_types) || t.wallet_types.some((w) => typeof w !== "string"))
242
+ out.push({ path: at("wallet_types"), message: "wallet_types is a list of Wallet type keys, or \"*\"" });
243
+ if (t.engine_features !== undefined) {
244
+ if (!isObject(t.engine_features))
245
+ out.push({ path: at("engine_features"), message: "engine_features is an object" });
246
+ else
247
+ for (const [k, v] of Object.entries(t.engine_features)) {
248
+ const f = CATALOGUE.get(k);
249
+ if (!f) {
250
+ out.push({ path: at("engine_features", k), message: "not an Engine feature" });
251
+ continue;
252
+ }
253
+ if (f.kind === "toggle") {
254
+ if (typeof v !== "boolean")
255
+ out.push({ path: at("engine_features", k), message: "this feature is on or off: true or false" });
256
+ continue;
257
+ }
258
+ const okNumber = typeof v === "number" && Number.isInteger(v) && v >= 0 && (f.max === undefined || v <= f.max);
259
+ if (typeof v !== "boolean" && !okNumber)
260
+ out.push({ path: at("engine_features", k), message: f.max === undefined ? "true, false or a whole number" : `true, false or a whole number up to ${f.max}` });
261
+ }
262
+ }
263
+ if (t.tenant_features !== undefined) {
264
+ if (!isObject(t.tenant_features))
265
+ out.push({ path: at("tenant_features"), message: "tenant_features is an object" });
266
+ else {
267
+ const entries = Object.entries(t.tenant_features);
268
+ if (entries.length > TIER_LIMITS.tenantFeatures)
269
+ out.push({ path: at("tenant_features"), message: `at most ${TIER_LIMITS.tenantFeatures} keys` });
270
+ for (const [k, v] of entries) {
271
+ if (!TENANT_FEATURE_KEY_PATTERN.test(k))
272
+ out.push({ path: at("tenant_features", k), message: "a key is lowercase letters, digits and _, starting with a letter, at most 64" });
273
+ const okValue = typeof v === "boolean" || (typeof v === "number" && Number.isInteger(v)) || (typeof v === "string" && v.length <= TIER_LIMITS.tenantFeatureString);
274
+ if (!okValue)
275
+ out.push({ path: at("tenant_features", k), message: `a boolean, a whole number, or text of at most ${TIER_LIMITS.tenantFeatureString} characters` });
276
+ }
277
+ }
278
+ }
279
+ }
280
+ const rules = raw.tier_rules;
281
+ if (rules !== undefined) {
282
+ if (!isObject(rules))
283
+ out.push({ path: ["tier_rules"], message: "tier_rules is an object" });
284
+ else {
285
+ for (const k of Object.keys(rules))
286
+ if (!["triggers", "storage", "changed_at"].includes(k))
287
+ out.push({ path: ["tier_rules", k], message: "unknown key" });
288
+ const t = rules.triggers;
289
+ if (t !== undefined) {
290
+ if (!isObject(t) || !TRIGGER_RULE_MODES.includes(t.mode))
291
+ out.push({ path: ["tier_rules", "triggers", "mode"], message: `one of ${TRIGGER_RULE_MODES.join(", ")}` });
292
+ else if (t.grace_days !== undefined && !(Number.isInteger(t.grace_days) && t.grace_days >= 0 && t.grace_days <= TIER_LIMITS.graceDays))
293
+ out.push({ path: ["tier_rules", "triggers", "grace_days"], message: `0 to ${TIER_LIMITS.graceDays} days` });
294
+ }
295
+ const s = rules.storage;
296
+ if (s !== undefined) {
297
+ if (!isObject(s) || !STORAGE_RULE_MODES.includes(s.mode))
298
+ out.push({ path: ["tier_rules", "storage", "mode"], message: `one of ${STORAGE_RULE_MODES.join(", ")}` });
299
+ else if (s.grace_days !== undefined && !(Number.isInteger(s.grace_days) && s.grace_days >= TIER_LIMITS.storageGraceDaysMin && s.grace_days <= TIER_LIMITS.graceDays))
300
+ out.push({ path: ["tier_rules", "storage", "grace_days"], message: `${TIER_LIMITS.storageGraceDaysMin} to ${TIER_LIMITS.graceDays} days` });
301
+ }
302
+ }
303
+ }
304
+ return out;
305
+ }
306
+ /** A value as a number to compare: no limit counts as more than any number. */
307
+ const rank = (v) => (v === true ? Number.POSITIVE_INFINITY : v === false ? 0 : v);
308
+ /** Features whose value falls between two tier sets, on tiers that exist in both: what the Admin UI warns about (§12), and what starts a grace period (§6). */
309
+ export function loweredFeatures(before, after) {
310
+ const out = [];
311
+ for (const [key, was] of Object.entries(before)) {
312
+ const now = after[key];
313
+ if (!now)
314
+ continue;
315
+ for (const f of ENGINE_FEATURES) {
316
+ const from = featureValue(was, f.key);
317
+ const to = featureValue(now, f.key);
318
+ if (rank(to) < rank(from))
319
+ out.push({ tier: key, feature: f.key, from, to });
320
+ }
321
+ }
322
+ return out;
323
+ }
324
+ export function entitlementsOf(set, stored, used = {}) {
325
+ const key = tierKeyOf(set, stored);
326
+ const tier = tierOf(set, key);
327
+ const engine_features = {};
328
+ for (const f of ENGINE_FEATURES)
329
+ engine_features[f.key] = { value: featureValue(tier, f.key), ...(used[f.key] ?? {}) };
330
+ return { tier: key, label: tier.label ?? key, wallet_types: tier.wallet_types, engine_features, tenant_features: tier.tenant_features ?? {} };
331
+ }
332
+ /** A feature read for showing: whether it is on, its limit, what is used and what is left. */
333
+ export function featureOf(entitlements, key) {
334
+ const f = entitlements.engine_features[key];
335
+ if (!f)
336
+ return { on: false, limit: 0, used: null, left: null };
337
+ const limit = featureLimit(f.value);
338
+ const used = f.used ?? null;
339
+ return { on: featureIsOn(f.value), limit, used, left: limit === null || used === null ? null : Math.max(0, limit - used) };
340
+ }
341
+ //# sourceMappingURL=tiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiers.js","sourceRoot":"","sources":["../src/tiers.ts"],"names":[],"mappings":"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"}