@timbenniks/contentstack-platform-sdk 0.1.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/dist/auth/index.cjs +607 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +108 -0
- package/dist/auth/index.d.ts +108 -0
- package/dist/auth/index.mjs +25 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/brandkit/index.cjs +525 -0
- package/dist/brandkit/index.cjs.map +1 -0
- package/dist/brandkit/index.d.cts +95 -0
- package/dist/brandkit/index.d.ts +95 -0
- package/dist/brandkit/index.mjs +11 -0
- package/dist/brandkit/index.mjs.map +1 -0
- package/dist/chunk-3C6J2BDB.mjs +84 -0
- package/dist/chunk-3C6J2BDB.mjs.map +1 -0
- package/dist/chunk-3KE63N3I.mjs +64 -0
- package/dist/chunk-3KE63N3I.mjs.map +1 -0
- package/dist/chunk-4CJ4IVPJ.mjs +212 -0
- package/dist/chunk-4CJ4IVPJ.mjs.map +1 -0
- package/dist/chunk-4JFUI7MJ.mjs +368 -0
- package/dist/chunk-4JFUI7MJ.mjs.map +1 -0
- package/dist/chunk-7VFGD32I.mjs +26 -0
- package/dist/chunk-7VFGD32I.mjs.map +1 -0
- package/dist/chunk-ARPJDW3A.mjs +44 -0
- package/dist/chunk-ARPJDW3A.mjs.map +1 -0
- package/dist/chunk-AVJHCFRK.mjs +52 -0
- package/dist/chunk-AVJHCFRK.mjs.map +1 -0
- package/dist/chunk-BK2IBTQS.mjs +131 -0
- package/dist/chunk-BK2IBTQS.mjs.map +1 -0
- package/dist/chunk-BUZ6CQHE.mjs +75 -0
- package/dist/chunk-BUZ6CQHE.mjs.map +1 -0
- package/dist/chunk-CKMAOWBQ.mjs +379 -0
- package/dist/chunk-CKMAOWBQ.mjs.map +1 -0
- package/dist/chunk-DJQLN4TR.mjs +1 -0
- package/dist/chunk-DJQLN4TR.mjs.map +1 -0
- package/dist/chunk-DMERADWM.mjs +67 -0
- package/dist/chunk-DMERADWM.mjs.map +1 -0
- package/dist/chunk-EREPKWTW.mjs +926 -0
- package/dist/chunk-EREPKWTW.mjs.map +1 -0
- package/dist/chunk-FQP4PB5X.mjs +88 -0
- package/dist/chunk-FQP4PB5X.mjs.map +1 -0
- package/dist/chunk-GNPQJBFX.mjs +144 -0
- package/dist/chunk-GNPQJBFX.mjs.map +1 -0
- package/dist/chunk-GOSB24M6.mjs +87 -0
- package/dist/chunk-GOSB24M6.mjs.map +1 -0
- package/dist/chunk-JL2E3EOT.mjs +255 -0
- package/dist/chunk-JL2E3EOT.mjs.map +1 -0
- package/dist/chunk-JYGZBKTH.mjs +222 -0
- package/dist/chunk-JYGZBKTH.mjs.map +1 -0
- package/dist/chunk-JZE2W7VW.mjs +52 -0
- package/dist/chunk-JZE2W7VW.mjs.map +1 -0
- package/dist/chunk-K76DKSHJ.mjs +18 -0
- package/dist/chunk-K76DKSHJ.mjs.map +1 -0
- package/dist/chunk-KLVIROVU.mjs +232 -0
- package/dist/chunk-KLVIROVU.mjs.map +1 -0
- package/dist/chunk-LPVVA5J3.mjs +18 -0
- package/dist/chunk-LPVVA5J3.mjs.map +1 -0
- package/dist/chunk-NKLOZ5VI.mjs +112 -0
- package/dist/chunk-NKLOZ5VI.mjs.map +1 -0
- package/dist/chunk-QGA4WBDC.mjs +7 -0
- package/dist/chunk-QGA4WBDC.mjs.map +1 -0
- package/dist/chunk-QW7TVYOA.mjs +56 -0
- package/dist/chunk-QW7TVYOA.mjs.map +1 -0
- package/dist/chunk-SU5QEKYW.mjs +83 -0
- package/dist/chunk-SU5QEKYW.mjs.map +1 -0
- package/dist/chunk-T5A2E2RI.mjs +654 -0
- package/dist/chunk-T5A2E2RI.mjs.map +1 -0
- package/dist/chunk-T5OIJQK7.mjs +116 -0
- package/dist/chunk-T5OIJQK7.mjs.map +1 -0
- package/dist/chunk-VW7DD6HV.mjs +253 -0
- package/dist/chunk-VW7DD6HV.mjs.map +1 -0
- package/dist/chunk-XH7NLHGW.mjs +133 -0
- package/dist/chunk-XH7NLHGW.mjs.map +1 -0
- package/dist/client-DJ5haQGd.d.cts +22 -0
- package/dist/client-DwVGVSQz.d.ts +22 -0
- package/dist/cma/index.cjs +1349 -0
- package/dist/cma/index.cjs.map +1 -0
- package/dist/cma/index.d.cts +22 -0
- package/dist/cma/index.d.ts +22 -0
- package/dist/cma/index.mjs +70 -0
- package/dist/cma/index.mjs.map +1 -0
- package/dist/errors-CAw-IRCP.d.cts +65 -0
- package/dist/errors-CAw-IRCP.d.ts +65 -0
- package/dist/generative-ai/index.cjs +401 -0
- package/dist/generative-ai/index.cjs.map +1 -0
- package/dist/generative-ai/index.d.cts +31 -0
- package/dist/generative-ai/index.d.ts +31 -0
- package/dist/generative-ai/index.mjs +10 -0
- package/dist/generative-ai/index.mjs.map +1 -0
- package/dist/images/index.cjs +185 -0
- package/dist/images/index.cjs.map +1 -0
- package/dist/images/index.d.cts +27 -0
- package/dist/images/index.d.ts +27 -0
- package/dist/images/index.mjs +8 -0
- package/dist/images/index.mjs.map +1 -0
- package/dist/index.cjs +2909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.mjs +153 -0
- package/dist/index.mjs.map +1 -0
- package/dist/knowledge-vault/index.cjs +413 -0
- package/dist/knowledge-vault/index.cjs.map +1 -0
- package/dist/knowledge-vault/index.d.cts +49 -0
- package/dist/knowledge-vault/index.d.ts +49 -0
- package/dist/knowledge-vault/index.mjs +10 -0
- package/dist/knowledge-vault/index.mjs.map +1 -0
- package/dist/launch/index.cjs +624 -0
- package/dist/launch/index.cjs.map +1 -0
- package/dist/launch/index.d.cts +169 -0
- package/dist/launch/index.d.ts +169 -0
- package/dist/launch/index.mjs +11 -0
- package/dist/launch/index.mjs.map +1 -0
- package/dist/react/auth/index.cjs +113 -0
- package/dist/react/auth/index.cjs.map +1 -0
- package/dist/react/auth/index.d.cts +33 -0
- package/dist/react/auth/index.d.ts +33 -0
- package/dist/react/auth/index.mjs +13 -0
- package/dist/react/auth/index.mjs.map +1 -0
- package/dist/react/content/index.cjs +113 -0
- package/dist/react/content/index.cjs.map +1 -0
- package/dist/react/content/index.d.cts +25 -0
- package/dist/react/content/index.d.ts +25 -0
- package/dist/react/content/index.mjs +7 -0
- package/dist/react/content/index.mjs.map +1 -0
- package/dist/react/hooks/index.cjs +2097 -0
- package/dist/react/hooks/index.cjs.map +1 -0
- package/dist/react/hooks/index.d.cts +77 -0
- package/dist/react/hooks/index.d.ts +77 -0
- package/dist/react/hooks/index.mjs +46 -0
- package/dist/react/hooks/index.mjs.map +1 -0
- package/dist/react/index.cjs +2307 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +16 -0
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.mjs +67 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/react/provider/index.cjs +83 -0
- package/dist/react/provider/index.cjs.map +1 -0
- package/dist/react/provider/index.d.cts +30 -0
- package/dist/react/provider/index.d.ts +30 -0
- package/dist/react/provider/index.mjs +11 -0
- package/dist/react/provider/index.mjs.map +1 -0
- package/dist/regions/index.cjs +171 -0
- package/dist/regions/index.cjs.map +1 -0
- package/dist/regions/index.d.cts +55 -0
- package/dist/regions/index.d.ts +55 -0
- package/dist/regions/index.mjs +13 -0
- package/dist/regions/index.mjs.map +1 -0
- package/dist/request-builders-BxeolQIw.d.ts +735 -0
- package/dist/request-builders-C2IG1LUo.d.cts +735 -0
- package/dist/rte/index.cjs +683 -0
- package/dist/rte/index.cjs.map +1 -0
- package/dist/rte/index.d.cts +33 -0
- package/dist/rte/index.d.ts +33 -0
- package/dist/rte/index.mjs +17 -0
- package/dist/rte/index.mjs.map +1 -0
- package/dist/server/index.cjs +917 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +6 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.mjs +45 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/middleware/index.cjs +614 -0
- package/dist/server/middleware/index.cjs.map +1 -0
- package/dist/server/middleware/index.d.cts +77 -0
- package/dist/server/middleware/index.d.ts +77 -0
- package/dist/server/middleware/index.mjs +27 -0
- package/dist/server/middleware/index.mjs.map +1 -0
- package/dist/server/proxy/index.cjs +329 -0
- package/dist/server/proxy/index.cjs.map +1 -0
- package/dist/server/proxy/index.d.cts +143 -0
- package/dist/server/proxy/index.d.ts +143 -0
- package/dist/server/proxy/index.mjs +29 -0
- package/dist/server/proxy/index.mjs.map +1 -0
- package/dist/server/webhooks/index.cjs +131 -0
- package/dist/server/webhooks/index.cjs.map +1 -0
- package/dist/server/webhooks/index.d.cts +230 -0
- package/dist/server/webhooks/index.d.ts +230 -0
- package/dist/server/webhooks/index.mjs +23 -0
- package/dist/server/webhooks/index.mjs.map +1 -0
- package/dist/types-6D9VR7pT.d.cts +26 -0
- package/dist/types-AelT0rFJ.d.cts +21 -0
- package/dist/types-AelT0rFJ.d.ts +21 -0
- package/dist/types-Bu5yCgmw.d.ts +26 -0
- package/dist/types-DgixK-ll.d.cts +23 -0
- package/dist/types-DgixK-ll.d.ts +23 -0
- package/dist/types-DrMwdlH9.d.cts +245 -0
- package/dist/types-DrMwdlH9.d.ts +245 -0
- package/dist/ui/css/index.cjs +31 -0
- package/dist/ui/css/index.cjs.map +1 -0
- package/dist/ui/css/index.d.cts +15 -0
- package/dist/ui/css/index.d.ts +15 -0
- package/dist/ui/css/index.mjs +7 -0
- package/dist/ui/css/index.mjs.map +1 -0
- package/dist/ui/index.cjs +368 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +4 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.mjs +33 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/ui/theme/index.cjs +105 -0
- package/dist/ui/theme/index.cjs.map +1 -0
- package/dist/ui/theme/index.d.cts +33 -0
- package/dist/ui/theme/index.d.ts +33 -0
- package/dist/ui/theme/index.mjs +15 -0
- package/dist/ui/theme/index.mjs.map +1 -0
- package/dist/ui/tokens/index.cjs +286 -0
- package/dist/ui/tokens/index.cjs.map +1 -0
- package/dist/ui/tokens/index.d.cts +54 -0
- package/dist/ui/tokens/index.d.ts +54 -0
- package/dist/ui/tokens/index.mjs +17 -0
- package/dist/ui/tokens/index.mjs.map +1 -0
- package/dist/ui/tokens.css +408 -0
- package/dist/vue/auth/index.cjs +141 -0
- package/dist/vue/auth/index.cjs.map +1 -0
- package/dist/vue/auth/index.d.cts +78 -0
- package/dist/vue/auth/index.d.ts +78 -0
- package/dist/vue/auth/index.mjs +13 -0
- package/dist/vue/auth/index.mjs.map +1 -0
- package/dist/vue/composables/index.cjs +2108 -0
- package/dist/vue/composables/index.cjs.map +1 -0
- package/dist/vue/composables/index.d.cts +78 -0
- package/dist/vue/composables/index.d.ts +78 -0
- package/dist/vue/composables/index.mjs +46 -0
- package/dist/vue/composables/index.mjs.map +1 -0
- package/dist/vue/content/index.cjs +142 -0
- package/dist/vue/content/index.cjs.map +1 -0
- package/dist/vue/content/index.d.cts +47 -0
- package/dist/vue/content/index.d.ts +47 -0
- package/dist/vue/content/index.mjs +7 -0
- package/dist/vue/content/index.mjs.map +1 -0
- package/dist/vue/index.cjs +2389 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +16 -0
- package/dist/vue/index.d.ts +16 -0
- package/dist/vue/index.mjs +69 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/vue/provider/index.cjs +97 -0
- package/dist/vue/provider/index.cjs.map +1 -0
- package/dist/vue/provider/index.d.cts +90 -0
- package/dist/vue/provider/index.d.ts +90 -0
- package/dist/vue/provider/index.mjs +13 -0
- package/dist/vue/provider/index.mjs.map +1 -0
- package/package.json +195 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
// src/ui/tokens/colors.ts
|
|
2
|
+
var colors = {
|
|
3
|
+
brand: {
|
|
4
|
+
primary: {
|
|
5
|
+
base: "#6c5ce7",
|
|
6
|
+
medium: "#9387ed",
|
|
7
|
+
dark: "#3e3871",
|
|
8
|
+
darker: "#5d50bf",
|
|
9
|
+
light: "#efedfc"
|
|
10
|
+
},
|
|
11
|
+
secondary: {
|
|
12
|
+
lightest: "#dde3ee",
|
|
13
|
+
lighter: "#edf1f7",
|
|
14
|
+
light: "#a9b6cb",
|
|
15
|
+
base: "#647696",
|
|
16
|
+
medium: "#c7d0e1",
|
|
17
|
+
dark: "#475161"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
status: {
|
|
21
|
+
success: {
|
|
22
|
+
base: "#007a52",
|
|
23
|
+
dark: "#00472f",
|
|
24
|
+
light: "#f5fffc"
|
|
25
|
+
},
|
|
26
|
+
warning: {
|
|
27
|
+
base: "#d62400",
|
|
28
|
+
dark: "#701300",
|
|
29
|
+
light: "#ffeeeb",
|
|
30
|
+
medium: "#eb5646"
|
|
31
|
+
},
|
|
32
|
+
attention: {
|
|
33
|
+
base: "#ffae0a",
|
|
34
|
+
dark: "#704b00",
|
|
35
|
+
light: "#fff8eb"
|
|
36
|
+
},
|
|
37
|
+
info: {
|
|
38
|
+
base: "#00b9e0",
|
|
39
|
+
dark: "#003b47",
|
|
40
|
+
light: "#f5fdff"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
base: {
|
|
44
|
+
purple: {
|
|
45
|
+
5: "#6c5ce7",
|
|
46
|
+
10: "#3e3871",
|
|
47
|
+
15: "#efedfc",
|
|
48
|
+
20: "#9387ed",
|
|
49
|
+
25: "#5d50bf"
|
|
50
|
+
},
|
|
51
|
+
gray: {
|
|
52
|
+
5: "#edf1f7",
|
|
53
|
+
10: "#a9b6cb",
|
|
54
|
+
15: "#647696",
|
|
55
|
+
20: "#475161",
|
|
56
|
+
25: "rgba(160, 174, 192, 0.5)",
|
|
57
|
+
30: "#f5f5f5",
|
|
58
|
+
35: "#c7d0e1",
|
|
59
|
+
40: "#dde3ee"
|
|
60
|
+
},
|
|
61
|
+
green: {
|
|
62
|
+
5: "#007a52",
|
|
63
|
+
10: "#00472f",
|
|
64
|
+
15: "#f5fffc"
|
|
65
|
+
},
|
|
66
|
+
orange: {
|
|
67
|
+
5: "#d62400",
|
|
68
|
+
10: "#701300",
|
|
69
|
+
15: "#ffeeeb",
|
|
70
|
+
20: "#eb5646"
|
|
71
|
+
},
|
|
72
|
+
blue: {
|
|
73
|
+
5: "#00b9e0",
|
|
74
|
+
10: "#003b47",
|
|
75
|
+
15: "#f5fdff"
|
|
76
|
+
},
|
|
77
|
+
yellow: {
|
|
78
|
+
5: "#ffae0a",
|
|
79
|
+
10: "#704b00",
|
|
80
|
+
15: "#fff8eb"
|
|
81
|
+
},
|
|
82
|
+
black: {
|
|
83
|
+
5: "#222222"
|
|
84
|
+
},
|
|
85
|
+
white: {
|
|
86
|
+
5: "#ffffff",
|
|
87
|
+
10: "#f7f9fc",
|
|
88
|
+
15: "#f5f5f5",
|
|
89
|
+
20: "#f7f9fc"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
font: {
|
|
93
|
+
base: "#475161",
|
|
94
|
+
secondary: "#647696",
|
|
95
|
+
tertiary: "#a9b6cb",
|
|
96
|
+
quaternary: "#edf1f7",
|
|
97
|
+
link: "#6c5ce7",
|
|
98
|
+
active: "#647696",
|
|
99
|
+
warning: "#d62400",
|
|
100
|
+
attention: "#ffae0a",
|
|
101
|
+
success: "#007a52",
|
|
102
|
+
info: "#00b9e0",
|
|
103
|
+
disabled: "rgba(160, 174, 192, 0.5)",
|
|
104
|
+
white: "#ffffff",
|
|
105
|
+
black: "#222222",
|
|
106
|
+
sonicSilver: "#767676",
|
|
107
|
+
tarmacGrey: "#475161",
|
|
108
|
+
gray900: "#212121",
|
|
109
|
+
jetBlack: "#000000",
|
|
110
|
+
purpleGray: "#6e6b86"
|
|
111
|
+
},
|
|
112
|
+
border: {
|
|
113
|
+
lighter: "#f5f5f5",
|
|
114
|
+
light: "#a9b6cb",
|
|
115
|
+
base: "#647696",
|
|
116
|
+
dark: "#475161",
|
|
117
|
+
link: "#6c5ce7",
|
|
118
|
+
focus: "#edf1f7",
|
|
119
|
+
warning: "#d62400",
|
|
120
|
+
success: "#007a52"
|
|
121
|
+
},
|
|
122
|
+
bg: {
|
|
123
|
+
lavender: "#f8f6ff",
|
|
124
|
+
dolphinGrey: "#dde3ee",
|
|
125
|
+
pureWhite: "#ffffff",
|
|
126
|
+
milkybarWhite: "#f7f9fc",
|
|
127
|
+
hibiscus: "#ffeeeb",
|
|
128
|
+
cashew: "#fff8eb",
|
|
129
|
+
algae: "#f5fffc",
|
|
130
|
+
sky: "#f5fdff",
|
|
131
|
+
tulipPurple: "#f9f8ff",
|
|
132
|
+
lavenderBlue: "#fadeff"
|
|
133
|
+
},
|
|
134
|
+
accent: {
|
|
135
|
+
purple50: "#b6aef3",
|
|
136
|
+
mediumOrchid: "#bd59fa",
|
|
137
|
+
blueChalk: "#edebff",
|
|
138
|
+
paleAqua: "#bad4fb",
|
|
139
|
+
pastelBlue: "#43b7c2",
|
|
140
|
+
bottleGreen: "#003a25",
|
|
141
|
+
aquaDeep: "#00593b",
|
|
142
|
+
mint: "#47b0aa",
|
|
143
|
+
summerGreen: "#90bba5",
|
|
144
|
+
bean: "#4f0800",
|
|
145
|
+
rustOrange: "#ba5800",
|
|
146
|
+
salmonPink: "#e57872",
|
|
147
|
+
crayola: "#ffce6c",
|
|
148
|
+
sundown: "#fdafa3",
|
|
149
|
+
butterscotch: "#ffad48"
|
|
150
|
+
},
|
|
151
|
+
statusAccent: {
|
|
152
|
+
poppy: "#a31b00",
|
|
153
|
+
mango: "#ffae0a",
|
|
154
|
+
spinach: "#007a52",
|
|
155
|
+
aqua: "#0469e3",
|
|
156
|
+
maximumBluePurple: "#ada4f4"
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
function colorVar(name) {
|
|
160
|
+
return `var(--cs-color-${name})`;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// src/ui/tokens/typography.ts
|
|
164
|
+
var typography = {
|
|
165
|
+
fontFamily: {
|
|
166
|
+
primary: "Inter, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
|
|
167
|
+
},
|
|
168
|
+
fontSize: {
|
|
169
|
+
tiny: "0.6875rem",
|
|
170
|
+
small: "0.75rem",
|
|
171
|
+
medium: "0.8125rem",
|
|
172
|
+
large: "0.875rem",
|
|
173
|
+
xl: "1rem",
|
|
174
|
+
"2xl": "1.125rem",
|
|
175
|
+
"3xl": "1.375rem",
|
|
176
|
+
"4xl": "1.875rem",
|
|
177
|
+
"5xl": "2.25rem",
|
|
178
|
+
"6xl": "2.625rem"
|
|
179
|
+
},
|
|
180
|
+
fontSizeV2: {
|
|
181
|
+
small: "0.75rem",
|
|
182
|
+
medium: "0.875rem",
|
|
183
|
+
large: "1rem",
|
|
184
|
+
xl: "1.25rem",
|
|
185
|
+
"2xl": "1.75rem",
|
|
186
|
+
"3xl": "2.125rem"
|
|
187
|
+
},
|
|
188
|
+
fontWeight: {
|
|
189
|
+
regular: 400,
|
|
190
|
+
medium: 500,
|
|
191
|
+
semiBold: 600,
|
|
192
|
+
bold: 700,
|
|
193
|
+
extraBold: 800
|
|
194
|
+
},
|
|
195
|
+
lineHeight: {
|
|
196
|
+
default: 1.5,
|
|
197
|
+
condensed: 1.25,
|
|
198
|
+
reset: 1
|
|
199
|
+
},
|
|
200
|
+
letterSpacing: {
|
|
201
|
+
tight: "0.01em",
|
|
202
|
+
normal: "0.02em"
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
function fontVar(name) {
|
|
206
|
+
return `var(--cs-${name})`;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/ui/tokens/spacing.ts
|
|
210
|
+
var spacing = {
|
|
211
|
+
2: "0.125rem",
|
|
212
|
+
4: "0.25rem",
|
|
213
|
+
5: "0.3125rem",
|
|
214
|
+
6: "0.375rem",
|
|
215
|
+
8: "0.5rem",
|
|
216
|
+
10: "0.625rem",
|
|
217
|
+
12: "0.75rem",
|
|
218
|
+
14: "0.875rem",
|
|
219
|
+
15: "0.9375rem",
|
|
220
|
+
16: "1rem",
|
|
221
|
+
18: "1.125rem",
|
|
222
|
+
20: "1.25rem",
|
|
223
|
+
22: "1.375rem",
|
|
224
|
+
24: "1.5rem",
|
|
225
|
+
25: "1.5625rem",
|
|
226
|
+
26: "1.625rem",
|
|
227
|
+
28: "1.75rem",
|
|
228
|
+
30: "1.875rem",
|
|
229
|
+
32: "2rem",
|
|
230
|
+
34: "2.125rem",
|
|
231
|
+
35: "2.1875rem",
|
|
232
|
+
36: "2.25rem",
|
|
233
|
+
38: "2.375rem",
|
|
234
|
+
40: "2.5rem",
|
|
235
|
+
50: "3.125rem",
|
|
236
|
+
60: "3.75rem",
|
|
237
|
+
64: "4rem",
|
|
238
|
+
80: "5rem",
|
|
239
|
+
100: "6.25rem",
|
|
240
|
+
120: "7.5rem",
|
|
241
|
+
160: "10rem"
|
|
242
|
+
};
|
|
243
|
+
function spaceVar(size) {
|
|
244
|
+
return `var(--cs-space-${size})`;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export {
|
|
248
|
+
colors,
|
|
249
|
+
colorVar,
|
|
250
|
+
typography,
|
|
251
|
+
fontVar,
|
|
252
|
+
spacing,
|
|
253
|
+
spaceVar
|
|
254
|
+
};
|
|
255
|
+
//# sourceMappingURL=chunk-JL2E3EOT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/tokens/colors.ts","../src/ui/tokens/typography.ts","../src/ui/tokens/spacing.ts"],"sourcesContent":["import type { ColorTokens } from \"./types.js\"\n\n/**\n * Contentstack Venus design system color tokens (light theme).\n * Values sourced from `@contentstack/venus-components` token definitions.\n */\nexport const colors: ColorTokens = {\n brand: {\n primary: {\n base: \"#6c5ce7\",\n medium: \"#9387ed\",\n dark: \"#3e3871\",\n darker: \"#5d50bf\",\n light: \"#efedfc\",\n },\n secondary: {\n lightest: \"#dde3ee\",\n lighter: \"#edf1f7\",\n light: \"#a9b6cb\",\n base: \"#647696\",\n medium: \"#c7d0e1\",\n dark: \"#475161\",\n },\n },\n status: {\n success: {\n base: \"#007a52\",\n dark: \"#00472f\",\n light: \"#f5fffc\",\n },\n warning: {\n base: \"#d62400\",\n dark: \"#701300\",\n light: \"#ffeeeb\",\n medium: \"#eb5646\",\n },\n attention: {\n base: \"#ffae0a\",\n dark: \"#704b00\",\n light: \"#fff8eb\",\n },\n info: {\n base: \"#00b9e0\",\n dark: \"#003b47\",\n light: \"#f5fdff\",\n },\n },\n base: {\n purple: {\n 5: \"#6c5ce7\",\n 10: \"#3e3871\",\n 15: \"#efedfc\",\n 20: \"#9387ed\",\n 25: \"#5d50bf\",\n },\n gray: {\n 5: \"#edf1f7\",\n 10: \"#a9b6cb\",\n 15: \"#647696\",\n 20: \"#475161\",\n 25: \"rgba(160, 174, 192, 0.5)\",\n 30: \"#f5f5f5\",\n 35: \"#c7d0e1\",\n 40: \"#dde3ee\",\n },\n green: {\n 5: \"#007a52\",\n 10: \"#00472f\",\n 15: \"#f5fffc\",\n },\n orange: {\n 5: \"#d62400\",\n 10: \"#701300\",\n 15: \"#ffeeeb\",\n 20: \"#eb5646\",\n },\n blue: {\n 5: \"#00b9e0\",\n 10: \"#003b47\",\n 15: \"#f5fdff\",\n },\n yellow: {\n 5: \"#ffae0a\",\n 10: \"#704b00\",\n 15: \"#fff8eb\",\n },\n black: {\n 5: \"#222222\",\n },\n white: {\n 5: \"#ffffff\",\n 10: \"#f7f9fc\",\n 15: \"#f5f5f5\",\n 20: \"#f7f9fc\",\n },\n },\n font: {\n base: \"#475161\",\n secondary: \"#647696\",\n tertiary: \"#a9b6cb\",\n quaternary: \"#edf1f7\",\n link: \"#6c5ce7\",\n active: \"#647696\",\n warning: \"#d62400\",\n attention: \"#ffae0a\",\n success: \"#007a52\",\n info: \"#00b9e0\",\n disabled: \"rgba(160, 174, 192, 0.5)\",\n white: \"#ffffff\",\n black: \"#222222\",\n sonicSilver: \"#767676\",\n tarmacGrey: \"#475161\",\n gray900: \"#212121\",\n jetBlack: \"#000000\",\n purpleGray: \"#6e6b86\",\n },\n border: {\n lighter: \"#f5f5f5\",\n light: \"#a9b6cb\",\n base: \"#647696\",\n dark: \"#475161\",\n link: \"#6c5ce7\",\n focus: \"#edf1f7\",\n warning: \"#d62400\",\n success: \"#007a52\",\n },\n bg: {\n lavender: \"#f8f6ff\",\n dolphinGrey: \"#dde3ee\",\n pureWhite: \"#ffffff\",\n milkybarWhite: \"#f7f9fc\",\n hibiscus: \"#ffeeeb\",\n cashew: \"#fff8eb\",\n algae: \"#f5fffc\",\n sky: \"#f5fdff\",\n tulipPurple: \"#f9f8ff\",\n lavenderBlue: \"#fadeff\",\n },\n accent: {\n purple50: \"#b6aef3\",\n mediumOrchid: \"#bd59fa\",\n blueChalk: \"#edebff\",\n paleAqua: \"#bad4fb\",\n pastelBlue: \"#43b7c2\",\n bottleGreen: \"#003a25\",\n aquaDeep: \"#00593b\",\n mint: \"#47b0aa\",\n summerGreen: \"#90bba5\",\n bean: \"#4f0800\",\n rustOrange: \"#ba5800\",\n salmonPink: \"#e57872\",\n crayola: \"#ffce6c\",\n sundown: \"#fdafa3\",\n butterscotch: \"#ffad48\",\n },\n statusAccent: {\n poppy: \"#a31b00\",\n mango: \"#ffae0a\",\n spinach: \"#007a52\",\n aqua: \"#0469e3\",\n maximumBluePurple: \"#ada4f4\",\n },\n} as const\n\n/**\n * Returns a CSS `var()` reference for a color token.\n *\n * @example\n * ```ts\n * colorVar(\"brand-primary-base\") // \"var(--cs-color-brand-primary-base)\"\n * colorVar(\"font-link\") // \"var(--cs-color-font-link)\"\n * ```\n */\nexport function colorVar(name: string): string {\n return `var(--cs-color-${name})`\n}\n","import type { TypographyTokens } from \"./types.js\"\n\n/**\n * Contentstack Venus design system typography tokens.\n * Values sourced from `@contentstack/venus-components` token definitions.\n */\nexport const typography: TypographyTokens = {\n fontFamily: {\n primary: \"Inter, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif\",\n },\n fontSize: {\n tiny: \"0.6875rem\",\n small: \"0.75rem\",\n medium: \"0.8125rem\",\n large: \"0.875rem\",\n xl: \"1rem\",\n \"2xl\": \"1.125rem\",\n \"3xl\": \"1.375rem\",\n \"4xl\": \"1.875rem\",\n \"5xl\": \"2.25rem\",\n \"6xl\": \"2.625rem\",\n },\n fontSizeV2: {\n small: \"0.75rem\",\n medium: \"0.875rem\",\n large: \"1rem\",\n xl: \"1.25rem\",\n \"2xl\": \"1.75rem\",\n \"3xl\": \"2.125rem\",\n },\n fontWeight: {\n regular: 400,\n medium: 500,\n semiBold: 600,\n bold: 700,\n extraBold: 800,\n },\n lineHeight: {\n default: 1.5,\n condensed: 1.25,\n reset: 1,\n },\n letterSpacing: {\n tight: \"0.01em\",\n normal: \"0.02em\",\n },\n} as const\n\n/**\n * Returns a CSS `var()` reference for a typography token.\n *\n * @example\n * ```ts\n * fontVar(\"size-font-large\") // \"var(--cs-size-font-large)\"\n * fontVar(\"font-weight-bold\") // \"var(--cs-font-weight-bold)\"\n * fontVar(\"font-family-primary\") // \"var(--cs-font-family-primary)\"\n * ```\n */\nexport function fontVar(name: string): string {\n return `var(--cs-${name})`\n}\n","import type { SpacingTokens } from \"./types.js\"\n\n/**\n * Contentstack Venus design system spacing tokens.\n * Values sourced from `@contentstack/venus-components` token definitions.\n * Names represent pixel values, values are in rem.\n */\nexport const spacing: SpacingTokens = {\n 2: \"0.125rem\",\n 4: \"0.25rem\",\n 5: \"0.3125rem\",\n 6: \"0.375rem\",\n 8: \"0.5rem\",\n 10: \"0.625rem\",\n 12: \"0.75rem\",\n 14: \"0.875rem\",\n 15: \"0.9375rem\",\n 16: \"1rem\",\n 18: \"1.125rem\",\n 20: \"1.25rem\",\n 22: \"1.375rem\",\n 24: \"1.5rem\",\n 25: \"1.5625rem\",\n 26: \"1.625rem\",\n 28: \"1.75rem\",\n 30: \"1.875rem\",\n 32: \"2rem\",\n 34: \"2.125rem\",\n 35: \"2.1875rem\",\n 36: \"2.25rem\",\n 38: \"2.375rem\",\n 40: \"2.5rem\",\n 50: \"3.125rem\",\n 60: \"3.75rem\",\n 64: \"4rem\",\n 80: \"5rem\",\n 100: \"6.25rem\",\n 120: \"7.5rem\",\n 160: \"10rem\",\n} as const\n\n/**\n * Returns a CSS `var()` reference for a spacing token.\n *\n * @example\n * ```ts\n * spaceVar(16) // \"var(--cs-space-16)\"\n * spaceVar(4) // \"var(--cs-space-4)\"\n * ```\n */\nexport function spaceVar(size: number): string {\n return `var(--cs-space-${size})`\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveEndpoints
|
|
3
|
+
} from "./chunk-BK2IBTQS.mjs";
|
|
4
|
+
|
|
5
|
+
// src/server/proxy/proxy-base.ts
|
|
6
|
+
function jsonErrorResponse(error, status) {
|
|
7
|
+
return new Response(JSON.stringify({ error }), {
|
|
8
|
+
status,
|
|
9
|
+
headers: { "Content-Type": "application/json" }
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function createBaseProxy(config, handleRequest) {
|
|
13
|
+
return async (request) => {
|
|
14
|
+
const token = await config.getAccessToken(request);
|
|
15
|
+
if (!token) {
|
|
16
|
+
return jsonErrorResponse("Unauthorized", 401);
|
|
17
|
+
}
|
|
18
|
+
const url = new URL(request.url);
|
|
19
|
+
const apiPath = url.pathname.replace(config.basePath, "");
|
|
20
|
+
const body = ["GET", "HEAD"].includes(request.method) || request.body === null ? void 0 : await request.arrayBuffer();
|
|
21
|
+
return handleRequest({
|
|
22
|
+
token,
|
|
23
|
+
apiPath,
|
|
24
|
+
search: url.search,
|
|
25
|
+
method: request.method,
|
|
26
|
+
body,
|
|
27
|
+
request
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function forwardRequest(url, method, headers, body, timeout) {
|
|
32
|
+
try {
|
|
33
|
+
const upstream = await fetch(url, {
|
|
34
|
+
method,
|
|
35
|
+
headers,
|
|
36
|
+
body,
|
|
37
|
+
signal: AbortSignal.timeout(timeout)
|
|
38
|
+
});
|
|
39
|
+
return new Response(upstream.body, {
|
|
40
|
+
status: upstream.status,
|
|
41
|
+
headers: {
|
|
42
|
+
"content-type": upstream.headers.get("content-type") ?? "application/json"
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
} catch {
|
|
46
|
+
return jsonErrorResponse("Bad Gateway", 502);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/server/proxy/rate-limiter.ts
|
|
51
|
+
function createRateLimiter(maxRequests, windowMs = 6e4) {
|
|
52
|
+
const windows = /* @__PURE__ */ new Map();
|
|
53
|
+
return {
|
|
54
|
+
/**
|
|
55
|
+
* Check if the request is within rate limits.
|
|
56
|
+
* @returns `true` if the request is allowed, `false` if rate limited.
|
|
57
|
+
*/
|
|
58
|
+
check(key) {
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
const window = windows.get(key);
|
|
61
|
+
for (const [k, w] of windows) {
|
|
62
|
+
if (now - w.windowStart > windowMs) {
|
|
63
|
+
windows.delete(k);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!window || now - window.windowStart > windowMs) {
|
|
67
|
+
windows.set(key, { count: 1, windowStart: now });
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
window.count++;
|
|
71
|
+
return window.count <= maxRequests;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/server/proxy/scope-guard.ts
|
|
77
|
+
var READ_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
|
|
78
|
+
function resolveScope(method, path) {
|
|
79
|
+
const isRead = READ_METHODS.has(method.toUpperCase());
|
|
80
|
+
const suffix = isRead ? ":read" : ":write";
|
|
81
|
+
const segments = path.split("/");
|
|
82
|
+
if (segments.includes("entries")) return `entries${suffix}`;
|
|
83
|
+
if (segments.includes("content_types")) return `content-types${suffix}`;
|
|
84
|
+
if (segments.includes("assets")) return `assets${suffix}`;
|
|
85
|
+
if (segments.includes("environments")) return "environments:read";
|
|
86
|
+
if (segments.includes("locales")) return "locales:read";
|
|
87
|
+
if (segments.includes("releases")) return `releases${suffix}`;
|
|
88
|
+
if (segments.includes("taxonomies")) return `taxonomies${suffix}`;
|
|
89
|
+
if (segments.includes("workflows")) return `workflows${suffix}`;
|
|
90
|
+
if (segments.includes("webhooks")) return `webhooks${suffix}`;
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function checkScope(required, allowed) {
|
|
94
|
+
if (allowed.includes(required)) return null;
|
|
95
|
+
return `Scope "${required}" is not allowed. Allowed scopes: ${allowed.join(", ")}`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/server/proxy/cma-proxy.ts
|
|
99
|
+
function createCMAProxy(config) {
|
|
100
|
+
const endpoints = resolveEndpoints(config.region);
|
|
101
|
+
const cmaBase = `${endpoints.cma}/v3`;
|
|
102
|
+
const timeout = config.timeout ?? 3e4;
|
|
103
|
+
const rateLimiter = config.rateLimit ? createRateLimiter(config.rateLimit) : null;
|
|
104
|
+
return createBaseProxy(
|
|
105
|
+
{
|
|
106
|
+
getAccessToken: config.getAccessToken,
|
|
107
|
+
basePath: config.basePath ?? "/api/cma",
|
|
108
|
+
timeout
|
|
109
|
+
},
|
|
110
|
+
async (ctx) => {
|
|
111
|
+
if (rateLimiter && !rateLimiter.check(ctx.token)) {
|
|
112
|
+
return jsonErrorResponse("Too Many Requests", 429);
|
|
113
|
+
}
|
|
114
|
+
if (config.allowedScopes) {
|
|
115
|
+
const scope = resolveScope(ctx.method, ctx.apiPath);
|
|
116
|
+
if (!scope) {
|
|
117
|
+
if ((config.unmappedScopeBehavior ?? "deny") === "deny") {
|
|
118
|
+
return jsonErrorResponse(
|
|
119
|
+
`No scope mapping found for "${ctx.method} ${ctx.apiPath}". Add a mapping or set unmappedScopeBehavior: "allow".`,
|
|
120
|
+
403
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
const rejection = checkScope(scope, config.allowedScopes);
|
|
125
|
+
if (rejection) {
|
|
126
|
+
return jsonErrorResponse(rejection, 403);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const headers = {
|
|
131
|
+
api_key: config.apiKey,
|
|
132
|
+
authorization: `Bearer ${ctx.token}`
|
|
133
|
+
};
|
|
134
|
+
const contentType = ctx.request.headers.get("content-type");
|
|
135
|
+
if (contentType) {
|
|
136
|
+
headers["content-type"] = contentType;
|
|
137
|
+
}
|
|
138
|
+
return forwardRequest(
|
|
139
|
+
cmaBase + ctx.apiPath + ctx.search,
|
|
140
|
+
ctx.method,
|
|
141
|
+
headers,
|
|
142
|
+
ctx.body,
|
|
143
|
+
timeout
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// src/server/proxy/launch-proxy.ts
|
|
150
|
+
function createLaunchProxy(config) {
|
|
151
|
+
const endpoints = resolveEndpoints(config.region);
|
|
152
|
+
const launchBase = endpoints.launch;
|
|
153
|
+
const timeout = config.timeout ?? 3e4;
|
|
154
|
+
return createBaseProxy(
|
|
155
|
+
{
|
|
156
|
+
getAccessToken: config.getAccessToken,
|
|
157
|
+
basePath: config.basePath ?? "/api/launch",
|
|
158
|
+
timeout
|
|
159
|
+
},
|
|
160
|
+
async (ctx) => {
|
|
161
|
+
const headers = {
|
|
162
|
+
authorization: `Bearer ${ctx.token}`,
|
|
163
|
+
organization_uid: config.organizationUid,
|
|
164
|
+
"content-type": "application/json"
|
|
165
|
+
};
|
|
166
|
+
return forwardRequest(
|
|
167
|
+
launchBase + ctx.apiPath + ctx.search,
|
|
168
|
+
ctx.method,
|
|
169
|
+
headers,
|
|
170
|
+
ctx.body,
|
|
171
|
+
timeout
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// src/server/proxy/brandkit-proxy.ts
|
|
178
|
+
function createBrandKitProxy(config) {
|
|
179
|
+
const endpoints = resolveEndpoints(config.region);
|
|
180
|
+
const brandKitBase = endpoints.brandKit;
|
|
181
|
+
const brandKitAIBase = endpoints.brandKitAI;
|
|
182
|
+
const timeout = config.timeout ?? 3e4;
|
|
183
|
+
return createBaseProxy(
|
|
184
|
+
{
|
|
185
|
+
getAccessToken: config.getAccessToken,
|
|
186
|
+
basePath: config.basePath ?? "/api/brandkit",
|
|
187
|
+
timeout
|
|
188
|
+
},
|
|
189
|
+
async (ctx) => {
|
|
190
|
+
if (config.allowedOperations?.length) {
|
|
191
|
+
const hasManage = config.allowedOperations.includes("manage");
|
|
192
|
+
if (!hasManage && !["GET", "HEAD"].includes(ctx.method)) {
|
|
193
|
+
return jsonErrorResponse("Forbidden: read-only mode", 403);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const headers = {
|
|
197
|
+
authorization: `Bearer ${ctx.token}`,
|
|
198
|
+
organization_uid: config.organizationUid,
|
|
199
|
+
brand_kit_uid: config.brandKitUid,
|
|
200
|
+
"content-type": "application/json"
|
|
201
|
+
};
|
|
202
|
+
const isAIPath = ctx.apiPath.includes("/knowledge-vault") || ctx.apiPath.includes("/generative-ai");
|
|
203
|
+
const baseUrl = isAIPath ? brandKitAIBase : brandKitBase;
|
|
204
|
+
return forwardRequest(
|
|
205
|
+
baseUrl + ctx.apiPath + ctx.search,
|
|
206
|
+
ctx.method,
|
|
207
|
+
headers,
|
|
208
|
+
ctx.body,
|
|
209
|
+
timeout
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export {
|
|
216
|
+
resolveScope,
|
|
217
|
+
checkScope,
|
|
218
|
+
createCMAProxy,
|
|
219
|
+
createLaunchProxy,
|
|
220
|
+
createBrandKitProxy
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=chunk-JYGZBKTH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/proxy/proxy-base.ts","../src/server/proxy/rate-limiter.ts","../src/server/proxy/scope-guard.ts","../src/server/proxy/cma-proxy.ts","../src/server/proxy/launch-proxy.ts","../src/server/proxy/brandkit-proxy.ts"],"sourcesContent":["/**\n * Shared proxy infrastructure for Contentstack API proxies.\n *\n * Both the CMA proxy and Launch proxy build on these helpers to avoid\n * duplicating auth checks, URL parsing, body extraction, and fetch logic.\n */\n\nexport interface BaseProxyConfig {\n getAccessToken: (request: Request) => Promise<string | null>\n basePath: string\n timeout: number\n}\n\nexport interface ProxyRequestContext {\n token: string\n apiPath: string\n search: string\n method: string\n body: ArrayBuffer | undefined\n request: Request\n}\n\n/** Return a JSON error response with the given message and HTTP status. */\nexport function jsonErrorResponse(error: string, status: number): Response {\n return new Response(JSON.stringify({ error }), {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n })\n}\n\n/**\n * Create the shared proxy pipeline: auth check → URL parse → body extract.\n *\n * The `handleRequest` callback receives a validated context and is responsible\n * for building headers, constructing the target URL, and forwarding the request.\n */\nexport function createBaseProxy(\n config: BaseProxyConfig,\n handleRequest: (ctx: ProxyRequestContext) => Promise<Response>,\n): (request: Request) => Promise<Response> {\n return async (request: Request): Promise<Response> => {\n const token = await config.getAccessToken(request)\n if (!token) {\n return jsonErrorResponse(\"Unauthorized\", 401)\n }\n\n const url = new URL(request.url)\n const apiPath = url.pathname.replace(config.basePath, \"\")\n\n const body =\n [\"GET\", \"HEAD\"].includes(request.method) || request.body === null\n ? undefined\n : await request.arrayBuffer()\n\n return handleRequest({\n token,\n apiPath,\n search: url.search,\n method: request.method,\n body,\n request,\n })\n }\n}\n\n/**\n * Forward a request to an upstream API and stream the response back.\n *\n * Returns a 502 \"Bad Gateway\" response on any fetch failure (network error, timeout).\n */\nexport async function forwardRequest(\n url: string,\n method: string,\n headers: Record<string, string>,\n body: ArrayBuffer | undefined,\n timeout: number,\n): Promise<Response> {\n try {\n const upstream = await fetch(url, {\n method,\n headers,\n body,\n signal: AbortSignal.timeout(timeout),\n })\n\n return new Response(upstream.body, {\n status: upstream.status,\n headers: {\n \"content-type\": upstream.headers.get(\"content-type\") ?? \"application/json\",\n },\n })\n } catch {\n return jsonErrorResponse(\"Bad Gateway\", 502)\n }\n}\n","interface RateWindow {\n count: number\n windowStart: number\n}\n\n/**\n * Create a simple in-memory sliding window rate limiter.\n *\n * Each unique key (typically an access token) gets its own counter\n * that resets after the window expires.\n *\n * @param maxRequests - Maximum requests allowed per window\n * @param windowMs - Window duration in milliseconds (default: 60000)\n */\nexport function createRateLimiter(maxRequests: number, windowMs = 60_000) {\n const windows = new Map<string, RateWindow>()\n\n return {\n /**\n * Check if the request is within rate limits.\n * @returns `true` if the request is allowed, `false` if rate limited.\n */\n check(key: string): boolean {\n const now = Date.now()\n const window = windows.get(key)\n\n // Clean stale entries on each check\n for (const [k, w] of windows) {\n if (now - w.windowStart > windowMs) {\n windows.delete(k)\n }\n }\n\n if (!window || now - window.windowStart > windowMs) {\n windows.set(key, { count: 1, windowStart: now })\n return true\n }\n\n window.count++\n return window.count <= maxRequests\n },\n }\n}\n","import type { CMAScope } from \"./types.js\"\n\nconst READ_METHODS = new Set([\"GET\", \"HEAD\"])\n\n/**\n * Resolve the required CMA scope for a given HTTP method and path.\n *\n * Path matching checks for known segments. The order matters:\n * `/entries` is checked before `/content_types` because entry URLs\n * like `/content_types/blog/entries` contain both.\n *\n * @returns The required scope, or `null` if the path is unrecognized.\n */\nexport function resolveScope(method: string, path: string): CMAScope | null {\n const isRead = READ_METHODS.has(method.toUpperCase())\n const suffix = isRead ? \":read\" : \":write\"\n const segments = path.split(\"/\")\n\n if (segments.includes(\"entries\")) return `entries${suffix}` as CMAScope\n if (segments.includes(\"content_types\")) return `content-types${suffix}` as CMAScope\n if (segments.includes(\"assets\")) return `assets${suffix}` as CMAScope\n if (segments.includes(\"environments\")) return \"environments:read\"\n if (segments.includes(\"locales\")) return \"locales:read\"\n if (segments.includes(\"releases\")) return `releases${suffix}` as CMAScope\n if (segments.includes(\"taxonomies\")) return `taxonomies${suffix}` as CMAScope\n if (segments.includes(\"workflows\")) return `workflows${suffix}` as CMAScope\n if (segments.includes(\"webhooks\")) return `webhooks${suffix}` as CMAScope\n\n return null\n}\n\n/**\n * Check whether a required scope is present in the allowed scopes list.\n *\n * @returns An error message if the scope is not allowed, or `null` if permitted.\n */\nexport function checkScope(required: CMAScope, allowed: CMAScope[]): string | null {\n if (allowed.includes(required)) return null\n return `Scope \"${required}\" is not allowed. Allowed scopes: ${allowed.join(\", \")}`\n}\n","import { resolveEndpoints } from \"../../index.js\"\nimport { createBaseProxy, forwardRequest, jsonErrorResponse } from \"./proxy-base.js\"\nimport { createRateLimiter } from \"./rate-limiter.js\"\nimport { checkScope, resolveScope } from \"./scope-guard.js\"\nimport type { CMAProxyConfig } from \"./types.js\"\n\n/**\n * Create a CMA proxy handler that forwards requests to Contentstack.\n *\n * The returned function accepts a standard `Request` and returns a `Response`,\n * making it compatible with Next.js route handlers, Deno/Bun servers, and\n * any framework that uses the Web API Request/Response model.\n *\n * @example\n * ```ts\n * // app/api/cma/[...path]/route.ts\n * const proxy = createCMAProxy({\n * region: \"us\",\n * apiKey: \"your-api-key\",\n * getAccessToken: async (req) => {\n * const session = await auth()\n * return session?.accessToken ?? null\n * },\n * })\n *\n * export const GET = proxy\n * export const POST = proxy\n * export const PUT = proxy\n * export const DELETE = proxy\n * ```\n */\nexport function createCMAProxy(config: CMAProxyConfig): (request: Request) => Promise<Response> {\n const endpoints = resolveEndpoints(config.region)\n const cmaBase = `${endpoints.cma}/v3`\n const timeout = config.timeout ?? 30_000\n const rateLimiter = config.rateLimit ? createRateLimiter(config.rateLimit) : null\n\n return createBaseProxy(\n {\n getAccessToken: config.getAccessToken,\n basePath: config.basePath ?? \"/api/cma\",\n timeout,\n },\n async (ctx) => {\n if (rateLimiter && !rateLimiter.check(ctx.token)) {\n return jsonErrorResponse(\"Too Many Requests\", 429)\n }\n\n if (config.allowedScopes) {\n const scope = resolveScope(ctx.method, ctx.apiPath)\n if (!scope) {\n if ((config.unmappedScopeBehavior ?? \"deny\") === \"deny\") {\n return jsonErrorResponse(\n `No scope mapping found for \"${ctx.method} ${ctx.apiPath}\". Add a mapping or set unmappedScopeBehavior: \"allow\".`,\n 403,\n )\n }\n } else {\n const rejection = checkScope(scope, config.allowedScopes)\n if (rejection) {\n return jsonErrorResponse(rejection, 403)\n }\n }\n }\n\n const headers: Record<string, string> = {\n api_key: config.apiKey,\n authorization: `Bearer ${ctx.token}`,\n }\n const contentType = ctx.request.headers.get(\"content-type\")\n if (contentType) {\n headers[\"content-type\"] = contentType\n }\n\n return forwardRequest(\n cmaBase + ctx.apiPath + ctx.search,\n ctx.method,\n headers,\n ctx.body,\n timeout,\n )\n },\n )\n}\n","import { resolveEndpoints } from \"../../index.js\"\nimport type { ContentstackRegion } from \"../../index.js\"\nimport { createBaseProxy, forwardRequest } from \"./proxy-base.js\"\n\nexport interface LaunchProxyConfig {\n /** Contentstack region */\n region: ContentstackRegion\n /** Organization UID — required for all Launch API calls */\n organizationUid: string\n /** Callback to retrieve the user's access token from the request */\n getAccessToken: (request: Request) => Promise<string | null>\n /** URL prefix to strip when extracting the Launch API path (default: \"/api/launch\") */\n basePath?: string\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\n/**\n * Create a Launch API proxy handler that forwards requests to Contentstack Launch.\n *\n * The returned function accepts a standard `Request` and returns a `Response`,\n * making it compatible with Next.js route handlers, Deno/Bun servers, and\n * any framework that uses the Web API Request/Response model.\n *\n * @example\n * ```ts\n * // app/api/launch/[...path]/route.ts\n * const proxy = createLaunchProxy({\n * region: \"us\",\n * organizationUid: \"org-uid\",\n * getAccessToken: async () => {\n * const session = await auth()\n * return session?.accessToken ?? null\n * },\n * })\n *\n * export const GET = proxy\n * export const POST = proxy\n * export const PUT = proxy\n * export const DELETE = proxy\n * ```\n */\nexport function createLaunchProxy(\n config: LaunchProxyConfig,\n): (request: Request) => Promise<Response> {\n const endpoints = resolveEndpoints(config.region)\n const launchBase = endpoints.launch\n const timeout = config.timeout ?? 30_000\n\n return createBaseProxy(\n {\n getAccessToken: config.getAccessToken,\n basePath: config.basePath ?? \"/api/launch\",\n timeout,\n },\n async (ctx) => {\n const headers: Record<string, string> = {\n authorization: `Bearer ${ctx.token}`,\n organization_uid: config.organizationUid,\n \"content-type\": \"application/json\",\n }\n\n return forwardRequest(\n launchBase + ctx.apiPath + ctx.search,\n ctx.method,\n headers,\n ctx.body,\n timeout,\n )\n },\n )\n}\n","import { resolveEndpoints } from \"../../index.js\"\nimport type { ContentstackRegion } from \"../../index.js\"\nimport { createBaseProxy, forwardRequest, jsonErrorResponse } from \"./proxy-base.js\"\n\nexport interface BrandKitProxyConfig {\n /** Contentstack region */\n region: ContentstackRegion\n /** Organization UID — required for all Brand Kit API calls */\n organizationUid: string\n /** Brand Kit UID — required for all Brand Kit API calls */\n brandKitUid: string\n /** Callback to retrieve the user's access token from the request */\n getAccessToken: (request: Request) => Promise<string | null>\n /** URL prefix to strip when extracting the API path (default: \"/api/brandkit\") */\n basePath?: string\n /** Restrict operations: \"read\" allows GET only, \"manage\" allows all methods */\n allowedOperations?: (\"read\" | \"manage\")[]\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\n/**\n * Create a Brand Kit proxy handler that forwards requests to Contentstack\n * Brand Kit Management, Knowledge Vault, and Generative AI APIs.\n *\n * Routes are determined by path:\n * - Paths containing `/knowledge-vault` or `/generative-ai` → brandKitAI base URL\n * - All other paths (brand kits, voice profiles) → brandKit base URL\n *\n * @example\n * ```ts\n * // app/api/brandkit/[...path]/route.ts\n * const proxy = createBrandKitProxy({\n * region: \"us\",\n * organizationUid: \"org-uid\",\n * brandKitUid: \"bk-uid\",\n * getAccessToken: async () => {\n * const session = await auth()\n * return session?.accessToken ?? null\n * },\n * })\n *\n * export const GET = proxy\n * export const POST = proxy\n * export const PUT = proxy\n * export const DELETE = proxy\n * ```\n */\nexport function createBrandKitProxy(\n config: BrandKitProxyConfig,\n): (request: Request) => Promise<Response> {\n const endpoints = resolveEndpoints(config.region)\n const brandKitBase = endpoints.brandKit\n const brandKitAIBase = endpoints.brandKitAI\n const timeout = config.timeout ?? 30_000\n\n return createBaseProxy(\n {\n getAccessToken: config.getAccessToken,\n basePath: config.basePath ?? \"/api/brandkit\",\n timeout,\n },\n async (ctx) => {\n if (config.allowedOperations?.length) {\n const hasManage = config.allowedOperations.includes(\"manage\")\n if (!hasManage && ![\"GET\", \"HEAD\"].includes(ctx.method)) {\n return jsonErrorResponse(\"Forbidden: read-only mode\", 403)\n }\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${ctx.token}`,\n organization_uid: config.organizationUid,\n brand_kit_uid: config.brandKitUid,\n \"content-type\": \"application/json\",\n }\n\n const isAIPath =\n ctx.apiPath.includes(\"/knowledge-vault\") || ctx.apiPath.includes(\"/generative-ai\")\n const baseUrl = isAIPath ? brandKitAIBase : brandKitBase\n\n return forwardRequest(\n baseUrl + ctx.apiPath + ctx.search,\n ctx.method,\n headers,\n ctx.body,\n timeout,\n )\n },\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// src/cma/pagination.ts
|
|
2
|
+
var DEFAULT_PAGE_SIZE = 25;
|
|
3
|
+
function paginate(fetchPage, options) {
|
|
4
|
+
const pageSize = options?.limit ?? DEFAULT_PAGE_SIZE;
|
|
5
|
+
return {
|
|
6
|
+
[Symbol.asyncIterator]() {
|
|
7
|
+
let skip = 0;
|
|
8
|
+
let done = false;
|
|
9
|
+
let buffer = [];
|
|
10
|
+
let bufferIndex = 0;
|
|
11
|
+
let totalCount;
|
|
12
|
+
return {
|
|
13
|
+
async next() {
|
|
14
|
+
if (bufferIndex < buffer.length) {
|
|
15
|
+
return { value: buffer[bufferIndex++], done: false };
|
|
16
|
+
}
|
|
17
|
+
if (done) {
|
|
18
|
+
return { value: void 0, done: true };
|
|
19
|
+
}
|
|
20
|
+
const page = await fetchPage(skip, pageSize);
|
|
21
|
+
buffer = page.items;
|
|
22
|
+
bufferIndex = 0;
|
|
23
|
+
skip += page.items.length;
|
|
24
|
+
if (typeof page.count === "number") {
|
|
25
|
+
totalCount = page.count;
|
|
26
|
+
}
|
|
27
|
+
if (page.items.length === 0) {
|
|
28
|
+
done = true;
|
|
29
|
+
return { value: void 0, done: true };
|
|
30
|
+
}
|
|
31
|
+
if (typeof totalCount === "number" && skip >= totalCount) {
|
|
32
|
+
done = true;
|
|
33
|
+
}
|
|
34
|
+
return { value: buffer[bufferIndex++], done: false };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function collectAll(iterable) {
|
|
41
|
+
const items = [];
|
|
42
|
+
for await (const item of iterable) {
|
|
43
|
+
items.push(item);
|
|
44
|
+
}
|
|
45
|
+
return items;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
paginate,
|
|
50
|
+
collectAll
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=chunk-JZE2W7VW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cma/pagination.ts"],"sourcesContent":["// @timbenniks/contentstack-platform-sdk — CMA pagination helper\n\nconst DEFAULT_PAGE_SIZE = 25\n\n/**\n * Create an AsyncIterable that lazily paginates through CMA results.\n * Pages are fetched on demand — only when items are consumed.\n */\nexport function paginate<T>(\n fetchPage: (skip: number, limit: number) => Promise<{ items: T[]; count?: number }>,\n options?: { limit?: number },\n): AsyncIterable<T> {\n const pageSize = options?.limit ?? DEFAULT_PAGE_SIZE\n\n return {\n [Symbol.asyncIterator]() {\n let skip = 0\n let done = false\n let buffer: T[] = []\n let bufferIndex = 0\n let totalCount: number | undefined\n\n return {\n async next(): Promise<IteratorResult<T>> {\n if (bufferIndex < buffer.length) {\n return { value: buffer[bufferIndex++] as T, done: false }\n }\n\n if (done) {\n return { value: undefined as unknown as T, done: true }\n }\n\n const page = await fetchPage(skip, pageSize)\n buffer = page.items\n bufferIndex = 0\n skip += page.items.length\n\n if (typeof page.count === \"number\") {\n totalCount = page.count\n }\n\n if (page.items.length === 0) {\n done = true\n return { value: undefined as unknown as T, done: true }\n }\n\n if (typeof totalCount === \"number\" && skip >= totalCount) {\n done = true\n }\n\n return { value: buffer[bufferIndex++] as T, done: false }\n },\n }\n },\n }\n}\n\n/**\n * Collect all items from an AsyncIterable into an array.\n * Replaces the repeated listAll() pattern across sub-clients.\n */\nexport async function collectAll<T>(iterable: AsyncIterable<T>): Promise<T[]> {\n const items: T[] = []\n for await (const item of iterable) {\n items.push(item)\n }\n return items\n}\n"],"mappings":";AAEA,IAAM,oBAAoB;AAMnB,SAAS,SACd,WACA,SACkB;AAClB,QAAM,WAAW,SAAS,SAAS;AAEnC,SAAO;AAAA,IACL,CAAC,OAAO,aAAa,IAAI;AACvB,UAAI,OAAO;AACX,UAAI,OAAO;AACX,UAAI,SAAc,CAAC;AACnB,UAAI,cAAc;AAClB,UAAI;AAEJ,aAAO;AAAA,QACL,MAAM,OAAmC;AACvC,cAAI,cAAc,OAAO,QAAQ;AAC/B,mBAAO,EAAE,OAAO,OAAO,aAAa,GAAQ,MAAM,MAAM;AAAA,UAC1D;AAEA,cAAI,MAAM;AACR,mBAAO,EAAE,OAAO,QAA2B,MAAM,KAAK;AAAA,UACxD;AAEA,gBAAM,OAAO,MAAM,UAAU,MAAM,QAAQ;AAC3C,mBAAS,KAAK;AACd,wBAAc;AACd,kBAAQ,KAAK,MAAM;AAEnB,cAAI,OAAO,KAAK,UAAU,UAAU;AAClC,yBAAa,KAAK;AAAA,UACpB;AAEA,cAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,mBAAO;AACP,mBAAO,EAAE,OAAO,QAA2B,MAAM,KAAK;AAAA,UACxD;AAEA,cAAI,OAAO,eAAe,YAAY,QAAQ,YAAY;AACxD,mBAAO;AAAA,UACT;AAEA,iBAAO,EAAE,OAAO,OAAO,aAAa,GAAQ,MAAM,MAAM;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,eAAsB,WAAc,UAA0C;AAC5E,QAAM,QAAa,CAAC;AACpB,mBAAiB,QAAQ,UAAU;AACjC,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/react/provider/context.ts
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
var ContentstackContext = createContext(null);
|
|
4
|
+
function useContentstackContext() {
|
|
5
|
+
const ctx = useContext(ContentstackContext);
|
|
6
|
+
if (!ctx) {
|
|
7
|
+
throw new Error(
|
|
8
|
+
'useContentstackContext must be used within a <ContentstackProvider>. Wrap your app with <ContentstackProvider region="..." proxyBasePath="/api/cma">.'
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
return ctx;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
ContentstackContext,
|
|
16
|
+
useContentstackContext
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=chunk-K76DKSHJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/provider/context.ts"],"sourcesContent":["\"use client\"\n\nimport { createContext, useContext } from \"react\"\nimport type { ContentstackRegion } from \"../../index.js\"\n\nexport interface ContentstackContextValue {\n region: ContentstackRegion\n proxyBasePath: string\n apiKey?: string\n organizationUid?: string\n brandKitUid?: string\n launchProxyBasePath?: string\n brandKitProxyBasePath?: string\n}\n\nexport const ContentstackContext = createContext<ContentstackContextValue | null>(null)\n\n/**\n * Hook to access the Contentstack context.\n * Throws a clear error if used outside of ContentstackProvider.\n */\nexport function useContentstackContext(): ContentstackContextValue {\n const ctx = useContext(ContentstackContext)\n if (!ctx) {\n throw new Error(\n \"useContentstackContext must be used within a <ContentstackProvider>. \" +\n 'Wrap your app with <ContentstackProvider region=\"...\" proxyBasePath=\"/api/cma\">.',\n )\n }\n return ctx\n}\n"],"mappings":";AAEA,SAAS,eAAe,kBAAkB;AAanC,IAAM,sBAAsB,cAA+C,IAAI;AAM/E,SAAS,yBAAmD;AACjE,QAAM,MAAM,WAAW,mBAAmB;AAC1C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|