@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/rte/to-html.ts","../src/rte/utils.ts","../src/rte/serializer.ts","../src/rte/to-markdown.ts","../src/rte/to-plaintext.ts","../src/rte/from-html.ts","../src/rte/transform.ts","../src/rte/validate.ts"],"sourcesContent":["import {\n type IJsonToHtmlElementTags,\n type IJsonToHtmlOptions,\n jsonToHtml,\n} from \"@contentstack/json-rte-serializer\"\nimport { normalizeForSerializer } from \"./serializer.js\"\nimport type { RTEDocNode, RTENode } from \"./types.js\"\nimport { isRecord } from \"./utils.js\"\n\nexport interface ToHTMLOptions {\n renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => string\n renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => string\n serializerOptions?: IJsonToHtmlOptions\n}\n\nexport function toHTML(doc: RTEDocNode, options: ToHTMLOptions = {}): string {\n return jsonToHtml(\n normalizeForSerializer(doc) as unknown as Record<string, unknown>,\n buildSerializerOptions(options),\n )\n}\n\nfunction buildSerializerOptions(options: ToHTMLOptions): IJsonToHtmlOptions | undefined {\n const { renderEntry, renderAsset, serializerOptions } = options\n\n if (!renderEntry && !renderAsset) {\n return serializerOptions\n }\n\n const customElementTypes: IJsonToHtmlElementTags = {\n ...(serializerOptions?.customElementTypes ?? {}),\n }\n\n const existingReferenceRenderer = customElementTypes.reference\n\n customElementTypes.reference = (attrs, child, jsonBlock, extraProps) => {\n const block = asRTENode(jsonBlock)\n const referenceAttrs = isRecord(block.attrs) ? block.attrs : {}\n\n if (referenceAttrs.type === \"entry\" && renderEntry) {\n return renderEntry(referenceAttrs, block)\n }\n\n if (referenceAttrs.type === \"asset\" && renderAsset) {\n return renderAsset(referenceAttrs, block)\n }\n\n return typeof existingReferenceRenderer === \"function\"\n ? existingReferenceRenderer(attrs, child, jsonBlock, extraProps)\n : \"\"\n }\n\n return {\n ...serializerOptions,\n customElementTypes,\n }\n}\n\nfunction asRTENode(value: unknown): RTENode {\n if (isRecord(value) && typeof value.type === \"string\" && typeof value.uid === \"string\") {\n return value as unknown as RTENode\n }\n\n return {\n type: \"reference\",\n uid: \"reference\",\n }\n}\n","import type { RTENode, RTETextNode } from \"./types.js\"\n\nexport const KNOWN_RTE_TYPES = new Set([\n \"doc\",\n \"p\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"code\",\n \"img\",\n \"a\",\n \"table\",\n \"tr\",\n \"td\",\n \"th\",\n \"hr\",\n \"reference\",\n])\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null\n}\n\nexport function isTextNode(value: unknown): value is RTETextNode {\n return isRecord(value) && typeof value.text === \"string\" && typeof value.type !== \"string\"\n}\n\nexport function isElementNode(value: unknown): value is RTENode {\n return isRecord(value) && typeof value.type === \"string\" && typeof value.uid === \"string\"\n}\n\nexport function escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n\nexport function decodeHTML(value: string): string {\n return value\n .replace(/ /g, \" \")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n}\n\nexport function createUid(): string {\n const uuid = globalThis.crypto?.randomUUID\n if (typeof uuid === \"function\") {\n return uuid.call(globalThis.crypto)\n }\n\n return `rte-${Math.random().toString(36).slice(2, 10)}`\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isRecord, isTextNode } from \"./utils.js\"\n\nconst DEFAULT_TABLE_COLUMN_WIDTH = 250\n\nexport function normalizeForSerializer(doc: RTEDocNode): RTEDocNode {\n const normalized = normalizeNode(doc)\n\n if (!isTextNode(normalized) && normalized.type === \"doc\") {\n return normalized as RTEDocNode\n }\n\n return {\n ...doc,\n children: [],\n }\n}\n\nfunction normalizeNode(node: RTENode | RTETextNode): RTENode | RTETextNode {\n if (isTextNode(node)) {\n return { ...node }\n }\n\n const children = node.children?.map((child) => normalizeNode(child))\n const attrs = isRecord(node.attrs) ? { ...node.attrs } : {}\n\n if (node.type === \"a\" && typeof attrs.url !== \"string\" && typeof attrs.href === \"string\") {\n attrs.url = attrs.href\n }\n\n if (node.type === \"img\" && typeof attrs.url !== \"string\" && typeof attrs.src === \"string\") {\n attrs.url = attrs.src\n }\n\n if (node.type === \"table\") {\n const tableRows = (children ?? []).filter(\n (row): row is RTENode => !isTextNode(row) && row.type === \"tr\",\n )\n\n const inferredCols = tableRows.reduce((max, row) => {\n const columnCount = (row.children ?? []).filter(\n (cell) => !isTextNode(cell) && (cell.type === \"td\" || cell.type === \"th\"),\n ).length\n return Math.max(max, columnCount)\n }, 0)\n\n const normalizedCols =\n typeof attrs.cols === \"number\" && attrs.cols > 0 ? attrs.cols : inferredCols\n const normalizedRows =\n typeof attrs.rows === \"number\" && attrs.rows > 0 ? attrs.rows : tableRows.length\n const normalizedWidths =\n Array.isArray(attrs.colWidths) &&\n attrs.colWidths.length > 0 &&\n attrs.colWidths.every((width) => typeof width === \"number\")\n ? attrs.colWidths\n : Array.from({ length: Math.max(normalizedCols, 1) }, () => DEFAULT_TABLE_COLUMN_WIDTH)\n\n return {\n ...node,\n attrs: {\n ...attrs,\n rows: normalizedRows,\n cols: Math.max(normalizedCols, 1),\n colWidths: normalizedWidths,\n },\n ...(children ? { children } : {}),\n }\n }\n\n return {\n ...node,\n attrs,\n ...(children ? { children } : {}),\n }\n}\n","import { jsonToMarkdown } from \"@contentstack/json-rte-serializer\"\nimport { normalizeForSerializer } from \"./serializer.js\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nexport interface ToMarkdownOptions {\n renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => string\n renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => string\n}\n\nexport function toMarkdown(doc: RTEDocNode, options: ToMarkdownOptions = {}): string {\n const mappedDoc =\n options.renderEntry || options.renderAsset ? mapReferenceNodes(doc, options) : doc\n const markdown = jsonToMarkdown(normalizeForSerializer(mappedDoc)).trim()\n return normalizeMarkdownOutput(markdown)\n}\n\nfunction mapReferenceNodes(doc: RTEDocNode, options: ToMarkdownOptions): RTEDocNode {\n const mapped = mapNode(doc, options)\n if (isTextNode(mapped)) {\n return {\n ...doc,\n children: [],\n }\n }\n\n return {\n ...doc,\n ...mapped,\n type: \"doc\",\n uid: mapped.uid ?? doc.uid,\n }\n}\n\nfunction mapNode(node: RTENode | RTETextNode, options: ToMarkdownOptions): RTENode | RTETextNode {\n if (isTextNode(node)) {\n return { ...node }\n }\n\n if (node.type === \"reference\") {\n const attrs = node.attrs ?? {}\n if (attrs.type === \"entry\" && options.renderEntry) {\n return { text: options.renderEntry(attrs, node) }\n }\n if (attrs.type === \"asset\" && options.renderAsset) {\n return { text: options.renderAsset(attrs, node) }\n }\n return { text: \"\" }\n }\n\n return {\n ...node,\n ...(node.children ? { children: node.children.map((child) => mapNode(child, options)) } : {}),\n }\n}\n\nfunction normalizeMarkdownOutput(markdown: string): string {\n return markdown.replace(/!\\[([^\\]]*)\\]\\s*\\n\\s*\\(([^)\\n]+)\\)/g, \"\")\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nconst DOUBLE_BREAK_TYPES = new Set([\n \"p\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"blockquote\",\n \"code\",\n \"ul\",\n \"ol\",\n \"table\",\n])\n\nconst SINGLE_BREAK_TYPES = new Set([\"li\", \"tr\", \"td\", \"th\"])\n\nexport function toPlainText(doc: RTEDocNode): string {\n return renderNode(doc)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim()\n}\n\nfunction renderNode(node: RTENode | RTETextNode): string {\n if (isTextNode(node)) {\n return node.text\n }\n\n const children = (node.children ?? []).map((child) => renderNode(child)).join(\"\")\n\n if (node.type === \"doc\") {\n return children\n }\n\n if (node.type === \"img\") {\n const alt = node.attrs?.alt\n if (typeof alt === \"string\" && alt.trim()) {\n return `${alt}\\n\\n`\n }\n return \"\\n\"\n }\n\n if (node.type === \"a\") {\n const href = node.attrs?.href\n const text = children || (typeof href === \"string\" ? href : \"\")\n return text\n }\n\n if (node.type === \"hr\") {\n return \"\\n\"\n }\n\n if (node.type === \"reference\") {\n return \"\"\n }\n\n if (DOUBLE_BREAK_TYPES.has(node.type)) {\n return `${children}\\n\\n`\n }\n\n if (SINGLE_BREAK_TYPES.has(node.type)) {\n return `${children}\\n`\n }\n\n return children\n}\n","import { type IHtmlToJsonOptions, htmlToJson } from \"@contentstack/json-rte-serializer\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { createUid, decodeHTML, isRecord } from \"./utils.js\"\n\ninterface ParsedElement {\n kind: \"element\"\n tag: string\n attrs: Record<string, string>\n children: ParsedNode[]\n}\n\ninterface ParsedText {\n kind: \"text\"\n value: string\n}\n\ntype ParsedNode = ParsedElement | ParsedText\n\ntype TextMarks = Pick<\n RTETextNode,\n \"bold\" | \"italic\" | \"underline\" | \"strikethrough\" | \"code\" | \"superscript\" | \"subscript\"\n>\n\nconst VOID_TAGS = new Set([\"img\", \"hr\", \"br\", \"meta\", \"link\", \"input\"])\n\nexport interface FromHTMLOptions {\n serializerOptions?: IHtmlToJsonOptions\n}\n\nexport function fromHTML(html: string, options: FromHTMLOptions = {}): RTEDocNode {\n const parsed = parseWithSerializer(html, options)\n if (parsed) {\n return parsed\n }\n\n return parseWithFallback(html)\n}\n\nfunction parseWithSerializer(html: string, options: FromHTMLOptions): RTEDocNode | null {\n try {\n const parsed = htmlToJson(html, options.serializerOptions)\n return normalizeDoc(parsed)\n } catch {\n return null\n }\n}\n\nfunction normalizeDoc(value: unknown): RTEDocNode | null {\n if (isRecord(value) && value.type === \"doc\" && Array.isArray(value.children)) {\n return {\n ...value,\n type: \"doc\",\n uid: typeof value.uid === \"string\" && value.uid.length > 0 ? value.uid : createUid(),\n children: value.children as Array<RTENode | RTETextNode>,\n } as RTEDocNode\n }\n\n return null\n}\n\nfunction parseWithFallback(html: string): RTEDocNode {\n const root = parseHTML(html)\n const children = convertNodes(root.children)\n\n return {\n type: \"doc\",\n uid: createUid(),\n children,\n }\n}\n\nfunction parseHTML(html: string): ParsedElement {\n const root: ParsedElement = {\n kind: \"element\",\n tag: \"root\",\n attrs: {},\n children: [],\n }\n\n const stack: ParsedElement[] = [root]\n const tokenPattern = /<!--[\\s\\S]*?-->|<\\/?[^>]+>|[^<]+/g\n const tokens = html.match(tokenPattern) ?? []\n\n for (const token of tokens) {\n if (!token) {\n continue\n }\n\n if (token.startsWith(\"<!--\")) {\n continue\n }\n\n if (!token.startsWith(\"<\")) {\n const text = decodeHTML(token)\n if (text.length === 0) {\n continue\n }\n\n const parent = stack[stack.length - 1]\n if (!parent) {\n continue\n }\n\n parent.children.push({\n kind: \"text\",\n value: text,\n })\n continue\n }\n\n if (token.startsWith(\"</\")) {\n const closingTag = token.slice(2, -1).trim().toLowerCase()\n while (stack.length > 1) {\n const current = stack.pop()\n if (current?.tag === closingTag) {\n break\n }\n }\n continue\n }\n\n const parsed = parseOpeningTag(token)\n if (!parsed) {\n continue\n }\n\n const parent = stack[stack.length - 1]\n if (!parent) {\n continue\n }\n\n parent.children.push(parsed.element)\n\n const isVoid = parsed.selfClosing || VOID_TAGS.has(parsed.element.tag)\n if (!isVoid) {\n stack.push(parsed.element)\n }\n }\n\n return root\n}\n\nfunction parseOpeningTag(token: string): { element: ParsedElement; selfClosing: boolean } | null {\n const isSelfClosing = token.endsWith(\"/>\")\n const content = token.slice(1, token.length - (isSelfClosing ? 2 : 1)).trim()\n\n if (!content) {\n return null\n }\n\n const tagMatch = content.match(/^([a-zA-Z0-9-]+)/)\n if (!tagMatch?.[1]) {\n return null\n }\n\n const tag = tagMatch[1].toLowerCase()\n const attrs = parseAttributes(content.slice(tag.length).trim())\n\n return {\n element: {\n kind: \"element\",\n tag,\n attrs,\n children: [],\n },\n selfClosing: isSelfClosing,\n }\n}\n\nfunction parseAttributes(input: string): Record<string, string> {\n const attrs: Record<string, string> = {}\n const attrPattern = /([:@a-zA-Z0-9_-]+)(?:\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^\\s\"'>/]+)))?/g\n\n let match = attrPattern.exec(input)\n while (match) {\n const key = match[1]\n if (key) {\n const value = decodeHTML(match[3] ?? match[4] ?? match[5] ?? \"\")\n attrs[key] = value\n }\n match = attrPattern.exec(input)\n }\n\n return attrs\n}\n\nfunction convertNodes(nodes: ParsedNode[], marks: TextMarks = {}): Array<RTENode | RTETextNode> {\n const output: Array<RTENode | RTETextNode> = []\n\n for (const node of nodes) {\n if (node.kind === \"text\") {\n const cleaned = normalizeText(node.value)\n if (!cleaned) {\n continue\n }\n\n output.push({\n text: cleaned,\n ...(marks.bold ? { bold: true } : {}),\n ...(marks.italic ? { italic: true } : {}),\n ...(marks.underline ? { underline: true } : {}),\n ...(marks.strikethrough ? { strikethrough: true } : {}),\n ...(marks.code ? { code: true } : {}),\n ...(marks.superscript ? { superscript: true } : {}),\n ...(marks.subscript ? { subscript: true } : {}),\n })\n continue\n }\n\n output.push(...convertElement(node, marks))\n }\n\n return output\n}\n\nfunction convertElement(element: ParsedElement, marks: TextMarks): Array<RTENode | RTETextNode> {\n switch (element.tag) {\n case \"strong\":\n case \"b\":\n return convertNodes(element.children, { ...marks, bold: true })\n case \"em\":\n case \"i\":\n return convertNodes(element.children, { ...marks, italic: true })\n case \"u\":\n return convertNodes(element.children, { ...marks, underline: true })\n case \"s\":\n case \"strike\":\n case \"del\":\n return convertNodes(element.children, { ...marks, strikethrough: true })\n case \"sup\":\n return convertNodes(element.children, { ...marks, superscript: true })\n case \"sub\":\n return convertNodes(element.children, { ...marks, subscript: true })\n case \"code\":\n return convertNodes(element.children, { ...marks, code: true })\n case \"br\":\n return [{ text: \"\\n\" }]\n case \"img\":\n return [\n {\n type: \"img\",\n uid: createUid(),\n attrs: {\n src: element.attrs.src ?? \"\",\n alt: element.attrs.alt ?? \"\",\n },\n },\n ]\n case \"hr\":\n return [\n {\n type: \"hr\",\n uid: createUid(),\n },\n ]\n case \"a\":\n return [\n {\n type: \"a\",\n uid: createUid(),\n attrs: {\n href: element.attrs.href ?? \"\",\n ...(element.attrs.target ? { target: element.attrs.target } : {}),\n },\n children: convertNodes(element.children),\n },\n ]\n case \"reference\":\n return [\n {\n type: \"reference\",\n uid: createUid(),\n attrs: {\n ...element.attrs,\n },\n },\n ]\n case \"pre\": {\n const codeText = extractTextContent(element)\n return [\n {\n type: \"code\",\n uid: createUid(),\n children: codeText ? [{ text: codeText }] : [],\n },\n ]\n }\n case \"p\":\n case \"h1\":\n case \"h2\":\n case \"h3\":\n case \"h4\":\n case \"h5\":\n case \"h6\":\n case \"ul\":\n case \"ol\":\n case \"li\":\n case \"blockquote\":\n case \"table\":\n case \"tr\":\n case \"td\":\n case \"th\":\n return [\n {\n type: element.tag,\n uid: createUid(),\n children: convertNodes(element.children),\n },\n ]\n default:\n return convertNodes(element.children, marks)\n }\n}\n\nfunction extractTextContent(node: ParsedNode): string {\n if (node.kind === \"text\") {\n return decodeHTML(node.value)\n }\n\n return node.children.map((child) => extractTextContent(child)).join(\"\")\n}\n\nfunction normalizeText(value: string): string {\n const collapsed = value.replace(/\\s+/g, \" \")\n if (collapsed.trim().length === 0) {\n return \" \"\n }\n return collapsed\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { isTextNode } from \"./utils.js\"\n\nexport function transform(\n doc: RTEDocNode,\n visitors: Record<string, (node: RTENode) => RTENode | undefined>,\n): RTEDocNode {\n const transformed = visitNode(doc, visitors)\n\n if (!transformed || isTextNode(transformed) || transformed.type !== \"doc\") {\n return {\n ...doc,\n children: [],\n }\n }\n\n return transformed as RTEDocNode\n}\n\nfunction visitNode(\n node: RTENode | RTETextNode,\n visitors: Record<string, (node: RTENode) => RTENode | undefined>,\n): RTENode | RTETextNode | undefined {\n if (isTextNode(node)) {\n return { ...node }\n }\n\n const nextChildren = (node.children ?? [])\n .map((child) => visitNode(child, visitors))\n .filter((child): child is RTENode | RTETextNode => Boolean(child))\n\n const withChildren: RTENode = {\n ...node,\n ...(node.children ? { children: nextChildren } : {}),\n }\n\n const visitor = visitors[withChildren.type]\n if (!visitor) {\n return withChildren\n }\n\n return visitor(withChildren)\n}\n","import type { RTEDocNode, RTENode, RTETextNode } from \"./types.js\"\nimport { KNOWN_RTE_TYPES, isElementNode, isRecord, isTextNode } from \"./utils.js\"\n\nexport function validate(doc: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n if (!isElementNode(doc)) {\n errors.push(\"Document must be an object node with type and uid\")\n return { valid: false, errors }\n }\n\n if (doc.type !== \"doc\") {\n errors.push('Document root node must have type \"doc\"')\n }\n\n if (!Array.isArray(doc.children)) {\n errors.push('Document root node must include a \"children\" array')\n } else {\n validateChildren(doc.children, \"doc.children\", errors)\n }\n\n return { valid: errors.length === 0, errors }\n}\n\nfunction validateChildren(\n children: unknown[],\n path: string,\n errors: string[],\n): asserts children is Array<RTENode | RTETextNode> {\n children.forEach((child, index) => {\n validateNode(child, `${path}[${index}]`, errors)\n })\n}\n\nfunction validateNode(node: unknown, path: string, errors: string[]): void {\n if (isTextNode(node)) {\n if (typeof node.text !== \"string\") {\n errors.push(`${path} must have a string text value`)\n }\n return\n }\n\n if (!isElementNode(node)) {\n errors.push(`${path} must be a valid element node or text node`)\n return\n }\n\n validateElementNode(node, path, errors)\n}\n\nfunction validateElementNode(node: RTENode, path: string, errors: string[]): void {\n if (!KNOWN_RTE_TYPES.has(node.type)) {\n errors.push(`${path}.type \"${node.type}\" is not a supported RTE node type`)\n }\n\n if (typeof node.uid !== \"string\" || node.uid.trim().length === 0) {\n errors.push(`${path}.uid must be a non-empty string`)\n }\n\n if (node.children !== undefined) {\n if (!Array.isArray(node.children)) {\n errors.push(`${path}.children must be an array when provided`)\n } else {\n validateChildren(node.children, `${path}.children`, errors)\n }\n }\n\n switch (node.type) {\n case \"img\":\n validateImgNode(node, path, errors)\n break\n case \"a\":\n validateAnchorNode(node, path, errors)\n break\n case \"reference\":\n validateReferenceNode(node, path, errors)\n break\n case \"hr\":\n if (Array.isArray(node.children) && node.children.length > 0) {\n errors.push(`${path}.children must be empty for hr nodes`)\n }\n break\n }\n}\n\nfunction validateImgNode(node: RTENode, path: string, errors: string[]): void {\n if (!isRecord(node.attrs) || typeof node.attrs.src !== \"string\" || node.attrs.src.length === 0) {\n errors.push(`${path}.attrs.src must be a non-empty string for img nodes`)\n }\n\n if (isRecord(node.attrs) && node.attrs.alt !== undefined && typeof node.attrs.alt !== \"string\") {\n errors.push(`${path}.attrs.alt must be a string when provided`)\n }\n}\n\nfunction validateAnchorNode(node: RTENode, path: string, errors: string[]): void {\n if (\n !isRecord(node.attrs) ||\n typeof node.attrs.href !== \"string\" ||\n node.attrs.href.length === 0\n ) {\n errors.push(`${path}.attrs.href must be a non-empty string for a nodes`)\n }\n\n if (\n isRecord(node.attrs) &&\n node.attrs.target !== undefined &&\n typeof node.attrs.target !== \"string\"\n ) {\n errors.push(`${path}.attrs.target must be a string when provided`)\n }\n}\n\nfunction validateReferenceNode(node: RTENode, path: string, errors: string[]): void {\n if (!isRecord(node.attrs)) {\n errors.push(`${path}.attrs must be present for reference nodes`)\n return\n }\n\n const refType = node.attrs.type\n if (refType !== \"entry\" && refType !== \"asset\") {\n errors.push(`${path}.attrs.type must be \"entry\" or \"asset\" for reference nodes`)\n return\n }\n\n if (refType === \"entry\" && typeof node.attrs[\"entry-uid\"] !== \"string\") {\n errors.push(`${path}.attrs[\"entry-uid\"] must be provided for entry references`)\n }\n\n if (refType === \"asset\" && typeof node.attrs[\"asset-uid\"] !== \"string\") {\n errors.push(`${path}.attrs[\"asset-uid\"] must be provided for asset references`)\n }\n}\n\nexport type { RTEDocNode }\n"],"mappings":"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","names":["parent"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/vue/content/ContentstackRichText.ts
|
|
2
|
+
import { defineComponent, h } from "vue";
|
|
3
|
+
var EMPTY_RENDERERS = {};
|
|
4
|
+
function isTextNode(node) {
|
|
5
|
+
return "text" in node;
|
|
6
|
+
}
|
|
7
|
+
function renderTextNode(node, index) {
|
|
8
|
+
if (!node.text) return null;
|
|
9
|
+
let content = node.text;
|
|
10
|
+
if (node.bold) content = h("strong", { key: `mark-b-${index}` }, content);
|
|
11
|
+
if (node.italic) content = h("em", { key: `mark-i-${index}` }, content);
|
|
12
|
+
if (node.underline) content = h("u", { key: `mark-u-${index}` }, content);
|
|
13
|
+
if (node.strikethrough) content = h("s", { key: `mark-s-${index}` }, content);
|
|
14
|
+
if (node.code) content = h("code", { key: `mark-c-${index}` }, content);
|
|
15
|
+
if (node.superscript) content = h("sup", { key: `mark-sup-${index}` }, content);
|
|
16
|
+
if (node.subscript) content = h("sub", { key: `mark-sub-${index}` }, content);
|
|
17
|
+
return content;
|
|
18
|
+
}
|
|
19
|
+
var DEFAULT_RENDERERS = {
|
|
20
|
+
doc: (_node, children) => h("div", { style: "display:contents" }, children),
|
|
21
|
+
p: (node, children) => h("p", { key: node.uid }, children),
|
|
22
|
+
h1: (node, children) => h("h1", { key: node.uid }, children),
|
|
23
|
+
h2: (node, children) => h("h2", { key: node.uid }, children),
|
|
24
|
+
h3: (node, children) => h("h3", { key: node.uid }, children),
|
|
25
|
+
h4: (node, children) => h("h4", { key: node.uid }, children),
|
|
26
|
+
h5: (node, children) => h("h5", { key: node.uid }, children),
|
|
27
|
+
h6: (node, children) => h("h6", { key: node.uid }, children),
|
|
28
|
+
blockquote: (node, children) => h("blockquote", { key: node.uid }, children),
|
|
29
|
+
ol: (node, children) => h("ol", { key: node.uid }, children),
|
|
30
|
+
ul: (node, children) => h("ul", { key: node.uid }, children),
|
|
31
|
+
li: (node, children) => h("li", { key: node.uid }, children),
|
|
32
|
+
hr: (node) => h("hr", { key: node.uid }),
|
|
33
|
+
img: (node) => h("img", {
|
|
34
|
+
key: node.uid,
|
|
35
|
+
src: node.attrs?.src,
|
|
36
|
+
alt: node.attrs?.alt ?? ""
|
|
37
|
+
}),
|
|
38
|
+
a: (node, children) => h(
|
|
39
|
+
"a",
|
|
40
|
+
{
|
|
41
|
+
key: node.uid,
|
|
42
|
+
href: node.attrs?.href,
|
|
43
|
+
target: node.attrs?.target
|
|
44
|
+
},
|
|
45
|
+
children
|
|
46
|
+
),
|
|
47
|
+
code: (node, children) => h("pre", { key: node.uid }, [h("code", null, children)]),
|
|
48
|
+
table: (node, children) => h("table", { key: node.uid }, children),
|
|
49
|
+
thead: (node, children) => h("thead", { key: node.uid }, children),
|
|
50
|
+
tbody: (node, children) => h("tbody", { key: node.uid }, children),
|
|
51
|
+
tr: (node, children) => h("tr", { key: node.uid }, children),
|
|
52
|
+
th: (node, children) => h("th", { key: node.uid }, children),
|
|
53
|
+
td: (node, children) => h("td", { key: node.uid }, children)
|
|
54
|
+
};
|
|
55
|
+
function renderNode(node, renderers, index) {
|
|
56
|
+
if (isTextNode(node)) {
|
|
57
|
+
return renderTextNode(node, index);
|
|
58
|
+
}
|
|
59
|
+
if (node.type === "reference" && node.attrs) {
|
|
60
|
+
if (node.attrs.type === "entry" && renderers.renderEntry) {
|
|
61
|
+
return renderers.renderEntry(node.attrs, node);
|
|
62
|
+
}
|
|
63
|
+
if (node.attrs.type === "asset" && renderers.renderAsset) {
|
|
64
|
+
return renderers.renderAsset(node.attrs, node);
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const childElements = node.children?.map((child, i) => renderNode(child, renderers, i)) ?? [];
|
|
69
|
+
const children = childElements.filter((c) => c !== null);
|
|
70
|
+
const customRenderer = renderers.nodes?.[node.type];
|
|
71
|
+
if (customRenderer) {
|
|
72
|
+
return customRenderer(node, children);
|
|
73
|
+
}
|
|
74
|
+
const defaultRenderer = DEFAULT_RENDERERS[node.type];
|
|
75
|
+
if (defaultRenderer) {
|
|
76
|
+
return defaultRenderer(node, children);
|
|
77
|
+
}
|
|
78
|
+
return children.length > 0 ? h("span", null, children) : null;
|
|
79
|
+
}
|
|
80
|
+
var ContentstackRichText = defineComponent({
|
|
81
|
+
name: "ContentstackRichText",
|
|
82
|
+
props: {
|
|
83
|
+
document: {
|
|
84
|
+
type: Object,
|
|
85
|
+
default: void 0
|
|
86
|
+
},
|
|
87
|
+
renderers: {
|
|
88
|
+
type: Object,
|
|
89
|
+
default: () => EMPTY_RENDERERS
|
|
90
|
+
},
|
|
91
|
+
class: {
|
|
92
|
+
type: String,
|
|
93
|
+
default: void 0
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
setup(props, { slots }) {
|
|
97
|
+
return () => {
|
|
98
|
+
if (!props.document) {
|
|
99
|
+
return slots.fallback?.() ?? null;
|
|
100
|
+
}
|
|
101
|
+
const children = props.document.children?.map(
|
|
102
|
+
(child, i) => renderNode(child, props.renderers ?? EMPTY_RENDERERS, i)
|
|
103
|
+
) ?? [];
|
|
104
|
+
const filtered = children.filter((c) => c !== null);
|
|
105
|
+
if (props.class) {
|
|
106
|
+
return h("div", { class: props.class }, filtered);
|
|
107
|
+
}
|
|
108
|
+
return filtered.length > 0 ? h("div", { style: "display:contents" }, filtered) : null;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
export {
|
|
114
|
+
ContentstackRichText
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chunk-T5OIJQK7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vue/content/ContentstackRichText.ts"],"sourcesContent":["import { type PropType, type VNode, defineComponent, h } from \"vue\"\nimport type { RTEDocNode, RTENode, RTETextNode } from \"../../index.js\"\n\nexport type RichTextNodeRenderer = (node: RTENode, children: VNode[]) => VNode | null\n\nexport interface RichTextRenderers {\n nodes?: Partial<Record<string, RichTextNodeRenderer>>\n renderEntry?: (attrs: Record<string, unknown>, node: RTENode) => VNode | null\n renderAsset?: (attrs: Record<string, unknown>, node: RTENode) => VNode | null\n}\n\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): VNode | string | null {\n if (!node.text) return null\n let content: VNode | string = node.text\n\n if (node.bold) content = h(\"strong\", { key: `mark-b-${index}` }, content)\n if (node.italic) content = h(\"em\", { key: `mark-i-${index}` }, content)\n if (node.underline) content = h(\"u\", { key: `mark-u-${index}` }, content)\n if (node.strikethrough) content = h(\"s\", { key: `mark-s-${index}` }, content)\n if (node.code) content = h(\"code\", { key: `mark-c-${index}` }, content)\n if (node.superscript) content = h(\"sup\", { key: `mark-sup-${index}` }, content)\n if (node.subscript) content = h(\"sub\", { key: `mark-sub-${index}` }, content)\n\n return content\n}\n\nconst DEFAULT_RENDERERS: Record<string, (node: RTENode, children: VNode[]) => VNode> = {\n doc: (_node, children) => h(\"div\", { style: \"display:contents\" }, children),\n p: (node, children) => h(\"p\", { key: node.uid }, children),\n h1: (node, children) => h(\"h1\", { key: node.uid }, children),\n h2: (node, children) => h(\"h2\", { key: node.uid }, children),\n h3: (node, children) => h(\"h3\", { key: node.uid }, children),\n h4: (node, children) => h(\"h4\", { key: node.uid }, children),\n h5: (node, children) => h(\"h5\", { key: node.uid }, children),\n h6: (node, children) => h(\"h6\", { key: node.uid }, children),\n blockquote: (node, children) => h(\"blockquote\", { key: node.uid }, children),\n ol: (node, children) => h(\"ol\", { key: node.uid }, children),\n ul: (node, children) => h(\"ul\", { key: node.uid }, children),\n li: (node, children) => h(\"li\", { key: node.uid }, children),\n hr: (node) => h(\"hr\", { key: node.uid }),\n img: (node) =>\n h(\"img\", {\n key: node.uid,\n src: node.attrs?.src as string,\n alt: (node.attrs?.alt as string) ?? \"\",\n }),\n a: (node, children) =>\n h(\n \"a\",\n {\n key: node.uid,\n href: node.attrs?.href as string,\n target: node.attrs?.target as string,\n },\n children,\n ),\n code: (node, children) => h(\"pre\", { key: node.uid }, [h(\"code\", null, children)]),\n table: (node, children) => h(\"table\", { key: node.uid }, children),\n thead: (node, children) => h(\"thead\", { key: node.uid }, children),\n tbody: (node, children) => h(\"tbody\", { key: node.uid }, children),\n tr: (node, children) => h(\"tr\", { key: node.uid }, children),\n th: (node, children) => h(\"th\", { key: node.uid }, children),\n td: (node, children) => h(\"td\", { key: node.uid }, children),\n}\n\nfunction renderNode(\n node: RTENode | RTETextNode,\n renderers: RichTextRenderers,\n index: number,\n): VNode | string | null {\n if (isTextNode(node)) {\n return renderTextNode(node, index)\n }\n\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 const childElements = node.children?.map((child, i) => renderNode(child, renderers, i)) ?? []\n const children = childElements.filter((c): c is VNode | string => c !== null)\n\n const customRenderer = renderers.nodes?.[node.type]\n if (customRenderer) {\n return customRenderer(node, children as VNode[])\n }\n\n const defaultRenderer = DEFAULT_RENDERERS[node.type]\n if (defaultRenderer) {\n return defaultRenderer(node, children as VNode[])\n }\n\n return children.length > 0 ? h(\"span\", null, children) : null\n}\n\nexport const ContentstackRichText = defineComponent({\n name: \"ContentstackRichText\",\n props: {\n document: {\n type: Object as PropType<RTEDocNode | null | undefined>,\n default: undefined,\n },\n renderers: {\n type: Object as PropType<RichTextRenderers>,\n default: () => EMPTY_RENDERERS,\n },\n class: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n return () => {\n if (!props.document) {\n return slots.fallback?.() ?? null\n }\n\n const children =\n props.document.children?.map((child, i) =>\n renderNode(child, props.renderers ?? EMPTY_RENDERERS, i),\n ) ?? []\n const filtered = children.filter((c): c is VNode | string => c !== null)\n\n if (props.class) {\n return h(\"div\", { class: props.class }, filtered)\n }\n\n return filtered.length > 0 ? h(\"div\", { style: \"display:contents\" }, filtered) : null\n }\n },\n})\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContentstackHttpClient
|
|
3
|
+
} from "./chunk-4CJ4IVPJ.mjs";
|
|
4
|
+
import {
|
|
5
|
+
resolveEndpoints
|
|
6
|
+
} from "./chunk-BK2IBTQS.mjs";
|
|
7
|
+
import {
|
|
8
|
+
ContentstackAuthError,
|
|
9
|
+
ContentstackConfigError,
|
|
10
|
+
ContentstackError
|
|
11
|
+
} from "./chunk-DMERADWM.mjs";
|
|
12
|
+
|
|
13
|
+
// src/auth/pkce.ts
|
|
14
|
+
var CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
|
|
15
|
+
function generateCodeVerifier() {
|
|
16
|
+
const bytes = new Uint8Array(43);
|
|
17
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
18
|
+
let result = "";
|
|
19
|
+
for (const byte of bytes) {
|
|
20
|
+
result += CHARSET[byte % CHARSET.length];
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
async function generateCodeChallenge(verifier) {
|
|
25
|
+
const encoder = new TextEncoder();
|
|
26
|
+
const data = encoder.encode(verifier);
|
|
27
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
28
|
+
const bytes = new Uint8Array(digest);
|
|
29
|
+
let binary = "";
|
|
30
|
+
for (const byte of bytes) {
|
|
31
|
+
binary += String.fromCharCode(byte);
|
|
32
|
+
}
|
|
33
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/auth/oauth-client.ts
|
|
37
|
+
function validateConfig(config) {
|
|
38
|
+
if (!config.appId) {
|
|
39
|
+
throw new ContentstackConfigError(
|
|
40
|
+
"appId is required for OAuth. This is your Contentstack app's UID, not the client ID."
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (config.appId === config.clientId) {
|
|
44
|
+
throw new ContentstackConfigError(
|
|
45
|
+
"appId and clientId must be different. appId is your Contentstack app UID; clientId is the OAuth client identifier."
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function buildAuthorizationUrl(config, options) {
|
|
50
|
+
validateConfig(config);
|
|
51
|
+
const endpoints = resolveEndpoints(config.region);
|
|
52
|
+
const authorizationUrl = `${endpoints.app}/apps/${config.appId}/authorize`;
|
|
53
|
+
const state = options?.state ?? generateCodeVerifier();
|
|
54
|
+
const params = new URLSearchParams({
|
|
55
|
+
response_type: "code",
|
|
56
|
+
client_id: config.clientId,
|
|
57
|
+
redirect_uri: config.redirectUri,
|
|
58
|
+
scope: config.scopes.join(" "),
|
|
59
|
+
state
|
|
60
|
+
});
|
|
61
|
+
let codeVerifier;
|
|
62
|
+
if (options?.usePKCE) {
|
|
63
|
+
codeVerifier = generateCodeVerifier();
|
|
64
|
+
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
65
|
+
params.set("code_challenge", codeChallenge);
|
|
66
|
+
params.set("code_challenge_method", "S256");
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
url: `${authorizationUrl}?${params.toString()}`,
|
|
70
|
+
state,
|
|
71
|
+
codeVerifier
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function mapTokenResponse(data) {
|
|
75
|
+
return {
|
|
76
|
+
accessToken: data.access_token,
|
|
77
|
+
refreshToken: data.refresh_token,
|
|
78
|
+
expiresIn: data.expires_in,
|
|
79
|
+
tokenType: data.token_type
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function makeTokenRequest(appBaseUrl, body, errorMessage) {
|
|
83
|
+
const client = new ContentstackHttpClient({ baseUrl: appBaseUrl });
|
|
84
|
+
try {
|
|
85
|
+
const { data } = await client.postForm("/apps-api/token", body);
|
|
86
|
+
return mapTokenResponse(data);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
if (err instanceof ContentstackError) {
|
|
89
|
+
throw new ContentstackAuthError(err.message || errorMessage, {
|
|
90
|
+
status: err.status,
|
|
91
|
+
requestPath: "/apps-api/token",
|
|
92
|
+
cause: err
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
throw new ContentstackAuthError(errorMessage, {
|
|
96
|
+
requestPath: "/apps-api/token",
|
|
97
|
+
cause: err instanceof Error ? err : void 0
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function exchangeCode(config, code, options) {
|
|
102
|
+
const endpoints = resolveEndpoints(config.region);
|
|
103
|
+
const body = new URLSearchParams({
|
|
104
|
+
grant_type: "authorization_code",
|
|
105
|
+
code,
|
|
106
|
+
redirect_uri: config.redirectUri,
|
|
107
|
+
client_id: config.clientId,
|
|
108
|
+
client_secret: config.clientSecret
|
|
109
|
+
});
|
|
110
|
+
if (options?.codeVerifier) {
|
|
111
|
+
body.set("code_verifier", options.codeVerifier);
|
|
112
|
+
}
|
|
113
|
+
return makeTokenRequest(endpoints.app, body, "Failed to exchange authorization code");
|
|
114
|
+
}
|
|
115
|
+
async function refreshToken(config, token) {
|
|
116
|
+
const endpoints = resolveEndpoints(config.region);
|
|
117
|
+
const body = new URLSearchParams({
|
|
118
|
+
grant_type: "refresh_token",
|
|
119
|
+
refresh_token: token,
|
|
120
|
+
client_id: config.clientId,
|
|
121
|
+
client_secret: config.clientSecret
|
|
122
|
+
});
|
|
123
|
+
return makeTokenRequest(endpoints.app, body, "Failed to refresh token");
|
|
124
|
+
}
|
|
125
|
+
function mapUser(user) {
|
|
126
|
+
return {
|
|
127
|
+
uid: user.uid,
|
|
128
|
+
email: user.email,
|
|
129
|
+
firstName: user.first_name ?? void 0,
|
|
130
|
+
lastName: user.last_name ?? void 0,
|
|
131
|
+
username: user.username ?? void 0,
|
|
132
|
+
profileImage: user.profile_image ?? void 0
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async function getUser(region, accessToken) {
|
|
136
|
+
const endpoints = resolveEndpoints(region);
|
|
137
|
+
const client = new ContentstackHttpClient({
|
|
138
|
+
baseUrl: `${endpoints.cma}/v3`,
|
|
139
|
+
headers: { Authorization: `Bearer ${accessToken}` }
|
|
140
|
+
});
|
|
141
|
+
try {
|
|
142
|
+
const { data } = await client.get("/user");
|
|
143
|
+
return mapUser(data.user);
|
|
144
|
+
} catch (err) {
|
|
145
|
+
if (err instanceof ContentstackError) {
|
|
146
|
+
throw new ContentstackAuthError(err.message || "Failed to fetch user profile", {
|
|
147
|
+
status: err.status,
|
|
148
|
+
requestPath: "/v3/user",
|
|
149
|
+
cause: err
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
throw new ContentstackAuthError("Failed to fetch user profile", {
|
|
153
|
+
requestPath: "/v3/user",
|
|
154
|
+
cause: err instanceof Error ? err : void 0
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function createAuthProvider(config) {
|
|
159
|
+
validateConfig(config);
|
|
160
|
+
const endpoints = resolveEndpoints(config.region);
|
|
161
|
+
const userClient = new ContentstackHttpClient({ baseUrl: `${endpoints.cma}/v3` });
|
|
162
|
+
return {
|
|
163
|
+
id: "contentstack",
|
|
164
|
+
name: "Contentstack",
|
|
165
|
+
type: "oauth",
|
|
166
|
+
checks: ["state"],
|
|
167
|
+
authorization: {
|
|
168
|
+
url: `${endpoints.app}/apps/${config.appId}/authorize`,
|
|
169
|
+
params: {
|
|
170
|
+
response_type: "code",
|
|
171
|
+
scope: config.scopes.join(" ")
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
token: `${endpoints.app}/apps-api/token`,
|
|
175
|
+
userinfo: {
|
|
176
|
+
url: `${endpoints.cma}/v3/user`,
|
|
177
|
+
async request({ tokens }) {
|
|
178
|
+
const authedClient = userClient.withHeaders({
|
|
179
|
+
Authorization: `Bearer ${tokens.access_token}`
|
|
180
|
+
});
|
|
181
|
+
const { data } = await authedClient.get("/user");
|
|
182
|
+
return data;
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
profile(profile) {
|
|
186
|
+
const user = profile.user;
|
|
187
|
+
return {
|
|
188
|
+
id: user.uid,
|
|
189
|
+
name: [user.first_name, user.last_name].filter(Boolean).join(" ") || user.username,
|
|
190
|
+
email: user.email,
|
|
191
|
+
image: user.profile_image ?? null
|
|
192
|
+
};
|
|
193
|
+
},
|
|
194
|
+
clientId: config.clientId,
|
|
195
|
+
clientSecret: config.clientSecret
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function contentstackAuthCallbacks(config) {
|
|
199
|
+
return {
|
|
200
|
+
async jwt({
|
|
201
|
+
token,
|
|
202
|
+
account
|
|
203
|
+
}) {
|
|
204
|
+
if (account) {
|
|
205
|
+
token.accessToken = account.access_token;
|
|
206
|
+
token.refreshToken = account.refresh_token;
|
|
207
|
+
token.accessTokenExpiresAt = Date.now() + (account.expires_in ?? 3600) * 1e3;
|
|
208
|
+
return token;
|
|
209
|
+
}
|
|
210
|
+
const expiresAt = token.accessTokenExpiresAt;
|
|
211
|
+
if (expiresAt && Date.now() < expiresAt - 6e4) {
|
|
212
|
+
return token;
|
|
213
|
+
}
|
|
214
|
+
const currentRefreshToken = token.refreshToken;
|
|
215
|
+
if (!currentRefreshToken) {
|
|
216
|
+
token.error = "RefreshAccessTokenError";
|
|
217
|
+
return token;
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const tokens = await refreshToken(config, currentRefreshToken);
|
|
221
|
+
token.accessToken = tokens.accessToken;
|
|
222
|
+
token.refreshToken = tokens.refreshToken;
|
|
223
|
+
token.accessTokenExpiresAt = Date.now() + tokens.expiresIn * 1e3;
|
|
224
|
+
token.error = void 0;
|
|
225
|
+
} catch {
|
|
226
|
+
token.error = "RefreshAccessTokenError";
|
|
227
|
+
}
|
|
228
|
+
return token;
|
|
229
|
+
},
|
|
230
|
+
async session({
|
|
231
|
+
session,
|
|
232
|
+
token
|
|
233
|
+
}) {
|
|
234
|
+
session.accessToken = token.accessToken;
|
|
235
|
+
if (token.error) {
|
|
236
|
+
session.error = token.error;
|
|
237
|
+
}
|
|
238
|
+
return session;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export {
|
|
244
|
+
generateCodeVerifier,
|
|
245
|
+
generateCodeChallenge,
|
|
246
|
+
buildAuthorizationUrl,
|
|
247
|
+
exchangeCode,
|
|
248
|
+
refreshToken,
|
|
249
|
+
getUser,
|
|
250
|
+
createAuthProvider,
|
|
251
|
+
contentstackAuthCallbacks
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=chunk-VW7DD6HV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth/pkce.ts","../src/auth/oauth-client.ts"],"sourcesContent":["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":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectAll,
|
|
3
|
+
paginate
|
|
4
|
+
} from "./chunk-JZE2W7VW.mjs";
|
|
5
|
+
import {
|
|
6
|
+
ContentstackHttpClient
|
|
7
|
+
} from "./chunk-4CJ4IVPJ.mjs";
|
|
8
|
+
import {
|
|
9
|
+
resolveEndpoints
|
|
10
|
+
} from "./chunk-BK2IBTQS.mjs";
|
|
11
|
+
|
|
12
|
+
// src/brandkit/brand-kits.ts
|
|
13
|
+
var BrandKitsSubClient = class {
|
|
14
|
+
constructor(http) {
|
|
15
|
+
this.http = http;
|
|
16
|
+
}
|
|
17
|
+
list(options) {
|
|
18
|
+
return paginate(
|
|
19
|
+
async (skip, limit) => {
|
|
20
|
+
const response = await this.http.get(
|
|
21
|
+
"/v1/brand-kits",
|
|
22
|
+
{
|
|
23
|
+
skip: String(skip),
|
|
24
|
+
limit: String(limit)
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
return { items: response.data.data ?? [], count: response.data.count };
|
|
28
|
+
},
|
|
29
|
+
{ limit: options?.limit }
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
async listAll(options) {
|
|
33
|
+
return collectAll(this.list(options));
|
|
34
|
+
}
|
|
35
|
+
async get(brandKitUid) {
|
|
36
|
+
const response = await this.http.get(`/v1/brand-kits/${brandKitUid}`);
|
|
37
|
+
return response.data.data;
|
|
38
|
+
}
|
|
39
|
+
async create(data) {
|
|
40
|
+
const response = await this.http.post("/v1/brand-kits", data);
|
|
41
|
+
return response.data.data;
|
|
42
|
+
}
|
|
43
|
+
async update(brandKitUid, data) {
|
|
44
|
+
const response = await this.http.put(`/v1/brand-kits/${brandKitUid}`, data);
|
|
45
|
+
return response.data.data;
|
|
46
|
+
}
|
|
47
|
+
async delete(brandKitUid) {
|
|
48
|
+
await this.http.delete(`/v1/brand-kits/${brandKitUid}`);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// src/brandkit/voice-profiles.ts
|
|
53
|
+
var VoiceProfilesSubClient = class {
|
|
54
|
+
constructor(http) {
|
|
55
|
+
this.http = http;
|
|
56
|
+
}
|
|
57
|
+
list(brandKitUid, options) {
|
|
58
|
+
const scoped = this.http.withHeaders({ brand_kit_uid: brandKitUid });
|
|
59
|
+
return paginate(
|
|
60
|
+
async (skip, limit) => {
|
|
61
|
+
const response = await scoped.get(
|
|
62
|
+
`/v1/brand-kits/${brandKitUid}/voice-profiles`,
|
|
63
|
+
{ skip: String(skip), limit: String(limit) }
|
|
64
|
+
);
|
|
65
|
+
return { items: response.data.data ?? [], count: response.data.count };
|
|
66
|
+
},
|
|
67
|
+
{ limit: options?.limit }
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
async listAll(brandKitUid, options) {
|
|
71
|
+
return collectAll(this.list(brandKitUid, options));
|
|
72
|
+
}
|
|
73
|
+
async get(brandKitUid, voiceProfileUid) {
|
|
74
|
+
const scoped = this.http.withHeaders({ brand_kit_uid: brandKitUid });
|
|
75
|
+
const response = await scoped.get(
|
|
76
|
+
`/v1/brand-kits/${brandKitUid}/voice-profiles/${voiceProfileUid}`
|
|
77
|
+
);
|
|
78
|
+
return response.data.data;
|
|
79
|
+
}
|
|
80
|
+
async create(brandKitUid, data) {
|
|
81
|
+
const scoped = this.http.withHeaders({ brand_kit_uid: brandKitUid });
|
|
82
|
+
const response = await scoped.post(
|
|
83
|
+
`/v1/brand-kits/${brandKitUid}/voice-profiles`,
|
|
84
|
+
data
|
|
85
|
+
);
|
|
86
|
+
return response.data.data;
|
|
87
|
+
}
|
|
88
|
+
async update(brandKitUid, voiceProfileUid, data) {
|
|
89
|
+
const scoped = this.http.withHeaders({ brand_kit_uid: brandKitUid });
|
|
90
|
+
const response = await scoped.put(
|
|
91
|
+
`/v1/brand-kits/${brandKitUid}/voice-profiles/${voiceProfileUid}`,
|
|
92
|
+
data
|
|
93
|
+
);
|
|
94
|
+
return response.data.data;
|
|
95
|
+
}
|
|
96
|
+
async delete(brandKitUid, voiceProfileUid) {
|
|
97
|
+
const scoped = this.http.withHeaders({ brand_kit_uid: brandKitUid });
|
|
98
|
+
await scoped.delete(`/v1/brand-kits/${brandKitUid}/voice-profiles/${voiceProfileUid}`);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// src/brandkit/client.ts
|
|
103
|
+
function createBrandKitClient(config) {
|
|
104
|
+
const endpoints = resolveEndpoints(config.region);
|
|
105
|
+
const headers = {
|
|
106
|
+
organization_uid: config.organizationUid
|
|
107
|
+
};
|
|
108
|
+
switch (config.auth.type) {
|
|
109
|
+
case "oauth":
|
|
110
|
+
headers.authorization = `Bearer ${config.auth.accessToken}`;
|
|
111
|
+
break;
|
|
112
|
+
case "authtoken":
|
|
113
|
+
headers.authtoken = config.auth.token;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
const http = new ContentstackHttpClient({
|
|
117
|
+
...config.httpOptions,
|
|
118
|
+
baseUrl: config.httpOptions?.baseUrl ?? endpoints.brandKit,
|
|
119
|
+
headers: {
|
|
120
|
+
...config.httpOptions?.headers,
|
|
121
|
+
...headers
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
brandKits: new BrandKitsSubClient(http),
|
|
126
|
+
voiceProfiles: new VoiceProfilesSubClient(http)
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export {
|
|
131
|
+
createBrandKitClient
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=chunk-XH7NLHGW.mjs.map
|