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.
- package/CHANGELOG.md +133 -0
- package/README.md +142 -25
- package/THIRD_PARTY_NOTICES.md +84 -6
- package/custom-elements.json +233 -3
- package/dist/core/apply-selection.d.ts +8 -0
- package/dist/core/apply-selection.d.ts.map +1 -0
- package/dist/core/apply-selection.js +76 -0
- package/dist/core/apply-selection.js.map +1 -0
- package/dist/core/breakdown.d.ts +13 -0
- package/dist/core/breakdown.d.ts.map +1 -0
- package/dist/core/breakdown.js +56 -0
- package/dist/core/breakdown.js.map +1 -0
- package/dist/core/compare-sides.d.ts +16 -0
- package/dist/core/compare-sides.d.ts.map +1 -0
- package/dist/core/compare-sides.js +73 -0
- package/dist/core/compare-sides.js.map +1 -0
- package/dist/core/compare-values.d.ts +13 -0
- package/dist/core/compare-values.d.ts.map +1 -0
- package/dist/core/compare-values.js +100 -0
- package/dist/core/compare-values.js.map +1 -0
- package/dist/core/compare.d.ts +7 -0
- package/dist/core/compare.d.ts.map +1 -0
- package/dist/core/compare.js +301 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/expression.js +2 -2
- package/dist/core/expression.js.map +1 -1
- package/dist/core/i18n.d.ts.map +1 -1
- package/dist/core/i18n.js +136 -2
- package/dist/core/i18n.js.map +1 -1
- package/dist/core/index.d.ts +9 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/normalize.d.ts.map +1 -1
- package/dist/core/normalize.js +70 -9
- package/dist/core/normalize.js.map +1 -1
- package/dist/core/plan-relation.d.ts +8 -0
- package/dist/core/plan-relation.d.ts.map +1 -0
- package/dist/core/plan-relation.js +15 -0
- package/dist/core/plan-relation.js.map +1 -0
- package/dist/core/price-stabilizer.d.ts +3 -0
- package/dist/core/price-stabilizer.d.ts.map +1 -0
- package/dist/core/price-stabilizer.js +73 -0
- package/dist/core/price-stabilizer.js.map +1 -0
- package/dist/core/resolve.d.ts +7 -1
- package/dist/core/resolve.d.ts.map +1 -1
- package/dist/core/resolve.js +66 -21
- package/dist/core/resolve.js.map +1 -1
- package/dist/core/search-params.d.ts +15 -0
- package/dist/core/search-params.d.ts.map +1 -0
- package/dist/core/search-params.js +175 -0
- package/dist/core/search-params.js.map +1 -0
- package/dist/core/selection-change.d.ts +10 -0
- package/dist/core/selection-change.d.ts.map +1 -0
- package/dist/core/selection-change.js +124 -0
- package/dist/core/selection-change.js.map +1 -0
- package/dist/core/types.d.ts +209 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/units.d.ts +13 -0
- package/dist/core/units.d.ts.map +1 -0
- package/dist/core/units.js +84 -0
- package/dist/core/units.js.map +1 -0
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +91 -32
- package/dist/core/utils.js.map +1 -1
- package/dist/core/view-model.d.ts +3 -1
- package/dist/core/view-model.d.ts.map +1 -1
- package/dist/core/view-model.js +113 -7
- package/dist/core/view-model.js.map +1 -1
- package/dist/element/change-review-define.d.ts +4 -0
- package/dist/element/change-review-define.d.ts.map +1 -0
- package/dist/element/change-review-define.js +17 -0
- package/dist/element/change-review-define.js.map +1 -0
- package/dist/element/change-review-element.d.ts +53 -0
- package/dist/element/change-review-element.d.ts.map +1 -0
- package/dist/element/change-review-element.js +104 -0
- package/dist/element/change-review-element.js.map +1 -0
- package/dist/element/change-review-events.d.ts +10 -0
- package/dist/element/change-review-events.d.ts.map +1 -0
- package/dist/element/change-review-events.js +2 -0
- package/dist/element/change-review-events.js.map +1 -0
- package/dist/element/change-review-renderers.d.ts +23 -0
- package/dist/element/change-review-renderers.d.ts.map +1 -0
- package/dist/element/change-review-renderers.js +391 -0
- package/dist/element/change-review-renderers.js.map +1 -0
- package/dist/element/cta.d.ts +45 -0
- package/dist/element/cta.d.ts.map +1 -0
- package/dist/element/cta.js +90 -0
- package/dist/element/cta.js.map +1 -0
- package/dist/element/current-selection.d.ts +13 -0
- package/dist/element/current-selection.d.ts.map +1 -0
- package/dist/element/current-selection.js +57 -0
- package/dist/element/current-selection.js.map +1 -0
- package/dist/element/define-change-review.d.ts +2 -0
- package/dist/element/define-change-review.d.ts.map +1 -0
- package/dist/element/define-change-review.js +7 -0
- package/dist/element/define-change-review.js.map +1 -0
- package/dist/element/events.d.ts +32 -6
- package/dist/element/events.d.ts.map +1 -1
- package/dist/element/hide-sections.d.ts +6 -0
- package/dist/element/hide-sections.d.ts.map +1 -0
- package/dist/element/hide-sections.js +26 -0
- package/dist/element/hide-sections.js.map +1 -0
- package/dist/element/index.d.ts +8 -1
- package/dist/element/index.d.ts.map +1 -1
- package/dist/element/index.js +3 -0
- package/dist/element/index.js.map +1 -1
- package/dist/element/pricing-renderer-element.d.ts +95 -7
- package/dist/element/pricing-renderer-element.d.ts.map +1 -1
- package/dist/element/pricing-renderer-element.js +563 -217
- package/dist/element/pricing-renderer-element.js.map +1 -1
- package/dist/element/renderers.d.ts +49 -4
- package/dist/element/renderers.d.ts.map +1 -1
- package/dist/element/renderers.js +795 -263
- package/dist/element/renderers.js.map +1 -1
- package/dist/element/same-input.d.ts +3 -0
- package/dist/element/same-input.d.ts.map +1 -0
- package/dist/element/same-input.js +56 -0
- package/dist/element/same-input.js.map +1 -0
- package/dist/react/headless.d.ts +9 -0
- package/dist/react/headless.d.ts.map +1 -0
- package/dist/react/headless.js +8 -0
- package/dist/react/headless.js.map +1 -0
- package/dist/react/index.d.ts +54 -4
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +156 -6
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts +17 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +38 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/selection-store.d.ts +51 -0
- package/dist/react/selection-store.d.ts.map +1 -0
- package/dist/react/selection-store.js +239 -0
- package/dist/react/selection-store.js.map +1 -0
- package/dist/react/slots-types.d.ts +38 -0
- package/dist/react/slots-types.d.ts.map +1 -0
- package/dist/react/slots-types.js +2 -0
- package/dist/react/slots-types.js.map +1 -0
- package/dist/react/slots.d.ts +40 -0
- package/dist/react/slots.d.ts.map +1 -0
- package/dist/react/slots.js +165 -0
- package/dist/react/slots.js.map +1 -0
- package/dist/react/use-pricing-selection.d.ts +10 -0
- package/dist/react/use-pricing-selection.d.ts.map +1 -0
- package/dist/react/use-pricing-selection.js +44 -0
- package/dist/react/use-pricing-selection.js.map +1 -0
- package/dist/react/use-pricing-source.d.ts +34 -0
- package/dist/react/use-pricing-source.d.ts.map +1 -0
- package/dist/react/use-pricing-source.js +186 -0
- package/dist/react/use-pricing-source.js.map +1 -0
- package/dist/react/use-renderer-state.d.ts +22 -0
- package/dist/react/use-renderer-state.d.ts.map +1 -0
- package/dist/react/use-renderer-state.js +112 -0
- package/dist/react/use-renderer-state.js.map +1 -0
- package/dist/space/index.d.ts +26 -0
- package/dist/space/index.d.ts.map +1 -0
- package/dist/space/index.js +71 -0
- package/dist/space/index.js.map +1 -0
- package/dist/styles/base.css +1030 -76
- package/dist/styles/theme-minimal.css +103 -0
- package/dist/styles/theme.css +22 -3
- package/dist/styles/tokens-shadcn.css +40 -0
- package/dist/yaml/index.d.ts +2 -0
- package/dist/yaml/index.d.ts.map +1 -1
- package/dist/yaml/index.js +1 -0
- package/dist/yaml/index.js.map +1 -1
- package/dist/yaml/load.d.ts.map +1 -1
- package/dist/yaml/load.js +106 -17
- package/dist/yaml/load.js.map +1 -1
- package/dist/yaml/source.d.ts +18 -0
- package/dist/yaml/source.d.ts.map +1 -0
- package/dist/yaml/source.js +46 -0
- package/dist/yaml/source.js.map +1 -0
- 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
|
+
}
|
package/dist/styles/theme.css
CHANGED
|
@@ -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
|
+
}
|
package/dist/yaml/index.d.ts
CHANGED
|
@@ -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
|
package/dist/yaml/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/yaml/index.js
CHANGED
package/dist/yaml/index.js.map
CHANGED
|
@@ -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"}
|
package/dist/yaml/load.d.ts.map
CHANGED
|
@@ -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;
|
|
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?.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
});
|
package/dist/yaml/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/yaml/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1C,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,OAAO;QACL,EAAE,EAAE,KAAK;QACT,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAyC;IAEzC,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7D,CAAC;AAED,SAAS,qBAAqB,CAC5B,cAAuC,EACvC,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC/D,cAAc,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
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.
|
|
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": "^
|
|
107
|
-
"vitest": "^
|
|
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
|
+
}
|