@owlmeans/client-auth 0.1.18-rc.59 → 0.1.18-rc.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@ legacy). The server-side counterpart is `@owlmeans/server-auth`.
12
12
  ## Installation
13
13
 
14
14
  ```bash
15
- bun add @owlmeans/client-auth@^0.1.18-rc.59
15
+ bun add @owlmeans/client-auth@^0.1.18-rc.60
16
16
  ```
17
17
 
18
18
  ## Concepts
@@ -322,7 +322,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
322
322
  your project's skill store (`.agents/skills/`):
323
323
 
324
324
  ```sh
325
- npx @owlmeans/agent-skills@^0.1.18-rc.51
325
+ npx @owlmeans/agent-skills@^0.1.18-rc.52
326
326
  ```
327
327
 
328
328
  The embedded files are version-matched to this package release. Do not edit them
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/client-auth",
4
- "version": "0.1.18-rc.59",
5
- "generatedAt": "2026-10-06T11:45:57.652Z",
4
+ "version": "0.1.18-rc.60",
5
+ "generatedAt": "2026-10-08T21:27:54.282Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/client-auth
9
9
 
10
10
  **Layer:** Client
11
- **Install:** `"@owlmeans/client-auth": "^0.1.18-rc.59"` in `dependencies`
11
+ **Install:** `"@owlmeans/client-auth": "^0.1.18-rc.60"` in `dependencies`
12
12
 
13
13
  Five subpaths, five jobs:
14
14
 
@@ -90,7 +90,7 @@ browsing context the round trip can complete at all.
90
90
  | `loginLandingOf(ctx)` → `.landAfterLogin(opts?)`, `.continueLogin(opts?)`, `.landingUrl(landing)`; `useContinueLogin()` | The post-login landing decision (`src/login/land.ts`) — see `login-plugins`. `landAfterLogin` runs due landing hooks then delegates to `continueLogin`, which walks pending `LoginStep`s, then `flowLandingOf(ctx).resumeSuspendedFlow`, then `LandOptions.fallback ?? { alias: HOME }`; `landingUrl` builds the absolute URL a plugin's own `window.location.href` needs; `useContinueLogin()` is what a step's own screen calls once satisfied |
91
91
  | `LoginStep`, `LoginLanding`, `LoginLandingHook`, `LandOptions`, `LoginLandingParams` | Landing-seam types. `registerStep`/`steps`/`onLanded`/`landingHooks` on `LoginService` are the same replace-by-alias, priority-sorted registries as `registerPlugin`. `LoginStep` also carries `confirmsTerms?: boolean` (this step is where the Terms confirmation lives — see `loginTermsHelper.termsDeferred` below) and `required?: boolean` (a throw/timeout in `pending` reads as PENDING, not "not pending" — see `login-plugins`) |
92
92
  | `LOGIN_STEP_TIMEOUT`, `LOGIN_LANDED_STORAGE` | A step's `pending`/a hook's `landed` is bounded by the former; the latter is where the last-landed token is recorded (the raw string, never a digest) |
93
- | `loginTermsHelper` → `.resolveTerms`, `.termsAccepted`, `.acceptTerms`, `.termsSentence`, `ResolvedTerms`, `ResolvedTermsDocument`, `TermsSentencePart` | The confirmation. `resolveTerms` produces `documents` (what the checkbox agrees to: terms, then billing/product/custom when configured) and `notices` (what is only disclosed: privacy, plus cookies per its own inclusion rule) — see the terms-confirmation section of `login-methods`. The extra `LoginTermsConfig` fields (`billing`, `product`, `documents`, `revisions`, `showRevision`) are added by module augmentation in `src/login/terms-config.ts`, never by editing `@owlmeans/config` — importing anything from `@owlmeans/client-auth/login` pulls it in |
93
+ | `loginTermsHelper` → `.resolveTerms`, `.termsAccepted`, `.acceptTerms`, `.termsSentence`, `ResolvedTerms`, `ResolvedTermsDocument`, `TermsSentencePart` | The confirmation. `resolveTerms` produces `documents` (what the checkbox agrees to: terms, then billing/product/custom when configured) and `notices` (what is only disclosed: privacy, plus cookies per its own inclusion rule) — see the terms-confirmation section of `login-methods`. The extra `LoginTermsConfig` fields (`billing`, `product`, `documents`, `revisions`, `showRevision`, `localizedHrefs`) are added by module augmentation in `src/login/terms-config.ts`, never by editing `@owlmeans/config` — importing anything from `@owlmeans/client-auth/login` pulls it in |
94
94
  | `loginTermsHelper.termsLabelResolver(translate, locale)`, `loginTermsHelper.termsAcceptanceOf(resolved, locale?)`, `TermsAcceptanceRef` | The ONE document-label resolver and ONE wire-shape builder every terms renderer/recorder shares (`FallbackLoginScreen`, `web-panel`'s `LoginTerms`, `web-marketing-consent`'s Terms box and `termsRecorder`) — no more hand-kept duplicate `DEFAULT_LABEL`/`resolveLabelFor` per package. `termsAcceptanceOf` keeps only `{key, href, revisedAt}` per document — structurally `@owlmeans/marketing-consent`'s `TermsAcceptance`, with no dependency on that package |
95
95
  | `loginTermsHelper.termsDeferred(ctx)` | True once a registered AND BOUND `LoginStep` declares `confirmsTerms` — see the "Deferring the confirmation" section of `login-methods`. Reads `ctx.hasService`/`.hasEntrypoint` directly, never `ensureLoginService` (which has the side effect of registering an empty host) |
96
96
  | `resolveCredit`, `ResolvedCredit` | The credit and copyright line |
@@ -159,6 +159,12 @@ a web application only calls these when it builds its context by hand.
159
159
 
160
160
  ## Rules
161
161
 
162
+ - An application's translated legal destinations are opt-in `login.terms.localizedHrefs`, keyed by
163
+ document/notice key, then locale. `loginTermsHelper.termsHrefOf(doc, locale?)` selects the exact
164
+ configured locale, then its base language, then `doc.href`. `termsSentence` and `termsAcceptanceOf`
165
+ share that resolver: pass the same live UI language to both. The canonical href and revisions still
166
+ determine the agreement digest; translations alone never ask for a new acceptance. Supply known
167
+ published destinations, never infer another application's URL layout. Omitted maps preserve defaults.
162
168
  - The bearer token lives in the `AUTH_RESOURCE` resource under the single id `USER_ID`. Read and
163
169
  write it through the auth service or through `loginTokenOf(ctx).adoptToken` / `.revokeToken`;
164
170
  hand-written storage access drifts from the envelope decoding that happens beside it.
@@ -4,6 +4,8 @@ import type { LoginContext } from '../types.js';
4
4
  export interface ResolvedTermsDocument {
5
5
  key: string;
6
6
  href: string;
7
+ /** Published translations, selected at render/record time; `href` remains canonical. */
8
+ hrefMap?: Record<string, string>;
7
9
  /** A caller's own label, already resolved to one string — only ever set for a custom document. */
8
10
  label?: string;
9
11
  /** A locale map for the label, when the config supplied one — resolved by the renderer, not here. */
@@ -74,6 +76,8 @@ export interface LoginTermsHelper {
74
76
  * exactly one place instead of two hand-kept copies.
75
77
  */
76
78
  termsLabelResolver: (translate: (key: string, defaultValue: string) => string, locale: string | undefined) => (doc: ResolvedTermsDocument) => string;
79
+ /** Explicit locale destination, then base language, then canonical href; never rewrites paths. */
80
+ termsHrefOf: (doc: ResolvedTermsDocument, locale?: string) => string;
77
81
  /**
78
82
  * What a sign-in-time terms acceptance sends the server — structurally
79
83
  * `@owlmeans/marketing-consent`'s `TermsAcceptance`, so `client.recordTerms(termsAcceptanceOf(...))`
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/login/terms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/login/terms/types.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,12 @@ declare module '@owlmeans/config' {
27
27
  interface LoginTermsConfig {
28
28
  /** `documents[].key` (or a custom document's own key) → the ISO date it was last revised. */
29
29
  revisions?: Record<string, string>;
30
+ /**
31
+ * Document/notice key → locale → published href. Opt-in; omitted locales use the canonical
32
+ * href. Renderers and acceptance evidence resolve the same current locale, while these
33
+ * translated destinations leave the canonical agreement version and revisions unchanged.
34
+ */
35
+ localizedHrefs?: Record<string, Record<string, string>>;
30
36
  /** Off by default. A bare string is `{ href }`. */
31
37
  billing?: string | {
32
38
  href: string;
@@ -1 +1 @@
1
- {"version":3,"file":"terms-config.d.ts","sourceRoot":"","sources":["../../src/login/terms-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,QAAQ,kBAAkB,CAAC;IAChC,UAAU,gBAAgB;QACxB,6FAA6F;QAC7F,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC,mDAAmD;QACnD,OAAO,CAAC,EAAE,MAAM,GAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,KAAK,CAAA;QAC/D,yFAAyF;QACzF,OAAO,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,KAAK,CAAA;QACpE;;;;;WAKG;QACH,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YACrF,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAA;QACF,6EAA6E;QAC7E,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB;CACF;AAED,OAAO,EAAG,CAAA"}
1
+ {"version":3,"file":"terms-config.d.ts","sourceRoot":"","sources":["../../src/login/terms-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,QAAQ,kBAAkB,CAAC;IAChC,UAAU,gBAAgB;QACxB,6FAA6F;QAC7F,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAClC;;;;WAIG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QACvD,mDAAmD;QACnD,OAAO,CAAC,EAAE,MAAM,GAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,KAAK,CAAA;QAC/D,yFAAyF;QACzF,OAAO,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,KAAK,CAAA;QACpE;;;;;WAKG;QACH,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YACrF,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC,CAAA;QACF,6EAA6E;QAC7E,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB;CACF;AAED,OAAO,EAAG,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/login/terms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EACV,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAChG,MAAM,kBAAkB,CAAA;AACzB,OAAO,mBAAmB,CAAA;AAG1B,eAAO,MAAM,sBAAsB,QAAO,gBA8PzC,CAAA;AAED,eAAO,MAAM,gBAAgB,kBAA2B,CAAA;AAExD,mFAAmF;AACnF,eAAO,MAAM,YAAY,SAAU,gBAAgB,GAAG,KAAK,KAAG,aAAa,GAAG,IAA0C,CAAA;AAExH,oFAAoF;AACpF,eAAO,MAAM,aAAa,aAAc,aAAa,GAAG,IAAI,KAAG,OAAmD,CAAA;AAElH,kFAAkF;AAClF,eAAO,MAAM,WAAW,aAAc,aAAa,GAAG,IAAI,YAAY,OAAO,KAAG,IAC9B,CAAA;AAElD,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,cAClB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,UAAU,MAAM,GAAG,SAAS,KACnF,CAAC,CAAC,GAAG,EAAE,qBAAqB,KAAK,MAAM,CAA2D,CAAA;AAErG,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,aAClB,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,WAAW,MAAM,KAClF,oBAA4E,CAAA;AAE/E,oFAAoF;AACpF,eAAO,MAAM,aAAa,QAAS,YAAY,KAAG,OAA8C,CAAA;AAEhG,oFAAoF;AACpF,eAAO,MAAM,aAAa,aACd,MAAM,YACN,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC,UAC9C,MAAM,GAAG,SAAS,gBACZ,CAAC,GAAG,EAAE,qBAAqB,KAAK,MAAM,KACnD,iBAAiB,EAA8E,CAAA"}
1
+ {"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/login/terms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExH,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EACV,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAChG,MAAM,kBAAkB,CAAA;AACzB,OAAO,mBAAmB,CAAA;AAG1B,eAAO,MAAM,sBAAsB,QAAO,gBAgRzC,CAAA;AAED,eAAO,MAAM,gBAAgB,kBAA2B,CAAA;AAExD,mFAAmF;AACnF,eAAO,MAAM,YAAY,SAAU,gBAAgB,GAAG,KAAK,KAAG,aAAa,GAAG,IAA0C,CAAA;AAExH,oFAAoF;AACpF,eAAO,MAAM,aAAa,aAAc,aAAa,GAAG,IAAI,KAAG,OAAmD,CAAA;AAElH,kFAAkF;AAClF,eAAO,MAAM,WAAW,aAAc,aAAa,GAAG,IAAI,YAAY,OAAO,KAAG,IAC9B,CAAA;AAElD,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,cAClB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,UAAU,MAAM,GAAG,SAAS,KACnF,CAAC,CAAC,GAAG,EAAE,qBAAqB,KAAK,MAAM,CAA2D,CAAA;AAErG,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,aAClB,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,WAAW,MAAM,KAClF,oBAA4E,CAAA;AAE/E,oFAAoF;AACpF,eAAO,MAAM,aAAa,QAAS,YAAY,KAAG,OAA8C,CAAA;AAEhG,oFAAoF;AACpF,eAAO,MAAM,aAAa,aACd,MAAM,YACN,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC,UAC9C,MAAM,GAAG,SAAS,gBACZ,CAAC,GAAG,EAAE,qBAAqB,KAAK,MAAM,KACnD,iBAAiB,EAA8E,CAAA"}
@@ -86,10 +86,24 @@ export const createLoginTermsHelper = () => {
86
86
  required: cfg?.required ?? true,
87
87
  terms, privacy, cookies,
88
88
  version: cfg?.version ?? digest(digestInput),
89
- documents, notices, showRevision,
89
+ // Translations are alternate destinations for this canonical revision, not a new agreement.
90
+ documents: documents.map(doc => withLocalizedHrefs(doc, cfg)),
91
+ notices: notices.map(doc => withLocalizedHrefs(doc, cfg)),
92
+ showRevision,
90
93
  ...(revisedAt != null ? { revisedAt } : {}),
91
94
  };
92
95
  };
96
+ const withLocalizedHrefs = (doc, cfg) => {
97
+ const hrefMap = cfg?.localizedHrefs?.[doc.key];
98
+ return hrefMap != null ? { ...doc, hrefMap } : doc;
99
+ };
100
+ const termsHrefOf = (doc, locale) => {
101
+ const localized = locale != null
102
+ ? doc.hrefMap?.[locale] ?? doc.hrefMap?.[locale.toLowerCase()]
103
+ ?? doc.hrefMap?.[locale.split('-')[0].toLowerCase()]
104
+ : undefined;
105
+ return typeof localized === 'string' && localized.trim() !== '' ? localized : doc.href;
106
+ };
93
107
  const termsAccepted = (resolved) => {
94
108
  if (resolved == null || !resolved.required) {
95
109
  return true;
@@ -131,8 +145,8 @@ export const createLoginTermsHelper = () => {
131
145
  return label;
132
146
  };
133
147
  const termsAcceptanceOf = (resolved, locale) => ({
134
- documents: resolved.documents.map(doc => ({ key: doc.key, href: doc.href, revisedAt: doc.revisedAt })),
135
- notices: resolved.notices.map(doc => ({ key: doc.key, href: doc.href, revisedAt: doc.revisedAt })),
148
+ documents: resolved.documents.map(doc => ({ key: doc.key, href: termsHrefOf(doc, locale), revisedAt: doc.revisedAt })),
149
+ notices: resolved.notices.map(doc => ({ key: doc.key, href: termsHrefOf(doc, locale), revisedAt: doc.revisedAt })),
136
150
  version: resolved.version,
137
151
  ...(locale != null ? { locale } : {}),
138
152
  });
@@ -155,7 +169,7 @@ export const createLoginTermsHelper = () => {
155
169
  return formatter.formatToParts(labels).map(part => {
156
170
  if (part.type === 'element') {
157
171
  const doc = docs[cursor++];
158
- return { text: part.value, href: doc.href, documentKey: doc.key };
172
+ return { text: part.value, href: termsHrefOf(doc, locale), documentKey: doc.key };
159
173
  }
160
174
  return { text: part.value };
161
175
  });
@@ -165,7 +179,7 @@ export const createLoginTermsHelper = () => {
165
179
  if (index > 0) {
166
180
  parts.push({ text: index === docs.length - 1 ? ' and ' : ', ' });
167
181
  }
168
- parts.push({ text: labels[index], href: doc.href, documentKey: doc.key });
182
+ parts.push({ text: labels[index], href: termsHrefOf(doc, locale), documentKey: doc.key });
169
183
  });
170
184
  return parts;
171
185
  };
@@ -189,7 +203,7 @@ export const createLoginTermsHelper = () => {
189
203
  else {
190
204
  const doc = byKey(token);
191
205
  if (doc != null) {
192
- parts.push({ text: resolveLabel(doc), href: doc.href, documentKey: doc.key });
206
+ parts.push({ text: resolveLabel(doc), href: termsHrefOf(doc, locale), documentKey: doc.key });
193
207
  }
194
208
  }
195
209
  lastIndex = placeholder.lastIndex;
@@ -200,7 +214,7 @@ export const createLoginTermsHelper = () => {
200
214
  return parts;
201
215
  };
202
216
  return {
203
- resolveTerms, termsAccepted, acceptTerms, termsLabelResolver, termsAcceptanceOf, termsDeferred, termsSentence,
217
+ resolveTerms, termsAccepted, acceptTerms, termsLabelResolver, termsHrefOf, termsAcceptanceOf, termsDeferred, termsSentence,
204
218
  };
205
219
  };
206
220
  export const loginTermsHelper = createLoginTermsHelper();
@@ -1 +1 @@
1
- {"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/login/terms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,kBAAkB,EAAyB,MAAM,kBAAkB,CAAA;AACxH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKhE,OAAO,mBAAmB,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAqB,EAAE;IAC3D;;;;;;;;;;OAUG;IACH,MAAM,MAAM,GAAG,CAAC,KAAe,EAAU,EAAE;QACzC,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACtD,CAAC;QAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CACpB,GAA6C,EAAE,SAA6B,EACrD,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IAE3E,MAAM,YAAY,GAAG,CAAC,GAA8B,EAAwB,EAAE;QAC5E,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,EAAE,KAAK,IAAI,kBAAkB,CAAA;QAC9C,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,oBAAoB,CAAA;QACpD,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,oBAAoB,CAAA;QAEpD,MAAM,SAAS,GAA4B;YACzC,aAAa,CACX,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CACnF;SACF,CAAA;QAED,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAA;YACrF,SAAS,CAAC,IAAI,CAAC,aAAa,CAC1B,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB,EAAE,EACtE,GAAG,EAAE,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,SAAS,CAC7C,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,aAAa,CAC1B;gBACE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB;gBACtE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;aACtC,EACD,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,EAAE,SAAS,EAAE,OAAO,CACjD,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,GAAG,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;YAC1C,SAAS,CAAC,IAAI,CAAC,aAAa,CAC1B;gBACE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI;gBAClC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/F,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,EACD,MAAM,CAAC,SAAS,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC,CAAA;QACJ,CAAC;QAED,gGAAgG;QAChG,iGAAiG;QACjG,gEAAgE;QAChE,MAAM,UAAU,GAAG,KAAK,KAAK,kBAAkB,IAAI,OAAO,KAAK,oBAAoB;eAC9E,OAAO,KAAK,oBAAoB,CAAA;QACrC,MAAM,cAAc,GAAG,GAAG,EAAE,OAAO,IAAI,IAAI,IAAI,UAAU,CAAA;QAEzD,MAAM,OAAO,GAA4B;YACvC,aAAa,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC;YACzG,GAAG,CAAC,cAAc;gBAChB,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC7G,CAAC,CAAC,EAAE,CAAC;SACR,CAAA;QAED,iGAAiG;QACjG,sEAAsE;QACtE,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACxB,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC1B,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,EAAE,YAAY,KAAK,IAAI,CAAA;QAC/C,MAAM,eAAe,GAAG,SAAS;aAC9B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;aACzB,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,YAAY,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;YAC1D,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YACnE,CAAC,CAAC,SAAS,CAAA;QAEb,OAAO;YACL,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,IAAI;YAC/B,KAAK,EAAE,OAAO,EAAE,OAAO;YACvB,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,WAAW,CAAC;YAC5C,SAAS,EAAE,OAAO,EAAE,YAAY;YAChC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAA;IACH,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CAAC,QAA8B,EAAW,EAAE;QAChE,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAA;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,2FAA2F;YAC3F,yFAAyF;YACzF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,QAA8B,EAAE,QAAiB,EAAQ,EAAE;QAC9E,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,IAAI,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,wDAAwD,CAAC,CAAC;IACtE,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,CACzB,SAAwD,EAAE,MAA0B,EACpF,EAAE,CAAC,CAAC,GAA0B,EAAU,EAAE;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI;YAClC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO;eAC3B,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEhG,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CACxB,QAAkE,EAAE,MAAe,EAC7D,EAAE,CAAC,CAAC;QAC1B,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACtG,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAClG,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,CAAC,GAAiB,EAAW,EAAE,CACnD,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;WAC1B,GAAG,CAAC,OAAO,CAAe,aAAa,CAAC,CAAC,KAAK,EAAE;aAChD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IAEpF;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,CACzB,IAA6B,EAAE,MAA0B,EAAE,YAAoD,EAC1F,EAAE;QACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,CAAA;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAErC,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACzE,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;YAErF,OAAO,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBAChD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;oBAE1B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;gBACnE,CAAC;gBAED,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;YAC7B,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,KAAK,GAAwB,EAAE,CAAA;QACrC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3E,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,CACpB,QAAgB,EAChB,QAAsD,EACtD,MAA0B,EAC1B,YAAoD,EAC/B,EAAE;QACvB,MAAM,KAAK,GAAG,CAAC,GAAW,EAAqC,EAAE,CAC/D,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;QAElG,MAAM,WAAW,GAAG,oDAAoD,CAAA;QACxE,MAAM,KAAK,GAAwB,EAAE,CAAA;QACrC,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,KAA6B,CAAA;QAEjC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACpD,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;YAC7E,CAAC;iBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;gBACxB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;YAED,SAAS,GAAG,WAAW,CAAC,SAAS,CAAA;QACnC,CAAC;QACD,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,OAAO;QACL,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa;KAC9G,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAA;AAExD,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAA8B,EAAwB,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AAExH,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAA8B,EAAW,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;AAElH,kFAAkF;AAClF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAA8B,EAAE,QAAiB,EAAQ,EAAE,CACrF,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAElD,yFAAyF;AACzF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAwD,EAAE,MAA0B,EAC1C,EAAE,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;AAErG,wFAAwF;AACxF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAkE,EAAE,MAAe,EAC7D,EAAE,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;AAE/E,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAiB,EAAW,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAEhG,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAgB,EAChB,QAAsD,EACtD,MAA0B,EAC1B,YAAoD,EAC/B,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA"}
1
+ {"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/login/terms.ts"],"names":[],"mappings":"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"}
@@ -174,7 +174,7 @@ export interface LoginScreenProps {
174
174
  */
175
175
  translate?: (key: string, defaultValue: string) => string;
176
176
  /**
177
- * The current language, for `Intl.ListFormat` and a custom document's own locale-keyed label.
177
+ * The current language, for `Intl.ListFormat`, locale-keyed document labels and explicit hrefs.
178
178
  *
179
179
  * A prop for the same reason `translate` is: a component that reaches for an i18n context
180
180
  * directly crashes the whole render in an app mounted without one.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/client-auth",
3
- "version": "0.1.18-rc.59",
3
+ "version": "0.1.18-rc.60",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -50,27 +50,27 @@
50
50
  }
51
51
  },
52
52
  "dependencies": {
53
- "@owlmeans/auth": "^0.1.18-rc.40",
54
- "@owlmeans/auth-common": "^0.1.18-rc.48",
55
- "@owlmeans/basic-envelope": "^0.1.18-rc.47",
56
- "@owlmeans/basic-keys": "^0.1.18-rc.49",
57
- "@owlmeans/client": "^0.1.18-rc.52",
58
- "@owlmeans/client-context": "^0.1.18-rc.49",
59
- "@owlmeans/client-entrypoint": "^0.1.18-rc.48",
60
- "@owlmeans/client-flow": "^0.1.18-rc.55",
61
- "@owlmeans/client-resource": "^0.1.18-rc.48",
62
- "@owlmeans/client-socket": "^0.1.18-rc.50",
53
+ "@owlmeans/auth": "^0.1.18-rc.41",
54
+ "@owlmeans/auth-common": "^0.1.18-rc.49",
55
+ "@owlmeans/basic-envelope": "^0.1.18-rc.48",
56
+ "@owlmeans/basic-keys": "^0.1.18-rc.50",
57
+ "@owlmeans/client": "^0.1.18-rc.53",
58
+ "@owlmeans/client-context": "^0.1.18-rc.50",
59
+ "@owlmeans/client-entrypoint": "^0.1.18-rc.49",
60
+ "@owlmeans/client-flow": "^0.1.18-rc.56",
61
+ "@owlmeans/client-resource": "^0.1.18-rc.49",
62
+ "@owlmeans/client-socket": "^0.1.18-rc.51",
63
63
  "@owlmeans/config": "^0.1.18-rc.44",
64
64
  "@owlmeans/context": "^0.1.18-rc.34",
65
- "@owlmeans/did": "^0.1.18-rc.47",
65
+ "@owlmeans/did": "^0.1.18-rc.48",
66
66
  "@owlmeans/entrypoint": "^0.1.18-rc.41",
67
67
  "@owlmeans/error": "^0.1.18-rc.38",
68
68
  "@owlmeans/flow": "^0.1.18-rc.45",
69
69
  "@owlmeans/i18n": "^0.1.18-rc.39",
70
- "@owlmeans/log": "^0.1.18-rc.2",
70
+ "@owlmeans/log": "^0.1.18-rc.3",
71
71
  "@owlmeans/resource": "^0.1.18-rc.40",
72
- "@owlmeans/socket": "^0.1.18-rc.41",
73
- "@owlmeans/web-flow": "^0.1.18-rc.54",
72
+ "@owlmeans/socket": "^0.1.18-rc.42",
73
+ "@owlmeans/web-flow": "^0.1.18-rc.55",
74
74
  "@scure/base": "^2.4.0"
75
75
  },
76
76
  "peerDependencies": {
@@ -79,7 +79,7 @@
79
79
  },
80
80
  "devDependencies": {
81
81
  "@owlmeans/dep-config": "workspace:*",
82
- "@owlmeans/test-auth": "^0.1.18-rc.47",
82
+ "@owlmeans/test-auth": "^0.1.18-rc.48",
83
83
  "@types/bun": "^1.4.2",
84
84
  "@types/react": "^19.3.0",
85
85
  "nodemon": "^3.1.14",
@@ -5,6 +5,8 @@ import type { LoginContext } from '../types.js'
5
5
  export interface ResolvedTermsDocument {
6
6
  key: string
7
7
  href: string
8
+ /** Published translations, selected at render/record time; `href` remains canonical. */
9
+ hrefMap?: Record<string, string>
8
10
  /** A caller's own label, already resolved to one string — only ever set for a custom document. */
9
11
  label?: string
10
12
  /** A locale map for the label, when the config supplied one — resolved by the renderer, not here. */
@@ -82,6 +84,8 @@ export interface LoginTermsHelper {
82
84
  termsLabelResolver: (
83
85
  translate: (key: string, defaultValue: string) => string, locale: string | undefined
84
86
  ) => (doc: ResolvedTermsDocument) => string
87
+ /** Explicit locale destination, then base language, then canonical href; never rewrites paths. */
88
+ termsHrefOf: (doc: ResolvedTermsDocument, locale?: string) => string
85
89
  /**
86
90
  * What a sign-in-time terms acceptance sends the server — structurally
87
91
  * `@owlmeans/marketing-consent`'s `TermsAcceptance`, so `client.recordTerms(termsAcceptanceOf(...))`
@@ -27,6 +27,12 @@ declare module '@owlmeans/config' {
27
27
  interface LoginTermsConfig {
28
28
  /** `documents[].key` (or a custom document's own key) → the ISO date it was last revised. */
29
29
  revisions?: Record<string, string>
30
+ /**
31
+ * Document/notice key → locale → published href. Opt-in; omitted locales use the canonical
32
+ * href. Renderers and acceptance evidence resolve the same current locale, while these
33
+ * translated destinations leave the canonical agreement version and revisions unchanged.
34
+ */
35
+ localizedHrefs?: Record<string, Record<string, string>>
30
36
  /** Off by default. A bare string is `{ href }`. */
31
37
  billing?: string | { href: string, revisedAt?: string } | false
32
38
  /** Off by default. `name` is interpolated into the `login.terms.product` translation. */
@@ -116,11 +116,29 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
116
116
  required: cfg?.required ?? true,
117
117
  terms, privacy, cookies,
118
118
  version: cfg?.version ?? digest(digestInput),
119
- documents, notices, showRevision,
119
+ // Translations are alternate destinations for this canonical revision, not a new agreement.
120
+ documents: documents.map(doc => withLocalizedHrefs(doc, cfg)),
121
+ notices: notices.map(doc => withLocalizedHrefs(doc, cfg)),
122
+ showRevision,
120
123
  ...(revisedAt != null ? { revisedAt } : {}),
121
124
  }
122
125
  }
123
126
 
127
+ const withLocalizedHrefs = (doc: ResolvedTermsDocument, cfg?: LoginTermsConfig): ResolvedTermsDocument => {
128
+ const hrefMap = cfg?.localizedHrefs?.[doc.key]
129
+
130
+ return hrefMap != null ? { ...doc, hrefMap } : doc
131
+ }
132
+
133
+ const termsHrefOf = (doc: ResolvedTermsDocument, locale?: string): string => {
134
+ const localized = locale != null
135
+ ? doc.hrefMap?.[locale] ?? doc.hrefMap?.[locale.toLowerCase()]
136
+ ?? doc.hrefMap?.[locale.split('-')[0].toLowerCase()]
137
+ : undefined
138
+
139
+ return typeof localized === 'string' && localized.trim() !== '' ? localized : doc.href
140
+ }
141
+
124
142
  const termsAccepted = (resolved: ResolvedTerms | null): boolean => {
125
143
  if (resolved == null || !resolved.required) {
126
144
  return true
@@ -168,8 +186,8 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
168
186
  const termsAcceptanceOf = (
169
187
  resolved: Pick<ResolvedTerms, 'documents' | 'notices' | 'version'>, locale?: string
170
188
  ): LoginTermsAcceptance => ({
171
- documents: resolved.documents.map(doc => ({ key: doc.key, href: doc.href, revisedAt: doc.revisedAt })),
172
- notices: resolved.notices.map(doc => ({ key: doc.key, href: doc.href, revisedAt: doc.revisedAt })),
189
+ documents: resolved.documents.map(doc => ({ key: doc.key, href: termsHrefOf(doc, locale), revisedAt: doc.revisedAt })),
190
+ notices: resolved.notices.map(doc => ({ key: doc.key, href: termsHrefOf(doc, locale), revisedAt: doc.revisedAt })),
173
191
  version: resolved.version,
174
192
  ...(locale != null ? { locale } : {}),
175
193
  })
@@ -200,7 +218,7 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
200
218
  if (part.type === 'element') {
201
219
  const doc = docs[cursor++]
202
220
 
203
- return { text: part.value, href: doc.href, documentKey: doc.key }
221
+ return { text: part.value, href: termsHrefOf(doc, locale), documentKey: doc.key }
204
222
  }
205
223
 
206
224
  return { text: part.value }
@@ -212,7 +230,7 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
212
230
  if (index > 0) {
213
231
  parts.push({ text: index === docs.length - 1 ? ' and ' : ', ' })
214
232
  }
215
- parts.push({ text: labels[index], href: doc.href, documentKey: doc.key })
233
+ parts.push({ text: labels[index], href: termsHrefOf(doc, locale), documentKey: doc.key })
216
234
  })
217
235
 
218
236
  return parts
@@ -245,7 +263,7 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
245
263
  } else {
246
264
  const doc = byKey(token)
247
265
  if (doc != null) {
248
- parts.push({ text: resolveLabel(doc), href: doc.href, documentKey: doc.key })
266
+ parts.push({ text: resolveLabel(doc), href: termsHrefOf(doc, locale), documentKey: doc.key })
249
267
  }
250
268
  }
251
269
 
@@ -259,7 +277,7 @@ export const createLoginTermsHelper = (): LoginTermsHelper => {
259
277
  }
260
278
 
261
279
  return {
262
- resolveTerms, termsAccepted, acceptTerms, termsLabelResolver, termsAcceptanceOf, termsDeferred, termsSentence,
280
+ resolveTerms, termsAccepted, acceptTerms, termsLabelResolver, termsHrefOf, termsAcceptanceOf, termsDeferred, termsSentence,
263
281
  }
264
282
  }
265
283
 
@@ -189,7 +189,7 @@ export interface LoginScreenProps {
189
189
  */
190
190
  translate?: (key: string, defaultValue: string) => string
191
191
  /**
192
- * The current language, for `Intl.ListFormat` and a custom document's own locale-keyed label.
192
+ * The current language, for `Intl.ListFormat`, locale-keyed document labels and explicit hrefs.
193
193
  *
194
194
  * A prop for the same reason `translate` is: a component that reaches for an i18n context
195
195
  * directly crashes the whole render in an app mounted without one.
@@ -37,7 +37,7 @@ Comprehensive error handling for authentication scenarios:
37
37
  This manager is part of the `@owlmeans/client-auth` package:
38
38
 
39
39
  ```bash
40
- npm install @owlmeans/client-auth@^0.1.18-rc.59
40
+ npm install @owlmeans/client-auth@^0.1.18-rc.60
41
41
  ```
42
42
 
43
43
  ## API Reference
@@ -253,3 +253,62 @@ describe('termsAcceptanceOf', () => {
253
253
  expect(loginTermsHelper.termsAcceptanceOf(resolved)).not.toHaveProperty('locale')
254
254
  })
255
255
  })
256
+
257
+ describe('explicit localized document destinations', () => {
258
+ const cfg: LoginTermsConfig = {
259
+ terms: 'https://a.test/terms', privacy: 'https://a.test/privacy', cookies: 'https://a.test/cookies',
260
+ billing: 'https://a.test/billing',
261
+ revisions: { terms: '2026-05-30', privacy: '2026-05-30', billing: '2026-10-04' },
262
+ }
263
+ const localizedHrefs = {
264
+ terms: { pl: 'https://a.test/pl/warunki', fr: 'https://a.test/fr/conditions' },
265
+ billing: { pl: 'https://a.test/pl/abonament', fr: 'https://a.test/fr/abonnement' },
266
+ privacy: { pl: 'https://a.test/pl/prywatnosc', fr: 'https://a.test/fr/confidentialite' },
267
+ cookies: { pl: 'https://a.test/pl/cookies', fr: 'https://a.test/fr/cookies' },
268
+ }
269
+
270
+ test('translated paths leave the canonical digest and document revisions unchanged', () => {
271
+ const canonical = loginTermsHelper.resolveTerms(cfg)!
272
+ const localized = loginTermsHelper.resolveTerms({ ...cfg, localizedHrefs })!
273
+
274
+ expect(localized.version).toBe(canonical.version)
275
+ for (const locale of ['pl', 'fr']) {
276
+ const acceptance = loginTermsHelper.termsAcceptanceOf(localized, locale)
277
+ expect(acceptance.version).toBe(canonical.version)
278
+ expect(acceptance.documents.map(doc => doc.revisedAt)).toEqual(canonical.documents.map(doc => doc.revisedAt))
279
+ expect(acceptance.notices.map(doc => doc.revisedAt)).toEqual(canonical.notices.map(doc => doc.revisedAt))
280
+ }
281
+ expect(localized.documents.map(doc => doc.href)).toEqual(canonical.documents.map(doc => doc.href))
282
+ })
283
+
284
+ test('rendered lists, legacy placeholders and recorded evidence select the same PL/FR URLs', () => {
285
+ const resolved = loginTermsHelper.resolveTerms({ ...cfg, localizedHrefs })!
286
+ for (const locale of ['pl', 'fr']) {
287
+ const parts = loginTermsHelper.termsSentence('{{documents}}; {{notices}}', resolved, locale, label)
288
+ const evidence = loginTermsHelper.termsAcceptanceOf(resolved, locale)
289
+ expect(parts.filter(part => part.href != null).map(({ documentKey, href }) => ({ key: documentKey, href })))
290
+ .toEqual([...evidence.documents, ...evidence.notices].map(({ key, href }) => ({ key, href })))
291
+ expect(evidence.documents[0].href).toBe(localizedHrefs.terms[locale as 'pl' | 'fr'])
292
+ expect(evidence.notices[0].href).toBe(localizedHrefs.privacy[locale as 'pl' | 'fr'])
293
+ const legacy = loginTermsHelper.termsSentence('{{terms}} {{privacy}} {{cookies}}', resolved, locale, label)
294
+ expect(legacy.filter(part => part.href != null).map(part => part.href))
295
+ .toEqual([evidence.documents[0].href, ...evidence.notices.map(doc => doc.href)])
296
+ for (const doc of [...evidence.documents, ...evidence.notices]) {
297
+ expect(Object.keys(doc).sort()).toEqual(['href', 'key', 'revisedAt'])
298
+ }
299
+ }
300
+ })
301
+
302
+ test('unmapped/default locales retain canonical destinations; regional tags use a configured base language', () => {
303
+ const canonical = loginTermsHelper.resolveTerms(cfg)!
304
+ const resolved = loginTermsHelper.resolveTerms({ ...cfg, localizedHrefs })!
305
+ for (const locale of [undefined, 'en', 'it']) {
306
+ expect(loginTermsHelper.termsAcceptanceOf(resolved, locale))
307
+ .toEqual(loginTermsHelper.termsAcceptanceOf(canonical, locale))
308
+ }
309
+ expect(loginTermsHelper.termsHrefOf(resolved.documents[0], 'pl-PL')).toBe(localizedHrefs.terms.pl)
310
+ expect(loginTermsHelper.termsHrefOf(resolved.documents[0], 'fr-FR')).toBe(localizedHrefs.terms.fr)
311
+ // Omitted maps never rewrite a customer application's URLs, even in a non-English UI.
312
+ expect(loginTermsHelper.termsHrefOf(canonical.documents[0], 'pl')).toBe(cfg.terms!)
313
+ })
314
+ })