@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.
- package/CHANGELOG.md +42 -0
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +82 -2
- package/contract/assertion-vectors.json +90 -0
- package/contract/schemas/branding.schema.json +46 -0
- package/contract/schemas/definitions.schema.json +376 -0
- package/contract/schemas/portal.schema.json +56 -0
- package/contract/tenant-api-routes.json +165 -0
- package/dist/branding.d.ts +131 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +206 -0
- package/dist/branding.js.map +1 -0
- package/dist/changesets.d.ts +58 -0
- package/dist/changesets.d.ts.map +1 -0
- package/dist/changesets.js +18 -0
- package/dist/changesets.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +12 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/changesets.d.ts +14 -0
- package/dist/cli/changesets.d.ts.map +1 -0
- package/dist/cli/changesets.js +252 -0
- package/dist/cli/changesets.js.map +1 -0
- package/dist/cli/cli.d.ts +37 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +415 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/context.d.ts +147 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +258 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/engine.d.ts +59 -0
- package/dist/cli/engine.d.ts.map +1 -0
- package/dist/cli/engine.js +85 -0
- package/dist/cli/engine.js.map +1 -0
- package/dist/cli/feedback.d.ts +40 -0
- package/dist/cli/feedback.d.ts.map +1 -0
- package/dist/cli/feedback.js +420 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/files.d.ts +83 -0
- package/dist/cli/files.d.ts.map +1 -0
- package/dist/cli/files.js +389 -0
- package/dist/cli/files.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/overview.d.ts +6 -0
- package/dist/cli/overview.d.ts.map +1 -0
- package/dist/cli/overview.js +379 -0
- package/dist/cli/overview.js.map +1 -0
- package/dist/cli/parts.d.ts +5 -0
- package/dist/cli/parts.d.ts.map +1 -0
- package/dist/cli/parts.js +414 -0
- package/dist/cli/parts.js.map +1 -0
- package/dist/cli/sources.d.ts +37 -0
- package/dist/cli/sources.d.ts.map +1 -0
- package/dist/cli/sources.js +91 -0
- package/dist/cli/sources.js.map +1 -0
- package/dist/cli/terminal.d.ts +135 -0
- package/dist/cli/terminal.d.ts.map +1 -0
- package/dist/cli/terminal.js +353 -0
- package/dist/cli/terminal.js.map +1 -0
- package/dist/cli/ui-page.d.ts +8 -0
- package/dist/cli/ui-page.d.ts.map +1 -0
- package/dist/cli/ui-page.js +216 -0
- package/dist/cli/ui-page.js.map +1 -0
- package/dist/cli/ui.d.ts +54 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +251 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client.d.ts +88 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +165 -0
- package/dist/client.js.map +1 -0
- package/dist/contacts.d.ts +43 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +46 -0
- package/dist/contacts.js.map +1 -0
- package/dist/definition-set.d.ts +731 -0
- package/dist/definition-set.d.ts.map +1 -0
- package/dist/definition-set.js +659 -0
- package/dist/definition-set.js.map +1 -0
- package/dist/definitions.d.ts +42 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +154 -0
- package/dist/definitions.js.map +1 -0
- package/dist/enrolment.d.ts +9 -0
- package/dist/enrolment.d.ts.map +1 -0
- package/dist/enrolment.js +8 -0
- package/dist/enrolment.js.map +1 -0
- package/dist/fill.d.ts +73 -0
- package/dist/fill.d.ts.map +1 -0
- package/dist/fill.js +46 -0
- package/dist/fill.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications.d.ts +33 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +36 -0
- package/dist/notifications.js.map +1 -0
- package/dist/oidc.d.ts +122 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +150 -0
- package/dist/oidc.js.map +1 -0
- package/dist/overlay.d.ts +109 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +58 -0
- package/dist/overlay.js.map +1 -0
- package/dist/passes.d.ts +95 -0
- package/dist/passes.d.ts.map +1 -0
- package/dist/passes.js +140 -0
- package/dist/passes.js.map +1 -0
- package/dist/portal-options.d.ts +65 -0
- package/dist/portal-options.d.ts.map +1 -0
- package/dist/portal-options.js +120 -0
- package/dist/portal-options.js.map +1 -0
- package/dist/reads.d.ts +41 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +44 -0
- package/dist/reads.js.map +1 -0
- package/dist/recovery-words.d.ts +8 -0
- package/dist/recovery-words.d.ts.map +1 -0
- package/dist/recovery-words.js +136 -0
- package/dist/recovery-words.js.map +1 -0
- package/dist/recovery.d.ts +198 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +112 -0
- package/dist/recovery.js.map +1 -0
- package/dist/reveal.d.ts +35 -0
- package/dist/reveal.d.ts.map +1 -0
- package/dist/reveal.js +66 -0
- package/dist/reveal.js.map +1 -0
- package/dist/seal.d.ts +15 -0
- package/dist/seal.d.ts.map +1 -0
- package/dist/seal.js +0 -0
- package/dist/seal.js.map +1 -0
- package/dist/session.d.ts +66 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +61 -0
- package/dist/session.js.map +1 -0
- package/dist/signing-in-mark.d.ts +14 -0
- package/dist/signing-in-mark.d.ts.map +1 -0
- package/dist/signing-in-mark.js +24 -0
- package/dist/signing-in-mark.js.map +1 -0
- package/dist/signing-in.d.ts +22 -0
- package/dist/signing-in.d.ts.map +1 -0
- package/dist/signing-in.js +203 -0
- package/dist/signing-in.js.map +1 -0
- package/dist/tags.d.ts +96 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +88 -0
- package/dist/tags.js.map +1 -0
- package/dist/tenant-subscription.d.ts +47 -0
- package/dist/tenant-subscription.d.ts.map +1 -0
- package/dist/tenant-subscription.js +7 -0
- package/dist/tenant-subscription.js.map +1 -0
- package/dist/testing/index.d.ts +125 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +320 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/theme.d.ts +237 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +504 -0
- package/dist/theme.js.map +1 -0
- package/dist/tickets.d.ts +152 -0
- package/dist/tickets.d.ts.map +1 -0
- package/dist/tickets.js +65 -0
- package/dist/tickets.js.map +1 -0
- package/dist/tiers.d.ts +168 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +341 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +885 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/urlid.d.ts +50 -0
- package/dist/urlid.d.ts.map +1 -0
- package/dist/urlid.js +78 -0
- package/dist/urlid.js.map +1 -0
- package/dist/version.d.ts +15 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/make/asturiu.mk +43 -0
- package/package.json +63 -4
- package/src/branding.ts +221 -0
- package/src/changesets.ts +61 -0
- package/src/cli/bin.ts +12 -0
- package/src/cli/changesets.ts +233 -0
- package/src/cli/cli.ts +425 -0
- package/src/cli/context.ts +299 -0
- package/src/cli/engine.ts +112 -0
- package/src/cli/feedback.ts +406 -0
- package/src/cli/files.ts +371 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/overview.ts +343 -0
- package/src/cli/parts.ts +371 -0
- package/src/cli/sources.ts +111 -0
- package/src/cli/terminal.ts +384 -0
- package/src/cli/ui-page.ts +215 -0
- package/src/cli/ui.ts +266 -0
- package/src/client.ts +202 -0
- package/src/contacts.ts +61 -0
- package/src/definition-set.ts +965 -0
- package/src/definitions.ts +156 -0
- package/src/enrolment.ts +10 -0
- package/src/fill.ts +83 -0
- package/src/index.ts +38 -0
- package/src/notifications.ts +55 -0
- package/src/oidc.ts +199 -0
- package/src/overlay.ts +137 -0
- package/src/passes.ts +168 -0
- package/src/portal-options.ts +125 -0
- package/src/reads.ts +71 -0
- package/src/recovery-words.ts +137 -0
- package/src/recovery.ts +269 -0
- package/src/reveal.ts +72 -0
- package/src/seal.ts +0 -0
- package/src/session.ts +93 -0
- package/src/signing-in-mark.ts +23 -0
- package/src/signing-in.ts +213 -0
- package/src/tags.ts +146 -0
- package/src/tenant-subscription.ts +44 -0
- package/src/testing/index.ts +337 -0
- package/src/theme.ts +628 -0
- package/src/tickets.ts +195 -0
- package/src/tiers.ts +397 -0
- package/src/types.ts +847 -0
- package/src/urlid.ts +77 -0
- package/src/version.ts +15 -0
- package/templates/asturiu/branding.json +4 -0
- package/templates/asturiu/definitions.json +23 -0
- 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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"}
|