@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 @@
1
+ {"version":3,"sources":["../../../src/server/middleware/index.ts","../../../src/http/errors.ts","../../../src/regions/endpoints.ts","../../../src/regions/resolver.ts","../../../src/http/client.ts","../../../src/auth/oauth-client.ts","../../../src/server/middleware/auth.ts","../../../src/server/middleware/session.ts"],"sourcesContent":["export type { OAuthMiddlewareConfig, AuthFn, ContentstackSession } from \"./types.js\"\nexport { createContentstackAuth } from \"./auth.js\"\nexport { getSession, requireSession, getAccessToken } from \"./session.js\"\n","/**\n * Base error class for all Contentstack SDK errors.\n * Every error includes an actionable message and relevant context.\n */\nexport class ContentstackError extends Error {\n override readonly name: string = \"ContentstackError\"\n readonly status?: number\n readonly errorCode?: number\n readonly errors?: Record<string, string[]>\n readonly requestPath?: string\n\n constructor(\n message: string,\n options?: {\n status?: number\n errorCode?: number\n errors?: Record<string, string[]>\n requestPath?: string\n cause?: Error\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined)\n this.status = options?.status\n this.errorCode = options?.errorCode\n this.errors = options?.errors\n this.requestPath = options?.requestPath\n }\n}\n\nexport class ContentstackAuthError extends ContentstackError {\n override readonly name = \"ContentstackAuthError\"\n override readonly status = 401\n}\n\nexport class ContentstackForbiddenError extends ContentstackError {\n override readonly name = \"ContentstackForbiddenError\"\n override readonly status = 403\n}\n\nexport class ContentstackNotFoundError extends ContentstackError {\n override readonly name = \"ContentstackNotFoundError\"\n override readonly status = 404\n}\n\nexport class ContentstackValidationError extends ContentstackError {\n override readonly name = \"ContentstackValidationError\"\n override readonly status: number\n\n constructor(\n message: string,\n options?: {\n status?: number\n errorCode?: number\n errors?: Record<string, string[]>\n requestPath?: string\n cause?: Error\n },\n ) {\n super(message, options)\n this.status = options?.status ?? 400\n }\n}\n\nexport class ContentstackInvalidApiKeyError extends ContentstackError {\n override readonly name = \"ContentstackInvalidApiKeyError\"\n override readonly status = 412\n}\n\nexport class ContentstackRateLimitError extends ContentstackError {\n override readonly name = \"ContentstackRateLimitError\"\n override readonly status = 429\n readonly retryAfter?: number\n\n constructor(\n message: string,\n options?: {\n errorCode?: number\n errors?: Record<string, string[]>\n requestPath?: string\n cause?: Error\n retryAfter?: number\n },\n ) {\n super(message, { ...options, status: 429 })\n this.retryAfter = options?.retryAfter\n }\n}\n\nexport class ContentstackServerError extends ContentstackError {\n override readonly name = \"ContentstackServerError\"\n}\n\nexport class ContentstackConfigError extends ContentstackError {\n override readonly name = \"ContentstackConfigError\"\n}\n","import {\n type ContentstackEndpoints as UpstreamEndpoints,\n getContentstackEndpoints,\n getRegionForString,\n} from \"@timbenniks/contentstack-endpoints\"\nimport type { ContentstackEndpoints, ContentstackRegion } from \"./resolver.js\"\n\n/** Brand Kit endpoints not available in upstream package — maintained locally */\nconst BRAND_KIT_URLS: Record<ContentstackRegion, { brandKit: string; brandKitAI: string }> = {\n us: {\n brandKit: \"https://brand-kits-api.contentstack.com\",\n brandKitAI: \"https://ai.contentstack.com/brand-kits\",\n },\n eu: {\n brandKit: \"https://eu-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://eu-ai.contentstack.com/brand-kits\",\n },\n au: {\n brandKit: \"https://au-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://au-ai.contentstack.com/brand-kits\",\n },\n \"azure-na\": {\n brandKit: \"https://azure-na-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://azure-na-ai.contentstack.com/brand-kits\",\n },\n \"azure-eu\": {\n brandKit: \"https://azure-eu-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://azure-eu-ai.contentstack.com/brand-kits\",\n },\n \"gcp-na\": {\n brandKit: \"https://gcp-na-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://gcp-na-ai.contentstack.com/brand-kits\",\n },\n \"gcp-eu\": {\n brandKit: \"https://gcp-eu-brand-kits-api.contentstack.com\",\n brandKitAI: \"https://gcp-eu-ai.contentstack.com/brand-kits\",\n },\n}\n\nfunction mapEndpoints(\n upstream: UpstreamEndpoints,\n region: ContentstackRegion,\n hostsOnly: boolean,\n): ContentstackEndpoints {\n const bk = BRAND_KIT_URLS[region]\n const stripProtocol = (url: string) => url.replace(/^https?:\\/\\//, \"\")\n\n return Object.freeze({\n cma: upstream.contentManagement ?? \"\",\n cda: upstream.contentDelivery ?? \"\",\n graphql: upstream.graphqlDelivery ?? \"\",\n images: upstream.images ?? \"\",\n app: upstream.application ?? \"\",\n preview: upstream.preview ?? \"\",\n graphqlPreview: upstream.graphqlPreview ?? \"\",\n launch: upstream.launch ?? \"\",\n personalizeEdge: upstream.personalizeEdge ?? \"\",\n brandKit: hostsOnly ? stripProtocol(bk.brandKit) : bk.brandKit,\n brandKitAI: hostsOnly ? stripProtocol(bk.brandKitAI) : bk.brandKitAI,\n })\n}\n\nconst ALL_REGIONS: ContentstackRegion[] = [\n \"us\",\n \"eu\",\n \"au\",\n \"azure-na\",\n \"azure-eu\",\n \"gcp-na\",\n \"gcp-eu\",\n]\n\nfunction buildEndpointMap(): Record<ContentstackRegion, ContentstackEndpoints> {\n const map = {} as Record<ContentstackRegion, ContentstackEndpoints>\n for (const region of ALL_REGIONS) {\n map[region] = mapEndpoints(getContentstackEndpoints(region), region, false)\n }\n return Object.freeze(map)\n}\n\nfunction buildHostMap(): Record<ContentstackRegion, ContentstackEndpoints> {\n const map = {} as Record<ContentstackRegion, ContentstackEndpoints>\n for (const region of ALL_REGIONS) {\n map[region] = mapEndpoints(getContentstackEndpoints(region, true), region, true)\n }\n return Object.freeze(map)\n}\n\nexport const ENDPOINT_MAP = buildEndpointMap()\nexport const HOST_MAP = buildHostMap()\n\n/** Check if a string is a valid region via the upstream package */\nexport function isValidRegion(input: string): boolean {\n return getRegionForString(input) !== undefined\n}\n\n/** Map of extra aliases our SDK supports beyond what the upstream package handles */\nexport const EXTRA_ALIASES: Record<string, ContentstackRegion> = {\n \"north-america\": \"us\",\n europe: \"eu\",\n australia: \"au\",\n}\n","import { ContentstackConfigError } from \"../http/errors.js\"\nimport { ENDPOINT_MAP, EXTRA_ALIASES, HOST_MAP, isValidRegion } from \"./endpoints.js\"\n\n/** All 7 Contentstack regions */\nexport type ContentstackRegion = \"us\" | \"eu\" | \"au\" | \"azure-na\" | \"azure-eu\" | \"gcp-na\" | \"gcp-eu\"\n\n/** Resolved endpoint URLs for a region */\nexport interface ContentstackEndpoints {\n /** CMA base URL, e.g. \"https://api.contentstack.io\" */\n cma: string\n /** CDA REST base URL, e.g. \"https://cdn.contentstack.io\" */\n cda: string\n /** GraphQL CDA endpoint */\n graphql: string\n /** Asset/image delivery base URL */\n images: string\n /** Application URL (for OAuth), e.g. \"https://app.contentstack.com\" */\n app: string\n /** Preview API base URL */\n preview: string\n /** GraphQL preview endpoint */\n graphqlPreview: string\n /** Launch API base URL */\n launch: string\n /** Personalize edge endpoint */\n personalizeEdge: string\n /** Brand Kit Management API base URL */\n brandKit: string\n /** Brand Kit GenAI and Knowledge Vault base URL */\n brandKitAI: string\n}\n\nconst VALID_REGIONS = new Set<string>(Object.keys(ENDPOINT_MAP))\n\n/**\n * Resolve all API endpoints for a Contentstack region.\n *\n * @example\n * ```ts\n * const endpoints = resolveEndpoints(\"eu\");\n * // endpoints.cma === \"https://eu-api.contentstack.com\"\n * // endpoints.app === \"https://eu-app.contentstack.com\"\n * ```\n */\nexport function resolveEndpoints(region: ContentstackRegion): ContentstackEndpoints {\n return ENDPOINT_MAP[region]\n}\n\n/**\n * Resolve endpoints with https:// stripped (for SDK host parameters).\n *\n * @example\n * ```ts\n * const hosts = resolveHosts(\"eu\");\n * // hosts.cda === \"eu-cdn.contentstack.com\"\n * ```\n */\nexport function resolveHosts(region: ContentstackRegion): ContentstackEndpoints {\n return HOST_MAP[region]\n}\n\n/**\n * Normalize region aliases: \"na\" → \"us\", \"NA\" → \"us\", etc.\n * Case-insensitive. Throws ContentstackConfigError for unknown regions.\n */\nexport function normalizeRegion(input: string): ContentstackRegion {\n const lower = input.toLowerCase().trim()\n\n if (VALID_REGIONS.has(lower)) {\n return lower as ContentstackRegion\n }\n\n // Check extra aliases our SDK supports (north-america, europe, australia)\n const extraAlias = EXTRA_ALIASES[lower]\n if (extraAlias) {\n return extraAlias\n }\n\n // Check aliases handled by the upstream package (na, us, aws-na, etc.)\n if (isValidRegion(lower)) {\n // The upstream package recognized it — map back to our canonical region\n // \"na\" and \"us\" both map to the NA region which we call \"us\"\n if (lower === \"na\" || lower === \"aws-na\" || lower === \"aws_na\") return \"us\"\n if (lower === \"aws-eu\" || lower === \"aws_eu\") return \"eu\"\n if (lower === \"aws-au\" || lower === \"aws_au\") return \"au\"\n if (lower === \"azure_na\") return \"azure-na\"\n if (lower === \"azure_eu\") return \"azure-eu\"\n if (lower === \"gcp_na\") return \"gcp-na\"\n if (lower === \"gcp_eu\") return \"gcp-eu\"\n }\n\n const validRegions = [...VALID_REGIONS].join(\", \")\n const validAliases = [...Object.keys(EXTRA_ALIASES), \"na\", \"aws-na\", \"aws-eu\", \"aws-au\"].join(\n \", \",\n )\n throw new ContentstackConfigError(\n `Unknown region \"${input}\". Valid regions: ${validRegions}. Aliases: ${validAliases}.`,\n )\n}\n\nexport { ContentstackConfigError }\n","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","import { ContentstackHttpClient } from \"../http/client.js\"\nimport {\n ContentstackAuthError,\n ContentstackConfigError,\n ContentstackError,\n} from \"../http/errors.js\"\nimport type { ContentstackRegion } from \"../regions/index.js\"\nimport { resolveEndpoints } from \"../regions/index.js\"\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\"\nimport type { ContentstackUser, OAuthConfig, OAuthTokens } from \"./types.js\"\n\ninterface AuthorizationUrlOptions {\n state?: string\n usePKCE?: boolean\n}\n\ninterface AuthorizationUrlResult {\n url: string\n state: string\n codeVerifier?: string\n}\n\ninterface ExchangeCodeOptions {\n codeVerifier?: string\n}\n\nfunction validateConfig(config: OAuthConfig): void {\n if (!config.appId) {\n throw new ContentstackConfigError(\n \"appId is required for OAuth. This is your Contentstack app's UID, not the client ID.\",\n )\n }\n if (config.appId === config.clientId) {\n throw new ContentstackConfigError(\n \"appId and clientId must be different. appId is your Contentstack app UID; clientId is the OAuth client identifier.\",\n )\n }\n}\n\n/**\n * Build a Contentstack OAuth authorization URL.\n *\n * @example\n * ```ts\n * const { url, state, codeVerifier } = await buildAuthorizationUrl({\n * region: \"us\",\n * appId: \"app-uid\",\n * clientId: \"client-id\",\n * clientSecret: \"secret\",\n * scopes: [\"user:read\"],\n * redirectUri: \"http://localhost:3000/api/auth/callback/contentstack\",\n * }, { usePKCE: true })\n * ```\n */\nexport async function buildAuthorizationUrl(\n config: OAuthConfig,\n options?: AuthorizationUrlOptions,\n): Promise<AuthorizationUrlResult> {\n validateConfig(config)\n\n const endpoints = resolveEndpoints(config.region)\n const authorizationUrl = `${endpoints.app}/apps/${config.appId}/authorize`\n\n const state = options?.state ?? generateCodeVerifier()\n\n const params = new URLSearchParams({\n response_type: \"code\",\n client_id: config.clientId,\n redirect_uri: config.redirectUri,\n scope: config.scopes.join(\" \"),\n state,\n })\n\n let codeVerifier: string | undefined\n if (options?.usePKCE) {\n codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(codeVerifier)\n params.set(\"code_challenge\", codeChallenge)\n params.set(\"code_challenge_method\", \"S256\")\n }\n\n return {\n url: `${authorizationUrl}?${params.toString()}`,\n state,\n codeVerifier,\n }\n}\n\nfunction mapTokenResponse(data: Record<string, unknown>): OAuthTokens {\n return {\n accessToken: data.access_token as string,\n refreshToken: data.refresh_token as string,\n expiresIn: data.expires_in as number,\n tokenType: data.token_type as string,\n }\n}\n\nasync function makeTokenRequest(\n appBaseUrl: string,\n body: URLSearchParams,\n errorMessage: string,\n): Promise<OAuthTokens> {\n const client = new ContentstackHttpClient({ baseUrl: appBaseUrl })\n try {\n const { data } = await client.postForm<Record<string, unknown>>(\"/apps-api/token\", body)\n return mapTokenResponse(data)\n } catch (err) {\n if (err instanceof ContentstackError) {\n throw new ContentstackAuthError(err.message || errorMessage, {\n status: err.status,\n requestPath: \"/apps-api/token\",\n cause: err,\n })\n }\n throw new ContentstackAuthError(errorMessage, {\n requestPath: \"/apps-api/token\",\n cause: err instanceof Error ? err : undefined,\n })\n }\n}\n\n/**\n * Exchange an authorization code for OAuth tokens.\n */\nexport async function exchangeCode(\n config: OAuthConfig,\n code: string,\n options?: ExchangeCodeOptions,\n): Promise<OAuthTokens> {\n const endpoints = resolveEndpoints(config.region)\n\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: config.redirectUri,\n client_id: config.clientId,\n client_secret: config.clientSecret,\n })\n\n if (options?.codeVerifier) {\n body.set(\"code_verifier\", options.codeVerifier)\n }\n\n return makeTokenRequest(endpoints.app, body, \"Failed to exchange authorization code\")\n}\n\n/**\n * Refresh an expired access token using a refresh token.\n */\nexport async function refreshToken(config: OAuthConfig, token: string): Promise<OAuthTokens> {\n const endpoints = resolveEndpoints(config.region)\n\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: token,\n client_id: config.clientId,\n client_secret: config.clientSecret,\n })\n\n return makeTokenRequest(endpoints.app, body, \"Failed to refresh token\")\n}\n\nfunction mapUser(user: Record<string, unknown>): ContentstackUser {\n return {\n uid: user.uid as string,\n email: user.email as string,\n firstName: (user.first_name as string) ?? undefined,\n lastName: (user.last_name as string) ?? undefined,\n username: (user.username as string) ?? undefined,\n profileImage: (user.profile_image as string) ?? undefined,\n }\n}\n\n/**\n * Fetch the authenticated user's profile from Contentstack.\n * Unwraps the nested `user` key and maps snake_case → camelCase.\n */\nexport async function getUser(\n region: ContentstackRegion,\n accessToken: string,\n): Promise<ContentstackUser> {\n const endpoints = resolveEndpoints(region)\n const client = new ContentstackHttpClient({\n baseUrl: `${endpoints.cma}/v3`,\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n try {\n const { data } = await client.get<{ user: Record<string, unknown> }>(\"/user\")\n return mapUser(data.user)\n } catch (err) {\n if (err instanceof ContentstackError) {\n throw new ContentstackAuthError(err.message || \"Failed to fetch user profile\", {\n status: err.status,\n requestPath: \"/v3/user\",\n cause: err,\n })\n }\n throw new ContentstackAuthError(\"Failed to fetch user profile\", {\n requestPath: \"/v3/user\",\n cause: err instanceof Error ? err : undefined,\n })\n }\n}\n\n/**\n * Create an Auth.js v5 provider config object for Contentstack.\n *\n * No Auth.js dependency is required in this package — the returned object\n * conforms to the Auth.js OAuthConfig shape and can be passed directly to\n * `next-auth` or `@auth/core`.\n *\n * @example\n * ```ts\n * // app/api/auth/[...nextauth]/route.ts\n * import NextAuth from \"next-auth\"\n * import { createAuthProvider } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * export const { handlers, signIn, signOut, auth } = NextAuth({\n * providers: [createAuthProvider({ region: \"us\", appId: \"...\", ... })],\n * })\n * ```\n */\nexport function createAuthProvider(config: OAuthConfig): Record<string, unknown> {\n validateConfig(config)\n\n const endpoints = resolveEndpoints(config.region)\n const userClient = new ContentstackHttpClient({ baseUrl: `${endpoints.cma}/v3` })\n\n return {\n id: \"contentstack\",\n name: \"Contentstack\",\n type: \"oauth\",\n checks: [\"state\"],\n authorization: {\n url: `${endpoints.app}/apps/${config.appId}/authorize`,\n params: {\n response_type: \"code\",\n scope: config.scopes.join(\" \"),\n },\n },\n token: `${endpoints.app}/apps-api/token`,\n userinfo: {\n url: `${endpoints.cma}/v3/user`,\n async request({ tokens }: { tokens: { access_token: string } }) {\n const authedClient = userClient.withHeaders({\n Authorization: `Bearer ${tokens.access_token}`,\n })\n const { data } = await authedClient.get<Record<string, unknown>>(\"/user\")\n return data\n },\n },\n profile(profile: { user: Record<string, unknown> }) {\n const user = profile.user\n return {\n id: user.uid as string,\n name:\n [user.first_name, user.last_name].filter(Boolean).join(\" \") || (user.username as string),\n email: user.email as string,\n image: (user.profile_image as string) ?? null,\n }\n },\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n }\n}\n\n/**\n * Create Auth.js v5 callbacks for token persistence and automatic refresh.\n *\n * The `jwt` callback persists OAuth tokens on initial sign-in and attempts\n * to refresh expired tokens (with a 60-second safety window).\n *\n * The `session` callback exposes the access token and any refresh errors\n * on the session object.\n *\n * @example\n * ```ts\n * import NextAuth from \"next-auth\"\n * import { createAuthProvider, contentstackAuthCallbacks } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * export const { handlers, auth } = NextAuth({\n * providers: [createAuthProvider({ ... })],\n * callbacks: contentstackAuthCallbacks({ region: \"us\", ... }),\n * })\n * ```\n */\nexport function contentstackAuthCallbacks(config: OAuthConfig) {\n return {\n async jwt({\n token,\n account,\n }: { token: Record<string, unknown>; account?: Record<string, unknown> | null }) {\n // Initial sign-in: persist tokens from the OAuth account\n if (account) {\n token.accessToken = account.access_token\n token.refreshToken = account.refresh_token\n token.accessTokenExpiresAt = Date.now() + ((account.expires_in as number) ?? 3600) * 1000\n return token\n }\n\n // Subsequent calls: check if token needs refresh (60s safety window)\n const expiresAt = token.accessTokenExpiresAt as number | undefined\n if (expiresAt && Date.now() < expiresAt - 60_000) {\n return token\n }\n\n // Token is expired or about to expire — attempt refresh\n const currentRefreshToken = token.refreshToken as string | undefined\n if (!currentRefreshToken) {\n token.error = \"RefreshAccessTokenError\"\n return token\n }\n\n try {\n const tokens = await refreshToken(config, currentRefreshToken)\n token.accessToken = tokens.accessToken\n token.refreshToken = tokens.refreshToken\n token.accessTokenExpiresAt = Date.now() + tokens.expiresIn * 1000\n token.error = undefined\n } catch {\n token.error = \"RefreshAccessTokenError\"\n }\n\n return token\n },\n async session({\n session,\n token,\n }: { session: Record<string, unknown>; token: Record<string, unknown> }) {\n session.accessToken = token.accessToken\n if (token.error) {\n session.error = token.error\n }\n return session\n },\n }\n}\n","import { contentstackAuthCallbacks, createAuthProvider, getUser } from \"../../index.js\"\nimport type { OAuthMiddlewareConfig } from \"./types.js\"\n\n/**\n * Create a complete Auth.js v5 (NextAuth) configuration for Contentstack OAuth.\n *\n * This wraps NextAuth with all Contentstack-specific config baked in, reducing\n * ~150 lines of Auth.js configuration down to ~10 lines.\n *\n * Requires `next-auth@>=5.0.0-beta.0` as an installed peer dependency.\n *\n * @example\n * ```ts\n * import { createContentstackAuth } from \"@timbenniks/contentstack-platform-sdk/server/middleware\"\n *\n * const { handlers, auth, signIn, signOut } = await createContentstackAuth({\n * region: \"us\",\n * appId: \"your-app-uid\",\n * clientId: \"your-client-id\",\n * clientSecret: \"your-client-secret\",\n * scopes: [\"user:read\"],\n * secret: process.env.AUTH_SECRET!,\n * })\n *\n * // app/api/auth/[...nextauth]/route.ts\n * export const { GET, POST } = handlers\n * ```\n */\nexport async function createContentstackAuth(config: OAuthMiddlewareConfig) {\n // Dynamic import — next-auth is an optional peer dependency.\n // This prevents module resolution errors when importing the middleware\n // module in environments where next-auth is not installed.\n const { default: NextAuth } = await import(\"next-auth\")\n\n const oauthConfig = {\n region: config.region,\n appId: config.appId,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scopes: config.scopes,\n redirectUri: \"auto\",\n }\n\n const provider = createAuthProvider(oauthConfig)\n const baseCallbacks = contentstackAuthCallbacks(oauthConfig)\n\n const callbacks = {\n async jwt(params: {\n token: Record<string, unknown>\n account?: Record<string, unknown> | null\n }) {\n const token = await baseCallbacks.jwt(params)\n\n // Call onSignIn on initial sign-in (account is only present once)\n if (params.account && config.onSignIn) {\n try {\n const user = await getUser(config.region, token.accessToken as string)\n const tokens = {\n accessToken: token.accessToken as string,\n refreshToken: token.refreshToken as string,\n expiresIn: Math.floor(((token.accessTokenExpiresAt as number) - Date.now()) / 1000),\n tokenType: \"Bearer\",\n }\n await config.onSignIn(user, tokens)\n } catch {\n // onSignIn errors should not block authentication\n }\n }\n\n return token\n },\n session: baseCallbacks.session,\n }\n\n // The core package returns generic `Record<string, unknown>` for framework\n // independence. Cast to `never` at the NextAuth boundary — the shape is\n // guaranteed correct by createAuthProvider/contentstackAuthCallbacks.\n return NextAuth({\n providers: [provider as never],\n callbacks: callbacks as never,\n secret: config.secret,\n trustHost: config.trustHost ?? true,\n session: { strategy: \"jwt\" as const },\n pages: {\n signIn: config.signInPage ?? \"/login\",\n error: config.errorPage ?? \"/login\",\n },\n })\n}\n","import { ContentstackAuthError } from \"../../index.js\"\nimport type { AuthFn, ContentstackSession } from \"./types.js\"\n\n/**\n * Get the current Contentstack session.\n *\n * @param authFn - Framework-agnostic auth function (e.g., the `auth()` function from NextAuth)\n * @returns The session with `accessToken`, or `null` if unauthenticated.\n */\nexport async function getSession(authFn: AuthFn): Promise<ContentstackSession | null> {\n const session = await authFn()\n if (!session?.accessToken) return null\n return { accessToken: session.accessToken, user: session.user }\n}\n\n/**\n * Require an authenticated Contentstack session.\n * Throws `ContentstackAuthError` if no session or no access token is present.\n *\n * @param authFn - Framework-agnostic auth function\n * @param redirectTo - Optional redirect path included in the error for the caller to use\n * @returns The session with a guaranteed `accessToken`.\n */\nexport async function requireSession(\n authFn: AuthFn,\n redirectTo?: string,\n): Promise<ContentstackSession> {\n const session = await getSession(authFn)\n if (!session) {\n throw new ContentstackAuthError(\n redirectTo\n ? `Authentication required. Redirect to: ${redirectTo}`\n : \"Authentication required\",\n { status: 401 },\n )\n }\n return session\n}\n\n/**\n * Get the OAuth access token from the current session.\n *\n * @param authFn - Framework-agnostic auth function\n * @returns The access token string, or `null` if unauthenticated.\n */\nexport async function getAccessToken(authFn: AuthFn): Promise<string | null> {\n const session = await authFn()\n return session?.accessToken ?? null\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,77 @@
1
+ import { ContentstackRegion } from '../../regions/index.cjs';
2
+ import { C as ContentstackUser, a as OAuthTokens } from '../../types-6D9VR7pT.cjs';
3
+ import * as next_auth from 'next-auth';
4
+
5
+ interface OAuthMiddlewareConfig {
6
+ region: ContentstackRegion;
7
+ appId: string;
8
+ clientId: string;
9
+ clientSecret: string;
10
+ scopes: string[];
11
+ secret: string;
12
+ trustHost?: boolean;
13
+ signInPage?: string;
14
+ errorPage?: string;
15
+ onSignIn?: (user: ContentstackUser, tokens: OAuthTokens) => Promise<void>;
16
+ }
17
+ type AuthFn = () => Promise<{
18
+ accessToken?: string;
19
+ user?: unknown;
20
+ } | null>;
21
+ interface ContentstackSession {
22
+ accessToken: string;
23
+ user?: unknown;
24
+ }
25
+
26
+ /**
27
+ * Create a complete Auth.js v5 (NextAuth) configuration for Contentstack OAuth.
28
+ *
29
+ * This wraps NextAuth with all Contentstack-specific config baked in, reducing
30
+ * ~150 lines of Auth.js configuration down to ~10 lines.
31
+ *
32
+ * Requires `next-auth@>=5.0.0-beta.0` as an installed peer dependency.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { createContentstackAuth } from "@timbenniks/contentstack-platform-sdk/server/middleware"
37
+ *
38
+ * const { handlers, auth, signIn, signOut } = await createContentstackAuth({
39
+ * region: "us",
40
+ * appId: "your-app-uid",
41
+ * clientId: "your-client-id",
42
+ * clientSecret: "your-client-secret",
43
+ * scopes: ["user:read"],
44
+ * secret: process.env.AUTH_SECRET!,
45
+ * })
46
+ *
47
+ * // app/api/auth/[...nextauth]/route.ts
48
+ * export const { GET, POST } = handlers
49
+ * ```
50
+ */
51
+ declare function createContentstackAuth(config: OAuthMiddlewareConfig): Promise<next_auth.NextAuthResult>;
52
+
53
+ /**
54
+ * Get the current Contentstack session.
55
+ *
56
+ * @param authFn - Framework-agnostic auth function (e.g., the `auth()` function from NextAuth)
57
+ * @returns The session with `accessToken`, or `null` if unauthenticated.
58
+ */
59
+ declare function getSession(authFn: AuthFn): Promise<ContentstackSession | null>;
60
+ /**
61
+ * Require an authenticated Contentstack session.
62
+ * Throws `ContentstackAuthError` if no session or no access token is present.
63
+ *
64
+ * @param authFn - Framework-agnostic auth function
65
+ * @param redirectTo - Optional redirect path included in the error for the caller to use
66
+ * @returns The session with a guaranteed `accessToken`.
67
+ */
68
+ declare function requireSession(authFn: AuthFn, redirectTo?: string): Promise<ContentstackSession>;
69
+ /**
70
+ * Get the OAuth access token from the current session.
71
+ *
72
+ * @param authFn - Framework-agnostic auth function
73
+ * @returns The access token string, or `null` if unauthenticated.
74
+ */
75
+ declare function getAccessToken(authFn: AuthFn): Promise<string | null>;
76
+
77
+ export { type AuthFn, type ContentstackSession, type OAuthMiddlewareConfig, createContentstackAuth, getAccessToken, getSession, requireSession };
@@ -0,0 +1,77 @@
1
+ import { ContentstackRegion } from '../../regions/index.js';
2
+ import { C as ContentstackUser, a as OAuthTokens } from '../../types-Bu5yCgmw.js';
3
+ import * as next_auth from 'next-auth';
4
+
5
+ interface OAuthMiddlewareConfig {
6
+ region: ContentstackRegion;
7
+ appId: string;
8
+ clientId: string;
9
+ clientSecret: string;
10
+ scopes: string[];
11
+ secret: string;
12
+ trustHost?: boolean;
13
+ signInPage?: string;
14
+ errorPage?: string;
15
+ onSignIn?: (user: ContentstackUser, tokens: OAuthTokens) => Promise<void>;
16
+ }
17
+ type AuthFn = () => Promise<{
18
+ accessToken?: string;
19
+ user?: unknown;
20
+ } | null>;
21
+ interface ContentstackSession {
22
+ accessToken: string;
23
+ user?: unknown;
24
+ }
25
+
26
+ /**
27
+ * Create a complete Auth.js v5 (NextAuth) configuration for Contentstack OAuth.
28
+ *
29
+ * This wraps NextAuth with all Contentstack-specific config baked in, reducing
30
+ * ~150 lines of Auth.js configuration down to ~10 lines.
31
+ *
32
+ * Requires `next-auth@>=5.0.0-beta.0` as an installed peer dependency.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { createContentstackAuth } from "@timbenniks/contentstack-platform-sdk/server/middleware"
37
+ *
38
+ * const { handlers, auth, signIn, signOut } = await createContentstackAuth({
39
+ * region: "us",
40
+ * appId: "your-app-uid",
41
+ * clientId: "your-client-id",
42
+ * clientSecret: "your-client-secret",
43
+ * scopes: ["user:read"],
44
+ * secret: process.env.AUTH_SECRET!,
45
+ * })
46
+ *
47
+ * // app/api/auth/[...nextauth]/route.ts
48
+ * export const { GET, POST } = handlers
49
+ * ```
50
+ */
51
+ declare function createContentstackAuth(config: OAuthMiddlewareConfig): Promise<next_auth.NextAuthResult>;
52
+
53
+ /**
54
+ * Get the current Contentstack session.
55
+ *
56
+ * @param authFn - Framework-agnostic auth function (e.g., the `auth()` function from NextAuth)
57
+ * @returns The session with `accessToken`, or `null` if unauthenticated.
58
+ */
59
+ declare function getSession(authFn: AuthFn): Promise<ContentstackSession | null>;
60
+ /**
61
+ * Require an authenticated Contentstack session.
62
+ * Throws `ContentstackAuthError` if no session or no access token is present.
63
+ *
64
+ * @param authFn - Framework-agnostic auth function
65
+ * @param redirectTo - Optional redirect path included in the error for the caller to use
66
+ * @returns The session with a guaranteed `accessToken`.
67
+ */
68
+ declare function requireSession(authFn: AuthFn, redirectTo?: string): Promise<ContentstackSession>;
69
+ /**
70
+ * Get the OAuth access token from the current session.
71
+ *
72
+ * @param authFn - Framework-agnostic auth function
73
+ * @returns The access token string, or `null` if unauthenticated.
74
+ */
75
+ declare function getAccessToken(authFn: AuthFn): Promise<string | null>;
76
+
77
+ export { type AuthFn, type ContentstackSession, type OAuthMiddlewareConfig, createContentstackAuth, getAccessToken, getSession, requireSession };
@@ -0,0 +1,27 @@
1
+ import {
2
+ createContentstackAuth,
3
+ getAccessToken,
4
+ getSession,
5
+ requireSession
6
+ } from "../../chunk-SU5QEKYW.mjs";
7
+ import "../../chunk-7VFGD32I.mjs";
8
+ import "../../chunk-T5A2E2RI.mjs";
9
+ import "../../chunk-VW7DD6HV.mjs";
10
+ import "../../chunk-DJQLN4TR.mjs";
11
+ import "../../chunk-XH7NLHGW.mjs";
12
+ import "../../chunk-AVJHCFRK.mjs";
13
+ import "../../chunk-EREPKWTW.mjs";
14
+ import "../../chunk-GNPQJBFX.mjs";
15
+ import "../../chunk-KLVIROVU.mjs";
16
+ import "../../chunk-JZE2W7VW.mjs";
17
+ import "../../chunk-3KE63N3I.mjs";
18
+ import "../../chunk-4CJ4IVPJ.mjs";
19
+ import "../../chunk-BK2IBTQS.mjs";
20
+ import "../../chunk-DMERADWM.mjs";
21
+ export {
22
+ createContentstackAuth,
23
+ getAccessToken,
24
+ getSession,
25
+ requireSession
26
+ };
27
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/server/proxy/index.ts
21
+ var proxy_exports = {};
22
+ __export(proxy_exports, {
23
+ checkScope: () => checkScope,
24
+ createBrandKitProxy: () => createBrandKitProxy,
25
+ createCMAProxy: () => createCMAProxy,
26
+ createLaunchProxy: () => createLaunchProxy,
27
+ resolveScope: () => resolveScope
28
+ });
29
+ module.exports = __toCommonJS(proxy_exports);
30
+
31
+ // src/regions/endpoints.ts
32
+ var import_contentstack_endpoints = require("@timbenniks/contentstack-endpoints");
33
+ var BRAND_KIT_URLS = {
34
+ us: {
35
+ brandKit: "https://brand-kits-api.contentstack.com",
36
+ brandKitAI: "https://ai.contentstack.com/brand-kits"
37
+ },
38
+ eu: {
39
+ brandKit: "https://eu-brand-kits-api.contentstack.com",
40
+ brandKitAI: "https://eu-ai.contentstack.com/brand-kits"
41
+ },
42
+ au: {
43
+ brandKit: "https://au-brand-kits-api.contentstack.com",
44
+ brandKitAI: "https://au-ai.contentstack.com/brand-kits"
45
+ },
46
+ "azure-na": {
47
+ brandKit: "https://azure-na-brand-kits-api.contentstack.com",
48
+ brandKitAI: "https://azure-na-ai.contentstack.com/brand-kits"
49
+ },
50
+ "azure-eu": {
51
+ brandKit: "https://azure-eu-brand-kits-api.contentstack.com",
52
+ brandKitAI: "https://azure-eu-ai.contentstack.com/brand-kits"
53
+ },
54
+ "gcp-na": {
55
+ brandKit: "https://gcp-na-brand-kits-api.contentstack.com",
56
+ brandKitAI: "https://gcp-na-ai.contentstack.com/brand-kits"
57
+ },
58
+ "gcp-eu": {
59
+ brandKit: "https://gcp-eu-brand-kits-api.contentstack.com",
60
+ brandKitAI: "https://gcp-eu-ai.contentstack.com/brand-kits"
61
+ }
62
+ };
63
+ function mapEndpoints(upstream, region, hostsOnly) {
64
+ const bk = BRAND_KIT_URLS[region];
65
+ const stripProtocol = (url) => url.replace(/^https?:\/\//, "");
66
+ return Object.freeze({
67
+ cma: upstream.contentManagement ?? "",
68
+ cda: upstream.contentDelivery ?? "",
69
+ graphql: upstream.graphqlDelivery ?? "",
70
+ images: upstream.images ?? "",
71
+ app: upstream.application ?? "",
72
+ preview: upstream.preview ?? "",
73
+ graphqlPreview: upstream.graphqlPreview ?? "",
74
+ launch: upstream.launch ?? "",
75
+ personalizeEdge: upstream.personalizeEdge ?? "",
76
+ brandKit: hostsOnly ? stripProtocol(bk.brandKit) : bk.brandKit,
77
+ brandKitAI: hostsOnly ? stripProtocol(bk.brandKitAI) : bk.brandKitAI
78
+ });
79
+ }
80
+ var ALL_REGIONS = [
81
+ "us",
82
+ "eu",
83
+ "au",
84
+ "azure-na",
85
+ "azure-eu",
86
+ "gcp-na",
87
+ "gcp-eu"
88
+ ];
89
+ function buildEndpointMap() {
90
+ const map = {};
91
+ for (const region of ALL_REGIONS) {
92
+ map[region] = mapEndpoints((0, import_contentstack_endpoints.getContentstackEndpoints)(region), region, false);
93
+ }
94
+ return Object.freeze(map);
95
+ }
96
+ function buildHostMap() {
97
+ const map = {};
98
+ for (const region of ALL_REGIONS) {
99
+ map[region] = mapEndpoints((0, import_contentstack_endpoints.getContentstackEndpoints)(region, true), region, true);
100
+ }
101
+ return Object.freeze(map);
102
+ }
103
+ var ENDPOINT_MAP = buildEndpointMap();
104
+ var HOST_MAP = buildHostMap();
105
+
106
+ // src/regions/resolver.ts
107
+ var VALID_REGIONS = new Set(Object.keys(ENDPOINT_MAP));
108
+ function resolveEndpoints(region) {
109
+ return ENDPOINT_MAP[region];
110
+ }
111
+
112
+ // src/server/proxy/proxy-base.ts
113
+ function jsonErrorResponse(error, status) {
114
+ return new Response(JSON.stringify({ error }), {
115
+ status,
116
+ headers: { "Content-Type": "application/json" }
117
+ });
118
+ }
119
+ function createBaseProxy(config, handleRequest) {
120
+ return async (request) => {
121
+ const token = await config.getAccessToken(request);
122
+ if (!token) {
123
+ return jsonErrorResponse("Unauthorized", 401);
124
+ }
125
+ const url = new URL(request.url);
126
+ const apiPath = url.pathname.replace(config.basePath, "");
127
+ const body = ["GET", "HEAD"].includes(request.method) || request.body === null ? void 0 : await request.arrayBuffer();
128
+ return handleRequest({
129
+ token,
130
+ apiPath,
131
+ search: url.search,
132
+ method: request.method,
133
+ body,
134
+ request
135
+ });
136
+ };
137
+ }
138
+ async function forwardRequest(url, method, headers, body, timeout) {
139
+ try {
140
+ const upstream = await fetch(url, {
141
+ method,
142
+ headers,
143
+ body,
144
+ signal: AbortSignal.timeout(timeout)
145
+ });
146
+ return new Response(upstream.body, {
147
+ status: upstream.status,
148
+ headers: {
149
+ "content-type": upstream.headers.get("content-type") ?? "application/json"
150
+ }
151
+ });
152
+ } catch {
153
+ return jsonErrorResponse("Bad Gateway", 502);
154
+ }
155
+ }
156
+
157
+ // src/server/proxy/rate-limiter.ts
158
+ function createRateLimiter(maxRequests, windowMs = 6e4) {
159
+ const windows = /* @__PURE__ */ new Map();
160
+ return {
161
+ /**
162
+ * Check if the request is within rate limits.
163
+ * @returns `true` if the request is allowed, `false` if rate limited.
164
+ */
165
+ check(key) {
166
+ const now = Date.now();
167
+ const window = windows.get(key);
168
+ for (const [k, w] of windows) {
169
+ if (now - w.windowStart > windowMs) {
170
+ windows.delete(k);
171
+ }
172
+ }
173
+ if (!window || now - window.windowStart > windowMs) {
174
+ windows.set(key, { count: 1, windowStart: now });
175
+ return true;
176
+ }
177
+ window.count++;
178
+ return window.count <= maxRequests;
179
+ }
180
+ };
181
+ }
182
+
183
+ // src/server/proxy/scope-guard.ts
184
+ var READ_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
185
+ function resolveScope(method, path) {
186
+ const isRead = READ_METHODS.has(method.toUpperCase());
187
+ const suffix = isRead ? ":read" : ":write";
188
+ const segments = path.split("/");
189
+ if (segments.includes("entries")) return `entries${suffix}`;
190
+ if (segments.includes("content_types")) return `content-types${suffix}`;
191
+ if (segments.includes("assets")) return `assets${suffix}`;
192
+ if (segments.includes("environments")) return "environments:read";
193
+ if (segments.includes("locales")) return "locales:read";
194
+ if (segments.includes("releases")) return `releases${suffix}`;
195
+ if (segments.includes("taxonomies")) return `taxonomies${suffix}`;
196
+ if (segments.includes("workflows")) return `workflows${suffix}`;
197
+ if (segments.includes("webhooks")) return `webhooks${suffix}`;
198
+ return null;
199
+ }
200
+ function checkScope(required, allowed) {
201
+ if (allowed.includes(required)) return null;
202
+ return `Scope "${required}" is not allowed. Allowed scopes: ${allowed.join(", ")}`;
203
+ }
204
+
205
+ // src/server/proxy/cma-proxy.ts
206
+ function createCMAProxy(config) {
207
+ const endpoints = resolveEndpoints(config.region);
208
+ const cmaBase = `${endpoints.cma}/v3`;
209
+ const timeout = config.timeout ?? 3e4;
210
+ const rateLimiter = config.rateLimit ? createRateLimiter(config.rateLimit) : null;
211
+ return createBaseProxy(
212
+ {
213
+ getAccessToken: config.getAccessToken,
214
+ basePath: config.basePath ?? "/api/cma",
215
+ timeout
216
+ },
217
+ async (ctx) => {
218
+ if (rateLimiter && !rateLimiter.check(ctx.token)) {
219
+ return jsonErrorResponse("Too Many Requests", 429);
220
+ }
221
+ if (config.allowedScopes) {
222
+ const scope = resolveScope(ctx.method, ctx.apiPath);
223
+ if (!scope) {
224
+ if ((config.unmappedScopeBehavior ?? "deny") === "deny") {
225
+ return jsonErrorResponse(
226
+ `No scope mapping found for "${ctx.method} ${ctx.apiPath}". Add a mapping or set unmappedScopeBehavior: "allow".`,
227
+ 403
228
+ );
229
+ }
230
+ } else {
231
+ const rejection = checkScope(scope, config.allowedScopes);
232
+ if (rejection) {
233
+ return jsonErrorResponse(rejection, 403);
234
+ }
235
+ }
236
+ }
237
+ const headers = {
238
+ api_key: config.apiKey,
239
+ authorization: `Bearer ${ctx.token}`
240
+ };
241
+ const contentType = ctx.request.headers.get("content-type");
242
+ if (contentType) {
243
+ headers["content-type"] = contentType;
244
+ }
245
+ return forwardRequest(
246
+ cmaBase + ctx.apiPath + ctx.search,
247
+ ctx.method,
248
+ headers,
249
+ ctx.body,
250
+ timeout
251
+ );
252
+ }
253
+ );
254
+ }
255
+
256
+ // src/server/proxy/launch-proxy.ts
257
+ function createLaunchProxy(config) {
258
+ const endpoints = resolveEndpoints(config.region);
259
+ const launchBase = endpoints.launch;
260
+ const timeout = config.timeout ?? 3e4;
261
+ return createBaseProxy(
262
+ {
263
+ getAccessToken: config.getAccessToken,
264
+ basePath: config.basePath ?? "/api/launch",
265
+ timeout
266
+ },
267
+ async (ctx) => {
268
+ const headers = {
269
+ authorization: `Bearer ${ctx.token}`,
270
+ organization_uid: config.organizationUid,
271
+ "content-type": "application/json"
272
+ };
273
+ return forwardRequest(
274
+ launchBase + ctx.apiPath + ctx.search,
275
+ ctx.method,
276
+ headers,
277
+ ctx.body,
278
+ timeout
279
+ );
280
+ }
281
+ );
282
+ }
283
+
284
+ // src/server/proxy/brandkit-proxy.ts
285
+ function createBrandKitProxy(config) {
286
+ const endpoints = resolveEndpoints(config.region);
287
+ const brandKitBase = endpoints.brandKit;
288
+ const brandKitAIBase = endpoints.brandKitAI;
289
+ const timeout = config.timeout ?? 3e4;
290
+ return createBaseProxy(
291
+ {
292
+ getAccessToken: config.getAccessToken,
293
+ basePath: config.basePath ?? "/api/brandkit",
294
+ timeout
295
+ },
296
+ async (ctx) => {
297
+ if (config.allowedOperations?.length) {
298
+ const hasManage = config.allowedOperations.includes("manage");
299
+ if (!hasManage && !["GET", "HEAD"].includes(ctx.method)) {
300
+ return jsonErrorResponse("Forbidden: read-only mode", 403);
301
+ }
302
+ }
303
+ const headers = {
304
+ authorization: `Bearer ${ctx.token}`,
305
+ organization_uid: config.organizationUid,
306
+ brand_kit_uid: config.brandKitUid,
307
+ "content-type": "application/json"
308
+ };
309
+ const isAIPath = ctx.apiPath.includes("/knowledge-vault") || ctx.apiPath.includes("/generative-ai");
310
+ const baseUrl = isAIPath ? brandKitAIBase : brandKitBase;
311
+ return forwardRequest(
312
+ baseUrl + ctx.apiPath + ctx.search,
313
+ ctx.method,
314
+ headers,
315
+ ctx.body,
316
+ timeout
317
+ );
318
+ }
319
+ );
320
+ }
321
+ // Annotate the CommonJS export names for ESM import in node:
322
+ 0 && (module.exports = {
323
+ checkScope,
324
+ createBrandKitProxy,
325
+ createCMAProxy,
326
+ createLaunchProxy,
327
+ resolveScope
328
+ });
329
+ //# sourceMappingURL=index.cjs.map