pricing-renderer 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +142 -25
  3. package/THIRD_PARTY_NOTICES.md +84 -6
  4. package/custom-elements.json +233 -3
  5. package/dist/core/apply-selection.d.ts +8 -0
  6. package/dist/core/apply-selection.d.ts.map +1 -0
  7. package/dist/core/apply-selection.js +76 -0
  8. package/dist/core/apply-selection.js.map +1 -0
  9. package/dist/core/breakdown.d.ts +13 -0
  10. package/dist/core/breakdown.d.ts.map +1 -0
  11. package/dist/core/breakdown.js +56 -0
  12. package/dist/core/breakdown.js.map +1 -0
  13. package/dist/core/compare-sides.d.ts +16 -0
  14. package/dist/core/compare-sides.d.ts.map +1 -0
  15. package/dist/core/compare-sides.js +73 -0
  16. package/dist/core/compare-sides.js.map +1 -0
  17. package/dist/core/compare-values.d.ts +13 -0
  18. package/dist/core/compare-values.d.ts.map +1 -0
  19. package/dist/core/compare-values.js +100 -0
  20. package/dist/core/compare-values.js.map +1 -0
  21. package/dist/core/compare.d.ts +7 -0
  22. package/dist/core/compare.d.ts.map +1 -0
  23. package/dist/core/compare.js +301 -0
  24. package/dist/core/compare.js.map +1 -0
  25. package/dist/core/expression.js +2 -2
  26. package/dist/core/expression.js.map +1 -1
  27. package/dist/core/i18n.d.ts.map +1 -1
  28. package/dist/core/i18n.js +136 -2
  29. package/dist/core/i18n.js.map +1 -1
  30. package/dist/core/index.d.ts +9 -2
  31. package/dist/core/index.d.ts.map +1 -1
  32. package/dist/core/index.js +6 -1
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/normalize.d.ts.map +1 -1
  35. package/dist/core/normalize.js +70 -9
  36. package/dist/core/normalize.js.map +1 -1
  37. package/dist/core/plan-relation.d.ts +8 -0
  38. package/dist/core/plan-relation.d.ts.map +1 -0
  39. package/dist/core/plan-relation.js +15 -0
  40. package/dist/core/plan-relation.js.map +1 -0
  41. package/dist/core/price-stabilizer.d.ts +3 -0
  42. package/dist/core/price-stabilizer.d.ts.map +1 -0
  43. package/dist/core/price-stabilizer.js +73 -0
  44. package/dist/core/price-stabilizer.js.map +1 -0
  45. package/dist/core/resolve.d.ts +7 -1
  46. package/dist/core/resolve.d.ts.map +1 -1
  47. package/dist/core/resolve.js +66 -21
  48. package/dist/core/resolve.js.map +1 -1
  49. package/dist/core/search-params.d.ts +15 -0
  50. package/dist/core/search-params.d.ts.map +1 -0
  51. package/dist/core/search-params.js +175 -0
  52. package/dist/core/search-params.js.map +1 -0
  53. package/dist/core/selection-change.d.ts +10 -0
  54. package/dist/core/selection-change.d.ts.map +1 -0
  55. package/dist/core/selection-change.js +124 -0
  56. package/dist/core/selection-change.js.map +1 -0
  57. package/dist/core/types.d.ts +209 -0
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/core/units.d.ts +13 -0
  60. package/dist/core/units.d.ts.map +1 -0
  61. package/dist/core/units.js +84 -0
  62. package/dist/core/units.js.map +1 -0
  63. package/dist/core/utils.d.ts.map +1 -1
  64. package/dist/core/utils.js +91 -32
  65. package/dist/core/utils.js.map +1 -1
  66. package/dist/core/view-model.d.ts +3 -1
  67. package/dist/core/view-model.d.ts.map +1 -1
  68. package/dist/core/view-model.js +113 -7
  69. package/dist/core/view-model.js.map +1 -1
  70. package/dist/element/change-review-define.d.ts +4 -0
  71. package/dist/element/change-review-define.d.ts.map +1 -0
  72. package/dist/element/change-review-define.js +17 -0
  73. package/dist/element/change-review-define.js.map +1 -0
  74. package/dist/element/change-review-element.d.ts +53 -0
  75. package/dist/element/change-review-element.d.ts.map +1 -0
  76. package/dist/element/change-review-element.js +104 -0
  77. package/dist/element/change-review-element.js.map +1 -0
  78. package/dist/element/change-review-events.d.ts +10 -0
  79. package/dist/element/change-review-events.d.ts.map +1 -0
  80. package/dist/element/change-review-events.js +2 -0
  81. package/dist/element/change-review-events.js.map +1 -0
  82. package/dist/element/change-review-renderers.d.ts +23 -0
  83. package/dist/element/change-review-renderers.d.ts.map +1 -0
  84. package/dist/element/change-review-renderers.js +391 -0
  85. package/dist/element/change-review-renderers.js.map +1 -0
  86. package/dist/element/cta.d.ts +45 -0
  87. package/dist/element/cta.d.ts.map +1 -0
  88. package/dist/element/cta.js +90 -0
  89. package/dist/element/cta.js.map +1 -0
  90. package/dist/element/current-selection.d.ts +13 -0
  91. package/dist/element/current-selection.d.ts.map +1 -0
  92. package/dist/element/current-selection.js +57 -0
  93. package/dist/element/current-selection.js.map +1 -0
  94. package/dist/element/define-change-review.d.ts +2 -0
  95. package/dist/element/define-change-review.d.ts.map +1 -0
  96. package/dist/element/define-change-review.js +7 -0
  97. package/dist/element/define-change-review.js.map +1 -0
  98. package/dist/element/events.d.ts +32 -6
  99. package/dist/element/events.d.ts.map +1 -1
  100. package/dist/element/hide-sections.d.ts +6 -0
  101. package/dist/element/hide-sections.d.ts.map +1 -0
  102. package/dist/element/hide-sections.js +26 -0
  103. package/dist/element/hide-sections.js.map +1 -0
  104. package/dist/element/index.d.ts +8 -1
  105. package/dist/element/index.d.ts.map +1 -1
  106. package/dist/element/index.js +3 -0
  107. package/dist/element/index.js.map +1 -1
  108. package/dist/element/pricing-renderer-element.d.ts +95 -7
  109. package/dist/element/pricing-renderer-element.d.ts.map +1 -1
  110. package/dist/element/pricing-renderer-element.js +563 -217
  111. package/dist/element/pricing-renderer-element.js.map +1 -1
  112. package/dist/element/renderers.d.ts +49 -4
  113. package/dist/element/renderers.d.ts.map +1 -1
  114. package/dist/element/renderers.js +795 -263
  115. package/dist/element/renderers.js.map +1 -1
  116. package/dist/element/same-input.d.ts +3 -0
  117. package/dist/element/same-input.d.ts.map +1 -0
  118. package/dist/element/same-input.js +56 -0
  119. package/dist/element/same-input.js.map +1 -0
  120. package/dist/react/headless.d.ts +9 -0
  121. package/dist/react/headless.d.ts.map +1 -0
  122. package/dist/react/headless.js +8 -0
  123. package/dist/react/headless.js.map +1 -0
  124. package/dist/react/index.d.ts +54 -4
  125. package/dist/react/index.d.ts.map +1 -1
  126. package/dist/react/index.js +156 -6
  127. package/dist/react/index.js.map +1 -1
  128. package/dist/react/provider.d.ts +17 -0
  129. package/dist/react/provider.d.ts.map +1 -0
  130. package/dist/react/provider.js +38 -0
  131. package/dist/react/provider.js.map +1 -0
  132. package/dist/react/selection-store.d.ts +51 -0
  133. package/dist/react/selection-store.d.ts.map +1 -0
  134. package/dist/react/selection-store.js +239 -0
  135. package/dist/react/selection-store.js.map +1 -0
  136. package/dist/react/slots-types.d.ts +38 -0
  137. package/dist/react/slots-types.d.ts.map +1 -0
  138. package/dist/react/slots-types.js +2 -0
  139. package/dist/react/slots-types.js.map +1 -0
  140. package/dist/react/slots.d.ts +40 -0
  141. package/dist/react/slots.d.ts.map +1 -0
  142. package/dist/react/slots.js +165 -0
  143. package/dist/react/slots.js.map +1 -0
  144. package/dist/react/use-pricing-selection.d.ts +10 -0
  145. package/dist/react/use-pricing-selection.d.ts.map +1 -0
  146. package/dist/react/use-pricing-selection.js +44 -0
  147. package/dist/react/use-pricing-selection.js.map +1 -0
  148. package/dist/react/use-pricing-source.d.ts +34 -0
  149. package/dist/react/use-pricing-source.d.ts.map +1 -0
  150. package/dist/react/use-pricing-source.js +186 -0
  151. package/dist/react/use-pricing-source.js.map +1 -0
  152. package/dist/react/use-renderer-state.d.ts +22 -0
  153. package/dist/react/use-renderer-state.d.ts.map +1 -0
  154. package/dist/react/use-renderer-state.js +112 -0
  155. package/dist/react/use-renderer-state.js.map +1 -0
  156. package/dist/space/index.d.ts +26 -0
  157. package/dist/space/index.d.ts.map +1 -0
  158. package/dist/space/index.js +71 -0
  159. package/dist/space/index.js.map +1 -0
  160. package/dist/styles/base.css +1030 -76
  161. package/dist/styles/theme-minimal.css +103 -0
  162. package/dist/styles/theme.css +22 -3
  163. package/dist/styles/tokens-shadcn.css +40 -0
  164. package/dist/yaml/index.d.ts +2 -0
  165. package/dist/yaml/index.d.ts.map +1 -1
  166. package/dist/yaml/index.js +1 -0
  167. package/dist/yaml/index.js.map +1 -1
  168. package/dist/yaml/load.d.ts.map +1 -1
  169. package/dist/yaml/load.js +106 -17
  170. package/dist/yaml/load.js.map +1 -1
  171. package/dist/yaml/source.d.ts +18 -0
  172. package/dist/yaml/source.d.ts.map +1 -0
  173. package/dist/yaml/source.js +46 -0
  174. package/dist/yaml/source.js.map +1 -0
  175. package/package.json +25 -13
@@ -0,0 +1,103 @@
1
+ /*
2
+ * A flat, neutral theme: grayscale palette, no shadows, borders in the text color.
3
+ *
4
+ * It is a full replacement of theme.css (same selectors and tokens), so import it instead of
5
+ * theme.css. Use it as a starting point for a custom theme: copy it and change the values.
6
+ *
7
+ */
8
+ @layer pricing-renderer.theme {
9
+ pricing-renderer[data-pr-root],
10
+ pricing-change-review {
11
+ color-scheme: light;
12
+ --pr-font-size-xs: 0.75rem;
13
+ --pr-font-size-sm: 0.875rem;
14
+ --pr-font-size-lg: 1.125rem;
15
+ --pr-font-size-xl: 1.35rem;
16
+ --pr-font-size-2xl: 1.75rem;
17
+ --pr-space-1: 0.25rem;
18
+ --pr-space-2: 0.5rem;
19
+ --pr-space-3: 0.75rem;
20
+ --pr-space-4: 1rem;
21
+ --pr-space-5: 1.5rem;
22
+ --pr-space-section: clamp(3rem, 8cqi, 6rem);
23
+ --pr-shell-padding: clamp(1rem, 4cqi, 3rem);
24
+ --pr-price-size: clamp(2rem, 8cqi, 3rem);
25
+ --pr-price-weight: var(--pr-font-weight-bold, 790);
26
+ --pr-price-tracking: -0.05em;
27
+ --pr-radius-sm: 0.55rem;
28
+ --pr-radius-md: 0.85rem;
29
+ --pr-radius-lg: 1.25rem;
30
+ --pr-radius-pill: 999px;
31
+ --pr-motion-fast: 0s ease;
32
+ --pr-color-text: #111111;
33
+ --pr-color-muted: #595959;
34
+ --pr-color-surface: #ffffff;
35
+ --pr-color-surface-raised: #ffffff;
36
+ --pr-color-surface-subtle: #f5f5f5;
37
+ --pr-color-border: currentcolor;
38
+ --pr-color-border-strong: currentcolor;
39
+ --pr-color-accent: #111111;
40
+ --pr-color-on-accent: #ffffff;
41
+ --pr-color-link: #333333;
42
+ --pr-color-focus: #111111;
43
+ --pr-color-success: #1b5e20;
44
+ --pr-color-warning: #7a4a00;
45
+ --pr-color-warning-surface: #f5f5f5;
46
+ --pr-color-overlay: #000000;
47
+ --pr-shadow-sm: none;
48
+ --pr-shadow-accent: none;
49
+ --pr-shadow-lg: none;
50
+ }
51
+
52
+ pricing-renderer[data-pr-root][theme='dark'],
53
+ [data-theme='dark'] pricing-renderer[data-pr-root],
54
+ pricing-change-review[theme='dark'],
55
+ [data-theme='dark'] pricing-change-review,
56
+ /* A host `.dark` ancestor darkens the renderer with theme=auto. */
57
+ .dark pricing-renderer[data-pr-root][theme='auto'],
58
+ .dark pricing-change-review[theme='auto'] {
59
+ color-scheme: dark;
60
+ --pr-color-text: #f2f2f2;
61
+ --pr-color-muted: #a6a6a6;
62
+ --pr-color-surface: #121212;
63
+ --pr-color-surface-raised: #1c1c1c;
64
+ --pr-color-surface-subtle: #1a1a1a;
65
+ --pr-color-border: currentcolor;
66
+ --pr-color-border-strong: currentcolor;
67
+ --pr-color-accent: #f2f2f2;
68
+ --pr-color-on-accent: #121212;
69
+ --pr-color-link: #d9d9d9;
70
+ --pr-color-focus: #f2f2f2;
71
+ --pr-color-success: #7ed6a0;
72
+ --pr-color-warning: #e6b85c;
73
+ --pr-color-warning-surface: #1a1a1a;
74
+ --pr-color-overlay: #000000;
75
+ --pr-shadow-sm: none;
76
+ }
77
+
78
+ @media (prefers-color-scheme: dark) {
79
+ pricing-renderer[data-pr-root][theme='auto'],
80
+ pricing-change-review[theme='auto'] {
81
+ color-scheme: dark;
82
+ --pr-color-text: #f2f2f2;
83
+ --pr-color-muted: #a6a6a6;
84
+ --pr-color-surface: #121212;
85
+ --pr-color-surface-raised: #1c1c1c;
86
+ --pr-color-surface-subtle: #1a1a1a;
87
+ --pr-color-border: currentcolor;
88
+ --pr-color-border-strong: currentcolor;
89
+ --pr-color-accent: #f2f2f2;
90
+ --pr-color-on-accent: #121212;
91
+ --pr-color-link: #d9d9d9;
92
+ --pr-color-focus: #f2f2f2;
93
+ --pr-color-success: #7ed6a0;
94
+ --pr-color-warning: #e6b85c;
95
+ --pr-color-warning-surface: #1a1a1a;
96
+ --pr-color-overlay: #000000;
97
+ }
98
+
99
+ pricing-change-review[theme='auto'] {
100
+ --pr-shadow-sm: none;
101
+ }
102
+ }
103
+ }
@@ -1,5 +1,6 @@
1
1
  @layer pricing-renderer.theme {
2
- pricing-renderer[data-pr-root] {
2
+ pricing-renderer[data-pr-root],
3
+ pricing-change-review {
3
4
  color-scheme: light;
4
5
  --pr-font-size-xs: 0.75rem;
5
6
  --pr-font-size-sm: 0.875rem;
@@ -13,6 +14,14 @@
13
14
  --pr-space-5: 1.5rem;
14
15
  --pr-space-section: clamp(3rem, 8cqi, 6rem);
15
16
  --pr-shell-padding: clamp(1rem, 4cqi, 3rem);
17
+ /* The price is the most variable type on a real pricing page: a survey of 49 of them found
18
+ sizes from 16px, where a usage-based product deliberately refuses to shout, to 64px, and
19
+ weights from 300 to 700 with 400 the most common. The defaults below keep what this
20
+ component already shipped; they sit at the loud end on purpose, and a host moves them
21
+ without touching --pr-font-weight-bold, which every other bold thing shares. */
22
+ --pr-price-size: clamp(2rem, 8cqi, 3rem);
23
+ --pr-price-weight: var(--pr-font-weight-bold, 790);
24
+ --pr-price-tracking: -0.05em;
16
25
  --pr-radius-sm: 0.55rem;
17
26
  --pr-radius-md: 0.85rem;
18
27
  --pr-radius-lg: 1.25rem;
@@ -41,7 +50,12 @@
41
50
  }
42
51
 
43
52
  pricing-renderer[data-pr-root][theme='dark'],
44
- [data-theme='dark'] pricing-renderer[data-pr-root] {
53
+ [data-theme='dark'] pricing-renderer[data-pr-root],
54
+ pricing-change-review[theme='dark'],
55
+ [data-theme='dark'] pricing-change-review,
56
+ /* A host `.dark` ancestor darkens the renderer with theme=auto. */
57
+ .dark pricing-renderer[data-pr-root][theme='auto'],
58
+ .dark pricing-change-review[theme='auto'] {
45
59
  color-scheme: dark;
46
60
  --pr-color-text: #f4f3fb;
47
61
  --pr-color-muted: #aaa8ba;
@@ -62,7 +76,8 @@
62
76
  }
63
77
 
64
78
  @media (prefers-color-scheme: dark) {
65
- pricing-renderer[data-pr-root][theme='auto'] {
79
+ pricing-renderer[data-pr-root][theme='auto'],
80
+ pricing-change-review[theme='auto'] {
66
81
  color-scheme: dark;
67
82
  --pr-color-text: #f4f3fb;
68
83
  --pr-color-muted: #aaa8ba;
@@ -80,5 +95,9 @@
80
95
  --pr-color-warning-surface: #302613;
81
96
  --pr-color-overlay: #050507;
82
97
  }
98
+
99
+ pricing-change-review[theme='auto'] {
100
+ --pr-shadow-sm: 0 1px 2px rgb(0 0 0 / 28%), 0 8px 30px rgb(0 0 0 / 18%);
101
+ }
83
102
  }
84
103
  }
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Maps the renderer tokens to the variables of a shadcn/ui theme.
3
+ *
4
+ * These are the shadcn v4 full-color variables (--primary: oklch(...) or #hex). For v3 setups whose
5
+ * variables are HSL channels, wrap them yourself, for example
6
+ * --pr-color-accent: hsl(var(--primary)), in a rule of your own that comes after this file.
7
+ *
8
+ * Tokens shadcn has no variable for (success, warning, warning-surface, overlay, shadows) keep the
9
+ * defaults of theme.css. Import theme.css first or after this file; the layer order below makes this
10
+ * file win either way.
11
+ *
12
+ */
13
+ @layer pricing-renderer.theme, pricing-renderer.shadcn;
14
+
15
+ @layer pricing-renderer.shadcn {
16
+ pricing-renderer[data-pr-root],
17
+ pricing-change-review {
18
+ color-scheme: light;
19
+ --pr-color-accent: var(--primary);
20
+ --pr-color-on-accent: var(--primary-foreground);
21
+ --pr-color-text: var(--foreground);
22
+ --pr-color-muted: var(--muted-foreground);
23
+ --pr-color-surface: var(--card);
24
+ --pr-color-surface-raised: var(--popover);
25
+ --pr-color-surface-subtle: var(--muted);
26
+ --pr-color-border: var(--border);
27
+ --pr-color-border-strong: var(--input);
28
+ --pr-color-focus: var(--ring);
29
+ --pr-color-link: var(--primary);
30
+ --pr-radius-lg: var(--radius);
31
+ --pr-radius-md: calc(var(--radius) - 2px);
32
+ --pr-radius-sm: calc(var(--radius) - 4px);
33
+ }
34
+
35
+ /* The overlay follows the host `.dark` class only with theme="auto", like theme.css. */
36
+ .dark pricing-renderer[data-pr-root][theme='auto'],
37
+ .dark pricing-change-review[theme='auto'] {
38
+ color-scheme: dark;
39
+ }
40
+ }
@@ -1,4 +1,6 @@
1
1
  export { loadPricingFromUrl } from './load.js';
2
2
  export { parsePricingYaml } from './parser.js';
3
+ export { loadPricingSource } from './source.js';
4
+ export type { PricingSourceInput, PricingSourceOptions } from './source.js';
3
5
  export type { LoadedPricingResult, LoadPricingOptions, ParsePricingYamlOptions, PricingLoader, PricingLoaderContext, PricingRequestOptions, } from './types.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/yaml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/yaml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { loadPricingFromUrl } from './load.js';
2
2
  export { parsePricingYaml } from './parser.js';
3
+ export { loadPricingSource } from './source.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/yaml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/yaml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/yaml/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAsCjG,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CA0E9B"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/yaml/load.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAwHjG,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAiG9B"}
package/dist/yaml/load.js CHANGED
@@ -8,13 +8,91 @@ function loadError(code, message) {
8
8
  diagnostics: [{ code, severity: 'error', message, path: '$' }],
9
9
  };
10
10
  }
11
+ function tooLarge() {
12
+ return loadError('PR_SOURCE_TOO_LARGE', 'Pricing source exceeds the configured size limit.');
13
+ }
14
+ // Starts a cancel without waiting for it; a rejection is swallowed.
15
+ function discard(cancel) {
16
+ try {
17
+ cancel()?.catch(() => { });
18
+ }
19
+ catch {
20
+ // A cancel that throws synchronously must not replace the load result.
21
+ }
22
+ }
23
+ // Settles with the promise, or rejects with the signal's reason as soon as the signal aborts (at
24
+ // once when it is already aborted). A step that ignores the signal is abandoned: its late result is
25
+ // dropped and its rejection is swallowed. The abort listener is removed when the race ends.
26
+ function untilAborted(promise, signal) {
27
+ promise.catch(() => { });
28
+ return new Promise((resolve, reject) => {
29
+ if (signal.aborted) {
30
+ reject(signal.reason);
31
+ return;
32
+ }
33
+ const onAbort = () => reject(signal.reason);
34
+ signal.addEventListener('abort', onAbort, { once: true });
35
+ promise.then((value) => {
36
+ signal.removeEventListener('abort', onAbort);
37
+ resolve(value);
38
+ }, (error) => {
39
+ signal.removeEventListener('abort', onAbort);
40
+ reject(error);
41
+ });
42
+ });
43
+ }
44
+ // Returns the body bytes, or undefined when they exceed maxBytes. A body stream is counted chunk
45
+ // by chunk and cancelled at the chunk that crosses the limit; a response without a stream falls
46
+ // back to arrayBuffer(). Every wait is cut off when the signal aborts.
47
+ async function readBody(response, maxBytes, signal) {
48
+ if (signal.aborted)
49
+ throw signal.reason;
50
+ if (!response.body) {
51
+ const buffer = await untilAborted(response.arrayBuffer(), signal);
52
+ return buffer.byteLength > maxBytes ? undefined : new Uint8Array(buffer);
53
+ }
54
+ const reader = response.body.getReader();
55
+ const chunks = [];
56
+ let total = 0;
57
+ for (;;) {
58
+ let chunk;
59
+ try {
60
+ if (signal.aborted)
61
+ throw signal.reason;
62
+ chunk = await untilAborted(reader.read(), signal);
63
+ }
64
+ catch (error) {
65
+ discard(() => reader.cancel());
66
+ throw error;
67
+ }
68
+ const { done, value } = chunk;
69
+ if (done)
70
+ break;
71
+ total += value.byteLength;
72
+ if (total > maxBytes) {
73
+ discard(() => reader.cancel());
74
+ return undefined;
75
+ }
76
+ chunks.push(value);
77
+ }
78
+ const joined = new Uint8Array(total);
79
+ let offset = 0;
80
+ for (const chunk of chunks) {
81
+ joined.set(chunk, offset);
82
+ offset += chunk.byteLength;
83
+ }
84
+ return joined;
85
+ }
11
86
  async function resolveHeaders(headers) {
12
87
  return typeof headers === 'function' ? headers() : headers;
13
88
  }
14
89
  function createAbortController(externalSignal, timeoutMs) {
15
90
  const controller = new AbortController();
16
91
  const onAbort = () => controller.abort(externalSignal?.reason);
17
- externalSignal?.addEventListener('abort', onAbort, { once: true });
92
+ if (externalSignal?.aborted)
93
+ onAbort();
94
+ else
95
+ externalSignal?.addEventListener('abort', onAbort, { once: true });
18
96
  const timeout = setTimeout(() => controller.abort(new Error('Pricing request timed out.')), timeoutMs);
19
97
  return {
20
98
  controller,
@@ -39,45 +117,56 @@ export async function loadPricingFromUrl(source, options = {}) {
39
117
  const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
40
118
  const { controller, cleanup } = createAbortController(options.signal, timeoutMs);
41
119
  try {
42
- const headers = await resolveHeaders(options.headers);
120
+ const { signal } = controller;
121
+ // Static headers need no wait: the loader or fetch starts in the same turn as the call, so a
122
+ // load replaced right after it began has already called its loader, as before the race.
123
+ const headers = typeof options.headers === 'function'
124
+ ? await untilAborted(resolveHeaders(options.headers), signal)
125
+ : options.headers;
126
+ if (signal.aborted)
127
+ throw signal.reason;
43
128
  if (options.loadPricing) {
44
- const loaded = await options.loadPricing({
129
+ const loaded = await untilAborted(Promise.resolve(options.loadPricing({
45
130
  url: url.toString(),
46
- signal: controller.signal,
131
+ signal,
47
132
  request: {
48
133
  credentials: options.credentials ?? 'omit',
49
134
  timeoutMs,
50
135
  maxBytes,
51
136
  ...(headers ? { headers } : {}),
52
137
  },
138
+ })), signal);
139
+ if (typeof loaded !== 'string') {
140
+ return normalizePricing(loaded, options.normalize);
141
+ }
142
+ if (new TextEncoder().encode(loaded).byteLength > maxBytes) {
143
+ return loadError('PR_SOURCE_TOO_LARGE', 'Pricing source exceeds the configured size limit.');
144
+ }
145
+ return parsePricingYaml(loaded, {
146
+ ...(options.normalize ? { normalize: options.normalize } : {}),
53
147
  });
54
- return typeof loaded === 'string'
55
- ? parsePricingYaml(loaded, {
56
- ...(options.normalize ? { normalize: options.normalize } : {}),
57
- })
58
- : normalizePricing(loaded, options.normalize);
59
148
  }
60
149
  const fetchImplementation = options.fetch ?? globalThis.fetch;
61
150
  if (typeof fetchImplementation !== 'function') {
62
151
  return loadError('PR_FETCH_UNAVAILABLE', 'No fetch implementation is available.');
63
152
  }
64
- const response = await fetchImplementation(url, {
153
+ const response = await untilAborted(Promise.resolve(fetchImplementation(url, {
65
154
  method: 'GET',
66
155
  credentials: options.credentials ?? 'omit',
67
156
  ...(headers ? { headers } : {}),
68
- signal: controller.signal,
69
- });
157
+ signal,
158
+ })), signal);
70
159
  if (!response.ok) {
71
160
  return loadError('PR_SOURCE_HTTP_ERROR', `Pricing request failed with HTTP ${response.status}.`);
72
161
  }
73
162
  const declaredLength = Number(response.headers.get('content-length'));
74
163
  if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {
75
- return loadError('PR_SOURCE_TOO_LARGE', 'Pricing source exceeds the configured size limit.');
76
- }
77
- const body = await response.arrayBuffer();
78
- if (body.byteLength > maxBytes) {
79
- return loadError('PR_SOURCE_TOO_LARGE', 'Pricing source exceeds the configured size limit.');
164
+ discard(() => response.body?.cancel());
165
+ return tooLarge();
80
166
  }
167
+ const body = await readBody(response, maxBytes, signal);
168
+ if (!body)
169
+ return tooLarge();
81
170
  return parsePricingYaml(new TextDecoder().decode(body), {
82
171
  ...(options.normalize ? { normalize: options.normalize } : {}),
83
172
  });
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/yaml/load.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/yaml/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { IPricingLike, NormalizedPricing, NormalizePricingOptions, PricingResult } from '../core/index.js';
2
+ import type { PricingLoader, PricingRequestOptions } from './types.js';
3
+ export interface PricingSourceInput {
4
+ pricing?: IPricingLike;
5
+ yaml?: string;
6
+ src?: string;
7
+ }
8
+ export interface PricingSourceOptions {
9
+ request?: PricingRequestOptions;
10
+ loadPricing?: PricingLoader;
11
+ normalizeOptions?: NormalizePricingOptions;
12
+ signal?: AbortSignal;
13
+ }
14
+ type SourceResult = PricingResult<NormalizedPricing>;
15
+ export declare function pricingSourceError(input: PricingSourceInput): SourceResult | undefined;
16
+ export declare function loadPricingSource(input: PricingSourceInput, options?: PricingSourceOptions): SourceResult | Promise<SourceResult>;
17
+ export {};
18
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/yaml/source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,KAAK,YAAY,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAGrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,SAAS,CAoBtF;AAGD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,oBAAyB,GACjC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBtC"}
@@ -0,0 +1,46 @@
1
+ import { normalizePricing } from '../core/index.js';
2
+ import { loadPricingFromUrl } from './load.js';
3
+ import { parsePricingYaml } from './parser.js';
4
+ // The failed result of a source count other than one; undefined when exactly one source is given.
5
+ export function pricingSourceError(input) {
6
+ const count = (input.pricing !== undefined ? 1 : 0) +
7
+ (input.yaml !== undefined ? 1 : 0) +
8
+ (input.src ? 1 : 0);
9
+ if (count === 1)
10
+ return undefined;
11
+ return {
12
+ ok: false,
13
+ diagnostics: [
14
+ {
15
+ code: count === 0 ? 'PR_SOURCE_MISSING' : 'PR_SOURCE_CONFLICT',
16
+ severity: 'error',
17
+ message: count === 0
18
+ ? 'Provide exactly one pricing source: pricing, yaml or src.'
19
+ : 'Only one pricing source can be provided at a time.',
20
+ path: '$',
21
+ },
22
+ ],
23
+ };
24
+ }
25
+ // Inline sources give a result at once, src gives a promise. request is passed as given.
26
+ export function loadPricingSource(input, options = {}) {
27
+ const failure = pricingSourceError(input);
28
+ if (failure)
29
+ return failure;
30
+ const { request, loadPricing, normalizeOptions, signal } = options;
31
+ if (input.pricing !== undefined) {
32
+ return normalizePricing(input.pricing, normalizeOptions);
33
+ }
34
+ if (input.yaml !== undefined) {
35
+ return parsePricingYaml(input.yaml, {
36
+ ...(normalizeOptions ? { normalize: normalizeOptions } : {}),
37
+ });
38
+ }
39
+ return loadPricingFromUrl(input.src, {
40
+ ...(request ?? {}),
41
+ ...(loadPricing ? { loadPricing } : {}),
42
+ ...(normalizeOptions ? { normalize: normalizeOptions } : {}),
43
+ ...(signal ? { signal } : {}),
44
+ });
45
+ }
46
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/yaml/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkB/C,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,MAAM,KAAK,GACT,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO;QACL,EAAE,EAAE,KAAK;QACT,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB;gBAC9D,QAAQ,EAAE,OAAO;gBACjB,OAAO,EACL,KAAK,KAAK,CAAC;oBACT,CAAC,CAAC,2DAA2D;oBAC7D,CAAC,CAAC,oDAAoD;gBAC1D,IAAI,EAAE,GAAG;aACV;SACF;KACF,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAC/B,KAAyB,EACzB,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE;YAClC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,GAAI,EAAE;QACpC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pricing-renderer",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A framework-friendly, themeable renderer for Pricing2Yaml pricing models.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,7 +24,6 @@
24
24
  "engines": {
25
25
  "node": ">=22"
26
26
  },
27
- "packageManager": "pnpm@10.19.0",
28
27
  "main": "./dist/core/index.js",
29
28
  "module": "./dist/core/index.js",
30
29
  "types": "./dist/core/index.d.ts",
@@ -46,12 +45,26 @@
46
45
  "types": "./dist/element/define.d.ts",
47
46
  "default": "./dist/element/define.js"
48
47
  },
48
+ "./define-change-review": {
49
+ "types": "./dist/element/define-change-review.d.ts",
50
+ "default": "./dist/element/define-change-review.js"
51
+ },
49
52
  "./react": {
50
53
  "types": "./dist/react/index.d.ts",
51
54
  "default": "./dist/react/index.js"
52
55
  },
56
+ "./react/headless": {
57
+ "types": "./dist/react/headless.d.ts",
58
+ "default": "./dist/react/headless.js"
59
+ },
60
+ "./space": {
61
+ "types": "./dist/space/index.d.ts",
62
+ "default": "./dist/space/index.js"
63
+ },
53
64
  "./base.css": "./dist/styles/base.css",
54
65
  "./theme.css": "./dist/styles/theme.css",
66
+ "./tokens-shadcn.css": "./dist/styles/tokens-shadcn.css",
67
+ "./theme-minimal.css": "./dist/styles/theme-minimal.css",
55
68
  "./styles.css": "./dist/styles/styles.css",
56
69
  "./package.json": "./package.json"
57
70
  },
@@ -65,6 +78,7 @@
65
78
  ],
66
79
  "sideEffects": [
67
80
  "./dist/element/define.js",
81
+ "./dist/element/define-change-review.js",
68
82
  "./dist/react/index.js",
69
83
  "**/*.css"
70
84
  ],
@@ -103,8 +117,12 @@
103
117
  "react-dom": "^19.1.1",
104
118
  "typescript": "^5.9.2",
105
119
  "typescript-eslint": "^8.38.0",
106
- "vite": "^6.1.0",
107
- "vitest": "^3.2.4"
120
+ "vite": "^7.3.7",
121
+ "vitest": "^5.0.5"
122
+ },
123
+ "publishConfig": {
124
+ "access": "public",
125
+ "provenance": true
108
126
  },
109
127
  "scripts": {
110
128
  "clean": "node scripts/clean.mjs",
@@ -119,14 +137,8 @@
119
137
  "demo": "pnpm build && pnpm --filter pricing-renderer-demo dev",
120
138
  "demo:react": "pnpm build && pnpm --filter pricing-renderer-react-demo dev",
121
139
  "demo:next": "pnpm build && pnpm --filter pricing-renderer-next-demo dev",
122
- "package:check": "pnpm build && publint && attw --pack . --profile esm-only --entrypoints . ./yaml ./element ./define ./react",
140
+ "package:check": "pnpm build && publint && attw --pack . --profile esm-only --entrypoints . ./yaml ./element ./define ./react ./space ./define-change-review ./react/headless",
123
141
  "release:check": "node scripts/check-release-ready.mjs",
124
- "release:registry-check": "node scripts/check-npm-version-available.mjs",
125
- "prepack": "pnpm build",
126
- "prepublishOnly": "pnpm test && pnpm package:check"
127
- },
128
- "publishConfig": {
129
- "access": "public",
130
- "provenance": true
142
+ "release:registry-check": "node scripts/check-npm-version-available.mjs"
131
143
  }
132
- }
144
+ }