@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,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook event type system for Contentstack.
|
|
3
|
+
*
|
|
4
|
+
* The raw payload has `module` and `event` as separate fields.
|
|
5
|
+
* We compute a `type` field as `"${module}.${event}"` for discriminated union dispatch.
|
|
6
|
+
*/
|
|
7
|
+
interface WebhookHandlerConfig {
|
|
8
|
+
secret: string;
|
|
9
|
+
}
|
|
10
|
+
interface BaseWebhookEvent {
|
|
11
|
+
type: string;
|
|
12
|
+
module: string;
|
|
13
|
+
event: string;
|
|
14
|
+
api_key: string;
|
|
15
|
+
data: Record<string, unknown>;
|
|
16
|
+
triggered_at: string;
|
|
17
|
+
}
|
|
18
|
+
interface EntryPublishEvent {
|
|
19
|
+
type: "entry.publish";
|
|
20
|
+
module: "entry";
|
|
21
|
+
event: "publish";
|
|
22
|
+
api_key: string;
|
|
23
|
+
data: {
|
|
24
|
+
entry: {
|
|
25
|
+
uid: string;
|
|
26
|
+
title: string;
|
|
27
|
+
};
|
|
28
|
+
content_type: {
|
|
29
|
+
uid: string;
|
|
30
|
+
};
|
|
31
|
+
environment: {
|
|
32
|
+
name: string;
|
|
33
|
+
};
|
|
34
|
+
locale: string;
|
|
35
|
+
};
|
|
36
|
+
triggered_at: string;
|
|
37
|
+
}
|
|
38
|
+
interface EntryUnpublishEvent {
|
|
39
|
+
type: "entry.unpublish";
|
|
40
|
+
module: "entry";
|
|
41
|
+
event: "unpublish";
|
|
42
|
+
api_key: string;
|
|
43
|
+
data: {
|
|
44
|
+
entry: {
|
|
45
|
+
uid: string;
|
|
46
|
+
title: string;
|
|
47
|
+
};
|
|
48
|
+
content_type: {
|
|
49
|
+
uid: string;
|
|
50
|
+
};
|
|
51
|
+
environment: {
|
|
52
|
+
name: string;
|
|
53
|
+
};
|
|
54
|
+
locale: string;
|
|
55
|
+
};
|
|
56
|
+
triggered_at: string;
|
|
57
|
+
}
|
|
58
|
+
interface EntryUpdateEvent {
|
|
59
|
+
type: "entry.update";
|
|
60
|
+
module: "entry";
|
|
61
|
+
event: "update";
|
|
62
|
+
api_key: string;
|
|
63
|
+
data: {
|
|
64
|
+
entry: {
|
|
65
|
+
uid: string;
|
|
66
|
+
title: string;
|
|
67
|
+
};
|
|
68
|
+
content_type: {
|
|
69
|
+
uid: string;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
triggered_at: string;
|
|
73
|
+
}
|
|
74
|
+
interface EntryCreateEvent {
|
|
75
|
+
type: "entry.create";
|
|
76
|
+
module: "entry";
|
|
77
|
+
event: "create";
|
|
78
|
+
api_key: string;
|
|
79
|
+
data: {
|
|
80
|
+
entry: {
|
|
81
|
+
uid: string;
|
|
82
|
+
title: string;
|
|
83
|
+
};
|
|
84
|
+
content_type: {
|
|
85
|
+
uid: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
triggered_at: string;
|
|
89
|
+
}
|
|
90
|
+
interface EntryDeleteEvent {
|
|
91
|
+
type: "entry.delete";
|
|
92
|
+
module: "entry";
|
|
93
|
+
event: "delete";
|
|
94
|
+
api_key: string;
|
|
95
|
+
data: {
|
|
96
|
+
entry: {
|
|
97
|
+
uid: string;
|
|
98
|
+
};
|
|
99
|
+
content_type: {
|
|
100
|
+
uid: string;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
triggered_at: string;
|
|
104
|
+
}
|
|
105
|
+
interface AssetPublishEvent {
|
|
106
|
+
type: "asset.publish";
|
|
107
|
+
module: "asset";
|
|
108
|
+
event: "publish";
|
|
109
|
+
api_key: string;
|
|
110
|
+
data: {
|
|
111
|
+
asset: {
|
|
112
|
+
uid: string;
|
|
113
|
+
filename: string;
|
|
114
|
+
};
|
|
115
|
+
environment: {
|
|
116
|
+
name: string;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
triggered_at: string;
|
|
120
|
+
}
|
|
121
|
+
interface AssetUnpublishEvent {
|
|
122
|
+
type: "asset.unpublish";
|
|
123
|
+
module: "asset";
|
|
124
|
+
event: "unpublish";
|
|
125
|
+
api_key: string;
|
|
126
|
+
data: {
|
|
127
|
+
asset: {
|
|
128
|
+
uid: string;
|
|
129
|
+
filename: string;
|
|
130
|
+
};
|
|
131
|
+
environment: {
|
|
132
|
+
name: string;
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
triggered_at: string;
|
|
136
|
+
}
|
|
137
|
+
interface AssetDeleteEvent {
|
|
138
|
+
type: "asset.delete";
|
|
139
|
+
module: "asset";
|
|
140
|
+
event: "delete";
|
|
141
|
+
api_key: string;
|
|
142
|
+
data: {
|
|
143
|
+
asset: {
|
|
144
|
+
uid: string;
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
triggered_at: string;
|
|
148
|
+
}
|
|
149
|
+
interface ContentTypeCreateEvent {
|
|
150
|
+
type: "content_type.create";
|
|
151
|
+
module: "content_type";
|
|
152
|
+
event: "create";
|
|
153
|
+
api_key: string;
|
|
154
|
+
data: {
|
|
155
|
+
content_type: {
|
|
156
|
+
uid: string;
|
|
157
|
+
title: string;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
triggered_at: string;
|
|
161
|
+
}
|
|
162
|
+
interface ContentTypeUpdateEvent {
|
|
163
|
+
type: "content_type.update";
|
|
164
|
+
module: "content_type";
|
|
165
|
+
event: "update";
|
|
166
|
+
api_key: string;
|
|
167
|
+
data: {
|
|
168
|
+
content_type: {
|
|
169
|
+
uid: string;
|
|
170
|
+
title: string;
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
triggered_at: string;
|
|
174
|
+
}
|
|
175
|
+
interface ContentTypeDeleteEvent {
|
|
176
|
+
type: "content_type.delete";
|
|
177
|
+
module: "content_type";
|
|
178
|
+
event: "delete";
|
|
179
|
+
api_key: string;
|
|
180
|
+
data: {
|
|
181
|
+
content_type: {
|
|
182
|
+
uid: string;
|
|
183
|
+
title: string;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
triggered_at: string;
|
|
187
|
+
}
|
|
188
|
+
type WebhookEvent = EntryPublishEvent | EntryUnpublishEvent | EntryUpdateEvent | EntryCreateEvent | EntryDeleteEvent | AssetPublishEvent | AssetUnpublishEvent | AssetDeleteEvent | ContentTypeCreateEvent | ContentTypeUpdateEvent | ContentTypeDeleteEvent | BaseWebhookEvent;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Webhook signature verification using HMAC-SHA256.
|
|
192
|
+
* Uses the Web Crypto API for cross-runtime compatibility (Node 18+, Deno, Bun, edge).
|
|
193
|
+
*/
|
|
194
|
+
/**
|
|
195
|
+
* Verify a Contentstack webhook signature using HMAC-SHA256.
|
|
196
|
+
*
|
|
197
|
+
* @param body - The raw request body string
|
|
198
|
+
* @param signature - The hex-encoded signature from the `X-Contentstack-Request-Signature` header
|
|
199
|
+
* @param secret - The webhook secret configured in Contentstack
|
|
200
|
+
* @returns `true` if the signature is valid
|
|
201
|
+
*/
|
|
202
|
+
declare function verifyWebhookSignature(body: string, signature: string, secret: string): Promise<boolean>;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Create a webhook handler with signature verification and typed event parsing.
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* const handler = createWebhookHandler({ secret: process.env.WEBHOOK_SECRET })
|
|
210
|
+
*
|
|
211
|
+
* // In a route handler:
|
|
212
|
+
* const event = await handler.verify(request)
|
|
213
|
+
* if (event.type === "entry.publish") {
|
|
214
|
+
* console.log(event.data.entry.uid)
|
|
215
|
+
* }
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
declare function createWebhookHandler(config: WebhookHandlerConfig): {
|
|
219
|
+
/**
|
|
220
|
+
* Read the request body, verify the signature, and return a typed event.
|
|
221
|
+
* Throws `ContentstackAuthError` if the signature is missing or invalid.
|
|
222
|
+
*/
|
|
223
|
+
verify(request: Request): Promise<WebhookEvent>;
|
|
224
|
+
/**
|
|
225
|
+
* Read the request body and return a typed event without verifying the signature.
|
|
226
|
+
*/
|
|
227
|
+
parse(request: Request): Promise<WebhookEvent>;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export { type AssetDeleteEvent, type AssetPublishEvent, type AssetUnpublishEvent, type BaseWebhookEvent, type ContentTypeCreateEvent, type ContentTypeDeleteEvent, type ContentTypeUpdateEvent, type EntryCreateEvent, type EntryDeleteEvent, type EntryPublishEvent, type EntryUnpublishEvent, type EntryUpdateEvent, type WebhookEvent, type WebhookHandlerConfig, createWebhookHandler, verifyWebhookSignature };
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook event type system for Contentstack.
|
|
3
|
+
*
|
|
4
|
+
* The raw payload has `module` and `event` as separate fields.
|
|
5
|
+
* We compute a `type` field as `"${module}.${event}"` for discriminated union dispatch.
|
|
6
|
+
*/
|
|
7
|
+
interface WebhookHandlerConfig {
|
|
8
|
+
secret: string;
|
|
9
|
+
}
|
|
10
|
+
interface BaseWebhookEvent {
|
|
11
|
+
type: string;
|
|
12
|
+
module: string;
|
|
13
|
+
event: string;
|
|
14
|
+
api_key: string;
|
|
15
|
+
data: Record<string, unknown>;
|
|
16
|
+
triggered_at: string;
|
|
17
|
+
}
|
|
18
|
+
interface EntryPublishEvent {
|
|
19
|
+
type: "entry.publish";
|
|
20
|
+
module: "entry";
|
|
21
|
+
event: "publish";
|
|
22
|
+
api_key: string;
|
|
23
|
+
data: {
|
|
24
|
+
entry: {
|
|
25
|
+
uid: string;
|
|
26
|
+
title: string;
|
|
27
|
+
};
|
|
28
|
+
content_type: {
|
|
29
|
+
uid: string;
|
|
30
|
+
};
|
|
31
|
+
environment: {
|
|
32
|
+
name: string;
|
|
33
|
+
};
|
|
34
|
+
locale: string;
|
|
35
|
+
};
|
|
36
|
+
triggered_at: string;
|
|
37
|
+
}
|
|
38
|
+
interface EntryUnpublishEvent {
|
|
39
|
+
type: "entry.unpublish";
|
|
40
|
+
module: "entry";
|
|
41
|
+
event: "unpublish";
|
|
42
|
+
api_key: string;
|
|
43
|
+
data: {
|
|
44
|
+
entry: {
|
|
45
|
+
uid: string;
|
|
46
|
+
title: string;
|
|
47
|
+
};
|
|
48
|
+
content_type: {
|
|
49
|
+
uid: string;
|
|
50
|
+
};
|
|
51
|
+
environment: {
|
|
52
|
+
name: string;
|
|
53
|
+
};
|
|
54
|
+
locale: string;
|
|
55
|
+
};
|
|
56
|
+
triggered_at: string;
|
|
57
|
+
}
|
|
58
|
+
interface EntryUpdateEvent {
|
|
59
|
+
type: "entry.update";
|
|
60
|
+
module: "entry";
|
|
61
|
+
event: "update";
|
|
62
|
+
api_key: string;
|
|
63
|
+
data: {
|
|
64
|
+
entry: {
|
|
65
|
+
uid: string;
|
|
66
|
+
title: string;
|
|
67
|
+
};
|
|
68
|
+
content_type: {
|
|
69
|
+
uid: string;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
triggered_at: string;
|
|
73
|
+
}
|
|
74
|
+
interface EntryCreateEvent {
|
|
75
|
+
type: "entry.create";
|
|
76
|
+
module: "entry";
|
|
77
|
+
event: "create";
|
|
78
|
+
api_key: string;
|
|
79
|
+
data: {
|
|
80
|
+
entry: {
|
|
81
|
+
uid: string;
|
|
82
|
+
title: string;
|
|
83
|
+
};
|
|
84
|
+
content_type: {
|
|
85
|
+
uid: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
triggered_at: string;
|
|
89
|
+
}
|
|
90
|
+
interface EntryDeleteEvent {
|
|
91
|
+
type: "entry.delete";
|
|
92
|
+
module: "entry";
|
|
93
|
+
event: "delete";
|
|
94
|
+
api_key: string;
|
|
95
|
+
data: {
|
|
96
|
+
entry: {
|
|
97
|
+
uid: string;
|
|
98
|
+
};
|
|
99
|
+
content_type: {
|
|
100
|
+
uid: string;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
triggered_at: string;
|
|
104
|
+
}
|
|
105
|
+
interface AssetPublishEvent {
|
|
106
|
+
type: "asset.publish";
|
|
107
|
+
module: "asset";
|
|
108
|
+
event: "publish";
|
|
109
|
+
api_key: string;
|
|
110
|
+
data: {
|
|
111
|
+
asset: {
|
|
112
|
+
uid: string;
|
|
113
|
+
filename: string;
|
|
114
|
+
};
|
|
115
|
+
environment: {
|
|
116
|
+
name: string;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
triggered_at: string;
|
|
120
|
+
}
|
|
121
|
+
interface AssetUnpublishEvent {
|
|
122
|
+
type: "asset.unpublish";
|
|
123
|
+
module: "asset";
|
|
124
|
+
event: "unpublish";
|
|
125
|
+
api_key: string;
|
|
126
|
+
data: {
|
|
127
|
+
asset: {
|
|
128
|
+
uid: string;
|
|
129
|
+
filename: string;
|
|
130
|
+
};
|
|
131
|
+
environment: {
|
|
132
|
+
name: string;
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
triggered_at: string;
|
|
136
|
+
}
|
|
137
|
+
interface AssetDeleteEvent {
|
|
138
|
+
type: "asset.delete";
|
|
139
|
+
module: "asset";
|
|
140
|
+
event: "delete";
|
|
141
|
+
api_key: string;
|
|
142
|
+
data: {
|
|
143
|
+
asset: {
|
|
144
|
+
uid: string;
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
triggered_at: string;
|
|
148
|
+
}
|
|
149
|
+
interface ContentTypeCreateEvent {
|
|
150
|
+
type: "content_type.create";
|
|
151
|
+
module: "content_type";
|
|
152
|
+
event: "create";
|
|
153
|
+
api_key: string;
|
|
154
|
+
data: {
|
|
155
|
+
content_type: {
|
|
156
|
+
uid: string;
|
|
157
|
+
title: string;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
triggered_at: string;
|
|
161
|
+
}
|
|
162
|
+
interface ContentTypeUpdateEvent {
|
|
163
|
+
type: "content_type.update";
|
|
164
|
+
module: "content_type";
|
|
165
|
+
event: "update";
|
|
166
|
+
api_key: string;
|
|
167
|
+
data: {
|
|
168
|
+
content_type: {
|
|
169
|
+
uid: string;
|
|
170
|
+
title: string;
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
triggered_at: string;
|
|
174
|
+
}
|
|
175
|
+
interface ContentTypeDeleteEvent {
|
|
176
|
+
type: "content_type.delete";
|
|
177
|
+
module: "content_type";
|
|
178
|
+
event: "delete";
|
|
179
|
+
api_key: string;
|
|
180
|
+
data: {
|
|
181
|
+
content_type: {
|
|
182
|
+
uid: string;
|
|
183
|
+
title: string;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
triggered_at: string;
|
|
187
|
+
}
|
|
188
|
+
type WebhookEvent = EntryPublishEvent | EntryUnpublishEvent | EntryUpdateEvent | EntryCreateEvent | EntryDeleteEvent | AssetPublishEvent | AssetUnpublishEvent | AssetDeleteEvent | ContentTypeCreateEvent | ContentTypeUpdateEvent | ContentTypeDeleteEvent | BaseWebhookEvent;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Webhook signature verification using HMAC-SHA256.
|
|
192
|
+
* Uses the Web Crypto API for cross-runtime compatibility (Node 18+, Deno, Bun, edge).
|
|
193
|
+
*/
|
|
194
|
+
/**
|
|
195
|
+
* Verify a Contentstack webhook signature using HMAC-SHA256.
|
|
196
|
+
*
|
|
197
|
+
* @param body - The raw request body string
|
|
198
|
+
* @param signature - The hex-encoded signature from the `X-Contentstack-Request-Signature` header
|
|
199
|
+
* @param secret - The webhook secret configured in Contentstack
|
|
200
|
+
* @returns `true` if the signature is valid
|
|
201
|
+
*/
|
|
202
|
+
declare function verifyWebhookSignature(body: string, signature: string, secret: string): Promise<boolean>;
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Create a webhook handler with signature verification and typed event parsing.
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```ts
|
|
209
|
+
* const handler = createWebhookHandler({ secret: process.env.WEBHOOK_SECRET })
|
|
210
|
+
*
|
|
211
|
+
* // In a route handler:
|
|
212
|
+
* const event = await handler.verify(request)
|
|
213
|
+
* if (event.type === "entry.publish") {
|
|
214
|
+
* console.log(event.data.entry.uid)
|
|
215
|
+
* }
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
declare function createWebhookHandler(config: WebhookHandlerConfig): {
|
|
219
|
+
/**
|
|
220
|
+
* Read the request body, verify the signature, and return a typed event.
|
|
221
|
+
* Throws `ContentstackAuthError` if the signature is missing or invalid.
|
|
222
|
+
*/
|
|
223
|
+
verify(request: Request): Promise<WebhookEvent>;
|
|
224
|
+
/**
|
|
225
|
+
* Read the request body and return a typed event without verifying the signature.
|
|
226
|
+
*/
|
|
227
|
+
parse(request: Request): Promise<WebhookEvent>;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export { type AssetDeleteEvent, type AssetPublishEvent, type AssetUnpublishEvent, type BaseWebhookEvent, type ContentTypeCreateEvent, type ContentTypeDeleteEvent, type ContentTypeUpdateEvent, type EntryCreateEvent, type EntryDeleteEvent, type EntryPublishEvent, type EntryUnpublishEvent, type EntryUpdateEvent, type WebhookEvent, type WebhookHandlerConfig, createWebhookHandler, verifyWebhookSignature };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createWebhookHandler,
|
|
3
|
+
verifyWebhookSignature
|
|
4
|
+
} from "../../chunk-FQP4PB5X.mjs";
|
|
5
|
+
import "../../chunk-7VFGD32I.mjs";
|
|
6
|
+
import "../../chunk-T5A2E2RI.mjs";
|
|
7
|
+
import "../../chunk-VW7DD6HV.mjs";
|
|
8
|
+
import "../../chunk-DJQLN4TR.mjs";
|
|
9
|
+
import "../../chunk-XH7NLHGW.mjs";
|
|
10
|
+
import "../../chunk-AVJHCFRK.mjs";
|
|
11
|
+
import "../../chunk-EREPKWTW.mjs";
|
|
12
|
+
import "../../chunk-GNPQJBFX.mjs";
|
|
13
|
+
import "../../chunk-KLVIROVU.mjs";
|
|
14
|
+
import "../../chunk-JZE2W7VW.mjs";
|
|
15
|
+
import "../../chunk-3KE63N3I.mjs";
|
|
16
|
+
import "../../chunk-4CJ4IVPJ.mjs";
|
|
17
|
+
import "../../chunk-BK2IBTQS.mjs";
|
|
18
|
+
import "../../chunk-DMERADWM.mjs";
|
|
19
|
+
export {
|
|
20
|
+
createWebhookHandler,
|
|
21
|
+
verifyWebhookSignature
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ContentstackRegion } from './regions/index.cjs';
|
|
2
|
+
|
|
3
|
+
interface OAuthConfig {
|
|
4
|
+
region: ContentstackRegion;
|
|
5
|
+
appId: string;
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
scopes: string[];
|
|
9
|
+
redirectUri: string;
|
|
10
|
+
}
|
|
11
|
+
interface OAuthTokens {
|
|
12
|
+
accessToken: string;
|
|
13
|
+
refreshToken: string;
|
|
14
|
+
expiresIn: number;
|
|
15
|
+
tokenType: string;
|
|
16
|
+
}
|
|
17
|
+
interface ContentstackUser {
|
|
18
|
+
uid: string;
|
|
19
|
+
email: string;
|
|
20
|
+
firstName?: string;
|
|
21
|
+
lastName?: string;
|
|
22
|
+
username?: string;
|
|
23
|
+
profileImage?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type { ContentstackUser as C, OAuthConfig as O, OAuthTokens as a };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface RTENode {
|
|
2
|
+
type: string;
|
|
3
|
+
uid: string;
|
|
4
|
+
attrs?: Record<string, unknown>;
|
|
5
|
+
children?: Array<RTENode | RTETextNode>;
|
|
6
|
+
}
|
|
7
|
+
interface RTETextNode {
|
|
8
|
+
text: string;
|
|
9
|
+
bold?: boolean;
|
|
10
|
+
italic?: boolean;
|
|
11
|
+
underline?: boolean;
|
|
12
|
+
strikethrough?: boolean;
|
|
13
|
+
code?: boolean;
|
|
14
|
+
superscript?: boolean;
|
|
15
|
+
subscript?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface RTEDocNode extends RTENode {
|
|
18
|
+
type: "doc";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type { RTEDocNode as R, RTENode as a, RTETextNode as b };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface RTENode {
|
|
2
|
+
type: string;
|
|
3
|
+
uid: string;
|
|
4
|
+
attrs?: Record<string, unknown>;
|
|
5
|
+
children?: Array<RTENode | RTETextNode>;
|
|
6
|
+
}
|
|
7
|
+
interface RTETextNode {
|
|
8
|
+
text: string;
|
|
9
|
+
bold?: boolean;
|
|
10
|
+
italic?: boolean;
|
|
11
|
+
underline?: boolean;
|
|
12
|
+
strikethrough?: boolean;
|
|
13
|
+
code?: boolean;
|
|
14
|
+
superscript?: boolean;
|
|
15
|
+
subscript?: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface RTEDocNode extends RTENode {
|
|
18
|
+
type: "doc";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type { RTEDocNode as R, RTENode as a, RTETextNode as b };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ContentstackRegion } from './regions/index.js';
|
|
2
|
+
|
|
3
|
+
interface OAuthConfig {
|
|
4
|
+
region: ContentstackRegion;
|
|
5
|
+
appId: string;
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
scopes: string[];
|
|
9
|
+
redirectUri: string;
|
|
10
|
+
}
|
|
11
|
+
interface OAuthTokens {
|
|
12
|
+
accessToken: string;
|
|
13
|
+
refreshToken: string;
|
|
14
|
+
expiresIn: number;
|
|
15
|
+
tokenType: string;
|
|
16
|
+
}
|
|
17
|
+
interface ContentstackUser {
|
|
18
|
+
uid: string;
|
|
19
|
+
email: string;
|
|
20
|
+
firstName?: string;
|
|
21
|
+
lastName?: string;
|
|
22
|
+
username?: string;
|
|
23
|
+
profileImage?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type { ContentstackUser as C, OAuthConfig as O, OAuthTokens as a };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface HttpClientConfig {
|
|
2
|
+
/** Base URL for all requests */
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
/** Default headers applied to every request */
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
/** Request timeout in ms (default: 30000) */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
/** Enable automatic retry on 429 and 5xx (default: true) */
|
|
9
|
+
retryOnError?: boolean;
|
|
10
|
+
/** Maximum retry attempts (default: 5) */
|
|
11
|
+
retryLimit?: number;
|
|
12
|
+
/** Initial delay between retries in ms (default: 300) */
|
|
13
|
+
retryDelay?: number;
|
|
14
|
+
/** Custom fetch implementation (for testing) */
|
|
15
|
+
fetch?: typeof globalThis.fetch;
|
|
16
|
+
}
|
|
17
|
+
interface HttpResponse<T> {
|
|
18
|
+
data: T;
|
|
19
|
+
status: number;
|
|
20
|
+
headers: Headers;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type { HttpClientConfig as H, HttpResponse as a };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface HttpClientConfig {
|
|
2
|
+
/** Base URL for all requests */
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
/** Default headers applied to every request */
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
/** Request timeout in ms (default: 30000) */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
/** Enable automatic retry on 429 and 5xx (default: true) */
|
|
9
|
+
retryOnError?: boolean;
|
|
10
|
+
/** Maximum retry attempts (default: 5) */
|
|
11
|
+
retryLimit?: number;
|
|
12
|
+
/** Initial delay between retries in ms (default: 300) */
|
|
13
|
+
retryDelay?: number;
|
|
14
|
+
/** Custom fetch implementation (for testing) */
|
|
15
|
+
fetch?: typeof globalThis.fetch;
|
|
16
|
+
}
|
|
17
|
+
interface HttpResponse<T> {
|
|
18
|
+
data: T;
|
|
19
|
+
status: number;
|
|
20
|
+
headers: Headers;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type { HttpClientConfig as H, HttpResponse as a };
|