@saasicat/nest 1.0.0-rc.2 → 1.0.0-rc.21

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 (154) hide show
  1. package/README.md +44 -8
  2. package/dist/.build-stamp +1 -1
  3. package/dist/_entries.cjs +10214 -4796
  4. package/dist/admin/index.d.cts +5 -4
  5. package/dist/admin/index.d.ts +5 -4
  6. package/dist/admin/index.js +13 -9
  7. package/dist/{admin-resources.module-CpvzcfCc.d.cts → admin-resources.module-B4XNvdH-.d.cts} +1 -2
  8. package/dist/{admin-resources.module-DF5_Q7RD.d.ts → admin-resources.module-CWqdI9BV.d.ts} +1 -2
  9. package/dist/{admin-stats.service-TYiSUwIR.d.ts → admin-stats.service-CsLNt19Z.d.ts} +11 -7
  10. package/dist/{admin-stats.service-DfKupywR.d.cts → admin-stats.service-DrZrU8IJ.d.cts} +11 -7
  11. package/dist/{aggregation-B3CD0v_d.d.cts → aggregation-ChpZDh0g.d.ts} +39 -6
  12. package/dist/{aggregation-BFzW07DE.d.ts → aggregation-OpnhwzF5.d.cts} +39 -6
  13. package/dist/billing/index.d.cts +448 -108
  14. package/dist/billing/index.d.ts +448 -108
  15. package/dist/billing/index.js +108 -41
  16. package/dist/catalog/index.d.cts +74 -45
  17. package/dist/catalog/index.d.ts +74 -45
  18. package/dist/catalog/index.js +21 -13
  19. package/dist/catalog.module-C9O7BxRq.d.ts +180 -0
  20. package/dist/catalog.module-T-I5Ricz.d.cts +180 -0
  21. package/dist/checkout-offer/index.d.cts +17 -22
  22. package/dist/checkout-offer/index.d.ts +17 -22
  23. package/dist/checkout-offer/index.js +21 -7
  24. package/dist/checkout-offer.module-DFhGy6JO.d.cts +58 -0
  25. package/dist/checkout-offer.module-x7SP_dX4.d.ts +58 -0
  26. package/dist/checkout-offer.service-BeHgYikI.d.ts +242 -0
  27. package/dist/checkout-offer.service-CCVxG9b2.d.cts +242 -0
  28. package/dist/chunk-34XVPR6P.js +222 -0
  29. package/dist/{chunk-AOQJEYOL.js → chunk-3QVGA6JX.js} +3 -1
  30. package/dist/chunk-3RLWML2S.js +896 -0
  31. package/dist/{chunk-TXC3LHHB.js → chunk-4SDSYV4A.js} +21 -13
  32. package/dist/chunk-55QEDAMX.js +946 -0
  33. package/dist/chunk-5CKC7O52.js +140 -0
  34. package/dist/chunk-6PJE7EWO.js +185 -0
  35. package/dist/chunk-7NJKVC5X.js +353 -0
  36. package/dist/{chunk-RUNZ3X4C.js → chunk-AOS2JPDD.js} +1263 -185
  37. package/dist/{chunk-WOVQPXV4.js → chunk-CQ2ZZMTD.js} +702 -725
  38. package/dist/{chunk-NA6O63B7.js → chunk-F5X66HF5.js} +5 -5
  39. package/dist/chunk-FEQZCWUL.js +174 -0
  40. package/dist/{chunk-VIJ5NJWC.js → chunk-G6EZWECL.js} +107 -31
  41. package/dist/chunk-G7RQO2XO.js +0 -0
  42. package/dist/{chunk-N3L3AICU.js → chunk-GPQWGA6B.js} +5 -6
  43. package/dist/chunk-GZTL64QK.js +7 -0
  44. package/dist/{chunk-SABTXESR.js → chunk-J7NJRK3K.js} +17 -1
  45. package/dist/{chunk-SEPN52AD.js → chunk-JBCC6C3M.js} +566 -307
  46. package/dist/{chunk-I7GTA3RX.js → chunk-JQRA724W.js} +1 -1
  47. package/dist/{chunk-WXYJHZCN.js → chunk-JVAEKTJ4.js} +2 -14
  48. package/dist/chunk-KPEMTBOP.js +26 -0
  49. package/dist/chunk-LF6J4YYN.js +301 -0
  50. package/dist/{chunk-LTT736P3.js → chunk-LLYVYRGJ.js} +228 -387
  51. package/dist/{chunk-6Z7JR4EW.js → chunk-M47BNEY2.js} +1897 -633
  52. package/dist/{chunk-KFT5AIIH.js → chunk-NDLC5GYK.js} +206 -24
  53. package/dist/{chunk-O2J2HDXA.js → chunk-OOTEXP47.js} +3 -8
  54. package/dist/chunk-QPVDCKYS.js +702 -0
  55. package/dist/{chunk-NHVDCYK5.js → chunk-R5YCJBHY.js} +71 -106
  56. package/dist/{chunk-XBYAFEOR.js → chunk-S33SO5XX.js} +1 -1
  57. package/dist/chunk-SZ7RFPXA.js +10 -0
  58. package/dist/chunk-TBBZWZQT.js +98 -0
  59. package/dist/chunk-TOEFN7DN.js +295 -0
  60. package/dist/{chunk-7ZEGFL42.js → chunk-WHJSYKNC.js} +6 -6
  61. package/dist/chunk-WOEJ6K7M.js +55 -0
  62. package/dist/{chunk-AU3OOREM.js → chunk-XSSWYPP5.js} +16 -3
  63. package/dist/contract-line-item-money-B0Z3Ogur.d.cts +43 -0
  64. package/dist/contract-line-item-money-B0Z3Ogur.d.ts +43 -0
  65. package/dist/discovery/index.d.cts +2 -2
  66. package/dist/discovery/index.d.ts +2 -2
  67. package/dist/discovery/index.js +6 -6
  68. package/dist/{discovery.scanner-9cMqF95o.d.cts → discovery.scanner-DXKc6JkV.d.cts} +1 -1
  69. package/dist/{discovery.scanner-9cMqF95o.d.ts → discovery.scanner-DXKc6JkV.d.ts} +1 -1
  70. package/dist/{enforce-quota.interceptor-Df0e3OWe.d.cts → enforce-quota.interceptor-BFyVdWe8.d.cts} +6 -6
  71. package/dist/{enforce-quota.interceptor-DW3etVyI.d.ts → enforce-quota.interceptor-GaBXboGx.d.ts} +6 -6
  72. package/dist/entitlement/index.d.cts +27 -4
  73. package/dist/entitlement/index.d.ts +27 -4
  74. package/dist/entitlement/index.js +13 -8
  75. package/dist/index.d.cts +209 -28
  76. package/dist/index.d.ts +209 -28
  77. package/dist/index.js +285 -163
  78. package/dist/issuer-identity.check-CBO0vcsq.d.cts +197 -0
  79. package/dist/issuer-identity.check-Cz9CEMkZ.d.ts +197 -0
  80. package/dist/{module-options-COSEb0VW.d.ts → module-options-DmQ3G4sZ.d.ts} +135 -41
  81. package/dist/{module-options-BG3MzQva.d.cts → module-options-qAOwinHR.d.cts} +135 -41
  82. package/dist/payment-callback.service-CR84Xw1Z.d.cts +125 -0
  83. package/dist/payment-callback.service-CR84Xw1Z.d.ts +125 -0
  84. package/dist/payments/index.cjs +4 -0
  85. package/dist/payments/index.d.cts +187 -0
  86. package/dist/payments/index.d.ts +187 -0
  87. package/dist/payments/index.js +141 -0
  88. package/dist/payments.module-BdUq9ot_.d.cts +57 -0
  89. package/dist/payments.module-CQGv_VG7.d.ts +57 -0
  90. package/dist/plan-catalog-source-DWe-BGY1.d.cts +21 -0
  91. package/dist/plan-catalog-source-DWe-BGY1.d.ts +21 -0
  92. package/dist/{plan-resolution-Cgo_TR1H.d.cts → plan-resolution-CwUy_OqC.d.cts} +14 -0
  93. package/dist/{plan-resolution-Cgo_TR1H.d.ts → plan-resolution-CwUy_OqC.d.ts} +14 -0
  94. package/dist/{plan-versions.service-DChhbK6h.d.ts → plan-versions.service-C0N-Em2W.d.ts} +38 -64
  95. package/dist/{plan-versions.service-TPEtbN0r.d.cts → plan-versions.service-DARLh-qI.d.cts} +38 -64
  96. package/dist/platform/index.d.cts +52 -23
  97. package/dist/platform/index.d.ts +52 -23
  98. package/dist/platform/index.js +57 -36
  99. package/dist/promo/index.d.cts +23 -8
  100. package/dist/promo/index.d.ts +23 -8
  101. package/dist/promo/index.js +15 -7
  102. package/dist/{promo.module-DtvIycpt.d.cts → promo.module-CKkECmU8.d.cts} +9 -3
  103. package/dist/{promo.module-Z8h1PNX-.d.ts → promo.module-DuIJdK3U.d.ts} +9 -3
  104. package/dist/promo.service-BYBu6dy3.d.cts +215 -0
  105. package/dist/promo.service-CFjfF0Xm.d.ts +215 -0
  106. package/dist/registration/index.d.cts +104 -47
  107. package/dist/registration/index.d.ts +104 -47
  108. package/dist/registration/index.js +15 -9
  109. package/dist/subscriber/index.cjs +4 -0
  110. package/dist/subscriber/index.d.cts +28 -0
  111. package/dist/subscriber/index.d.ts +28 -0
  112. package/dist/subscriber/index.js +16 -0
  113. package/dist/subscriber.service-5W6Gi-1B.d.cts +68 -0
  114. package/dist/subscriber.service-5W6Gi-1B.d.ts +68 -0
  115. package/dist/subscription-contract/index.d.cts +4 -2
  116. package/dist/subscription-contract/index.d.ts +4 -2
  117. package/dist/subscription-contract/index.js +13 -5
  118. package/dist/{subscription-contract.module-fDFdQ0jm.d.ts → subscription-contract.module-BfIRpc1o.d.ts} +8 -2
  119. package/dist/{subscription-contract.module-CEK8HS5-.d.cts → subscription-contract.module-DTMuUJYd.d.cts} +8 -2
  120. package/dist/{subscription-contract.service-hD87MKyg.d.cts → subscription-contract.service-CPZrTM9C.d.ts} +32 -3
  121. package/dist/{subscription-contract.service-hD87MKyg.d.ts → subscription-contract.service-CfNApLuP.d.cts} +32 -3
  122. package/dist/tenant-billing.controller-BLqbsONe.d.ts +812 -0
  123. package/dist/tenant-billing.controller-DKbAqTbM.d.cts +812 -0
  124. package/dist/tenant-billing.module-ClbjzocC.d.cts +364 -0
  125. package/dist/tenant-billing.module-DohgJJ2m.d.ts +364 -0
  126. package/dist/tenant-billing.tokens-G-1xOlMr.d.cts +129 -0
  127. package/dist/tenant-billing.tokens-G-1xOlMr.d.ts +129 -0
  128. package/dist/testing/index.d.cts +44 -17
  129. package/dist/testing/index.d.ts +44 -17
  130. package/dist/testing/index.js +189 -40
  131. package/package.json +24 -4
  132. package/dist/catalog.module-BDDO6iwq.d.cts +0 -103
  133. package/dist/catalog.module-BTnMsE6u.d.ts +0 -103
  134. package/dist/checkout-offer.module-CMtiQJTT.d.ts +0 -39
  135. package/dist/checkout-offer.module-CVpWrzbe.d.cts +0 -39
  136. package/dist/checkout-offer.service-BLOv2HOo.d.cts +0 -49
  137. package/dist/checkout-offer.service-BLOv2HOo.d.ts +0 -49
  138. package/dist/chunk-57V6ZTI6.js +0 -22
  139. package/dist/chunk-BSK6YBLI.js +0 -87
  140. package/dist/chunk-DQKCK7DX.js +0 -217
  141. package/dist/chunk-VXEYLNIB.js +0 -632
  142. package/dist/chunk-WUDYIPYH.js +0 -715
  143. package/dist/define-saasicat-DROBe-b1.d.ts +0 -69
  144. package/dist/define-saasicat-vGBCkFys.d.cts +0 -69
  145. package/dist/promo.service-BJbKAmw3.d.cts +0 -112
  146. package/dist/promo.service-BJbKAmw3.d.ts +0 -112
  147. package/dist/tenant-billing.controller-BQ67mlmI.d.ts +0 -438
  148. package/dist/tenant-billing.controller-DS8kB8a7.d.cts +0 -438
  149. package/dist/tenant-billing.module-BznC3XtW.d.cts +0 -299
  150. package/dist/tenant-billing.module-wUbsQSFG.d.ts +0 -299
  151. /package/dist/{chunk-2FR6ZL7R.js → chunk-BHZOH2DY.js} +0 -0
  152. /package/dist/{chunk-2SLTRKXC.js → chunk-DFOW3JVO.js} +0 -0
  153. /package/dist/{chunk-DBZGV3HC.js → chunk-DU56UKEH.js} +0 -0
  154. /package/dist/{chunk-OYNHOY45.js → chunk-GAUEVIAE.js} +0 -0
@@ -1,103 +0,0 @@
1
- import { Type, CanActivate, DynamicModule, ForwardReference, Provider } from '@nestjs/common';
2
- import { BundleRepository, MarketingProjectionRepository, CatalogEntryRepository, PromotionRepository, MarketingSettingsRepository, PlanRepository, FeatureUiRegistry } from '@saasicat/core';
3
- import { P as ProviderSpec } from './di-CcNeq9v-.cjs';
4
-
5
- interface CatalogControllerConfig {
6
- /**
7
- * Class-level guards for `BundlesController` and `BundleVersionsController`.
8
- * REQUIRED — otherwise `forRoot()` throws at boot. Pass `[]` explicitly
9
- * if the endpoints should intentionally be auth-free.
10
- */
11
- guards: Array<Type<CanActivate>>;
12
- }
13
- interface CatalogModuleOptions {
14
- /** Adapter for `bundles` + `bundle_versions` persistence. */
15
- bundleRepository: ProviderSpec<BundleRepository>;
16
- /**
17
- * Adapter for `marketing_projections` persistence. Optional — if
18
- * omitted, MarketingProjectionsService + controller are not
19
- * registered.
20
- */
21
- marketingProjectionRepository?: ProviderSpec<MarketingProjectionRepository>;
22
- /**
23
- * Adapter for `capability_/feature_/quota_catalog_entries` persistence
24
- * (discovery review). Optional — if omitted,
25
- * CatalogEntriesService + controller are not registered.
26
- */
27
- catalogEntryRepository?: ProviderSpec<CatalogEntryRepository>;
28
- /**
29
- * Adapter for `promotions` persistence. Optional — if
30
- * omitted, PromotionsService + controller are not registered.
31
- */
32
- promotionRepository?: ProviderSpec<PromotionRepository>;
33
- /**
34
- * Adapter for `marketing_settings` persistence (
35
- * `activeLocales`). Optional.
36
- */
37
- marketingSettingsRepository?: ProviderSpec<MarketingSettingsRepository>;
38
- /**
39
- * Auth-free pricing-page endpoint `GET /public/marketing-catalog`
40
- *. Registered only when plan-, marketingProjection-
41
- * and promotionRepository are set. `guards` is usually `[]`.
42
- */
43
- publicMarketingCatalog?: {
44
- guards: Array<Type<CanActivate>>;
45
- projectKey: string;
46
- currency: string;
47
- vatRate: number;
48
- };
49
- /**
50
- * — adapter for `plans` master-record persistence.
51
- * Optional; if omitted, PlansService + controller are not
52
- * registered (apps without a need for the plan editor stay unchanged).
53
- */
54
- planRepository?: ProviderSpec<PlanRepository>;
55
- /**
56
- * Controller mount for `/admin/catalog/bundles` + `/admin/catalog/bundle-versions`.
57
- * If omitted, the endpoints are not registered — but the services remain usable via DI.
58
- */
59
- controller?: CatalogControllerConfig;
60
- /**
61
- * Strict-mode mode. `blocking` (default, #12) throws HTTP 422 on
62
- * violations and requires a DiscoverySnapshot; `warn-only` returns them
63
- * only as a warning (transition until 100% discovery coverage).
64
- */
65
- strictModeCheckMode?: 'warn-only' | 'blocking';
66
- /**
67
- * Discovery→catalog auto-sync at boot (#12). Default `true` — as soon as a
68
- * `catalogEntryRepository` is wired and a DiscoverySnapshot is available,
69
- * `CatalogEntriesService` mirrors the discovery into the DB at startup. `false`
70
- * disables the boot sync; the manual sync endpoint remains usable.
71
- */
72
- autoSyncDiscoveryAtBoot?: boolean;
73
- /**
74
- * Feature keys the catalog is deliberately allowed to carry without them
75
- * existing in the discovery snapshot (marketed non-code features such as
76
- * support SLAs, e.g. `['PRIORITY_SUPPORT']`). The strict-mode check excludes
77
- * them from BUNDLE_/PLAN_FEATURE_UNKNOWN. Use sparingly.
78
- */
79
- marketedOnlyFeatures?: string[];
80
- /**
81
- * Optional consumer-curated FeatureUiRegistry (label/description/icon
82
- * per feature — the same one passed to `PublicCatalogModule.forRoot`). The
83
- * discovery auto-sync seeds EMPTY `FeatureCatalogEntry` fields
84
- * (label/description/icon) from it at boot; SuperAdmin edits stay untouched. This
85
- * makes `FeatureCatalogEntry` the SSOT for UI metadata.
86
- */
87
- featureUiRegistry?: FeatureUiRegistry;
88
- /**
89
- * Modules whose providers must be visible in the DI scope of this
90
- * DynamicModule — typically: `AuthModule`/`PlatformAdminModule`, because the
91
- * controller guards come from there.
92
- */
93
- imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
94
- /** Additional providers registered in the DynamicModule itself. */
95
- extraProviders?: Provider[];
96
- /** Register the module globally — default `false`. */
97
- global?: boolean;
98
- }
99
- declare class CatalogModule {
100
- static forRoot(options: CatalogModuleOptions): DynamicModule;
101
- }
102
-
103
- export { type CatalogControllerConfig as C, CatalogModule as a, type CatalogModuleOptions as b };
@@ -1,103 +0,0 @@
1
- import { Type, CanActivate, DynamicModule, ForwardReference, Provider } from '@nestjs/common';
2
- import { BundleRepository, MarketingProjectionRepository, CatalogEntryRepository, PromotionRepository, MarketingSettingsRepository, PlanRepository, FeatureUiRegistry } from '@saasicat/core';
3
- import { P as ProviderSpec } from './di-CcNeq9v-.js';
4
-
5
- interface CatalogControllerConfig {
6
- /**
7
- * Class-level guards for `BundlesController` and `BundleVersionsController`.
8
- * REQUIRED — otherwise `forRoot()` throws at boot. Pass `[]` explicitly
9
- * if the endpoints should intentionally be auth-free.
10
- */
11
- guards: Array<Type<CanActivate>>;
12
- }
13
- interface CatalogModuleOptions {
14
- /** Adapter for `bundles` + `bundle_versions` persistence. */
15
- bundleRepository: ProviderSpec<BundleRepository>;
16
- /**
17
- * Adapter for `marketing_projections` persistence. Optional — if
18
- * omitted, MarketingProjectionsService + controller are not
19
- * registered.
20
- */
21
- marketingProjectionRepository?: ProviderSpec<MarketingProjectionRepository>;
22
- /**
23
- * Adapter for `capability_/feature_/quota_catalog_entries` persistence
24
- * (discovery review). Optional — if omitted,
25
- * CatalogEntriesService + controller are not registered.
26
- */
27
- catalogEntryRepository?: ProviderSpec<CatalogEntryRepository>;
28
- /**
29
- * Adapter for `promotions` persistence. Optional — if
30
- * omitted, PromotionsService + controller are not registered.
31
- */
32
- promotionRepository?: ProviderSpec<PromotionRepository>;
33
- /**
34
- * Adapter for `marketing_settings` persistence (
35
- * `activeLocales`). Optional.
36
- */
37
- marketingSettingsRepository?: ProviderSpec<MarketingSettingsRepository>;
38
- /**
39
- * Auth-free pricing-page endpoint `GET /public/marketing-catalog`
40
- *. Registered only when plan-, marketingProjection-
41
- * and promotionRepository are set. `guards` is usually `[]`.
42
- */
43
- publicMarketingCatalog?: {
44
- guards: Array<Type<CanActivate>>;
45
- projectKey: string;
46
- currency: string;
47
- vatRate: number;
48
- };
49
- /**
50
- * — adapter for `plans` master-record persistence.
51
- * Optional; if omitted, PlansService + controller are not
52
- * registered (apps without a need for the plan editor stay unchanged).
53
- */
54
- planRepository?: ProviderSpec<PlanRepository>;
55
- /**
56
- * Controller mount for `/admin/catalog/bundles` + `/admin/catalog/bundle-versions`.
57
- * If omitted, the endpoints are not registered — but the services remain usable via DI.
58
- */
59
- controller?: CatalogControllerConfig;
60
- /**
61
- * Strict-mode mode. `blocking` (default, #12) throws HTTP 422 on
62
- * violations and requires a DiscoverySnapshot; `warn-only` returns them
63
- * only as a warning (transition until 100% discovery coverage).
64
- */
65
- strictModeCheckMode?: 'warn-only' | 'blocking';
66
- /**
67
- * Discovery→catalog auto-sync at boot (#12). Default `true` — as soon as a
68
- * `catalogEntryRepository` is wired and a DiscoverySnapshot is available,
69
- * `CatalogEntriesService` mirrors the discovery into the DB at startup. `false`
70
- * disables the boot sync; the manual sync endpoint remains usable.
71
- */
72
- autoSyncDiscoveryAtBoot?: boolean;
73
- /**
74
- * Feature keys the catalog is deliberately allowed to carry without them
75
- * existing in the discovery snapshot (marketed non-code features such as
76
- * support SLAs, e.g. `['PRIORITY_SUPPORT']`). The strict-mode check excludes
77
- * them from BUNDLE_/PLAN_FEATURE_UNKNOWN. Use sparingly.
78
- */
79
- marketedOnlyFeatures?: string[];
80
- /**
81
- * Optional consumer-curated FeatureUiRegistry (label/description/icon
82
- * per feature — the same one passed to `PublicCatalogModule.forRoot`). The
83
- * discovery auto-sync seeds EMPTY `FeatureCatalogEntry` fields
84
- * (label/description/icon) from it at boot; SuperAdmin edits stay untouched. This
85
- * makes `FeatureCatalogEntry` the SSOT for UI metadata.
86
- */
87
- featureUiRegistry?: FeatureUiRegistry;
88
- /**
89
- * Modules whose providers must be visible in the DI scope of this
90
- * DynamicModule — typically: `AuthModule`/`PlatformAdminModule`, because the
91
- * controller guards come from there.
92
- */
93
- imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
94
- /** Additional providers registered in the DynamicModule itself. */
95
- extraProviders?: Provider[];
96
- /** Register the module globally — default `false`. */
97
- global?: boolean;
98
- }
99
- declare class CatalogModule {
100
- static forRoot(options: CatalogModuleOptions): DynamicModule;
101
- }
102
-
103
- export { type CatalogControllerConfig as C, CatalogModule as a, type CatalogModuleOptions as b };
@@ -1,39 +0,0 @@
1
- import { Type, CanActivate, DynamicModule, ForwardReference, Provider } from '@nestjs/common';
2
- import { CheckoutOfferRepository, BundleRepository, PlanRepository, CatalogEntryRepository } from '@saasicat/core';
3
- import { P as ProviderSpec } from './di-CcNeq9v-.js';
4
-
5
- interface CheckoutOfferControllerConfig {
6
- /** Class-level guards; `[]` for auth-free public endpoints. */
7
- guards: Array<Type<CanActivate>>;
8
- }
9
- interface CheckoutOfferModuleOptions {
10
- checkoutOfferRepository: ProviderSpec<CheckoutOfferRepository>;
11
- /**
12
- * Optional for V3 revalidation on consume: if set, the service checks
13
- * whether referenced bundle versions are still bookable. Also provides
14
- * the bundle features for the requires validation (#35 P6).
15
- */
16
- bundleRepository?: ProviderSpec<BundleRepository>;
17
- /**
18
- * Optional for the requires validation (#35 P6): plan features of the
19
- * chosen plan version. Without wiring, falls back to the featuresSnapshot
20
- * of the plan line item.
21
- */
22
- planRepository?: ProviderSpec<PlanRepository>;
23
- /**
24
- * Optional for the requires validation (#35 P6): requires source =
25
- * curated FeatureCatalogEntries. Without wiring, the validation is
26
- * skipped (graceful).
27
- */
28
- catalogEntryRepository?: ProviderSpec<CatalogEntryRepository>;
29
- /** Controller mount for `/public/checkout-offer`. Omitted = service only. */
30
- controller?: CheckoutOfferControllerConfig;
31
- imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
32
- extraProviders?: Provider[];
33
- global?: boolean;
34
- }
35
- declare class CheckoutOfferModule {
36
- static forRoot(options: CheckoutOfferModuleOptions): DynamicModule;
37
- }
38
-
39
- export { type CheckoutOfferControllerConfig as C, CheckoutOfferModule as a, type CheckoutOfferModuleOptions as b };
@@ -1,39 +0,0 @@
1
- import { Type, CanActivate, DynamicModule, ForwardReference, Provider } from '@nestjs/common';
2
- import { CheckoutOfferRepository, BundleRepository, PlanRepository, CatalogEntryRepository } from '@saasicat/core';
3
- import { P as ProviderSpec } from './di-CcNeq9v-.cjs';
4
-
5
- interface CheckoutOfferControllerConfig {
6
- /** Class-level guards; `[]` for auth-free public endpoints. */
7
- guards: Array<Type<CanActivate>>;
8
- }
9
- interface CheckoutOfferModuleOptions {
10
- checkoutOfferRepository: ProviderSpec<CheckoutOfferRepository>;
11
- /**
12
- * Optional for V3 revalidation on consume: if set, the service checks
13
- * whether referenced bundle versions are still bookable. Also provides
14
- * the bundle features for the requires validation (#35 P6).
15
- */
16
- bundleRepository?: ProviderSpec<BundleRepository>;
17
- /**
18
- * Optional for the requires validation (#35 P6): plan features of the
19
- * chosen plan version. Without wiring, falls back to the featuresSnapshot
20
- * of the plan line item.
21
- */
22
- planRepository?: ProviderSpec<PlanRepository>;
23
- /**
24
- * Optional for the requires validation (#35 P6): requires source =
25
- * curated FeatureCatalogEntries. Without wiring, the validation is
26
- * skipped (graceful).
27
- */
28
- catalogEntryRepository?: ProviderSpec<CatalogEntryRepository>;
29
- /** Controller mount for `/public/checkout-offer`. Omitted = service only. */
30
- controller?: CheckoutOfferControllerConfig;
31
- imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;
32
- extraProviders?: Provider[];
33
- global?: boolean;
34
- }
35
- declare class CheckoutOfferModule {
36
- static forRoot(options: CheckoutOfferModuleOptions): DynamicModule;
37
- }
38
-
39
- export { type CheckoutOfferControllerConfig as C, CheckoutOfferModule as a, type CheckoutOfferModuleOptions as b };
@@ -1,49 +0,0 @@
1
- import { CheckoutOfferRepository, BundleRepository, PlanRepository, CatalogEntryRepository, CheckoutOfferFilter, CheckoutOfferRow, CreateCheckoutOfferData, UpdateCheckoutOfferData } from '@saasicat/core';
2
-
3
- declare class CheckoutOfferService {
4
- private readonly repo;
5
- private readonly bundles;
6
- private readonly plans;
7
- private readonly catalogEntries;
8
- constructor(repo: CheckoutOfferRepository, bundles?: BundleRepository | null, plans?: PlanRepository | null, catalogEntries?: CatalogEntryRepository | null);
9
- list(filter: CheckoutOfferFilter): Promise<CheckoutOfferRow[]>;
10
- getById(id: string): Promise<CheckoutOfferRow>;
11
- create(data: CreateCheckoutOfferData): Promise<CheckoutOfferRow>;
12
- /** Customization in onboarding — only while the offer is `open`. */
13
- update(id: string, data: UpdateCheckoutOfferData): Promise<CheckoutOfferRow>;
14
- /**
15
- * Freezes the offer (`status = 'consumed'`). Returns the final
16
- * snapshot — the caller (registration/billing) writes it
17
- * as `Subscription.packageSnapshot`.
18
- */
19
- consume(id: string): Promise<CheckoutOfferRow>;
20
- /**
21
- * #35 P6 — server-side requires validation: the dependencies of all
22
- * features (plan ∪ selected bundles) must be covered within the
23
- * selection, otherwise an offer would be created whose features cannot
24
- * work at the tenant (an app-specific validateModuleDependencies check is
25
- * thereby replaced on the platform side). The requires source are the
26
- * curated FeatureCatalogEntries; without CatalogEntryRepository it is
27
- * skipped (graceful — no requires data available).
28
- */
29
- private assertFeatureRequiresSatisfied;
30
- /**
31
- * Plan features preferably from the server SSOT (PlanRepository); fallback
32
- * is the frozen featuresSnapshot of the plan LineItem (adapter without
33
- * PlanRepository wiring).
34
- */
35
- private resolvePlanFeatures;
36
- /** Bundle features from the BundleVersions; fallback featuresSnapshot. */
37
- private resolveBundleFeatures;
38
- private assertBundleVersionsStillBookable;
39
- private normalizeCreateData;
40
- private normalizeUpdateData;
41
- private resolveLineItems;
42
- private defaultPlanLineItem;
43
- private assertOpen;
44
- private isExpired;
45
- private dateIsAfterNow;
46
- private isValidUntilExpired;
47
- }
48
-
49
- export { CheckoutOfferService as C };
@@ -1,49 +0,0 @@
1
- import { CheckoutOfferRepository, BundleRepository, PlanRepository, CatalogEntryRepository, CheckoutOfferFilter, CheckoutOfferRow, CreateCheckoutOfferData, UpdateCheckoutOfferData } from '@saasicat/core';
2
-
3
- declare class CheckoutOfferService {
4
- private readonly repo;
5
- private readonly bundles;
6
- private readonly plans;
7
- private readonly catalogEntries;
8
- constructor(repo: CheckoutOfferRepository, bundles?: BundleRepository | null, plans?: PlanRepository | null, catalogEntries?: CatalogEntryRepository | null);
9
- list(filter: CheckoutOfferFilter): Promise<CheckoutOfferRow[]>;
10
- getById(id: string): Promise<CheckoutOfferRow>;
11
- create(data: CreateCheckoutOfferData): Promise<CheckoutOfferRow>;
12
- /** Customization in onboarding — only while the offer is `open`. */
13
- update(id: string, data: UpdateCheckoutOfferData): Promise<CheckoutOfferRow>;
14
- /**
15
- * Freezes the offer (`status = 'consumed'`). Returns the final
16
- * snapshot — the caller (registration/billing) writes it
17
- * as `Subscription.packageSnapshot`.
18
- */
19
- consume(id: string): Promise<CheckoutOfferRow>;
20
- /**
21
- * #35 P6 — server-side requires validation: the dependencies of all
22
- * features (plan ∪ selected bundles) must be covered within the
23
- * selection, otherwise an offer would be created whose features cannot
24
- * work at the tenant (an app-specific validateModuleDependencies check is
25
- * thereby replaced on the platform side). The requires source are the
26
- * curated FeatureCatalogEntries; without CatalogEntryRepository it is
27
- * skipped (graceful — no requires data available).
28
- */
29
- private assertFeatureRequiresSatisfied;
30
- /**
31
- * Plan features preferably from the server SSOT (PlanRepository); fallback
32
- * is the frozen featuresSnapshot of the plan LineItem (adapter without
33
- * PlanRepository wiring).
34
- */
35
- private resolvePlanFeatures;
36
- /** Bundle features from the BundleVersions; fallback featuresSnapshot. */
37
- private resolveBundleFeatures;
38
- private assertBundleVersionsStillBookable;
39
- private normalizeCreateData;
40
- private normalizeUpdateData;
41
- private resolveLineItems;
42
- private defaultPlanLineItem;
43
- private assertOpen;
44
- private isExpired;
45
- private dateIsAfterNow;
46
- private isValidUntilExpired;
47
- }
48
-
49
- export { CheckoutOfferService as C };
@@ -1,22 +0,0 @@
1
- import {
2
- __name
3
- } from "./chunk-SHUYVCID.js";
4
-
5
- // src/errors/coded-error.ts
6
- import { ERROR_MESSAGES_EN, formatErrorMessage } from "@saasicat/core";
7
- function codedError(code, params) {
8
- const message = formatErrorMessage(ERROR_MESSAGES_EN[code], params ?? {});
9
- return params ? {
10
- code,
11
- message,
12
- params
13
- } : {
14
- code,
15
- message
16
- };
17
- }
18
- __name(codedError, "codedError");
19
-
20
- export {
21
- codedError
22
- };
@@ -1,87 +0,0 @@
1
- import {
2
- __name
3
- } from "./chunk-SHUYVCID.js";
4
-
5
- // src/checkout-offer/discount-line-items.ts
6
- function appendImplicitDiscountLineItem(input) {
7
- const lineItems = input.lineItems.map((item) => cloneCheckoutOfferLineItem(item));
8
- const discountNet = roundMoney(input.priceBreakdown.regularNet - input.priceBreakdown.effectiveNet);
9
- if (lineItems.some((item) => item.kind === "discount" && !isGeneratedDiscount(item))) {
10
- return lineItems;
11
- }
12
- const lineItemsWithoutGeneratedDiscount = lineItems.filter((item) => !isGeneratedDiscount(item));
13
- if (discountNet <= 0) {
14
- return lineItemsWithoutGeneratedDiscount;
15
- }
16
- return [
17
- ...lineItemsWithoutGeneratedDiscount,
18
- createDiscountLineItem(input, discountNet)
19
- ];
20
- }
21
- __name(appendImplicitDiscountLineItem, "appendImplicitDiscountLineItem");
22
- function cloneCheckoutOfferLineItem(item) {
23
- return {
24
- ...item,
25
- featuresSnapshot: [
26
- ...item.featuresSnapshot ?? []
27
- ],
28
- quotaEffectsSnapshot: {
29
- ...item.quotaEffectsSnapshot ?? {}
30
- },
31
- metadata: cloneRecord(item.metadata)
32
- };
33
- }
34
- __name(cloneCheckoutOfferLineItem, "cloneCheckoutOfferLineItem");
35
- function createDiscountLineItem(input, discountNet) {
36
- const promoCode = input.promoCodeSnapshot ?? null;
37
- const firstPromotion = input.promotionSnapshots?.[0] ?? null;
38
- const discountGross = roundMoney(discountNet * (1 + input.priceBreakdown.vatRate));
39
- return {
40
- kind: "discount",
41
- sourceKey: promoCode?.code ?? firstPromotion?.id ?? "price-discount",
42
- sourceVersionId: null,
43
- titleSnapshot: promoCode?.label ?? firstPromotion?.label ?? "Discount",
44
- descriptionSnapshot: promoCode ? `Promo-Code ${promoCode.code}` : null,
45
- quantity: 1,
46
- unit: null,
47
- priceNet: -discountNet,
48
- priceGross: -discountGross,
49
- billingCycle: input.billingCycle,
50
- featuresSnapshot: [],
51
- quotaEffectsSnapshot: {},
52
- metadata: {
53
- generated: true,
54
- source: promoCode ? "promo_code" : firstPromotion ? "promotion" : "price_breakdown",
55
- discountNet,
56
- discountGross,
57
- promotionSnapshots: cloneArray(input.promotionSnapshots ?? []),
58
- promoCodeSnapshot: cloneJsonValue(promoCode)
59
- }
60
- };
61
- }
62
- __name(createDiscountLineItem, "createDiscountLineItem");
63
- function roundMoney(value) {
64
- return Math.round((value + Number.EPSILON) * 100) / 100;
65
- }
66
- __name(roundMoney, "roundMoney");
67
- function isGeneratedDiscount(item) {
68
- return item.kind === "discount" && item.metadata?.generated === true;
69
- }
70
- __name(isGeneratedDiscount, "isGeneratedDiscount");
71
- function cloneRecord(value) {
72
- if (!value) return null;
73
- return cloneJsonValue(value);
74
- }
75
- __name(cloneRecord, "cloneRecord");
76
- function cloneArray(value) {
77
- return cloneJsonValue(value);
78
- }
79
- __name(cloneArray, "cloneArray");
80
- function cloneJsonValue(value) {
81
- return value == null ? value : JSON.parse(JSON.stringify(value));
82
- }
83
- __name(cloneJsonValue, "cloneJsonValue");
84
-
85
- export {
86
- appendImplicitDiscountLineItem
87
- };