@owlmeans/payment 0.1.18-rc.8 → 0.1.18
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 +95 -57
- package/agent-meta/manifest.json +10 -3
- package/agent-meta/skills/entitlements/SKILL.md +159 -0
- package/agent-meta/skills/payment/SKILL.md +491 -28
- package/build/advertise.d.ts +2 -0
- package/build/advertise.d.ts.map +1 -0
- package/build/advertise.js +10 -0
- package/build/advertise.js.map +1 -0
- package/build/checkout/consts.d.ts +2 -0
- package/build/checkout/consts.d.ts.map +1 -0
- package/build/checkout/consts.js +2 -0
- package/build/checkout/consts.js.map +1 -0
- package/build/checkout/index.d.ts +6 -0
- package/build/checkout/index.d.ts.map +1 -0
- package/build/checkout/index.js +4 -0
- package/build/checkout/index.js.map +1 -0
- package/build/checkout/narrow/types.d.ts +25 -0
- package/build/checkout/narrow/types.d.ts.map +1 -0
- package/build/checkout/narrow/types.js +2 -0
- package/build/checkout/narrow/types.js.map +1 -0
- package/build/checkout/narrow.d.ts +8 -0
- package/build/checkout/narrow.d.ts.map +1 -0
- package/build/checkout/narrow.js +47 -0
- package/build/checkout/narrow.js.map +1 -0
- package/build/checkout/protocols.d.ts +8 -0
- package/build/checkout/protocols.d.ts.map +1 -0
- package/build/checkout/protocols.js +28 -0
- package/build/checkout/protocols.js.map +1 -0
- package/build/checkout/types.d.ts +29 -0
- package/build/checkout/types.d.ts.map +1 -0
- package/build/checkout/types.js +2 -0
- package/build/checkout/types.js.map +1 -0
- package/build/consts.d.ts +242 -25
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +377 -24
- package/build/consts.js.map +1 -1
- package/build/consts.local.d.ts +20 -0
- package/build/consts.local.d.ts.map +1 -0
- package/build/consts.local.js +23 -0
- package/build/consts.local.js.map +1 -0
- package/build/consumer/cancel.d.ts +11 -0
- package/build/consumer/cancel.d.ts.map +1 -0
- package/build/consumer/cancel.js +33 -0
- package/build/consumer/cancel.js.map +1 -0
- package/build/consumer/consts.d.ts +20 -0
- package/build/consumer/consts.d.ts.map +1 -0
- package/build/consumer/consts.js +39 -0
- package/build/consumer/consts.js.map +1 -0
- package/build/consumer/consts.local.d.ts +7 -0
- package/build/consumer/consts.local.d.ts.map +1 -0
- package/build/consumer/consts.local.js +13 -0
- package/build/consumer/consts.local.js.map +1 -0
- package/build/consumer/copy/types.d.ts +56 -0
- package/build/consumer/copy/types.d.ts.map +1 -0
- package/build/consumer/copy/types.js +2 -0
- package/build/consumer/copy/types.js.map +1 -0
- package/build/consumer/copy.d.ts +22 -0
- package/build/consumer/copy.d.ts.map +1 -0
- package/build/consumer/copy.js +87 -0
- package/build/consumer/copy.js.map +1 -0
- package/build/consumer/deadline/types.d.ts +30 -0
- package/build/consumer/deadline/types.d.ts.map +1 -0
- package/build/consumer/deadline/types.js +2 -0
- package/build/consumer/deadline/types.js.map +1 -0
- package/build/consumer/deadline.d.ts +12 -0
- package/build/consumer/deadline.d.ts.map +1 -0
- package/build/consumer/deadline.js +44 -0
- package/build/consumer/deadline.js.map +1 -0
- package/build/consumer/fifo/types.d.ts +17 -0
- package/build/consumer/fifo/types.d.ts.map +1 -0
- package/build/consumer/fifo/types.js +2 -0
- package/build/consumer/fifo/types.js.map +1 -0
- package/build/consumer/fifo.d.ts +4 -0
- package/build/consumer/fifo.d.ts.map +1 -0
- package/build/consumer/fifo.js +34 -0
- package/build/consumer/fifo.js.map +1 -0
- package/build/consumer/index.d.ts +18 -0
- package/build/consumer/index.d.ts.map +1 -0
- package/build/consumer/index.js +11 -0
- package/build/consumer/index.js.map +1 -0
- package/build/consumer/policy/types.d.ts +20 -0
- package/build/consumer/policy/types.d.ts.map +1 -0
- package/build/consumer/policy/types.js +2 -0
- package/build/consumer/policy/types.js.map +1 -0
- package/build/consumer/policy.d.ts +17 -0
- package/build/consumer/policy.d.ts.map +1 -0
- package/build/consumer/policy.js +91 -0
- package/build/consumer/policy.js.map +1 -0
- package/build/consumer/protocols.d.ts +20 -0
- package/build/consumer/protocols.d.ts.map +1 -0
- package/build/consumer/protocols.js +70 -0
- package/build/consumer/protocols.js.map +1 -0
- package/build/consumer/refund/types.d.ts +27 -0
- package/build/consumer/refund/types.d.ts.map +1 -0
- package/build/consumer/refund/types.js +2 -0
- package/build/consumer/refund/types.js.map +1 -0
- package/build/consumer/refund.d.ts +9 -0
- package/build/consumer/refund.d.ts.map +1 -0
- package/build/consumer/refund.js +112 -0
- package/build/consumer/refund.js.map +1 -0
- package/build/consumer/refusal.d.ts +10 -0
- package/build/consumer/refusal.d.ts.map +1 -0
- package/build/consumer/refusal.js +35 -0
- package/build/consumer/refusal.js.map +1 -0
- package/build/consumer/revive/types.d.ts +19 -0
- package/build/consumer/revive/types.d.ts.map +1 -0
- package/build/consumer/revive/types.js +2 -0
- package/build/consumer/revive/types.js.map +1 -0
- package/build/consumer/revive.d.ts +13 -0
- package/build/consumer/revive.d.ts.map +1 -0
- package/build/consumer/revive.js +43 -0
- package/build/consumer/revive.js.map +1 -0
- package/build/consumer/types.d.ts +196 -0
- package/build/consumer/types.d.ts.map +1 -0
- package/build/consumer/types.js +2 -0
- package/build/consumer/types.js.map +1 -0
- package/build/consumer/types.local.d.ts +11 -0
- package/build/consumer/types.local.d.ts.map +1 -0
- package/build/consumer/types.local.js +2 -0
- package/build/consumer/types.local.js.map +1 -0
- package/build/countries.d.ts +3 -0
- package/build/countries.d.ts.map +1 -0
- package/build/countries.js +4 -0
- package/build/countries.js.map +1 -0
- package/build/entitled.d.ts +14 -0
- package/build/entitled.d.ts.map +1 -0
- package/build/entitled.js +17 -0
- package/build/entitled.js.map +1 -0
- package/build/entitlement/types.d.ts +29 -0
- package/build/entitlement/types.d.ts.map +1 -0
- package/build/entitlement/types.js +2 -0
- package/build/entitlement/types.js.map +1 -0
- package/build/entitlement.d.ts +12 -0
- package/build/entitlement.d.ts.map +1 -0
- package/build/entitlement.js +64 -0
- package/build/entitlement.js.map +1 -0
- package/build/errors.d.ts +189 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +361 -0
- package/build/errors.js.map +1 -1
- package/build/estimate/types.d.ts +34 -0
- package/build/estimate/types.d.ts.map +1 -0
- package/build/estimate/types.js +2 -0
- package/build/estimate/types.js.map +1 -0
- package/build/estimate.d.ts +11 -0
- package/build/estimate.d.ts.map +1 -0
- package/build/estimate.js +76 -0
- package/build/estimate.js.map +1 -0
- package/build/i18n/consumer-rights/be.json +131 -0
- package/build/i18n/consumer-rights/de.json +131 -0
- package/build/i18n/consumer-rights/en.json +131 -0
- package/build/i18n/consumer-rights/es.json +131 -0
- package/build/i18n/consumer-rights/fr.json +131 -0
- package/build/i18n/consumer-rights/pl.json +131 -0
- package/build/i18n/consumer-rights/ru.json +131 -0
- package/build/i18n/consumer-rights/uk.json +131 -0
- package/build/i18n/errors/be.json +30 -0
- package/build/i18n/errors/de.json +30 -0
- package/build/i18n/errors/en.json +30 -0
- package/build/i18n/errors/es.json +30 -0
- package/build/i18n/errors/fr.json +30 -0
- package/build/i18n/errors/pl.json +30 -0
- package/build/i18n/errors/ru.json +30 -0
- package/build/i18n/errors/uk.json +30 -0
- package/build/i18n/fr.json +39 -0
- package/build/i18n.js +53 -8
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +19 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +12 -1
- package/build/index.js.map +1 -1
- package/build/limit/types.d.ts +44 -0
- package/build/limit/types.d.ts.map +1 -0
- package/build/limit/types.js +2 -0
- package/build/limit/types.js.map +1 -0
- package/build/limit.d.ts +23 -0
- package/build/limit.d.ts.map +1 -0
- package/build/limit.js +97 -0
- package/build/limit.js.map +1 -0
- package/build/model/checkout.d.ts +2 -3
- package/build/model/checkout.d.ts.map +1 -1
- package/build/model/checkout.js +12 -7
- package/build/model/checkout.js.map +1 -1
- package/build/model/consts.d.ts +15 -0
- package/build/model/consts.d.ts.map +1 -0
- package/build/model/consts.js +193 -0
- package/build/model/consts.js.map +1 -0
- package/build/model/consts.local.d.ts +35 -0
- package/build/model/consts.local.d.ts.map +1 -0
- package/build/model/consts.local.js +65 -0
- package/build/model/consts.local.js.map +1 -0
- package/build/model/consumer.d.ts +23 -0
- package/build/model/consumer.d.ts.map +1 -0
- package/build/model/consumer.js +272 -0
- package/build/model/consumer.js.map +1 -0
- package/build/model/estimate.d.ts +5 -0
- package/build/model/estimate.d.ts.map +1 -0
- package/build/model/estimate.js +69 -0
- package/build/model/estimate.js.map +1 -0
- package/build/model/index.d.ts +7 -2
- package/build/model/index.d.ts.map +1 -1
- package/build/model/index.js +7 -2
- package/build/model/index.js.map +1 -1
- package/build/model/limit.d.ts +7 -0
- package/build/model/limit.d.ts.map +1 -0
- package/build/model/limit.js +32 -0
- package/build/model/limit.js.map +1 -0
- package/build/model/plan.d.ts.map +1 -1
- package/build/model/plan.js +24 -11
- package/build/model/plan.js.map +1 -1
- package/build/model/portal.d.ts +4 -0
- package/build/model/portal.d.ts.map +1 -0
- package/build/model/portal.js +22 -0
- package/build/model/portal.js.map +1 -0
- package/build/model/pricing.d.ts +4 -0
- package/build/model/pricing.d.ts.map +1 -0
- package/build/model/pricing.js +31 -0
- package/build/model/pricing.js.map +1 -0
- package/build/model/view.d.ts +3 -0
- package/build/model/view.d.ts.map +1 -0
- package/build/model/view.js +15 -0
- package/build/model/view.js.map +1 -0
- package/build/pricing/types.d.ts +13 -0
- package/build/pricing/types.d.ts.map +1 -0
- package/build/pricing/types.js +2 -0
- package/build/pricing/types.js.map +1 -0
- package/build/pricing.d.ts +13 -0
- package/build/pricing.d.ts.map +1 -0
- package/build/pricing.js +74 -0
- package/build/pricing.js.map +1 -0
- package/build/promo/types.d.ts +14 -0
- package/build/promo/types.d.ts.map +1 -0
- package/build/promo/types.js +2 -0
- package/build/promo/types.js.map +1 -0
- package/build/promo.d.ts +7 -0
- package/build/promo.d.ts.map +1 -0
- package/build/promo.js +25 -0
- package/build/promo.js.map +1 -0
- package/build/regions/types.d.ts +32 -0
- package/build/regions/types.d.ts.map +1 -0
- package/build/regions/types.js +2 -0
- package/build/regions/types.js.map +1 -0
- package/build/regions.d.ts +15 -0
- package/build/regions.d.ts.map +1 -0
- package/build/regions.js +43 -0
- package/build/regions.js.map +1 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +24 -9
- package/build/service.js.map +1 -1
- package/build/types.d.ts +619 -52
- package/build/types.d.ts.map +1 -1
- package/build/types.local.d.ts +4 -0
- package/build/types.local.d.ts.map +1 -0
- package/build/types.local.js +2 -0
- package/build/types.local.js.map +1 -0
- package/build/view/types.d.ts +33 -0
- package/build/view/types.d.ts.map +1 -0
- package/build/view/types.js +2 -0
- package/build/view/types.js.map +1 -0
- package/build/view.d.ts +13 -0
- package/build/view.d.ts.map +1 -0
- package/build/view.js +78 -0
- package/build/view.js.map +1 -0
- package/package.json +14 -12
- package/src/advertise.ts +13 -0
- package/src/checkout/consts.ts +1 -0
- package/src/checkout/index.ts +5 -0
- package/src/checkout/narrow/types.ts +27 -0
- package/src/checkout/narrow.ts +63 -0
- package/src/checkout/protocols.ts +39 -0
- package/src/checkout/types.ts +27 -0
- package/src/consts.local.ts +34 -0
- package/src/consts.ts +417 -24
- package/src/consumer/cancel.ts +40 -0
- package/src/consumer/consts.local.ts +16 -0
- package/src/consumer/consts.ts +46 -0
- package/src/consumer/copy/types.ts +54 -0
- package/src/consumer/copy.ts +121 -0
- package/src/consumer/deadline/types.ts +30 -0
- package/src/consumer/deadline.ts +61 -0
- package/src/consumer/fifo/types.ts +17 -0
- package/src/consumer/fifo.ts +42 -0
- package/src/consumer/index.ts +17 -0
- package/src/consumer/policy/types.ts +20 -0
- package/src/consumer/policy.ts +101 -0
- package/src/consumer/protocols.ts +116 -0
- package/src/consumer/refund/types.ts +27 -0
- package/src/consumer/refund.ts +136 -0
- package/src/consumer/refusal.ts +35 -0
- package/src/consumer/revive/types.ts +23 -0
- package/src/consumer/revive.ts +82 -0
- package/src/consumer/types.local.ts +10 -0
- package/src/consumer/types.ts +189 -0
- package/src/countries.ts +5 -0
- package/src/entitled.ts +20 -0
- package/src/entitlement/types.ts +29 -0
- package/src/entitlement.ts +86 -0
- package/src/errors.ts +445 -0
- package/src/estimate/types.ts +34 -0
- package/src/estimate.ts +90 -0
- package/src/i18n/consumer-rights/be.json +131 -0
- package/src/i18n/consumer-rights/de.json +131 -0
- package/src/i18n/consumer-rights/en.json +131 -0
- package/src/i18n/consumer-rights/es.json +131 -0
- package/src/i18n/consumer-rights/fr.json +131 -0
- package/src/i18n/consumer-rights/pl.json +131 -0
- package/src/i18n/consumer-rights/ru.json +131 -0
- package/src/i18n/consumer-rights/uk.json +131 -0
- package/src/i18n/errors/be.json +30 -0
- package/src/i18n/errors/de.json +30 -0
- package/src/i18n/errors/en.json +30 -0
- package/src/i18n/errors/es.json +30 -0
- package/src/i18n/errors/fr.json +30 -0
- package/src/i18n/errors/pl.json +30 -0
- package/src/i18n/errors/ru.json +30 -0
- package/src/i18n/errors/uk.json +30 -0
- package/src/i18n/fr.json +39 -0
- package/src/i18n.ts +58 -8
- package/src/index.ts +19 -2
- package/src/limit/types.ts +41 -0
- package/src/limit.ts +132 -0
- package/src/model/checkout.ts +12 -7
- package/src/model/consts.local.ts +83 -0
- package/src/model/consts.ts +206 -0
- package/src/model/consumer.ts +294 -0
- package/src/model/estimate.ts +73 -0
- package/src/model/index.ts +7 -2
- package/src/model/limit.ts +36 -0
- package/src/model/plan.ts +25 -12
- package/src/model/portal.ts +25 -0
- package/src/model/pricing.ts +34 -0
- package/src/model/view.ts +17 -0
- package/src/pricing/types.ts +13 -0
- package/src/pricing.ts +110 -0
- package/src/promo/types.ts +18 -0
- package/src/promo.ts +46 -0
- package/src/regions/types.ts +42 -0
- package/src/regions.ts +85 -0
- package/src/service.ts +32 -15
- package/src/types.local.ts +5 -0
- package/src/types.ts +669 -49
- package/src/view/types.ts +39 -0
- package/src/view.ts +119 -0
- package/tests/checkout-narrow.spec.ts +75 -0
- package/tests/consumer-copy.spec.ts +378 -0
- package/tests/consumer-deadline.spec.ts +85 -0
- package/tests/consumer-fifo.spec.ts +61 -0
- package/tests/consumer-protocols.spec.ts +103 -0
- package/tests/consumer-refund.spec.ts +134 -0
- package/tests/consumer-regions.spec.ts +140 -0
- package/tests/consumer-wire.spec.ts +170 -0
- package/tests/contract.spec.ts +183 -0
- package/tests/entitlement.spec.ts +103 -0
- package/tests/errors.spec.ts +168 -0
- package/tests/estimate.spec.ts +139 -0
- package/tests/limit.spec.ts +117 -0
- package/tests/pricing.spec.ts +30 -0
- package/tests/tsconfig.json +11 -0
- package/tests/view.spec.ts +130 -0
- package/tsconfig.json +6 -1
- package/build/.gitkeep +0 -0
- package/src/model/subscription.ts +0 -63
- package/src/model/utils.ts +0 -32
- package/src/modules.ts +0 -43
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CONSUMER_RIGHTS_TERRITORIES } from '../consts.js';
|
|
2
|
+
export const DAY_MS = 86_400_000;
|
|
3
|
+
/** Every mechanism off: declaring a policy changes nothing until the application switches one on. */
|
|
4
|
+
export const NO_CONSUMER_RIGHTS_MECHANISMS = Object.freeze({
|
|
5
|
+
countryLock: false,
|
|
6
|
+
checkoutTerms: false,
|
|
7
|
+
performanceConsent: false,
|
|
8
|
+
subscriptionStart: false,
|
|
9
|
+
withdrawal: false,
|
|
10
|
+
automaticRefunds: false,
|
|
11
|
+
cancellation: false,
|
|
12
|
+
purchaseConfirmation: false,
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* What a declaration leaves out: the EU and EEA territories, an unknown country protected, 14 days
|
|
16
|
+
* ending at the end of a UTC day, a weekend end moved to Monday, five margin days, every mechanism
|
|
17
|
+
* off, English as the default language, start requests usable for an hour.
|
|
18
|
+
*
|
|
19
|
+
* Five margin days because a period ending on a public holiday runs to the next working day (EU
|
|
20
|
+
* Reg. 1182/71 art. 3(4)) and holiday clusters (24–26 December plus a weekend, Maundy Thursday to
|
|
21
|
+
* Easter Monday) need up to five; no per-country holiday calendar is kept, so a generous margin
|
|
22
|
+
* keeps the withdrawal function open for the whole statutory period everywhere.
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_CONSUMER_RIGHTS = Object.freeze({
|
|
25
|
+
countries: [...CONSUMER_RIGHTS_TERRITORIES],
|
|
26
|
+
unknownCountry: 'protect',
|
|
27
|
+
withdrawalDays: 14,
|
|
28
|
+
deadline: Object.freeze({ weekendRollover: true, marginDays: 5 }),
|
|
29
|
+
mechanisms: NO_CONSUMER_RIGHTS_MECHANISMS,
|
|
30
|
+
defaultLanguage: 'en',
|
|
31
|
+
renewalOpensWindow: false,
|
|
32
|
+
startRequestTtlSeconds: 3600,
|
|
33
|
+
exemptBusinesses: false,
|
|
34
|
+
});
|
|
35
|
+
export const CONSUMER_RIGHTS_API_PATH = '/consumer-rights';
|
|
36
|
+
export const CONSUMER_RIGHTS_PUBLIC_PATH = '/public/consumer-rights';
|
|
37
|
+
export const CONSUMER_RIGHTS_WITHDRAWAL_SCREEN_PATH = '/legal/withdraw';
|
|
38
|
+
export const CONSUMER_RIGHTS_CANCELLATION_SCREEN_PATH = '/legal/cancel';
|
|
39
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/consumer/consts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AAE1D,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAA;AAEhC,qGAAqG;AACrG,MAAM,CAAC,MAAM,6BAA6B,GAA6B,MAAM,CAAC,MAAM,CAAC;IACnF,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,KAAK;IACpB,kBAAkB,EAAE,KAAK;IACzB,iBAAiB,EAAE,KAAK;IACxB,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,KAAK;IACvB,YAAY,EAAE,KAAK;IACnB,oBAAoB,EAAE,KAAK;CAC5B,CAAC,CAAA;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAkE,MAAM,CAAC,MAAM,CAAC;IAClH,SAAS,EAAE,CAAC,GAAG,2BAA2B,CAAC;IAC3C,cAAc,EAAE,SAAS;IACzB,cAAc,EAAE,EAAE;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACjE,UAAU,EAAE,6BAA6B;IACzC,eAAe,EAAE,IAAI;IACrB,kBAAkB,EAAE,KAAK;IACzB,sBAAsB,EAAE,IAAI;IAC5B,gBAAgB,EAAE,KAAK;CACxB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAA;AAE1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,yBAAyB,CAAA;AAEpE,MAAM,CAAC,MAAM,sCAAsC,GAAG,iBAAiB,CAAA;AAEvE,MAAM,CAAC,MAAM,wCAAwC,GAAG,eAAe,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ConsentKind } from '../consts.js';
|
|
2
|
+
export declare const COUNTRY: RegExp;
|
|
3
|
+
export declare const CURRENCY: RegExp;
|
|
4
|
+
export declare const CONSENT_CONTEXT: RegExp;
|
|
5
|
+
/** The marker or type name a refusal of each express request carries in its message or type. */
|
|
6
|
+
export declare const CONSENT_REFUSAL_MARKERS: Array<[string, ConsentKind]>;
|
|
7
|
+
//# sourceMappingURL=consts.local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../src/consumer/consts.local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG1C,eAAO,MAAM,OAAO,QAAe,CAAA;AAEnC,eAAO,MAAM,QAAQ,QAAe,CAAA;AAEpC,eAAO,MAAM,eAAe,QAA2B,CAAA;AAEvD,gGAAgG;AAChG,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAKhE,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ConsentKind } from '../consts.js';
|
|
2
|
+
import { PerformanceConsentRequired, SubscriptionStartRequired } from '../errors.js';
|
|
3
|
+
export const COUNTRY = /^[A-Z]{2}$/;
|
|
4
|
+
export const CURRENCY = /^[a-z]{3}$/;
|
|
5
|
+
export const CONSENT_CONTEXT = /^[a-z][a-z0-9-]{0,63}$/;
|
|
6
|
+
/** The marker or type name a refusal of each express request carries in its message or type. */
|
|
7
|
+
export const CONSENT_REFUSAL_MARKERS = [
|
|
8
|
+
['performance-consent-required', ConsentKind.Performance],
|
|
9
|
+
[PerformanceConsentRequired.typeName, ConsentKind.Performance],
|
|
10
|
+
['subscription-start-required', ConsentKind.SubscriptionStart],
|
|
11
|
+
[SubscriptionStartRequired.typeName, ConsentKind.SubscriptionStart],
|
|
12
|
+
];
|
|
13
|
+
//# sourceMappingURL=consts.local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../src/consumer/consts.local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAEpF,MAAM,CAAC,MAAM,OAAO,GAAG,YAAY,CAAA;AAEnC,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAA;AAEpC,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAA;AAEvD,gGAAgG;AAChG,MAAM,CAAC,MAAM,uBAAuB,GAAiC;IACnE,CAAC,8BAA8B,EAAE,WAAW,CAAC,WAAW,CAAC;IACzD,CAAC,0BAA0B,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;IAC9D,CAAC,6BAA6B,EAAE,WAAW,CAAC,iBAAiB,CAAC;IAC9D,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,iBAAiB,CAAC;CACpE,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ConsentKind } from '../../consts.js';
|
|
2
|
+
import type { ProductPlan } from '../../types.js';
|
|
3
|
+
import type { ConsentStatement, CopyTree, CopyValues, LegalLabels } from '../types.js';
|
|
4
|
+
/** The consumer-rights legal copy of any language, and the texts rendered from it. */
|
|
5
|
+
export interface ConsumerCopyHelper {
|
|
6
|
+
/**
|
|
7
|
+
* The consumer-rights copy of one language — the `payment-consumer-rights` bundles as registered
|
|
8
|
+
* (the package's own, merged under any application override made with
|
|
9
|
+
* `addI18nApp(lng, 'payment-consumer-rights', data, { ns: LIB_NAMESPACE })`), key by key over the
|
|
10
|
+
* English ones so a missing key still reads. Any language, independent of the active i18next
|
|
11
|
+
* language and without draining a bundle: this is what a server renders e-mails and paygate
|
|
12
|
+
* texts from, and what a dialog shows in the billing country's language.
|
|
13
|
+
*/
|
|
14
|
+
consumerRightsCopy: (lng: string) => CopyTree;
|
|
15
|
+
/**
|
|
16
|
+
* One text of the copy at a dot path (`withdrawal.function`), its `{{name}}` placeholders filled.
|
|
17
|
+
* Values are inserted as given — escape them for the medium (HTML) before passing them in.
|
|
18
|
+
*
|
|
19
|
+
* With a `context`, the variant `<path>_<context>` is read first and the base `path` only where the
|
|
20
|
+
* copy has no such variant — the i18next context suffix (`performance-consent.request_included`).
|
|
21
|
+
*
|
|
22
|
+
* @throws ConsumerRightsError `copy:<path>` when the path is not a text, `copy:<path>:<name>` when a
|
|
23
|
+
* placeholder has no value — a legal text is never sent with a hole in it.
|
|
24
|
+
*/
|
|
25
|
+
consumerText: (lng: string, path: string, vars?: CopyValues, context?: string) => string;
|
|
26
|
+
/** The placeholders a text of the copy expects, in order of first appearance. */
|
|
27
|
+
placeholdersOf: (text: string) => string[];
|
|
28
|
+
/**
|
|
29
|
+
* The statutory button labels of one language — the withdrawal function (CRD Art. 11a; § 356a
|
|
30
|
+
* BGB; L221-21) and the cancellation function (§ 312k BGB; L215-1-1). Shown in the language of the
|
|
31
|
+
* billing country, whatever the interface language.
|
|
32
|
+
*/
|
|
33
|
+
legalLabelsOf: (lng: string) => LegalLabels;
|
|
34
|
+
/**
|
|
35
|
+
* The copy variant of a plan's subscription start statement — the one place it is decided.
|
|
36
|
+
*
|
|
37
|
+
* `'units'` exactly when the plan's `withdrawal.components` declare a `units` part: the statement
|
|
38
|
+
* then names the split (the services pro rata by time, the right of withdrawal expiring for the
|
|
39
|
+
* included units used) — the `_units` texts. Otherwise (no components, or `time` parts only: the
|
|
40
|
+
* whole price pro rata by the days elapsed) `undefined`, the base texts.
|
|
41
|
+
*/
|
|
42
|
+
startContextOf: (plan: Pick<ProductPlan, 'withdrawal'> | null | undefined) => 'units' | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* The express request of one consent kind in one language, rendered — what the dialog shows, the
|
|
45
|
+
* server records and the confirmation e-mail repeats verbatim. `trader` names the business;
|
|
46
|
+
* `plan` (the plan's title) is required for a subscription start; `context` picks the
|
|
47
|
+
* `_<context>` variant of each text that has one — the policy's `consentContext` for the
|
|
48
|
+
* performance consent, `startContextOf(plan)` for a subscription start.
|
|
49
|
+
*/
|
|
50
|
+
consentStatementOf: (lng: string, kind: ConsentKind, vars: {
|
|
51
|
+
trader: string;
|
|
52
|
+
plan?: string;
|
|
53
|
+
context?: string;
|
|
54
|
+
}) => ConsentStatement;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/consumer/copy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEtF,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,QAAQ,CAAA;IAC7C;;;;;;;;;OASG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACxF,iFAAiF;IACjF,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;IAC1C;;;;OAIG;IACH,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAA;IAC3C;;;;;;;OAOG;IACH,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,OAAO,GAAG,SAAS,CAAA;IACjG;;;;;;OAMG;IACH,kBAAkB,EAAE,CAClB,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KACtF,gBAAgB,CAAA;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/consumer/copy/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import '../i18n.js';
|
|
2
|
+
import { ConsentKind } from '../consts.js';
|
|
3
|
+
import type { ProductPlan } from '../types.js';
|
|
4
|
+
import type { ConsentStatement, CopyTree, CopyValues, LegalLabels } from './types.js';
|
|
5
|
+
import type { ConsumerCopyHelper } from './copy/types.js';
|
|
6
|
+
export declare const createConsumerCopyHelper: () => ConsumerCopyHelper;
|
|
7
|
+
export declare const consumerCopyHelper: ConsumerCopyHelper;
|
|
8
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consumerRightsCopy(…)` */
|
|
9
|
+
export declare const consumerRightsCopy: (lng: string) => CopyTree;
|
|
10
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consumerText(…)` */
|
|
11
|
+
export declare const consumerText: (lng: string, path: string, vars?: CopyValues, context?: string) => string;
|
|
12
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.legalLabelsOf(…)` */
|
|
13
|
+
export declare const legalLabelsOf: (lng: string) => LegalLabels;
|
|
14
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.startContextOf(…)` */
|
|
15
|
+
export declare const startContextOf: (plan: Pick<ProductPlan, 'withdrawal'> | null | undefined) => 'units' | undefined;
|
|
16
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consentStatementOf(…)` */
|
|
17
|
+
export declare const consentStatementOf: (lng: string, kind: ConsentKind, vars: {
|
|
18
|
+
trader: string;
|
|
19
|
+
plan?: string;
|
|
20
|
+
context?: string;
|
|
21
|
+
}) => ConsentStatement;
|
|
22
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/consumer/copy.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,CAAA;AACnB,OAAO,EAAE,WAAW,EAA4B,MAAM,cAAc,CAAA;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAKzD,eAAO,MAAM,wBAAwB,QAAO,kBAuF3C,CAAA;AAED,eAAO,MAAM,kBAAkB,oBAA6B,CAAA;AAE5D,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,QAAsD,CAAA;AAEvG,qFAAqF;AACrF,eAAO,MAAM,YAAY,QAAS,MAAM,QAAQ,MAAM,SAAS,UAAU,YAAY,MAAM,KAAG,MACnC,CAAA;AAE3D,sFAAsF;AACtF,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,WAAoD,CAAA;AAEhG,uFAAuF;AACvF,eAAO,MAAM,cAAc,SAAU,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,KAAG,OAAO,GAAG,SAC3D,CAAA;AAEzC,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,QACxB,MAAM,QAAQ,WAAW,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KACxF,gBAA0E,CAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { LIB_NAMESPACE, resolveI18nResource } from '@owlmeans/i18n';
|
|
2
|
+
import '../i18n.js';
|
|
3
|
+
import { ConsentKind, CONSUMER_RIGHTS_RESOURCE } from '../consts.js';
|
|
4
|
+
import { ConsumerRightsError } from '../errors.js';
|
|
5
|
+
import { consumerRightsPolicyHelper } from './policy.js';
|
|
6
|
+
const isTree = (value) => value != null && typeof value === 'object' && !Array.isArray(value);
|
|
7
|
+
export const createConsumerCopyHelper = () => {
|
|
8
|
+
const merge = (base, over) => {
|
|
9
|
+
const result = { ...base };
|
|
10
|
+
for (const [key, value] of Object.entries(over)) {
|
|
11
|
+
const current = result[key];
|
|
12
|
+
if (isTree(value)) {
|
|
13
|
+
result[key] = merge(isTree(current) ? current : {}, value);
|
|
14
|
+
}
|
|
15
|
+
else if (typeof value === 'string') {
|
|
16
|
+
result[key] = value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
const resolve = (lng) => resolveI18nResource(lng, CONSUMER_RIGHTS_RESOURCE, LIB_NAMESPACE);
|
|
22
|
+
const consumerRightsCopy = (lng) => {
|
|
23
|
+
const base = consumerRightsPolicyHelper.baseLanguageOf(lng);
|
|
24
|
+
let copy = merge({}, resolve('en') ?? {});
|
|
25
|
+
if (base !== '' && base !== 'en') {
|
|
26
|
+
copy = merge(copy, resolve(base) ?? {});
|
|
27
|
+
}
|
|
28
|
+
if (lng !== base && lng.trim() !== '') {
|
|
29
|
+
copy = merge(copy, resolve(lng) ?? {});
|
|
30
|
+
}
|
|
31
|
+
return copy;
|
|
32
|
+
};
|
|
33
|
+
const textAt = (copy, path) => {
|
|
34
|
+
const value = path.split('.').reduce((node, key) => isTree(node) ? node[key] : undefined, copy);
|
|
35
|
+
return typeof value === 'string' ? value : undefined;
|
|
36
|
+
};
|
|
37
|
+
const consumerText = (lng, path, vars = {}, context) => {
|
|
38
|
+
const copy = consumerRightsCopy(lng);
|
|
39
|
+
const variant = context != null && context !== '' ? `${path}_${context}` : null;
|
|
40
|
+
const key = variant != null && textAt(copy, variant) != null ? variant : path;
|
|
41
|
+
const value = textAt(copy, key);
|
|
42
|
+
if (value == null) {
|
|
43
|
+
throw new ConsumerRightsError(`copy:${path}`);
|
|
44
|
+
}
|
|
45
|
+
return value.replace(/\{\{\s*([\w-]+)\s*\}\}/g, (_, name) => {
|
|
46
|
+
const filled = vars[name];
|
|
47
|
+
if (filled == null) {
|
|
48
|
+
throw new ConsumerRightsError(`copy:${key}:${name}`);
|
|
49
|
+
}
|
|
50
|
+
return String(filled);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const placeholdersOf = (text) => [...new Set([...text.matchAll(/\{\{\s*([\w-]+)\s*\}\}/g)].map(match => match[1]))];
|
|
54
|
+
const legalLabelsOf = (lng) => ({
|
|
55
|
+
withdrawal: {
|
|
56
|
+
function: consumerText(lng, 'withdrawal.function'),
|
|
57
|
+
confirm: consumerText(lng, 'withdrawal.confirm'),
|
|
58
|
+
},
|
|
59
|
+
cancellation: {
|
|
60
|
+
function: consumerText(lng, 'cancellation.function'),
|
|
61
|
+
confirm: consumerText(lng, 'cancellation.confirm'),
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
const startContextOf = (plan) => plan?.withdrawal?.components?.some(component => component.basis === 'units') === true ? 'units' : undefined;
|
|
65
|
+
const consentStatementOf = (lng, kind, vars) => {
|
|
66
|
+
const branch = kind === ConsentKind.SubscriptionStart ? 'subscription-start' : 'performance-consent';
|
|
67
|
+
const values = { trader: vars.trader, ...(vars.plan != null ? { plan: vars.plan } : {}) };
|
|
68
|
+
return {
|
|
69
|
+
request: consumerText(lng, `${branch}.request`, values, vars.context),
|
|
70
|
+
acknowledgement: consumerText(lng, `${branch}.acknowledgement`, values, vars.context),
|
|
71
|
+
checkbox: consumerText(lng, `${branch}.checkbox`, values, vars.context),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
return { consumerRightsCopy, consumerText, placeholdersOf, legalLabelsOf, startContextOf, consentStatementOf };
|
|
75
|
+
};
|
|
76
|
+
export const consumerCopyHelper = createConsumerCopyHelper();
|
|
77
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consumerRightsCopy(…)` */
|
|
78
|
+
export const consumerRightsCopy = (lng) => consumerCopyHelper.consumerRightsCopy(lng);
|
|
79
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consumerText(…)` */
|
|
80
|
+
export const consumerText = (lng, path, vars, context) => consumerCopyHelper.consumerText(lng, path, vars, context);
|
|
81
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.legalLabelsOf(…)` */
|
|
82
|
+
export const legalLabelsOf = (lng) => consumerCopyHelper.legalLabelsOf(lng);
|
|
83
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.startContextOf(…)` */
|
|
84
|
+
export const startContextOf = (plan) => consumerCopyHelper.startContextOf(plan);
|
|
85
|
+
/** @deprecated compat:factory-refactor — use `consumerCopyHelper.consentStatementOf(…)` */
|
|
86
|
+
export const consentStatementOf = (lng, kind, vars) => consumerCopyHelper.consentStatementOf(lng, kind, vars);
|
|
87
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/consumer/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,YAAY,CAAA;AACnB,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAIxD,MAAM,MAAM,GAAG,CAAC,KAAc,EAAqB,EAAE,CACnD,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAErE,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAuB,EAAE;IAC/D,MAAM,KAAK,GAAG,CAAC,IAAc,EAAE,IAA6B,EAAY,EAAE;QACxE,MAAM,MAAM,GAAa,EAAE,GAAG,IAAI,EAAE,CAAA;QACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5D,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;YACrB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,GAAW,EAAkC,EAAE,CAC9D,mBAAmB,CAAC,GAAG,EAAE,wBAAwB,EAAE,aAAa,CAAC,CAAA;IAEnE,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAY,EAAE;QACnD,MAAM,IAAI,GAAG,0BAA0B,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QAC3D,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACzC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACzC,CAAC;QACD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACtC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,IAAY,EAAsB,EAAE;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAExG,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACtD,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,IAAI,GAAe,EAAE,EAAE,OAAgB,EAAU,EAAE;QAClG,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/E,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;QAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,mBAAmB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;YAClE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,mBAAmB,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,CAAA;YACtD,CAAC;YAED,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,IAAY,EAAY,EAAE,CAChD,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEpF,MAAM,aAAa,GAAG,CAAC,GAAW,EAAe,EAAE,CAAC,CAAC;QACnD,UAAU,EAAE;YACV,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,qBAAqB,CAAC;YAClD,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE,oBAAoB,CAAC;SACjD;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,uBAAuB,CAAC;YACpD,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE,sBAAsB,CAAC;SACnD;KACF,CAAC,CAAA;IAEF,MAAM,cAAc,GAAG,CAAC,IAAwD,EAAuB,EAAE,CACvG,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAE7G,MAAM,kBAAkB,GAAG,CACzB,GAAW,EAAE,IAAiB,EAAE,IAAyD,EACvE,EAAE;QACpB,MAAM,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,qBAAqB,CAAA;QACpG,MAAM,MAAM,GAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAErG,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,MAAM,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;YACrE,eAAe,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,MAAM,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;YACrF,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,MAAM,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;SACxE,CAAA;IACH,CAAC,CAAA;IAED,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA;AAChH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAA;AAE5D,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAY,EAAE,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;AAEvG,qFAAqF;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,IAAY,EAAE,IAAiB,EAAE,OAAgB,EAAU,EAAE,CACrG,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAE3D,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAe,EAAE,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAEhG,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAwD,EAAuB,EAAE,CAC9G,kBAAkB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;AAEzC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,GAAW,EAAE,IAAiB,EAAE,IAAyD,EACvE,EAAE,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DeadlinePolicy } from '../types.local.js';
|
|
2
|
+
import type { WithdrawalDeadlineRule, WithdrawalWindow } from '../types.js';
|
|
3
|
+
/** The withdrawal period: its exclusive end, its last day for display, and whether it is open. */
|
|
4
|
+
export interface WithdrawalDeadlineHelper {
|
|
5
|
+
/**
|
|
6
|
+
* The EXCLUSIVE end of a withdrawal period — the first instant at which it is over.
|
|
7
|
+
*
|
|
8
|
+
* The period starts the day after the purchase (the purchase day is not counted) and lasts `days`
|
|
9
|
+
* UTC calendar days; a last day on a Saturday or Sunday moves to the Monday after; `marginDays`
|
|
10
|
+
* are then added for public holidays and time zones; the result is the start of the next UTC day.
|
|
11
|
+
* Wed 2026-09-23 → 2026-10-13T00:00Z, Sat 2026-09-26 → 2026-10-18T00:00Z, Sun 2026-12-20 →
|
|
12
|
+
* 2027-01-10T00:00Z (14 days, margin 5). Shown to a person as its last included day
|
|
13
|
+
* (`lastWithdrawalDayOf`), never as the exclusive instant.
|
|
14
|
+
*
|
|
15
|
+
* @throws ConsumerRightsError (`deadline`) for an invalid date or rule.
|
|
16
|
+
*/
|
|
17
|
+
withdrawalDeadlineOf: (purchasedAt: Date, rule?: WithdrawalDeadlineRule | DeadlinePolicy) => Date;
|
|
18
|
+
/**
|
|
19
|
+
* The last day a withdrawal is still in time, for display: the UTC calendar day of `deadline − 1 ms`
|
|
20
|
+
* (a deadline is the EXCLUSIVE first instant after the period). 2026-10-13T00:00Z → 2026-10-12;
|
|
21
|
+
* show it as a UTC date, "until the end of 12 October 2026".
|
|
22
|
+
*/
|
|
23
|
+
lastWithdrawalDayOf: (deadline: Date) => Date;
|
|
24
|
+
/**
|
|
25
|
+
* Whether a withdrawal window is open at `at`: a deadline exists, `at` is before it, and the
|
|
26
|
+
* purchase was neither withdrawn from nor refunded. A bare deadline is accepted as well.
|
|
27
|
+
*/
|
|
28
|
+
withdrawalOpen: (window: WithdrawalWindow | Date | null | undefined, at?: Date) => boolean;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/consumer/deadline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE3E,kGAAkG;AAClG,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;;;OAWG;IACH,oBAAoB,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,sBAAsB,GAAG,cAAc,KAAK,IAAI,CAAA;IACjG;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAA;IAC7C;;;OAGG;IACH,cAAc,EAAE,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,IAAI,KAAK,OAAO,CAAA;CAC3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/consumer/deadline/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DeadlinePolicy } from './types.local.js';
|
|
2
|
+
import type { WithdrawalDeadlineRule, WithdrawalWindow } from './types.js';
|
|
3
|
+
import type { WithdrawalDeadlineHelper } from './deadline/types.js';
|
|
4
|
+
export declare const createWithdrawalDeadlineHelper: () => WithdrawalDeadlineHelper;
|
|
5
|
+
export declare const withdrawalDeadlineHelper: WithdrawalDeadlineHelper;
|
|
6
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.withdrawalDeadlineOf(…)` */
|
|
7
|
+
export declare const withdrawalDeadlineOf: (purchasedAt: Date, rule?: WithdrawalDeadlineRule | DeadlinePolicy) => Date;
|
|
8
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.lastWithdrawalDayOf(…)` */
|
|
9
|
+
export declare const lastWithdrawalDayOf: (deadline: Date) => Date;
|
|
10
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.withdrawalOpen(…)` */
|
|
11
|
+
export declare const withdrawalOpen: (window: WithdrawalWindow | Date | null | undefined, at?: Date) => boolean;
|
|
12
|
+
//# sourceMappingURL=deadline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../../src/consumer/deadline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAEnE,eAAO,MAAM,8BAA8B,QAAO,wBAyCjD,CAAA;AAED,eAAO,MAAM,wBAAwB,0BAAmC,CAAA;AAExE,mGAAmG;AACnG,eAAO,MAAM,oBAAoB,gBAAiB,IAAI,SAAS,sBAAsB,GAAG,cAAc,KAAG,IACvC,CAAA;AAElE,kGAAkG;AAClG,eAAO,MAAM,mBAAmB,aAAc,IAAI,KAAG,IAA8D,CAAA;AAEnH,6FAA6F;AAC7F,eAAO,MAAM,cAAc,WAAY,gBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,OAAO,IAAI,KAAG,OAC1C,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ConsumerRightsError } from '../errors.js';
|
|
2
|
+
import { DAY_MS } from './consts.js';
|
|
3
|
+
export const createWithdrawalDeadlineHelper = () => {
|
|
4
|
+
const ruleOf = (rule) => {
|
|
5
|
+
if (rule != null && 'withdrawalDays' in rule) {
|
|
6
|
+
return { days: rule.withdrawalDays, weekendRollover: rule.deadline.weekendRollover, marginDays: rule.deadline.marginDays };
|
|
7
|
+
}
|
|
8
|
+
return { days: rule?.days ?? 14, weekendRollover: rule?.weekendRollover ?? true, marginDays: rule?.marginDays ?? 5 };
|
|
9
|
+
};
|
|
10
|
+
const withdrawalDeadlineOf = (purchasedAt, rule) => {
|
|
11
|
+
const { days, weekendRollover, marginDays } = ruleOf(rule);
|
|
12
|
+
if (Number.isNaN(purchasedAt.getTime()) || !Number.isSafeInteger(days) || days < 0
|
|
13
|
+
|| !Number.isSafeInteger(marginDays) || marginDays < 0) {
|
|
14
|
+
throw new ConsumerRightsError('deadline');
|
|
15
|
+
}
|
|
16
|
+
const purchaseDay = Date.UTC(purchasedAt.getUTCFullYear(), purchasedAt.getUTCMonth(), purchasedAt.getUTCDate());
|
|
17
|
+
let lastDay = purchaseDay + days * DAY_MS;
|
|
18
|
+
if (weekendRollover) {
|
|
19
|
+
const weekday = new Date(lastDay).getUTCDay();
|
|
20
|
+
lastDay += weekday === 6 ? 2 * DAY_MS : weekday === 0 ? DAY_MS : 0;
|
|
21
|
+
}
|
|
22
|
+
return new Date(lastDay + (marginDays + 1) * DAY_MS);
|
|
23
|
+
};
|
|
24
|
+
const lastWithdrawalDayOf = (deadline) => {
|
|
25
|
+
const last = new Date(deadline.getTime() - 1);
|
|
26
|
+
return new Date(Date.UTC(last.getUTCFullYear(), last.getUTCMonth(), last.getUTCDate()));
|
|
27
|
+
};
|
|
28
|
+
const withdrawalOpen = (window, at = new Date()) => {
|
|
29
|
+
if (window == null) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const { deadline, withdrawnAt, refundedAt } = window instanceof Date ? { deadline: window } : window;
|
|
33
|
+
return deadline != null && withdrawnAt == null && refundedAt == null && at.getTime() < deadline.getTime();
|
|
34
|
+
};
|
|
35
|
+
return { withdrawalDeadlineOf, lastWithdrawalDayOf, withdrawalOpen };
|
|
36
|
+
};
|
|
37
|
+
export const withdrawalDeadlineHelper = createWithdrawalDeadlineHelper();
|
|
38
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.withdrawalDeadlineOf(…)` */
|
|
39
|
+
export const withdrawalDeadlineOf = (purchasedAt, rule) => withdrawalDeadlineHelper.withdrawalDeadlineOf(purchasedAt, rule);
|
|
40
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.lastWithdrawalDayOf(…)` */
|
|
41
|
+
export const lastWithdrawalDayOf = (deadline) => withdrawalDeadlineHelper.lastWithdrawalDayOf(deadline);
|
|
42
|
+
/** @deprecated compat:factory-refactor — use `withdrawalDeadlineHelper.withdrawalOpen(…)` */
|
|
43
|
+
export const withdrawalOpen = (window, at) => withdrawalDeadlineHelper.withdrawalOpen(window, at);
|
|
44
|
+
//# sourceMappingURL=deadline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../src/consumer/deadline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKpC,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAA6B,EAAE;IAC3E,MAAM,MAAM,GAAG,CAAC,IAA8C,EAAoC,EAAE;QAClG,IAAI,IAAI,IAAI,IAAI,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;QAC5H,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,IAAI,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,CAAA;IACtH,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,CAAC,WAAiB,EAAE,IAA8C,EAAQ,EAAE;QACvG,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;eAC7E,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAA;QAC/G,IAAI,OAAO,GAAG,WAAW,GAAG,IAAI,GAAG,MAAM,CAAA;QACzC,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAA;YAC7C,OAAO,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;IACtD,CAAC,CAAA;IAED,MAAM,mBAAmB,GAAG,CAAC,QAAc,EAAQ,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAE7C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,CAAC,MAAkD,EAAE,EAAE,GAAS,IAAI,IAAI,EAAE,EAAW,EAAE;QAC5G,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAsB,CAAC,CAAC,CAAC,MAAM,CAAA;QAExH,OAAO,QAAQ,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;IAC3G,CAAC,CAAA;IAED,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,EAAE,CAAA;AAExE,mGAAmG;AACnG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,WAAiB,EAAE,IAA8C,EAAQ,EAAE,CAC9G,wBAAwB,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;AAElE,kGAAkG;AAClG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAc,EAAQ,EAAE,CAAC,wBAAwB,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAA;AAEnH,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAkD,EAAE,EAAS,EAAW,EAAE,CACvG,wBAAwB,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { FifoAllocation, FifoLot, FifoLotUsage, FifoSpend } from '../types.js';
|
|
2
|
+
/** First-in-first-out allocation of spends over granted lots. */
|
|
3
|
+
export interface FifoHelper {
|
|
4
|
+
/**
|
|
5
|
+
* First in, first out: every spend, in time order, takes from the oldest lot granted AT OR BEFORE
|
|
6
|
+
* it that still has units, then the next one; what no such lot covers is `unallocated` (a lot
|
|
7
|
+
* granted later never pays for an earlier spend). Lots come back in grant order. Pure — the input
|
|
8
|
+
* arrays are not reordered.
|
|
9
|
+
*/
|
|
10
|
+
allocateFifo: (lots: FifoLot[], spends: FifoSpend[]) => FifoAllocation;
|
|
11
|
+
/**
|
|
12
|
+
* The units of a lot used strictly AFTER an instant — its consent. Without one (`null`), nothing
|
|
13
|
+
* is deductible: before consent the consumer bears no cost.
|
|
14
|
+
*/
|
|
15
|
+
unitsUsedAfter: (lot: Pick<FifoLotUsage, 'slices'>, after: Date | null | undefined) => number;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/consumer/fifo/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEnF,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,cAAc,CAAA;IACtE;;;OAGG;IACH,cAAc,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,CAAA;CAC9F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/consumer/fifo/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fifo.d.ts","sourceRoot":"","sources":["../../src/consumer/fifo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,gBAAgB,QAAO,UAoCnC,CAAA;AAED,eAAO,MAAM,UAAU,YAAqB,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const createFifoHelper = () => {
|
|
2
|
+
const allocateFifo = (lots, spends) => {
|
|
3
|
+
const usage = [...lots]
|
|
4
|
+
.map((lot, index) => ({ lot, index }))
|
|
5
|
+
.sort((a, b) => a.lot.at.getTime() - b.lot.at.getTime() || a.index - b.index)
|
|
6
|
+
.map(({ lot }) => ({ id: lot.id, at: lot.at, granted: Math.max(0, lot.units), used: 0, slices: [] }));
|
|
7
|
+
const ordered = [...spends]
|
|
8
|
+
.map((spend, index) => ({ spend, index }))
|
|
9
|
+
.sort((a, b) => a.spend.at.getTime() - b.spend.at.getTime() || a.index - b.index);
|
|
10
|
+
let unallocated = 0;
|
|
11
|
+
for (const { spend } of ordered) {
|
|
12
|
+
let left = Math.max(0, spend.units);
|
|
13
|
+
for (const lot of usage) {
|
|
14
|
+
if (left <= 0 || lot.at.getTime() > spend.at.getTime()) {
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
const take = Math.min(left, lot.granted - lot.used);
|
|
18
|
+
if (take > 0) {
|
|
19
|
+
lot.used += take;
|
|
20
|
+
lot.slices.push({ at: spend.at, units: take });
|
|
21
|
+
left -= take;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
unallocated += left;
|
|
25
|
+
}
|
|
26
|
+
return { lots: usage, unallocated };
|
|
27
|
+
};
|
|
28
|
+
const unitsUsedAfter = (lot, after) => after == null ? 0 : lot.slices
|
|
29
|
+
.filter(slice => slice.at.getTime() > after.getTime())
|
|
30
|
+
.reduce((sum, slice) => sum + slice.units, 0);
|
|
31
|
+
return { allocateFifo, unitsUsedAfter };
|
|
32
|
+
};
|
|
33
|
+
export const fifoHelper = createFifoHelper();
|
|
34
|
+
//# sourceMappingURL=fifo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fifo.js","sourceRoot":"","sources":["../../src/consumer/fifo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './policy.js';
|
|
2
|
+
export * from './consts.js';
|
|
3
|
+
export type * from './types.js';
|
|
4
|
+
export type * from './copy/types.js';
|
|
5
|
+
export type * from './deadline/types.js';
|
|
6
|
+
export type * from './fifo/types.js';
|
|
7
|
+
export type * from './policy/types.js';
|
|
8
|
+
export type * from './refund/types.js';
|
|
9
|
+
export type * from './revive/types.js';
|
|
10
|
+
export * from './deadline.js';
|
|
11
|
+
export * from './refund.js';
|
|
12
|
+
export * from './fifo.js';
|
|
13
|
+
export * from './cancel.js';
|
|
14
|
+
export * from './copy.js';
|
|
15
|
+
export * from './refusal.js';
|
|
16
|
+
export * from './revive.js';
|
|
17
|
+
export * from './protocols.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/consumer/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,mBAAmB,YAAY,CAAA;AAC/B,mBAAmB,iBAAiB,CAAA;AACpC,mBAAmB,qBAAqB,CAAA;AACxC,mBAAmB,iBAAiB,CAAA;AACpC,mBAAmB,mBAAmB,CAAA;AACtC,mBAAmB,mBAAmB,CAAA;AACtC,mBAAmB,mBAAmB,CAAA;AACtC,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './policy.js';
|
|
2
|
+
export * from './consts.js';
|
|
3
|
+
export * from './deadline.js';
|
|
4
|
+
export * from './refund.js';
|
|
5
|
+
export * from './fifo.js';
|
|
6
|
+
export * from './cancel.js';
|
|
7
|
+
export * from './copy.js';
|
|
8
|
+
export * from './refusal.js';
|
|
9
|
+
export * from './revive.js';
|
|
10
|
+
export * from './protocols.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/consumer/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAQ3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ConsumerRightsLinks, ConsumerRightsPolicy } from '../../types.js';
|
|
2
|
+
/** The consumer-rights policy's invariants, its languages and its links. */
|
|
3
|
+
export interface ConsumerRightsPolicyHelper {
|
|
4
|
+
/**
|
|
5
|
+
* @throws ConsumerRightsError (`policy:<field>`) when the text version is empty, a country or a
|
|
6
|
+
* currency is malformed, the period is shorter than 14 days, the margin is outside 0..7 days, the
|
|
7
|
+
* consent context is not a lowercase key, the default language has no links, a link is not an
|
|
8
|
+
* absolute https URL, or the withdrawal information is missing while the withdrawal function or the
|
|
9
|
+
* performance consent is on.
|
|
10
|
+
*/
|
|
11
|
+
assertConsumerRightsPolicy: (policy: ConsumerRightsPolicy) => ConsumerRightsPolicy;
|
|
12
|
+
/** `de-DE` → `de`. */
|
|
13
|
+
baseLanguageOf: (lng: string | null | undefined) => string;
|
|
14
|
+
/**
|
|
15
|
+
* The links of one language, field by field over the default language's — a language that only
|
|
16
|
+
* translates the Billing Terms still points at the default withdrawal information.
|
|
17
|
+
*/
|
|
18
|
+
linksOf: (policy: Pick<ConsumerRightsPolicy, 'links' | 'defaultLanguage'>, lng?: string | null) => ConsumerRightsLinks;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/consumer/policy/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE/E,4EAA4E;AAC5E,MAAM,WAAW,0BAA0B;IACzC;;;;;;OAMG;IACH,0BAA0B,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,oBAAoB,CAAA;IAClF,sBAAsB;IACtB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,CAAA;IAC1D;;;OAGG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,iBAAiB,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,mBAAmB,CAAA;CACvH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/consumer/policy/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ConsumerRightsLinks, ConsumerRightsPolicy } from '../types.js';
|
|
2
|
+
import type { ConsumerRightsDeclaration } from './types.js';
|
|
3
|
+
import type { ConsumerRightsPolicyHelper } from './policy/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* A declaration filled with `DEFAULT_CONSUMER_RIGHTS` and asserted. Only the policy's own fields are
|
|
6
|
+
* copied — anything else on `def` (a server's mail options) never reaches the advertised record.
|
|
7
|
+
*/
|
|
8
|
+
export declare const makeConsumerRightsPolicy: (def: ConsumerRightsDeclaration) => ConsumerRightsPolicy;
|
|
9
|
+
export declare const createConsumerRightsPolicyHelper: () => ConsumerRightsPolicyHelper;
|
|
10
|
+
export declare const consumerRightsPolicyHelper: ConsumerRightsPolicyHelper;
|
|
11
|
+
/** @deprecated compat:factory-refactor — use `consumerRightsPolicyHelper.assertConsumerRightsPolicy(…)` */
|
|
12
|
+
export declare const assertConsumerRightsPolicy: (policy: ConsumerRightsPolicy) => ConsumerRightsPolicy;
|
|
13
|
+
/** @deprecated compat:factory-refactor — use `consumerRightsPolicyHelper.baseLanguageOf(…)` */
|
|
14
|
+
export declare const baseLanguageOf: (lng: string | null | undefined) => string;
|
|
15
|
+
/** @deprecated compat:factory-refactor — use `consumerRightsPolicyHelper.linksOf(…)` */
|
|
16
|
+
export declare const linksOf: (policy: Pick<ConsumerRightsPolicy, 'links' | 'defaultLanguage'>, lng?: string | null) => ConsumerRightsLinks;
|
|
17
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/consumer/policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAG5E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAS,yBAAyB,KAAG,oBAqBzE,CAAA;AAED,eAAO,MAAM,gCAAgC,QAAO,0BAoDnD,CAAA;AAED,eAAO,MAAM,0BAA0B,4BAAqC,CAAA;AAE5E,2GAA2G;AAC3G,eAAO,MAAM,0BAA0B,WAAY,oBAAoB,KAAG,oBACX,CAAA;AAE/D,+FAA+F;AAC/F,eAAO,MAAM,cAAc,QAAS,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAAwD,CAAA;AAExH,wFAAwF;AACxF,eAAO,MAAM,OAAO,WACV,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,iBAAiB,CAAC,QAAQ,MAAM,GAAG,IAAI,KACnF,mBAAsE,CAAA"}
|