@owlmeans/consent 0.1.18-rc.7 → 0.1.18-rc.8

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 (50) hide show
  1. package/build/consts.d.ts +26 -3
  2. package/build/consts.d.ts.map +1 -1
  3. package/build/consts.js +35 -3
  4. package/build/consts.js.map +1 -1
  5. package/build/functional.d.ts +35 -0
  6. package/build/functional.d.ts.map +1 -0
  7. package/build/functional.js +67 -0
  8. package/build/functional.js.map +1 -0
  9. package/build/i18n/be.json +2 -0
  10. package/build/i18n/de.json +2 -0
  11. package/build/i18n/en.json +2 -0
  12. package/build/i18n/es.json +2 -0
  13. package/build/i18n/fr.json +2 -0
  14. package/build/i18n/pl.json +2 -0
  15. package/build/i18n/ru.json +2 -0
  16. package/build/i18n/uk.json +2 -0
  17. package/build/index.d.ts +3 -2
  18. package/build/index.d.ts.map +1 -1
  19. package/build/index.js +3 -2
  20. package/build/index.js.map +1 -1
  21. package/build/linker.d.ts +25 -2
  22. package/build/linker.d.ts.map +1 -1
  23. package/build/linker.js +135 -30
  24. package/build/linker.js.map +1 -1
  25. package/build/plugins.d.ts +21 -4
  26. package/build/plugins.d.ts.map +1 -1
  27. package/build/plugins.js +16 -0
  28. package/build/plugins.js.map +1 -1
  29. package/build/store.d.ts.map +1 -1
  30. package/build/store.js +48 -6
  31. package/build/store.js.map +1 -1
  32. package/build/types.d.ts +38 -0
  33. package/build/types.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/src/consts.ts +38 -3
  36. package/src/functional.ts +73 -0
  37. package/src/i18n/be.json +2 -0
  38. package/src/i18n/de.json +2 -0
  39. package/src/i18n/en.json +2 -0
  40. package/src/i18n/es.json +2 -0
  41. package/src/i18n/fr.json +2 -0
  42. package/src/i18n/pl.json +2 -0
  43. package/src/i18n/ru.json +2 -0
  44. package/src/i18n/uk.json +2 -0
  45. package/src/index.ts +3 -1
  46. package/src/linker.ts +160 -36
  47. package/src/plugins.ts +31 -4
  48. package/src/store.ts +54 -6
  49. package/src/types.ts +39 -0
  50. package/tests/linker.spec.ts +593 -6
package/build/consts.d.ts CHANGED
@@ -28,16 +28,39 @@ export declare const CONSENT_SETUP_FLAG = "cookieConsentSetup";
28
28
  */
29
29
  export declare const CONSENT_EVENT = "owlmeans:consent";
30
30
  export declare const CONSENT_ESSENTIAL = "essential";
31
+ export declare const CONSENT_FUNCTIONAL = "functional";
31
32
  export declare const CONSENT_ANALYTICS = "analytics";
32
33
  export declare const CONSENT_MARKETING = "marketing";
34
+ /**
35
+ * The DOM event the store dispatches on `window` when a language that arrived with a link (or an
36
+ * explicit choice made before the visitor answered the dialog) has just become storable — the
37
+ * visitor granted functional storage — so the application can switch to it now instead of at the
38
+ * next load. `detail: { language }`. An application that resolves its language from storage at
39
+ * start-up (`@owlmeans/client-i18n`) listens for it.
40
+ */
41
+ export declare const CONSENT_LANGUAGE_EVENT = "owlmeans:language";
42
+ /**
43
+ * The `window` property the inline `<head>` fragment leaves a carried language on when it may not
44
+ * store it yet (no decision, or functional not granted): memory only, never storage. The store
45
+ * picks it up at `init` and writes it if — and only if — the visitor later grants functional storage
46
+ * in this page's life. Fixed for the same reason `CONSENT_SETUP_FLAG` is: two bundles, one page.
47
+ */
48
+ export declare const CONSENT_PENDING_LANGUAGE = "cookieConsentPendingLanguage";
49
+ /**
50
+ * Where an application persists an explicit interface-language choice — `@owlmeans/client-i18n`'s
51
+ * `owlmeans-lng`. Repeated here rather than imported: this package has no runtime dependencies, and
52
+ * the linker's language part has to run in an inline `<head>` script, before any bundle exists.
53
+ */
54
+ export declare const CONSENT_LANGUAGE_KEY = "owlmeans-lng";
33
55
  export declare const CONSENT_LOCALES: readonly ['en', 'pl', 'ru', 'be', 'uk', 'es', 'de', 'fr'];
34
56
  export type ConsentLocale = (typeof CONSENT_LOCALES)[number];
35
57
  /**
36
58
  * The categories every OwlMeans surface starts with.
37
59
  *
38
- * Three, matching what owlmeans.com already asks — plus the essential row, which the original
39
- * widget left implicit. Making it explicit is what lets a flow require an acknowledgement before
40
- * it sets a session cookie, and what tells a visitor what is being stored regardless.
60
+ * What owlmeans.com already asked (analytics, marketing) plus the essential row, which the original
61
+ * widget left implicit — making it explicit is what lets a flow require an acknowledgement before
62
+ * it sets a session cookie, and what tells a visitor what is being stored regardless — plus
63
+ * functional, the visitor's own remembered preferences.
41
64
  */
42
65
  export declare const DEFAULT_CONSENT_CATEGORIES: ConsentCategory[];
43
66
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,wBAAwB,CAAA;AAEhD,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AAEtD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,qBAAqB,CAAA;AAE/C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAC5C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAC5C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAE5C,eAAO,MAAM,eAAe,YAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAExF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,eAAe,EAmBvD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAQxE,CAAA"}
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,wBAAwB,CAAA;AAEhD,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AAEtD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,qBAAqB,CAAA;AAE/C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAC5C,eAAO,MAAM,kBAAkB,eAAe,CAAA;AAC9C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAC5C,eAAO,MAAM,iBAAiB,cAAc,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,iCAAiC,CAAA;AAEtE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,iBAAiB,CAAA;AAElD,eAAO,MAAM,eAAe,YAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAExF,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,EAAE,eAAe,EA4BvD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAQxE,CAAA"}
package/build/consts.js CHANGED
@@ -27,15 +27,38 @@ export const CONSENT_SETUP_FLAG = 'cookieConsentSetup';
27
27
  */
28
28
  export const CONSENT_EVENT = 'owlmeans:consent';
29
29
  export const CONSENT_ESSENTIAL = 'essential';
30
+ export const CONSENT_FUNCTIONAL = 'functional';
30
31
  export const CONSENT_ANALYTICS = 'analytics';
31
32
  export const CONSENT_MARKETING = 'marketing';
33
+ /**
34
+ * The DOM event the store dispatches on `window` when a language that arrived with a link (or an
35
+ * explicit choice made before the visitor answered the dialog) has just become storable — the
36
+ * visitor granted functional storage — so the application can switch to it now instead of at the
37
+ * next load. `detail: { language }`. An application that resolves its language from storage at
38
+ * start-up (`@owlmeans/client-i18n`) listens for it.
39
+ */
40
+ export const CONSENT_LANGUAGE_EVENT = 'owlmeans:language';
41
+ /**
42
+ * The `window` property the inline `<head>` fragment leaves a carried language on when it may not
43
+ * store it yet (no decision, or functional not granted): memory only, never storage. The store
44
+ * picks it up at `init` and writes it if — and only if — the visitor later grants functional storage
45
+ * in this page's life. Fixed for the same reason `CONSENT_SETUP_FLAG` is: two bundles, one page.
46
+ */
47
+ export const CONSENT_PENDING_LANGUAGE = 'cookieConsentPendingLanguage';
48
+ /**
49
+ * Where an application persists an explicit interface-language choice — `@owlmeans/client-i18n`'s
50
+ * `owlmeans-lng`. Repeated here rather than imported: this package has no runtime dependencies, and
51
+ * the linker's language part has to run in an inline `<head>` script, before any bundle exists.
52
+ */
53
+ export const CONSENT_LANGUAGE_KEY = 'owlmeans-lng';
32
54
  export const CONSENT_LOCALES = ['en', 'pl', 'ru', 'be', 'uk', 'es', 'de', 'fr'];
33
55
  /**
34
56
  * The categories every OwlMeans surface starts with.
35
57
  *
36
- * Three, matching what owlmeans.com already asks — plus the essential row, which the original
37
- * widget left implicit. Making it explicit is what lets a flow require an acknowledgement before
38
- * it sets a session cookie, and what tells a visitor what is being stored regardless.
58
+ * What owlmeans.com already asked (analytics, marketing) plus the essential row, which the original
59
+ * widget left implicit — making it explicit is what lets a flow require an acknowledgement before
60
+ * it sets a session cookie, and what tells a visitor what is being stored regardless — plus
61
+ * functional, the visitor's own remembered preferences.
39
62
  */
40
63
  export const DEFAULT_CONSENT_CATEGORIES = [
41
64
  {
@@ -44,6 +67,15 @@ export const DEFAULT_CONSENT_CATEGORIES = [
44
67
  globalVar: 'owlConsentEssential',
45
68
  signals: ['security_storage', 'functionality_storage'],
46
69
  },
70
+ // A preference the visitor set — today the interface language — remembered on their device. Not
71
+ // essential (nothing breaks without it) and not tracking, so it drives NO Consent Mode signal:
72
+ // a signal would make `trackingGranted` count it, and a visitor who only allowed their language
73
+ // to be remembered would load the tag container.
74
+ {
75
+ key: CONSENT_FUNCTIONAL,
76
+ labelKey: 'functional', descriptionKey: 'functionalDesc',
77
+ globalVar: 'owlConsentFunctional',
78
+ },
47
79
  {
48
80
  key: CONSENT_ANALYTICS,
49
81
  labelKey: 'analytics', descriptionKey: 'analyticsDesc',
@@ -1 +1 @@
1
- {"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAA;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEvC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AAEtD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAIxF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D;QACE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI;QACtC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;KACvD;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,mBAAmB,CAAC;KAC/B;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,oBAAoB,CAAC;KAC9D;CACF,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyC;IAC3E,UAAU,EAAE,QAAQ;IACpB,YAAY,EAAE,QAAQ;IACtB,kBAAkB,EAAE,QAAQ;IAC5B,iBAAiB,EAAE,QAAQ;IAC3B,qBAAqB,EAAE,QAAQ;IAC/B,uBAAuB,EAAE,QAAQ;IACjC,gBAAgB,EAAE,SAAS;CAC5B,CAAA"}
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,qBAAqB,CAAA;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEvC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AAEtD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAA;AAE/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAA;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAA;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAIxF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D;QACE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI;QACtC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;KACvD;IACD,gGAAgG;IAChG,+FAA+F;IAC/F,gGAAgG;IAChG,iDAAiD;IACjD;QACE,GAAG,EAAE,kBAAkB;QACvB,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB;QACxD,SAAS,EAAE,sBAAsB;KAClC;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,mBAAmB,CAAC;KAC/B;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe;QACtD,SAAS,EAAE,qBAAqB;QAChC,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,oBAAoB,CAAC;KAC9D;CACF,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAyC;IAC3E,UAAU,EAAE,QAAQ;IACpB,YAAY,EAAE,QAAQ;IACtB,kBAAkB,EAAE,QAAQ;IAC5B,iBAAiB,EAAE,QAAQ;IAC3B,qBAAqB,EAAE,QAAQ;IAC/B,uBAAuB,EAAE,QAAQ;IACjC,gBAAgB,EAAE,SAAS;CAC5B,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { ConsentOptions } from './types.js';
2
+ /**
3
+ * Whether this document's visitor has granted functional storage — a preference they set, such as
4
+ * the interface language, may be remembered on their device.
5
+ *
6
+ * Read from the stored record every time rather than from the store's state, so it is correct
7
+ * before `consentStore.init` has run: the language resolves at start-up, ahead of any component.
8
+ * A record with no `functional` key (one saved before the category existed) is NOT a grant — the
9
+ * visitor was never asked, and a preference is not remembered on a device nobody asked about.
10
+ */
11
+ export declare const functionalGranted: (opts?: ConsentOptions) => boolean;
12
+ /** Every `localStorage` key that may hold a functional preference for these options. */
13
+ export declare const functionalKeysOf: (opts?: ConsentOptions) => string[];
14
+ /**
15
+ * Remove every functional preference this application keeps. Called whenever functional is not
16
+ * granted — a refusal, a withdrawal, or a record that never answered — because a preference that
17
+ * outlives the consent to remember it is exactly the storage the visitor did not agree to.
18
+ */
19
+ export declare const purgeFunctionalStorage: (opts?: ConsentOptions) => void;
20
+ /**
21
+ * Remember a functional preference — but only while `functional` is granted. Returns whether it was
22
+ * written. The gate lives here so a caller cannot forget it; an application that is asked to store
23
+ * something functional calls this instead of `localStorage.setItem`.
24
+ */
25
+ export declare const writeFunctionalPreference: (key: string, value: string, opts?: ConsentOptions) => boolean;
26
+ /**
27
+ * An inline `<head>` fragment that defines `window.owlConsentAllows(category)` — whether the stored
28
+ * decision grants that category — for the scripts of a page that has no bundle yet: a site that
29
+ * remembers the visitor's language choice from a plain inline script (owlmeans.com's language
30
+ * switcher) asks it before it writes anything. Reads the same localStorage-then-cookie pair
31
+ * `readConsent` does, and answers `false` for anything it cannot read or parse — no answer is not a
32
+ * grant. Stamp it before the scripts that call it.
33
+ */
34
+ export declare const consentAllowsScript: (opts?: ConsentOptions) => string;
35
+ //# sourceMappingURL=functional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functional.d.ts","sourceRoot":"","sources":["../src/functional.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,UAAW,cAAc,KAAG,OACR,CAAA;AAElD,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,UAAW,cAAc,KAAG,MAAM,EAK9D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,UAAW,cAAc,KAAG,IAM9D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,QAAS,MAAM,SAAS,MAAM,SAAS,cAAc,KAAG,OAW7F,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UAAW,cAAc,KAAG,MAS3D,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { CONSENT_FUNCTIONAL, CONSENT_KEY, CONSENT_LANGUAGE_KEY } from './consts.js';
2
+ import { readConsent } from './storage.js';
3
+ /**
4
+ * Whether this document's visitor has granted functional storage — a preference they set, such as
5
+ * the interface language, may be remembered on their device.
6
+ *
7
+ * Read from the stored record every time rather than from the store's state, so it is correct
8
+ * before `consentStore.init` has run: the language resolves at start-up, ahead of any component.
9
+ * A record with no `functional` key (one saved before the category existed) is NOT a grant — the
10
+ * visitor was never asked, and a preference is not remembered on a device nobody asked about.
11
+ */
12
+ export const functionalGranted = (opts) => readConsent(opts)?.[CONSENT_FUNCTIONAL] === true;
13
+ /** Every `localStorage` key that may hold a functional preference for these options. */
14
+ export const functionalKeysOf = (opts) => [
15
+ ...new Set([
16
+ ...(opts?.functionalKeys ?? [CONSENT_LANGUAGE_KEY]),
17
+ ...(opts?.linker?.language?.storageKey != null ? [opts.linker.language.storageKey] : []),
18
+ ]),
19
+ ];
20
+ /**
21
+ * Remove every functional preference this application keeps. Called whenever functional is not
22
+ * granted — a refusal, a withdrawal, or a record that never answered — because a preference that
23
+ * outlives the consent to remember it is exactly the storage the visitor did not agree to.
24
+ */
25
+ export const purgeFunctionalStorage = (opts) => {
26
+ for (const key of functionalKeysOf(opts)) {
27
+ try {
28
+ localStorage.removeItem(key);
29
+ }
30
+ catch { /* storage blocked: nothing was written there to remove */ }
31
+ }
32
+ };
33
+ /**
34
+ * Remember a functional preference — but only while `functional` is granted. Returns whether it was
35
+ * written. The gate lives here so a caller cannot forget it; an application that is asked to store
36
+ * something functional calls this instead of `localStorage.setItem`.
37
+ */
38
+ export const writeFunctionalPreference = (key, value, opts) => {
39
+ if (!functionalGranted(opts)) {
40
+ return false;
41
+ }
42
+ try {
43
+ localStorage.setItem(key, value);
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ };
50
+ /**
51
+ * An inline `<head>` fragment that defines `window.owlConsentAllows(category)` — whether the stored
52
+ * decision grants that category — for the scripts of a page that has no bundle yet: a site that
53
+ * remembers the visitor's language choice from a plain inline script (owlmeans.com's language
54
+ * switcher) asks it before it writes anything. Reads the same localStorage-then-cookie pair
55
+ * `readConsent` does, and answers `false` for anything it cannot read or parse — no answer is not a
56
+ * grant. Stamp it before the scripts that call it.
57
+ */
58
+ export const consentAllowsScript = (opts) => {
59
+ const key = JSON.stringify(opts?.storageKey ?? CONSENT_KEY).replace(/</g, '\\u003c');
60
+ return `(function(w,d){w.owlConsentAllows=function(k){` +
61
+ `var raw=null;try{raw=w.localStorage.getItem(${key})}catch(e){}` +
62
+ `if(!raw){var p=('; '+d.cookie).split('; '+${key}+'=');if(p.length===2)raw=p.pop().split(';').shift()}` +
63
+ `if(!raw)return false;` +
64
+ `try{var r=JSON.parse(raw);return !!r&&typeof r==='object'&&r[k]===true}catch(e){return false}}` +
65
+ `})(window,document)`;
66
+ };
67
+ //# sourceMappingURL=functional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functional.js","sourceRoot":"","sources":["../src/functional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG1C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAqB,EAAW,EAAE,CAClE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAAA;AAElD,wFAAwF;AACxF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAY,EAAE,CAAC;IACnE,GAAG,IAAI,GAAG,CAAC;QACT,GAAG,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;CACH,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAqB,EAAQ,EAAE;IACpE,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,IAAqB,EAAW,EAAE;IACtG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEhC,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAqB,EAAU,EAAE;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,IAAI,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAEpF,OAAO,gDAAgD;QACrD,+CAA+C,GAAG,cAAc;QAChE,6CAA6C,GAAG,uDAAuD;QACvG,uBAAuB;QACvB,gGAAgG;QAClG,qBAAqB,CAAA;AACvB,CAAC,CAAA"}
@@ -3,6 +3,8 @@
3
3
  "description": "Мы выкарыстоўваем файлы cookie, каб палепшыць ваш досвед прагляду, паказваць персаналізаваную рэкламу ці змесціва і аналізаваць наш трафік. Націскаючы «Прыняць усе», вы пагаджаецеся на выкарыстанне файлаў cookie.",
4
4
  "essential": "Неабходныя файлы cookie",
5
5
  "essentialDesc": "Патрэбныя для працы сайта — уваход, бяспека і захаванне гэтых налад. Іх нельга адключыць.",
6
+ "functional": "Функцыянальныя файлы cookie",
7
+ "functionalDesc": "Запамінаюць вашы налады, напрыклад мову інтэрфейсу, каб вам не даводзілася задаваць іх зноў.",
6
8
  "analytics": "Аналітычныя файлы cookie",
7
9
  "analyticsDesc": "Дапамагаюць нам паляпшаць наш вэб-сайт, збіраючы і паведамляючы інфармацыю пра яго выкарыстанне.",
8
10
  "marketing": "Маркетынгавыя файлы cookie",
@@ -3,6 +3,8 @@
3
3
  "description": "Wir verwenden Cookies, um Ihr Surferlebnis zu verbessern, personalisierte Anzeigen oder Inhalte bereitzustellen und unseren Datenverkehr zu analysieren. Indem Sie auf „Alle akzeptieren\" klicken, stimmen Sie der Verwendung von Cookies zu.",
4
4
  "essential": "Notwendige Cookies",
5
5
  "essentialDesc": "Erforderlich, damit die Website funktioniert — Anmeldung, Sicherheit und das Speichern dieser Einstellungen. Sie lassen sich nicht abschalten.",
6
+ "functional": "Funktionale Cookies",
7
+ "functionalDesc": "Merken sich Ihre Auswahl, etwa die Oberflächensprache, damit Sie nicht erneut wählen müssen.",
6
8
  "analytics": "Analyse-Cookies",
7
9
  "analyticsDesc": "Helfen uns, unsere Website zu verbessern, indem sie Informationen zur Nutzung sammeln und melden.",
8
10
  "marketing": "Marketing-Cookies",
@@ -3,6 +3,8 @@
3
3
  "description": "We use cookies to enhance your browsing experience, serve personalized ads or content, and analyze our traffic. By clicking \"Accept All\", you consent to our use of cookies.",
4
4
  "essential": "Essential Cookies",
5
5
  "essentialDesc": "Required for the site to work — signing in, security and remembering these preferences. They cannot be switched off.",
6
+ "functional": "Functional Cookies",
7
+ "functionalDesc": "Remember your choices, such as the interface language, so you do not have to make them again.",
6
8
  "analytics": "Analytics Cookies",
7
9
  "analyticsDesc": "Help us improve our website by collecting and reporting information on its usage.",
8
10
  "marketing": "Marketing Cookies",
@@ -3,6 +3,8 @@
3
3
  "description": "Utilizamos cookies para mejorar tu experiencia de navegación, ofrecer anuncios o contenido personalizados y analizar nuestro tráfico. Al hacer clic en «Aceptar todo», aceptas nuestro uso de cookies.",
4
4
  "essential": "Cookies esenciales",
5
5
  "essentialDesc": "Necesarias para que el sitio funcione: inicio de sesión, seguridad y recordar estas preferencias. No se pueden desactivar.",
6
+ "functional": "Cookies funcionales",
7
+ "functionalDesc": "Recuerdan tus preferencias, como el idioma de la interfaz, para que no tengas que elegirlas de nuevo.",
6
8
  "analytics": "Cookies analíticas",
7
9
  "analyticsDesc": "Nos ayudan a mejorar nuestro sitio web recopilando e informando sobre su uso.",
8
10
  "marketing": "Cookies de marketing",
@@ -3,6 +3,8 @@
3
3
  "description": "Nous utilisons des cookies pour améliorer votre navigation, proposer des publicités ou contenus personnalisés et analyser notre trafic. En cliquant sur « Tout accepter », vous consentez à leur utilisation.",
4
4
  "essential": "Cookies essentiels",
5
5
  "essentialDesc": "Nécessaires au fonctionnement du site : connexion, sécurité et mémorisation de ces préférences. Ils ne peuvent pas être désactivés.",
6
+ "functional": "Cookies fonctionnels",
7
+ "functionalDesc": "Mémorisent vos choix, comme la langue de l'interface, afin que vous n'ayez pas à les refaire.",
6
8
  "analytics": "Cookies analytiques",
7
9
  "analyticsDesc": "Nous aident à améliorer notre site en recueillant et en analysant des informations sur son utilisation.",
8
10
  "marketing": "Cookies marketing",
@@ -3,6 +3,8 @@
3
3
  "description": "Używamy plików cookie w celu ulepszenia Twojego doświadczenia podczas przeglądania, wyświetlania spersonalizowanych reklam lub treści oraz analizowania naszego ruchu. Klikając „Akceptuj wszystkie\", wyrażasz zgodę na używanie przez nas plików cookie.",
4
4
  "essential": "Niezbędne pliki cookie",
5
5
  "essentialDesc": "Wymagane do działania witryny — logowanie, bezpieczeństwo i zapamiętanie tych ustawień. Nie można ich wyłączyć.",
6
+ "functional": "Funkcjonalne pliki cookie",
7
+ "functionalDesc": "Zapamiętują Twoje wybory, np. język interfejsu, aby nie trzeba było wybierać od nowa.",
6
8
  "analytics": "Analityczne pliki cookie",
7
9
  "analyticsDesc": "Pomagają nam ulepszać naszą witrynę internetową, zbierając i raportując informacje o jej użytkowaniu.",
8
10
  "marketing": "Marketingowe pliki cookie",
@@ -3,6 +3,8 @@
3
3
  "description": "Мы используем файлы cookie, чтобы улучшить ваш опыт просмотра, показывать персонализированную рекламу или контент и анализировать наш трафик. Нажимая «Принять все», вы соглашаетесь на использование файлов cookie.",
4
4
  "essential": "Необходимые файлы cookie",
5
5
  "essentialDesc": "Нужны для работы сайта — вход, безопасность и сохранение этих настроек. Их нельзя отключить.",
6
+ "functional": "Функциональные файлы cookie",
7
+ "functionalDesc": "Запоминают ваши настройки, например язык интерфейса, чтобы не приходилось задавать их заново.",
6
8
  "analytics": "Аналитические файлы cookie",
7
9
  "analyticsDesc": "Помогают нам улучшать наш сайт, собирая и предоставляя информацию о его использовании.",
8
10
  "marketing": "Маркетинговые файлы cookie",
@@ -3,6 +3,8 @@
3
3
  "description": "Ми використовуємо файли cookie, щоб покращити ваш досвід перегляду, показувати персоналізовану рекламу чи вміст і аналізувати наш трафік. Натискаючи «Прийняти всі», ви погоджуєтеся на використання файлів cookie.",
4
4
  "essential": "Необхідні файли cookie",
5
5
  "essentialDesc": "Потрібні для роботи сайту — вхід, безпека та збереження цих налаштувань. Їх не можна вимкнути.",
6
+ "functional": "Функціональні файли cookie",
7
+ "functionalDesc": "Запам’ятовують ваші налаштування, наприклад мову інтерфейсу, щоб вам не доводилося вибирати їх знову.",
6
8
  "analytics": "Аналітичні файли cookie",
7
9
  "analyticsDesc": "Допомагають нам покращувати наш вебсайт, збираючи та надаючи інформацію про його використання.",
8
10
  "marketing": "Маркетингові файли cookie",
package/build/index.d.ts CHANGED
@@ -3,9 +3,10 @@ export * from './consts.js';
3
3
  export * from './storage.js';
4
4
  export * from './gtm.js';
5
5
  export * from './store.js';
6
+ export * from './functional.js';
6
7
  export * from './i18n.js';
7
8
  export type { ConsentPlugin } from './plugins.js';
8
- export { registerConsentPlugin, consentPlugins, decorateConsentUrl, consentDomains, adoptConsent, startConsentPlugins, } from './plugins.js';
9
+ export { registerConsentPlugin, consentPlugins, decorateConsentUrl, consentDomains, adoptConsent, startConsentPlugins, adoptConsentLanguage, } from './plugins.js';
9
10
  export type { ConsentLinkPayload } from './linker.js';
10
- export { consentLinker, encodeConsentLink, decodeConsentLink, stripConsentLinkParam, consentLinkerScript, CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW, } from './linker.js';
11
+ export { consentLinker, encodeConsentLink, decodeConsentLink, stripConsentLinkParam, consentLinkerScript, writeConsentLanguage, CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW, } from './linker.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EACL,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EACvF,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAC/F,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,GAC5D,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EACL,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EACvF,mBAAmB,EAAE,oBAAoB,GAC1C,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAC/F,oBAAoB,EACpB,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,GAC5D,MAAM,aAAa,CAAA"}
package/build/index.js CHANGED
@@ -2,7 +2,8 @@ export * from './consts.js';
2
2
  export * from './storage.js';
3
3
  export * from './gtm.js';
4
4
  export * from './store.js';
5
+ export * from './functional.js';
5
6
  export * from './i18n.js';
6
- export { registerConsentPlugin, consentPlugins, decorateConsentUrl, consentDomains, adoptConsent, startConsentPlugins, } from './plugins.js';
7
- export { consentLinker, encodeConsentLink, decodeConsentLink, stripConsentLinkParam, consentLinkerScript, CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW, } from './linker.js';
7
+ export { registerConsentPlugin, consentPlugins, decorateConsentUrl, consentDomains, adoptConsent, startConsentPlugins, adoptConsentLanguage, } from './plugins.js';
8
+ export { consentLinker, encodeConsentLink, decodeConsentLink, stripConsentLinkParam, consentLinkerScript, writeConsentLanguage, CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW, } from './linker.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AAEzB,OAAO,EACL,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EACvF,mBAAmB,GACpB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAC/F,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,GAC5D,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAEzB,OAAO,EACL,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EACvF,mBAAmB,EAAE,oBAAoB,GAC1C,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAC/F,oBAAoB,EACpB,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,GAC5D,MAAM,aAAa,CAAA"}
package/build/linker.d.ts CHANGED
@@ -14,11 +14,34 @@ export interface ConsentLinkPayload {
14
14
  c: Record<string, 0 | 1>;
15
15
  /** Unix seconds the link was decorated at. */
16
16
  t: number;
17
+ /**
18
+ * The interface language of the page the link was on (a BCP 47 tag, lower-cased) — present only
19
+ * when the sender has `linker.language` set and its `<html lang>` names one. Optional on the
20
+ * wire, so a receiver that predates it reads the same `v: 2` payload and ignores the field.
21
+ */
22
+ l?: string;
17
23
  }
18
- /** The current document's decision, as the link parameter's `c`: one `0`/`1` per optional category. */
19
- export declare const encodeConsentLink: (record: ConsentRecord, opts?: ConsentOptions) => string;
24
+ /**
25
+ * The link parameter's value: the current document's decision as `c` (one `0`/`1` per optional
26
+ * category — empty while `record` is `null`, i.e. before the visitor has decided) and, when
27
+ * `opts.linker.language` is set, the page's language as `l`.
28
+ */
29
+ export declare const encodeConsentLink: (record: ConsentRecord | null, opts?: ConsentOptions) => string;
20
30
  /** Parse-only — no trust decision here, that is `consentLinker(opts).adopt`'s job. Never throws. */
21
31
  export declare const decodeConsentLink: (value: string) => ConsentLinkPayload | null;
32
+ /**
33
+ * Persist an adopted language where the application's i18n layer reads its explicit choice from —
34
+ * `linker.language.storageKey`, `owlmeans-lng` by default — and only while the visitor has GRANTED
35
+ * `functional` on this document (a stored record, or the one adopted from the very link that
36
+ * carried the language). Without that grant nothing is written and `false` comes back: remembering
37
+ * a preference on a visitor's device is storage like any other, and a refusal ("reject all") is an
38
+ * answer, not a gap to fill. The gate lives here, not in the callers, so no caller can forget it.
39
+ *
40
+ * It overwrites what is there on purpose: the carried language is the one the visitor was reading a
41
+ * moment ago, which outranks a choice they made on this domain some other day. Storage that refuses
42
+ * the write is not an error. Returns whether the language was written.
43
+ */
44
+ export declare const writeConsentLanguage: (language: string, opts?: ConsentOptions) => boolean;
22
45
  /**
23
46
  * Cross-domain consent: share this decision, and adopt one, between the domains named in
24
47
  * `opts.linker.domains`.
@@ -1 +1 @@
1
- {"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../src/linker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,OAAO,KAAK,EAAmB,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,UAAU,CAAA;AACzC,wGAAwG;AACxG,eAAO,MAAM,oBAAoB,MAAM,CAAA;AACvC,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC,QAAA,MAAM,oBAAoB,IAAI,CAAA;AAE9B,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,OAAO,oBAAoB,CAAA;IAC9B,iFAAiF;IACjF,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACxB,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAA;CACV;AAwBD,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,WAAY,aAAa,SAAS,cAAc,KAAG,MAQhF,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,kBAAkB,GAAG,IAmBtE,CAAA;AAmBD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,QAAO,aAgGhC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAAU,cAAc,KAAG,IAgB5D,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,SAAU,cAAc,KAAG,MA6C1D,CAAA"}
1
+ {"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../src/linker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,OAAO,KAAK,EAAmB,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF,sFAAsF;AACtF,eAAO,MAAM,kBAAkB,UAAU,CAAA;AACzC,wGAAwG;AACxG,eAAO,MAAM,oBAAoB,MAAM,CAAA;AACvC,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC,QAAA,MAAM,oBAAoB,IAAI,CAAA;AAE9B,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,CAAC,EAAE,OAAO,oBAAoB,CAAA;IAC9B,iFAAiF;IACjF,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACxB,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAA;IACT;;;;OAIG;IACH,CAAC,CAAC,EAAE,MAAM,CAAA;CACX;AAqCD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,WAAY,aAAa,GAAG,IAAI,SAAS,cAAc,KAAG,MAavF,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,kBAAkB,GAAG,IAuBtE,CAAA;AAyDD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,aAAc,MAAM,SAAS,cAAc,KAAG,OAY9E,CAAA;AAQD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,QAAO,aA2FhC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAAU,cAAc,KAAG,IAgB5D,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,SAAU,cAAc,KAAG,MAoE1D,CAAA"}