@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.
Files changed (244) hide show
  1. package/dist/auth/index.cjs +607 -0
  2. package/dist/auth/index.cjs.map +1 -0
  3. package/dist/auth/index.d.cts +108 -0
  4. package/dist/auth/index.d.ts +108 -0
  5. package/dist/auth/index.mjs +25 -0
  6. package/dist/auth/index.mjs.map +1 -0
  7. package/dist/brandkit/index.cjs +525 -0
  8. package/dist/brandkit/index.cjs.map +1 -0
  9. package/dist/brandkit/index.d.cts +95 -0
  10. package/dist/brandkit/index.d.ts +95 -0
  11. package/dist/brandkit/index.mjs +11 -0
  12. package/dist/brandkit/index.mjs.map +1 -0
  13. package/dist/chunk-3C6J2BDB.mjs +84 -0
  14. package/dist/chunk-3C6J2BDB.mjs.map +1 -0
  15. package/dist/chunk-3KE63N3I.mjs +64 -0
  16. package/dist/chunk-3KE63N3I.mjs.map +1 -0
  17. package/dist/chunk-4CJ4IVPJ.mjs +212 -0
  18. package/dist/chunk-4CJ4IVPJ.mjs.map +1 -0
  19. package/dist/chunk-4JFUI7MJ.mjs +368 -0
  20. package/dist/chunk-4JFUI7MJ.mjs.map +1 -0
  21. package/dist/chunk-7VFGD32I.mjs +26 -0
  22. package/dist/chunk-7VFGD32I.mjs.map +1 -0
  23. package/dist/chunk-ARPJDW3A.mjs +44 -0
  24. package/dist/chunk-ARPJDW3A.mjs.map +1 -0
  25. package/dist/chunk-AVJHCFRK.mjs +52 -0
  26. package/dist/chunk-AVJHCFRK.mjs.map +1 -0
  27. package/dist/chunk-BK2IBTQS.mjs +131 -0
  28. package/dist/chunk-BK2IBTQS.mjs.map +1 -0
  29. package/dist/chunk-BUZ6CQHE.mjs +75 -0
  30. package/dist/chunk-BUZ6CQHE.mjs.map +1 -0
  31. package/dist/chunk-CKMAOWBQ.mjs +379 -0
  32. package/dist/chunk-CKMAOWBQ.mjs.map +1 -0
  33. package/dist/chunk-DJQLN4TR.mjs +1 -0
  34. package/dist/chunk-DJQLN4TR.mjs.map +1 -0
  35. package/dist/chunk-DMERADWM.mjs +67 -0
  36. package/dist/chunk-DMERADWM.mjs.map +1 -0
  37. package/dist/chunk-EREPKWTW.mjs +926 -0
  38. package/dist/chunk-EREPKWTW.mjs.map +1 -0
  39. package/dist/chunk-FQP4PB5X.mjs +88 -0
  40. package/dist/chunk-FQP4PB5X.mjs.map +1 -0
  41. package/dist/chunk-GNPQJBFX.mjs +144 -0
  42. package/dist/chunk-GNPQJBFX.mjs.map +1 -0
  43. package/dist/chunk-GOSB24M6.mjs +87 -0
  44. package/dist/chunk-GOSB24M6.mjs.map +1 -0
  45. package/dist/chunk-JL2E3EOT.mjs +255 -0
  46. package/dist/chunk-JL2E3EOT.mjs.map +1 -0
  47. package/dist/chunk-JYGZBKTH.mjs +222 -0
  48. package/dist/chunk-JYGZBKTH.mjs.map +1 -0
  49. package/dist/chunk-JZE2W7VW.mjs +52 -0
  50. package/dist/chunk-JZE2W7VW.mjs.map +1 -0
  51. package/dist/chunk-K76DKSHJ.mjs +18 -0
  52. package/dist/chunk-K76DKSHJ.mjs.map +1 -0
  53. package/dist/chunk-KLVIROVU.mjs +232 -0
  54. package/dist/chunk-KLVIROVU.mjs.map +1 -0
  55. package/dist/chunk-LPVVA5J3.mjs +18 -0
  56. package/dist/chunk-LPVVA5J3.mjs.map +1 -0
  57. package/dist/chunk-NKLOZ5VI.mjs +112 -0
  58. package/dist/chunk-NKLOZ5VI.mjs.map +1 -0
  59. package/dist/chunk-QGA4WBDC.mjs +7 -0
  60. package/dist/chunk-QGA4WBDC.mjs.map +1 -0
  61. package/dist/chunk-QW7TVYOA.mjs +56 -0
  62. package/dist/chunk-QW7TVYOA.mjs.map +1 -0
  63. package/dist/chunk-SU5QEKYW.mjs +83 -0
  64. package/dist/chunk-SU5QEKYW.mjs.map +1 -0
  65. package/dist/chunk-T5A2E2RI.mjs +654 -0
  66. package/dist/chunk-T5A2E2RI.mjs.map +1 -0
  67. package/dist/chunk-T5OIJQK7.mjs +116 -0
  68. package/dist/chunk-T5OIJQK7.mjs.map +1 -0
  69. package/dist/chunk-VW7DD6HV.mjs +253 -0
  70. package/dist/chunk-VW7DD6HV.mjs.map +1 -0
  71. package/dist/chunk-XH7NLHGW.mjs +133 -0
  72. package/dist/chunk-XH7NLHGW.mjs.map +1 -0
  73. package/dist/client-DJ5haQGd.d.cts +22 -0
  74. package/dist/client-DwVGVSQz.d.ts +22 -0
  75. package/dist/cma/index.cjs +1349 -0
  76. package/dist/cma/index.cjs.map +1 -0
  77. package/dist/cma/index.d.cts +22 -0
  78. package/dist/cma/index.d.ts +22 -0
  79. package/dist/cma/index.mjs +70 -0
  80. package/dist/cma/index.mjs.map +1 -0
  81. package/dist/errors-CAw-IRCP.d.cts +65 -0
  82. package/dist/errors-CAw-IRCP.d.ts +65 -0
  83. package/dist/generative-ai/index.cjs +401 -0
  84. package/dist/generative-ai/index.cjs.map +1 -0
  85. package/dist/generative-ai/index.d.cts +31 -0
  86. package/dist/generative-ai/index.d.ts +31 -0
  87. package/dist/generative-ai/index.mjs +10 -0
  88. package/dist/generative-ai/index.mjs.map +1 -0
  89. package/dist/images/index.cjs +185 -0
  90. package/dist/images/index.cjs.map +1 -0
  91. package/dist/images/index.d.cts +27 -0
  92. package/dist/images/index.d.ts +27 -0
  93. package/dist/images/index.mjs +8 -0
  94. package/dist/images/index.mjs.map +1 -0
  95. package/dist/index.cjs +2909 -0
  96. package/dist/index.cjs.map +1 -0
  97. package/dist/index.d.cts +30 -0
  98. package/dist/index.d.ts +30 -0
  99. package/dist/index.mjs +153 -0
  100. package/dist/index.mjs.map +1 -0
  101. package/dist/knowledge-vault/index.cjs +413 -0
  102. package/dist/knowledge-vault/index.cjs.map +1 -0
  103. package/dist/knowledge-vault/index.d.cts +49 -0
  104. package/dist/knowledge-vault/index.d.ts +49 -0
  105. package/dist/knowledge-vault/index.mjs +10 -0
  106. package/dist/knowledge-vault/index.mjs.map +1 -0
  107. package/dist/launch/index.cjs +624 -0
  108. package/dist/launch/index.cjs.map +1 -0
  109. package/dist/launch/index.d.cts +169 -0
  110. package/dist/launch/index.d.ts +169 -0
  111. package/dist/launch/index.mjs +11 -0
  112. package/dist/launch/index.mjs.map +1 -0
  113. package/dist/react/auth/index.cjs +113 -0
  114. package/dist/react/auth/index.cjs.map +1 -0
  115. package/dist/react/auth/index.d.cts +33 -0
  116. package/dist/react/auth/index.d.ts +33 -0
  117. package/dist/react/auth/index.mjs +13 -0
  118. package/dist/react/auth/index.mjs.map +1 -0
  119. package/dist/react/content/index.cjs +113 -0
  120. package/dist/react/content/index.cjs.map +1 -0
  121. package/dist/react/content/index.d.cts +25 -0
  122. package/dist/react/content/index.d.ts +25 -0
  123. package/dist/react/content/index.mjs +7 -0
  124. package/dist/react/content/index.mjs.map +1 -0
  125. package/dist/react/hooks/index.cjs +2097 -0
  126. package/dist/react/hooks/index.cjs.map +1 -0
  127. package/dist/react/hooks/index.d.cts +77 -0
  128. package/dist/react/hooks/index.d.ts +77 -0
  129. package/dist/react/hooks/index.mjs +46 -0
  130. package/dist/react/hooks/index.mjs.map +1 -0
  131. package/dist/react/index.cjs +2307 -0
  132. package/dist/react/index.cjs.map +1 -0
  133. package/dist/react/index.d.cts +16 -0
  134. package/dist/react/index.d.ts +16 -0
  135. package/dist/react/index.mjs +67 -0
  136. package/dist/react/index.mjs.map +1 -0
  137. package/dist/react/provider/index.cjs +83 -0
  138. package/dist/react/provider/index.cjs.map +1 -0
  139. package/dist/react/provider/index.d.cts +30 -0
  140. package/dist/react/provider/index.d.ts +30 -0
  141. package/dist/react/provider/index.mjs +11 -0
  142. package/dist/react/provider/index.mjs.map +1 -0
  143. package/dist/regions/index.cjs +171 -0
  144. package/dist/regions/index.cjs.map +1 -0
  145. package/dist/regions/index.d.cts +55 -0
  146. package/dist/regions/index.d.ts +55 -0
  147. package/dist/regions/index.mjs +13 -0
  148. package/dist/regions/index.mjs.map +1 -0
  149. package/dist/request-builders-BxeolQIw.d.ts +735 -0
  150. package/dist/request-builders-C2IG1LUo.d.cts +735 -0
  151. package/dist/rte/index.cjs +683 -0
  152. package/dist/rte/index.cjs.map +1 -0
  153. package/dist/rte/index.d.cts +33 -0
  154. package/dist/rte/index.d.ts +33 -0
  155. package/dist/rte/index.mjs +17 -0
  156. package/dist/rte/index.mjs.map +1 -0
  157. package/dist/server/index.cjs +917 -0
  158. package/dist/server/index.cjs.map +1 -0
  159. package/dist/server/index.d.cts +6 -0
  160. package/dist/server/index.d.ts +6 -0
  161. package/dist/server/index.mjs +45 -0
  162. package/dist/server/index.mjs.map +1 -0
  163. package/dist/server/middleware/index.cjs +614 -0
  164. package/dist/server/middleware/index.cjs.map +1 -0
  165. package/dist/server/middleware/index.d.cts +77 -0
  166. package/dist/server/middleware/index.d.ts +77 -0
  167. package/dist/server/middleware/index.mjs +27 -0
  168. package/dist/server/middleware/index.mjs.map +1 -0
  169. package/dist/server/proxy/index.cjs +329 -0
  170. package/dist/server/proxy/index.cjs.map +1 -0
  171. package/dist/server/proxy/index.d.cts +143 -0
  172. package/dist/server/proxy/index.d.ts +143 -0
  173. package/dist/server/proxy/index.mjs +29 -0
  174. package/dist/server/proxy/index.mjs.map +1 -0
  175. package/dist/server/webhooks/index.cjs +131 -0
  176. package/dist/server/webhooks/index.cjs.map +1 -0
  177. package/dist/server/webhooks/index.d.cts +230 -0
  178. package/dist/server/webhooks/index.d.ts +230 -0
  179. package/dist/server/webhooks/index.mjs +23 -0
  180. package/dist/server/webhooks/index.mjs.map +1 -0
  181. package/dist/types-6D9VR7pT.d.cts +26 -0
  182. package/dist/types-AelT0rFJ.d.cts +21 -0
  183. package/dist/types-AelT0rFJ.d.ts +21 -0
  184. package/dist/types-Bu5yCgmw.d.ts +26 -0
  185. package/dist/types-DgixK-ll.d.cts +23 -0
  186. package/dist/types-DgixK-ll.d.ts +23 -0
  187. package/dist/types-DrMwdlH9.d.cts +245 -0
  188. package/dist/types-DrMwdlH9.d.ts +245 -0
  189. package/dist/ui/css/index.cjs +31 -0
  190. package/dist/ui/css/index.cjs.map +1 -0
  191. package/dist/ui/css/index.d.cts +15 -0
  192. package/dist/ui/css/index.d.ts +15 -0
  193. package/dist/ui/css/index.mjs +7 -0
  194. package/dist/ui/css/index.mjs.map +1 -0
  195. package/dist/ui/index.cjs +368 -0
  196. package/dist/ui/index.cjs.map +1 -0
  197. package/dist/ui/index.d.cts +4 -0
  198. package/dist/ui/index.d.ts +4 -0
  199. package/dist/ui/index.mjs +33 -0
  200. package/dist/ui/index.mjs.map +1 -0
  201. package/dist/ui/theme/index.cjs +105 -0
  202. package/dist/ui/theme/index.cjs.map +1 -0
  203. package/dist/ui/theme/index.d.cts +33 -0
  204. package/dist/ui/theme/index.d.ts +33 -0
  205. package/dist/ui/theme/index.mjs +15 -0
  206. package/dist/ui/theme/index.mjs.map +1 -0
  207. package/dist/ui/tokens/index.cjs +286 -0
  208. package/dist/ui/tokens/index.cjs.map +1 -0
  209. package/dist/ui/tokens/index.d.cts +54 -0
  210. package/dist/ui/tokens/index.d.ts +54 -0
  211. package/dist/ui/tokens/index.mjs +17 -0
  212. package/dist/ui/tokens/index.mjs.map +1 -0
  213. package/dist/ui/tokens.css +408 -0
  214. package/dist/vue/auth/index.cjs +141 -0
  215. package/dist/vue/auth/index.cjs.map +1 -0
  216. package/dist/vue/auth/index.d.cts +78 -0
  217. package/dist/vue/auth/index.d.ts +78 -0
  218. package/dist/vue/auth/index.mjs +13 -0
  219. package/dist/vue/auth/index.mjs.map +1 -0
  220. package/dist/vue/composables/index.cjs +2108 -0
  221. package/dist/vue/composables/index.cjs.map +1 -0
  222. package/dist/vue/composables/index.d.cts +78 -0
  223. package/dist/vue/composables/index.d.ts +78 -0
  224. package/dist/vue/composables/index.mjs +46 -0
  225. package/dist/vue/composables/index.mjs.map +1 -0
  226. package/dist/vue/content/index.cjs +142 -0
  227. package/dist/vue/content/index.cjs.map +1 -0
  228. package/dist/vue/content/index.d.cts +47 -0
  229. package/dist/vue/content/index.d.ts +47 -0
  230. package/dist/vue/content/index.mjs +7 -0
  231. package/dist/vue/content/index.mjs.map +1 -0
  232. package/dist/vue/index.cjs +2389 -0
  233. package/dist/vue/index.cjs.map +1 -0
  234. package/dist/vue/index.d.cts +16 -0
  235. package/dist/vue/index.d.ts +16 -0
  236. package/dist/vue/index.mjs +69 -0
  237. package/dist/vue/index.mjs.map +1 -0
  238. package/dist/vue/provider/index.cjs +97 -0
  239. package/dist/vue/provider/index.cjs.map +1 -0
  240. package/dist/vue/provider/index.d.cts +90 -0
  241. package/dist/vue/provider/index.d.ts +90 -0
  242. package/dist/vue/provider/index.mjs +13 -0
  243. package/dist/vue/provider/index.mjs.map +1 -0
  244. package/package.json +195 -0
@@ -0,0 +1,95 @@
1
+ import { H as HttpClientConfig } from '../types-DgixK-ll.cjs';
2
+ import { ContentstackRegion } from '../regions/index.cjs';
3
+ import { C as ContentstackHttpClient } from '../client-DJ5haQGd.cjs';
4
+
5
+ interface BrandKit {
6
+ uid: string;
7
+ name: string;
8
+ description?: string;
9
+ created_at: string;
10
+ updated_at: string;
11
+ }
12
+ interface VoiceProfileSettings {
13
+ formality: number;
14
+ tone: number;
15
+ humor: number;
16
+ complexity: number;
17
+ }
18
+ interface VoiceProfile {
19
+ uid: string;
20
+ name: string;
21
+ description?: string;
22
+ settings: VoiceProfileSettings;
23
+ sample_content?: string;
24
+ insights?: string;
25
+ created_at: string;
26
+ updated_at: string;
27
+ }
28
+ interface CreateBrandKitData {
29
+ name: string;
30
+ description?: string;
31
+ }
32
+ interface UpdateBrandKitData {
33
+ name?: string;
34
+ description?: string;
35
+ }
36
+ interface CreateVoiceProfileData {
37
+ name: string;
38
+ description?: string;
39
+ settings: VoiceProfileSettings;
40
+ sample_content?: string;
41
+ }
42
+ interface UpdateVoiceProfileData {
43
+ name?: string;
44
+ description?: string;
45
+ settings?: VoiceProfileSettings;
46
+ sample_content?: string;
47
+ }
48
+ interface ListBrandKitsOptions {
49
+ limit?: number;
50
+ }
51
+ interface ListVoiceProfilesOptions {
52
+ limit?: number;
53
+ }
54
+
55
+ declare class BrandKitsSubClient {
56
+ private readonly http;
57
+ constructor(http: ContentstackHttpClient);
58
+ list(options?: ListBrandKitsOptions): AsyncIterable<BrandKit>;
59
+ listAll(options?: ListBrandKitsOptions): Promise<BrandKit[]>;
60
+ get(brandKitUid: string): Promise<BrandKit>;
61
+ create(data: CreateBrandKitData): Promise<BrandKit>;
62
+ update(brandKitUid: string, data: UpdateBrandKitData): Promise<BrandKit>;
63
+ delete(brandKitUid: string): Promise<void>;
64
+ }
65
+
66
+ declare class VoiceProfilesSubClient {
67
+ private readonly http;
68
+ constructor(http: ContentstackHttpClient);
69
+ list(brandKitUid: string, options?: ListVoiceProfilesOptions): AsyncIterable<VoiceProfile>;
70
+ listAll(brandKitUid: string, options?: ListVoiceProfilesOptions): Promise<VoiceProfile[]>;
71
+ get(brandKitUid: string, voiceProfileUid: string): Promise<VoiceProfile>;
72
+ create(brandKitUid: string, data: CreateVoiceProfileData): Promise<VoiceProfile>;
73
+ update(brandKitUid: string, voiceProfileUid: string, data: UpdateVoiceProfileData): Promise<VoiceProfile>;
74
+ delete(brandKitUid: string, voiceProfileUid: string): Promise<void>;
75
+ }
76
+
77
+ interface BrandKitClientConfig {
78
+ region: ContentstackRegion;
79
+ organizationUid: string;
80
+ auth: {
81
+ type: "oauth";
82
+ accessToken: string;
83
+ } | {
84
+ type: "authtoken";
85
+ token: string;
86
+ };
87
+ httpOptions?: Partial<HttpClientConfig>;
88
+ }
89
+ interface BrandKitClient {
90
+ brandKits: BrandKitsSubClient;
91
+ voiceProfiles: VoiceProfilesSubClient;
92
+ }
93
+ declare function createBrandKitClient(config: BrandKitClientConfig): BrandKitClient;
94
+
95
+ export { type BrandKit, type BrandKitClient, type BrandKitClientConfig, type CreateBrandKitData, type CreateVoiceProfileData, type ListBrandKitsOptions, type ListVoiceProfilesOptions, type UpdateBrandKitData, type UpdateVoiceProfileData, type VoiceProfile, type VoiceProfileSettings, createBrandKitClient };
@@ -0,0 +1,95 @@
1
+ import { H as HttpClientConfig } from '../types-DgixK-ll.js';
2
+ import { ContentstackRegion } from '../regions/index.js';
3
+ import { C as ContentstackHttpClient } from '../client-DwVGVSQz.js';
4
+
5
+ interface BrandKit {
6
+ uid: string;
7
+ name: string;
8
+ description?: string;
9
+ created_at: string;
10
+ updated_at: string;
11
+ }
12
+ interface VoiceProfileSettings {
13
+ formality: number;
14
+ tone: number;
15
+ humor: number;
16
+ complexity: number;
17
+ }
18
+ interface VoiceProfile {
19
+ uid: string;
20
+ name: string;
21
+ description?: string;
22
+ settings: VoiceProfileSettings;
23
+ sample_content?: string;
24
+ insights?: string;
25
+ created_at: string;
26
+ updated_at: string;
27
+ }
28
+ interface CreateBrandKitData {
29
+ name: string;
30
+ description?: string;
31
+ }
32
+ interface UpdateBrandKitData {
33
+ name?: string;
34
+ description?: string;
35
+ }
36
+ interface CreateVoiceProfileData {
37
+ name: string;
38
+ description?: string;
39
+ settings: VoiceProfileSettings;
40
+ sample_content?: string;
41
+ }
42
+ interface UpdateVoiceProfileData {
43
+ name?: string;
44
+ description?: string;
45
+ settings?: VoiceProfileSettings;
46
+ sample_content?: string;
47
+ }
48
+ interface ListBrandKitsOptions {
49
+ limit?: number;
50
+ }
51
+ interface ListVoiceProfilesOptions {
52
+ limit?: number;
53
+ }
54
+
55
+ declare class BrandKitsSubClient {
56
+ private readonly http;
57
+ constructor(http: ContentstackHttpClient);
58
+ list(options?: ListBrandKitsOptions): AsyncIterable<BrandKit>;
59
+ listAll(options?: ListBrandKitsOptions): Promise<BrandKit[]>;
60
+ get(brandKitUid: string): Promise<BrandKit>;
61
+ create(data: CreateBrandKitData): Promise<BrandKit>;
62
+ update(brandKitUid: string, data: UpdateBrandKitData): Promise<BrandKit>;
63
+ delete(brandKitUid: string): Promise<void>;
64
+ }
65
+
66
+ declare class VoiceProfilesSubClient {
67
+ private readonly http;
68
+ constructor(http: ContentstackHttpClient);
69
+ list(brandKitUid: string, options?: ListVoiceProfilesOptions): AsyncIterable<VoiceProfile>;
70
+ listAll(brandKitUid: string, options?: ListVoiceProfilesOptions): Promise<VoiceProfile[]>;
71
+ get(brandKitUid: string, voiceProfileUid: string): Promise<VoiceProfile>;
72
+ create(brandKitUid: string, data: CreateVoiceProfileData): Promise<VoiceProfile>;
73
+ update(brandKitUid: string, voiceProfileUid: string, data: UpdateVoiceProfileData): Promise<VoiceProfile>;
74
+ delete(brandKitUid: string, voiceProfileUid: string): Promise<void>;
75
+ }
76
+
77
+ interface BrandKitClientConfig {
78
+ region: ContentstackRegion;
79
+ organizationUid: string;
80
+ auth: {
81
+ type: "oauth";
82
+ accessToken: string;
83
+ } | {
84
+ type: "authtoken";
85
+ token: string;
86
+ };
87
+ httpOptions?: Partial<HttpClientConfig>;
88
+ }
89
+ interface BrandKitClient {
90
+ brandKits: BrandKitsSubClient;
91
+ voiceProfiles: VoiceProfilesSubClient;
92
+ }
93
+ declare function createBrandKitClient(config: BrandKitClientConfig): BrandKitClient;
94
+
95
+ export { type BrandKit, type BrandKitClient, type BrandKitClientConfig, type CreateBrandKitData, type CreateVoiceProfileData, type ListBrandKitsOptions, type ListVoiceProfilesOptions, type UpdateBrandKitData, type UpdateVoiceProfileData, type VoiceProfile, type VoiceProfileSettings, createBrandKitClient };
@@ -0,0 +1,11 @@
1
+ import {
2
+ createBrandKitClient
3
+ } from "../chunk-XH7NLHGW.mjs";
4
+ import "../chunk-JZE2W7VW.mjs";
5
+ import "../chunk-4CJ4IVPJ.mjs";
6
+ import "../chunk-BK2IBTQS.mjs";
7
+ import "../chunk-DMERADWM.mjs";
8
+ export {
9
+ createBrandKitClient
10
+ };
11
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,84 @@
1
+ // src/react/auth/useContentstackUser.ts
2
+ import { useCallback, useEffect, useState } from "react";
3
+ function useContentstackUser() {
4
+ const [user, setUser] = useState(null);
5
+ const [loading, setLoading] = useState(true);
6
+ const fetchSession = useCallback(async () => {
7
+ setLoading(true);
8
+ try {
9
+ const res = await fetch("/api/auth/session");
10
+ if (!res.ok) {
11
+ setUser(null);
12
+ return;
13
+ }
14
+ const data = await res.json();
15
+ if (data?.user) {
16
+ setUser({
17
+ uid: data.user.uid ?? data.user.id ?? "",
18
+ email: data.user.email ?? "",
19
+ firstName: data.user.firstName ?? data.user.name?.split(" ")[0],
20
+ lastName: data.user.lastName ?? data.user.name?.split(" ").slice(1).join(" "),
21
+ username: data.user.username,
22
+ profileImage: data.user.profileImage ?? data.user.image
23
+ });
24
+ } else {
25
+ setUser(null);
26
+ }
27
+ } catch {
28
+ setUser(null);
29
+ } finally {
30
+ setLoading(false);
31
+ }
32
+ }, []);
33
+ useEffect(() => {
34
+ fetchSession();
35
+ }, [fetchSession]);
36
+ return { user, loading, isAuthenticated: user !== null };
37
+ }
38
+
39
+ // src/react/auth/ContentstackLoginButton.tsx
40
+ import { jsx, jsxs } from "react/jsx-runtime";
41
+ function ContentstackLoginButton({
42
+ redirectTo,
43
+ className,
44
+ children = "Sign in with Contentstack"
45
+ }) {
46
+ return /* @__PURE__ */ jsxs("form", { action: "/api/auth/signin/contentstack", method: "POST", children: [
47
+ redirectTo && /* @__PURE__ */ jsx("input", { type: "hidden", name: "callbackUrl", value: redirectTo }),
48
+ /* @__PURE__ */ jsx("button", { type: "submit", className, children })
49
+ ] });
50
+ }
51
+
52
+ // src/react/auth/ContentstackLogoutButton.tsx
53
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
54
+ function ContentstackLogoutButton({
55
+ redirectTo,
56
+ className,
57
+ children = "Sign out"
58
+ }) {
59
+ return /* @__PURE__ */ jsxs2("form", { action: "/api/auth/signout", method: "POST", children: [
60
+ redirectTo && /* @__PURE__ */ jsx2("input", { type: "hidden", name: "callbackUrl", value: redirectTo }),
61
+ /* @__PURE__ */ jsx2("button", { type: "submit", className, children })
62
+ ] });
63
+ }
64
+
65
+ // src/react/auth/ContentstackAuthGuard.tsx
66
+ import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
67
+ function ContentstackAuthGuard({
68
+ children,
69
+ fallback,
70
+ loadingFallback = null
71
+ }) {
72
+ const { isAuthenticated, loading } = useContentstackUser();
73
+ if (loading) return /* @__PURE__ */ jsx3(Fragment, { children: loadingFallback });
74
+ if (isAuthenticated) return /* @__PURE__ */ jsx3(Fragment, { children });
75
+ return /* @__PURE__ */ jsx3(Fragment, { children: fallback ?? /* @__PURE__ */ jsx3(ContentstackLoginButton, {}) });
76
+ }
77
+
78
+ export {
79
+ useContentstackUser,
80
+ ContentstackLoginButton,
81
+ ContentstackLogoutButton,
82
+ ContentstackAuthGuard
83
+ };
84
+ //# sourceMappingURL=chunk-3C6J2BDB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/auth/useContentstackUser.ts","../src/react/auth/ContentstackLoginButton.tsx","../src/react/auth/ContentstackLogoutButton.tsx","../src/react/auth/ContentstackAuthGuard.tsx"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport type { ContentstackUser } from \"../../index.js\"\n\nexport interface UseContentstackUserReturn {\n user: ContentstackUser | null\n loading: boolean\n isAuthenticated: boolean\n}\n\nexport function useContentstackUser(): UseContentstackUserReturn {\n const [user, setUser] = useState<ContentstackUser | null>(null)\n const [loading, setLoading] = useState(true)\n\n const fetchSession = useCallback(async () => {\n setLoading(true)\n try {\n const res = await fetch(\"/api/auth/session\")\n if (!res.ok) {\n setUser(null)\n return\n }\n const data = await res.json()\n if (data?.user) {\n setUser({\n uid: data.user.uid ?? data.user.id ?? \"\",\n email: data.user.email ?? \"\",\n firstName: data.user.firstName ?? data.user.name?.split(\" \")[0],\n lastName: data.user.lastName ?? data.user.name?.split(\" \").slice(1).join(\" \"),\n username: data.user.username,\n profileImage: data.user.profileImage ?? data.user.image,\n })\n } else {\n setUser(null)\n }\n } catch {\n setUser(null)\n } finally {\n setLoading(false)\n }\n }, [])\n\n useEffect(() => {\n fetchSession()\n }, [fetchSession])\n\n return { user, loading, isAuthenticated: user !== null }\n}\n","export interface ContentstackLoginButtonProps {\n scopes?: string[]\n redirectTo?: string\n className?: string\n children?: React.ReactNode\n}\n\nexport function ContentstackLoginButton({\n redirectTo,\n className,\n children = \"Sign in with Contentstack\",\n}: ContentstackLoginButtonProps): React.JSX.Element {\n return (\n <form action=\"/api/auth/signin/contentstack\" method=\"POST\">\n {redirectTo && <input type=\"hidden\" name=\"callbackUrl\" value={redirectTo} />}\n <button type=\"submit\" className={className}>\n {children}\n </button>\n </form>\n )\n}\n","export interface ContentstackLogoutButtonProps {\n redirectTo?: string\n className?: string\n children?: React.ReactNode\n}\n\nexport function ContentstackLogoutButton({\n redirectTo,\n className,\n children = \"Sign out\",\n}: ContentstackLogoutButtonProps): React.JSX.Element {\n return (\n <form action=\"/api/auth/signout\" method=\"POST\">\n {redirectTo && <input type=\"hidden\" name=\"callbackUrl\" value={redirectTo} />}\n <button type=\"submit\" className={className}>\n {children}\n </button>\n </form>\n )\n}\n","\"use client\"\n\nimport { ContentstackLoginButton } from \"./ContentstackLoginButton\"\nimport { useContentstackUser } from \"./useContentstackUser\"\n\nexport interface ContentstackAuthGuardProps {\n children: React.ReactNode\n fallback?: React.ReactNode\n loadingFallback?: React.ReactNode\n}\n\nexport function ContentstackAuthGuard({\n children,\n fallback,\n loadingFallback = null,\n}: ContentstackAuthGuardProps): React.JSX.Element | null {\n const { isAuthenticated, loading } = useContentstackUser()\n\n if (loading) return <>{loadingFallback}</>\n if (isAuthenticated) return <>{children}</>\n return <>{fallback ?? <ContentstackLoginButton />}</>\n}\n"],"mappings":";AAEA,SAAS,aAAa,WAAW,gBAAgB;AAS1C,SAAS,sBAAiD;AAC/D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkC,IAAI;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,QAAM,eAAe,YAAY,YAAY;AAC3C,eAAW,IAAI;AACf,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,mBAAmB;AAC3C,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ,IAAI;AACZ;AAAA,MACF;AACA,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAI,MAAM,MAAM;AACd,gBAAQ;AAAA,UACN,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM;AAAA,UACtC,OAAO,KAAK,KAAK,SAAS;AAAA,UAC1B,WAAW,KAAK,KAAK,aAAa,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,UAC9D,UAAU,KAAK,KAAK,YAAY,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,UAC5E,UAAU,KAAK,KAAK;AAAA,UACpB,cAAc,KAAK,KAAK,gBAAgB,KAAK,KAAK;AAAA,QACpD,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,QAAQ;AACN,cAAQ,IAAI;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO,EAAE,MAAM,SAAS,iBAAiB,SAAS,KAAK;AACzD;;;ACnCI,SACiB,KADjB;AANG,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAoD;AAClD,SACE,qBAAC,UAAK,QAAO,iCAAgC,QAAO,QACjD;AAAA,kBAAc,oBAAC,WAAM,MAAK,UAAS,MAAK,eAAc,OAAO,YAAY;AAAA,IAC1E,oBAAC,YAAO,MAAK,UAAS,WACnB,UACH;AAAA,KACF;AAEJ;;;ACRI,SACiB,OAAAA,MADjB,QAAAC,aAAA;AANG,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAqD;AACnD,SACE,gBAAAA,MAAC,UAAK,QAAO,qBAAoB,QAAO,QACrC;AAAA,kBAAc,gBAAAD,KAAC,WAAM,MAAK,UAAS,MAAK,eAAc,OAAO,YAAY;AAAA,IAC1E,gBAAAA,KAAC,YAAO,MAAK,UAAS,WACnB,UACH;AAAA,KACF;AAEJ;;;ACDsB,0BAAAE,YAAA;AAPf,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAyD;AACvD,QAAM,EAAE,iBAAiB,QAAQ,IAAI,oBAAoB;AAEzD,MAAI,QAAS,QAAO,gBAAAA,KAAA,YAAG,2BAAgB;AACvC,MAAI,gBAAiB,QAAO,gBAAAA,KAAA,YAAG,UAAS;AACxC,SAAO,gBAAAA,KAAA,YAAG,sBAAY,gBAAAA,KAAC,2BAAwB,GAAG;AACpD;","names":["jsx","jsxs","jsx"]}
@@ -0,0 +1,64 @@
1
+ import {
2
+ ContentstackHttpClient
3
+ } from "./chunk-4CJ4IVPJ.mjs";
4
+ import {
5
+ resolveEndpoints
6
+ } from "./chunk-BK2IBTQS.mjs";
7
+
8
+ // src/knowledge-vault/items.ts
9
+ var KnowledgeVaultItemsClient = class {
10
+ constructor(http) {
11
+ this.http = http;
12
+ }
13
+ async ingest(data) {
14
+ const response = await this.http.post("/v1/knowledge-vault", data);
15
+ return response.data.data;
16
+ }
17
+ async update(itemUid, data) {
18
+ const response = await this.http.put(
19
+ `/v1/knowledge-vault/${itemUid}`,
20
+ data
21
+ );
22
+ return response.data.data;
23
+ }
24
+ async delete(itemUid) {
25
+ await this.http.delete(`/v1/knowledge-vault/${itemUid}`);
26
+ }
27
+ async getUsage() {
28
+ const response = await this.http.get("/v1/knowledge-vault/usage");
29
+ return response.data.data;
30
+ }
31
+ };
32
+
33
+ // src/knowledge-vault/client.ts
34
+ function createKnowledgeVaultClient(config) {
35
+ const endpoints = resolveEndpoints(config.region);
36
+ const headers = {
37
+ organization_uid: config.organizationUid,
38
+ brand_kit_uid: config.brandKitUid
39
+ };
40
+ switch (config.auth.type) {
41
+ case "oauth":
42
+ headers.authorization = `Bearer ${config.auth.accessToken}`;
43
+ break;
44
+ case "authtoken":
45
+ headers.authtoken = config.auth.token;
46
+ break;
47
+ }
48
+ const http = new ContentstackHttpClient({
49
+ ...config.httpOptions,
50
+ baseUrl: config.httpOptions?.baseUrl ?? endpoints.brandKitAI,
51
+ headers: {
52
+ ...config.httpOptions?.headers,
53
+ ...headers
54
+ }
55
+ });
56
+ return {
57
+ items: new KnowledgeVaultItemsClient(http)
58
+ };
59
+ }
60
+
61
+ export {
62
+ createKnowledgeVaultClient
63
+ };
64
+ //# sourceMappingURL=chunk-3KE63N3I.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/knowledge-vault/items.ts","../src/knowledge-vault/client.ts"],"sourcesContent":["import type { ContentstackHttpClient } from \"../http/client.js\"\nimport type {\n IngestContentData,\n KnowledgeVaultItem,\n KnowledgeVaultUsage,\n UpdateContentData,\n} from \"./types.js\"\n\nexport class KnowledgeVaultItemsClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n async ingest(data: IngestContentData): Promise<KnowledgeVaultItem> {\n const response = await this.http.post<{ data: KnowledgeVaultItem }>(\"/v1/knowledge-vault\", data)\n return response.data.data\n }\n\n async update(itemUid: string, data: UpdateContentData): Promise<KnowledgeVaultItem> {\n const response = await this.http.put<{ data: KnowledgeVaultItem }>(\n `/v1/knowledge-vault/${itemUid}`,\n data,\n )\n return response.data.data\n }\n\n async delete(itemUid: string): Promise<void> {\n await this.http.delete(`/v1/knowledge-vault/${itemUid}`)\n }\n\n async getUsage(): Promise<KnowledgeVaultUsage> {\n const response = await this.http.get<{ data: KnowledgeVaultUsage }>(\"/v1/knowledge-vault/usage\")\n return response.data.data\n }\n}\n","import { ContentstackHttpClient } from \"../http/client.js\"\nimport type { HttpClientConfig } from \"../http/types.js\"\nimport type { ContentstackRegion } from \"../regions/resolver.js\"\nimport { resolveEndpoints } from \"../regions/resolver.js\"\nimport { KnowledgeVaultItemsClient } from \"./items.js\"\n\nexport interface KnowledgeVaultClientConfig {\n region: ContentstackRegion\n organizationUid: string\n brandKitUid: string\n auth: { type: \"oauth\"; accessToken: string } | { type: \"authtoken\"; token: string }\n httpOptions?: Partial<HttpClientConfig>\n}\n\nexport interface KnowledgeVaultClient {\n items: KnowledgeVaultItemsClient\n}\n\nexport function createKnowledgeVaultClient(\n config: KnowledgeVaultClientConfig,\n): KnowledgeVaultClient {\n const endpoints = resolveEndpoints(config.region)\n\n const headers: Record<string, string> = {\n organization_uid: config.organizationUid,\n brand_kit_uid: config.brandKitUid,\n }\n\n switch (config.auth.type) {\n case \"oauth\":\n headers.authorization = `Bearer ${config.auth.accessToken}`\n break\n case \"authtoken\":\n headers.authtoken = config.auth.token\n break\n }\n\n const http = new ContentstackHttpClient({\n ...config.httpOptions,\n baseUrl: config.httpOptions?.baseUrl ?? endpoints.brandKitAI,\n headers: {\n ...config.httpOptions?.headers,\n ...headers,\n },\n })\n\n return {\n items: new KnowledgeVaultItemsClient(http),\n }\n}\n"],"mappings":";;;;;;;;AAQO,IAAM,4BAAN,MAAgC;AAAA,EACrC,YAA6B,MAA8B;AAA9B;AAAA,EAA+B;AAAA,EAE5D,MAAM,OAAO,MAAsD;AACjE,UAAM,WAAW,MAAM,KAAK,KAAK,KAAmC,uBAAuB,IAAI;AAC/F,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,SAAiB,MAAsD;AAClF,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,uBAAuB,OAAO;AAAA,MAC9B;AAAA,IACF;AACA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,SAAgC;AAC3C,UAAM,KAAK,KAAK,OAAO,uBAAuB,OAAO,EAAE;AAAA,EACzD;AAAA,EAEA,MAAM,WAAyC;AAC7C,UAAM,WAAW,MAAM,KAAK,KAAK,IAAmC,2BAA2B;AAC/F,WAAO,SAAS,KAAK;AAAA,EACvB;AACF;;;ACdO,SAAS,2BACd,QACsB;AACtB,QAAM,YAAY,iBAAiB,OAAO,MAAM;AAEhD,QAAM,UAAkC;AAAA,IACtC,kBAAkB,OAAO;AAAA,IACzB,eAAe,OAAO;AAAA,EACxB;AAEA,UAAQ,OAAO,KAAK,MAAM;AAAA,IACxB,KAAK;AACH,cAAQ,gBAAgB,UAAU,OAAO,KAAK,WAAW;AACzD;AAAA,IACF,KAAK;AACH,cAAQ,YAAY,OAAO,KAAK;AAChC;AAAA,EACJ;AAEA,QAAM,OAAO,IAAI,uBAAuB;AAAA,IACtC,GAAG,OAAO;AAAA,IACV,SAAS,OAAO,aAAa,WAAW,UAAU;AAAA,IAClD,SAAS;AAAA,MACP,GAAG,OAAO,aAAa;AAAA,MACvB,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,OAAO,IAAI,0BAA0B,IAAI;AAAA,EAC3C;AACF;","names":[]}
@@ -0,0 +1,212 @@
1
+ import {
2
+ ContentstackAuthError,
3
+ ContentstackError,
4
+ ContentstackForbiddenError,
5
+ ContentstackInvalidApiKeyError,
6
+ ContentstackNotFoundError,
7
+ ContentstackRateLimitError,
8
+ ContentstackServerError,
9
+ ContentstackValidationError
10
+ } from "./chunk-DMERADWM.mjs";
11
+
12
+ // src/http/client.ts
13
+ var DEFAULT_TIMEOUT = 3e4;
14
+ var DEFAULT_RETRY_LIMIT = 5;
15
+ var DEFAULT_RETRY_DELAY = 300;
16
+ var MAX_JITTER = 100;
17
+ var ContentstackHttpClient = class _ContentstackHttpClient {
18
+ config;
19
+ constructor(config) {
20
+ this.config = {
21
+ baseUrl: config.baseUrl,
22
+ headers: config.headers ?? {},
23
+ timeout: config.timeout ?? DEFAULT_TIMEOUT,
24
+ retryOnError: config.retryOnError ?? true,
25
+ retryLimit: config.retryLimit ?? DEFAULT_RETRY_LIMIT,
26
+ retryDelay: config.retryDelay ?? DEFAULT_RETRY_DELAY,
27
+ fetch: config.fetch ?? globalThis.fetch.bind(globalThis)
28
+ };
29
+ }
30
+ async get(path, params) {
31
+ let url = `${this.config.baseUrl}${path}`;
32
+ if (params) {
33
+ const searchParams = new URLSearchParams(params);
34
+ url += `?${searchParams.toString()}`;
35
+ }
36
+ return this.request(url, { method: "GET" }, path);
37
+ }
38
+ async post(path, body) {
39
+ const url = `${this.config.baseUrl}${path}`;
40
+ return this.request(
41
+ url,
42
+ {
43
+ method: "POST",
44
+ headers: { "Content-Type": "application/json" },
45
+ body: body !== void 0 ? JSON.stringify(body) : void 0
46
+ },
47
+ path
48
+ );
49
+ }
50
+ async put(path, body) {
51
+ const url = `${this.config.baseUrl}${path}`;
52
+ return this.request(
53
+ url,
54
+ {
55
+ method: "PUT",
56
+ headers: { "Content-Type": "application/json" },
57
+ body: body !== void 0 ? JSON.stringify(body) : void 0
58
+ },
59
+ path
60
+ );
61
+ }
62
+ async patch(path, body) {
63
+ const url = `${this.config.baseUrl}${path}`;
64
+ return this.request(
65
+ url,
66
+ {
67
+ method: "PATCH",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: body !== void 0 ? JSON.stringify(body) : void 0
70
+ },
71
+ path
72
+ );
73
+ }
74
+ async delete(path) {
75
+ const url = `${this.config.baseUrl}${path}`;
76
+ return this.request(url, { method: "DELETE" }, path);
77
+ }
78
+ async postForm(path, params) {
79
+ const url = `${this.config.baseUrl}${path}`;
80
+ return this.request(
81
+ url,
82
+ {
83
+ method: "POST",
84
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
85
+ body: params.toString()
86
+ },
87
+ path
88
+ );
89
+ }
90
+ async upload(path, form) {
91
+ const url = `${this.config.baseUrl}${path}`;
92
+ return this.request(url, { method: "POST", body: form }, path);
93
+ }
94
+ /** Return a new client with additional headers merged */
95
+ withHeaders(headers) {
96
+ return new _ContentstackHttpClient({
97
+ ...this.config,
98
+ headers: { ...this.config.headers, ...headers }
99
+ });
100
+ }
101
+ /** Return a new client with a different base URL */
102
+ withBaseUrl(baseUrl) {
103
+ return new _ContentstackHttpClient({
104
+ ...this.config,
105
+ baseUrl
106
+ });
107
+ }
108
+ async request(url, init, path) {
109
+ const headers = new Headers(this.config.headers);
110
+ if (init.headers) {
111
+ const initHeaders = init.headers instanceof Headers ? init.headers : new Headers(init.headers);
112
+ initHeaders.forEach((value, key) => headers.set(key, value));
113
+ }
114
+ let lastError;
115
+ const maxAttempts = this.config.retryOnError ? this.config.retryLimit + 1 : 1;
116
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
117
+ const controller = new AbortController();
118
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
119
+ try {
120
+ const response = await this.config.fetch(url, {
121
+ ...init,
122
+ headers,
123
+ signal: controller.signal
124
+ });
125
+ if (response.ok) {
126
+ const data = await response.json().catch(() => ({}));
127
+ return { data, status: response.status, headers: response.headers };
128
+ }
129
+ const isRetryable = response.status === 429 || response.status >= 500;
130
+ if (isRetryable && this.config.retryOnError && attempt < maxAttempts - 1) {
131
+ const delay = this.calculateDelay(response, attempt);
132
+ await sleep(delay);
133
+ lastError = await this.createError(response, path);
134
+ continue;
135
+ }
136
+ throw await this.createError(response, path);
137
+ } catch (error) {
138
+ if (error instanceof ContentstackError) {
139
+ throw error;
140
+ }
141
+ if (error instanceof DOMException && error.name === "AbortError") {
142
+ throw new ContentstackError(`Request timed out after ${this.config.timeout}ms`, {
143
+ requestPath: path,
144
+ cause: error
145
+ });
146
+ }
147
+ throw new ContentstackError("Network request failed", {
148
+ requestPath: path,
149
+ cause: error instanceof Error ? error : new Error(String(error))
150
+ });
151
+ } finally {
152
+ clearTimeout(timeoutId);
153
+ }
154
+ }
155
+ throw lastError ?? new ContentstackError("Request failed after retries", { requestPath: path });
156
+ }
157
+ calculateDelay(response, attempt) {
158
+ const retryAfter = response.headers.get("Retry-After");
159
+ if (retryAfter) {
160
+ const seconds = Number.parseFloat(retryAfter);
161
+ if (!Number.isNaN(seconds)) {
162
+ return seconds * 1e3;
163
+ }
164
+ }
165
+ const jitter = Math.random() * MAX_JITTER;
166
+ return this.config.retryDelay * 2 ** attempt + jitter;
167
+ }
168
+ async createError(response, path) {
169
+ let body = {};
170
+ try {
171
+ body = await response.json();
172
+ } catch {
173
+ }
174
+ const message = body.error_message ?? body.error_description ?? body.message ?? `HTTP ${response.status} error`;
175
+ const errorCode = body.error_code;
176
+ const errors = body.errors;
177
+ const retryAfter = response.headers.get("Retry-After");
178
+ const opts = { status: response.status, errorCode, errors, requestPath: path };
179
+ switch (response.status) {
180
+ case 400:
181
+ return new ContentstackValidationError(message, { ...opts, status: 400 });
182
+ case 401:
183
+ return new ContentstackAuthError(message, opts);
184
+ case 403:
185
+ return new ContentstackForbiddenError(message, opts);
186
+ case 404:
187
+ return new ContentstackNotFoundError(message, opts);
188
+ case 412:
189
+ return new ContentstackInvalidApiKeyError(message, opts);
190
+ case 422:
191
+ return new ContentstackValidationError(message, { ...opts, status: 422 });
192
+ case 429:
193
+ return new ContentstackRateLimitError(message, {
194
+ ...opts,
195
+ retryAfter: retryAfter ? Number.parseFloat(retryAfter) : void 0
196
+ });
197
+ default:
198
+ if (response.status >= 500) {
199
+ return new ContentstackServerError(message, opts);
200
+ }
201
+ return new ContentstackError(message, opts);
202
+ }
203
+ }
204
+ };
205
+ function sleep(ms) {
206
+ return new Promise((resolve) => setTimeout(resolve, ms));
207
+ }
208
+
209
+ export {
210
+ ContentstackHttpClient
211
+ };
212
+ //# sourceMappingURL=chunk-4CJ4IVPJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http/client.ts"],"sourcesContent":["import {\n ContentstackAuthError,\n ContentstackError,\n ContentstackForbiddenError,\n ContentstackInvalidApiKeyError,\n ContentstackNotFoundError,\n ContentstackRateLimitError,\n ContentstackServerError,\n ContentstackValidationError,\n} from \"./errors.js\"\nimport type { HttpClientConfig, HttpResponse } from \"./types.js\"\n\nconst DEFAULT_TIMEOUT = 30_000\nconst DEFAULT_RETRY_LIMIT = 5\nconst DEFAULT_RETRY_DELAY = 300\nconst MAX_JITTER = 100\n\nexport class ContentstackHttpClient {\n private readonly config: Required<\n Pick<HttpClientConfig, \"baseUrl\" | \"timeout\" | \"retryOnError\" | \"retryLimit\" | \"retryDelay\">\n > & {\n headers: Record<string, string>\n fetch: typeof globalThis.fetch\n }\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n headers: config.headers ?? {},\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n retryOnError: config.retryOnError ?? true,\n retryLimit: config.retryLimit ?? DEFAULT_RETRY_LIMIT,\n retryDelay: config.retryDelay ?? DEFAULT_RETRY_DELAY,\n fetch: config.fetch ?? globalThis.fetch.bind(globalThis),\n }\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<HttpResponse<T>> {\n let url = `${this.config.baseUrl}${path}`\n if (params) {\n const searchParams = new URLSearchParams(params)\n url += `?${searchParams.toString()}`\n }\n return this.request<T>(url, { method: \"GET\" }, path)\n }\n\n async post<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n },\n path,\n )\n }\n\n async put<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(\n url,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n },\n path,\n )\n }\n\n async patch<T>(path: string, body?: unknown): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(\n url,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n },\n path,\n )\n }\n\n async delete<T>(path: string): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(url, { method: \"DELETE\" }, path)\n }\n\n async postForm<T>(path: string, params: URLSearchParams): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.toString(),\n },\n path,\n )\n }\n\n async upload<T>(path: string, form: FormData): Promise<HttpResponse<T>> {\n const url = `${this.config.baseUrl}${path}`\n return this.request<T>(url, { method: \"POST\", body: form }, path)\n }\n\n /** Return a new client with additional headers merged */\n withHeaders(headers: Record<string, string>): ContentstackHttpClient {\n return new ContentstackHttpClient({\n ...this.config,\n headers: { ...this.config.headers, ...headers },\n })\n }\n\n /** Return a new client with a different base URL */\n withBaseUrl(baseUrl: string): ContentstackHttpClient {\n return new ContentstackHttpClient({\n ...this.config,\n baseUrl,\n })\n }\n\n private async request<T>(url: string, init: RequestInit, path: string): Promise<HttpResponse<T>> {\n const headers = new Headers(this.config.headers)\n\n if (init.headers) {\n const initHeaders =\n init.headers instanceof Headers\n ? init.headers\n : new Headers(init.headers as Record<string, string>)\n initHeaders.forEach((value, key) => headers.set(key, value))\n }\n\n let lastError: Error | undefined\n const maxAttempts = this.config.retryOnError ? this.config.retryLimit + 1 : 1\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n try {\n const response = await this.config.fetch(url, {\n ...init,\n headers,\n signal: controller.signal,\n })\n\n if (response.ok) {\n const data = (await response.json().catch(() => ({}))) as T\n return { data, status: response.status, headers: response.headers }\n }\n\n // Check if retryable\n const isRetryable = response.status === 429 || response.status >= 500\n if (isRetryable && this.config.retryOnError && attempt < maxAttempts - 1) {\n const delay = this.calculateDelay(response, attempt)\n await sleep(delay)\n lastError = await this.createError(response, path)\n continue\n }\n\n throw await this.createError(response, path)\n } catch (error) {\n if (error instanceof ContentstackError) {\n throw error\n }\n\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new ContentstackError(`Request timed out after ${this.config.timeout}ms`, {\n requestPath: path,\n cause: error,\n })\n }\n\n throw new ContentstackError(\"Network request failed\", {\n requestPath: path,\n cause: error instanceof Error ? error : new Error(String(error)),\n })\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n // Should not reach here, but just in case\n throw lastError ?? new ContentstackError(\"Request failed after retries\", { requestPath: path })\n }\n\n private calculateDelay(response: Response, attempt: number): number {\n const retryAfter = response.headers.get(\"Retry-After\")\n if (retryAfter) {\n const seconds = Number.parseFloat(retryAfter)\n if (!Number.isNaN(seconds)) {\n return seconds * 1000\n }\n }\n\n const jitter = Math.random() * MAX_JITTER\n return this.config.retryDelay * 2 ** attempt + jitter\n }\n\n private async createError(response: Response, path: string): Promise<ContentstackError> {\n let body: Record<string, unknown> = {}\n try {\n body = (await response.json()) as Record<string, unknown>\n } catch {\n // Response body may not be JSON\n }\n\n const message =\n (body.error_message as string | undefined) ??\n (body.error_description as string | undefined) ??\n (body.message as string | undefined) ??\n `HTTP ${response.status} error`\n const errorCode = body.error_code as number | undefined\n const errors = body.errors as Record<string, string[]> | undefined\n const retryAfter = response.headers.get(\"Retry-After\")\n\n const opts = { status: response.status, errorCode, errors, requestPath: path }\n\n switch (response.status) {\n case 400:\n return new ContentstackValidationError(message, { ...opts, status: 400 })\n case 401:\n return new ContentstackAuthError(message, opts)\n case 403:\n return new ContentstackForbiddenError(message, opts)\n case 404:\n return new ContentstackNotFoundError(message, opts)\n case 412:\n return new ContentstackInvalidApiKeyError(message, opts)\n case 422:\n return new ContentstackValidationError(message, { ...opts, status: 422 })\n case 429:\n return new ContentstackRateLimitError(message, {\n ...opts,\n retryAfter: retryAfter ? Number.parseFloat(retryAfter) : undefined,\n })\n default:\n if (response.status >= 500) {\n return new ContentstackServerError(message, opts)\n }\n return new ContentstackError(message, opts)\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"],"mappings":"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","names":[]}