@hyperframes/parsers 0.8.145 → 0.8.146
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assetResolution.js +0 -1
- package/dist/assets.js +0 -1
- package/dist/colorGradingContract.js +0 -1
- package/dist/composition.js +0 -1
- package/dist/compositionContract.js +0 -1
- package/dist/compositionDuration.js +0 -1
- package/dist/ffBinaries.d.ts +5 -4
- package/dist/ffBinaries.js +40 -10
- package/dist/gsapConstants.js +0 -1
- package/dist/gsapParser.js +0 -1
- package/dist/gsapParserAcorn.js +0 -1
- package/dist/gsapParserExports.js +0 -1
- package/dist/gsapWriterAcorn.js +0 -1
- package/dist/hfIds.js +0 -1
- package/dist/htmlAttributeSpans.js +0 -1
- package/dist/index.js +1 -2
- package/dist/mediaDuration.js +0 -1
- package/dist/mediaDurationFixtures.js +0 -1
- package/dist/slideshow.js +1 -2
- package/dist/springEase.js +0 -1
- package/dist/subCompositionValidity.js +0 -1
- package/dist/topLevelElements.js +0 -1
- package/package.json +2 -2
- package/dist/assetResolution.js.map +0 -1
- package/dist/assets.js.map +0 -1
- package/dist/colorGradingContract.js.map +0 -1
- package/dist/composition.js.map +0 -1
- package/dist/compositionContract.js.map +0 -1
- package/dist/compositionDuration.js.map +0 -1
- package/dist/ffBinaries.js.map +0 -1
- package/dist/gsapConstants.js.map +0 -1
- package/dist/gsapParser.js.map +0 -1
- package/dist/gsapParserAcorn.js.map +0 -1
- package/dist/gsapParserExports.js.map +0 -1
- package/dist/gsapWriterAcorn.js.map +0 -1
- package/dist/hfIds.js.map +0 -1
- package/dist/htmlAttributeSpans.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mediaDuration.js.map +0 -1
- package/dist/mediaDurationFixtures.js.map +0 -1
- package/dist/slideshow.js.map +0 -1
- package/dist/springEase.js.map +0 -1
- package/dist/subCompositionValidity.js.map +0 -1
- package/dist/topLevelElements.js.map +0 -1
package/dist/hfIds.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hfIds.ts","../src/hfIdAssignment.ts"],"sourcesContent":["/**\n * Stable hf- element id minting (R1). Node-safe (linkedom only, not browser DOM).\n *\n * Two surfaces share these helpers:\n * - ensureHfIds(html): node-id surface — mints data-hf-id on every element.\n * - mintHfId(el, assigned): shared by htmlParser for clip ids.\n *\n * Hash is CONTENT ONLY (tag + sorted attrs + own text) — no sibling position,\n * so inserting a non-identical sibling never shifts another element's id.\n */\nimport { parseHTML } from \"linkedom\";\nimport { assignHfIds } from \"./hfIdAssignment.js\";\nexport {\n EXCLUDED_TAGS,\n mintHfId,\n isCompositionTemplate,\n walkCompositionDescendants,\n} from \"./hfIdAssignment.js\";\n\nexport function ensureHfIds(html: string): string {\n // Wrap fragments so every body element participates in stable ID assignment.\n const wrapped = !/^(?:<!doctype|<html[\\s>/])/i.test(\n html.replace(/^(?:\\s|<!--(?:>|->|[\\s\\S]*?-->))*/, \"\"),\n );\n const { document } = wrapped\n ? parseHTML(`<!DOCTYPE html><html><head></head><body>${html}</body></html>`)\n : parseHTML(html);\n if (!document.body) return html;\n assignHfIds(document.body);\n return wrapped ? document.body.innerHTML || \"\" : document.toString();\n}\n","// Non-editable / non-visual elements that should never receive a stable id.\nexport const EXCLUDED_TAGS = new Set([\n \"script\",\n \"style\",\n \"template\",\n \"meta\",\n \"link\",\n \"noscript\",\n \"base\",\n]);\n\n// 32-bit FNV-1a. Pure, deterministic, no crypto, no Math.random.\nfunction fnv1a(str: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\n// 4 base-36 chars · 36^4 ≈ 1.68M ids per document. Birthday-paradox collision\n// ≈ N²/(2·36^4): well under 1% per document after dup rehash at realistic\n// clip-model sizes (≤ a few hundred elements). The dup-rehash in mintHfId\n// resolves the rare collision; width is deliberately small for readable ids.\nfunction toHfId(hash: number): string {\n const s = (hash >>> 0).toString(36);\n // Use suffix (most-avalanched bits) for better distribution within the 4-char window.\n const four = s.length >= 4 ? s.slice(-4) : s.padStart(4, \"0\");\n return `hf-${four}`;\n}\n\n// Element's own direct text (TEXT_NODE children), not descendants'.\nfunction ownText(el: Element): string {\n let text = \"\";\n el.childNodes.forEach((n) => {\n if (n.nodeType === 3) text += (n as Text).nodeValue ?? \"\";\n });\n return text.trim();\n}\n\nfunction getContractAttribute(el: Element, name: string): string | null {\n return Array.from(el.attributes).find((attr) => attr.name.toLowerCase() === name)?.value ?? null;\n}\n\nfunction contentKey(el: Element): string {\n // HTML parsers normalize foreign-content attribute names differently too.\n // Canonicalize only the hash input; retain actual SVG attribute spelling.\n // Exclude all data-hf-* attrs (ids, studio state) — they must not influence the hash.\n // Use \\x00 / \\x01 separators (invalid in HTML attrs) to prevent ambiguous serialization.\n const attrs = Array.from(el.attributes)\n .filter((a) => !a.name.toLowerCase().startsWith(\"data-hf-\"))\n .map((a) => `${a.name.toLowerCase()}\\x00${a.value}`)\n .sort()\n .join(\"\\x01\");\n return `${el.tagName.toLowerCase()}|${attrs}|${ownText(el)}`;\n}\n\n/**\n * Collision tiebreak for byte-identical siblings: document-order dup counter\n * (`hash(key#N)`). This IS order-dependent — two identical `<span></span>`\n * get different ids based on which comes first in the DOM. This is unavoidable:\n * unique ids for byte-identical elements require a positional signal.\n *\n * Why this is safe in practice: once `data-hf-id` is on disk (stamped at project open, or by the\n * first save) it is bound to its element, so reordering identical siblings carries it along, and\n * `ensureHfIds` skips pinned elements (`if (getContractAttribute(el, \"data-hf-id\")) continue`).\n * Before that, an outside edit changes what is minted (an element's attributes or own text, or a\n * twin added or removed), so a save carrying an id served before the edit misses or hits the other\n * twin until the watcher reloads the preview.\n */\n// WIRE CONTRACT: id minting is content-keyed (FNV1a of tag, sorted attrs, own text). R7's\n// preview route relies on mintHfId producing identical ids across mint contexts\n// (served copy vs. the source a save parses) — see preview.test.ts\n// \"bundle returning untagged HTML gets the ids minted from the source file\". Any change that adds\n// positional, session, or random input to the hash breaks that invariant and\n// makes hf- ids diverge between disk and served HTML, silently corrupting\n// drag-to-edit targeting.\nexport function mintHfId(el: Element, assigned: Set<string>): string {\n const key = contentKey(el);\n let id = toHfId(fnv1a(key));\n let dup = 0;\n while (assigned.has(id)) {\n dup += 1;\n // Graceful fallback instead of a hard throw: rehashing only fails to find a\n // free 4-char slot in a pathological document (~1.6M identical elements).\n // Rather than crash the whole parse, widen the id with the dup counter —\n // still deterministic and unique, just longer than the 4-char norm.\n if (dup > 10000) {\n id = `hf-${(fnv1a(key) >>> 0).toString(36)}-${dup}`;\n break;\n }\n id = toHfId(fnv1a(`${key}#${dup}`));\n }\n assigned.add(id);\n return id;\n}\n\n/**\n * True for a sub-composition authoring template whose content the studio preview\n * unwraps into the served body. Two accepted forms:\n * A) `<template data-composition-id=\"X\">…` — the id on the template itself.\n * B) `<template id=\"X-template\"><div data-composition-id=\"X\">…` — the id on the\n * wrapped root div (the form `hyperframes add` scaffolds and registry blocks use).\n * Only these are treated as transparent containers for hf-id purposes. A plain\n * `<template>` (runtime clone-source: list item, particle, etc.) must NOT get\n * inner ids — its content is cloned N times into the live DOM, so a persisted\n * inner id would be duplicated across every clone. Form B is distinguished from\n * a clone-source by the presence of a direct `[data-composition-id]` child.\n */\nfunction getChildElements(parent: Element): Element[] {\n const directChildren = Array.from(parent.children);\n if (directChildren.length || parent.tagName.toLowerCase() !== \"template\") return directChildren;\n const content = (parent as HTMLTemplateElement).content;\n if (content?.children.length) return Array.from(content.children);\n return directChildren;\n}\n\nexport function isCompositionTemplate(el: Element): boolean {\n if (el.tagName.toLowerCase() !== \"template\") return false;\n if (getContractAttribute(el, \"data-composition-id\") !== null) return true;\n for (const child of getChildElements(el)) {\n if (getContractAttribute(child, \"data-composition-id\") !== null) return true;\n }\n return false;\n}\n\n/**\n * Walk document-order descendants, descending through composition templates\n * while keeping plain templates inert. linkedom's querySelectorAll does not\n * expose template contents, so callers that model the served composition use\n * this traversal instead.\n */\nexport function walkCompositionDescendants(\n root: Document | Element,\n visit: (el: Element) => void,\n): void {\n const rootElement: Element | null =\n root.nodeType === 9 ? (root as Document).documentElement : (root as Element);\n if (!rootElement) return;\n\n const walk = (parent: Element): void => {\n for (const child of getChildElements(parent)) {\n const isTemplate = child.tagName.toLowerCase() === \"template\";\n if (isTemplate && !isCompositionTemplate(child)) continue;\n visit(child);\n walk(child);\n }\n };\n\n walk(rootElement);\n}\n\n// Internal DOM-only assignment: callers retain their parser and document identity.\nexport function assignHfIds(body: Element): void {\n const assigned = new Set<string>();\n walkCompositionDescendants(body, (el) => {\n const existing = getContractAttribute(el, \"data-hf-id\");\n if (existing) assigned.add(existing);\n });\n walkCompositionDescendants(body, (el) => {\n if (EXCLUDED_TAGS.has(el.tagName.toLowerCase())) return;\n if (getContractAttribute(el, \"data-hf-id\")) return;\n el.setAttribute(\"data-hf-id\", mintHfId(el, assigned));\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/htmlAttributeSpans.ts"],"sourcesContent":["import { decodeHTMLAttribute } from \"entities/decode\";\n\nexport type HtmlAttributeSpan = {\n name: string;\n start: number;\n end: number;\n} & (\n | { kind: \"boolean\" }\n | { kind: \"value\"; value: string; valueStart: number; valueEnd: number; quote: string }\n);\n\nexport interface HtmlOpeningTagSpan {\n name: string;\n start: number;\n end: number;\n bodyEnd: number;\n closed: boolean;\n rawTextEnd: number | null;\n attributes: HtmlAttributeSpan[];\n}\n\nfunction readAttributeValue(html: string, at: number) {\n while (/[\\t\\n\\f\\r ]/.test(html.charAt(at))) at++;\n const quote = ['\"', \"'\"].includes(html.charAt(at)) ? html.charAt(at) : \"\";\n if (quote) at++;\n const valueStart = at;\n if (quote) {\n const closing = html.indexOf(quote, at);\n at = closing === -1 ? html.length : closing;\n } else {\n while (at < html.length && !/[\\t\\n\\f\\r >]/.test(html[at]!)) at++;\n }\n const valueEnd = at;\n const end = quote ? Math.min(valueEnd + 1, html.length) : valueEnd;\n return { value: html.slice(valueStart, valueEnd), valueStart, valueEnd, quote, end };\n}\n\nfunction readAttribute(html: string, start: number): HtmlAttributeSpan | null {\n let at = start;\n while (at < html.length && !/[\\t\\n\\f\\r =/>]/.test(html[at]!)) at++;\n if (at === start) return null;\n const name = html.slice(start, at).toLowerCase();\n const nameEnd = at;\n while (/[\\t\\n\\f\\r ]/.test(html[at] ?? \"\")) at++;\n if (html[at] !== \"=\") return { kind: \"boolean\", name, start, end: nameEnd };\n return { kind: \"value\", name, start, ...readAttributeValue(html, at + 1) };\n}\n\nfunction readOpeningTag(html: string, start: number, name: string, at: number): HtmlOpeningTagSpan {\n const attributes: HtmlAttributeSpan[] = [];\n while (at < html.length) {\n while (/[\\t\\n\\f\\r /]/.test(html[at] ?? \"\")) at++;\n if (at >= html.length || html[at] === \">\") break;\n const attribute = readAttribute(html, at);\n if (attribute === null) {\n at++;\n continue;\n }\n attributes.push(attribute);\n at = attribute.end;\n }\n const closed = html[at] === \">\";\n return {\n name: name.toLowerCase(),\n start,\n bodyEnd: at,\n end: closed ? at + 1 : at,\n closed,\n rawTextEnd: null,\n attributes,\n };\n}\n\nexport function scanHtmlOpeningTags(html: string): HtmlOpeningTagSpan[] {\n const tags: HtmlOpeningTagSpan[] = [];\n const opening = /<!--[\\s\\S]*?(?:--!?>|$)|<([a-z][^\\t\\n\\f\\r />]*)/gi;\n let match: RegExpExecArray | null;\n while ((match = opening.exec(html)) !== null) {\n if (!match[1]) continue;\n const tag = readOpeningTag(html, match.index, match[1], opening.lastIndex);\n tags.push(tag);\n opening.lastIndex = tag.end;\n if (\n [\n \"script\",\n \"style\",\n \"textarea\",\n \"title\",\n \"xmp\",\n \"iframe\",\n \"noembed\",\n \"noframes\",\n \"plaintext\",\n ].includes(tag.name)\n ) {\n if (tag.name === \"plaintext\") {\n tag.rawTextEnd = html.length;\n break;\n }\n const closing = new RegExp(`</${tag.name}(?=[\\\\t\\\\n\\\\f\\\\r />])`, \"gi\");\n closing.lastIndex = tag.end;\n const end = closing.exec(html);\n tag.rawTextEnd = end?.index ?? html.length;\n opening.lastIndex = tag.rawTextEnd;\n }\n }\n return tags;\n}\n\nexport const HTML_ATTRIBUTE_ENTITIES: Record<string, readonly string[]> = {\n \"&\": [\"&\"],\n '\"': [\""\"],\n \"'\": [\"'\", \"'\"],\n \"<\": [\"<\"],\n \">\": [\">\"],\n};\nexport function decodeAuthoredAttribute(value: string): string {\n return decodeHTMLAttribute(value);\n}\n"],"mappings":"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","names":[]}
|