UNPKG

4.86 kBSource Map (JSON)View Raw
1{"version":3,"file":"experimental-hydrate-support.js","sources":["src/experimental-hydrate-support.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/**\n * LitElement support for hydration of content rendered using lit-ssr.\n *\n * @packageDocumentation\n */\n\nimport type {PropertyValues} from '@lit/reactive-element';\nimport {render, RenderOptions} from 'lit-html';\nimport {hydrate} from 'lit-html/experimental-hydrate.js';\n\ninterface PatchableLitElement extends HTMLElement {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-misused-new\n new (...args: any[]): PatchableLitElement;\n enableUpdating(requestedUpdate?: boolean): void;\n createRenderRoot(): Element | ShadowRoot;\n renderRoot: HTMLElement | DocumentFragment;\n render(): unknown;\n renderOptions: RenderOptions;\n _$needsHydration: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nglobalThis.litElementHydrateSupport = ({\n LitElement,\n}: {\n LitElement: PatchableLitElement;\n}) => {\n const observedAttributes = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(LitElement),\n 'observedAttributes'\n )!.get!;\n\n // Add `defer-hydration` to observedAttributes\n Object.defineProperty(LitElement, 'observedAttributes', {\n get() {\n return [...observedAttributes.call(this), 'defer-hydration'];\n },\n });\n\n // Enable element when 'defer-hydration' attribute is removed by calling the\n // super.connectedCallback()\n const attributeChangedCallback =\n LitElement.prototype.attributeChangedCallback;\n LitElement.prototype.attributeChangedCallback = function (\n name: string,\n old: string | null,\n value: string | null\n ) {\n if (name === 'defer-hydration' && value === null) {\n connectedCallback.call(this);\n }\n attributeChangedCallback.call(this, name, old, value);\n };\n\n // Override `connectedCallback` to capture whether we need hydration, and\n // defer `super.connectedCallback()` if the 'defer-hydration' attribute is set\n const connectedCallback = LitElement.prototype.connectedCallback;\n LitElement.prototype.connectedCallback = function (\n this: PatchableLitElement\n ) {\n // If the outer scope of this element has not yet been hydrated, wait until\n // 'defer-hydration' attribute has been removed to enable\n if (!this.hasAttribute('defer-hydration')) {\n connectedCallback.call(this);\n }\n };\n\n // If we've been server-side rendered, just return `this.shadowRoot`, don't\n // call the base implementation, which would also adopt styles (for now)\n const createRenderRoot = LitElement.prototype.createRenderRoot;\n LitElement.prototype.createRenderRoot = function (this: PatchableLitElement) {\n if (this.shadowRoot) {\n this._$needsHydration = true;\n return this.shadowRoot;\n } else {\n return createRenderRoot.call(this);\n }\n };\n\n // Hydrate on first update when needed\n const update = Object.getPrototypeOf(LitElement.prototype).update;\n LitElement.prototype.update = function (\n this: PatchableLitElement,\n changedProperties: PropertyValues\n ) {\n const value = this.render();\n // Since this is a patch, we can't call super.update(), so we capture\n // it off the proto chain and call it instead\n update.call(this, changedProperties);\n if (this._$needsHydration) {\n this._$needsHydration = false;\n hydrate(value, this.renderRoot, this.renderOptions);\n } else {\n render(value, this.renderRoot, this.renderOptions);\n }\n };\n};\n"],"names":["globalThis","litElementHydrateSupport","LitElement","observedAttributes","Object","getOwnPropertyDescriptor","getPrototypeOf","get","defineProperty","call","this","attributeChangedCallback","prototype","name","old","value","connectedCallback","hasAttribute","createRenderRoot","shadowRoot","_$needsHydration","update","changedProperties","render","hydrate","renderRoot","renderOptions"],"mappings":";;;;;;AA4BAA,WAAWC,yBAA2B,EACpCC,WAAAA,MAIA,MAAMC,EAAqBC,OAAOC,yBAChCD,OAAOE,eAAeJ,GACtB,sBACCK,IAGHH,OAAOI,eAAeN,EAAY,qBAAsB,CACtDK,MACE,MAAO,IAAIJ,EAAmBM,KAAKC,MAAO,sBAM9C,MAAMC,EACJT,EAAWU,UAAUD,yBACvBT,EAAWU,UAAUD,yBAA2B,SAC9CE,EACAC,EACAC,GAEa,oBAATF,GAAwC,OAAVE,GAChCC,EAAkBP,KAAKC,MAEzBC,EAAyBF,KAAKC,KAAMG,EAAMC,EAAKC,IAKjD,MAAMC,EAAoBd,EAAWU,UAAUI,kBAC/Cd,EAAWU,UAAUI,kBAAoB,WAKlCN,KAAKO,aAAa,oBACrBD,EAAkBP,KAAKC,OAM3B,MAAMQ,EAAmBhB,EAAWU,UAAUM,iBAC9ChB,EAAWU,UAAUM,iBAAmB,WACtC,OAAIR,KAAKS,YACPT,KAAKU,MAAmB,EACjBV,KAAKS,YAELD,EAAiBT,KAAKC,OAKjC,MAAMW,EAASjB,OAAOE,eAAeJ,EAAWU,WAAWS,OAC3DnB,EAAWU,UAAUS,OAAS,SAE5BC,GAEA,MAAMP,EAAQL,KAAKa,SAGnBF,EAAOZ,KAAKC,KAAMY,GACdZ,KAAKU,MACPV,KAAKU,MAAmB,EACxBI,EAAQT,EAAOL,KAAKe,WAAYf,KAAKgB,gBAErCH,EAAOR,EAAOL,KAAKe,WAAYf,KAAKgB"}
\No newline at end of file