@timbenniks/contentstack-platform-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.cjs +607 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +108 -0
- package/dist/auth/index.d.ts +108 -0
- package/dist/auth/index.mjs +25 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/brandkit/index.cjs +525 -0
- package/dist/brandkit/index.cjs.map +1 -0
- package/dist/brandkit/index.d.cts +95 -0
- package/dist/brandkit/index.d.ts +95 -0
- package/dist/brandkit/index.mjs +11 -0
- package/dist/brandkit/index.mjs.map +1 -0
- package/dist/chunk-3C6J2BDB.mjs +84 -0
- package/dist/chunk-3C6J2BDB.mjs.map +1 -0
- package/dist/chunk-3KE63N3I.mjs +64 -0
- package/dist/chunk-3KE63N3I.mjs.map +1 -0
- package/dist/chunk-4CJ4IVPJ.mjs +212 -0
- package/dist/chunk-4CJ4IVPJ.mjs.map +1 -0
- package/dist/chunk-4JFUI7MJ.mjs +368 -0
- package/dist/chunk-4JFUI7MJ.mjs.map +1 -0
- package/dist/chunk-7VFGD32I.mjs +26 -0
- package/dist/chunk-7VFGD32I.mjs.map +1 -0
- package/dist/chunk-ARPJDW3A.mjs +44 -0
- package/dist/chunk-ARPJDW3A.mjs.map +1 -0
- package/dist/chunk-AVJHCFRK.mjs +52 -0
- package/dist/chunk-AVJHCFRK.mjs.map +1 -0
- package/dist/chunk-BK2IBTQS.mjs +131 -0
- package/dist/chunk-BK2IBTQS.mjs.map +1 -0
- package/dist/chunk-BUZ6CQHE.mjs +75 -0
- package/dist/chunk-BUZ6CQHE.mjs.map +1 -0
- package/dist/chunk-CKMAOWBQ.mjs +379 -0
- package/dist/chunk-CKMAOWBQ.mjs.map +1 -0
- package/dist/chunk-DJQLN4TR.mjs +1 -0
- package/dist/chunk-DJQLN4TR.mjs.map +1 -0
- package/dist/chunk-DMERADWM.mjs +67 -0
- package/dist/chunk-DMERADWM.mjs.map +1 -0
- package/dist/chunk-EREPKWTW.mjs +926 -0
- package/dist/chunk-EREPKWTW.mjs.map +1 -0
- package/dist/chunk-FQP4PB5X.mjs +88 -0
- package/dist/chunk-FQP4PB5X.mjs.map +1 -0
- package/dist/chunk-GNPQJBFX.mjs +144 -0
- package/dist/chunk-GNPQJBFX.mjs.map +1 -0
- package/dist/chunk-GOSB24M6.mjs +87 -0
- package/dist/chunk-GOSB24M6.mjs.map +1 -0
- package/dist/chunk-JL2E3EOT.mjs +255 -0
- package/dist/chunk-JL2E3EOT.mjs.map +1 -0
- package/dist/chunk-JYGZBKTH.mjs +222 -0
- package/dist/chunk-JYGZBKTH.mjs.map +1 -0
- package/dist/chunk-JZE2W7VW.mjs +52 -0
- package/dist/chunk-JZE2W7VW.mjs.map +1 -0
- package/dist/chunk-K76DKSHJ.mjs +18 -0
- package/dist/chunk-K76DKSHJ.mjs.map +1 -0
- package/dist/chunk-KLVIROVU.mjs +232 -0
- package/dist/chunk-KLVIROVU.mjs.map +1 -0
- package/dist/chunk-LPVVA5J3.mjs +18 -0
- package/dist/chunk-LPVVA5J3.mjs.map +1 -0
- package/dist/chunk-NKLOZ5VI.mjs +112 -0
- package/dist/chunk-NKLOZ5VI.mjs.map +1 -0
- package/dist/chunk-QGA4WBDC.mjs +7 -0
- package/dist/chunk-QGA4WBDC.mjs.map +1 -0
- package/dist/chunk-QW7TVYOA.mjs +56 -0
- package/dist/chunk-QW7TVYOA.mjs.map +1 -0
- package/dist/chunk-SU5QEKYW.mjs +83 -0
- package/dist/chunk-SU5QEKYW.mjs.map +1 -0
- package/dist/chunk-T5A2E2RI.mjs +654 -0
- package/dist/chunk-T5A2E2RI.mjs.map +1 -0
- package/dist/chunk-T5OIJQK7.mjs +116 -0
- package/dist/chunk-T5OIJQK7.mjs.map +1 -0
- package/dist/chunk-VW7DD6HV.mjs +253 -0
- package/dist/chunk-VW7DD6HV.mjs.map +1 -0
- package/dist/chunk-XH7NLHGW.mjs +133 -0
- package/dist/chunk-XH7NLHGW.mjs.map +1 -0
- package/dist/client-DJ5haQGd.d.cts +22 -0
- package/dist/client-DwVGVSQz.d.ts +22 -0
- package/dist/cma/index.cjs +1349 -0
- package/dist/cma/index.cjs.map +1 -0
- package/dist/cma/index.d.cts +22 -0
- package/dist/cma/index.d.ts +22 -0
- package/dist/cma/index.mjs +70 -0
- package/dist/cma/index.mjs.map +1 -0
- package/dist/errors-CAw-IRCP.d.cts +65 -0
- package/dist/errors-CAw-IRCP.d.ts +65 -0
- package/dist/generative-ai/index.cjs +401 -0
- package/dist/generative-ai/index.cjs.map +1 -0
- package/dist/generative-ai/index.d.cts +31 -0
- package/dist/generative-ai/index.d.ts +31 -0
- package/dist/generative-ai/index.mjs +10 -0
- package/dist/generative-ai/index.mjs.map +1 -0
- package/dist/images/index.cjs +185 -0
- package/dist/images/index.cjs.map +1 -0
- package/dist/images/index.d.cts +27 -0
- package/dist/images/index.d.ts +27 -0
- package/dist/images/index.mjs +8 -0
- package/dist/images/index.mjs.map +1 -0
- package/dist/index.cjs +2909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.mjs +153 -0
- package/dist/index.mjs.map +1 -0
- package/dist/knowledge-vault/index.cjs +413 -0
- package/dist/knowledge-vault/index.cjs.map +1 -0
- package/dist/knowledge-vault/index.d.cts +49 -0
- package/dist/knowledge-vault/index.d.ts +49 -0
- package/dist/knowledge-vault/index.mjs +10 -0
- package/dist/knowledge-vault/index.mjs.map +1 -0
- package/dist/launch/index.cjs +624 -0
- package/dist/launch/index.cjs.map +1 -0
- package/dist/launch/index.d.cts +169 -0
- package/dist/launch/index.d.ts +169 -0
- package/dist/launch/index.mjs +11 -0
- package/dist/launch/index.mjs.map +1 -0
- package/dist/react/auth/index.cjs +113 -0
- package/dist/react/auth/index.cjs.map +1 -0
- package/dist/react/auth/index.d.cts +33 -0
- package/dist/react/auth/index.d.ts +33 -0
- package/dist/react/auth/index.mjs +13 -0
- package/dist/react/auth/index.mjs.map +1 -0
- package/dist/react/content/index.cjs +113 -0
- package/dist/react/content/index.cjs.map +1 -0
- package/dist/react/content/index.d.cts +25 -0
- package/dist/react/content/index.d.ts +25 -0
- package/dist/react/content/index.mjs +7 -0
- package/dist/react/content/index.mjs.map +1 -0
- package/dist/react/hooks/index.cjs +2097 -0
- package/dist/react/hooks/index.cjs.map +1 -0
- package/dist/react/hooks/index.d.cts +77 -0
- package/dist/react/hooks/index.d.ts +77 -0
- package/dist/react/hooks/index.mjs +46 -0
- package/dist/react/hooks/index.mjs.map +1 -0
- package/dist/react/index.cjs +2307 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +16 -0
- package/dist/react/index.d.ts +16 -0
- package/dist/react/index.mjs +67 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/react/provider/index.cjs +83 -0
- package/dist/react/provider/index.cjs.map +1 -0
- package/dist/react/provider/index.d.cts +30 -0
- package/dist/react/provider/index.d.ts +30 -0
- package/dist/react/provider/index.mjs +11 -0
- package/dist/react/provider/index.mjs.map +1 -0
- package/dist/regions/index.cjs +171 -0
- package/dist/regions/index.cjs.map +1 -0
- package/dist/regions/index.d.cts +55 -0
- package/dist/regions/index.d.ts +55 -0
- package/dist/regions/index.mjs +13 -0
- package/dist/regions/index.mjs.map +1 -0
- package/dist/request-builders-BxeolQIw.d.ts +735 -0
- package/dist/request-builders-C2IG1LUo.d.cts +735 -0
- package/dist/rte/index.cjs +683 -0
- package/dist/rte/index.cjs.map +1 -0
- package/dist/rte/index.d.cts +33 -0
- package/dist/rte/index.d.ts +33 -0
- package/dist/rte/index.mjs +17 -0
- package/dist/rte/index.mjs.map +1 -0
- package/dist/server/index.cjs +917 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +6 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.mjs +45 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/middleware/index.cjs +614 -0
- package/dist/server/middleware/index.cjs.map +1 -0
- package/dist/server/middleware/index.d.cts +77 -0
- package/dist/server/middleware/index.d.ts +77 -0
- package/dist/server/middleware/index.mjs +27 -0
- package/dist/server/middleware/index.mjs.map +1 -0
- package/dist/server/proxy/index.cjs +329 -0
- package/dist/server/proxy/index.cjs.map +1 -0
- package/dist/server/proxy/index.d.cts +143 -0
- package/dist/server/proxy/index.d.ts +143 -0
- package/dist/server/proxy/index.mjs +29 -0
- package/dist/server/proxy/index.mjs.map +1 -0
- package/dist/server/webhooks/index.cjs +131 -0
- package/dist/server/webhooks/index.cjs.map +1 -0
- package/dist/server/webhooks/index.d.cts +230 -0
- package/dist/server/webhooks/index.d.ts +230 -0
- package/dist/server/webhooks/index.mjs +23 -0
- package/dist/server/webhooks/index.mjs.map +1 -0
- package/dist/types-6D9VR7pT.d.cts +26 -0
- package/dist/types-AelT0rFJ.d.cts +21 -0
- package/dist/types-AelT0rFJ.d.ts +21 -0
- package/dist/types-Bu5yCgmw.d.ts +26 -0
- package/dist/types-DgixK-ll.d.cts +23 -0
- package/dist/types-DgixK-ll.d.ts +23 -0
- package/dist/types-DrMwdlH9.d.cts +245 -0
- package/dist/types-DrMwdlH9.d.ts +245 -0
- package/dist/ui/css/index.cjs +31 -0
- package/dist/ui/css/index.cjs.map +1 -0
- package/dist/ui/css/index.d.cts +15 -0
- package/dist/ui/css/index.d.ts +15 -0
- package/dist/ui/css/index.mjs +7 -0
- package/dist/ui/css/index.mjs.map +1 -0
- package/dist/ui/index.cjs +368 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +4 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.mjs +33 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/ui/theme/index.cjs +105 -0
- package/dist/ui/theme/index.cjs.map +1 -0
- package/dist/ui/theme/index.d.cts +33 -0
- package/dist/ui/theme/index.d.ts +33 -0
- package/dist/ui/theme/index.mjs +15 -0
- package/dist/ui/theme/index.mjs.map +1 -0
- package/dist/ui/tokens/index.cjs +286 -0
- package/dist/ui/tokens/index.cjs.map +1 -0
- package/dist/ui/tokens/index.d.cts +54 -0
- package/dist/ui/tokens/index.d.ts +54 -0
- package/dist/ui/tokens/index.mjs +17 -0
- package/dist/ui/tokens/index.mjs.map +1 -0
- package/dist/ui/tokens.css +408 -0
- package/dist/vue/auth/index.cjs +141 -0
- package/dist/vue/auth/index.cjs.map +1 -0
- package/dist/vue/auth/index.d.cts +78 -0
- package/dist/vue/auth/index.d.ts +78 -0
- package/dist/vue/auth/index.mjs +13 -0
- package/dist/vue/auth/index.mjs.map +1 -0
- package/dist/vue/composables/index.cjs +2108 -0
- package/dist/vue/composables/index.cjs.map +1 -0
- package/dist/vue/composables/index.d.cts +78 -0
- package/dist/vue/composables/index.d.ts +78 -0
- package/dist/vue/composables/index.mjs +46 -0
- package/dist/vue/composables/index.mjs.map +1 -0
- package/dist/vue/content/index.cjs +142 -0
- package/dist/vue/content/index.cjs.map +1 -0
- package/dist/vue/content/index.d.cts +47 -0
- package/dist/vue/content/index.d.ts +47 -0
- package/dist/vue/content/index.mjs +7 -0
- package/dist/vue/content/index.mjs.map +1 -0
- package/dist/vue/index.cjs +2389 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +16 -0
- package/dist/vue/index.d.ts +16 -0
- package/dist/vue/index.mjs +69 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/vue/provider/index.cjs +97 -0
- package/dist/vue/provider/index.cjs.map +1 -0
- package/dist/vue/provider/index.d.cts +90 -0
- package/dist/vue/provider/index.d.ts +90 -0
- package/dist/vue/provider/index.mjs +13 -0
- package/dist/vue/provider/index.mjs.map +1 -0
- package/package.json +195 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cma/assets.ts","../src/cma/base-client.ts","../src/cma/audit-log.ts","../src/cma/branch-aliases.ts","../src/cma/branches.ts","../src/cma/bulk.ts","../src/cma/content-types.ts","../src/cma/entries.ts","../src/cma/environments.ts","../src/cma/extensions.ts","../src/cma/global-fields.ts","../src/cma/labels.ts","../src/cma/locales.ts","../src/cma/publish-rules.ts","../src/cma/releases.ts","../src/cma/roles.ts","../src/cma/taxonomies.ts","../src/cma/tokens.ts","../src/cma/webhooks.ts","../src/cma/workflows.ts","../src/cma/client.ts","../src/cma/request-builders.ts"],"sourcesContent":["// @timbenniks/contentstack-platform-sdk — CMA AssetsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { Asset, AssetFolder, BasePublishAction } from \"./types.js\"\n\nexport type AssetPublishAction = BasePublishAction\n\nexport class AssetsClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n list(opts?: { limit?: number; folder?: string }): AsyncIterable<Asset> {\n return paginate<Asset>(\n async (skip, limit) => {\n const params: Record<string, string> = {\n skip: String(skip),\n limit: String(limit),\n }\n if (opts?.folder) params.folder = opts.folder\n\n const response = await this.http.get<{ assets: Asset[]; count?: number }>(\"/assets\", params)\n return { items: response.data.assets ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(opts?: { limit?: number; folder?: string }): Promise<Asset[]> {\n return collectAll(this.list(opts))\n }\n\n async get(uid: string): Promise<Asset> {\n const response = await this.http.get<{ asset: Asset }>(`/assets/${uid}`)\n return response.data.asset\n }\n\n async upload(form: FormData): Promise<Asset> {\n const response = await this.http.upload<{ asset: Asset }>(\"/assets\", form)\n return response.data.asset\n }\n\n async update(uid: string, data: Partial<Asset>): Promise<Asset> {\n const response = await this.http.put<{ asset: Asset }>(`/assets/${uid}`, { asset: data })\n return response.data.asset\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`/assets/${uid}`)\n }\n\n async publish(uid: string, data: AssetPublishAction): Promise<void> {\n await this.http.post(`/assets/${uid}/publish`, { asset: data })\n }\n\n async unpublish(uid: string, data: AssetPublishAction): Promise<void> {\n await this.http.post(`/assets/${uid}/unpublish`, { asset: data })\n }\n\n // ─── Folders ──────────────────────────────────────────────────────\n\n async listFolders(opts?: { limit?: number }): Promise<AssetFolder[]> {\n const response = await this.http.get<{ assets: AssetFolder[] }>(\"/assets/folders\", {\n limit: String(opts?.limit ?? 100),\n })\n return response.data.assets ?? []\n }\n\n async getFolder(uid: string): Promise<AssetFolder> {\n const response = await this.http.get<{ asset: AssetFolder }>(`/assets/folders/${uid}`)\n return response.data.asset\n }\n\n async createFolder(data: { name: string; parent_uid?: string }): Promise<AssetFolder> {\n const response = await this.http.post<{ asset: AssetFolder }>(\"/assets/folders\", {\n asset: data,\n })\n return response.data.asset\n }\n\n async updateFolder(uid: string, data: { name: string }): Promise<AssetFolder> {\n const response = await this.http.put<{ asset: AssetFolder }>(`/assets/folders/${uid}`, {\n asset: data,\n })\n return response.data.asset\n }\n\n async deleteFolder(uid: string): Promise<void> {\n await this.http.delete(`/assets/folders/${uid}`)\n }\n\n // ─── Additional Operations ──────────────────────────────────────\n\n async replace(uid: string, form: FormData): Promise<Asset> {\n const response = await this.http.upload<{ asset: Asset }>(`/assets/${uid}`, form)\n return response.data.asset\n }\n\n async getReferences(uid: string): Promise<unknown[]> {\n const response = await this.http.get<{ references: unknown[] }>(`/assets/${uid}/references`)\n return response.data.references ?? []\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA base CRUD client\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\n\nexport interface CrudConfig {\n basePath: string\n singularKey: string\n pluralKey: string\n}\n\nexport class CrudClient<T> {\n constructor(\n protected readonly http: ContentstackHttpClient,\n protected readonly config: CrudConfig,\n ) {}\n\n list(opts?: { limit?: number }): AsyncIterable<T> {\n return paginate<T>(\n async (skip, limit) => {\n const response = await this.http.get<Record<string, unknown>>(this.config.basePath, {\n skip: String(skip),\n limit: String(limit),\n })\n const items = (response.data[this.config.pluralKey] as T[]) ?? []\n return { items, count: response.data.count as number | undefined }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(opts?: { limit?: number }): Promise<T[]> {\n return collectAll(this.list(opts))\n }\n\n async get(uid: string): Promise<T> {\n const response = await this.http.get<Record<string, unknown>>(`${this.config.basePath}/${uid}`)\n return response.data[this.config.singularKey] as T\n }\n\n async create(data: Partial<T>): Promise<T> {\n const response = await this.http.post<Record<string, unknown>>(this.config.basePath, {\n [this.config.singularKey]: data,\n })\n return response.data[this.config.singularKey] as T\n }\n\n async update(uid: string, data: Partial<T>): Promise<T> {\n const response = await this.http.put<Record<string, unknown>>(\n `${this.config.basePath}/${uid}`,\n { [this.config.singularKey]: data },\n )\n return response.data[this.config.singularKey] as T\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`${this.config.basePath}/${uid}`)\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA AuditLogClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { AuditLogEntry } from \"./types.js\"\n\nexport class AuditLogClient extends CrudClient<AuditLogEntry> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/audit-logs\", singularKey: \"audit_log\", pluralKey: \"audit_logs\" })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA BranchAliasesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport type { BranchAlias } from \"./types.js\"\n\nexport class BranchAliasesClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n async list(): Promise<BranchAlias[]> {\n const response = await this.http.get<{ branch_aliases: BranchAlias[] }>(\n \"/stacks/branch_aliases\",\n )\n return response.data.branch_aliases ?? []\n }\n\n async get(uid: string): Promise<BranchAlias> {\n const response = await this.http.get<{ branch_alias: BranchAlias }>(\n `/stacks/branch_aliases/${uid}`,\n )\n return response.data.branch_alias\n }\n\n async createOrUpdate(uid: string, targetBranch: string): Promise<BranchAlias> {\n const response = await this.http.put<{ branch_alias: BranchAlias }>(\n `/stacks/branch_aliases/${uid}`,\n { branch_alias: { target_branch: targetBranch } },\n )\n return response.data.branch_alias\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`/stacks/branch_aliases/${uid}`)\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA BranchesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { Branch, MergeJob } from \"./types.js\"\n\nexport interface MergeRequest {\n base_branch: string\n compare_branch: string\n default_merge_strategy:\n | \"merge_prefer_base\"\n | \"merge_prefer_compare\"\n | \"overwrite_with_compare\"\n | \"merge_new_only\"\n | \"ignore\"\n merge_comment?: string\n item_merge_strategies?: Record<string, string>\n}\n\nexport class BranchesClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n list(opts?: { limit?: number }): AsyncIterable<Branch> {\n return paginate<Branch>(\n async (skip, limit) => {\n const response = await this.http.get<{ branches: Branch[]; count?: number }>(\n \"/stacks/branches\",\n { skip: String(skip), limit: String(limit) },\n )\n return { items: response.data.branches ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(opts?: { limit?: number }): Promise<Branch[]> {\n return collectAll(this.list(opts))\n }\n\n async get(uid: string): Promise<Branch> {\n const response = await this.http.get<{ branch: Branch }>(`/stacks/branches/${uid}`)\n return response.data.branch\n }\n\n async create(data: { uid: string; source: string }): Promise<Branch> {\n const response = await this.http.post<{ branch: Branch }>(\"/stacks/branches\", {\n branch: data,\n })\n return response.data.branch\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`/stacks/branches/${uid}`)\n }\n\n async compare(baseBranch: string, compareBranch: string): Promise<unknown> {\n const response = await this.http.get<unknown>(\"/stacks/branches_compare\", {\n base_branch: baseBranch,\n compare_branch: compareBranch,\n })\n return response.data\n }\n\n async merge(data: MergeRequest): Promise<MergeJob> {\n const response = await this.http.post<{ merge_job: MergeJob }>(\"/stacks/branches_merge\", data)\n return response.data.merge_job\n }\n\n async listMergeJobs(): Promise<MergeJob[]> {\n const response = await this.http.get<{ merge_jobs: MergeJob[] }>(\"/stacks/branches_queue\")\n return response.data.merge_jobs ?? []\n }\n\n async getMergeJob(uid: string): Promise<MergeJob> {\n const response = await this.http.get<{ merge_job: MergeJob }>(`/stacks/branches_queue/${uid}`)\n return response.data.merge_job\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA BulkOperationsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport type { BasePublishAction } from \"./types.js\"\n\nexport interface BulkEntry {\n uid: string\n content_type: string\n locale: string\n version?: number\n}\n\nexport interface BulkPublishAction extends BasePublishAction {\n entries?: BulkEntry[]\n assets?: Array<{ uid: string }>\n}\n\nexport interface BulkWorkflowAction {\n entries: Array<{\n uid: string\n content_type: string\n locale: string\n }>\n workflow_stage: {\n uid: string\n comment?: string\n }\n}\n\nexport class BulkOperationsClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n async publish(data: BulkPublishAction): Promise<void> {\n await this.http.post(\"/bulk/publish\", data)\n }\n\n async unpublish(data: BulkPublishAction): Promise<void> {\n await this.http.post(\"/bulk/unpublish\", data)\n }\n\n async delete(data: {\n entries?: Array<{ uid: string; content_type: string; locale: string }>\n assets?: Array<{ uid: string }>\n }): Promise<void> {\n await this.http.post(\"/bulk/delete\", data)\n }\n\n async updateWorkflow(data: BulkWorkflowAction): Promise<void> {\n await this.http.post(\"/bulk/workflow\", data)\n }\n\n async addItems(data: Record<string, unknown>): Promise<void> {\n await this.http.post(\"/bulk/add\", data)\n }\n\n async updateItems(data: Record<string, unknown>): Promise<void> {\n await this.http.post(\"/bulk/update\", data)\n }\n\n async jobStatus(jobId: string): Promise<unknown> {\n const response = await this.http.get<{ job: unknown }>(`/bulk/jobs/${jobId}`)\n return response.data.job\n }\n\n async getJobItems(jobId: string, opts?: { limit?: number; skip?: number }): Promise<unknown[]> {\n const params: Record<string, string> = {}\n if (opts?.limit) params.limit = String(opts.limit)\n if (opts?.skip) params.skip = String(opts.skip)\n const response = await this.http.get<{ items: unknown[] }>(\n `/bulk/jobs/${jobId}/items`,\n Object.keys(params).length > 0 ? params : undefined,\n )\n return response.data.items ?? []\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA ContentTypesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { ContentType } from \"./types.js\"\n\nexport class ContentTypesClient extends CrudClient<ContentType> {\n constructor(http: ContentstackHttpClient) {\n super(http, {\n basePath: \"/content_types\",\n singularKey: \"content_type\",\n pluralKey: \"content_types\",\n })\n }\n\n override list(opts?: { limit?: number; include_count?: boolean }): AsyncIterable<ContentType> {\n return paginate<ContentType>(\n async (skip, limit) => {\n const params: Record<string, string> = {\n skip: String(skip),\n limit: String(limit),\n }\n if (opts?.include_count) params.include_count = \"true\"\n\n const response = await this.http.get<{\n content_types: ContentType[]\n count?: number\n }>(\"/content_types\", params)\n return { items: response.data.content_types ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n override async listAll(opts?: { limit?: number; include_count?: boolean }): Promise<\n ContentType[]\n > {\n return collectAll(this.list(opts))\n }\n\n async export(uid: string): Promise<ContentType> {\n const response = await this.http.get<{ content_type: ContentType }>(\n `/content_types/${uid}/export`,\n )\n return response.data.content_type\n }\n\n async import(data: Record<string, unknown>): Promise<ContentType> {\n const response = await this.http.post<{ content_type: ContentType }>(\n \"/content_types/import\",\n data,\n )\n return response.data.content_type\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA EntriesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { BasePublishAction, Entry } from \"./types.js\"\n\nexport interface EntryListOptions {\n locale?: string\n include_publish_details?: boolean\n include_workflow?: boolean\n include_count?: boolean\n query?: Record<string, unknown>\n asc?: string\n desc?: string\n limit?: number\n}\n\nexport interface EntryGetOptions {\n locale?: string\n include_publish_details?: boolean\n include_workflow?: boolean\n version?: number\n}\n\nexport type PublishAction = BasePublishAction\n\nexport interface WorkflowStageAction {\n workflow_stage: {\n uid: string\n comment?: string\n due_date?: string\n assigned_to?: Array<{ uid: string; name: string; email: string }>\n notify?: boolean\n }\n}\n\nexport class EntriesClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n private basePath(ctUid: string): string {\n return `/content_types/${ctUid}/entries`\n }\n\n list(ctUid: string, opts?: EntryListOptions): AsyncIterable<Entry> {\n return paginate<Entry>(\n async (skip, limit) => {\n const params: Record<string, string> = {\n skip: String(skip),\n limit: String(limit),\n }\n if (opts?.locale) params.locale = opts.locale\n if (opts?.include_publish_details) params.include_publish_details = \"true\"\n if (opts?.include_workflow) params.include_workflow = \"true\"\n if (opts?.include_count) params.include_count = \"true\"\n if (opts?.query) params.query = JSON.stringify(opts.query)\n if (opts?.asc) params.asc = opts.asc\n if (opts?.desc) params.desc = opts.desc\n\n const response = await this.http.get<{ entries: Entry[]; count?: number }>(\n this.basePath(ctUid),\n params,\n )\n return { items: response.data.entries ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(ctUid: string, opts?: EntryListOptions): Promise<Entry[]> {\n return collectAll(this.list(ctUid, opts))\n }\n\n async get(ctUid: string, entryUid: string, opts?: EntryGetOptions): Promise<Entry> {\n const params: Record<string, string> = {}\n if (opts?.locale) params.locale = opts.locale\n if (opts?.include_publish_details) params.include_publish_details = \"true\"\n if (opts?.include_workflow) params.include_workflow = \"true\"\n if (opts?.version) params.version = String(opts.version)\n\n const response = await this.http.get<{ entry: Entry }>(\n `${this.basePath(ctUid)}/${entryUid}`,\n Object.keys(params).length > 0 ? params : undefined,\n )\n return response.data.entry\n }\n\n async create(ctUid: string, data: Partial<Entry>): Promise<Entry> {\n const response = await this.http.post<{ entry: Entry }>(this.basePath(ctUid), { entry: data })\n return response.data.entry\n }\n\n async update(ctUid: string, entryUid: string, data: Partial<Entry>): Promise<Entry> {\n const response = await this.http.put<{ entry: Entry }>(`${this.basePath(ctUid)}/${entryUid}`, {\n entry: data,\n })\n return response.data.entry\n }\n\n async delete(ctUid: string, entryUid: string, opts?: { locale?: string }): Promise<void> {\n let path = `${this.basePath(ctUid)}/${entryUid}`\n if (opts?.locale) path += `?locale=${encodeURIComponent(opts.locale)}`\n await this.http.delete(path)\n }\n\n async publish(ctUid: string, entryUid: string, data: PublishAction): Promise<void> {\n await this.http.post(`${this.basePath(ctUid)}/${entryUid}/publish`, { entry: data })\n }\n\n async unpublish(ctUid: string, entryUid: string, data: PublishAction): Promise<void> {\n await this.http.post(`${this.basePath(ctUid)}/${entryUid}/unpublish`, { entry: data })\n }\n\n async localize(ctUid: string, entryUid: string, data: Record<string, unknown>): Promise<Entry> {\n const response = await this.http.post<{ entry: Entry }>(\n `${this.basePath(ctUid)}/${entryUid}/localize`,\n { entry: data },\n )\n return response.data.entry\n }\n\n async setWorkflowStage(\n ctUid: string,\n entryUid: string,\n data: WorkflowStageAction,\n ): Promise<void> {\n await this.http.post(`${this.basePath(ctUid)}/${entryUid}/workflow`, data)\n }\n\n async references(ctUid: string, entryUid: string): Promise<unknown[]> {\n const response = await this.http.get<{ references: unknown[] }>(\n `${this.basePath(ctUid)}/${entryUid}/references`,\n )\n return response.data.references ?? []\n }\n\n async languages(ctUid: string, entryUid: string): Promise<unknown[]> {\n const response = await this.http.get<{ locales: unknown[] }>(\n `${this.basePath(ctUid)}/${entryUid}/languages`,\n )\n return response.data.locales ?? []\n }\n\n async versions(ctUid: string, entryUid: string): Promise<unknown[]> {\n const response = await this.http.get<{ versions: unknown[] }>(\n `${this.basePath(ctUid)}/${entryUid}/versions`,\n )\n return response.data.versions ?? []\n }\n\n async import(\n ctUid: string,\n data: Record<string, unknown>,\n opts?: { locale?: string; overwrite?: boolean },\n ): Promise<Entry> {\n let path = `${this.basePath(ctUid)}/import`\n const params: string[] = []\n if (opts?.locale) params.push(`locale=${encodeURIComponent(opts.locale)}`)\n if (opts?.overwrite) params.push(\"overwrite=true\")\n if (params.length > 0) path += `?${params.join(\"&\")}`\n\n const response = await this.http.post<{ entry: Entry }>(path, data)\n return response.data.entry\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA EnvironmentsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Environment } from \"./types.js\"\n\nexport class EnvironmentsClient extends CrudClient<Environment> {\n constructor(http: ContentstackHttpClient) {\n super(http, {\n basePath: \"/environments\",\n singularKey: \"environment\",\n pluralKey: \"environments\",\n })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA ExtensionsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Extension } from \"./types.js\"\n\nexport class ExtensionsClient extends CrudClient<Extension> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/extensions\", singularKey: \"extension\", pluralKey: \"extensions\" })\n }\n\n async upload(form: FormData): Promise<Extension> {\n const response = await this.http.upload<{ extension: Extension }>(\"/extensions\", form)\n return response.data.extension\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA GlobalFieldsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { GlobalField } from \"./types.js\"\n\nexport class GlobalFieldsClient extends CrudClient<GlobalField> {\n constructor(http: ContentstackHttpClient) {\n super(http, {\n basePath: \"/global_fields\",\n singularKey: \"global_field\",\n pluralKey: \"global_fields\",\n })\n }\n\n async export(uid: string): Promise<GlobalField> {\n const response = await this.http.get<{ global_field: GlobalField }>(\n `/global_fields/${uid}/export`,\n )\n return response.data.global_field\n }\n\n async import(data: Record<string, unknown>): Promise<GlobalField> {\n const response = await this.http.post<{ global_field: GlobalField }>(\n \"/global_fields/import\",\n data,\n )\n return response.data.global_field\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA LabelsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Label } from \"./types.js\"\n\nexport class LabelsClient extends CrudClient<Label> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/labels\", singularKey: \"label\", pluralKey: \"labels\" })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA LocalesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Locale } from \"./types.js\"\n\nexport class LocalesClient extends CrudClient<Locale> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/locales\", singularKey: \"locale\", pluralKey: \"locales\" })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA PublishRulesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { PublishRule } from \"./types.js\"\n\nexport class PublishRulesClient extends CrudClient<PublishRule> {\n constructor(http: ContentstackHttpClient) {\n super(http, {\n basePath: \"/workflows/publishing_rules\",\n singularKey: \"publishing_rule\",\n pluralKey: \"publishing_rules\",\n })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA ReleasesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { BasePublishAction, Release, ReleaseItem } from \"./types.js\"\n\nexport interface DeployAction extends BasePublishAction {\n action?: \"publish\" | \"unpublish\"\n}\n\nexport class ReleasesClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n list(opts?: { limit?: number; include_count?: boolean }): AsyncIterable<Release> {\n return paginate<Release>(\n async (skip, limit) => {\n const params: Record<string, string> = {\n skip: String(skip),\n limit: String(limit),\n }\n if (opts?.include_count) params.include_count = \"true\"\n\n const response = await this.http.get<{ releases: Release[]; count?: number }>(\n \"/releases\",\n params,\n )\n return { items: response.data.releases ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(opts?: { limit?: number }): Promise<Release[]> {\n return collectAll(this.list(opts))\n }\n\n async get(uid: string): Promise<Release> {\n const response = await this.http.get<{ release: Release }>(`/releases/${uid}`)\n return response.data.release\n }\n\n async create(data: Partial<Release>): Promise<Release> {\n const response = await this.http.post<{ release: Release }>(\"/releases\", { release: data })\n return response.data.release\n }\n\n async update(uid: string, data: Partial<Release>): Promise<Release> {\n const response = await this.http.put<{ release: Release }>(`/releases/${uid}`, {\n release: data,\n })\n return response.data.release\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`/releases/${uid}`)\n }\n\n async deploy(uid: string, data: DeployAction): Promise<void> {\n await this.http.post(`/releases/${uid}/deploy`, { release: data })\n }\n\n // ─── Items ──────────────────────────────────────────────────────\n\n async listItems(uid: string): Promise<ReleaseItem[]> {\n const response = await this.http.get<{ items: ReleaseItem[] }>(`/releases/${uid}/items`)\n return response.data.items ?? []\n }\n\n async addItem(uid: string, item: Partial<ReleaseItem>): Promise<void> {\n await this.http.post(`/releases/${uid}/items`, { item })\n }\n\n async removeItem(\n uid: string,\n item: {\n uid: string\n content_type_uid: string\n locale: string\n version: number\n action: string\n },\n ): Promise<void> {\n await this.http.post(`/releases/${uid}/items/delete`, { item })\n }\n\n async clone(uid: string, data: { name: string; description?: string }): Promise<Release> {\n const response = await this.http.post<{ release: Release }>(`/releases/${uid}/clone`, {\n release: data,\n })\n return response.data.release\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA RolesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Role } from \"./types.js\"\n\nexport class RolesClient extends CrudClient<Role> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/roles\", singularKey: \"role\", pluralKey: \"roles\" })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA TaxonomiesClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { collectAll, paginate } from \"./pagination.js\"\nimport type { Taxonomy, TaxonomyTerm } from \"./types.js\"\n\nexport class TaxonomiesClient {\n constructor(private readonly http: ContentstackHttpClient) {}\n\n // ─── Taxonomies ───────────────────────────────────────────────────\n\n list(opts?: { limit?: number }): AsyncIterable<Taxonomy> {\n return paginate<Taxonomy>(\n async (skip, limit) => {\n const response = await this.http.get<{ taxonomies: Taxonomy[]; count?: number }>(\n \"/taxonomies\",\n { skip: String(skip), limit: String(limit) },\n )\n return { items: response.data.taxonomies ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAll(opts?: { limit?: number }): Promise<Taxonomy[]> {\n return collectAll(this.list(opts))\n }\n\n async get(uid: string): Promise<Taxonomy> {\n const response = await this.http.get<{ taxonomy: Taxonomy }>(`/taxonomies/${uid}`)\n return response.data.taxonomy\n }\n\n async create(data: Partial<Taxonomy>): Promise<Taxonomy> {\n const response = await this.http.post<{ taxonomy: Taxonomy }>(\"/taxonomies\", {\n taxonomy: data,\n })\n return response.data.taxonomy\n }\n\n async update(uid: string, data: Partial<Taxonomy>): Promise<Taxonomy> {\n const response = await this.http.put<{ taxonomy: Taxonomy }>(`/taxonomies/${uid}`, {\n taxonomy: data,\n })\n return response.data.taxonomy\n }\n\n async delete(uid: string): Promise<void> {\n await this.http.delete(`/taxonomies/${uid}`)\n }\n\n // ─── Terms ────────────────────────────────────────────────────────\n\n listTerms(taxonomyUid: string, opts?: { limit?: number }): AsyncIterable<TaxonomyTerm> {\n return paginate<TaxonomyTerm>(\n async (skip, limit) => {\n const response = await this.http.get<{ terms: TaxonomyTerm[]; count?: number }>(\n `/taxonomies/${taxonomyUid}/terms`,\n { skip: String(skip), limit: String(limit) },\n )\n return { items: response.data.terms ?? [], count: response.data.count }\n },\n { limit: opts?.limit },\n )\n }\n\n async listAllTerms(taxonomyUid: string, opts?: { limit?: number }): Promise<TaxonomyTerm[]> {\n return collectAll(this.listTerms(taxonomyUid, opts))\n }\n\n async getTerm(taxonomyUid: string, termUid: string): Promise<TaxonomyTerm> {\n const response = await this.http.get<{ term: TaxonomyTerm }>(\n `/taxonomies/${taxonomyUid}/terms/${termUid}`,\n )\n return response.data.term\n }\n\n async createTerm(taxonomyUid: string, data: Partial<TaxonomyTerm>): Promise<TaxonomyTerm> {\n const response = await this.http.post<{ term: TaxonomyTerm }>(\n `/taxonomies/${taxonomyUid}/terms`,\n { term: data },\n )\n return response.data.term\n }\n\n async updateTerm(\n taxonomyUid: string,\n termUid: string,\n data: Partial<TaxonomyTerm>,\n ): Promise<TaxonomyTerm> {\n const response = await this.http.put<{ term: TaxonomyTerm }>(\n `/taxonomies/${taxonomyUid}/terms/${termUid}`,\n { term: data },\n )\n return response.data.term\n }\n\n async deleteTerm(taxonomyUid: string, termUid: string): Promise<void> {\n await this.http.delete(`/taxonomies/${taxonomyUid}/terms/${termUid}`)\n }\n\n async ancestors(taxonomyUid: string, termUid: string): Promise<TaxonomyTerm[]> {\n const response = await this.http.get<{ terms: TaxonomyTerm[] }>(\n `/taxonomies/${taxonomyUid}/terms/${termUid}/ancestors`,\n )\n return response.data.terms ?? []\n }\n\n async descendants(taxonomyUid: string, termUid: string): Promise<TaxonomyTerm[]> {\n const response = await this.http.get<{ terms: TaxonomyTerm[] }>(\n `/taxonomies/${taxonomyUid}/terms/${termUid}/descendants`,\n )\n return response.data.terms ?? []\n }\n\n async moveTerm(\n taxonomyUid: string,\n termUid: string,\n data: { parent_uid?: string; order: number },\n ): Promise<TaxonomyTerm> {\n const response = await this.http.put<{ term: TaxonomyTerm }>(\n `/taxonomies/${taxonomyUid}/terms/${termUid}/move`,\n { term: data },\n )\n return response.data.term\n }\n\n // ─── Import / Export ──────────────────────────────────────────────\n\n async export(uid: string): Promise<Taxonomy> {\n const response = await this.http.get<{ taxonomy: Taxonomy }>(`/taxonomies/${uid}/export`)\n return response.data.taxonomy\n }\n\n async import(data: Record<string, unknown>): Promise<Taxonomy> {\n const response = await this.http.post<{ taxonomy: Taxonomy }>(\"/taxonomies/import\", data)\n return response.data.taxonomy\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA TokensClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport type { DeliveryToken, ManagementToken, PreviewToken } from \"./types.js\"\n\nfunction tokenCrud<T>(http: ContentstackHttpClient, basePath: string) {\n return {\n async list(): Promise<T[]> {\n const response = await http.get<{ tokens: T[] }>(basePath)\n return response.data.tokens ?? []\n },\n async get(uid: string): Promise<T> {\n const response = await http.get<{ token: T }>(`${basePath}/${uid}`)\n return response.data.token\n },\n async create(data: Partial<T>): Promise<T> {\n const response = await http.post<{ token: T }>(basePath, { token: data })\n return response.data.token\n },\n async update(uid: string, data: Partial<T>): Promise<T> {\n const response = await http.put<{ token: T }>(`${basePath}/${uid}`, { token: data })\n return response.data.token\n },\n async delete(uid: string): Promise<void> {\n await http.delete(`${basePath}/${uid}`)\n },\n }\n}\n\nexport class TokensClient {\n private management: ReturnType<typeof tokenCrud<ManagementToken>>\n private delivery: ReturnType<typeof tokenCrud<DeliveryToken>>\n private preview: ReturnType<typeof tokenCrud<PreviewToken>>\n\n constructor(http: ContentstackHttpClient) {\n this.management = tokenCrud<ManagementToken>(http, \"/stacks/management_tokens\")\n this.delivery = tokenCrud<DeliveryToken>(http, \"/stacks/delivery_tokens\")\n this.preview = tokenCrud<PreviewToken>(http, \"/stacks/preview_tokens\")\n }\n\n // ─── Management Tokens ────────────────────────────────────────────\n\n listManagementTokens() {\n return this.management.list()\n }\n getManagementToken(uid: string) {\n return this.management.get(uid)\n }\n createManagementToken(data: Partial<ManagementToken>) {\n return this.management.create(data)\n }\n updateManagementToken(uid: string, data: Partial<ManagementToken>) {\n return this.management.update(uid, data)\n }\n deleteManagementToken(uid: string) {\n return this.management.delete(uid)\n }\n\n // ─── Delivery Tokens ──────────────────────────────────────────────\n\n listDeliveryTokens() {\n return this.delivery.list()\n }\n getDeliveryToken(uid: string) {\n return this.delivery.get(uid)\n }\n createDeliveryToken(data: Partial<DeliveryToken>) {\n return this.delivery.create(data)\n }\n updateDeliveryToken(uid: string, data: Partial<DeliveryToken>) {\n return this.delivery.update(uid, data)\n }\n deleteDeliveryToken(uid: string) {\n return this.delivery.delete(uid)\n }\n\n // ─── Preview Tokens ──────────────────────────────────────────────\n\n listPreviewTokens() {\n return this.preview.list()\n }\n getPreviewToken(uid: string) {\n return this.preview.get(uid)\n }\n createPreviewToken(data: Partial<PreviewToken>) {\n return this.preview.create(data)\n }\n updatePreviewToken(uid: string, data: Partial<PreviewToken>) {\n return this.preview.update(uid, data)\n }\n deletePreviewToken(uid: string) {\n return this.preview.delete(uid)\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA WebhooksClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Webhook } from \"./types.js\"\n\nexport class WebhooksClient extends CrudClient<Webhook> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/webhooks\", singularKey: \"webhook\", pluralKey: \"webhooks\" })\n }\n\n async logs(uid: string): Promise<unknown[]> {\n const response = await this.http.get<{ logs: unknown[] }>(`/webhooks/${uid}/logs`)\n return response.data.logs ?? []\n }\n\n async retry(uid: string, executionUid: string): Promise<void> {\n await this.http.post(`/webhooks/${uid}/retry/${executionUid}`, {})\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA WorkflowsClient\n\nimport type { ContentstackHttpClient } from \"../http/client.js\"\nimport { CrudClient } from \"./base-client.js\"\nimport type { Workflow } from \"./types.js\"\n\nexport class WorkflowsClient extends CrudClient<Workflow> {\n constructor(http: ContentstackHttpClient) {\n super(http, { basePath: \"/workflows\", singularKey: \"workflow\", pluralKey: \"workflows\" })\n }\n}\n","// @timbenniks/contentstack-platform-sdk — CMA client factory\n\nimport { ContentstackHttpClient } from \"../http/client.js\"\nimport type { HttpClientConfig } from \"../http/types.js\"\nimport type { ContentstackRegion } from \"../regions/resolver.js\"\nimport { resolveEndpoints } from \"../regions/resolver.js\"\nimport { AssetsClient } from \"./assets.js\"\nimport { AuditLogClient } from \"./audit-log.js\"\nimport { BranchAliasesClient } from \"./branch-aliases.js\"\nimport { BranchesClient } from \"./branches.js\"\nimport { BulkOperationsClient } from \"./bulk.js\"\nimport { ContentTypesClient } from \"./content-types.js\"\nimport { EntriesClient } from \"./entries.js\"\nimport { EnvironmentsClient } from \"./environments.js\"\nimport { ExtensionsClient } from \"./extensions.js\"\nimport { GlobalFieldsClient } from \"./global-fields.js\"\nimport { LabelsClient } from \"./labels.js\"\nimport { LocalesClient } from \"./locales.js\"\nimport { PublishRulesClient } from \"./publish-rules.js\"\nimport { ReleasesClient } from \"./releases.js\"\nimport { RolesClient } from \"./roles.js\"\nimport { TaxonomiesClient } from \"./taxonomies.js\"\nimport { TokensClient } from \"./tokens.js\"\nimport { WebhooksClient } from \"./webhooks.js\"\nimport { WorkflowsClient } from \"./workflows.js\"\n\nexport interface CMAClientConfig {\n region: ContentstackRegion\n apiKey: string\n auth:\n | { type: \"management-token\"; token: string }\n | { type: \"oauth\"; accessToken: string }\n | { type: \"authtoken\"; token: string }\n branch?: string\n httpOptions?: Partial<HttpClientConfig>\n}\n\nexport interface CMAClient {\n entries: EntriesClient\n contentTypes: ContentTypesClient\n assets: AssetsClient\n environments: EnvironmentsClient\n locales: LocalesClient\n globalFields: GlobalFieldsClient\n webhooks: WebhooksClient\n workflows: WorkflowsClient\n releases: ReleasesClient\n branches: BranchesClient\n branchAliases: BranchAliasesClient\n taxonomies: TaxonomiesClient\n bulk: BulkOperationsClient\n tokens: TokensClient\n labels: LabelsClient\n roles: RolesClient\n auditLog: AuditLogClient\n extensions: ExtensionsClient\n publishRules: PublishRulesClient\n onBranch(branchUid: string): CMAClient\n}\n\nexport function createCMAClient(config: CMAClientConfig): CMAClient {\n const endpoints = resolveEndpoints(config.region)\n\n const headers: Record<string, string> = { api_key: config.apiKey }\n\n switch (config.auth.type) {\n case \"management-token\":\n headers.authorization = config.auth.token\n break\n case \"oauth\":\n headers.authorization = `Bearer ${config.auth.accessToken}`\n break\n case \"authtoken\":\n headers.authtoken = config.auth.token\n break\n }\n\n if (config.branch) {\n headers.branch = config.branch\n }\n\n const http = new ContentstackHttpClient({\n ...config.httpOptions,\n baseUrl: config.httpOptions?.baseUrl ?? `${endpoints.cma}/v3`,\n headers: {\n ...config.httpOptions?.headers,\n ...headers,\n },\n })\n\n return {\n entries: new EntriesClient(http),\n contentTypes: new ContentTypesClient(http),\n assets: new AssetsClient(http),\n environments: new EnvironmentsClient(http),\n locales: new LocalesClient(http),\n globalFields: new GlobalFieldsClient(http),\n webhooks: new WebhooksClient(http),\n workflows: new WorkflowsClient(http),\n releases: new ReleasesClient(http),\n branches: new BranchesClient(http),\n branchAliases: new BranchAliasesClient(http),\n taxonomies: new TaxonomiesClient(http),\n bulk: new BulkOperationsClient(http),\n tokens: new TokensClient(http),\n labels: new LabelsClient(http),\n roles: new RolesClient(http),\n auditLog: new AuditLogClient(http),\n extensions: new ExtensionsClient(http),\n publishRules: new PublishRulesClient(http),\n onBranch(branchUid: string): CMAClient {\n return createCMAClient({ ...config, branch: branchUid })\n },\n }\n}\n","/**\n * Framework-agnostic request builders for CMA operations.\n *\n * These pure functions build paths, query parameters, and request bodies\n * for Contentstack CMA endpoints. Both React hooks and Vue composables\n * use them to avoid duplicating request construction logic.\n */\n\n// ── Query parameter types ───────────────────────────────────────────────────\n\nexport interface EntryQueryParams {\n locale?: string\n version?: number\n includePublishDetails?: boolean\n}\n\nexport interface EntriesQueryParams {\n locale?: string\n limit?: number\n skip?: number\n includePublishDetails?: boolean\n query?: Record<string, unknown>\n}\n\nexport interface AssetsQueryParams {\n folder?: string\n limit?: number\n skip?: number\n}\n\n// ── Mutation variable types ─────────────────────────────────────────────────\n\nexport interface CreateEntryVariables {\n contentTypeUid: string\n entry: Record<string, unknown>\n locale?: string\n}\n\nexport interface UpdateEntryVariables {\n contentTypeUid: string\n entryUid: string\n entry: Record<string, unknown>\n locale?: string\n}\n\nexport interface DeleteEntryVariables {\n contentTypeUid: string\n entryUid: string\n locale?: string\n deleteAllLocalized?: boolean\n}\n\nexport interface PublishEntryVariables {\n contentTypeUid: string\n entryUid: string\n environments: string[]\n locales: string[]\n scheduledAt?: string\n}\n\n// ── Param builders ──────────────────────────────────────────────────────────\n\nfunction nonEmptyParams(params: Record<string, string>): Record<string, string> | undefined {\n return Object.keys(params).length > 0 ? params : undefined\n}\n\nexport function buildEntryParams(options?: EntryQueryParams): Record<string, string> | undefined {\n if (!options) return undefined\n const params: Record<string, string> = {}\n if (options.locale) params.locale = options.locale\n if (options.version !== undefined) params.version = String(options.version)\n if (options.includePublishDetails) params.include_publish_details = \"true\"\n return nonEmptyParams(params)\n}\n\nexport function buildEntriesParams(\n options?: EntriesQueryParams,\n): Record<string, string> | undefined {\n if (!options) return undefined\n const params: Record<string, string> = {}\n if (options.locale) params.locale = options.locale\n if (options.limit !== undefined) params.limit = String(options.limit)\n if (options.skip !== undefined) params.skip = String(options.skip)\n if (options.includePublishDetails) params.include_publish_details = \"true\"\n if (options.query) params.query = JSON.stringify(options.query)\n return nonEmptyParams(params)\n}\n\nexport function buildAssetsParams(options?: AssetsQueryParams): Record<string, string> | undefined {\n if (!options) return undefined\n const params: Record<string, string> = {}\n if (options.folder) params.folder = options.folder\n if (options.limit !== undefined) params.limit = String(options.limit)\n if (options.skip !== undefined) params.skip = String(options.skip)\n return nonEmptyParams(params)\n}\n\n// ── Request builders (for mutations) ────────────────────────────────────────\n\nfunction appendQueryString(path: string, params: URLSearchParams): string {\n const query = params.toString()\n return query ? `${path}?${query}` : path\n}\n\nexport function buildCreateEntryRequest(vars: CreateEntryVariables): {\n path: string\n body: unknown\n} {\n const params = new URLSearchParams()\n if (vars.locale) params.set(\"locale\", vars.locale)\n return {\n path: appendQueryString(`/content_types/${vars.contentTypeUid}/entries`, params),\n body: { entry: vars.entry },\n }\n}\n\nexport function buildUpdateEntryRequest(vars: UpdateEntryVariables): {\n path: string\n body: unknown\n} {\n const params = new URLSearchParams()\n if (vars.locale) params.set(\"locale\", vars.locale)\n return {\n path: appendQueryString(\n `/content_types/${vars.contentTypeUid}/entries/${vars.entryUid}`,\n params,\n ),\n body: { entry: vars.entry },\n }\n}\n\nexport function buildDeleteEntryRequest(vars: DeleteEntryVariables): { path: string } {\n const params = new URLSearchParams()\n if (vars.locale) params.set(\"locale\", vars.locale)\n if (vars.deleteAllLocalized) params.set(\"delete_all_localized\", \"true\")\n return {\n path: appendQueryString(\n `/content_types/${vars.contentTypeUid}/entries/${vars.entryUid}`,\n params,\n ),\n }\n}\n\nexport function buildPublishEntryRequest(vars: PublishEntryVariables): {\n path: string\n body: unknown\n} {\n return {\n path: `/content_types/${vars.contentTypeUid}/entries/${vars.entryUid}/publish`,\n body: {\n entry: {\n environments: vars.environments,\n locales: vars.locales,\n ...(vars.scheduledAt ? { scheduled_at: vars.scheduledAt } : {}),\n },\n },\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContentstackAuthError
|
|
3
|
+
} from "./chunk-DMERADWM.mjs";
|
|
4
|
+
|
|
5
|
+
// src/server/webhooks/verify.ts
|
|
6
|
+
function hexDecode(hex) {
|
|
7
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
8
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
9
|
+
bytes[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16);
|
|
10
|
+
}
|
|
11
|
+
return bytes;
|
|
12
|
+
}
|
|
13
|
+
function timingSafeEqual(a, b) {
|
|
14
|
+
if (a.length !== b.length) return false;
|
|
15
|
+
let result = 0;
|
|
16
|
+
for (let i = 0; i < a.length; i++) {
|
|
17
|
+
result |= (a[i] ?? 0) ^ (b[i] ?? 0);
|
|
18
|
+
}
|
|
19
|
+
return result === 0;
|
|
20
|
+
}
|
|
21
|
+
async function verifyWebhookSignature(body, signature, secret) {
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
const key = await globalThis.crypto.subtle.importKey(
|
|
24
|
+
"raw",
|
|
25
|
+
encoder.encode(secret),
|
|
26
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
27
|
+
false,
|
|
28
|
+
["sign"]
|
|
29
|
+
);
|
|
30
|
+
const expectedBuffer = await globalThis.crypto.subtle.sign("HMAC", key, encoder.encode(body));
|
|
31
|
+
const expectedBytes = new Uint8Array(expectedBuffer);
|
|
32
|
+
const signatureBytes = hexDecode(signature);
|
|
33
|
+
return timingSafeEqual(expectedBytes, signatureBytes);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/server/webhooks/handler.ts
|
|
37
|
+
var SIGNATURE_HEADER = "x-contentstack-request-signature";
|
|
38
|
+
function parseWebhookBody(body) {
|
|
39
|
+
const raw = JSON.parse(body);
|
|
40
|
+
const module = raw.module;
|
|
41
|
+
const event = raw.event;
|
|
42
|
+
const type = `${module}.${event}`;
|
|
43
|
+
return {
|
|
44
|
+
...raw,
|
|
45
|
+
type,
|
|
46
|
+
module,
|
|
47
|
+
event
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function createWebhookHandler(config) {
|
|
51
|
+
return {
|
|
52
|
+
/**
|
|
53
|
+
* Read the request body, verify the signature, and return a typed event.
|
|
54
|
+
* Throws `ContentstackAuthError` if the signature is missing or invalid.
|
|
55
|
+
*/
|
|
56
|
+
async verify(request) {
|
|
57
|
+
const body = await request.text();
|
|
58
|
+
const signature = request.headers.get(SIGNATURE_HEADER);
|
|
59
|
+
if (!signature) {
|
|
60
|
+
throw new ContentstackAuthError("Missing webhook signature header", {
|
|
61
|
+
status: 401,
|
|
62
|
+
requestPath: new URL(request.url).pathname
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const valid = await verifyWebhookSignature(body, signature, config.secret);
|
|
66
|
+
if (!valid) {
|
|
67
|
+
throw new ContentstackAuthError("Invalid webhook signature", {
|
|
68
|
+
status: 401,
|
|
69
|
+
requestPath: new URL(request.url).pathname
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return parseWebhookBody(body);
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* Read the request body and return a typed event without verifying the signature.
|
|
76
|
+
*/
|
|
77
|
+
async parse(request) {
|
|
78
|
+
const body = await request.text();
|
|
79
|
+
return parseWebhookBody(body);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
verifyWebhookSignature,
|
|
86
|
+
createWebhookHandler
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=chunk-FQP4PB5X.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/webhooks/verify.ts","../src/server/webhooks/handler.ts"],"sourcesContent":["/**\n * Webhook signature verification using HMAC-SHA256.\n * Uses the Web Crypto API for cross-runtime compatibility (Node 18+, Deno, Bun, edge).\n */\n\nfunction hexEncode(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let hex = \"\"\n for (const byte of bytes) {\n hex += byte.toString(16).padStart(2, \"0\")\n }\n return hex\n}\n\nfunction hexDecode(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2)\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.substring(i, i + 2), 16)\n }\n return bytes\n}\n\n/**\n * Constant-time comparison of two byte arrays.\n * Prevents timing attacks by always comparing all bytes regardless of mismatch.\n */\nfunction timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= (a[i] ?? 0) ^ (b[i] ?? 0)\n }\n return result === 0\n}\n\n/**\n * Verify a Contentstack webhook signature using HMAC-SHA256.\n *\n * @param body - The raw request body string\n * @param signature - The hex-encoded signature from the `X-Contentstack-Request-Signature` header\n * @param secret - The webhook secret configured in Contentstack\n * @returns `true` if the signature is valid\n */\nexport async function verifyWebhookSignature(\n body: string,\n signature: string,\n secret: string,\n): Promise<boolean> {\n const encoder = new TextEncoder()\n const key = await globalThis.crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n )\n\n const expectedBuffer = await globalThis.crypto.subtle.sign(\"HMAC\", key, encoder.encode(body))\n const expectedBytes = new Uint8Array(expectedBuffer)\n const signatureBytes = hexDecode(signature)\n\n return timingSafeEqual(expectedBytes, signatureBytes)\n}\n","import { ContentstackAuthError } from \"../../index.js\"\nimport type { WebhookEvent, WebhookHandlerConfig } from \"./types.js\"\nimport { verifyWebhookSignature } from \"./verify.js\"\n\nconst SIGNATURE_HEADER = \"x-contentstack-request-signature\"\n\nfunction parseWebhookBody(body: string): WebhookEvent {\n const raw = JSON.parse(body) as Record<string, unknown>\n const module = raw.module as string\n const event = raw.event as string\n const type = `${module}.${event}`\n\n return {\n ...raw,\n type,\n module,\n event,\n } as WebhookEvent\n}\n\n/**\n * Create a webhook handler with signature verification and typed event parsing.\n *\n * @example\n * ```ts\n * const handler = createWebhookHandler({ secret: process.env.WEBHOOK_SECRET })\n *\n * // In a route handler:\n * const event = await handler.verify(request)\n * if (event.type === \"entry.publish\") {\n * console.log(event.data.entry.uid)\n * }\n * ```\n */\nexport function createWebhookHandler(config: WebhookHandlerConfig) {\n return {\n /**\n * Read the request body, verify the signature, and return a typed event.\n * Throws `ContentstackAuthError` if the signature is missing or invalid.\n */\n async verify(request: Request): Promise<WebhookEvent> {\n const body = await request.text()\n const signature = request.headers.get(SIGNATURE_HEADER)\n\n if (!signature) {\n throw new ContentstackAuthError(\"Missing webhook signature header\", {\n status: 401,\n requestPath: new URL(request.url).pathname,\n })\n }\n\n const valid = await verifyWebhookSignature(body, signature, config.secret)\n if (!valid) {\n throw new ContentstackAuthError(\"Invalid webhook signature\", {\n status: 401,\n requestPath: new URL(request.url).pathname,\n })\n }\n\n return parseWebhookBody(body)\n },\n\n /**\n * Read the request body and return a typed event without verifying the signature.\n */\n async parse(request: Request): Promise<WebhookEvent> {\n const body = await request.text()\n return parseWebhookBody(body)\n },\n }\n}\n"],"mappings":";;;;;AAcA,SAAS,UAAU,KAAyB;AAC1C,QAAM,QAAQ,IAAI,WAAW,IAAI,SAAS,CAAC;AAC3C,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,CAAC,IAAI,OAAO,SAAS,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;AAMA,SAAS,gBAAgB,GAAe,GAAwB;AAC9D,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,eAAW,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK;AAAA,EACnC;AACA,SAAO,WAAW;AACpB;AAUA,eAAsB,uBACpB,MACA,WACA,QACkB;AAClB,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,MAAM,MAAM,WAAW,OAAO,OAAO;AAAA,IACzC;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAM,WAAW,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,IAAI,CAAC;AAC5F,QAAM,gBAAgB,IAAI,WAAW,cAAc;AACnD,QAAM,iBAAiB,UAAU,SAAS;AAE1C,SAAO,gBAAgB,eAAe,cAAc;AACtD;;;AC1DA,IAAM,mBAAmB;AAEzB,SAAS,iBAAiB,MAA4B;AACpD,QAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,QAAM,SAAS,IAAI;AACnB,QAAM,QAAQ,IAAI;AAClB,QAAM,OAAO,GAAG,MAAM,IAAI,KAAK;AAE/B,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAgBO,SAAS,qBAAqB,QAA8B;AACjE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,MAAM,OAAO,SAAyC;AACpD,YAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,YAAM,YAAY,QAAQ,QAAQ,IAAI,gBAAgB;AAEtD,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,sBAAsB,oCAAoC;AAAA,UAClE,QAAQ;AAAA,UACR,aAAa,IAAI,IAAI,QAAQ,GAAG,EAAE;AAAA,QACpC,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,MAAM,uBAAuB,MAAM,WAAW,OAAO,MAAM;AACzE,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,sBAAsB,6BAA6B;AAAA,UAC3D,QAAQ;AAAA,UACR,aAAa,IAAI,IAAI,QAAQ,GAAG,EAAE;AAAA,QACpC,CAAC;AAAA,MACH;AAEA,aAAO,iBAAiB,IAAI;AAAA,IAC9B;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,MAAM,SAAyC;AACnD,YAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,aAAO,iBAAiB,IAAI;AAAA,IAC9B;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContentstackConfigError
|
|
3
|
+
} from "./chunk-DMERADWM.mjs";
|
|
4
|
+
|
|
5
|
+
// src/images/builder.ts
|
|
6
|
+
var VALID_FORMATS = /* @__PURE__ */ new Set(["webp", "jpg", "png", "gif", "avif", "pjpg"]);
|
|
7
|
+
var VALID_FITS = /* @__PURE__ */ new Set(["bounds", "crop", "cover"]);
|
|
8
|
+
var VALID_FILTERS = /* @__PURE__ */ new Set([
|
|
9
|
+
"nearest",
|
|
10
|
+
"bilinear",
|
|
11
|
+
"bicubic",
|
|
12
|
+
"lanczos2",
|
|
13
|
+
"lanczos3"
|
|
14
|
+
]);
|
|
15
|
+
var ImageTransformBuilderImpl = class _ImageTransformBuilderImpl {
|
|
16
|
+
constructor(assetUrl, params = {}) {
|
|
17
|
+
this.assetUrl = assetUrl;
|
|
18
|
+
this.params = params;
|
|
19
|
+
}
|
|
20
|
+
width(px) {
|
|
21
|
+
assertPositiveInteger("width", px);
|
|
22
|
+
return this.with("width", String(px));
|
|
23
|
+
}
|
|
24
|
+
height(px) {
|
|
25
|
+
assertPositiveInteger("height", px);
|
|
26
|
+
return this.with("height", String(px));
|
|
27
|
+
}
|
|
28
|
+
quality(q) {
|
|
29
|
+
if (!Number.isInteger(q) || q < 1 || q > 100) {
|
|
30
|
+
throw new ContentstackConfigError("quality() expects an integer between 1 and 100");
|
|
31
|
+
}
|
|
32
|
+
return this.with("quality", String(q));
|
|
33
|
+
}
|
|
34
|
+
format(fmt) {
|
|
35
|
+
if (!VALID_FORMATS.has(fmt)) {
|
|
36
|
+
throw new ContentstackConfigError(`Unsupported image format: ${fmt}`);
|
|
37
|
+
}
|
|
38
|
+
return this.with("format", fmt);
|
|
39
|
+
}
|
|
40
|
+
fit(mode) {
|
|
41
|
+
if (!VALID_FITS.has(mode)) {
|
|
42
|
+
throw new ContentstackConfigError(`Unsupported fit mode: ${mode}`);
|
|
43
|
+
}
|
|
44
|
+
return this.with("fit", mode);
|
|
45
|
+
}
|
|
46
|
+
crop(params) {
|
|
47
|
+
return this.withNonEmptyString("crop", params);
|
|
48
|
+
}
|
|
49
|
+
trim(edges) {
|
|
50
|
+
return this.withNonEmptyString("trim", edges);
|
|
51
|
+
}
|
|
52
|
+
orient(angle) {
|
|
53
|
+
if (!Number.isInteger(angle) || angle < 1 || angle > 8) {
|
|
54
|
+
throw new ContentstackConfigError("orient() expects a value between 1 and 8");
|
|
55
|
+
}
|
|
56
|
+
return this.with("orient", String(angle));
|
|
57
|
+
}
|
|
58
|
+
overlay(params) {
|
|
59
|
+
const entries = Object.entries(params).filter(([, value2]) => value2.trim().length > 0).sort(([a], [b]) => a.localeCompare(b));
|
|
60
|
+
if (entries.length === 0) {
|
|
61
|
+
throw new ContentstackConfigError("overlay() requires at least one non-empty key/value pair");
|
|
62
|
+
}
|
|
63
|
+
const value = entries.map(([key, val]) => `${key}:${val}`).join(",");
|
|
64
|
+
return this.with("overlay", value);
|
|
65
|
+
}
|
|
66
|
+
pad(pixels) {
|
|
67
|
+
return this.withNonEmptyString("pad", pixels);
|
|
68
|
+
}
|
|
69
|
+
bgColor(hex) {
|
|
70
|
+
const normalized = hex.trim().replace(/^#/, "");
|
|
71
|
+
if (!/^[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(normalized)) {
|
|
72
|
+
throw new ContentstackConfigError("bgColor() expects a 3 or 6 character hex value");
|
|
73
|
+
}
|
|
74
|
+
return this.with("bg-color", normalized.toLowerCase());
|
|
75
|
+
}
|
|
76
|
+
dpr(ratio) {
|
|
77
|
+
if (!Number.isFinite(ratio) || ratio <= 0) {
|
|
78
|
+
throw new ContentstackConfigError("dpr() expects a positive number");
|
|
79
|
+
}
|
|
80
|
+
return this.with("dpr", String(ratio));
|
|
81
|
+
}
|
|
82
|
+
disableUpscale() {
|
|
83
|
+
return this.with("disable", "upscale");
|
|
84
|
+
}
|
|
85
|
+
resizeFilter(filter) {
|
|
86
|
+
if (!VALID_FILTERS.has(filter)) {
|
|
87
|
+
throw new ContentstackConfigError(`Unsupported resize filter: ${filter}`);
|
|
88
|
+
}
|
|
89
|
+
return this.with("resize-filter", filter);
|
|
90
|
+
}
|
|
91
|
+
toURL() {
|
|
92
|
+
if (Object.keys(this.params).length === 0) {
|
|
93
|
+
return this.assetUrl;
|
|
94
|
+
}
|
|
95
|
+
const query = new URLSearchParams(this.params);
|
|
96
|
+
try {
|
|
97
|
+
const url = new URL(this.assetUrl);
|
|
98
|
+
for (const [key, value] of query.entries()) {
|
|
99
|
+
url.searchParams.set(key, value);
|
|
100
|
+
}
|
|
101
|
+
return url.toString();
|
|
102
|
+
} catch {
|
|
103
|
+
const separator = this.assetUrl.includes("?") ? "&" : "?";
|
|
104
|
+
return `${this.assetUrl}${separator}${query.toString()}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
toSrcSet(widths) {
|
|
108
|
+
return widths.map((width) => {
|
|
109
|
+
assertPositiveInteger("toSrcSet width", width);
|
|
110
|
+
return `${this.width(width).toURL()} ${width}w`;
|
|
111
|
+
}).join(", ");
|
|
112
|
+
}
|
|
113
|
+
toParams() {
|
|
114
|
+
return { ...this.params };
|
|
115
|
+
}
|
|
116
|
+
with(key, value) {
|
|
117
|
+
return new _ImageTransformBuilderImpl(this.assetUrl, {
|
|
118
|
+
...this.params,
|
|
119
|
+
[key]: value
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
withNonEmptyString(key, value) {
|
|
123
|
+
if (!value.trim()) {
|
|
124
|
+
throw new ContentstackConfigError(`${key}() requires a non-empty string value`);
|
|
125
|
+
}
|
|
126
|
+
return this.with(key, value);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
function imageTransform(assetUrl) {
|
|
130
|
+
if (!assetUrl.trim()) {
|
|
131
|
+
throw new ContentstackConfigError("imageTransform() requires a non-empty asset URL");
|
|
132
|
+
}
|
|
133
|
+
return new ImageTransformBuilderImpl(assetUrl);
|
|
134
|
+
}
|
|
135
|
+
function assertPositiveInteger(name, value) {
|
|
136
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
137
|
+
throw new ContentstackConfigError(`${name} expects a positive integer`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export {
|
|
142
|
+
imageTransform
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=chunk-GNPQJBFX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/images/builder.ts"],"sourcesContent":["import { ContentstackConfigError } from \"../http/errors.js\"\nimport type {\n ImageFitMode,\n ImageFormat,\n ImageOrientation,\n ImageResizeFilter,\n ImageTransformBuilder,\n} from \"./types.js\"\n\nconst VALID_FORMATS = new Set<ImageFormat>([\"webp\", \"jpg\", \"png\", \"gif\", \"avif\", \"pjpg\"])\nconst VALID_FITS = new Set<ImageFitMode>([\"bounds\", \"crop\", \"cover\"])\nconst VALID_FILTERS = new Set<ImageResizeFilter>([\n \"nearest\",\n \"bilinear\",\n \"bicubic\",\n \"lanczos2\",\n \"lanczos3\",\n])\n\nclass ImageTransformBuilderImpl implements ImageTransformBuilder {\n constructor(\n private readonly assetUrl: string,\n private readonly params: Record<string, string> = {},\n ) {}\n\n width(px: number): ImageTransformBuilder {\n assertPositiveInteger(\"width\", px)\n return this.with(\"width\", String(px))\n }\n\n height(px: number): ImageTransformBuilder {\n assertPositiveInteger(\"height\", px)\n return this.with(\"height\", String(px))\n }\n\n quality(q: number): ImageTransformBuilder {\n if (!Number.isInteger(q) || q < 1 || q > 100) {\n throw new ContentstackConfigError(\"quality() expects an integer between 1 and 100\")\n }\n return this.with(\"quality\", String(q))\n }\n\n format(fmt: ImageFormat): ImageTransformBuilder {\n if (!VALID_FORMATS.has(fmt)) {\n throw new ContentstackConfigError(`Unsupported image format: ${fmt}`)\n }\n return this.with(\"format\", fmt)\n }\n\n fit(mode: ImageFitMode): ImageTransformBuilder {\n if (!VALID_FITS.has(mode)) {\n throw new ContentstackConfigError(`Unsupported fit mode: ${mode}`)\n }\n return this.with(\"fit\", mode)\n }\n\n crop(params: string): ImageTransformBuilder {\n return this.withNonEmptyString(\"crop\", params)\n }\n\n trim(edges: string): ImageTransformBuilder {\n return this.withNonEmptyString(\"trim\", edges)\n }\n\n orient(angle: ImageOrientation): ImageTransformBuilder {\n if (!Number.isInteger(angle) || angle < 1 || angle > 8) {\n throw new ContentstackConfigError(\"orient() expects a value between 1 and 8\")\n }\n return this.with(\"orient\", String(angle))\n }\n\n overlay(params: Record<string, string>): ImageTransformBuilder {\n const entries = Object.entries(params)\n .filter(([, value]) => value.trim().length > 0)\n .sort(([a], [b]) => a.localeCompare(b))\n\n if (entries.length === 0) {\n throw new ContentstackConfigError(\"overlay() requires at least one non-empty key/value pair\")\n }\n\n const value = entries.map(([key, val]) => `${key}:${val}`).join(\",\")\n return this.with(\"overlay\", value)\n }\n\n pad(pixels: string): ImageTransformBuilder {\n return this.withNonEmptyString(\"pad\", pixels)\n }\n\n bgColor(hex: string): ImageTransformBuilder {\n const normalized = hex.trim().replace(/^#/, \"\")\n if (!/^[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(normalized)) {\n throw new ContentstackConfigError(\"bgColor() expects a 3 or 6 character hex value\")\n }\n return this.with(\"bg-color\", normalized.toLowerCase())\n }\n\n dpr(ratio: number): ImageTransformBuilder {\n if (!Number.isFinite(ratio) || ratio <= 0) {\n throw new ContentstackConfigError(\"dpr() expects a positive number\")\n }\n return this.with(\"dpr\", String(ratio))\n }\n\n disableUpscale(): ImageTransformBuilder {\n return this.with(\"disable\", \"upscale\")\n }\n\n resizeFilter(filter: ImageResizeFilter): ImageTransformBuilder {\n if (!VALID_FILTERS.has(filter)) {\n throw new ContentstackConfigError(`Unsupported resize filter: ${filter}`)\n }\n return this.with(\"resize-filter\", filter)\n }\n\n toURL(): string {\n if (Object.keys(this.params).length === 0) {\n return this.assetUrl\n }\n\n const query = new URLSearchParams(this.params)\n\n try {\n const url = new URL(this.assetUrl)\n for (const [key, value] of query.entries()) {\n url.searchParams.set(key, value)\n }\n return url.toString()\n } catch {\n const separator = this.assetUrl.includes(\"?\") ? \"&\" : \"?\"\n return `${this.assetUrl}${separator}${query.toString()}`\n }\n }\n\n toSrcSet(widths: number[]): string {\n return widths\n .map((width) => {\n assertPositiveInteger(\"toSrcSet width\", width)\n return `${this.width(width).toURL()} ${width}w`\n })\n .join(\", \")\n }\n\n toParams(): Record<string, string> {\n return { ...this.params }\n }\n\n private with(key: string, value: string): ImageTransformBuilder {\n return new ImageTransformBuilderImpl(this.assetUrl, {\n ...this.params,\n [key]: value,\n })\n }\n\n private withNonEmptyString(key: string, value: string): ImageTransformBuilder {\n if (!value.trim()) {\n throw new ContentstackConfigError(`${key}() requires a non-empty string value`)\n }\n return this.with(key, value)\n }\n}\n\nexport function imageTransform(assetUrl: string): ImageTransformBuilder {\n if (!assetUrl.trim()) {\n throw new ContentstackConfigError(\"imageTransform() requires a non-empty asset URL\")\n }\n\n return new ImageTransformBuilderImpl(assetUrl)\n}\n\nfunction assertPositiveInteger(name: string, value: number): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new ContentstackConfigError(`${name} expects a positive integer`)\n }\n}\n"],"mappings":";;;;;AASA,IAAM,gBAAgB,oBAAI,IAAiB,CAAC,QAAQ,OAAO,OAAO,OAAO,QAAQ,MAAM,CAAC;AACxF,IAAM,aAAa,oBAAI,IAAkB,CAAC,UAAU,QAAQ,OAAO,CAAC;AACpE,IAAM,gBAAgB,oBAAI,IAAuB;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,4BAAN,MAAM,2BAA2D;AAAA,EAC/D,YACmB,UACA,SAAiC,CAAC,GACnD;AAFiB;AACA;AAAA,EAChB;AAAA,EAEH,MAAM,IAAmC;AACvC,0BAAsB,SAAS,EAAE;AACjC,WAAO,KAAK,KAAK,SAAS,OAAO,EAAE,CAAC;AAAA,EACtC;AAAA,EAEA,OAAO,IAAmC;AACxC,0BAAsB,UAAU,EAAE;AAClC,WAAO,KAAK,KAAK,UAAU,OAAO,EAAE,CAAC;AAAA,EACvC;AAAA,EAEA,QAAQ,GAAkC;AACxC,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK;AAC5C,YAAM,IAAI,wBAAwB,gDAAgD;AAAA,IACpF;AACA,WAAO,KAAK,KAAK,WAAW,OAAO,CAAC,CAAC;AAAA,EACvC;AAAA,EAEA,OAAO,KAAyC;AAC9C,QAAI,CAAC,cAAc,IAAI,GAAG,GAAG;AAC3B,YAAM,IAAI,wBAAwB,6BAA6B,GAAG,EAAE;AAAA,IACtE;AACA,WAAO,KAAK,KAAK,UAAU,GAAG;AAAA,EAChC;AAAA,EAEA,IAAI,MAA2C;AAC7C,QAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AACzB,YAAM,IAAI,wBAAwB,yBAAyB,IAAI,EAAE;AAAA,IACnE;AACA,WAAO,KAAK,KAAK,OAAO,IAAI;AAAA,EAC9B;AAAA,EAEA,KAAK,QAAuC;AAC1C,WAAO,KAAK,mBAAmB,QAAQ,MAAM;AAAA,EAC/C;AAAA,EAEA,KAAK,OAAsC;AACzC,WAAO,KAAK,mBAAmB,QAAQ,KAAK;AAAA,EAC9C;AAAA,EAEA,OAAO,OAAgD;AACrD,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AACtD,YAAM,IAAI,wBAAwB,0CAA0C;AAAA,IAC9E;AACA,WAAO,KAAK,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,QAAQ,QAAuD;AAC7D,UAAM,UAAU,OAAO,QAAQ,MAAM,EAClC,OAAO,CAAC,CAAC,EAAEA,MAAK,MAAMA,OAAM,KAAK,EAAE,SAAS,CAAC,EAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAExC,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,wBAAwB,0DAA0D;AAAA,IAC9F;AAEA,UAAM,QAAQ,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG;AACnE,WAAO,KAAK,KAAK,WAAW,KAAK;AAAA,EACnC;AAAA,EAEA,IAAI,QAAuC;AACzC,WAAO,KAAK,mBAAmB,OAAO,MAAM;AAAA,EAC9C;AAAA,EAEA,QAAQ,KAAoC;AAC1C,UAAM,aAAa,IAAI,KAAK,EAAE,QAAQ,MAAM,EAAE;AAC9C,QAAI,CAAC,oCAAoC,KAAK,UAAU,GAAG;AACzD,YAAM,IAAI,wBAAwB,gDAAgD;AAAA,IACpF;AACA,WAAO,KAAK,KAAK,YAAY,WAAW,YAAY,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,OAAsC;AACxC,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,YAAM,IAAI,wBAAwB,iCAAiC;AAAA,IACrE;AACA,WAAO,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,EACvC;AAAA,EAEA,iBAAwC;AACtC,WAAO,KAAK,KAAK,WAAW,SAAS;AAAA,EACvC;AAAA,EAEA,aAAa,QAAkD;AAC7D,QAAI,CAAC,cAAc,IAAI,MAAM,GAAG;AAC9B,YAAM,IAAI,wBAAwB,8BAA8B,MAAM,EAAE;AAAA,IAC1E;AACA,WAAO,KAAK,KAAK,iBAAiB,MAAM;AAAA,EAC1C;AAAA,EAEA,QAAgB;AACd,QAAI,OAAO,KAAK,KAAK,MAAM,EAAE,WAAW,GAAG;AACzC,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,QAAQ,IAAI,gBAAgB,KAAK,MAAM;AAE7C,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,KAAK,QAAQ;AACjC,iBAAW,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC1C,YAAI,aAAa,IAAI,KAAK,KAAK;AAAA,MACjC;AACA,aAAO,IAAI,SAAS;AAAA,IACtB,QAAQ;AACN,YAAM,YAAY,KAAK,SAAS,SAAS,GAAG,IAAI,MAAM;AACtD,aAAO,GAAG,KAAK,QAAQ,GAAG,SAAS,GAAG,MAAM,SAAS,CAAC;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,SAAS,QAA0B;AACjC,WAAO,OACJ,IAAI,CAAC,UAAU;AACd,4BAAsB,kBAAkB,KAAK;AAC7C,aAAO,GAAG,KAAK,MAAM,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK;AAAA,IAC9C,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AAAA,EAEA,WAAmC;AACjC,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEQ,KAAK,KAAa,OAAsC;AAC9D,WAAO,IAAI,2BAA0B,KAAK,UAAU;AAAA,MAClD,GAAG,KAAK;AAAA,MACR,CAAC,GAAG,GAAG;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,KAAa,OAAsC;AAC5E,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,YAAM,IAAI,wBAAwB,GAAG,GAAG,sCAAsC;AAAA,IAChF;AACA,WAAO,KAAK,KAAK,KAAK,KAAK;AAAA,EAC7B;AACF;AAEO,SAAS,eAAe,UAAyC;AACtE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,wBAAwB,iDAAiD;AAAA,EACrF;AAEA,SAAO,IAAI,0BAA0B,QAAQ;AAC/C;AAEA,SAAS,sBAAsB,MAAc,OAAqB;AAChE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,wBAAwB,GAAG,IAAI,6BAA6B;AAAA,EACxE;AACF;","names":["value"]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/react/content/ContentstackRichText.tsx
|
|
2
|
+
import { Fragment, jsx } from "react/jsx-runtime";
|
|
3
|
+
var EMPTY_RENDERERS = {};
|
|
4
|
+
function isTextNode(node) {
|
|
5
|
+
return "text" in node;
|
|
6
|
+
}
|
|
7
|
+
function renderTextNode(node, index) {
|
|
8
|
+
let content = node.text;
|
|
9
|
+
if (!content) return null;
|
|
10
|
+
if (node.bold) content = /* @__PURE__ */ jsx("strong", { children: content }, `mark-b-${index}`);
|
|
11
|
+
if (node.italic) content = /* @__PURE__ */ jsx("em", { children: content }, `mark-i-${index}`);
|
|
12
|
+
if (node.underline) content = /* @__PURE__ */ jsx("u", { children: content }, `mark-u-${index}`);
|
|
13
|
+
if (node.strikethrough) content = /* @__PURE__ */ jsx("s", { children: content }, `mark-s-${index}`);
|
|
14
|
+
if (node.code) content = /* @__PURE__ */ jsx("code", { children: content }, `mark-c-${index}`);
|
|
15
|
+
if (node.superscript) content = /* @__PURE__ */ jsx("sup", { children: content }, `mark-sup-${index}`);
|
|
16
|
+
if (node.subscript) content = /* @__PURE__ */ jsx("sub", { children: content }, `mark-sub-${index}`);
|
|
17
|
+
return content;
|
|
18
|
+
}
|
|
19
|
+
var DEFAULT_RENDERERS = {
|
|
20
|
+
doc: (_node, children) => /* @__PURE__ */ jsx(Fragment, { children }),
|
|
21
|
+
p: (node, children) => /* @__PURE__ */ jsx("p", { children }, node.uid),
|
|
22
|
+
h1: (node, children) => /* @__PURE__ */ jsx("h1", { children }, node.uid),
|
|
23
|
+
h2: (node, children) => /* @__PURE__ */ jsx("h2", { children }, node.uid),
|
|
24
|
+
h3: (node, children) => /* @__PURE__ */ jsx("h3", { children }, node.uid),
|
|
25
|
+
h4: (node, children) => /* @__PURE__ */ jsx("h4", { children }, node.uid),
|
|
26
|
+
h5: (node, children) => /* @__PURE__ */ jsx("h5", { children }, node.uid),
|
|
27
|
+
h6: (node, children) => /* @__PURE__ */ jsx("h6", { children }, node.uid),
|
|
28
|
+
blockquote: (node, children) => /* @__PURE__ */ jsx("blockquote", { children }, node.uid),
|
|
29
|
+
ol: (node, children) => /* @__PURE__ */ jsx("ol", { children }, node.uid),
|
|
30
|
+
ul: (node, children) => /* @__PURE__ */ jsx("ul", { children }, node.uid),
|
|
31
|
+
li: (node, children) => /* @__PURE__ */ jsx("li", { children }, node.uid),
|
|
32
|
+
hr: (node) => /* @__PURE__ */ jsx("hr", {}, node.uid),
|
|
33
|
+
img: (node) => /* @__PURE__ */ jsx("img", { src: node.attrs?.src, alt: node.attrs?.alt ?? "" }, node.uid),
|
|
34
|
+
a: (node, children) => /* @__PURE__ */ jsx("a", { href: node.attrs?.href, target: node.attrs?.target, children }, node.uid),
|
|
35
|
+
code: (node, children) => /* @__PURE__ */ jsx("pre", { children: /* @__PURE__ */ jsx("code", { children }) }, node.uid),
|
|
36
|
+
table: (node, children) => /* @__PURE__ */ jsx("table", { children }, node.uid),
|
|
37
|
+
thead: (node, children) => /* @__PURE__ */ jsx("thead", { children }, node.uid),
|
|
38
|
+
tbody: (node, children) => /* @__PURE__ */ jsx("tbody", { children }, node.uid),
|
|
39
|
+
tr: (node, children) => /* @__PURE__ */ jsx("tr", { children }, node.uid),
|
|
40
|
+
th: (node, children) => /* @__PURE__ */ jsx("th", { children }, node.uid),
|
|
41
|
+
td: (node, children) => /* @__PURE__ */ jsx("td", { children }, node.uid)
|
|
42
|
+
};
|
|
43
|
+
function renderNode(node, renderers, index) {
|
|
44
|
+
if (isTextNode(node)) {
|
|
45
|
+
return renderTextNode(node, index);
|
|
46
|
+
}
|
|
47
|
+
if (node.type === "reference" && node.attrs) {
|
|
48
|
+
if (node.attrs.type === "entry" && renderers.renderEntry) {
|
|
49
|
+
return renderers.renderEntry(node.attrs, node);
|
|
50
|
+
}
|
|
51
|
+
if (node.attrs.type === "asset" && renderers.renderAsset) {
|
|
52
|
+
return renderers.renderAsset(node.attrs, node);
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const childElements = node.children?.map((child, i) => renderNode(child, renderers, i));
|
|
57
|
+
const children = childElements ? /* @__PURE__ */ jsx(Fragment, { children: childElements }) : null;
|
|
58
|
+
const customRenderer = renderers.nodes?.[node.type];
|
|
59
|
+
if (customRenderer) {
|
|
60
|
+
return customRenderer(node, children);
|
|
61
|
+
}
|
|
62
|
+
const defaultRenderer = DEFAULT_RENDERERS[node.type];
|
|
63
|
+
if (defaultRenderer) {
|
|
64
|
+
return defaultRenderer(node, children);
|
|
65
|
+
}
|
|
66
|
+
return children;
|
|
67
|
+
}
|
|
68
|
+
function ContentstackRichText({
|
|
69
|
+
document,
|
|
70
|
+
renderers = EMPTY_RENDERERS,
|
|
71
|
+
fallback = null,
|
|
72
|
+
className
|
|
73
|
+
}) {
|
|
74
|
+
if (!document) {
|
|
75
|
+
return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
76
|
+
}
|
|
77
|
+
const children = document.children?.map((child, i) => renderNode(child, renderers, i));
|
|
78
|
+
if (className) {
|
|
79
|
+
return /* @__PURE__ */ jsx("div", { className, children });
|
|
80
|
+
}
|
|
81
|
+
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
ContentstackRichText
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=chunk-GOSB24M6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/content/ContentstackRichText.tsx"],"sourcesContent":["import type { ReactNode } from \"react\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"../../index.js\"\n\nexport type RichTextNodeRenderer = (node: RTENode, children: ReactNode) => ReactNode\n\nexport interface RichTextRenderers {\n /** Override rendering for specific node types */\n nodes?: Partial<Record<string, RichTextNodeRenderer>>\n /** Render entry references */\n renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => ReactNode\n /** Render asset references */\n renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => ReactNode\n}\n\nexport interface ContentstackRichTextProps {\n /** The RTE document node from a CDA or CMA response */\n document: RTEDocNode | null | undefined\n /** Custom renderers for node types, entries, and assets */\n renderers?: RichTextRenderers\n /** Fallback content when document is null/undefined */\n fallback?: ReactNode\n /** CSS class applied to the wrapper div */\n className?: string\n}\n\n/** Hoisted empty object to avoid new reference on every render (rerender-memo-with-default-value) */\nconst EMPTY_RENDERERS: RichTextRenderers = {}\n\nfunction isTextNode(node: RTENode | RTETextNode): node is RTETextNode {\n return \"text\" in node\n}\n\nfunction renderTextNode(node: RTETextNode, index: number): ReactNode {\n let content: ReactNode = node.text\n\n if (!content) return null\n\n if (node.bold) content = <strong key={`mark-b-${index}`}>{content}</strong>\n if (node.italic) content = <em key={`mark-i-${index}`}>{content}</em>\n if (node.underline) content = <u key={`mark-u-${index}`}>{content}</u>\n if (node.strikethrough) content = <s key={`mark-s-${index}`}>{content}</s>\n if (node.code) content = <code key={`mark-c-${index}`}>{content}</code>\n if (node.superscript) content = <sup key={`mark-sup-${index}`}>{content}</sup>\n if (node.subscript) content = <sub key={`mark-sub-${index}`}>{content}</sub>\n\n return content\n}\n\nconst DEFAULT_RENDERERS: Record<string, (node: RTENode, children: ReactNode) => ReactNode> = {\n doc: (_node, children) => <>{children}</>,\n p: (node, children) => <p key={node.uid}>{children}</p>,\n h1: (node, children) => <h1 key={node.uid}>{children}</h1>,\n h2: (node, children) => <h2 key={node.uid}>{children}</h2>,\n h3: (node, children) => <h3 key={node.uid}>{children}</h3>,\n h4: (node, children) => <h4 key={node.uid}>{children}</h4>,\n h5: (node, children) => <h5 key={node.uid}>{children}</h5>,\n h6: (node, children) => <h6 key={node.uid}>{children}</h6>,\n blockquote: (node, children) => <blockquote key={node.uid}>{children}</blockquote>,\n ol: (node, children) => <ol key={node.uid}>{children}</ol>,\n ul: (node, children) => <ul key={node.uid}>{children}</ul>,\n li: (node, children) => <li key={node.uid}>{children}</li>,\n hr: (node) => <hr key={node.uid} />,\n img: (node) => (\n <img key={node.uid} src={node.attrs?.src as string} alt={(node.attrs?.alt as string) ?? \"\"} />\n ),\n a: (node, children) => (\n <a key={node.uid} href={node.attrs?.href as string} target={node.attrs?.target as string}>\n {children}\n </a>\n ),\n code: (node, children) => (\n <pre key={node.uid}>\n <code>{children}</code>\n </pre>\n ),\n table: (node, children) => <table key={node.uid}>{children}</table>,\n thead: (node, children) => <thead key={node.uid}>{children}</thead>,\n tbody: (node, children) => <tbody key={node.uid}>{children}</tbody>,\n tr: (node, children) => <tr key={node.uid}>{children}</tr>,\n th: (node, children) => <th key={node.uid}>{children}</th>,\n td: (node, children) => <td key={node.uid}>{children}</td>,\n}\n\nfunction renderNode(\n node: RTENode | RTETextNode,\n renderers: RichTextRenderers,\n index: number,\n): ReactNode {\n if (isTextNode(node)) {\n return renderTextNode(node, index)\n }\n\n // Handle reference nodes\n if (node.type === \"reference\" && node.attrs) {\n if (node.attrs.type === \"entry\" && renderers.renderEntry) {\n return renderers.renderEntry(node.attrs, node)\n }\n if (node.attrs.type === \"asset\" && renderers.renderAsset) {\n return renderers.renderAsset(node.attrs, node)\n }\n return null\n }\n\n // Render children recursively\n const childElements = node.children?.map((child, i) => renderNode(child, renderers, i))\n const children: ReactNode = childElements ? <>{childElements}</> : null\n\n // Check for custom renderer\n const customRenderer = renderers.nodes?.[node.type]\n if (customRenderer) {\n return customRenderer(node, children)\n }\n\n // Fall back to defaults\n const defaultRenderer = DEFAULT_RENDERERS[node.type]\n if (defaultRenderer) {\n return defaultRenderer(node, children)\n }\n\n // Unknown node type: render children only\n return children\n}\n\nexport function ContentstackRichText({\n document,\n renderers = EMPTY_RENDERERS,\n fallback = null,\n className,\n}: ContentstackRichTextProps): React.JSX.Element {\n if (!document) {\n return <>{fallback}</>\n }\n\n const children = document.children?.map((child, i) => renderNode(child, renderers, i))\n\n if (className) {\n return <div className={className}>{children}</div>\n }\n\n return <>{children}</>\n}\n"],"mappings":"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","names":[]}
|