@reckona/mreact-compat 0.0.156 → 0.0.158

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.
@@ -1 +1 @@
1
- {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,uBAAuB,CAAC;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,CACnB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,6BAA6B,KAChC,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,GAAE,UAAqB,GAC1B,IAAI,CAyBN;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,cAAc,CA8BhB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,IAAI,GACX,MAAM,GAAG,SAAS,CAkCpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,IAAI,EAAE,CAUR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GACX,IAAI,CAON;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,GACX,IAAI,CAON;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,IAAI,CAMN;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,IAAI,GACb,IAAI,CASN;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,MAAM,GACpB,aAAa,CAaf;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAYN;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,IAAI,EAAE,EAC9B,QAAQ,EAAE,MAAM,GACf,IAAI,CAWN"}
1
+ {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,uBAAuB,CAAC;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAAC,EAAE,CACnB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,6BAA6B,KAChC,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,GAAE,UAAqB,GAC1B,IAAI,CAkCN;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,cAAc,CA8BhB;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,IAAI,GACX,MAAM,GAAG,SAAS,CAkCpB;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,IAAI,EAAE,CAUR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GACX,IAAI,CAON;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,GACX,IAAI,CAON;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,IAAI,CAMN;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,IAAI,GACb,IAAI,CASN;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,MAAM,GACpB,aAAa,CAaf;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAYN;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,SAAS,IAAI,EAAE,EAC9B,QAAQ,EAAE,MAAM,GACf,IAAI,CAWN"}
package/dist/hydration.js CHANGED
@@ -5,12 +5,17 @@ export function applyStreamingHydrationFragments(root = document) {
5
5
  if (id === undefined) {
6
6
  continue;
7
7
  }
8
+ const completionMarker = Array.from(root.querySelectorAll("[data-mreact-oob-complete]")).find((candidate) => candidate.getAttribute("data-mreact-oob-complete") === id);
9
+ if (completionMarker === undefined) {
10
+ continue;
11
+ }
8
12
  const placeholder = root.querySelector(`[data-mreact-oob-placeholder="${escapeSelectorString(id)}"]`);
9
13
  if (placeholder === null) {
10
14
  continue;
11
15
  }
12
16
  placeholder.replaceWith(fragment.content.cloneNode(true));
13
17
  fragment.remove();
18
+ completionMarker.remove();
14
19
  }
15
20
  }
16
21
  export function getHydrationScope(container, resumeId) {
@@ -1 +1 @@
1
- {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactCompatNode } from \"./element.js\";\n\nexport interface HydrationRecoverableErrorInfo {\n kind: \"tag\" | \"text\" | \"attribute\" | \"node\" | \"suspense-server-error\";\n path: string;\n componentStack?: string;\n}\n\nexport interface HydrationContext {\n onRecoverableError?: (\n error: Error,\n info: HydrationRecoverableErrorInfo,\n ) => void;\n componentStack?: string;\n}\n\nexport interface RenderOptions {\n hydration?: HydrationContext;\n eventRoot?: Element;\n preserveHydrationAttributes?: boolean;\n}\n\nexport interface HydrationScope {\n parent: ParentNode;\n previousNodes: Node[];\n before: ChildNode | null;\n after: ChildNode | null;\n}\n\nexport function applyStreamingHydrationFragments(\n root: ParentNode = document,\n): void {\n const fragments = Array.from(\n root.querySelectorAll<HTMLTemplateElement>(\n \"template[data-mreact-oob-fragment]\",\n ),\n );\n\n for (const fragment of fragments) {\n const id = fragment.dataset.mreactOobFragment;\n\n if (id === undefined) {\n continue;\n }\n\n const placeholder = root.querySelector<Element>(\n `[data-mreact-oob-placeholder=\"${escapeSelectorString(id)}\"]`,\n );\n\n if (placeholder === null) {\n continue;\n }\n\n placeholder.replaceWith(fragment.content.cloneNode(true));\n fragment.remove();\n }\n}\n\nexport function getHydrationScope(\n container: Element,\n resumeId: string | undefined,\n): HydrationScope {\n if (resumeId === undefined) {\n return {\n parent: container,\n previousNodes: Array.from(container.childNodes),\n before: null,\n after: null,\n };\n }\n\n const encodedId = encodeURIComponent(resumeId);\n const start = findComment(container, `mreact-h:start:${encodedId}`);\n const end =\n start === null ? null : findFollowingComment(start, `mreact-h:end:${encodedId}`);\n\n if (start === null || end === null || start.parentNode === null) {\n return {\n parent: container,\n previousNodes: Array.from(container.childNodes),\n before: null,\n after: null,\n };\n }\n\n return {\n parent: start.parentNode,\n previousNodes: collectScopedNodes(start.parentNode, start, end),\n before: start,\n after: end,\n };\n}\n\nexport function findContainingResumeBoundaryId(\n root: ParentNode,\n target: Node,\n): string | undefined {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const stack: string[] = [];\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n\n if (!(node instanceof Comment)) {\n continue;\n }\n\n if (node.compareDocumentPosition(target) & Node.DOCUMENT_POSITION_PRECEDING) {\n break;\n }\n\n const startId = readResumeMarkerId(node.data, \"mreact-h:start:\");\n\n if (startId !== undefined) {\n stack.push(startId);\n continue;\n }\n\n const endId = readResumeMarkerId(node.data, \"mreact-h:end:\");\n\n if (endId !== undefined) {\n const lastIndex = stack.lastIndexOf(endId);\n\n if (lastIndex >= 0) {\n stack.length = lastIndex;\n }\n }\n }\n\n return stack.at(-1);\n}\n\nexport function collectScopedNodes(\n parent: ParentNode,\n before: ChildNode | null,\n after: ChildNode | null,\n): Node[] {\n const nodes: Node[] = [];\n let cursor = before === null ? parent.firstChild : before.nextSibling;\n\n while (cursor !== null && cursor !== after) {\n nodes.push(cursor);\n cursor = cursor.nextSibling;\n }\n\n return nodes;\n}\n\nexport function escapeSelectorString(value: string): string {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\\"\", \"\\\\\\\"\");\n}\n\nexport function reportRecoverable(\n options: RenderOptions,\n kind: HydrationRecoverableErrorInfo[\"kind\"],\n path: string,\n error: Error,\n): void {\n const componentStack = options.hydration?.componentStack;\n options.hydration?.onRecoverableError?.(error, {\n kind,\n path,\n ...(componentStack === undefined ? {} : { componentStack }),\n });\n}\n\nexport function reportMissingHydrationNode(\n options: RenderOptions,\n path: string,\n): void {\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\"Hydration missing node mismatch.\"),\n );\n}\n\nexport function reportReactSuspenseServerError(\n options: RenderOptions,\n path: string,\n message: string,\n componentStack: string | undefined,\n): void {\n options.hydration?.onRecoverableError?.(new Error(message), {\n kind: \"suspense-server-error\",\n path,\n ...(componentStack === undefined ? {} : { componentStack }),\n });\n}\n\nexport function reportHydrationNodeTypeMismatch(\n options: RenderOptions,\n path: string,\n expected: string,\n existing: Node,\n): void {\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\n `Hydration node type mismatch: expected ${expected} but found ${describeHydrationNode(existing)}.`,\n ),\n );\n}\n\nexport function withHydrationComponentStack(\n options: RenderOptions,\n componentName: string,\n): RenderOptions {\n if (options.hydration === undefined) {\n return options;\n }\n\n const frame = `\\n at ${componentName}`;\n return {\n ...options,\n hydration: {\n ...options.hydration,\n componentStack: `${options.hydration.componentStack ?? \"\"}${frame}`,\n },\n };\n}\n\nexport function reportElementTextMismatch(\n options: RenderOptions,\n path: string,\n existing: Element,\n children: ReactCompatNode,\n): void {\n if (\n (typeof children === \"string\" || typeof children === \"number\") &&\n existing.textContent !== String(children)\n ) {\n reportRecoverable(\n options,\n \"text\",\n path,\n new Error(\"Hydration text mismatch.\"),\n );\n }\n}\n\nexport function reportExtraHydrationNodes(\n options: RenderOptions,\n path: string,\n previousNodes: readonly Node[],\n consumed: number,\n): void {\n if (consumed >= previousNodes.length) {\n return;\n }\n\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\"Hydration extra node mismatch.\"),\n );\n}\n\nfunction describeHydrationNode(node: Node): string {\n if (node instanceof HTMLElement) {\n return `<${node.tagName.toLowerCase()}>`;\n }\n\n if (node instanceof Text) {\n return \"text\";\n }\n\n if (node instanceof Comment) {\n return \"comment\";\n }\n\n return \"node\";\n}\n\nfunction readResumeMarkerId(\n value: string,\n prefix: \"mreact-h:start:\" | \"mreact-h:end:\",\n): string | undefined {\n return value.startsWith(prefix)\n ? decodeURIComponent(value.slice(prefix.length))\n : undefined;\n}\n\nfunction findComment(root: ParentNode, value: string): Comment | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n\n if (node instanceof Comment && node.data === value) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction findFollowingComment(start: Comment, value: string): Comment | null {\n let cursor: Node | null = start.nextSibling;\n\n while (cursor !== null) {\n if (cursor instanceof Comment && cursor.data === value) {\n return cursor;\n }\n\n cursor = cursor.nextSibling;\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactCompatNode } from \"./element.js\";\n\nexport interface HydrationRecoverableErrorInfo {\n kind: \"tag\" | \"text\" | \"attribute\" | \"node\" | \"suspense-server-error\";\n path: string;\n componentStack?: string;\n}\n\nexport interface HydrationContext {\n onRecoverableError?: (\n error: Error,\n info: HydrationRecoverableErrorInfo,\n ) => void;\n componentStack?: string;\n}\n\nexport interface RenderOptions {\n hydration?: HydrationContext;\n eventRoot?: Element;\n preserveHydrationAttributes?: boolean;\n}\n\nexport interface HydrationScope {\n parent: ParentNode;\n previousNodes: Node[];\n before: ChildNode | null;\n after: ChildNode | null;\n}\n\nexport function applyStreamingHydrationFragments(\n root: ParentNode = document,\n): void {\n const fragments = Array.from(\n root.querySelectorAll<HTMLTemplateElement>(\n \"template[data-mreact-oob-fragment]\",\n ),\n );\n\n for (const fragment of fragments) {\n const id = fragment.dataset.mreactOobFragment;\n\n if (id === undefined) {\n continue;\n }\n\n const completionMarker = Array.from(\n root.querySelectorAll<Element>(\"[data-mreact-oob-complete]\"),\n ).find((candidate) => candidate.getAttribute(\"data-mreact-oob-complete\") === id);\n\n if (completionMarker === undefined) {\n continue;\n }\n\n const placeholder = root.querySelector<Element>(\n `[data-mreact-oob-placeholder=\"${escapeSelectorString(id)}\"]`,\n );\n\n if (placeholder === null) {\n continue;\n }\n\n placeholder.replaceWith(fragment.content.cloneNode(true));\n fragment.remove();\n completionMarker.remove();\n }\n}\n\nexport function getHydrationScope(\n container: Element,\n resumeId: string | undefined,\n): HydrationScope {\n if (resumeId === undefined) {\n return {\n parent: container,\n previousNodes: Array.from(container.childNodes),\n before: null,\n after: null,\n };\n }\n\n const encodedId = encodeURIComponent(resumeId);\n const start = findComment(container, `mreact-h:start:${encodedId}`);\n const end =\n start === null ? null : findFollowingComment(start, `mreact-h:end:${encodedId}`);\n\n if (start === null || end === null || start.parentNode === null) {\n return {\n parent: container,\n previousNodes: Array.from(container.childNodes),\n before: null,\n after: null,\n };\n }\n\n return {\n parent: start.parentNode,\n previousNodes: collectScopedNodes(start.parentNode, start, end),\n before: start,\n after: end,\n };\n}\n\nexport function findContainingResumeBoundaryId(\n root: ParentNode,\n target: Node,\n): string | undefined {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const stack: string[] = [];\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n\n if (!(node instanceof Comment)) {\n continue;\n }\n\n if (node.compareDocumentPosition(target) & Node.DOCUMENT_POSITION_PRECEDING) {\n break;\n }\n\n const startId = readResumeMarkerId(node.data, \"mreact-h:start:\");\n\n if (startId !== undefined) {\n stack.push(startId);\n continue;\n }\n\n const endId = readResumeMarkerId(node.data, \"mreact-h:end:\");\n\n if (endId !== undefined) {\n const lastIndex = stack.lastIndexOf(endId);\n\n if (lastIndex >= 0) {\n stack.length = lastIndex;\n }\n }\n }\n\n return stack.at(-1);\n}\n\nexport function collectScopedNodes(\n parent: ParentNode,\n before: ChildNode | null,\n after: ChildNode | null,\n): Node[] {\n const nodes: Node[] = [];\n let cursor = before === null ? parent.firstChild : before.nextSibling;\n\n while (cursor !== null && cursor !== after) {\n nodes.push(cursor);\n cursor = cursor.nextSibling;\n }\n\n return nodes;\n}\n\nexport function escapeSelectorString(value: string): string {\n return value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\\"\", \"\\\\\\\"\");\n}\n\nexport function reportRecoverable(\n options: RenderOptions,\n kind: HydrationRecoverableErrorInfo[\"kind\"],\n path: string,\n error: Error,\n): void {\n const componentStack = options.hydration?.componentStack;\n options.hydration?.onRecoverableError?.(error, {\n kind,\n path,\n ...(componentStack === undefined ? {} : { componentStack }),\n });\n}\n\nexport function reportMissingHydrationNode(\n options: RenderOptions,\n path: string,\n): void {\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\"Hydration missing node mismatch.\"),\n );\n}\n\nexport function reportReactSuspenseServerError(\n options: RenderOptions,\n path: string,\n message: string,\n componentStack: string | undefined,\n): void {\n options.hydration?.onRecoverableError?.(new Error(message), {\n kind: \"suspense-server-error\",\n path,\n ...(componentStack === undefined ? {} : { componentStack }),\n });\n}\n\nexport function reportHydrationNodeTypeMismatch(\n options: RenderOptions,\n path: string,\n expected: string,\n existing: Node,\n): void {\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\n `Hydration node type mismatch: expected ${expected} but found ${describeHydrationNode(existing)}.`,\n ),\n );\n}\n\nexport function withHydrationComponentStack(\n options: RenderOptions,\n componentName: string,\n): RenderOptions {\n if (options.hydration === undefined) {\n return options;\n }\n\n const frame = `\\n at ${componentName}`;\n return {\n ...options,\n hydration: {\n ...options.hydration,\n componentStack: `${options.hydration.componentStack ?? \"\"}${frame}`,\n },\n };\n}\n\nexport function reportElementTextMismatch(\n options: RenderOptions,\n path: string,\n existing: Element,\n children: ReactCompatNode,\n): void {\n if (\n (typeof children === \"string\" || typeof children === \"number\") &&\n existing.textContent !== String(children)\n ) {\n reportRecoverable(\n options,\n \"text\",\n path,\n new Error(\"Hydration text mismatch.\"),\n );\n }\n}\n\nexport function reportExtraHydrationNodes(\n options: RenderOptions,\n path: string,\n previousNodes: readonly Node[],\n consumed: number,\n): void {\n if (consumed >= previousNodes.length) {\n return;\n }\n\n reportRecoverable(\n options,\n \"node\",\n path,\n new Error(\"Hydration extra node mismatch.\"),\n );\n}\n\nfunction describeHydrationNode(node: Node): string {\n if (node instanceof HTMLElement) {\n return `<${node.tagName.toLowerCase()}>`;\n }\n\n if (node instanceof Text) {\n return \"text\";\n }\n\n if (node instanceof Comment) {\n return \"comment\";\n }\n\n return \"node\";\n}\n\nfunction readResumeMarkerId(\n value: string,\n prefix: \"mreact-h:start:\" | \"mreact-h:end:\",\n): string | undefined {\n return value.startsWith(prefix)\n ? decodeURIComponent(value.slice(prefix.length))\n : undefined;\n}\n\nfunction findComment(root: ParentNode, value: string): Comment | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n\n if (node instanceof Comment && node.data === value) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction findFollowingComment(start: Comment, value: string): Comment | null {\n let cursor: Node | null = start.nextSibling;\n\n while (cursor !== null) {\n if (cursor instanceof Comment && cursor.data === value) {\n return cursor;\n }\n\n cursor = cursor.nextSibling;\n }\n\n return null;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-compat",
3
- "version": "0.0.156",
3
+ "version": "0.0.158",
4
4
  "description": "React-compatible runtime implementation for mreact.",
5
5
  "keywords": [
6
6
  "compatibility",
@@ -69,7 +69,7 @@
69
69
  "access": "public"
70
70
  },
71
71
  "dependencies": {
72
- "@reckona/mreact-reactive-core": "0.0.156",
73
- "@reckona/mreact-shared": "0.0.156"
72
+ "@reckona/mreact-reactive-core": "0.0.158",
73
+ "@reckona/mreact-shared": "0.0.158"
74
74
  }
75
75
  }
package/src/hydration.ts CHANGED
@@ -43,6 +43,14 @@ export function applyStreamingHydrationFragments(
43
43
  continue;
44
44
  }
45
45
 
46
+ const completionMarker = Array.from(
47
+ root.querySelectorAll<Element>("[data-mreact-oob-complete]"),
48
+ ).find((candidate) => candidate.getAttribute("data-mreact-oob-complete") === id);
49
+
50
+ if (completionMarker === undefined) {
51
+ continue;
52
+ }
53
+
46
54
  const placeholder = root.querySelector<Element>(
47
55
  `[data-mreact-oob-placeholder="${escapeSelectorString(id)}"]`,
48
56
  );
@@ -53,6 +61,7 @@ export function applyStreamingHydrationFragments(
53
61
 
54
62
  placeholder.replaceWith(fragment.content.cloneNode(true));
55
63
  fragment.remove();
64
+ completionMarker.remove();
56
65
  }
57
66
  }
58
67