@contentstack/live-preview-utils 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +2 -2
  2. package/dist/legacy/compare.cjs +72 -66
  3. package/dist/legacy/compare.cjs.map +1 -1
  4. package/dist/legacy/compare.js +72 -66
  5. package/dist/legacy/compare.js.map +1 -1
  6. package/dist/legacy/contentstack-live-preview-HOC.cjs +1 -1
  7. package/dist/legacy/contentstack-live-preview-HOC.js +1 -1
  8. package/dist/legacy/index.cjs.map +1 -1
  9. package/dist/legacy/index.d.cts +3 -2
  10. package/dist/legacy/index.d.ts +3 -2
  11. package/dist/legacy/index.js.map +1 -1
  12. package/dist/legacy/live-preview.cjs +20 -6
  13. package/dist/legacy/live-preview.cjs.map +1 -1
  14. package/dist/legacy/live-preview.js +20 -6
  15. package/dist/legacy/live-preview.js.map +1 -1
  16. package/dist/legacy/utils/cslpdata.cjs +62 -0
  17. package/dist/legacy/utils/cslpdata.cjs.map +1 -0
  18. package/dist/legacy/utils/cslpdata.d.cts +16 -0
  19. package/dist/legacy/utils/cslpdata.d.ts +16 -0
  20. package/dist/legacy/utils/cslpdata.js +37 -0
  21. package/dist/legacy/utils/cslpdata.js.map +1 -0
  22. package/dist/modern/compare.cjs +72 -66
  23. package/dist/modern/compare.cjs.map +1 -1
  24. package/dist/modern/compare.js +72 -66
  25. package/dist/modern/compare.js.map +1 -1
  26. package/dist/modern/contentstack-live-preview-HOC.cjs +1 -1
  27. package/dist/modern/contentstack-live-preview-HOC.js +1 -1
  28. package/dist/modern/index.cjs.map +1 -1
  29. package/dist/modern/index.d.cts +3 -2
  30. package/dist/modern/index.d.ts +3 -2
  31. package/dist/modern/index.js.map +1 -1
  32. package/dist/modern/live-preview.cjs +20 -6
  33. package/dist/modern/live-preview.cjs.map +1 -1
  34. package/dist/modern/live-preview.js +20 -6
  35. package/dist/modern/live-preview.js.map +1 -1
  36. package/dist/modern/utils/cslpdata.cjs +62 -0
  37. package/dist/modern/utils/cslpdata.cjs.map +1 -0
  38. package/dist/modern/utils/cslpdata.d.cts +16 -0
  39. package/dist/modern/utils/cslpdata.d.ts +16 -0
  40. package/dist/modern/utils/cslpdata.js +37 -0
  41. package/dist/modern/utils/cslpdata.js.map +1 -0
  42. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n preview_field: string\n ): string {\n if (!this.config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!this.config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n const urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}/edit`;\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const [content_type_uid, entry_uid, locale, ...field] =\n cslpTag.split(\".\");\n\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field: field.join(\".\"),\n content_type_uid,\n entry_uid,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n field.join(\".\")\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport packageJson from \"../package.json\";\nimport { extractDetailsFromCslp } from \"./utils/cslpdata\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n variant: string | undefined,\n preview_field: string\n ): string {\n if (!this.config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!this.config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}`;\n\n if (variant) {\n urlHash += `/variant/${variant}/edit`;\n } else {\n urlHash += `/edit`;\n }\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPath: field,\n } = extractDetailsFromCslp(cslpTag);\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n field\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -8,6 +8,7 @@ import {
8
8
  import { PublicLogger } from "./utils/public-logger.js";
9
9
  import { handleInitData } from "./utils/handleUserConfig.js";
10
10
  import { userInitData } from "./utils/defaults.js";
11
+ import { extractDetailsFromCslp } from "./utils/cslpdata.js";
11
12
  import { livePreviewStyles } from "./styles/live_preview.js";
12
13
  var LivePreview = class {
13
14
  constructor(initData = userInitData) {
@@ -230,7 +231,7 @@ var LivePreview = class {
230
231
  this.currentElementBesideTooltip = null;
231
232
  this.tooltip.style.top = "-100%";
232
233
  }
233
- generateRedirectUrl(content_type_uid, locale = "en-us", entry_uid, preview_field) {
234
+ generateRedirectUrl(content_type_uid, locale = "en-us", entry_uid, variant, preview_field) {
234
235
  if (!this.config.stackDetails.apiKey) {
235
236
  throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.
236
237
 
@@ -258,7 +259,12 @@ var LivePreview = class {
258
259
  const port = String(this.config.clientUrlParams.port);
259
260
  const environment = String(this.config.stackDetails.environment);
260
261
  const branch = String(this.config.stackDetails.branch || "main");
261
- const urlHash = `!/stack/${this.config.stackDetails.apiKey}/content-type/${content_type_uid}/${locale ?? "en-us"}/entry/${entry_uid}/edit`;
262
+ let urlHash = `!/stack/${this.config.stackDetails.apiKey}/content-type/${content_type_uid}/${locale ?? "en-us"}/entry/${entry_uid}`;
263
+ if (variant) {
264
+ urlHash += `/variant/${variant}/edit`;
265
+ } else {
266
+ urlHash += `/edit`;
267
+ }
262
268
  const url = new URL(`${protocol}://${host}`);
263
269
  url.port = port;
264
270
  url.hash = urlHash;
@@ -275,16 +281,23 @@ var LivePreview = class {
275
281
  return;
276
282
  const cslpTag = this.tooltip.getAttribute("current-data-cslp");
277
283
  if (cslpTag) {
278
- const [content_type_uid, entry_uid, locale, ...field] = cslpTag.split(".");
284
+ const {
285
+ content_type_uid,
286
+ entry_uid,
287
+ locale,
288
+ variant,
289
+ fieldPath: field
290
+ } = extractDetailsFromCslp(cslpTag);
279
291
  if (window.location !== window.parent.location) {
280
292
  window.parent.postMessage(
281
293
  {
282
294
  from: "live-preview",
283
295
  type: "scroll",
284
296
  data: {
285
- field: field.join("."),
297
+ field,
286
298
  content_type_uid,
287
299
  entry_uid,
300
+ variant,
288
301
  locale
289
302
  }
290
303
  },
@@ -296,7 +309,8 @@ var LivePreview = class {
296
309
  content_type_uid,
297
310
  locale,
298
311
  entry_uid,
299
- field.join(".")
312
+ variant,
313
+ field
300
314
  );
301
315
  window.open(redirectUrl, "_blank");
302
316
  } catch (error) {
@@ -405,7 +419,7 @@ var LivePreview = class {
405
419
  config: {
406
420
  shouldReload: this.config.ssr,
407
421
  href: window.location.href,
408
- sdkVersion: "2.0.3"
422
+ sdkVersion: "2.0.4"
409
423
  }
410
424
  }
411
425
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n preview_field: string\n ): string {\n if (!this.config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!this.config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n const urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}/edit`;\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const [content_type_uid, entry_uid, locale, ...field] =\n cslpTag.split(\".\");\n\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field: field.join(\".\"),\n content_type_uid,\n entry_uid,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n field.join(\".\")\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/live-preview.ts"],"sourcesContent":["import {\n createSingularEditButton,\n createMultipleEditButton,\n addLivePreviewQueryTags,\n shouldRenderEditButton,\n getEditButtonPosition,\n} from \"./utils\";\nimport { PublicLogger } from \"./utils/public-logger\";\nimport {\n IConfig,\n IEditButtonPosition,\n IEditEntrySearchParams,\n IInitData,\n ILivePreviewReceivePostMessages,\n} from \"./utils/types\";\nimport { handleInitData } from \"./utils/handleUserConfig\";\nimport { userInitData } from \"./utils/defaults\";\nimport packageJson from \"../package.json\";\nimport { extractDetailsFromCslp } from \"./utils/cslpdata\";\nimport { livePreviewStyles } from \"./styles/live_preview\";\n\nexport default class LivePreview {\n /**\n * @hideconstructor\n */\n\n private config: IConfig = {\n ssr: true,\n enable: true,\n runScriptsOnUpdate: false,\n cleanCslpOnProduction: true,\n hash: \"\",\n\n editButton: {\n enable: true,\n exclude: [],\n position: \"top\",\n includeByQueryParameter: true,\n },\n stackDetails: {\n apiKey: \"\",\n environment: \"\",\n branch: \"\",\n contentTypeUid: \"\",\n entryUid: \"\",\n },\n\n clientUrlParams: {\n protocol: \"https\",\n host: \"app.contentstack.com\",\n port: 443,\n url: \"https://app.contentstack.com:443\",\n },\n stackSdk: {\n live_preview: {},\n environment: \"\",\n },\n\n onChange: () => {\n // this is intentional\n },\n };\n\n private tooltip: HTMLButtonElement | null = null; // this tooltip is responsible to redirect user to Contentstack edit page\n private currentElementBesideTooltip: HTMLElement | null = null; // this element helps to move tooltip with the scroll\n private isHoveringOnTooltip = false;\n private hideInterval: ReturnType<typeof setInterval> | null = null;\n\n private tooltipChild: {\n singular: HTMLDivElement | null;\n multiple: HTMLDivElement | null;\n } = {\n singular: null,\n multiple: null,\n };\n private tooltipCurrentChild: \"multiple\" | \"singular\" = \"singular\";\n\n constructor(initData: Partial<IInitData> = userInitData) {\n handleInitData(initData, this.config);\n\n this.addEditStyleOnHover = this.addEditStyleOnHover.bind(this);\n this.removeEditButtonStyle = this.removeEditButtonStyle.bind(this);\n this.generateRedirectUrl = this.generateRedirectUrl.bind(this);\n this.scrollHandler = this.scrollHandler.bind(this);\n this.linkClickHandler = this.linkClickHandler.bind(this);\n this.handleUserChange = this.handleUserChange.bind(this);\n this.setOnChangeCallback = this.setOnChangeCallback.bind(this);\n this.resolveIncomingMessage = this.resolveIncomingMessage.bind(this);\n this.createCslpTooltip = this.createCslpTooltip.bind(this);\n this.requestDataSync = this.requestDataSync.bind(this);\n this.updateTooltipPosition = this.updateTooltipPosition.bind(this);\n this.removeDataCslp = this.removeDataCslp.bind(this);\n this.toggleHoveringOnEditButton =\n this.toggleHoveringOnEditButton.bind(this);\n this.hideTooltip = this.hideTooltip.bind(this);\n\n // @ts-ignore\n if (initData.debug) {\n PublicLogger.debug(\n \"Contentstack Live Preview Debugging mode: config --\",\n this.config\n );\n }\n\n if (this.config.enable) {\n if (\n typeof document !== undefined &&\n document.readyState === \"complete\"\n ) {\n this.requestDataSync();\n } else {\n window.addEventListener(\"load\", this.requestDataSync);\n }\n window.addEventListener(\"message\", this.resolveIncomingMessage);\n window.addEventListener(\"scroll\", this.updateTooltipPosition);\n // render the hover outline only when edit button enable\n if (this.config.editButton.enable) {\n window.addEventListener(\"mouseover\", this.addEditStyleOnHover);\n }\n\n if (this.config.ssr) {\n window.addEventListener(\"load\", (e) => {\n const allATags = document.querySelectorAll(\"a\");\n allATags.forEach((tag) => {\n const docOrigin: string = document.location.origin;\n if (tag.href && tag.href.includes(docOrigin)) {\n const newUrl = addLivePreviewQueryTags(tag.href);\n tag.href = newUrl;\n }\n });\n });\n\n // Setting the query params to all the click events related to current domain\n window.addEventListener(\"click\", (event: any) => {\n const target: any = event.target;\n const targetHref: string | any = target.href;\n const docOrigin: string = document.location.origin;\n if (\n targetHref &&\n targetHref.includes(docOrigin) &&\n !targetHref.includes(\"live_preview\")\n ) {\n const newUrl = addLivePreviewQueryTags(target.href);\n event.target.href = newUrl || target.href;\n }\n });\n }\n } else if (this.config.cleanCslpOnProduction) {\n this.removeDataCslp();\n }\n }\n\n private addEditStyleOnHover(e: MouseEvent) {\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n // in case where the Edit button is not available in the body element\n if (!document.getElementById(\"cslp-tooltip\")) {\n this.createCslpTooltip();\n }\n if (this.hideInterval) {\n clearInterval(this.hideInterval);\n this.hideInterval = null;\n }\n if (this.currentElementBesideTooltip) {\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n }\n element.classList.add(livePreviewStyles()[\"cslp-edit-mode\"]);\n this.currentElementBesideTooltip = element;\n this.currentElementBesideTooltip.addEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n\n if (this.updateTooltipPosition()) {\n this.tooltip?.setAttribute(\"current-data-cslp\", cslpTag);\n this.tooltip?.setAttribute(\n \"current-href\",\n element.getAttribute(\"href\") ?? \"\"\n );\n }\n\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private removeEditButtonStyle(e: MouseEvent) {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n let trigger = true;\n const eventTargets = e.composedPath();\n\n for (const eventTarget of eventTargets) {\n const element = eventTarget as HTMLElement;\n if (element.nodeName === \"BODY\") break;\n if (typeof element?.getAttribute !== \"function\") continue;\n\n const cslpTag = element.getAttribute(\"data-cslp\");\n\n if (trigger && cslpTag) {\n this.hideInterval = setInterval(this.hideTooltip, 500);\n trigger = false;\n } else if (!trigger) {\n element.classList.remove(livePreviewStyles()[\"cslp-edit-mode\"]);\n }\n }\n }\n\n private hideTooltip() {\n if (\n !this.currentElementBesideTooltip ||\n !this.tooltip ||\n this.isHoveringOnTooltip\n )\n return false;\n this.currentElementBesideTooltip.classList.remove(\n livePreviewStyles()[\"cslp-edit-mode\"]\n );\n this.currentElementBesideTooltip.removeEventListener(\n \"mouseleave\",\n this.removeEditButtonStyle\n );\n this.currentElementBesideTooltip = null;\n this.tooltip.style.top = \"-100%\";\n }\n\n private generateRedirectUrl(\n content_type_uid: string,\n locale = \"en-us\",\n entry_uid: string,\n variant: string | undefined,\n preview_field: string\n ): string {\n if (!this.config.stackDetails.apiKey) {\n throw `To use edit tags, you must provide the stack API key. Specify the API key while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n apiKey: 'your-api-key'\n },\n ...\n })`;\n }\n\n if (!this.config.stackDetails.environment) {\n throw `To use edit tags, you must provide the preview environment. Specify the preview environment while initializing the Live Preview SDK.\n\n ContentstackLivePreview.init({\n ...,\n stackDetails: {\n environment: 'Your-environment'\n },\n ...\n })`;\n }\n\n const protocol = String(this.config.clientUrlParams.protocol);\n const host = String(this.config.clientUrlParams.host);\n const port = String(this.config.clientUrlParams.port);\n const environment = String(this.config.stackDetails.environment);\n const branch = String(this.config.stackDetails.branch || \"main\");\n\n let urlHash = `!/stack/${\n this.config.stackDetails.apiKey\n }/content-type/${content_type_uid}/${\n locale ?? \"en-us\"\n }/entry/${entry_uid}`;\n\n if (variant) {\n urlHash += `/variant/${variant}/edit`;\n } else {\n urlHash += `/edit`;\n }\n\n const url = new URL(`${protocol}://${host}`);\n url.port = port;\n url.hash = urlHash;\n if (this.config.stackDetails.branch) {\n url.searchParams.append(\"branch\", branch);\n }\n url.searchParams.append(\"preview-field\", preview_field);\n url.searchParams.append(\"preview-locale\", locale ?? \"en-us\");\n url.searchParams.append(\"preview-environment\", environment);\n\n return `${url.origin}/${url.hash}${url.search}`;\n }\n\n private scrollHandler() {\n if (!this.tooltip) return;\n\n const cslpTag = this.tooltip.getAttribute(\"current-data-cslp\");\n\n if (cslpTag) {\n const {\n content_type_uid,\n entry_uid,\n locale,\n variant,\n fieldPath: field,\n } = extractDetailsFromCslp(cslpTag);\n // check if opened inside an iframe\n if (window.location !== window.parent.location) {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"scroll\",\n data: {\n field,\n content_type_uid,\n entry_uid,\n variant,\n locale,\n },\n },\n \"*\"\n );\n } else {\n try {\n const redirectUrl = this.generateRedirectUrl(\n content_type_uid,\n locale,\n entry_uid,\n variant,\n field\n );\n\n window.open(redirectUrl, \"_blank\");\n } catch (error) {\n PublicLogger.error(error);\n }\n }\n }\n }\n\n private linkClickHandler() {\n if (!this.tooltip) return;\n const hrefAttribute = this.tooltip.getAttribute(\"current-href\");\n\n if (hrefAttribute) {\n window.location.assign(hrefAttribute);\n }\n }\n\n private handleUserChange(editEntrySearchParams: IEditEntrySearchParams) {\n // here we provide contentTypeUid and EntryUid to the StackDelivery SDK.\n this.config.stackSdk.live_preview = {\n ...this.config.stackSdk.live_preview,\n ...editEntrySearchParams,\n live_preview: editEntrySearchParams.hash,\n };\n this.config.onChange();\n }\n\n setOnChangeCallback(onChangeCallback: () => void): void {\n this.config.onChange = onChangeCallback;\n }\n\n /**\n * It is the live preview hash.\n * This hash could be used when data is fetched manually.\n */\n get hash(): string {\n return this.config.hash;\n }\n\n /**\n * Sets the live preview hash from the query param which is\n * accessible via `hash` property.\n * @param params query param in an object form\n */\n setConfigFromParams(\n params: ConstructorParameters<typeof URLSearchParams>[0] = {}\n ): void {\n if (typeof params !== \"object\")\n throw new TypeError(\n \"Live preview SDK: query param must be an object\"\n );\n\n const urlParams = new URLSearchParams(params);\n const live_preview = urlParams.get(\"live_preview\");\n\n if (live_preview) {\n this.config.hash = live_preview;\n }\n }\n\n private resolveIncomingMessage(\n e: MessageEvent<ILivePreviewReceivePostMessages>\n ) {\n if (typeof e.data !== \"object\") return;\n\n if (e.data.from !== \"live-preview\") return;\n\n switch (e.data.type) {\n case \"client-data-send\": {\n const { contentTypeUid, entryUid } = this.config.stackDetails;\n const { hash } = e.data.data;\n\n this.setConfigFromParams({ live_preview: hash });\n\n if (!this.config.ssr) {\n this.handleUserChange({\n content_type_uid: contentTypeUid,\n entry_uid: entryUid,\n hash: hash,\n });\n }\n break;\n }\n case \"init-ack\": {\n const { contentTypeUid, entryUid } = e.data.data;\n\n this.config.stackDetails.contentTypeUid = contentTypeUid;\n this.config.stackDetails.entryUid = entryUid;\n break;\n }\n case \"history\": {\n switch (e.data.data.type) {\n case \"forward\": {\n window.history.forward();\n break;\n }\n case \"backward\": {\n window.history.back();\n break;\n }\n case \"reload\": {\n window.history.go();\n }\n }\n break;\n }\n default: {\n // ensure that the switch statement is exhaustive\n const exhaustiveCheck: never = e.data;\n return exhaustiveCheck; // TODO: add debug message while we are in development mode.\n }\n }\n }\n\n private createCslpTooltip = () => {\n if (\n !document.getElementById(\"cslp-tooltip\") &&\n this.config.editButton.enable\n ) {\n const tooltip = document.createElement(\"button\");\n const tooltipInnerContainer = document.createElement(\"div\");\n tooltipInnerContainer.classList.add(\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n );\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.classList.add(livePreviewStyles()[\"cslp-tooltip\"]);\n tooltip.setAttribute(\"data-test-id\", \"cs-cslp-tooltip\");\n tooltip.id = \"cslp-tooltip\";\n tooltipInnerContainer.id = \"cslp-tooltip-inner-container\";\n tooltip.addEventListener(\"mouseover\", () => {\n this.toggleHoveringOnEditButton(true);\n });\n tooltip.addEventListener(\"mouseleave\", (e: MouseEvent) => {\n this.toggleHoveringOnEditButton(false);\n this.removeEditButtonStyle(e);\n });\n window.document.body.insertAdjacentElement(\"beforeend\", tooltip);\n this.tooltipChild.singular = createSingularEditButton(\n this.scrollHandler\n );\n this.tooltipChild.multiple = createMultipleEditButton(\n this.scrollHandler,\n this.linkClickHandler\n );\n\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(this.tooltipChild.singular);\n tooltip.appendChild(tooltipInnerContainer);\n this.tooltip = tooltip;\n }\n this.updateTooltipPosition();\n };\n\n private toggleHoveringOnEditButton = (isHoveringOnTooltip: boolean) => {\n this.isHoveringOnTooltip = isHoveringOnTooltip;\n };\n\n // Request parent for data sync when document loads\n private requestDataSync() {\n // add edit tooltip\n this.createCslpTooltip();\n\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"init\",\n data: {\n config: {\n shouldReload: this.config.ssr,\n href: window.location.href,\n sdkVersion: process.env.PACKAGE_VERSION,\n },\n },\n },\n \"*\"\n );\n\n // set timeout for client side (use to show warning: You are not editing this page)\n if (!this.config.ssr) {\n setInterval(() => {\n window.parent.postMessage(\n {\n from: \"live-preview\",\n type: \"check-entry-page\",\n data: {\n href: window.location.href,\n },\n },\n \"*\"\n );\n }, 1500);\n }\n }\n\n private updateTooltipPosition() {\n if (!this.currentElementBesideTooltip || !this.tooltip) return false;\n\n const currentRectOfElement =\n this.currentElementBesideTooltip.getBoundingClientRect();\n const currentRectOfParentOfElement =\n this.tooltip.parentElement?.getBoundingClientRect();\n\n if (currentRectOfElement && currentRectOfParentOfElement) {\n let {\n upperBoundOfTooltip,\n // eslint-disable-next-line prefer-const\n leftBoundOfTooltip,\n }: IEditButtonPosition = getEditButtonPosition(\n this.currentElementBesideTooltip,\n this.config.editButton.position\n );\n\n // if scrolled and element is still visible, make sure tooltip is also visible\n if (upperBoundOfTooltip < 0) {\n if (currentRectOfElement.top < 0)\n upperBoundOfTooltip = currentRectOfElement.top;\n else upperBoundOfTooltip = 0;\n }\n\n this.tooltip.style.top = upperBoundOfTooltip + \"px\";\n this.tooltip.style.zIndex =\n this.currentElementBesideTooltip.style.zIndex || \"200\";\n this.tooltip.style.left = leftBoundOfTooltip + \"px\";\n\n if (this.tooltipChild.singular && this.tooltipChild.multiple) {\n if (this.currentElementBesideTooltip.hasAttribute(\"href\")) {\n if (this.tooltipCurrentChild !== \"multiple\") {\n const tooltipInnerContainer =\n this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\n \"cslp-tooltip-inner-container\"\n ]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.multiple\n );\n this.tooltipCurrentChild = \"multiple\";\n }\n }\n } else if (this.tooltipCurrentChild !== \"singular\") {\n const tooltipInnerContainer = this.tooltip.querySelector(\n `div.${\n livePreviewStyles()[\"cslp-tooltip-inner-container\"]\n }`\n );\n if (tooltipInnerContainer) {\n tooltipInnerContainer.innerHTML = \"\";\n tooltipInnerContainer.appendChild(\n this.tooltipChild.singular\n );\n this.tooltipCurrentChild = \"singular\";\n }\n }\n }\n return true;\n }\n\n return false;\n }\n\n // remove attributes when livePreview is false\n private removeDataCslp() {\n const nodes = document.querySelectorAll(\"[data-cslp]\");\n\n nodes.forEach((node) => {\n node.removeAttribute(\"data-cslp\");\n node.removeAttribute(\"data-cslp-button-position\");\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/utils/cslpdata.ts
21
+ var cslpdata_exports = {};
22
+ __export(cslpdata_exports, {
23
+ extractDetailsFromCslp: () => extractDetailsFromCslp
24
+ });
25
+ module.exports = __toCommonJS(cslpdata_exports);
26
+ function extractDetailsFromCslp(cslpValue) {
27
+ let [cslpVersion, cslpData] = cslpValue.split(":");
28
+ if (cslpVersion.length > 2) {
29
+ cslpData = cslpVersion;
30
+ cslpVersion = "v1";
31
+ }
32
+ return destructureCslpValue(cslpData, cslpVersion);
33
+ }
34
+ function destructureCslpValue(cslpData, version) {
35
+ const [content_type_uid, entryInfo, locale, ...fieldPath] = cslpData.split(".");
36
+ switch (version) {
37
+ case "v2": {
38
+ const [entry_uid, variant] = entryInfo.split("_");
39
+ return {
40
+ entry_uid,
41
+ content_type_uid,
42
+ variant,
43
+ locale,
44
+ cslpValue: cslpData,
45
+ fieldPath: fieldPath.join(".")
46
+ };
47
+ }
48
+ default:
49
+ return {
50
+ entry_uid: entryInfo,
51
+ content_type_uid,
52
+ locale,
53
+ cslpValue: cslpData,
54
+ fieldPath: fieldPath.join(".")
55
+ };
56
+ }
57
+ }
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ extractDetailsFromCslp
61
+ });
62
+ //# sourceMappingURL=cslpdata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/cslpdata.ts"],"sourcesContent":["export interface CslpData {\n entry_uid: string;\n content_type_uid: string;\n variant?: string;\n cslpValue: string;\n locale: string;\n fieldPath: string;\n}\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n return destructureCslpValue(cslpData, cslpVersion);\n}\n\nfunction destructureCslpValue(cslpData: string, version: string): CslpData {\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n switch (version) {\n case \"v2\": {\n const [entry_uid, variant] = entryInfo.split(\"_\");\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n default:\n return {\n entry_uid: entryInfo,\n content_type_uid,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAaO,SAAS,uBAAuB,WAA6B;AAChE,MAAI,CAAC,aAAa,QAAQ,IAAI,UAAU,MAAM,GAAG;AAEjD,MAAI,YAAY,SAAS,GAAG;AACxB,eAAW;AACX,kBAAc;AAAA,EAClB;AACA,SAAO,qBAAqB,UAAU,WAAW;AACrD;AAEA,SAAS,qBAAqB,UAAkB,SAA2B;AACvE,QAAM,CAAC,kBAAkB,WAAW,QAAQ,GAAG,SAAS,IACpD,SAAS,MAAM,GAAG;AACtB,UAAQ,SAAS;AAAA,IACb,KAAK,MAAM;AACP,YAAM,CAAC,WAAW,OAAO,IAAI,UAAU,MAAM,GAAG;AAChD,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,EACR;AACJ;","names":[]}
@@ -0,0 +1,16 @@
1
+ interface CslpData {
2
+ entry_uid: string;
3
+ content_type_uid: string;
4
+ variant?: string;
5
+ cslpValue: string;
6
+ locale: string;
7
+ fieldPath: string;
8
+ }
9
+ /**
10
+ * Extracts details from a CSLP value string.
11
+ * @param cslpValue The CSLP value string to extract details from.
12
+ * @returns An object containing the extracted details.
13
+ */
14
+ declare function extractDetailsFromCslp(cslpValue: string): CslpData;
15
+
16
+ export { type CslpData, extractDetailsFromCslp };
@@ -0,0 +1,16 @@
1
+ interface CslpData {
2
+ entry_uid: string;
3
+ content_type_uid: string;
4
+ variant?: string;
5
+ cslpValue: string;
6
+ locale: string;
7
+ fieldPath: string;
8
+ }
9
+ /**
10
+ * Extracts details from a CSLP value string.
11
+ * @param cslpValue The CSLP value string to extract details from.
12
+ * @returns An object containing the extracted details.
13
+ */
14
+ declare function extractDetailsFromCslp(cslpValue: string): CslpData;
15
+
16
+ export { type CslpData, extractDetailsFromCslp };
@@ -0,0 +1,37 @@
1
+ // src/utils/cslpdata.ts
2
+ function extractDetailsFromCslp(cslpValue) {
3
+ let [cslpVersion, cslpData] = cslpValue.split(":");
4
+ if (cslpVersion.length > 2) {
5
+ cslpData = cslpVersion;
6
+ cslpVersion = "v1";
7
+ }
8
+ return destructureCslpValue(cslpData, cslpVersion);
9
+ }
10
+ function destructureCslpValue(cslpData, version) {
11
+ const [content_type_uid, entryInfo, locale, ...fieldPath] = cslpData.split(".");
12
+ switch (version) {
13
+ case "v2": {
14
+ const [entry_uid, variant] = entryInfo.split("_");
15
+ return {
16
+ entry_uid,
17
+ content_type_uid,
18
+ variant,
19
+ locale,
20
+ cslpValue: cslpData,
21
+ fieldPath: fieldPath.join(".")
22
+ };
23
+ }
24
+ default:
25
+ return {
26
+ entry_uid: entryInfo,
27
+ content_type_uid,
28
+ locale,
29
+ cslpValue: cslpData,
30
+ fieldPath: fieldPath.join(".")
31
+ };
32
+ }
33
+ }
34
+ export {
35
+ extractDetailsFromCslp
36
+ };
37
+ //# sourceMappingURL=cslpdata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/cslpdata.ts"],"sourcesContent":["export interface CslpData {\n entry_uid: string;\n content_type_uid: string;\n variant?: string;\n cslpValue: string;\n locale: string;\n fieldPath: string;\n}\n/**\n * Extracts details from a CSLP value string.\n * @param cslpValue The CSLP value string to extract details from.\n * @returns An object containing the extracted details.\n */\nexport function extractDetailsFromCslp(cslpValue: string): CslpData {\n let [cslpVersion, cslpData] = cslpValue.split(\":\");\n // If the cslpVersion is greater than 2 letter which means it is v1 version of cslp data\n if (cslpVersion.length > 2) {\n cslpData = cslpVersion;\n cslpVersion = \"v1\";\n }\n return destructureCslpValue(cslpData, cslpVersion);\n}\n\nfunction destructureCslpValue(cslpData: string, version: string): CslpData {\n const [content_type_uid, entryInfo, locale, ...fieldPath] =\n cslpData.split(\".\");\n switch (version) {\n case \"v2\": {\n const [entry_uid, variant] = entryInfo.split(\"_\");\n return {\n entry_uid,\n content_type_uid,\n variant,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n default:\n return {\n entry_uid: entryInfo,\n content_type_uid,\n locale,\n cslpValue: cslpData,\n fieldPath: fieldPath.join(\".\"),\n };\n }\n}\n"],"mappings":";AAaO,SAAS,uBAAuB,WAA6B;AAChE,MAAI,CAAC,aAAa,QAAQ,IAAI,UAAU,MAAM,GAAG;AAEjD,MAAI,YAAY,SAAS,GAAG;AACxB,eAAW;AACX,kBAAc;AAAA,EAClB;AACA,SAAO,qBAAqB,UAAU,WAAW;AACrD;AAEA,SAAS,qBAAqB,UAAkB,SAA2B;AACvE,QAAM,CAAC,kBAAkB,WAAW,QAAQ,GAAG,SAAS,IACpD,SAAS,MAAM,GAAG;AACtB,UAAQ,SAAS;AAAA,IACb,KAAK,MAAM;AACP,YAAM,CAAC,WAAW,OAAO,IAAI,UAAU,MAAM,GAAG;AAChD,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,QACH,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,UAAU,KAAK,GAAG;AAAA,MACjC;AAAA,EACR;AACJ;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentstack/live-preview-utils",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Contentstack provides the Live Preview SDK to establish a communication channel between the various Contentstack SDKs and your website, transmitting live changes to the preview pane.",
5
5
  "type": "module",
6
6
  "types": "dist/legacy/index.d.ts",
@@ -50,6 +50,7 @@
50
50
  "@types/jest": "^27.0.1",
51
51
  "@types/mustache": "^4.2.2",
52
52
  "@types/post-robot": "^10.0.6",
53
+ "@types/ssri": "^7.1.5",
53
54
  "@types/uuid": "^8.3.1",
54
55
  "@typescript-eslint/eslint-plugin": "^4.31.1",
55
56
  "@typescript-eslint/parser": "^4.31.1",
@@ -65,6 +66,7 @@
65
66
  "mini-css-extract-plugin": "^2.3.0",
66
67
  "prettier": "^2.8.4",
67
68
  "prettier-eslint": "^15.0.1",
69
+ "ssri": "^11.0.0",
68
70
  "style-loader": "^2.0.0",
69
71
  "ts-jest": "^29.1.2",
70
72
  "ts-loader": "^9.4.2",
@@ -84,9 +86,10 @@
84
86
  "dependencies": {
85
87
  "goober": "^2.1.14",
86
88
  "just-camel-case": "^4.0.2",
89
+ "lodash-es": "^4.17.21",
87
90
  "morphdom": "^2.6.1",
88
91
  "mustache": "^4.2.0",
89
- "post-robot": "^8.0.31",
92
+ "post-robot": "8.0.31",
90
93
  "uuid": "^8.3.2"
91
94
  },
92
95
  "lint-staged": {