@timbenniks/contentstack-platform-sdk 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.cjs +179 -0
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +2 -1
- package/dist/auth/index.d.ts +2 -1
- package/dist/auth/index.mjs +5 -1
- package/dist/{chunk-2BOUGPJ5.mjs → chunk-DTMY6LNR.mjs} +4 -4
- package/dist/{chunk-OGTRGKYK.mjs → chunk-G4JKXIL2.mjs} +4 -4
- package/dist/chunk-K3QIVKGD.mjs +430 -0
- package/dist/chunk-K3QIVKGD.mjs.map +1 -0
- package/dist/{chunk-NKLOZ5VI.mjs → chunk-V33LD4WS.mjs} +1 -1
- package/dist/chunk-V33LD4WS.mjs.map +1 -0
- package/dist/{chunk-SU5QEKYW.mjs → chunk-VLZEA5NW.mjs} +3 -3
- package/dist/chunk-VLZEA5NW.mjs.map +1 -0
- package/dist/{chunk-3C6J2BDB.mjs → chunk-WFPYU6CJ.mjs} +1 -1
- package/dist/chunk-WFPYU6CJ.mjs.map +1 -0
- package/dist/index.cjs +179 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +8 -4
- package/dist/react/auth/index.cjs.map +1 -1
- package/dist/react/auth/index.d.cts +2 -2
- package/dist/react/auth/index.d.ts +2 -2
- package/dist/react/auth/index.mjs +1 -1
- package/dist/react/hooks/index.mjs +3 -3
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.mjs +7 -7
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.mjs +3 -3
- package/dist/server/middleware/index.cjs +1 -1
- package/dist/server/middleware/index.cjs.map +1 -1
- package/dist/server/middleware/index.d.cts +3 -2
- package/dist/server/middleware/index.d.ts +3 -2
- package/dist/server/middleware/index.mjs +3 -3
- package/dist/server/proxy/index.mjs +2 -2
- package/dist/server/webhooks/index.mjs +2 -2
- package/dist/types-BPoq1WOf.d.cts +83 -0
- package/dist/types-CUCWv0Vp.d.ts +83 -0
- package/dist/ui/index.mjs +8 -8
- package/dist/vue/auth/index.cjs.map +1 -1
- package/dist/vue/auth/index.d.cts +4 -4
- package/dist/vue/auth/index.d.ts +4 -4
- package/dist/vue/auth/index.mjs +1 -1
- package/dist/vue/composables/index.mjs +3 -3
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +1 -1
- package/dist/vue/index.d.ts +1 -1
- package/dist/vue/index.mjs +10 -10
- package/package.json +1 -1
- package/dist/chunk-3C6J2BDB.mjs.map +0 -1
- package/dist/chunk-NKLOZ5VI.mjs.map +0 -1
- package/dist/chunk-SU5QEKYW.mjs.map +0 -1
- package/dist/chunk-VW7DD6HV.mjs +0 -253
- package/dist/chunk-VW7DD6HV.mjs.map +0 -1
- package/dist/types-6D9VR7pT.d.cts +0 -26
- package/dist/types-Bu5yCgmw.d.ts +0 -26
- /package/dist/{chunk-2BOUGPJ5.mjs.map → chunk-DTMY6LNR.mjs.map} +0 -0
- /package/dist/{chunk-OGTRGKYK.mjs.map → chunk-G4JKXIL2.mjs.map} +0 -0
package/dist/auth/index.cjs
CHANGED
|
@@ -20,6 +20,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/auth/index.ts
|
|
21
21
|
var auth_exports = {};
|
|
22
22
|
__export(auth_exports, {
|
|
23
|
+
OAUTH_SCOPE_DESCRIPTIONS: () => OAUTH_SCOPE_DESCRIPTIONS,
|
|
24
|
+
OAUTH_SCOPE_PRESETS: () => OAUTH_SCOPE_PRESETS,
|
|
23
25
|
buildAuthorizationUrl: () => buildAuthorizationUrl,
|
|
24
26
|
contentstackAuthCallbacks: () => contentstackAuthCallbacks,
|
|
25
27
|
createAuthProvider: () => createAuthProvider,
|
|
@@ -31,6 +33,181 @@ __export(auth_exports, {
|
|
|
31
33
|
});
|
|
32
34
|
module.exports = __toCommonJS(auth_exports);
|
|
33
35
|
|
|
36
|
+
// src/auth/scopes.ts
|
|
37
|
+
var OAUTH_SCOPE_DESCRIPTIONS = {
|
|
38
|
+
// User
|
|
39
|
+
"user:read": "View user details",
|
|
40
|
+
"user:write": "Update user details",
|
|
41
|
+
"user.assignments:read": "View user assignments",
|
|
42
|
+
// Organization
|
|
43
|
+
"organizations:read": "View details of all organizations associated with the user",
|
|
44
|
+
"organization:read": "View details of an organization",
|
|
45
|
+
"organization.logs:read": "View organization logs",
|
|
46
|
+
"organization.ownership:write": "Transfer organization ownership",
|
|
47
|
+
"organization.roles:read": "View organization-level roles",
|
|
48
|
+
"organization.share:write": "Update or remove organization invitation shares",
|
|
49
|
+
"organization.share:read": "View details of organization invitations shared with users",
|
|
50
|
+
// Stack management
|
|
51
|
+
"cm.stacks.management:read": "View all stacks",
|
|
52
|
+
"cm.stacks.management:write": "Create, update, or remove stacks",
|
|
53
|
+
"cm.stack.users:read": "View users associated with a stack",
|
|
54
|
+
"cm.stack.users:write": "Update user roles and user associations",
|
|
55
|
+
"cm.stack.management:write": "Update stack management properties",
|
|
56
|
+
"cm.stack.settings:read": "View stack settings",
|
|
57
|
+
"cm.stack:share": "Share stack invitation with users",
|
|
58
|
+
"cm.stack:unshare": "Unshare stack invitations",
|
|
59
|
+
// Tokens
|
|
60
|
+
"cm.stack.delivery-tokens:read": "View delivery tokens associated with a stack",
|
|
61
|
+
"cm.stack.delivery-tokens:write": "Create, update, or remove delivery tokens",
|
|
62
|
+
"cm.stack.management-tokens:read": "View management tokens associated with a stack",
|
|
63
|
+
"cm.stack.management-tokens:write": "Create, update, or remove management tokens",
|
|
64
|
+
// Content types
|
|
65
|
+
"cm.content-types.management:read": "View all content types",
|
|
66
|
+
"cm.content-types.management:write": "Create, update, or remove content types",
|
|
67
|
+
"cm.content-type:read": "View content type details",
|
|
68
|
+
"cm.content-types:export": "Export content types",
|
|
69
|
+
"cm.content-types:import": "Import content types",
|
|
70
|
+
// Global fields
|
|
71
|
+
"cm.global-fields.management:read": "View all global fields",
|
|
72
|
+
"cm.global-fields.management:write": "Create, update, or remove global fields",
|
|
73
|
+
"cm.global-fields:import": "Import global fields",
|
|
74
|
+
// Entries
|
|
75
|
+
"cm.entries.management:read": "View all entries",
|
|
76
|
+
"cm.entries.management:write": "Create, update, or remove entries",
|
|
77
|
+
"cm.entry:write": "Update details associated with an entry",
|
|
78
|
+
"cm.entry:read": "View details associated with an entry",
|
|
79
|
+
"cm.entries:export": "Export entries",
|
|
80
|
+
"cm.entries:import": "Import entries",
|
|
81
|
+
"cm.entry:publish": "Publish an entry",
|
|
82
|
+
"cm.entry:unpublish": "Unpublish an entry",
|
|
83
|
+
"cm.entry.workflow:write": "Set workflow stage for an entry",
|
|
84
|
+
// Bulk operations
|
|
85
|
+
"cm.bulk-operations:publish": "Publish items in bulk",
|
|
86
|
+
"cm.bulk-operations:unpublish": "Unpublish items in bulk",
|
|
87
|
+
"cm.bulk-operations:delete": "Delete items in bulk",
|
|
88
|
+
"cm.bulk-operations:workflow": "Set workflow stage in bulk",
|
|
89
|
+
// Assets
|
|
90
|
+
"cm.assets.management:read": "View all assets",
|
|
91
|
+
"cm.assets.management:write": "Create, update, or remove assets",
|
|
92
|
+
"cm.assets:download": "Download assets",
|
|
93
|
+
"cm.assets.rt:read": "View all RTE assets",
|
|
94
|
+
"cm.asset:write": "Create, update, or remove an asset",
|
|
95
|
+
"cm.asset:read": "View asset details",
|
|
96
|
+
"cm.asset:publish": "Publish an asset",
|
|
97
|
+
"cm.asset:unpublish": "Unpublish an asset",
|
|
98
|
+
// Extensions
|
|
99
|
+
"cm.extensions.management:read": "View all extensions",
|
|
100
|
+
"cm.extensions.management:write": "Create, update, or remove extensions",
|
|
101
|
+
// Releases
|
|
102
|
+
"cm.releases.management:read": "View all releases",
|
|
103
|
+
"cm.releases.management:write": "Create, update, or remove releases",
|
|
104
|
+
"cm.release:read": "View details associated with a release",
|
|
105
|
+
"cm.release:write": "Update details associated with a release",
|
|
106
|
+
"cm.release:deploy": "Deploy a release",
|
|
107
|
+
"cm.release:clone": "Clone a release",
|
|
108
|
+
// Workflows
|
|
109
|
+
"cm.workflows.management:read": "View all workflows",
|
|
110
|
+
"cm.workflows.management:write": "Create, update, or remove workflows",
|
|
111
|
+
"cm.workflows.publishing-rules:write": "Create, update, or remove workflow publishing rules",
|
|
112
|
+
"cm.workflows.publishing-rules:read": "View all workflow publishing rules",
|
|
113
|
+
// Labels
|
|
114
|
+
"cm.labels.management:read": "View all labels",
|
|
115
|
+
"cm.labels.management:write": "Create, update, or remove labels",
|
|
116
|
+
// Languages
|
|
117
|
+
"cm.languages.management:read": "View all languages",
|
|
118
|
+
"cm.languages.management:write": "Create, update, or remove languages",
|
|
119
|
+
// Environments
|
|
120
|
+
"cm.environments.management:read": "View all environments",
|
|
121
|
+
"cm.environments.management:write": "Create, update, or remove environments",
|
|
122
|
+
// Roles
|
|
123
|
+
"cm.roles.management:read": "View all roles",
|
|
124
|
+
"cm.roles.management:write": "Create, update, or remove roles",
|
|
125
|
+
// Webhooks
|
|
126
|
+
"cm.webhooks.management:read": "View all webhooks",
|
|
127
|
+
"cm.webhooks.management:write": "Create, update, or remove webhooks",
|
|
128
|
+
"cm.webhooks:export": "Export webhooks",
|
|
129
|
+
"cm.webhooks:import": "Import webhooks",
|
|
130
|
+
"cm.webhook:read": "View webhook details",
|
|
131
|
+
// Audit & publish queue
|
|
132
|
+
"cm.audit-logs:read": "View all audit logs",
|
|
133
|
+
"cm.publish-queue.management:read": "View all publish queue items",
|
|
134
|
+
"cm.publish-queue.management:write": "Create, update, or remove publish queue items",
|
|
135
|
+
// Branches
|
|
136
|
+
"cm.branches.management:read": "View all branches",
|
|
137
|
+
"cm.branches.management:write": "Create or delete a branch",
|
|
138
|
+
"cm.branch-aliases.management:read": "View all branch aliases",
|
|
139
|
+
"cm.branch-aliases.management:write": "Create, assign, or delete a branch alias",
|
|
140
|
+
// Taxonomies
|
|
141
|
+
"cm.taxonomies.management:read": "View all taxonomies",
|
|
142
|
+
"cm.taxonomies.management:write": "Create, update, or delete taxonomies",
|
|
143
|
+
"cm.taxonomy.terms:read": "View all terms of a taxonomy",
|
|
144
|
+
"cm.taxonomy.terms:write": "Create, update, move, or delete taxonomy terms",
|
|
145
|
+
// Brand Kit
|
|
146
|
+
"brand-kits:read": "View Brand Kits and Voice Profiles; use generative AI content generation",
|
|
147
|
+
"brand-kits:manage": "Create, update, or delete Brand Kits, Voice Profiles, and Knowledge Vault items",
|
|
148
|
+
// Personalization
|
|
149
|
+
"personalize:read": "View attributes, audiences, events, experiences, analytics, and regional data",
|
|
150
|
+
"personalize:manage": "Create, update, or delete personalization components",
|
|
151
|
+
// Launch
|
|
152
|
+
"launch:manage": "Read, update, and manage all Launch resources",
|
|
153
|
+
"launch.projects:read": "Read Launch projects and deployments",
|
|
154
|
+
"launch.projects:write": "Create and update Launch projects and deployments",
|
|
155
|
+
"launch.projects:delete": "Delete Launch projects"
|
|
156
|
+
};
|
|
157
|
+
var OAUTH_SCOPE_PRESETS = {
|
|
158
|
+
/** Minimal: only read the authenticated user's profile. */
|
|
159
|
+
readOnly: ["user:read"],
|
|
160
|
+
/** Read content types, entries, and assets. */
|
|
161
|
+
contentReader: [
|
|
162
|
+
"user:read",
|
|
163
|
+
"cm.content-types.management:read",
|
|
164
|
+
"cm.entries.management:read",
|
|
165
|
+
"cm.assets.management:read"
|
|
166
|
+
],
|
|
167
|
+
/** Read and write entries and assets; read content types. */
|
|
168
|
+
cmsAuthoring: [
|
|
169
|
+
"user:read",
|
|
170
|
+
"cm.content-types.management:read",
|
|
171
|
+
"cm.entries.management:read",
|
|
172
|
+
"cm.entries.management:write",
|
|
173
|
+
"cm.entry:publish",
|
|
174
|
+
"cm.entry:unpublish",
|
|
175
|
+
"cm.assets.management:read",
|
|
176
|
+
"cm.assets.management:write",
|
|
177
|
+
"cm.asset:publish",
|
|
178
|
+
"cm.asset:unpublish"
|
|
179
|
+
],
|
|
180
|
+
/** CMS authoring plus taxonomy management. */
|
|
181
|
+
cmsAuthoringWithTaxonomies: [
|
|
182
|
+
"user:read",
|
|
183
|
+
"cm.content-types.management:read",
|
|
184
|
+
"cm.entries.management:read",
|
|
185
|
+
"cm.entries.management:write",
|
|
186
|
+
"cm.entry:publish",
|
|
187
|
+
"cm.entry:unpublish",
|
|
188
|
+
"cm.assets.management:read",
|
|
189
|
+
"cm.assets.management:write",
|
|
190
|
+
"cm.asset:publish",
|
|
191
|
+
"cm.asset:unpublish",
|
|
192
|
+
"cm.taxonomies.management:read",
|
|
193
|
+
"cm.taxonomies.management:write",
|
|
194
|
+
"cm.taxonomy.terms:read",
|
|
195
|
+
"cm.taxonomy.terms:write"
|
|
196
|
+
],
|
|
197
|
+
/** Brand Kit: read and manage voice profiles and knowledge vault. */
|
|
198
|
+
brandKit: ["user:read", "brand-kits:read", "brand-kits:manage"],
|
|
199
|
+
/** Launch: manage projects and deployments. */
|
|
200
|
+
launch: [
|
|
201
|
+
"user:read",
|
|
202
|
+
"launch:manage",
|
|
203
|
+
"launch.projects:read",
|
|
204
|
+
"launch.projects:write",
|
|
205
|
+
"launch.projects:delete"
|
|
206
|
+
],
|
|
207
|
+
/** Personalization: read and manage experiences. */
|
|
208
|
+
personalization: ["user:read", "personalize:read", "personalize:manage"]
|
|
209
|
+
};
|
|
210
|
+
|
|
34
211
|
// src/http/errors.ts
|
|
35
212
|
var ContentstackError = class extends Error {
|
|
36
213
|
name = "ContentstackError";
|
|
@@ -595,6 +772,8 @@ function contentstackAuthCallbacks(config) {
|
|
|
595
772
|
}
|
|
596
773
|
// Annotate the CommonJS export names for ESM import in node:
|
|
597
774
|
0 && (module.exports = {
|
|
775
|
+
OAUTH_SCOPE_DESCRIPTIONS,
|
|
776
|
+
OAUTH_SCOPE_PRESETS,
|
|
598
777
|
buildAuthorizationUrl,
|
|
599
778
|
contentstackAuthCallbacks,
|
|
600
779
|
createAuthProvider,
|
package/dist/auth/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/index.ts","../../src/http/errors.ts","../../src/http/client.ts","../../src/regions/endpoints.ts","../../src/regions/resolver.ts","../../src/auth/pkce.ts","../../src/auth/oauth-client.ts"],"sourcesContent":["export type { OAuthConfig, OAuthTokens, ContentstackUser } from \"./types.js\"\nexport {\n buildAuthorizationUrl,\n exchangeCode,\n refreshToken,\n getUser,\n createAuthProvider,\n contentstackAuthCallbacks,\n} from \"./oauth-client.js\"\nexport { generateCodeVerifier, generateCodeChallenge } from \"./pkce.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 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 {\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","const CHARSET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~\"\n\n/**\n * Generate a cryptographically random code verifier for PKCE.\n * Returns a 43-character URL-safe string (the minimum length per RFC 7636).\n * Uses globalThis.crypto for cross-runtime compatibility (Node 18+, Deno, Bun, edge).\n */\nexport function generateCodeVerifier(): string {\n const bytes = new Uint8Array(43)\n globalThis.crypto.getRandomValues(bytes)\n let result = \"\"\n for (const byte of bytes) {\n result += CHARSET[byte % CHARSET.length]\n }\n return result\n}\n\n/**\n * Compute an S256 code challenge from a code verifier.\n * SHA-256 hash → base64url encoded (no padding).\n * Uses globalThis.crypto.subtle for cross-runtime compatibility.\n */\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", data)\n const bytes = new Uint8Array(digest)\n let binary = \"\"\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\")\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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/auth/index.ts","../../src/auth/scopes.ts","../../src/http/errors.ts","../../src/http/client.ts","../../src/regions/endpoints.ts","../../src/regions/resolver.ts","../../src/auth/pkce.ts","../../src/auth/oauth-client.ts"],"sourcesContent":["export type { OAuthConfig, OAuthTokens, ContentstackUser } from \"./types.js\"\nexport type { ContentstackOAuthScope } from \"./scopes.js\"\nexport { OAUTH_SCOPE_DESCRIPTIONS, OAUTH_SCOPE_PRESETS } from \"./scopes.js\"\nexport {\n buildAuthorizationUrl,\n exchangeCode,\n refreshToken,\n getUser,\n createAuthProvider,\n contentstackAuthCallbacks,\n} from \"./oauth-client.js\"\nexport { generateCodeVerifier, generateCodeChallenge } from \"./pkce.js\"\n","/**\n * All available Contentstack OAuth scopes.\n *\n * Use `OAUTH_SCOPE_DESCRIPTIONS` for human-readable explanations of each scope.\n * Use `OAUTH_SCOPE_PRESETS` for common scope combinations.\n *\n * @see https://www.contentstack.com/docs/developers/developer-hub/oauth-scopes\n */\nexport type ContentstackOAuthScope =\n // ── User ──────────────────────────────────────────────────────────────\n | \"user:read\"\n | \"user:write\"\n | \"user.assignments:read\"\n\n // ── Organization ──────────────────────────────────────────────────────\n | \"organizations:read\"\n | \"organization:read\"\n | \"organization.logs:read\"\n | \"organization.ownership:write\"\n | \"organization.roles:read\"\n | \"organization.share:write\"\n | \"organization.share:read\"\n\n // ── Stack management ──────────────────────────────────────────────────\n | \"cm.stacks.management:read\"\n | \"cm.stacks.management:write\"\n | \"cm.stack.users:read\"\n | \"cm.stack.users:write\"\n | \"cm.stack.management:write\"\n | \"cm.stack.settings:read\"\n | \"cm.stack:share\"\n | \"cm.stack:unshare\"\n\n // ── Tokens ────────────────────────────────────────────────────────────\n | \"cm.stack.delivery-tokens:read\"\n | \"cm.stack.delivery-tokens:write\"\n | \"cm.stack.management-tokens:read\"\n | \"cm.stack.management-tokens:write\"\n\n // ── Content types ─────────────────────────────────────────────────────\n | \"cm.content-types.management:read\"\n | \"cm.content-types.management:write\"\n | \"cm.content-type:read\"\n | \"cm.content-types:export\"\n | \"cm.content-types:import\"\n\n // ── Global fields ─────────────────────────────────────────────────────\n | \"cm.global-fields.management:read\"\n | \"cm.global-fields.management:write\"\n | \"cm.global-fields:import\"\n\n // ── Entries ────────────────────────────────────────────────────────────\n | \"cm.entries.management:read\"\n | \"cm.entries.management:write\"\n | \"cm.entry:write\"\n | \"cm.entry:read\"\n | \"cm.entries:export\"\n | \"cm.entries:import\"\n | \"cm.entry:publish\"\n | \"cm.entry:unpublish\"\n | \"cm.entry.workflow:write\"\n\n // ── Bulk operations ───────────────────────────────────────────────────\n | \"cm.bulk-operations:publish\"\n | \"cm.bulk-operations:unpublish\"\n | \"cm.bulk-operations:delete\"\n | \"cm.bulk-operations:workflow\"\n\n // ── Assets ────────────────────────────────────────────────────────────\n | \"cm.assets.management:read\"\n | \"cm.assets.management:write\"\n | \"cm.assets:download\"\n | \"cm.assets.rt:read\"\n | \"cm.asset:write\"\n | \"cm.asset:read\"\n | \"cm.asset:publish\"\n | \"cm.asset:unpublish\"\n\n // ── Extensions ────────────────────────────────────────────────────────\n | \"cm.extensions.management:read\"\n | \"cm.extensions.management:write\"\n\n // ── Releases ──────────────────────────────────────────────────────────\n | \"cm.releases.management:read\"\n | \"cm.releases.management:write\"\n | \"cm.release:read\"\n | \"cm.release:write\"\n | \"cm.release:deploy\"\n | \"cm.release:clone\"\n\n // ── Workflows ─────────────────────────────────────────────────────────\n | \"cm.workflows.management:read\"\n | \"cm.workflows.management:write\"\n | \"cm.workflows.publishing-rules:write\"\n | \"cm.workflows.publishing-rules:read\"\n\n // ── Labels ────────────────────────────────────────────────────────────\n | \"cm.labels.management:read\"\n | \"cm.labels.management:write\"\n\n // ── Languages ─────────────────────────────────────────────────────────\n | \"cm.languages.management:read\"\n | \"cm.languages.management:write\"\n\n // ── Environments ──────────────────────────────────────────────────────\n | \"cm.environments.management:read\"\n | \"cm.environments.management:write\"\n\n // ── Roles ─────────────────────────────────────────────────────────────\n | \"cm.roles.management:read\"\n | \"cm.roles.management:write\"\n\n // ── Webhooks ──────────────────────────────────────────────────────────\n | \"cm.webhooks.management:read\"\n | \"cm.webhooks.management:write\"\n | \"cm.webhooks:export\"\n | \"cm.webhooks:import\"\n | \"cm.webhook:read\"\n\n // ── Audit & publish queue ─────────────────────────────────────────────\n | \"cm.audit-logs:read\"\n | \"cm.publish-queue.management:read\"\n | \"cm.publish-queue.management:write\"\n\n // ── Branches ──────────────────────────────────────────────────────────\n | \"cm.branches.management:read\"\n | \"cm.branches.management:write\"\n | \"cm.branch-aliases.management:read\"\n | \"cm.branch-aliases.management:write\"\n\n // ── Taxonomies ────────────────────────────────────────────────────────\n | \"cm.taxonomies.management:read\"\n | \"cm.taxonomies.management:write\"\n | \"cm.taxonomy.terms:read\"\n | \"cm.taxonomy.terms:write\"\n\n // ── Brand Kit ─────────────────────────────────────────────────────────\n | \"brand-kits:read\"\n | \"brand-kits:manage\"\n\n // ── Personalization ───────────────────────────────────────────────────\n | \"personalize:read\"\n | \"personalize:manage\"\n\n // ── Launch ────────────────────────────────────────────────────────────\n | \"launch:manage\"\n | \"launch.projects:read\"\n | \"launch.projects:write\"\n | \"launch.projects:delete\"\n\n/**\n * Human-readable descriptions for every Contentstack OAuth scope.\n *\n * Useful for AI agents, documentation generators, and UI scope pickers.\n *\n * @example\n * ```ts\n * import { OAUTH_SCOPE_DESCRIPTIONS } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * // Get description for a scope\n * console.log(OAUTH_SCOPE_DESCRIPTIONS[\"cm.entries.management:read\"])\n * // → \"View all entries\"\n * ```\n */\nexport const OAUTH_SCOPE_DESCRIPTIONS: Record<ContentstackOAuthScope, string> = {\n // User\n \"user:read\": \"View user details\",\n \"user:write\": \"Update user details\",\n \"user.assignments:read\": \"View user assignments\",\n\n // Organization\n \"organizations:read\": \"View details of all organizations associated with the user\",\n \"organization:read\": \"View details of an organization\",\n \"organization.logs:read\": \"View organization logs\",\n \"organization.ownership:write\": \"Transfer organization ownership\",\n \"organization.roles:read\": \"View organization-level roles\",\n \"organization.share:write\": \"Update or remove organization invitation shares\",\n \"organization.share:read\": \"View details of organization invitations shared with users\",\n\n // Stack management\n \"cm.stacks.management:read\": \"View all stacks\",\n \"cm.stacks.management:write\": \"Create, update, or remove stacks\",\n \"cm.stack.users:read\": \"View users associated with a stack\",\n \"cm.stack.users:write\": \"Update user roles and user associations\",\n \"cm.stack.management:write\": \"Update stack management properties\",\n \"cm.stack.settings:read\": \"View stack settings\",\n \"cm.stack:share\": \"Share stack invitation with users\",\n \"cm.stack:unshare\": \"Unshare stack invitations\",\n\n // Tokens\n \"cm.stack.delivery-tokens:read\": \"View delivery tokens associated with a stack\",\n \"cm.stack.delivery-tokens:write\": \"Create, update, or remove delivery tokens\",\n \"cm.stack.management-tokens:read\": \"View management tokens associated with a stack\",\n \"cm.stack.management-tokens:write\": \"Create, update, or remove management tokens\",\n\n // Content types\n \"cm.content-types.management:read\": \"View all content types\",\n \"cm.content-types.management:write\": \"Create, update, or remove content types\",\n \"cm.content-type:read\": \"View content type details\",\n \"cm.content-types:export\": \"Export content types\",\n \"cm.content-types:import\": \"Import content types\",\n\n // Global fields\n \"cm.global-fields.management:read\": \"View all global fields\",\n \"cm.global-fields.management:write\": \"Create, update, or remove global fields\",\n \"cm.global-fields:import\": \"Import global fields\",\n\n // Entries\n \"cm.entries.management:read\": \"View all entries\",\n \"cm.entries.management:write\": \"Create, update, or remove entries\",\n \"cm.entry:write\": \"Update details associated with an entry\",\n \"cm.entry:read\": \"View details associated with an entry\",\n \"cm.entries:export\": \"Export entries\",\n \"cm.entries:import\": \"Import entries\",\n \"cm.entry:publish\": \"Publish an entry\",\n \"cm.entry:unpublish\": \"Unpublish an entry\",\n \"cm.entry.workflow:write\": \"Set workflow stage for an entry\",\n\n // Bulk operations\n \"cm.bulk-operations:publish\": \"Publish items in bulk\",\n \"cm.bulk-operations:unpublish\": \"Unpublish items in bulk\",\n \"cm.bulk-operations:delete\": \"Delete items in bulk\",\n \"cm.bulk-operations:workflow\": \"Set workflow stage in bulk\",\n\n // Assets\n \"cm.assets.management:read\": \"View all assets\",\n \"cm.assets.management:write\": \"Create, update, or remove assets\",\n \"cm.assets:download\": \"Download assets\",\n \"cm.assets.rt:read\": \"View all RTE assets\",\n \"cm.asset:write\": \"Create, update, or remove an asset\",\n \"cm.asset:read\": \"View asset details\",\n \"cm.asset:publish\": \"Publish an asset\",\n \"cm.asset:unpublish\": \"Unpublish an asset\",\n\n // Extensions\n \"cm.extensions.management:read\": \"View all extensions\",\n \"cm.extensions.management:write\": \"Create, update, or remove extensions\",\n\n // Releases\n \"cm.releases.management:read\": \"View all releases\",\n \"cm.releases.management:write\": \"Create, update, or remove releases\",\n \"cm.release:read\": \"View details associated with a release\",\n \"cm.release:write\": \"Update details associated with a release\",\n \"cm.release:deploy\": \"Deploy a release\",\n \"cm.release:clone\": \"Clone a release\",\n\n // Workflows\n \"cm.workflows.management:read\": \"View all workflows\",\n \"cm.workflows.management:write\": \"Create, update, or remove workflows\",\n \"cm.workflows.publishing-rules:write\": \"Create, update, or remove workflow publishing rules\",\n \"cm.workflows.publishing-rules:read\": \"View all workflow publishing rules\",\n\n // Labels\n \"cm.labels.management:read\": \"View all labels\",\n \"cm.labels.management:write\": \"Create, update, or remove labels\",\n\n // Languages\n \"cm.languages.management:read\": \"View all languages\",\n \"cm.languages.management:write\": \"Create, update, or remove languages\",\n\n // Environments\n \"cm.environments.management:read\": \"View all environments\",\n \"cm.environments.management:write\": \"Create, update, or remove environments\",\n\n // Roles\n \"cm.roles.management:read\": \"View all roles\",\n \"cm.roles.management:write\": \"Create, update, or remove roles\",\n\n // Webhooks\n \"cm.webhooks.management:read\": \"View all webhooks\",\n \"cm.webhooks.management:write\": \"Create, update, or remove webhooks\",\n \"cm.webhooks:export\": \"Export webhooks\",\n \"cm.webhooks:import\": \"Import webhooks\",\n \"cm.webhook:read\": \"View webhook details\",\n\n // Audit & publish queue\n \"cm.audit-logs:read\": \"View all audit logs\",\n \"cm.publish-queue.management:read\": \"View all publish queue items\",\n \"cm.publish-queue.management:write\": \"Create, update, or remove publish queue items\",\n\n // Branches\n \"cm.branches.management:read\": \"View all branches\",\n \"cm.branches.management:write\": \"Create or delete a branch\",\n \"cm.branch-aliases.management:read\": \"View all branch aliases\",\n \"cm.branch-aliases.management:write\": \"Create, assign, or delete a branch alias\",\n\n // Taxonomies\n \"cm.taxonomies.management:read\": \"View all taxonomies\",\n \"cm.taxonomies.management:write\": \"Create, update, or delete taxonomies\",\n \"cm.taxonomy.terms:read\": \"View all terms of a taxonomy\",\n \"cm.taxonomy.terms:write\": \"Create, update, move, or delete taxonomy terms\",\n\n // Brand Kit\n \"brand-kits:read\": \"View Brand Kits and Voice Profiles; use generative AI content generation\",\n \"brand-kits:manage\":\n \"Create, update, or delete Brand Kits, Voice Profiles, and Knowledge Vault items\",\n\n // Personalization\n \"personalize:read\":\n \"View attributes, audiences, events, experiences, analytics, and regional data\",\n \"personalize:manage\": \"Create, update, or delete personalization components\",\n\n // Launch\n \"launch:manage\": \"Read, update, and manage all Launch resources\",\n \"launch.projects:read\": \"Read Launch projects and deployments\",\n \"launch.projects:write\": \"Create and update Launch projects and deployments\",\n \"launch.projects:delete\": \"Delete Launch projects\",\n} as const\n\n/**\n * Pre-built scope combinations for common use cases.\n *\n * Each preset includes `user:read` as a baseline since it is required\n * for all OAuth flows that need user profile information.\n *\n * @example\n * ```ts\n * import { OAUTH_SCOPE_PRESETS } from \"@timbenniks/contentstack-platform-sdk/auth\"\n *\n * const config: OAuthConfig = {\n * scopes: OAUTH_SCOPE_PRESETS.cmsAuthoring,\n * // ...\n * }\n * ```\n */\nexport const OAUTH_SCOPE_PRESETS = {\n /** Minimal: only read the authenticated user's profile. */\n readOnly: [\"user:read\"] as const,\n\n /** Read content types, entries, and assets. */\n contentReader: [\n \"user:read\",\n \"cm.content-types.management:read\",\n \"cm.entries.management:read\",\n \"cm.assets.management:read\",\n ] as const,\n\n /** Read and write entries and assets; read content types. */\n cmsAuthoring: [\n \"user:read\",\n \"cm.content-types.management:read\",\n \"cm.entries.management:read\",\n \"cm.entries.management:write\",\n \"cm.entry:publish\",\n \"cm.entry:unpublish\",\n \"cm.assets.management:read\",\n \"cm.assets.management:write\",\n \"cm.asset:publish\",\n \"cm.asset:unpublish\",\n ] as const,\n\n /** CMS authoring plus taxonomy management. */\n cmsAuthoringWithTaxonomies: [\n \"user:read\",\n \"cm.content-types.management:read\",\n \"cm.entries.management:read\",\n \"cm.entries.management:write\",\n \"cm.entry:publish\",\n \"cm.entry:unpublish\",\n \"cm.assets.management:read\",\n \"cm.assets.management:write\",\n \"cm.asset:publish\",\n \"cm.asset:unpublish\",\n \"cm.taxonomies.management:read\",\n \"cm.taxonomies.management:write\",\n \"cm.taxonomy.terms:read\",\n \"cm.taxonomy.terms:write\",\n ] as const,\n\n /** Brand Kit: read and manage voice profiles and knowledge vault. */\n brandKit: [\"user:read\", \"brand-kits:read\", \"brand-kits:manage\"] as const,\n\n /** Launch: manage projects and deployments. */\n launch: [\n \"user:read\",\n \"launch:manage\",\n \"launch.projects:read\",\n \"launch.projects:write\",\n \"launch.projects:delete\",\n ] as const,\n\n /** Personalization: read and manage experiences. */\n personalization: [\"user:read\", \"personalize:read\", \"personalize:manage\"] as const,\n} satisfies Record<string, readonly ContentstackOAuthScope[]>\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 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 {\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","const CHARSET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~\"\n\n/**\n * Generate a cryptographically random code verifier for PKCE.\n * Returns a 43-character URL-safe string (the minimum length per RFC 7636).\n * Uses globalThis.crypto for cross-runtime compatibility (Node 18+, Deno, Bun, edge).\n */\nexport function generateCodeVerifier(): string {\n const bytes = new Uint8Array(43)\n globalThis.crypto.getRandomValues(bytes)\n let result = \"\"\n for (const byte of bytes) {\n result += CHARSET[byte % CHARSET.length]\n }\n return result\n}\n\n/**\n * Compute an S256 code challenge from a code verifier.\n * SHA-256 hash → base64url encoded (no padding).\n * Uses globalThis.crypto.subtle for cross-runtime compatibility.\n */\nexport async function generateCodeChallenge(verifier: string): Promise<string> {\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", data)\n const bytes = new Uint8Array(digest)\n let binary = \"\"\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\")\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"],"mappings":"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","names":[]}
|
package/dist/auth/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as OAuthConfig, d as OAuthTokens, a as ContentstackUser } from '../types-BPoq1WOf.cjs';
|
|
2
|
+
export { C as ContentstackOAuthScope, O as OAUTH_SCOPE_DESCRIPTIONS, b as OAUTH_SCOPE_PRESETS } from '../types-BPoq1WOf.cjs';
|
|
2
3
|
import { ContentstackRegion } from '../regions/index.cjs';
|
|
3
4
|
|
|
4
5
|
interface AuthorizationUrlOptions {
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as OAuthConfig, d as OAuthTokens, a as ContentstackUser } from '../types-CUCWv0Vp.js';
|
|
2
|
+
export { C as ContentstackOAuthScope, O as OAUTH_SCOPE_DESCRIPTIONS, b as OAUTH_SCOPE_PRESETS } from '../types-CUCWv0Vp.js';
|
|
2
3
|
import { ContentstackRegion } from '../regions/index.js';
|
|
3
4
|
|
|
4
5
|
interface AuthorizationUrlOptions {
|
package/dist/auth/index.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
+
OAUTH_SCOPE_DESCRIPTIONS,
|
|
3
|
+
OAUTH_SCOPE_PRESETS,
|
|
2
4
|
buildAuthorizationUrl,
|
|
3
5
|
contentstackAuthCallbacks,
|
|
4
6
|
createAuthProvider,
|
|
@@ -7,12 +9,14 @@ import {
|
|
|
7
9
|
generateCodeVerifier,
|
|
8
10
|
getUser,
|
|
9
11
|
refreshToken
|
|
10
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-K3QIVKGD.mjs";
|
|
11
13
|
import "../chunk-DJQLN4TR.mjs";
|
|
12
14
|
import "../chunk-4CJ4IVPJ.mjs";
|
|
13
15
|
import "../chunk-BK2IBTQS.mjs";
|
|
14
16
|
import "../chunk-DMERADWM.mjs";
|
|
15
17
|
export {
|
|
18
|
+
OAUTH_SCOPE_DESCRIPTIONS,
|
|
19
|
+
OAUTH_SCOPE_PRESETS,
|
|
16
20
|
buildAuthorizationUrl,
|
|
17
21
|
contentstackAuthCallbacks,
|
|
18
22
|
createAuthProvider,
|
|
@@ -7,6 +7,9 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
createBrandKitClient
|
|
9
9
|
} from "./chunk-XH7NLHGW.mjs";
|
|
10
|
+
import {
|
|
11
|
+
createGenerativeAIClient
|
|
12
|
+
} from "./chunk-AVJHCFRK.mjs";
|
|
10
13
|
import {
|
|
11
14
|
buildAssetsParams,
|
|
12
15
|
buildCreateEntryRequest,
|
|
@@ -17,9 +20,6 @@ import {
|
|
|
17
20
|
buildUpdateEntryRequest,
|
|
18
21
|
createCMAClient
|
|
19
22
|
} from "./chunk-EREPKWTW.mjs";
|
|
20
|
-
import {
|
|
21
|
-
createGenerativeAIClient
|
|
22
|
-
} from "./chunk-AVJHCFRK.mjs";
|
|
23
23
|
import {
|
|
24
24
|
createKnowledgeVaultClient
|
|
25
25
|
} from "./chunk-3KE63N3I.mjs";
|
|
@@ -376,4 +376,4 @@ export {
|
|
|
376
376
|
useUpdateEntry,
|
|
377
377
|
useDeleteEntry
|
|
378
378
|
};
|
|
379
|
-
//# sourceMappingURL=chunk-
|
|
379
|
+
//# sourceMappingURL=chunk-DTMY6LNR.mjs.map
|
|
@@ -7,6 +7,9 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
createBrandKitClient
|
|
9
9
|
} from "./chunk-XH7NLHGW.mjs";
|
|
10
|
+
import {
|
|
11
|
+
createGenerativeAIClient
|
|
12
|
+
} from "./chunk-AVJHCFRK.mjs";
|
|
10
13
|
import {
|
|
11
14
|
buildAssetsParams,
|
|
12
15
|
buildCreateEntryRequest,
|
|
@@ -17,9 +20,6 @@ import {
|
|
|
17
20
|
buildUpdateEntryRequest,
|
|
18
21
|
createCMAClient
|
|
19
22
|
} from "./chunk-EREPKWTW.mjs";
|
|
20
|
-
import {
|
|
21
|
-
createGenerativeAIClient
|
|
22
|
-
} from "./chunk-AVJHCFRK.mjs";
|
|
23
23
|
import {
|
|
24
24
|
createKnowledgeVaultClient
|
|
25
25
|
} from "./chunk-3KE63N3I.mjs";
|
|
@@ -365,4 +365,4 @@ export {
|
|
|
365
365
|
useUpdateEntry,
|
|
366
366
|
useDeleteEntry
|
|
367
367
|
};
|
|
368
|
-
//# sourceMappingURL=chunk-
|
|
368
|
+
//# sourceMappingURL=chunk-G4JKXIL2.mjs.map
|