domflax 0.1.0 → 0.1.1

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 (39) hide show
  1. package/README.md +159 -0
  2. package/dist/{chunk-4HHISSMR.js → chunk-DNHOGPYV.js} +2675 -1503
  3. package/dist/chunk-DNHOGPYV.js.map +1 -0
  4. package/dist/{chunk-ZJ2S36GY.js → chunk-DOQEBGWB.js} +33 -20
  5. package/dist/chunk-DOQEBGWB.js.map +1 -0
  6. package/dist/{chunk-77SLHRN6.js → chunk-DWLB7FRR.js} +341 -176
  7. package/dist/chunk-DWLB7FRR.js.map +1 -0
  8. package/dist/cli.cjs +2169 -760
  9. package/dist/cli.cjs.map +1 -1
  10. package/dist/cli.js +183 -91
  11. package/dist/cli.js.map +1 -1
  12. package/dist/index.cjs +3021 -1699
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +477 -54
  15. package/dist/index.d.ts +477 -54
  16. package/dist/index.js +49 -3
  17. package/dist/pattern-CV607P87.d.ts +547 -0
  18. package/dist/pattern-F5xBtIE-.d.cts +547 -0
  19. package/dist/pattern-kit.cjs +60 -39
  20. package/dist/pattern-kit.cjs.map +1 -1
  21. package/dist/pattern-kit.d.cts +3 -18
  22. package/dist/pattern-kit.d.ts +3 -18
  23. package/dist/pattern-kit.js +3 -1
  24. package/dist/pattern-kit.js.map +1 -1
  25. package/dist/{types-BQ7l6dVe.d.ts → resolve-ops-DIwEelH-.d.cts} +26 -251
  26. package/dist/{types-BQ7l6dVe.d.cts → resolve-ops-DIwEelH-.d.ts} +26 -251
  27. package/dist/verify.d.cts +1 -1
  28. package/dist/verify.d.ts +1 -1
  29. package/dist/webpack-loader.cjs +2975 -1699
  30. package/dist/webpack-loader.cjs.map +1 -1
  31. package/dist/webpack-loader.d.cts +2 -2
  32. package/dist/webpack-loader.d.ts +2 -2
  33. package/dist/webpack-loader.js +3 -3
  34. package/package.json +3 -6
  35. package/dist/chunk-4HHISSMR.js.map +0 -1
  36. package/dist/chunk-77SLHRN6.js.map +0 -1
  37. package/dist/chunk-ZJ2S36GY.js.map +0 -1
  38. package/dist/pattern-CX6iBzTD.d.ts +0 -237
  39. package/dist/pattern-P4FIKAUB.d.cts +0 -237
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/builders.ts","../../core/src/ops.ts","../../core/src/pass-manager.ts","../../core/src/pipeline.ts","../../core/src/reverse-emit.ts","../../core/src/index.ts","../../pattern-kit/src/define.ts","../../pattern-kit/src/normalize.ts","../../pattern-kit/src/combinators.ts","../../pattern-kit/src/ops.ts","../../pattern-kit/src/pattern.ts","../../pattern-kit/src/index.ts"],"sourcesContent":["/**\n * @domflax/core — runtime builders + traversal.\n *\n * Pure, dependency-free helpers to construct IR nodes, assemble an {@link IRDocument},\n * and walk the tree honouring {@link VisitSignal}. No heavy third-party deps: only the\n * type contract in `./types`.\n */\n\nimport type {\n AttrMap,\n Backref,\n BackrefTable,\n ClassList,\n ConditionKey,\n CssProperty,\n ExprRecord,\n ExprRef,\n ExprRegistry,\n FrontendKind,\n IdAllocator,\n IRComment,\n IRDocument,\n IRElement,\n IRExpr,\n IRFragment,\n IRNamespace,\n IRNode,\n IRNodeId,\n IRText,\n InlineStyle,\n NodeMeta,\n SafetyLevel,\n SourceSpan,\n StyleBlock,\n StyleCondition,\n StyleMap,\n Visitor,\n VisitContext,\n VisitSignal,\n} from './types';\n\n/* ───────────────────────── id / registry primitives ───────────────────────── */\n\n/** Monotonic IRNodeId allocator. `peek` reports the id `next()` would return. */\nexport function createIdAllocator(start = 1): IdAllocator {\n let n = start;\n return {\n next(): IRNodeId {\n const id = n;\n n += 1;\n return id as IRNodeId;\n },\n get peek(): IRNodeId {\n return n as IRNodeId;\n },\n };\n}\n\n/** Minimal in-memory ExprRegistry. */\nexport function createExprRegistry(start = 1): ExprRegistry {\n const map = new Map<ExprRef, ExprRecord>();\n let n = start;\n return {\n get(r: ExprRef): ExprRecord | undefined {\n return map.get(r);\n },\n intern(rec: Omit<ExprRecord, 'ref'>): ExprRef {\n const ref = n as ExprRef;\n n += 1;\n map.set(ref, { ...rec, ref });\n return ref;\n },\n releasePayloads(): void {\n for (const [k, v] of map) map.set(k, { ...v, payload: undefined });\n },\n };\n}\n\n/** Mutable BackrefTable: frontends register backrefs as they parse. */\nexport interface MutableBackrefTable extends BackrefTable {\n set(id: IRNodeId, backref: Backref): void;\n}\n\nexport function createBackrefTable(): MutableBackrefTable {\n const map = new Map<IRNodeId, Backref>();\n return {\n get(id: IRNodeId): Backref | undefined {\n return map.get(id);\n },\n span(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.span ?? null;\n },\n childrenSpan(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.innerSpan ?? null;\n },\n set(id: IRNodeId, backref: Backref): void {\n map.set(id, backref);\n },\n };\n}\n\n/* ───────────────────────── default sub-structures ───────────────────────── */\n\n/** A NodeMeta with every barrier/flag cleared. */\nexport function defaultMeta(safetyFloor: SafetyLevel = 0): NodeMeta {\n return {\n hasRef: false,\n hasEventHandlers: false,\n hasKey: false,\n hasSpreadAttrs: false,\n hasDynamicChildren: false,\n isComponent: false,\n hasDangerousHtml: false,\n targetedByCombinator: false,\n targetedByStructuralPseudo: false,\n selectorDependents: 0,\n hasOwnVisualStyle: false,\n establishesBox: false,\n establishesStackingContext: false,\n isContainingBlock: false,\n establishesFormattingContext: false,\n declaresCustomProperties: false,\n whitespaceSensitive: false,\n touched: false,\n synthetic: false,\n safetyFloor,\n };\n}\n\n/** Canonical base style condition (`media:'' states:[] pseudoElement:''`). */\nexport const BASE_CONDITION: StyleCondition = { media: '', states: [], pseudoElement: '' };\n\n/** Stable serialization of a StyleCondition into a ConditionKey. */\nexport function conditionKey(c: StyleCondition): ConditionKey {\n const states = [...c.states].sort().join(',');\n return `${c.media}|${states}|${c.pseudoElement}` as ConditionKey;\n}\n\nexport const BASE_CONDITION_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** An empty StyleMap (no blocks). */\nexport function emptyStyleMap(): StyleMap {\n return { blocks: new Map<ConditionKey, StyleBlock>() };\n}\n\n/** An empty (absent) ClassList. */\nexport function emptyClassList(): ClassList {\n return {\n form: 'absent',\n segments: [],\n valueSpan: null,\n hasDynamic: false,\n opaque: false,\n rewritable: false,\n };\n}\n\n/** An empty AttrMap. */\nexport function emptyAttrMap(): AttrMap {\n return { entries: new Map(), spreads: [], order: [] };\n}\n\n/** An empty InlineStyle. */\nexport function emptyInlineStyle(): InlineStyle {\n return { decls: new Map<CssProperty, never>() as InlineStyle['decls'], dynamic: null };\n}\n\n/* ───────────────────────── node factories ───────────────────────── */\n\nexport interface ElementInit {\n readonly tag: string;\n readonly namespace?: IRNamespace;\n readonly isComponent?: boolean;\n readonly selfClosing?: boolean;\n readonly classes?: ClassList;\n readonly inlineStyle?: InlineStyle;\n readonly computed?: StyleMap;\n readonly attrs?: AttrMap;\n readonly children?: IRNodeId[];\n readonly parent?: IRNodeId | null;\n readonly span?: SourceSpan | null;\n readonly meta?: NodeMeta;\n}\n\nexport function createElement(id: IRNodeId, init: ElementInit): IRElement {\n return {\n id,\n kind: 'element',\n parent: init.parent ?? null,\n span: init.span ?? null,\n meta: init.meta ?? defaultMeta(),\n tag: init.tag,\n namespace: init.namespace ?? 'html',\n isComponent: init.isComponent ?? false,\n selfClosing: init.selfClosing ?? false,\n classes: init.classes ?? emptyClassList(),\n inlineStyle: init.inlineStyle ?? emptyInlineStyle(),\n computed: init.computed ?? emptyStyleMap(),\n attrs: init.attrs ?? emptyAttrMap(),\n children: init.children ?? [],\n };\n}\n\nexport function createText(\n id: IRNodeId,\n value: string,\n opts?: { collapsible?: boolean; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRText {\n return {\n id,\n kind: 'text',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n collapsible: opts?.collapsible ?? true,\n };\n}\n\nexport function createExpr(\n id: IRNodeId,\n expr: ExprRef,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRExpr {\n return {\n id,\n kind: 'expr',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n expr,\n };\n}\n\nexport function createFragment(\n id: IRNodeId,\n opts?: { children?: IRNodeId[]; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRFragment {\n return {\n id,\n kind: 'fragment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n children: opts?.children ?? [],\n };\n}\n\nexport function createComment(\n id: IRNodeId,\n value: string,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRComment {\n return {\n id,\n kind: 'comment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n };\n}\n\n/** Build an empty document whose root is a fresh fragment. */\nexport function createDocument(frontend: FrontendKind): IRDocument {\n const alloc = createIdAllocator();\n const rootId = alloc.next();\n const root = createFragment(rootId);\n const nodes = new Map<IRNodeId, IRNode>([[rootId, root]]);\n return {\n root: rootId,\n nodes,\n exprs: createExprRegistry(),\n sources: new Map(),\n backref: createBackrefTable(),\n frontend,\n alloc,\n };\n}\n\n/* ───────────────────────── tree accessors ───────────────────────── */\n\n/** Returns the child id list for container nodes, or an empty array. */\nexport function childIds(node: IRNode): readonly IRNodeId[] {\n return node.kind === 'element' || node.kind === 'fragment' ? node.children : [];\n}\n\n/** Returns the node, or undefined. */\nexport function getNode(doc: IRDocument, id: IRNodeId): IRNode | undefined {\n return doc.nodes.get(id);\n}\n\n/** Returns the node iff it is an element. */\nexport function getElement(doc: IRDocument, id: IRNodeId): IRElement | undefined {\n const n = doc.nodes.get(id);\n return n && n.kind === 'element' ? n : undefined;\n}\n\n/** Pre-order list of every element id reachable from the root. */\nexport function elementIds(doc: IRDocument): IRNodeId[] {\n const out: IRNodeId[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n if (n.kind === 'element') out.push(id);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/* ───────────────────────── traversal ───────────────────────── */\n\n/**\n * Depth-first pre/post-order walk. `enter` may return `'skip'` (don't descend) or `'stop'`\n * (abort the whole walk); `exit` may return `'stop'`. The visitor receives a live {@link IRNode}\n * plus a {@link VisitContext} exposing depth and the parent node.\n */\nexport function walk(doc: IRDocument, visitor: Visitor): void {\n const roDoc = doc as unknown as VisitContext['doc'];\n let stopped = false;\n\n const visit = (id: IRNodeId, depth: number): void => {\n if (stopped) return;\n const node = doc.nodes.get(id);\n if (!node) return;\n\n const ctx: VisitContext = {\n doc: roDoc,\n depth,\n parent(): IRNode | null {\n return node.parent == null ? null : doc.nodes.get(node.parent) ?? null;\n },\n };\n\n const entered: VisitSignal = visitor.enter ? visitor.enter(node, ctx) : undefined;\n if (entered === 'stop') {\n stopped = true;\n return;\n }\n if (entered !== 'skip') {\n for (const child of childIds(node)) {\n visit(child, depth + 1);\n if (stopped) return;\n }\n }\n\n const exited: VisitSignal = visitor.exit ? visitor.exit(node, ctx) : undefined;\n if (exited === 'stop') stopped = true;\n };\n\n visit(doc.root, 0);\n}\n","/**\n * @domflax/core — the pure applier (the one trusted mutator).\n *\n * {@link applyOps} takes an {@link IRDocument} plus a flat list of {@link RewriteOp}s and returns\n * a NEW, mutated document (the input document is left untouched — \"pure\" in the input-immutability\n * sense). Every op is validated against the safety ceiling and node-local safety floor before it\n * runs; rejected ops are collected into {@link ApplyResult.skipped} with {@link Diagnostic}s rather\n * than throwing. Dependency-free: only the `./types` contract and `./builders` runtime helpers.\n */\n\nimport type {\n ApplyContext,\n ApplyResult,\n AttrMap,\n AttrValue,\n ConditionKey,\n CssProperty,\n Diagnostic,\n DiagnosticCode,\n ElementSpec,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n NodeSpec,\n RewriteGroup,\n RewriteOp,\n SkippedOpGroup,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleConflictPolicy,\n} from './types';\n\nimport {\n BASE_CONDITION_KEY,\n createComment,\n createElement,\n createExpr,\n createFragment,\n createText,\n defaultMeta,\n} from './builders';\n\n/* ───────────────────────── result of an apply run ───────────────────────── */\n\nexport interface ApplyOutcome {\n /** The new document (the input doc is never mutated). */\n readonly doc: IRDocument;\n readonly result: ApplyResult;\n}\n\ninterface MutState {\n readonly doc: IRDocument;\n readonly touched: Set<IRNodeId>;\n readonly removed: Set<IRNodeId>;\n readonly created: Set<IRNodeId>;\n readonly diagnostics: Diagnostic[];\n readonly skipped: SkippedOpGroup[];\n appliedGroups: number;\n readonly ceiling: number;\n readonly ctx: ApplyContext;\n}\n\n/* ───────────────────────── cloning (keep input pure) ───────────────────────── */\n\nfunction cloneStyleMap(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n blocks.set(key, {\n condition: block.condition,\n decls: new Map<CssProperty, StyleDecl>(block.decls),\n });\n }\n return { blocks };\n}\n\nfunction cloneNode(node: IRNode): IRNode {\n const meta = { ...node.meta };\n switch (node.kind) {\n case 'element':\n return {\n ...node,\n meta,\n children: [...node.children],\n computed: cloneStyleMap(node.computed),\n };\n case 'fragment':\n return { ...node, meta, children: [...node.children] };\n default:\n return { ...node, meta };\n }\n}\n\n/** Shallow-immutable clone: input doc and its node objects are never mutated. */\nexport function cloneDocument(doc: IRDocument): IRDocument {\n const nodes = new Map<IRNodeId, IRNode>();\n for (const [id, n] of doc.nodes) nodes.set(id, cloneNode(n));\n return {\n root: doc.root,\n nodes,\n exprs: doc.exprs,\n sources: doc.sources,\n backref: doc.backref,\n frontend: doc.frontend,\n alloc: doc.alloc,\n };\n}\n\n/* ───────────────────────── small helpers ───────────────────────── */\n\nfunction diag(\n code: DiagnosticCode,\n message: string,\n extra?: Partial<Diagnostic>,\n): Diagnostic {\n return { code, severity: 'warn', message, ...extra };\n}\n\nfunction getParentChildren(doc: IRDocument, id: IRNodeId): IRNodeId[] | null {\n const node = doc.nodes.get(id);\n if (!node || node.parent == null) return null;\n const parent = doc.nodes.get(node.parent);\n if (!parent) return null;\n if (parent.kind === 'element' || parent.kind === 'fragment') return parent.children;\n return null;\n}\n\nfunction indexInParent(doc: IRDocument, id: IRNodeId): number {\n const siblings = getParentChildren(doc, id);\n return siblings ? siblings.indexOf(id) : -1;\n}\n\nfunction markTouched(state: MutState, id: IRNodeId): void {\n const n = state.doc.nodes.get(id);\n if (n) {\n n.meta.touched = true;\n state.touched.add(id);\n }\n}\n\nfunction removeSubtree(state: MutState, id: IRNodeId): void {\n const node = state.doc.nodes.get(id);\n if (!node) return;\n if (node.kind === 'element' || node.kind === 'fragment') {\n for (const child of [...node.children]) removeSubtree(state, child);\n }\n state.doc.nodes.delete(id);\n state.removed.add(id);\n}\n\n/* ───────────────────────── spec materialization ───────────────────────── */\n\nfunction specToAttrs(map: ReadonlyMap<string, string | boolean> | undefined): AttrMap {\n if (!map || map.size === 0) return { entries: new Map(), spreads: [], order: [] };\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n for (const [k, v] of map) {\n entries.set(k, { kind: 'static', value: v });\n order.push(k);\n }\n return { entries, spreads: [], order };\n}\n\n/** Materialize a detached {@link NodeSpec} into live nodes; returns the new (or reused) id. */\nfunction materialize(state: MutState, spec: NodeSpec, parent: IRNodeId | null): IRNodeId {\n const { doc } = state;\n if (spec.kind === 'ref') {\n const existing = doc.nodes.get(spec.ref);\n if (existing) existing.parent = parent;\n return spec.ref;\n }\n\n const id = doc.alloc.next();\n state.created.add(id);\n switch (spec.kind) {\n case 'element': {\n const childIds: IRNodeId[] = [];\n const el = createElement(id, {\n tag: spec.tag,\n namespace: spec.namespace,\n selfClosing: spec.selfClosing,\n attrs: specToAttrs(spec.attrs),\n parent,\n meta: { ...defaultMeta(), synthetic: true },\n });\n if (spec.classes) el.computed = cloneStyleMap(spec.classes);\n doc.nodes.set(id, el);\n for (const child of spec.children ?? []) {\n childIds.push(materialize(state, child, id));\n }\n el.children = childIds;\n return id;\n }\n case 'text': {\n const t = createText(id, spec.value, { parent });\n t.meta.synthetic = true;\n doc.nodes.set(id, t);\n return id;\n }\n case 'expr': {\n const e = createExpr(id, spec.expr, { parent });\n e.meta.synthetic = true;\n doc.nodes.set(id, e);\n return id;\n }\n case 'comment': {\n const c = createComment(id, spec.value, { parent });\n c.meta.synthetic = true;\n doc.nodes.set(id, c);\n return id;\n }\n case 'fragment': {\n const frag = createFragment(id, { parent });\n frag.meta.synthetic = true;\n doc.nodes.set(id, frag);\n const childIds: IRNodeId[] = [];\n for (const child of spec.children) childIds.push(materialize(state, child, id));\n frag.children = childIds;\n return id;\n }\n }\n}\n\nfunction elementSpecToNode(state: MutState, spec: ElementSpec, parent: IRNodeId | null): IRNodeId {\n return materialize(state, spec, parent);\n}\n\n/* ───────────────────────── style merging ───────────────────────── */\n\nfunction isInherited(state: MutState, decl: StyleDecl): boolean {\n if (decl.inherited) return true;\n const table = state.ctx.normalizer?.inherited;\n if (table) {\n try {\n return table.isInherited(decl.property);\n } catch {\n return decl.inherited;\n }\n }\n return decl.inherited;\n}\n\ninterface MergeReport {\n readonly map: StyleMap;\n readonly conflict: boolean;\n}\n\n/** Merge `source` decls into `target`, condition-by-condition, per the conflict policy. */\nfunction mergeStyleMaps(\n target: StyleMap,\n source: StyleMap,\n policy: StyleConflictPolicy,\n): MergeReport {\n // Mutable working copy; returned (widened) as an immutable StyleMap.\n const blocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(target).blocks);\n let conflict = false;\n\n for (const [key, srcBlock] of source.blocks) {\n const existing = blocks.get(key);\n if (!existing) {\n blocks.set(key, {\n condition: srcBlock.condition,\n decls: new Map<CssProperty, StyleDecl>(srcBlock.decls),\n });\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>(existing.decls);\n for (const [prop, srcDecl] of srcBlock.decls) {\n const had = decls.get(prop);\n if (had && had.value !== srcDecl.value) {\n conflict = true;\n if (policy === 'target-wins') continue;\n // 'abort' is handled by the caller before commit; 'source-wins' falls through.\n }\n if (policy === 'target-wins' && had) continue;\n decls.set(prop, srcDecl);\n }\n blocks.set(key, { condition: existing.condition, decls });\n }\n return { map: { blocks }, conflict };\n}\n\n/* ───────────────────────── per-op handlers ───────────────────────── */\n\nfunction safetyOk(state: MutState, op: RewriteOp, targetId: IRNodeId): Diagnostic | null {\n const opSafety = op.origin.safety;\n if (opSafety > state.ceiling) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds ceiling ${state.ceiling}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n const node = state.doc.nodes.get(targetId);\n if (node && opSafety > node.meta.safetyFloor) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds node ${targetId} floor ${node.meta.safetyFloor}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n return null;\n}\n\n/** Returns a list of validation issues; empty ⇒ the op was applied. */\nfunction applyOne(state: MutState, op: RewriteOp): Diagnostic[] {\n const { doc } = state;\n\n const primary = primaryTarget(op);\n if (primary != null) {\n if (!doc.nodes.get(primary)) {\n return [\n diag('DF_OP_PRECONDITION_FAILED', `target node ${primary} not found`, {\n nodeId: primary,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n const safety = safetyOk(state, op, primary);\n if (safety) return [safety];\n }\n\n switch (op.op) {\n case 'removeNode': {\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n removeSubtree(state, op.target);\n return [];\n }\n\n case 'unwrap': {\n const node = doc.nodes.get(op.target);\n if (!node || (node.kind !== 'element' && node.kind !== 'fragment')) {\n return [precond(op, op.target, 'unwrap target is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'unwrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const kids = node.children;\n for (const k of kids) {\n const kn = doc.nodes.get(k);\n if (kn) kn.parent = node.parent;\n }\n siblings.splice(at, 1, ...kids);\n doc.nodes.delete(op.target);\n state.removed.add(op.target);\n if (node.parent != null) markTouched(state, node.parent);\n return [];\n }\n\n case 'replaceWith': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'replaceWith target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const newId = materialize(state, op.replacement, parentId);\n siblings.splice(at, 1, newId);\n removeSubtree(state, op.target);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'wrap': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'wrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const wrapperId = elementSpecToNode(state, op.wrapper, parentId);\n const wrapper = doc.nodes.get(wrapperId);\n const targetNode = doc.nodes.get(op.target);\n if (wrapper && (wrapper.kind === 'element' || wrapper.kind === 'fragment')) {\n wrapper.children.push(op.target);\n }\n if (targetNode) targetNode.parent = wrapperId;\n siblings.splice(at, 1, wrapperId);\n return [];\n }\n\n case 'insertBefore':\n case 'insertAfter': {\n const siblings = getParentChildren(doc, op.anchor);\n if (!siblings) return [precond(op, op.anchor, 'insert anchor has no parent')];\n const at = siblings.indexOf(op.anchor);\n const parentId = doc.nodes.get(op.anchor)?.parent ?? null;\n const newId = materialize(state, op.node, parentId);\n siblings.splice(op.op === 'insertBefore' ? at : at + 1, 0, newId);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'moveNode': {\n const newParent = doc.nodes.get(op.newParent);\n if (!newParent || (newParent.kind !== 'element' && newParent.kind !== 'fragment')) {\n return [precond(op, op.newParent, 'moveNode newParent is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n const target = doc.nodes.get(op.target);\n if (target) target.parent = op.newParent;\n const idx = Math.max(0, Math.min(op.index, newParent.children.length));\n newParent.children.splice(idx, 0, op.target);\n markTouched(state, op.newParent);\n return [];\n }\n\n case 'mergeSiblings': {\n const first = doc.nodes.get(op.first);\n const second = doc.nodes.get(op.second);\n if (!first || !second) return [precond(op, op.first, 'mergeSiblings node missing')];\n if (\n (first.kind === 'element' || first.kind === 'fragment') &&\n (second.kind === 'element' || second.kind === 'fragment')\n ) {\n for (const c of second.children) {\n const cn = doc.nodes.get(c);\n if (cn) cn.parent = op.first;\n first.children.push(c);\n }\n second.children = [];\n }\n const siblings = getParentChildren(doc, op.second);\n if (siblings) {\n const i = siblings.indexOf(op.second);\n if (i >= 0) siblings.splice(i, 1);\n }\n doc.nodes.delete(op.second);\n state.removed.add(op.second);\n markTouched(state, op.first);\n return [];\n }\n\n case 'setClassList': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'setClassList target is not an element')];\n }\n el.computed = cloneStyleMap(op.style);\n markTouched(state, op.target);\n return [];\n }\n\n case 'mergeStyle': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'mergeStyle target is not an element')];\n }\n const report = mergeStyleMaps(el.computed, op.style, op.onConflict);\n if (report.conflict && op.onConflict === 'abort') {\n return [\n diag('DF_STYLE_CONFLICT_UNRESOLVED', `mergeStyle aborted on conflict at ${op.target}`, {\n nodeId: op.target,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n el.computed = report.map;\n if (op.source != null) {\n const src = doc.nodes.get(op.source);\n if (src) markTouched(state, op.source);\n }\n markTouched(state, op.target);\n return [];\n }\n\n case 'foldInheritedStyles':\n return applyFold(state, op);\n }\n}\n\nfunction applyFold(\n state: MutState,\n op: Extract<RewriteOp, { op: 'foldInheritedStyles' }>,\n): Diagnostic[] {\n const { doc } = state;\n const from = doc.nodes.get(op.from);\n if (!from || from.kind !== 'element') {\n return [precond(op, op.from, 'fold source is not an element')];\n }\n const issues: Diagnostic[] = [];\n const onlyProps: ReadonlySet<CssProperty> | null =\n op.properties === 'all-inherited' ? null : new Set(op.properties);\n\n const conditionKeys =\n op.conditions === 'all'\n ? [...from.computed.blocks.keys()]\n : [BASE_CONDITION_KEY];\n\n for (const intoId of op.into) {\n const into = doc.nodes.get(intoId);\n if (!into || into.kind !== 'element') {\n issues.push(precond(op, intoId, 'fold target is not an element'));\n continue;\n }\n // Mutable working copy; assigned back (widened) as an immutable StyleMap.\n const nextBlocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(into.computed).blocks);\n let folded = false;\n\n for (const key of conditionKeys) {\n const srcBlock = from.computed.blocks.get(key);\n if (!srcBlock) continue;\n const dstBlock = nextBlocks.get(key);\n const decls = dstBlock\n ? new Map<CssProperty, StyleDecl>(dstBlock.decls)\n : new Map<CssProperty, StyleDecl>();\n\n for (const [prop, decl] of srcBlock.decls) {\n if (onlyProps && !onlyProps.has(prop)) continue;\n if (!isInherited(state, decl)) continue;\n if (decl.relativeToParent) {\n issues.push(\n diag(\n 'DF_RELATIVE_UNIT_FOLD',\n `refused to fold relative-unit declaration '${decl.property}' onto ${intoId}`,\n { nodeId: intoId, pattern: op.origin.pattern, severity: 'warn' },\n ),\n );\n continue;\n }\n if (!decls.has(prop)) {\n decls.set(prop, decl);\n folded = true;\n }\n }\n nextBlocks.set(key, { condition: srcBlock.condition, decls });\n }\n\n if (folded) {\n into.computed = { blocks: nextBlocks };\n markTouched(state, intoId);\n }\n }\n // Non-blocking (DF_RELATIVE_UNIT_FOLD) diagnostics are recorded but do not skip the op.\n for (const d of issues) state.diagnostics.push(d);\n return [];\n}\n\nfunction precond(op: RewriteOp, nodeId: IRNodeId, message: string): Diagnostic {\n return diag('DF_OP_PRECONDITION_FAILED', message, {\n nodeId,\n pattern: op.origin.pattern,\n severity: 'error',\n });\n}\n\nfunction primaryTarget(op: RewriteOp): IRNodeId | null {\n switch (op.op) {\n case 'removeNode':\n case 'unwrap':\n case 'replaceWith':\n case 'wrap':\n case 'moveNode':\n case 'setClassList':\n case 'mergeStyle':\n return op.target;\n case 'insertBefore':\n case 'insertAfter':\n return op.anchor;\n case 'mergeSiblings':\n return op.first;\n case 'foldInheritedStyles':\n return op.from;\n }\n}\n\n/* ───────────────────────── public entry points ───────────────────────── */\n\n/**\n * Apply a flat list of ops to a copy of `doc`. The input document is never mutated.\n * Each op is independently validated; failing ops are skipped (collected in\n * {@link ApplyResult.skipped}) instead of throwing.\n */\nexport function applyOps(\n doc: IRDocument,\n ops: readonly RewriteOp[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n const cloned = cloneDocument(doc);\n const state: MutState = {\n doc: cloned,\n touched: new Set(),\n removed: new Set(),\n created: new Set(),\n diagnostics: [],\n skipped: [],\n appliedGroups: 0,\n ceiling: ctx?.safetyCeiling ?? 3,\n ctx: { doc: cloned, safetyCeiling: ctx?.safetyCeiling ?? 3, ...ctx } as ApplyContext,\n };\n\n for (const op of ops) {\n const issues = applyOne(state, op);\n if (issues.length > 0) {\n state.skipped.push({\n group: { pattern: op.origin.pattern, anchor: primaryTarget(op) ?? doc.root, ops: [op] },\n issues: issues.map((d) => ({ op, code: d.code, message: d.message })),\n });\n for (const d of issues) state.diagnostics.push(d);\n } else {\n state.appliedGroups += 1;\n }\n }\n\n return { doc: cloned, result: finalize(state) };\n}\n\n/**\n * Apply pre-grouped ops (each {@link RewriteGroup} is committed atomically: if ANY op in the group\n * fails validation, the whole group is skipped and none of its ops mutate the tree).\n */\nexport function applyGroups(\n doc: IRDocument,\n groups: readonly RewriteGroup[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n // Group-atomicity is realized by working on a throwaway clone per group, then committing.\n let current = cloneDocument(doc);\n const touched = new Set<IRNodeId>();\n const removed = new Set<IRNodeId>();\n const created = new Set<IRNodeId>();\n const diagnostics: Diagnostic[] = [];\n const skipped: SkippedOpGroup[] = [];\n let appliedGroups = 0;\n\n for (const group of groups) {\n const attempt = applyOps(current, group.ops, ctx);\n if (attempt.result.skipped.length > 0) {\n skipped.push({\n group,\n issues: attempt.result.skipped.flatMap((s) => s.issues),\n });\n for (const s of attempt.result.skipped) for (const i of s.issues) {\n diagnostics.push(diag(i.code, i.message, { pattern: group.pattern }));\n }\n continue; // discard the attempt — group is atomic\n }\n current = attempt.doc;\n appliedGroups += 1;\n for (const id of attempt.result.touched) touched.add(id);\n for (const id of attempt.result.removed) removed.add(id);\n for (const id of attempt.result.created) created.add(id);\n for (const d of attempt.result.diagnostics) diagnostics.push(d);\n }\n\n const result: ApplyResult = {\n touched,\n removed,\n created,\n appliedGroups,\n skipped,\n journal: [],\n diagnostics,\n };\n return { doc: current, result };\n}\n\nfunction finalize(state: MutState): ApplyResult {\n return {\n touched: state.touched,\n removed: state.removed,\n created: state.created,\n appliedGroups: state.appliedGroups,\n skipped: state.skipped,\n journal: [],\n diagnostics: state.diagnostics,\n };\n}\n","/**\n * @domflax/core — pass manager + supporting contexts.\n *\n * Runs {@link Pattern}s grouped by {@link PassCategory} in declared order, driving the `flatten`\n * phase to a fixpoint under a max-iteration budget, and isolating per-node pattern errors into\n * {@link Diagnostic}s (a thrown pattern never aborts the run — it becomes `DF_PATTERN_THREW`).\n *\n * Dependency-free: only the `./types` contract plus `./builders` + `./ops` runtime helpers.\n */\n\nimport type {\n ApplyContext,\n Captures,\n DeepReadonly,\n Diagnostic,\n ElementSpec,\n FixpointConfig,\n HaltReason,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n NodeSpec,\n Pass,\n PassManager,\n PassPhase,\n Pattern,\n PhaseRunResult,\n ResolveInput,\n ResolveResult,\n RewriteFactory,\n RewriteOp,\n RewriteOpDraft,\n SelectorIndex,\n StyleConflictPolicy,\n StyleMap,\n StyleNormalizer,\n StyleResolver,\n SyntheticSink,\n ElementLike,\n SelectorUsage,\n EmitContext,\n EmitResult,\n} from './types';\n\nimport { childIds, elementIds, emptyStyleMap, getElement } from './builders';\nimport { applyOps } from './ops';\n\n/* ───────────────────────── defaults ───────────────────────── */\n\nexport const DEFAULT_FIXPOINT: FixpointConfig = {\n maxIterations: 16,\n phases: { flatten: 16, compress: 8, extract: 4 },\n onBudgetExhausted: 'warn',\n detectOscillation: true,\n};\n\nconst PHASE_ORDER: readonly PassPhase[] = ['flatten', 'compress', 'extract'];\n\n/** A no-op resolver: owns nothing, resolves to empty styles. Useful as an injection default. */\nexport function createNullResolver(): StyleResolver {\n const empty: ResolveResult = {\n styles: emptyStyleMap(),\n resolved: [],\n unknown: [],\n opaque: [],\n warnings: [],\n };\n const usage: SelectorUsage = {\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n };\n return {\n id: 'null',\n provider: 'null@0.0.0',\n fingerprint: 'null',\n owns(): boolean {\n return false;\n },\n resolve(_input: ResolveInput): ResolveResult {\n return empty;\n },\n emit(_styles: StyleMap, _ctx: EmitContext): EmitResult {\n return { classes: [], exact: true, warnings: [] };\n },\n selectorUsage(): SelectorUsage {\n return usage;\n },\n };\n}\n\n/** A SelectorIndex that reports zero CSS-targeting (no combinator/structural coupling). */\nexport function createNullSelectorIndex(): SelectorIndex {\n const none: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator(): boolean {\n return false;\n },\n targetedByStructuralPseudo(): boolean {\n return false;\n },\n reparentImpact(): ReadonlySet<IRNodeId> {\n return none;\n },\n };\n}\n\n/** Resolvers that can enumerate the project's COMPLEX selectors (the custom-CSS resolver) expose this. */\ninterface ComplexSelectorCapable {\n complexSelectors(): readonly string[];\n}\n\nfunction hasComplexSelectors(r: StyleResolver): r is StyleResolver & ComplexSelectorCapable {\n return typeof (r as Partial<ComplexSelectorCapable>).complexSelectors === 'function';\n}\n\n/**\n * Build a real {@link SelectorIndex} from the active resolver.\n *\n * For a resolver that reports project COMPLEX selectors — anything with a combinator (`>`/`+`/`~`/\n * descendant) or a structural pseudo, i.e. the custom-CSS resolver — every element whose static class\n * participates in such a selector is flagged so the flatten/compress guards (`targetedByCombinator` /\n * `affectsSelectorMatching`) fire and a wrapper a selector depends on is NOT flattened. An element is\n * combinator-coupled when one of its classes is used as a descendant/child ancestor, as a sibling\n * subject, or as a `:has()` argument; structural-coupled when used in `:nth-child(...)` etc.\n *\n * For a combinator-free resolver (Tailwind utilities — no `complexSelectors()`), this degrades to the\n * null index so behaviour is unchanged.\n */\nexport function buildSelectorIndex(doc: IRDocument, resolver: StyleResolver): SelectorIndex {\n if (!hasComplexSelectors(resolver) || resolver.complexSelectors().length === 0) {\n return createNullSelectorIndex();\n }\n\n const combinator = new Set<IRNodeId>();\n const structural = new Set<IRNodeId>();\n\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n for (const seg of el.classes.segments) {\n if (seg.kind !== 'static') continue;\n for (const t of seg.tokens) {\n const u = resolver.selectorUsage(t.value);\n // Combinator coupling: descendant/child ancestor, sibling subject, or `:has()` argument —\n // reparenting/removing the element would change a combinator match-set.\n if (u.asAncestor || u.asSibling || u.asHasArgument) combinator.add(id);\n if (u.asStructural) structural.add(id);\n }\n }\n }\n\n // reparentImpact(id): non-empty when removing/unwrapping `id` would change a combinator/structural\n // match-set — `id` itself is coupled (its own match), or it is the matched ancestor of a child\n // (removing it reparents that child out of the relation). Self + element children is conservative\n // and sufficient for the flatten guard.\n const impact = new Map<IRNodeId, Set<IRNodeId>>();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n if (!combinator.has(id) && !structural.has(id)) continue;\n const set = new Set<IRNodeId>([id]);\n for (const c of el.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') set.add(c);\n }\n impact.set(id, set);\n }\n\n const empty: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator: (id: IRNodeId): boolean => combinator.has(id),\n targetedByStructuralPseudo: (id: IRNodeId): boolean => structural.has(id),\n reparentImpact: (id: IRNodeId): ReadonlySet<IRNodeId> => impact.get(id) ?? empty,\n };\n}\n\n/* ───────────────────────── rewrite factory (emits origin-free drafts) ───────────────────────── */\n\n/** Every {@link NodeLike}/{@link ElementLike} carries a readonly `id`. */\nfunction idOf(n: ElementLike | NodeLike): IRNodeId {\n return (n as IRElement).id;\n}\n\n/** The pattern-kit factory: produces op DRAFTS and detached NodeSpecs without any allocation. */\nexport function createRewriteFactory(): RewriteFactory {\n return {\n unwrap(target: ElementLike): RewriteOpDraft {\n return { op: 'unwrap', target: idOf(target) };\n },\n removeNode(target: NodeLike): RewriteOpDraft {\n return { op: 'removeNode', target: idOf(target) };\n },\n replaceWith(target: NodeLike, replacement: NodeSpec): RewriteOpDraft {\n return { op: 'replaceWith', target: idOf(target), replacement };\n },\n wrap(target: NodeLike, wrapper: ElementSpec): RewriteOpDraft {\n return { op: 'wrap', target: idOf(target), wrapper };\n },\n insertBefore(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertBefore', anchor: idOf(anchor), node };\n },\n insertAfter(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertAfter', anchor: idOf(anchor), node };\n },\n moveNode(target: NodeLike, newParent: ElementLike, index: number): RewriteOpDraft {\n return { op: 'moveNode', target: idOf(target), newParent: idOf(newParent), index };\n },\n mergeSiblings(first: NodeLike, second: NodeLike): RewriteOpDraft {\n return { op: 'mergeSiblings', first: idOf(first), second: idOf(second) };\n },\n setClassList(target: ElementLike, style: StyleMap, preserveOpaque = true): RewriteOpDraft {\n return { op: 'setClassList', target: idOf(target), style, preserveOpaque };\n },\n mergeStyle(\n target: ElementLike,\n source: ElementLike | null,\n style: StyleMap,\n onConflict: StyleConflictPolicy = 'abort',\n ): RewriteOpDraft {\n return {\n op: 'mergeStyle',\n target: idOf(target),\n source: source ? idOf(source) : null,\n style,\n onConflict,\n };\n },\n foldInheritedStyles(\n from: ElementLike,\n into: ElementLike | readonly ElementLike[],\n opts?: { only?: readonly import('./types').CssProperty[]; conditions?: 'base' | 'all' },\n ): RewriteOpDraft {\n const list: readonly ElementLike[] = Array.isArray(into)\n ? (into as readonly ElementLike[])\n : [into as ElementLike];\n return {\n op: 'foldInheritedStyles',\n from: idOf(from),\n into: list.map((t) => idOf(t)),\n properties: opts?.only ?? 'all-inherited',\n conditions: opts?.conditions ?? 'base',\n };\n },\n element(spec: ElementSpec): NodeSpec {\n return spec;\n },\n text(value: string): NodeSpec {\n return { kind: 'text', value };\n },\n keep(node: NodeLike): NodeSpec {\n return { kind: 'ref', ref: idOf(node) };\n },\n };\n}\n\n/* ───────────────────────── match context ───────────────────────── */\n\nfunction ro<T>(v: T): DeepReadonly<T> {\n return v as DeepReadonly<T>;\n}\n\nfunction buildMatchContext(\n doc: IRDocument,\n elementId: IRNodeId,\n resolver: StyleResolver,\n selectors: SelectorIndex,\n safety: import('./types').SafetyLevel,\n phase: PassPhase,\n iteration: number,\n): MatchContext {\n const self = getElement(doc, elementId)!;\n\n const parentEl = (): DeepReadonly<IRElement> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n return p && p.kind === 'element' ? ro(p) : null;\n };\n\n const elementChildren = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n for (const c of self.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') out.push(ro(cn));\n }\n return out;\n };\n\n const ancestors = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n let cur: IRNodeId | null = self.parent;\n while (cur != null) {\n const n: IRNode | undefined = doc.nodes.get(cur);\n if (!n) break;\n if (n.kind === 'element') out.push(ro(n));\n cur = n.parent;\n }\n return out;\n };\n\n const siblingAt = (delta: number): DeepReadonly<IRNode> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return null;\n const i = p.children.indexOf(elementId);\n const sib = p.children[i + delta];\n if (sib == null) return null;\n const sn = doc.nodes.get(sib);\n return sn ? ro(sn) : null;\n };\n\n const computedOf = (n: NodeLike): StyleMap => {\n const node = doc.nodes.get((n as IRNode).id);\n return node && node.kind === 'element' ? node.computed : emptyStyleMap();\n };\n\n return {\n node: ro(self),\n doc: ro(doc),\n resolver,\n selectors,\n safety,\n phase,\n iteration,\n parent: parentEl,\n elementChildren,\n onlyElementChild(): DeepReadonly<IRElement> | null {\n const els = elementChildren();\n return els.length === 1 ? els[0]! : null;\n },\n computed(): StyleMap {\n return self.computed;\n },\n computedOf,\n isOpaque(n?: ElementLike): boolean {\n const target = n ? doc.nodes.get((n as IRElement).id) : self;\n if (!target || target.kind !== 'element') return true;\n return target.classes.opaque || target.meta.hasSpreadAttrs;\n },\n ancestors,\n closest(pred): DeepReadonly<IRElement> | null {\n for (const a of ancestors()) if (pred(a)) return a;\n return null;\n },\n prevSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(-1);\n },\n nextSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(1);\n },\n nthChildIndex(): number {\n if (self.parent == null) return 1;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return 1;\n let idx = 0;\n for (const c of p.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') {\n idx += 1;\n if (c === elementId) return idx;\n }\n }\n return idx;\n },\n };\n}\n\n/* ───────────────────────── the pass manager ───────────────────────── */\n\nfunction stampOrigin(draft: RewriteOpDraft, pattern: Pattern): RewriteOp {\n return {\n ...draft,\n origin: { pattern: pattern.name, category: pattern.category, safety: pattern.safety },\n } as RewriteOp;\n}\n\nfunction patternsForPhase(passes: readonly Pass[], phase: PassPhase): Pattern[] {\n const out: Pattern[] = [];\n for (const pass of passes) {\n if (pass.phase !== phase) continue;\n for (const p of pass.patterns) out.push(p);\n }\n out.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n return out;\n}\n\ninterface RunState {\n doc: IRDocument;\n}\n\n/* ───────────────────────── flatten residual-skip (never drop an unreproducible style) ───────────────────────── */\n\n/** A throwaway {@link SyntheticSink} for the emit exactness probe (registrations are discarded). */\nfunction probeSink(): SyntheticSink {\n return {\n register(s): string {\n return s.className;\n },\n drain(): readonly never[] {\n return [];\n },\n };\n}\n\n/** Nodes a group writes STYLE onto (the survivors a flatten transfers declarations to). */\nfunction styleWriteTargets(ops: readonly RewriteOp[]): IRNodeId[] {\n const ids: IRNodeId[] = [];\n for (const op of ops) {\n if (op.op === 'mergeStyle' || op.op === 'setClassList') ids.push(op.target);\n else if (op.op === 'foldInheritedStyles') ids.push(...op.into);\n }\n return ids;\n}\n\n/** True iff the resolver can EXACTLY reverse-emit `sm` (no residual). An empty map is trivially exact. */\nfunction emitIsExact(resolver: StyleResolver, normalizer: StyleNormalizer, sm: StyleMap): boolean {\n if (sm.blocks.size === 0) return true;\n try {\n const ctx: EmitContext = { normalizer, sink: probeSink() };\n const r = resolver.emit(sm, ctx);\n return r.exact && r.residual == null;\n } catch {\n return true; // a throwing resolver must never block a flatten\n }\n}\n\n/**\n * T5 — flatten must never DROP a style it can't reproduce. After a flatten transfers declarations onto\n * a surviving (rewritable) element, if the resolver can no longer EXACTLY reverse-emit that element's\n * computed style — and it could before — the flatten would silently lose the residual declarations\n * during reverse-emit, so the whole flatten is reverted (the wrapper is kept). Pre-existing residue\n * (already non-exact before the flatten) is not blamed on the flatten and does not trigger a revert.\n */\nfunction flattenWouldDropStyle(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n resolver: StyleResolver,\n normalizer: StyleNormalizer,\n): boolean {\n for (const id of styleWriteTargets(ops)) {\n const newEl = getElement(after, id);\n if (!newEl) continue; // target was itself removed — its style lives on the survivor we also check\n // Opaque / dynamic class lists are kept verbatim by reverse-emit, so no style is dropped there.\n if (newEl.classes.opaque || newEl.classes.hasDynamic) continue;\n if (emitIsExact(resolver, normalizer, newEl.computed)) continue;\n const oldEl = getElement(before, id);\n const wasExact = !oldEl || emitIsExact(resolver, normalizer, oldEl.computed);\n if (wasExact) return true; // the flatten introduced an unreproducible style → revert\n }\n return false;\n}\n\n/**\n * One sweep of a phase: evaluate every pattern against every live element, collect op drafts,\n * stamp origin, apply. Returns the number of ops successfully applied (0 ⇒ fixpoint for this\n * phase). Pattern throws are isolated into `DF_PATTERN_THREW` diagnostics.\n */\nfunction runSweep(\n state: RunState,\n patterns: readonly Pattern[],\n ctx: ApplyContext,\n factory: RewriteFactory,\n phase: PassPhase,\n iteration: number,\n touched: Set<IRNodeId>,\n diagnostics: Diagnostic[],\n flattenBarred: Set<IRNodeId>,\n): number {\n let appliedOps = 0;\n const resolver = ctx.resolver;\n const selectors = ctx.selectors;\n\n for (const elId of elementIds(state.doc)) {\n const el = getElement(state.doc, elId);\n if (!el) continue; // removed earlier in this sweep\n // T5: a wrapper whose specialized flatten had to revert (its compensating style is not\n // reproducible by the resolver) is barred from ALL further flattening — otherwise a generic\n // pattern (e.g. passthrough-wrapper) would strip it anyway and silently drop the very style the\n // revert preserved. Compress/extract phases are unaffected.\n if (phase === 'flatten' && flattenBarred.has(elId)) continue;\n\n for (const pattern of patterns) {\n if (pattern.safety > ctx.safetyCeiling) continue;\n let drafts: readonly RewriteOpDraft[] = [];\n try {\n const mctx = buildMatchContext(\n state.doc,\n elId,\n resolver,\n selectors,\n ctx.safetyCeiling,\n phase,\n iteration,\n );\n const result = pattern.evaluate(mctx, factory);\n if (!result) continue;\n drafts = result.ops;\n if (result.diagnostics) for (const d of result.diagnostics) diagnostics.push(d);\n } catch (err) {\n diagnostics.push({\n code: 'DF_PATTERN_THREW',\n severity: 'error',\n message: `pattern '${pattern.name}' threw: ${String((err as Error)?.message ?? err)}`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n cause: err,\n });\n continue;\n }\n\n if (drafts.length === 0) continue;\n const ops = drafts.map((d) => stampOrigin(d, pattern));\n const outcome = applyOps(state.doc, ops, ctx);\n for (const d of outcome.result.diagnostics) diagnostics.push(d);\n if (outcome.result.appliedGroups > 0) {\n // T5: a flatten must never drop a style the resolver can't re-emit — revert on residual.\n if (\n phase === 'flatten' &&\n flattenWouldDropStyle(state.doc, outcome.doc, ops, resolver, ctx.normalizer)\n ) {\n diagnostics.push({\n code: 'DF_VERIFY_REVERTED',\n severity: 'warn',\n message:\n `flatten '${pattern.name}' reverted on node ${elId}: residual style is not ` +\n `reproducible by resolver '${resolver.id}', so flattening would drop it`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n });\n // Discard the outcome (keep the wrapper) AND bar this node from any further flatten this\n // run, so no other flatten pattern can strip the wrapper after the specialized one bailed.\n flattenBarred.add(elId);\n break;\n }\n state.doc = outcome.doc;\n appliedOps += outcome.result.appliedGroups;\n for (const id of outcome.result.touched) touched.add(id);\n for (const id of outcome.result.created) touched.add(id);\n // tree changed → restart pattern evaluation for this element next iteration\n break;\n }\n }\n }\n return appliedOps;\n}\n\n/** Cheap structural fingerprint of the document for oscillation detection. */\nfunction docFingerprint(doc: IRDocument): string {\n const parts: string[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n parts.push(`${id}:${n.kind}`);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return parts.join('|');\n}\n\n/**\n * Runs `passes` over `doc` to a per-phase fixpoint. This is the concrete entry the pipeline calls\n * (the {@link PassManager} interface keeps passes on the call site; we accept them explicitly here\n * so the manager stays stateless).\n */\nexport function runPasses(\n doc: IRDocument,\n passes: readonly Pass[],\n ctx: ApplyContext,\n config?: FixpointConfig,\n): { readonly doc: IRDocument; readonly results: readonly PhaseRunResult[] } {\n const cfg: FixpointConfig = { ...DEFAULT_FIXPOINT, ...config };\n const factory = createRewriteFactory();\n const state: RunState = { doc };\n const results: PhaseRunResult[] = [];\n // Nodes barred from flattening after an emittability revert (T5) — persists across sweeps/phases.\n const flattenBarred = new Set<IRNodeId>();\n\n for (const phase of PHASE_ORDER) {\n const patterns = patternsForPhase(passes, phase);\n const phaseTouched = new Set<IRNodeId>();\n const diagnostics: Diagnostic[] = [];\n const budget = cfg.phases[phase] ?? cfg.maxIterations;\n\n let iterations = 0;\n let converged = false;\n let haltReason: HaltReason = 'converged';\n const seen = new Set<string>();\n\n if (patterns.length === 0) {\n results.push({\n phase,\n iterations: 0,\n converged: true,\n haltReason: 'converged',\n touched: phaseTouched,\n diagnostics,\n });\n continue;\n }\n\n while (iterations < budget) {\n iterations += 1;\n const applied = runSweep(\n state,\n patterns,\n ctx,\n factory,\n phase,\n iterations,\n phaseTouched,\n diagnostics,\n flattenBarred,\n );\n\n if (applied === 0) {\n converged = true;\n haltReason = 'converged';\n break;\n }\n\n if (cfg.detectOscillation) {\n const fp = docFingerprint(state.doc);\n if (seen.has(fp)) {\n haltReason = 'oscillation';\n diagnostics.push({\n code: 'DF_FIXPOINT_OSCILLATION',\n severity: 'warn',\n message: `phase '${phase}' oscillated; halting`,\n phase,\n iteration: iterations,\n });\n break;\n }\n seen.add(fp);\n }\n }\n\n if (!converged && haltReason !== 'oscillation') {\n haltReason = 'budget';\n diagnostics.push({\n code: 'DF_FIXPOINT_BUDGET',\n severity: cfg.onBudgetExhausted === 'error' ? 'error' : 'warn',\n message: `phase '${phase}' exhausted ${budget}-iteration budget`,\n phase,\n iteration: iterations,\n });\n }\n\n results.push({\n phase,\n iterations,\n converged,\n haltReason,\n touched: phaseTouched,\n diagnostics,\n });\n }\n\n return { doc: state.doc, results };\n}\n\n/** A {@link PassManager} that runs the given passes (carried on the manager instance). */\nexport function createPassManager(passes: readonly Pass[]): PassManager {\n return {\n run(doc: IRDocument, ctx: ApplyContext, config?: FixpointConfig): readonly PhaseRunResult[] {\n return runPasses(doc, passes, ctx, config).results;\n },\n };\n}\n","/**\n * @domflax/core — the pure, single-file pipeline.\n *\n * Wires injected interfaces together: {@link Frontend} → resolve → {@link PassManager} →\n * {@link Backend}. Core itself stays dependency-free; the resolver, frontend, and backend are all\n * supplied by the caller, so no heavy third-party libs ever reach this package.\n */\n\nimport type {\n ApplyContext,\n Backend,\n BackendContext,\n CodegenResult,\n Diagnostic,\n EditPlan,\n Frontend,\n FrontendParseContext,\n IRDocument,\n IRElement,\n PassPhase,\n Pipeline,\n PipelineInput,\n PipelineOutput,\n PipelineStats,\n SourceSpan,\n StyleMap,\n SyntheticClass,\n SyntheticSink,\n} from './types';\n\nimport { elementIds, getElement } from './builders';\nimport { createNullSelectorIndex, runPasses } from './pass-manager';\n\n/* ───────────────────────── synthetic sink ───────────────────────── */\n\n/** A minimal in-memory {@link SyntheticSink}: dedupes by className, drains in insertion order. */\nexport function createSyntheticSink(): SyntheticSink {\n const map = new Map<string, SyntheticClass>();\n return {\n register(s: SyntheticClass): string {\n if (!map.has(s.className)) map.set(s.className, s);\n return s.className;\n },\n drain(): readonly SyntheticClass[] {\n return [...map.values()];\n },\n };\n}\n\n/* ───────────────────────── resolve step ───────────────────────── */\n\nfunction staticClassTokens(el: IRElement): string[] {\n const out: string[] = [];\n for (const seg of el.classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/**\n * Populate each element's `computed` StyleMap from its author classes via the injected resolver.\n * Opaque/spread elements and elements without static classes are left untouched. Resolver throws\n * are isolated into diagnostics (a stub resolver may legitimately be NotImplemented).\n */\nfunction resolveStyles(\n doc: IRDocument,\n input: PipelineInput,\n diagnostics: Diagnostic[],\n): void {\n const { resolver, normalizer } = input;\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el || el.classes.opaque) continue;\n const tokens = staticClassTokens(el);\n if (tokens.length === 0) continue;\n try {\n const result = resolver.resolve({\n classes: tokens,\n element: {\n tagName: el.tag,\n namespace: el.namespace === 'svg' ? 'svg' : 'html',\n },\n });\n let styles: StyleMap = result.styles;\n try {\n styles = normalizer.normalizeStyleMap(styles);\n } catch {\n /* normalizer is optional/stubbed — keep raw styles */\n }\n el.computed = styles;\n for (const w of result.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId: id,\n });\n }\n } catch (err) {\n diagnostics.push({\n code: 'DF_OP_PRECONDITION_FAILED',\n severity: 'debug',\n message: `resolve skipped for <${el.tag}>: ${String((err as Error)?.message ?? err)}`,\n nodeId: id,\n cause: err,\n });\n }\n }\n}\n\n/* ───────────────────────── the pipeline ───────────────────────── */\n\nconst ZERO_ITERATIONS: Readonly<Record<PassPhase, number>> = {\n flatten: 0,\n compress: 0,\n extract: 0,\n};\n\nclass DefaultPipeline implements Pipeline {\n run(input: PipelineInput): PipelineOutput {\n const startedAt = now();\n const diagnostics: Diagnostic[] = [];\n const report = (d: Diagnostic): void => {\n diagnostics.push(d);\n input.reporter?.report(d);\n };\n\n // 1. PARSE ────────────────────────────────────────────────────────────\n const parseCtx: FrontendParseContext = {\n id: input.id,\n kind: input.kind,\n resolver: input.resolver,\n normalizer: input.normalizer,\n config: { preserveComments: input.config?.preserveComments ?? true },\n onDiagnostic: report,\n };\n if (input.babelAst !== undefined) parseCtx.babelAst = input.babelAst;\n\n const parsed = input.frontend.parse(input.code, parseCtx);\n for (const d of parsed.diagnostics) report(d);\n const doc = parsed.doc;\n const nodesIn = doc.nodes.size;\n\n // 2. RESOLVE ──────────────────────────────────────────────────────────\n resolveStyles(doc, input, diagnostics);\n\n // 3. PASSES (fixpoint per phase) ──────────────────────────────────────\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: input.config?.safety ?? 2,\n normalizer: input.normalizer,\n selectors: createNullSelectorIndex(),\n resolver: input.resolver,\n };\n const { doc: optimized, results } = runPasses(doc, input.passes, ctx, fixpointFrom(input));\n\n let opsApplied = 0;\n const iterations: Record<PassPhase, number> = { ...ZERO_ITERATIONS };\n for (const r of results) {\n iterations[r.phase] = r.iterations;\n for (const d of r.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n opsApplied += r.touched.size;\n }\n\n // 4. PRINT ────────────────────────────────────────────────────────────\n const editPlan: EditPlan = {\n moduleId: input.id,\n ops: [],\n provenance: new Map(),\n };\n const backendCtx: BackendContext = {\n normalizer: input.normalizer,\n resolver: input.resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: report,\n };\n const printed: CodegenResult = input.backend.print(optimized, editPlan, backendCtx);\n for (const d of printed.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n\n // 5. ASSEMBLE OUTPUT ──────────────────────────────────────────────────\n const stats: PipelineStats = {\n nodesIn,\n nodesOut: optimized.nodes.size,\n opsApplied,\n iterations,\n durationMs: now() - startedAt,\n };\n const touched: readonly SourceSpan[] = printed.edits.map((e) => e.span);\n\n return {\n code: printed.code,\n map: printed.map,\n changed: printed.code !== input.code,\n touched,\n diagnostics,\n stats,\n doc: optimized,\n editPlan,\n };\n }\n}\n\nfunction fixpointFrom(input: PipelineInput): import('./types').FixpointConfig | undefined {\n const fp = input.config?.fixpoint;\n if (!fp) return undefined;\n return {\n maxIterations: fp.maxIterations ?? 16,\n phases: fp.phases ?? {},\n onBudgetExhausted: fp.onBudgetExhausted ?? 'warn',\n detectOscillation: fp.detectOscillation ?? true,\n };\n}\n\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n// `performance` is a host global (node20 / browser) not covered by the ES2023 lib;\n// declared minimally so the runtime feature-detection below stays type-safe.\ndeclare const performance: { now(): number } | undefined;\n\nfunction now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now();\n}\n\n/** Build the pure single-file {@link Pipeline}. */\nexport function createPipeline(): Pipeline {\n return new DefaultPipeline();\n}\n","/**\n * @domflax/core — the shared reverse-emit step (computed → className).\n *\n * The backend re-prints `className` from each element's {@link ClassList}, but the pass manager\n * records optimized styles on `computed`. This module folds those optimized computed styles back\n * into the element's static class tokens, and is the SINGLE source of truth shared by every\n * orchestrator (the `domflax` meta package, `@domflax/cli`, and the pattern auto-test harness) so\n * their pipelines cannot diverge.\n *\n * ## REPLACE, not append\n *\n * For every TOUCHED, rewritable (non-opaque, non-dynamic) element we ask the resolver for the\n * MINIMAL class set reproducing the element's FULL computed style (`resolver.emit(el.computed)`),\n * then REPLACE the element's static tokens with it — rather than appending. Replacing is what lets\n * a compress pass actually shorten output: `px-4 py-4` collapses to `p-4`, equal `w/h` to `size-*`,\n * the four insets to `inset-0`, and fully-overridden duplicates simply disappear.\n *\n * ## Droppability gate (never lose a load-bearing class)\n *\n * A token is only removed when `resolver.selectorUsage(token).droppable` is true — i.e. it is a\n * plain, resolver-owned utility whose entire contribution is reproducible from `computed`. Tokens\n * that are unknown to the resolver, opaque (combinator/at-rule utilities whose effect never folds\n * onto the element's own box), variant-bound, or referenced by a custom-CSS selector are NOT\n * droppable and are preserved verbatim. As a safety net, if `emit` produces nothing at all we leave\n * the element's tokens untouched (a resolver that failed to load must never erase classes).\n */\n\nimport { elementIds, getElement } from './builders';\nimport { createSyntheticSink } from './pipeline';\nimport type {\n ClassList,\n ClassSegment,\n ClassToken,\n EmitContext,\n IRDocument,\n StyleNormalizer,\n StyleResolver,\n} from './types';\n\n/** All static class tokens of a {@link ClassList}, in source order. */\nfunction staticTokensOf(cl: ClassList): string[] {\n const out: string[] = [];\n for (const seg of cl.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/** A rewritable static {@link ClassList} over `tokens`, preserving the previous list's spans. */\nfunction staticClassList(prev: ClassList, tokens: readonly string[]): ClassList {\n const classTokens: ClassToken[] = tokens.map((value) => ({ value }));\n const seg: ClassSegment = { kind: 'static', tokens: classTokens };\n return {\n form: 'string-literal',\n segments: [seg],\n valueSpan: prev.valueSpan,\n attrSpan: prev.attrSpan,\n hasDynamic: false,\n opaque: false,\n rewritable: true,\n };\n}\n\n/** Two token lists are equal iff same length and same tokens in the same order. */\nfunction sameTokens(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Fold every TOUCHED, rewritable element's optimized computed style back into the MINIMAL static\n * class-token set (see module docs). Mutates `doc` in place.\n */\nexport function syncClassesFromComputed(\n doc: IRDocument,\n resolver: StyleResolver,\n norm: StyleNormalizer,\n): void {\n const sink = createSyntheticSink();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el || !el.meta.touched) continue;\n if (el.classes.opaque || el.classes.hasDynamic) continue;\n\n const tokens = staticTokensOf(el.classes);\n\n // Minimal class set reproducing the FULL computed style.\n const ctx: EmitContext = { normalizer: norm, sink };\n const emitted = resolver.emit(el.computed, ctx).classes;\n // A resolver that reverse-synthesized nothing must never erase the element's classes.\n if (emitted.length === 0) continue;\n\n const emittedSet = new Set(emitted);\n const next: string[] = [];\n const seen = new Set<string>();\n\n // 1. Keep each existing token that is either NOT droppable (unknown / opaque / variant /\n // selector-bound) or still part of the emitted minimal set — preserving source order.\n for (const t of tokens) {\n if (seen.has(t)) continue;\n const keep = emittedSet.has(t) || !resolver.selectorUsage(t).droppable;\n if (keep) {\n next.push(t);\n seen.add(t);\n }\n }\n // 2. Append any newly-emitted classes not already present, in emit order.\n for (const c of emitted) {\n if (seen.has(c)) continue;\n next.push(c);\n seen.add(c);\n }\n\n if (sameTokens(next, tokens)) continue; // no churn when nothing actually changed\n el.classes = staticClassList(el.classes, next);\n }\n}\n","/**\n * @domflax/core — public API barrel.\n *\n * The type contract (`./types`) is the single source of truth for the whole monorepo; the runtime\n * modules below are the dependency-free reference implementations of the IR, the trusted applier,\n * the pass manager, and the pure pipeline.\n */\n\n// Type contract (pure types — zero runtime).\nexport type * from './types';\n\n// Runtime: IR builders + traversal.\nexport * from './builders';\n\n// Runtime: the trusted applier.\nexport * from './ops';\n\n// Runtime: pass manager + match/rewrite contexts.\nexport * from './pass-manager';\n\n// Runtime: the pure single-file pipeline.\nexport * from './pipeline';\n\n// Runtime: the shared reverse-emit step (computed → className).\nexport * from './reverse-emit';\n","/**\n * @domflax/pattern-kit — `definePattern`.\n *\n * A small, eager validator + identity wrapper that turns an author-supplied {@link Pattern} spec\n * into a frozen, contract-checked Pattern. Catching shape errors here (bad category/phase, missing\n * `evaluate`, out-of-range safety) keeps the pass-manager's hot loop free of defensive checks and\n * gives authors an immediate, actionable error at module-load time.\n */\n\nimport type { PassPhase, Pattern, SafetyLevel } from '@domflax/core';\n\nconst PHASES: ReadonlySet<PassPhase> = new Set<PassPhase>(['flatten', 'compress', 'extract']);\nconst SAFETY_LEVELS: ReadonlySet<SafetyLevel> = new Set<SafetyLevel>([0, 1, 2, 3]);\n\nfunction fail(name: string, why: string): never {\n throw new Error(`definePattern(${name || '<anonymous>'}): ${why}`);\n}\n\n/**\n * Validate and freeze a {@link Pattern}. Throws on any contract violation; otherwise returns the\n * (shallow-frozen) spec unchanged so it can be registered into a {@link Pass}.\n */\nexport function definePattern(spec: Pattern): Pattern {\n if (spec == null || typeof spec !== 'object') {\n throw new Error('definePattern: spec must be an object');\n }\n\n const name = spec.name;\n if (typeof name !== 'string' || name.length === 0) {\n fail(String(name), 'name must be a non-empty string');\n }\n\n if (typeof spec.category !== 'string' || !spec.category.includes('/')) {\n fail(name, `category must be a \"<phase>/<slug>\" string (got ${JSON.stringify(spec.category)})`);\n }\n\n const phase = spec.category.split('/', 1)[0] as PassPhase;\n if (!PHASES.has(phase)) {\n fail(name, `category phase must be one of flatten|compress|extract (got \"${phase}\")`);\n }\n\n if (!SAFETY_LEVELS.has(spec.safety)) {\n fail(name, `safety must be 0|1|2|3 (got ${JSON.stringify(spec.safety)})`);\n }\n\n if (typeof spec.evaluate !== 'function') {\n fail(name, 'evaluate must be a function');\n }\n\n if (spec.priority !== undefined && !Number.isFinite(spec.priority)) {\n fail(name, 'priority must be a finite number when provided');\n }\n\n return Object.freeze({ ...spec });\n}\n","/**\n * @domflax/pattern-kit — the shared StyleMap normalizer.\n *\n * A single, syntactic-only {@link StyleNormalizer} implementation that core, the patterns, and the\n * verifier all reuse so they agree, byte-for-byte, on what two style declarations \"mean\". It NEVER\n * resolves initial/inherited/computed defaults (that is the verifier's job) — it only:\n *\n * • canonicalizes colors (`transparent` ⇒ `rgba(0, 0, 0, 0)`, hex lower-cased + 3→6 expanded,\n * `rgb()/rgba()/hsl()/hsla()` argument spacing normalized),\n * • canonicalizes units (whitespace collapsed, zero-lengths `0px`/`0%`/… ⇒ `0`),\n * • expands a fixed set of box shorthands to longhands (`padding`/`margin`/`inset`/`border-width`\n * into their four sides, `gap` into `row-gap`/`column-gap`),\n * • orders declarations by property for stable comparison.\n *\n * Dependency-free: only `@domflax/core` (types + the StyleMap builder helpers).\n */\n\nimport type {\n CssProperty,\n CssValue,\n ConditionKey,\n InheritedPropertyTable,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n} from '@domflax/core';\n\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\n\n/* ───────────────────────── inherited-property table ───────────────────────── */\n\n/**\n * Canonical, versioned set of inherited CSS longhands. Any author custom property (`--*`) is\n * also treated as inherited via the `isInherited` predicate.\n */\nconst INHERITED_PROPERTIES: readonly string[] = [\n 'azimuth',\n 'border-collapse',\n 'border-spacing',\n 'caption-side',\n 'color',\n 'cursor',\n 'direction',\n 'empty-cells',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-variant-caps',\n 'font-variant-numeric',\n 'font-weight',\n 'hyphens',\n 'letter-spacing',\n 'line-height',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'orphans',\n 'overflow-wrap',\n 'quotes',\n 'tab-size',\n 'text-align',\n 'text-align-last',\n 'text-decoration-color',\n 'text-indent',\n 'text-justify',\n 'text-rendering',\n 'text-shadow',\n 'text-transform',\n 'text-underline-position',\n 'visibility',\n 'white-space',\n 'widows',\n 'word-break',\n 'word-spacing',\n 'writing-mode',\n '-webkit-font-smoothing',\n];\n\nfunction createInheritedTable(): InheritedPropertyTable {\n const properties = new Set<CssProperty>(INHERITED_PROPERTIES as unknown as CssProperty[]);\n return {\n version: 'domflax-inherited@1',\n properties,\n isInherited(property: CssProperty): boolean {\n // Author custom properties (`--*`) inherit by definition.\n return String(property).startsWith('--') || properties.has(property);\n },\n };\n}\n\n/* ───────────────────────── value canonicalization ───────────────────────── */\n\nconst ZERO_LENGTH_RE =\n /\\b0(?:px|em|rem|ex|ch|vh|vw|vmin|vmax|vi|vb|pt|pc|cm|mm|in|q|lh|rlh|fr|deg|rad|turn|s|ms|%)\\b/g;\n\nconst FUNC_ARGS_RE = /\\b(rgba?|hsla?|hwb|lab|lch|oklab|oklch)\\(([^()]*)\\)/gi;\n\nconst RELATIVE_UNIT_RE = /(?:\\d*\\.?\\d+)(?:em|ex|ch|lh)\\b|%/i;\n\n/**\n * Pure, syntactic value canonicalization. Idempotent: `canon(canon(v)) === canon(v)`.\n */\nfunction canonValue(raw: string): string {\n let v = raw.trim().replace(/\\s+/g, ' ');\n\n // Lower-case hex colors (#abc / #aabbcc / #aabbccff).\n v = v.replace(/#([0-9a-fA-F]{3,8})\\b/g, (_m, hex: string) => '#' + hex.toLowerCase());\n\n // Expand 3-digit hex (#abc → #aabbcc) — only when exactly 3 hex digits.\n v = v.replace(\n /#([0-9a-f])([0-9a-f])([0-9a-f])(?![0-9a-f])/g,\n (_m, r: string, g: string, b: string) => `#${r}${r}${g}${g}${b}${b}`,\n );\n\n // Canonical fully-transparent color.\n v = v.replace(/\\btransparent\\b/gi, 'rgba(0, 0, 0, 0)');\n v = v.replace(/#00000000\\b/g, 'rgba(0, 0, 0, 0)');\n\n // Collapse zero lengths/angles/times to a bare `0`.\n v = v.replace(ZERO_LENGTH_RE, '0');\n\n // Normalize the argument spacing of color/space functions: single space after each comma.\n v = v.replace(FUNC_ARGS_RE, (_m, fn: string, args: string) => {\n const parts = args\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return `${fn.toLowerCase()}(${parts.join(', ')})`;\n });\n\n return v;\n}\n\n/** True when the (canonicalized) value uses a parent-relative unit (em/ex/ch/lh/%). */\nfunction isRelativeValue(value: string): boolean {\n return RELATIVE_UNIT_RE.test(value);\n}\n\n/* ───────────────────────── shorthand expansion ───────────────────────── */\n\n/** Box-model shorthands whose 1–4 value form expands to four explicit sides. */\nconst BOX_SIDES: Readonly<Record<string, readonly [string, string, string, string]>> = {\n padding: ['padding-top', 'padding-right', 'padding-bottom', 'padding-left'],\n margin: ['margin-top', 'margin-right', 'margin-bottom', 'margin-left'],\n inset: ['top', 'right', 'bottom', 'left'],\n 'border-width': [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n ],\n 'border-style': [\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n ],\n 'border-color': [\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n ],\n};\n\n/** Split on top-level whitespace, keeping `fn(a, b)` groups intact. */\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let cur = '';\n for (const ch of value) {\n if (ch === '(') depth += 1;\n else if (ch === ')') depth = Math.max(0, depth - 1);\n if (depth === 0 && /\\s/.test(ch)) {\n if (cur.length > 0) {\n out.push(cur);\n cur = '';\n }\n continue;\n }\n cur += ch;\n }\n if (cur.length > 0) out.push(cur);\n return out;\n}\n\n/** Map a 1–4 value box shorthand onto its [top, right, bottom, left] sides. */\nfunction boxFourSides(values: readonly string[]): [string, string, string, string] {\n const [a, b, c, d] = values;\n switch (values.length) {\n case 1:\n return [a!, a!, a!, a!];\n case 2:\n return [a!, b!, a!, b!];\n case 3:\n return [a!, b!, c!, b!];\n default:\n return [a!, b!, c!, d!];\n }\n}\n\n/** Expand one declaration into longhand `[property, value]` pairs (single pair if not shorthand). */\nfunction expandShorthand(prop: string, value: string): Array<[string, string]> {\n const box = BOX_SIDES[prop];\n if (box) {\n const parts = splitTopLevel(value);\n if (parts.length >= 1 && parts.length <= 4) {\n const sides = boxFourSides(parts);\n return box.map((p, i) => [p, sides[i]!] as [string, string]);\n }\n return [[prop, value]];\n }\n\n if (prop === 'gap' || prop === 'grid-gap') {\n const parts = splitTopLevel(value);\n if (parts.length === 1) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[0]!],\n ];\n }\n if (parts.length === 2) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[1]!],\n ];\n }\n return [[prop, value]];\n }\n\n return [[prop, value]];\n}\n\n/* ───────────────────────── the normalizer ───────────────────────── */\n\nfunction makeDecl(\n table: InheritedPropertyTable,\n prop: string,\n rawValue: string,\n important: boolean,\n): StyleDecl {\n const property = prop.trim().toLowerCase() as CssProperty;\n const value = canonValue(rawValue) as CssValue;\n return {\n property,\n value,\n important,\n relativeToParent: isRelativeValue(value),\n inherited: table.isInherited(property),\n };\n}\n\nexport function createNormalizer(): StyleNormalizer {\n const inherited = createInheritedTable();\n\n const normalizeDeclaration = (\n prop: string,\n value: string,\n important: boolean,\n ): readonly StyleDecl[] => {\n const p = prop.trim().toLowerCase();\n const expanded = expandShorthand(p, value.trim());\n return expanded.map(([lp, lv]) => makeDecl(inherited, lp, lv, important));\n };\n\n const normalizeValue = (prop: CssProperty, raw: string): CssValue => {\n void prop;\n return canonValue(raw) as CssValue;\n };\n\n const normalizeStyleMap = (sm: StyleMap): StyleMap => {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const block of sm.blocks.values()) {\n const decls = new Map<CssProperty, StyleDecl>();\n // Re-canonicalize every value and re-key (the decls are already longhand).\n for (const decl of block.decls.values()) {\n const next: StyleDecl = {\n ...decl,\n value: canonValue(String(decl.value)) as CssValue,\n relativeToParent: isRelativeValue(String(decl.value)),\n inherited: inherited.isInherited(decl.property),\n };\n decls.set(next.property, next);\n }\n // Property-sorted for deterministic iteration/serialization.\n const sorted = new Map<CssProperty, StyleDecl>(\n [...decls.entries()].sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)),\n );\n const key = conditionKey(block.condition);\n blocks.set(key, { condition: block.condition, decls: sorted });\n }\n return { blocks };\n };\n\n const equals = (a: StyleMap, b: StyleMap): boolean => {\n const na = normalizeStyleMap(a);\n const nb = normalizeStyleMap(b);\n if (na.blocks.size !== nb.blocks.size) return false;\n for (const [key, blockA] of na.blocks) {\n const blockB = nb.blocks.get(key);\n if (!blockB) return false;\n if (blockA.decls.size !== blockB.decls.size) return false;\n for (const [prop, declA] of blockA.decls) {\n const declB = blockB.decls.get(prop);\n if (!declB) return false;\n if (declA.value !== declB.value || declA.important !== declB.important) return false;\n }\n }\n return true;\n };\n\n return {\n version: 'domflax-normalizer@1',\n normalizeDeclaration,\n normalizeValue,\n normalizeStyleMap,\n equals,\n inherited,\n };\n}\n\n/** The shared, process-wide normalizer instance reused by core / patterns / verify. */\nexport const normalizer: StyleNormalizer = createNormalizer();\n\n/* ───────────────────────── superset helper (used by `computed()` matcher) ───────────────────────── */\n\n/**\n * True when `full` contains every declaration of `partial` with an equal normalized value\n * (a per-condition, per-declaration superset test). Both maps are normalized first so the\n * comparison is meaning-based, not string-based. Empty `partial` ⇒ always `true`.\n */\nexport function isStyleSuperset(\n full: StyleMap,\n partial: StyleMap,\n norm: StyleNormalizer = normalizer,\n): boolean {\n const nf = norm.normalizeStyleMap(full);\n const np = norm.normalizeStyleMap(partial);\n for (const [key, want] of np.blocks) {\n const have = nf.blocks.get(key) ?? nf.blocks.get(conditionKey(want.condition));\n if (!have) return false;\n for (const [prop, decl] of want.decls) {\n const got = have.decls.get(prop);\n if (!got || got.value !== decl.value) return false;\n }\n }\n return true;\n}\n\n/** Re-exported for callers that want to (de)construct keys without importing core directly. */\nexport { emptyStyleMap };\n","/**\n * @domflax/pattern-kit — composable matcher vocabulary.\n *\n * A {@link Matcher} is a PURE predicate over a node + its {@link MatchContext}. Matchers never\n * mutate; they only read the (DeepReadonly) IR and the precomputed targeting/selector facts the\n * context exposes. Authors compose them with {@link and}/{@link or}/{@link not} and feed the\n * result into a pattern's `evaluate`.\n *\n * Style-aware matchers (`computed`, `hasOwnVisualStyle`) reason over the NORMALIZED StyleMap via\n * the shared normalizer in `./normalize`, so they query meaning, not raw CSS strings.\n */\n\nimport type {\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n StyleMap,\n} from '@domflax/core';\n\nimport { isStyleSuperset, normalizer } from './normalize';\n\n/** A pure predicate: does `node` satisfy this condition in the given match context? */\nexport type Matcher = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/* ───────────────────────── internal helpers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction elementChildrenOf(\n el: DeepReadonly<IRElement>,\n ctx: MatchContext,\n): DeepReadonly<IRElement>[] {\n const out: DeepReadonly<IRElement>[] = [];\n for (const childId of el.children) {\n const child = ctx.doc.nodes.get(childId);\n if (child && child.kind === 'element') out.push(child as DeepReadonly<IRElement>);\n }\n return out;\n}\n\n/* ───────────────────────── boolean combinators ───────────────────────── */\n\n/** Logical AND. Empty list ⇒ always matches. Short-circuits on the first failure. */\nexport function and(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.every((m) => m(node, ctx));\n}\n\n/** Logical OR. Empty list ⇒ never matches. Short-circuits on the first success. */\nexport function or(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.some((m) => m(node, ctx));\n}\n\n/** Logical NOT. */\nexport function not(matcher: Matcher): Matcher {\n return (node, ctx) => !matcher(node, ctx);\n}\n\n/* ───────────────────────── structural matchers ───────────────────────── */\n\n/** Matches any element; with `tag`, only elements whose (case-insensitive) tag equals it. */\nexport function isElement(tag?: string): Matcher {\n const want = tag?.toLowerCase();\n return (node) => {\n const el = asElement(node);\n if (!el) return false;\n return want === undefined || el.tag.toLowerCase() === want;\n };\n}\n\n/** Matches an element with exactly one ELEMENT child (text/expr/comment children ignored). */\nexport const hasSingleElementChild: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return elementChildrenOf(el, ctx).length === 1;\n};\n\n/* ───────────────────────── style matchers ───────────────────────── */\n\n/**\n * Matches when the node's computed StyleMap is a SUPERSET of `partial` — i.e. every declaration\n * in `partial` is present in `node.computed` with an equal normalized value. Comparison is\n * meaning-based (both sides normalized first). Empty `partial` always matches.\n */\nexport function computed(partial: StyleMap): Matcher {\n return (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n const full = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n return isStyleSuperset(full as StyleMap, partial, normalizer);\n };\n}\n\n/** Visual (paint-establishing) properties that count as \"own visual style\", beyond pure layout. */\nconst VISUAL_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'background',\n 'background-color',\n 'background-image',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n 'border-radius',\n 'box-shadow',\n 'outline',\n 'outline-width',\n 'outline-style',\n 'outline-color',\n 'text-shadow',\n 'filter',\n 'backdrop-filter',\n 'mix-blend-mode',\n 'opacity',\n]);\n\n/** Values that mean \"no paint\" — a visual property set to one of these does NOT count. */\nconst EMPTY_VISUAL_VALUES: ReadonlySet<string> = new Set<string>([\n 'none',\n '0',\n 'normal',\n 'transparent',\n 'rgba(0, 0, 0, 0)',\n 'initial',\n 'unset',\n 'auto',\n]);\n\n/**\n * Matches when the element paints something of its own: a meaningful background, border, shadow,\n * outline, filter, etc. across ANY style condition. Honours the frontend-set `meta.hasOwnVisualStyle`\n * fast-path, then falls back to scanning the normalized computed StyleMap.\n */\nexport const hasOwnVisualStyle: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.hasOwnVisualStyle) return true;\n\n const computedMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n const norm = normalizer.normalizeStyleMap(computedMap as StyleMap);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (!VISUAL_PROPERTIES.has(String(decl.property))) continue;\n if (!EMPTY_VISUAL_VALUES.has(String(decl.value))) return true;\n }\n }\n return false;\n};\n\n/* ───────────────────────── opacity-barrier / meta matchers ───────────────────────── */\n\n/** Element carries a `ref` (hard opacity barrier). */\nexport const hasRef: Matcher = (node) => asElement(node)?.meta.hasRef ?? false;\n\n/** Element has event handlers (onClick, …). */\nexport const hasEventHandlers: Matcher = (node) => asElement(node)?.meta.hasEventHandlers ?? false;\n\n/** Element has dynamic children (mapped/conditional islands). */\nexport const hasDynamicChildren: Matcher = (node) =>\n asElement(node)?.meta.hasDynamicChildren ?? false;\n\n/** Element's class list contains a dynamic segment (template/expr) → not freely rewritable. */\nexport const hasDynamicClasses: Matcher = (node) => asElement(node)?.classes.hasDynamic ?? false;\n\n/**\n * Element is the subject of a combinator selector (`>`/`+`/`~`). Honours the frontend-set meta\n * flag and the precomputed {@link SelectorIndex} in the context.\n */\nexport const targetedByCombinator: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.targetedByCombinator) return true;\n // `el.id` is a branded number; DeepReadonly widens the brand, so re-narrow for the index call.\n return ctx.selectors.targetedByCombinator(el.id as unknown as IRNodeId);\n};\n","/**\n * @domflax/pattern-kit — ergonomic op-draft constructors.\n *\n * Thin, pure helpers that build the core {@link RewriteOpDraft} objects so pattern authors can\n * assemble a `MatchResult.ops` array without hand-writing discriminant literals. Drafts carry NO\n * `origin` — the pass-manager stamps `{ pattern, category, safety }` when it schedules the op\n * (see core's `stampOrigin`). Each helper accepts a live node, a DeepReadonly view, or a bare\n * {@link IRNodeId}.\n *\n * Mirrors the four ops a rewrite typically reaches for: `mergeStyle`, `foldInheritedStyles`,\n * `replaceWith`, `removeNode`.\n */\n\nimport type {\n CssProperty,\n ElementLike,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeSpec,\n RewriteOpDraft,\n StyleConflictPolicy,\n StyleMap,\n} from '@domflax/core';\n\n/** Accept a live/readonly node or a bare id. */\ntype Ref = NodeLike | ElementLike | IRNodeId;\n\nfunction idOf(ref: Ref): IRNodeId {\n return typeof ref === 'number' ? (ref as IRNodeId) : ((ref as IRNode).id as IRNodeId);\n}\n\n/* ───────────────────────── style ops ───────────────────────── */\n\n/**\n * Merge `style` onto `target`, optionally pulling from `source` (or `null` for a literal patch).\n * `onConflict` defaults to `'abort'` — the safest policy (the applier refuses rather than guess).\n */\nexport function mergeStyle(\n target: Ref,\n source: Ref | null,\n style: StyleMap,\n onConflict: StyleConflictPolicy = 'abort',\n): RewriteOpDraft {\n return {\n op: 'mergeStyle',\n target: idOf(target),\n source: source == null ? null : idOf(source),\n style,\n onConflict,\n };\n}\n\n/**\n * Fold inheritable declarations from `from` down into one or more descendants. `conditions:'all'`\n * folds across every StyleCondition (states/media/pseudo-elements); the default `'base'` folds only\n * the unconditional block. `only` restricts the property set (otherwise `'all-inherited'`).\n */\nexport function foldInheritedStyles(\n from: Ref,\n into: Ref | readonly Ref[],\n opts?: { only?: readonly CssProperty[]; conditions?: 'base' | 'all' },\n): RewriteOpDraft {\n const list: readonly Ref[] = Array.isArray(into) ? (into as readonly Ref[]) : [into as Ref];\n return {\n op: 'foldInheritedStyles',\n from: idOf(from),\n into: list.map(idOf),\n properties: opts?.only ?? 'all-inherited',\n conditions: opts?.conditions ?? 'base',\n };\n}\n\n/* ───────────────────────── structural ops ───────────────────────── */\n\n/** Replace `target` with a detached {@link NodeSpec} (the applier materializes ids on apply). */\nexport function replaceWith(target: Ref, replacement: NodeSpec): RewriteOpDraft {\n return { op: 'replaceWith', target: idOf(target), replacement };\n}\n\n/** Remove `target` (and its subtree) from the tree. */\nexport function removeNode(target: Ref): RewriteOpDraft {\n return { op: 'removeNode', target: idOf(target) };\n}\n","/**\n * @domflax/pattern-kit — `pattern()`: a low-boilerplate, declarative authoring surface.\n *\n * `pattern(config)` is pure authoring SUGAR: it compiles down to the existing\n * {@link definePattern}/{@link Pattern} contract (it never replaces the engine). Authors describe\n * the match as a plain DATA object and the rewrite as a named RECIPE; this module maps each key to\n * the existing matcher combinators and op-draft factories, auto-applies the opacity-barrier and\n * selector-safety guards that every `flatten/*` pattern must carry, and threads `doc`/`examples`\n * through. Two escape hatches — a `match` predicate and a `rewrite` function — keep exotic patterns\n * (e.g. ones anchored on a parent fragment) expressible.\n *\n * `style` blocks in the declarative match (and in `childGains`/`mergeStyle` recipes) are PLAIN\n * objects (camelCase or kebab keys) auto-normalized into a superset StyleMap via the shared\n * normalizer — authors never import the normalizer or hand-build a StyleMap.\n */\n\nimport type {\n Captures,\n ConditionKey,\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n MatchResult,\n NodeLike,\n NodeMeta,\n PassCategory,\n PassPhase,\n Pattern,\n PatternDoc,\n PreconditionSketch,\n RewriteFactory,\n RewriteOpDraft,\n SafetyLevel,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleConflictPolicy,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n hasDynamicChildren,\n hasEventHandlers,\n hasOwnVisualStyle,\n hasRef,\n hasSingleElementChild,\n isElement,\n not,\n targetedByCombinator,\n type Matcher,\n} from './combinators';\nimport { definePattern } from './define';\nimport { normalizer } from './normalize';\n\n/* ───────────────────────── public config shapes ───────────────────────── */\n\n/** A plain CSS style object: camelCase or kebab-case keys, string or number values. */\nexport type PlainStyle = Readonly<Record<string, string | number>>;\n\n/**\n * Declarative match as DATA. Every key maps to one of the existing matcher combinators; an empty\n * object matches any element. Use the `match` FUNCTION escape hatch for anything not expressible\n * here (relational/ancestor/sibling shapes, parent-anchored patterns, …).\n */\nexport interface DeclarativeMatch {\n /** Restrict to a tag (case-insensitive). Omit to match any element. */\n readonly tag?: string;\n /** Computed style the node must be a SUPERSET of (plain object, auto-normalized). */\n readonly style?: PlainStyle;\n /** Require exactly one ELEMENT child. */\n readonly onlyChild?: 'element';\n /** Require the element to paint nothing of its own (no own visual style). */\n readonly paintsNothing?: boolean;\n /** Extra, hand-written predicate AND-ed into the declarative match. */\n readonly where?: Matcher | readonly Matcher[];\n}\n\n/** Escape hatch: a raw match predicate (no auto-guards are added). */\nexport type MatchFn = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/**\n * Flatten recipe: fold inherited styles onto the sole element child (default on), optionally merge\n * `childGains` onto it, then unwrap the node (id-preserving). Mirrors the flatten exemplars.\n */\nexport interface FlattenIntoRecipe {\n readonly flattenInto: 'child';\n /** Plain style merged onto the surviving child (source-wins) before unwrap. */\n readonly childGains?: PlainStyle;\n /** Fold inheritable declarations onto the child first. Default `true`. */\n readonly foldInherited?: boolean;\n}\n\n/** Compress recipe: rebuild the element's class StyleMap; return `null` to decline. */\nexport interface RewriteClassesRecipe {\n readonly rewriteClasses: (computed: StyleMap, ctx: MatchContext) => StyleMap | null;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Compress recipe: drop fully-overridden class tokens (provenance is pruned automatically). */\nexport interface DropClassesRecipe {\n readonly dropClasses: (computed: StyleMap, ctx: MatchContext) => Iterable<string>;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Merge a literal plain style onto the matched element. */\nexport interface MergeStyleRecipe {\n readonly mergeStyle: PlainStyle;\n readonly onConflict?: StyleConflictPolicy;\n}\n\nexport type RewriteRecipe =\n | FlattenIntoRecipe\n | RewriteClassesRecipe\n | DropClassesRecipe\n | MergeStyleRecipe;\n\n/** Escape hatch: a raw rewrite that returns op drafts (or `null`/`[]` for no-op). */\nexport type RewriteFn = (\n ctx: MatchContext,\n rw: RewriteFactory,\n) => readonly RewriteOpDraft[] | null;\n\n/** A before/after positive example, or a no-match (left-unchanged) example. */\nexport type Example =\n | { readonly before: string; readonly after: string }\n | { readonly name?: string; readonly noMatch: string };\n\nexport interface PatternConfig {\n readonly name: string;\n readonly category: PassCategory;\n readonly safety: SafetyLevel;\n readonly priority?: number;\n readonly precondition?: PreconditionSketch;\n readonly doc?: PatternDoc;\n /** Optional worked examples consumed by the auto-test harness (`./testing`). */\n readonly examples?: readonly Example[];\n /** Declarative match DATA, or a raw predicate escape hatch. Defaults to \"any element\". */\n readonly match?: DeclarativeMatch | MatchFn;\n /** A named rewrite recipe, or a raw op-draft factory escape hatch. */\n readonly rewrite: RewriteRecipe | RewriteFn;\n}\n\n/** A {@link Pattern} that also carries its authored {@link Example}s for the test harness. */\nexport interface AuthoredPattern<C extends Captures = Captures> extends Pattern {\n readonly examples?: readonly Example[];\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult<C> | null;\n}\n\n/* ───────────────────────── plain-style → StyleMap ───────────────────────── */\n\nfunction camelToKebab(key: string): string {\n if (key.startsWith('--')) return key; // custom property — leave verbatim\n return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/** Build a single-(base-)condition StyleMap from a plain style object via the shared normalizer. */\nfunction plainToStyleMap(style: PlainStyle): StyleMap {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [rawKey, rawValue] of Object.entries(style)) {\n const prop = camelToKebab(rawKey);\n for (const decl of normalizer.normalizeDeclaration(prop, String(rawValue), false)) {\n decls.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls };\n return { blocks: new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]) };\n}\n\n/* ───────────────────────── local meta / selector matchers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaFlag(flag: keyof NodeMeta): Matcher {\n return (node) => Boolean(asElement(node)?.meta[flag]);\n}\n\n/** Element renders raw/`dangerouslySetInnerHTML` markup — a hard opacity barrier. */\nconst hasRawHtml: Matcher = metaFlag('hasDangerousHtml');\n\n/**\n * Unwrapping/removing this node would change the combinator / structural-pseudo match-set of itself,\n * its child, or a former sibling. Empty `reparentImpact` ⇒ structurally safe to hoist.\n */\nconst affectsSelectorMatching: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return ctx.selectors.reparentImpact(el.id as unknown as IRNodeId).size > 0;\n};\n\n/**\n * The opacity-barrier + selector-safety guards every `flatten/*` pattern must carry. Auto-applied to\n * the declarative match so authors never hand-write them (the flatten exemplars spell them out).\n */\nconst FLATTEN_GUARDS: Matcher = and(\n not(hasRef),\n not(hasEventHandlers),\n not(hasDynamicChildren),\n not(hasRawHtml),\n not(targetedByCombinator),\n not(affectsSelectorMatching),\n);\n\n/* ───────────────────────── match compilation ───────────────────────── */\n\nfunction isFlattenCategory(category: PassCategory): boolean {\n return (category.split('/', 1)[0] as PassPhase) === 'flatten';\n}\n\nfunction compileDeclarativeMatch(m: DeclarativeMatch): Matcher {\n const parts: Matcher[] = [isElement(m.tag)];\n if (m.style) parts.push(computed(plainToStyleMap(m.style)));\n if (m.onlyChild === 'element') parts.push(hasSingleElementChild);\n if (m.paintsNothing) parts.push(not(hasOwnVisualStyle));\n if (m.where) {\n const extra = Array.isArray(m.where) ? (m.where as readonly Matcher[]) : [m.where as Matcher];\n for (const w of extra) parts.push(w);\n }\n return and(...parts);\n}\n\nfunction compileMatch(\n match: DeclarativeMatch | MatchFn | undefined,\n category: PassCategory,\n): MatchFn {\n // Escape hatch: a raw predicate takes full control (no auto-guards).\n if (typeof match === 'function') return match;\n\n const declarative = compileDeclarativeMatch(match ?? {});\n const guarded = isFlattenCategory(category) ? and(declarative, FLATTEN_GUARDS) : declarative;\n return (node, ctx) => guarded(node, ctx);\n}\n\n/* ───────────────────────── rewrite compilation ───────────────────────── */\n\n/** Clone `sm`, pruning every `shadowed` provenance entry that references a dropped class token. */\nfunction pruneShadowed(sm: StyleMap, drop: ReadonlySet<string>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n const filtered = (decl.shadowed ?? []).filter(\n (o) => !(o.kind === 'class' && drop.has(o.className)),\n );\n const rest: StyleDecl = { ...decl };\n delete (rest as { shadowed?: readonly StyleOrigin[] }).shadowed;\n const next: StyleDecl = filtered.length > 0 ? { ...rest, shadowed: filtered } : rest;\n decls.set(prop, next);\n }\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\nfunction compileFlattenInto(recipe: FlattenIntoRecipe): RewriteFn {\n const childGains = recipe.childGains ? plainToStyleMap(recipe.childGains) : null;\n const fold = recipe.foldInherited !== false;\n return (ctx, rw) => {\n const wrapper = ctx.node;\n const child = ctx.onlyElementChild();\n if (!child) return null;\n const ops: RewriteOpDraft[] = [];\n if (fold) ops.push(rw.foldInheritedStyles(wrapper, child, { conditions: 'all' }));\n if (childGains) ops.push(rw.mergeStyle(child, null, childGains, 'source-wins'));\n ops.push(rw.unwrap(wrapper));\n return ops;\n };\n}\n\nfunction compileRewrite(rewrite: RewriteRecipe | RewriteFn): RewriteFn {\n if (typeof rewrite === 'function') return rewrite;\n\n if ('flattenInto' in rewrite) return compileFlattenInto(rewrite);\n\n if ('rewriteClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const next = rewrite.rewriteClasses(ctx.computed(), ctx);\n if (!next) return null;\n return [rw.setClassList(ctx.node, next, preserveOpaque)];\n };\n }\n\n if ('dropClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const drop = new Set<string>(rewrite.dropClasses(ctx.computed(), ctx));\n if (drop.size === 0) return null;\n return [rw.setClassList(ctx.node, pruneShadowed(ctx.computed(), drop), preserveOpaque)];\n };\n }\n\n // MergeStyleRecipe\n const style = plainToStyleMap(rewrite.mergeStyle);\n const onConflict = rewrite.onConflict ?? 'abort';\n return (ctx, rw) => [rw.mergeStyle(ctx.node, null, style, onConflict)];\n}\n\n/* ───────────────────────── the public factory ───────────────────────── */\n\n/**\n * Compile a declarative {@link PatternConfig} into a validated {@link AuthoredPattern}. The result\n * is a normal {@link Pattern} (registerable into any {@link import('@domflax/core').Pass}) that also\n * exposes its `examples` for the auto-test harness.\n */\nexport function pattern(config: PatternConfig): AuthoredPattern {\n const matchFn = compileMatch(config.match, config.category);\n const rewriteFn = compileRewrite(config.rewrite);\n\n const spec: AuthoredPattern = {\n name: config.name,\n category: config.category,\n safety: config.safety,\n priority: config.priority,\n precondition: config.precondition,\n doc: config.doc,\n examples: config.examples,\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult | null {\n if (!matchFn(ctx.node as unknown as NodeLike, ctx)) return null;\n const ops = rewriteFn(ctx, rw);\n if (!ops || ops.length === 0) return null;\n return { ops };\n },\n };\n\n // `definePattern` validates + freezes; the spread preserves `examples` at runtime.\n return definePattern(spec) as AuthoredPattern;\n}\n","/**\n * @domflax/pattern-kit — the authoring surface for rewrite patterns.\n *\n * Re-exports the four pillars pattern authors compose with:\n * • {@link definePattern} — validated Pattern factory.\n * • the matcher vocabulary (`and`/`or`/`not`/`isElement`/`computed`/… ) from `./combinators`.\n * • the op-draft constructors (`mergeStyle`/`foldInheritedStyles`/`replaceWith`/`removeNode`).\n * • the shared {@link normalizer} (also consumed by core + verify) from `./normalize`.\n * • the declarative {@link pattern} authoring sugar from `./pattern`.\n *\n * The auto-test harness lives in the separate `./testing` entry (it imports vitest) so the main\n * authoring surface stays runtime-light and frontend-agnostic.\n */\n\nexport * from './define';\nexport * from './combinators';\nexport * from './ops';\nexport * from './normalize';\nexport * from './pattern';\n"],"mappings":"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","names":["childIds","pattern","normalizer","normalizer","idOf","asElement"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * domflax — public meta package.\n *\n * Re-exports the entire `@domflax/core` public API (types + reference runtime) and the built-in\n * `@domflax/patterns` library, then layers thin, framework-agnostic build adapters on top\n * (`vite()` / `webpack()`) plus a programmatic `createDomflax()` factory.\n *\n * Each adapter runs the SAME single-file engine as {@link createDomflax} (JSX/TSX frontend + lazy\n * Tailwind/CSS resolver → core pass manager → reverse-emit → JSX backend). The adapters are\n * structurally typed against their bundlers — they never hard-depend on `vite` or `webpack`.\n *\n * Future deps (intentionally NOT imported yet — they land in a later stage):\n * - `@domflax/frontend-html` — HTML / Astro-static frontend feeding the pipeline.\n * - `@domflax/backend-*` — additional surgical codegen backends.\n */\n\nimport {\n buildSelectorIndex,\n createPipeline,\n createSyntheticSink,\n runPasses,\n syncClassesFromComputed,\n} from '@domflax/core';\nimport type {\n ApplyContext,\n EncodedSourceMap,\n FileKind,\n IRDocument,\n Pass,\n PassCategory,\n PassPhase,\n Pattern,\n Pipeline,\n SafetyLevel,\n StyleResolver,\n} from '@domflax/core';\nimport { builtinPatterns } from '@domflax/patterns';\nimport { createJsxBackend, createJsxFrontend } from '@domflax/frontend-jsx';\nimport { normalizer } from '@domflax/pattern-kit';\nimport { createTailwindResolver } from '@domflax/resolver-tailwind';\nimport { createCssResolver } from '@domflax/resolver-css';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// ── Re-export the public surface ──────────────────────────────────────────────────────────────\nexport * from '@domflax/core';\nexport * from '@domflax/patterns';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Options\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** How class names resolve to computed styles. */\nexport type DomflaxProvider = 'auto' | 'tailwind' | 'custom';\n\n/** Public adapter/factory options (mirrors the documented `domflax({...})` surface). */\nexport interface DomflaxOptions {\n /** Resolution strategy. Defaults to `'auto'`. */\n readonly provider?: DomflaxProvider;\n /** Stylesheets to parse when `provider` is `'custom'`. */\n readonly cssFiles?: readonly string[];\n /** Preview changes without rewriting source. */\n readonly dryRun?: boolean;\n /** Optimization aggressiveness handed to the pass manager (0 lint … 3 aggressive). */\n readonly safety?: SafetyLevel;\n /** File globs/extensions the adapters should consider. Defaults to jsx/tsx/html. */\n readonly include?: readonly string[];\n}\n\n/** Fully-resolved options with defaults applied. */\nexport interface ResolvedDomflaxOptions {\n readonly provider: DomflaxProvider;\n readonly cssFiles: readonly string[];\n readonly dryRun: boolean;\n readonly safety: SafetyLevel;\n readonly include: readonly string[];\n}\n\nconst DEFAULT_INCLUDE: readonly string[] = ['.jsx', '.tsx', '.html'];\n\nfunction resolveOptions(options: DomflaxOptions): ResolvedDomflaxOptions {\n return {\n provider: options.provider ?? 'auto',\n cssFiles: options.cssFiles ?? [],\n dryRun: options.dryRun ?? false,\n safety: options.safety ?? 2,\n include: options.include ?? DEFAULT_INCLUDE,\n };\n}\n\n/** True when `id` is a file domflax knows how to transform. */\nfunction isSupported(id: string, include: readonly string[]): boolean {\n // Strip query suffixes bundlers append (e.g. `App.tsx?used`).\n const clean = id.split('?', 1)[0] ?? id;\n return include.some((ext) => clean.endsWith(ext));\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Programmatic instance\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Result of a single-file transform. `map` is null until codegen lands. */\nexport interface DomflaxTransformResult {\n readonly code: string;\n readonly map: EncodedSourceMap | null;\n}\n\n/**\n * A configured domflax engine. Holds the wired core {@link Pipeline}, the passthrough\n * {@link StyleResolver}, and the built-in {@link Pattern} set, and exposes a single-file\n * `transform`.\n */\nexport interface Domflax {\n readonly options: ResolvedDomflaxOptions;\n readonly pipeline: Pipeline;\n readonly resolver: StyleResolver;\n readonly patterns: readonly Pattern[];\n /**\n * Transform one file. For `.jsx`/`.tsx` this runs the full pipeline (parse → resolve → flatten →\n * reverse-emit → print); every other (or unsupported) file is returned unchanged.\n */\n transform(code: string, id: string): DomflaxTransformResult;\n}\n\n/** `.tsx`/`.jsx` ⇒ the matching {@link FileKind}; anything else ⇒ null (no JSX frontend). */\nfunction jsxKindOf(id: string): FileKind | null {\n const clean = id.split('?', 1)[0] ?? id;\n if (clean.endsWith('.tsx')) return 'tsx';\n if (clean.endsWith('.jsx')) return 'jsx';\n return null;\n}\n\n/** First registered source's EOL, defaulting to `\\n`. */\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n/** Group the flat pattern list into one {@link Pass} per {@link PassPhase} (derived from category). */\nfunction buildPasses(patterns: readonly Pattern[]): Pass[] {\n const byPhase = new Map<PassPhase, Pattern[]>();\n for (const p of patterns) {\n const phase = (p.category.split('/', 1)[0] ?? 'flatten') as PassPhase;\n let bucket = byPhase.get(phase);\n if (!bucket) {\n bucket = [];\n byPhase.set(phase, bucket);\n }\n bucket.push(p);\n }\n const passes: Pass[] = [];\n for (const [phase, pats] of byPhase) {\n passes.push({ phase, category: `${phase}/builtin` as PassCategory, patterns: pats });\n }\n return passes;\n}\n\n/** Run the full JSX/TSX pipeline and return the re-printed source. */\nfunction runJsxPipeline(\n code: string,\n id: string,\n kind: FileKind,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n): string {\n // 1. PARSE — the frontend lowers JSX → IR and resolves each element's static classes through the\n // injected resolver into `el.computed` (so the \"resolve styles onto each element\" step is done\n // here, via createTailwindResolver().resolve(classTokens)).\n const parsed = createJsxFrontend().parse(code, {\n id,\n kind,\n resolver,\n normalizer,\n config: {},\n onDiagnostic: () => {},\n });\n const doc = parsed.doc;\n\n // 2. AUTHORIZE — the JSX frontend defaults every node's safety floor to 0 (no optimization). The\n // orchestrator opens the floor to the max; the configured ceiling + each pattern's own opacity\n // predicates are the real gate.\n for (const node of doc.nodes.values()) node.meta.safetyFloor = 3;\n\n // 3. PASSES — drive the built-in patterns to a fixpoint via the core pass manager.\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: safety,\n normalizer,\n // Real CSS-selector-safety index from the active resolver: a wrapper a combinator/structural\n // selector depends on is flagged so the flatten guards refuse to flatten it. Tailwind (no\n // complexSelectors) degrades to the null index — behaviour unchanged.\n selectors: buildSelectorIndex(doc, resolver),\n resolver,\n };\n const { doc: optimized } = runPasses(doc, buildPasses(patterns), ctx);\n\n // 4. REVERSE-EMIT — fold optimized computed styles back into class tokens for the backend.\n syncClassesFromComputed(optimized, resolver, normalizer);\n\n // 5. PRINT — IR → JSX/TSX text.\n const printed = createJsxBackend().print(\n optimized,\n { moduleId: id, ops: [], provenance: new Map() },\n {\n normalizer,\n resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: () => {},\n },\n );\n return printed.code;\n}\n\n/**\n * Build a configured domflax engine.\n *\n * Wires a real single-file pipeline: the JSX/TSX frontend + a Tailwind resolver feed the core pass\n * manager (running {@link builtinPatterns}), whose output is reverse-emitted back to class tokens\n * and re-printed by the JSX backend. Non-jsx/tsx files pass through unchanged.\n */\n/**\n * Build the {@link StyleResolver} for the chosen provider. The heavy engine each resolver wraps\n * (Tailwind v3 / postcss) is loaded LAZILY — at the moment this factory runs — and resolved from the\n * CONSUMER'S project, NOT from domflax's (possibly bundled) location. Both engines are OPTIONAL peer\n * dependencies of the published `domflax`: a Tailwind-only user never triggers a postcss load, and a\n * custom-CSS-only user never triggers a Tailwind load, because only the selected branch constructs.\n */\nfunction createResolver(resolved: ResolvedDomflaxOptions): StyleResolver {\n if (resolved.provider === 'custom') {\n return createCssResolver([], { files: resolved.cssFiles });\n }\n // 'auto' and 'tailwind' both resolve against the project's Tailwind engine.\n return createTailwindResolver();\n}\n\nexport function createDomflax(options: DomflaxOptions = {}): Domflax {\n const resolved = resolveOptions(options);\n const pipeline = createPipeline();\n const patterns = builtinPatterns;\n\n // Construct the resolver lazily so neither optional engine (Tailwind / postcss) is loaded until a\n // file is actually transformed (and only the engine for the selected provider is ever loaded).\n let cachedResolver: StyleResolver | null = null;\n const getResolver = (): StyleResolver => (cachedResolver ??= createResolver(resolved));\n\n return {\n options: resolved,\n pipeline,\n get resolver(): StyleResolver {\n return getResolver();\n },\n patterns,\n transform(code: string, id: string): DomflaxTransformResult {\n if (!isSupported(id, resolved.include)) return { code, map: null };\n const kind = jsxKindOf(id);\n // Non-jsx/tsx supported files (e.g. .html) stay passthrough — no HTML frontend wired yet.\n if (kind === null) return { code, map: null };\n const out = runJsxPipeline(code, id, kind, getResolver(), patterns, resolved.safety);\n return { code: out, map: null };\n },\n };\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Build adapters (framework-agnostic, structurally-typed shapes)\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Minimal Vite-plugin shape. Declared locally so this adapter does NOT depend on `vite`'s types\n * (an optional, type-only peer). Structurally compatible with Vite's `Plugin` for the hooks domflax\n * uses: `enforce: 'pre'` runs domflax before Vite's JSX→`createElement` transform, and `transform`\n * is Vite's per-file source hook. Returning `null` is Vite's \"no change\" signal.\n */\nexport interface DomflaxVitePlugin {\n readonly name: string;\n readonly enforce: 'pre';\n transform(code: string, id: string): DomflaxTransformResult | null;\n}\n\n/**\n * Vite adapter. Returns a real Vite `Plugin` (`enforce: 'pre'`) whose `transform` runs the domflax\n * engine on `.jsx`/`.tsx` modules — strips any bundler query suffix (e.g. `App.tsx?used`) before\n * matching, returns `{ code, map }` when the source changed, and `null` (Vite's unchanged signal)\n * for unchanged sources and for any non-jsx/tsx module.\n *\n * @example\n * ```js\n * // vite.config.js\n * import domflax from 'domflax';\n * export default { plugins: [domflax.vite({ provider: 'tailwind' })] };\n * ```\n */\nexport function vite(options: DomflaxOptions = {}): DomflaxVitePlugin {\n const engine = createDomflax(options);\n return {\n name: 'domflax',\n enforce: 'pre',\n transform(code: string, id: string): DomflaxTransformResult | null {\n if (!isSupported(id, engine.options.include)) return null;\n const out = engine.transform(code, id);\n // Signal \"no change\" to Vite when the source round-tripped unchanged.\n return out.code === code ? null : out;\n },\n };\n}\n\n/* ── webpack / Next.js ──────────────────────────────────────────────────────────────────────── */\n\n/** A `module.rule` `use` entry: an absolute loader path plus the options forwarded to it. */\ninterface DomflaxRuleUse {\n readonly loader: string;\n readonly options: DomflaxOptions;\n}\n\n/** The slice of a webpack `module.rule` domflax appends. */\ninterface DomflaxModuleRule {\n readonly test: RegExp;\n readonly enforce: 'pre';\n readonly exclude: RegExp;\n readonly use: readonly DomflaxRuleUse[];\n}\n\n/** Anything carrying a `module.rules` array — both a webpack `Compiler.options` and Next's bare config. */\ninterface DomflaxWebpackModuleHost {\n module?: { rules?: unknown[] };\n}\n\n/**\n * Minimal webpack-compiler shape. Declared locally so this adapter does NOT depend on `webpack`'s\n * types. domflax only needs to push a rule onto the host's `module.rules`.\n *\n * `apply` accepts BOTH shapes: a real webpack `Compiler` (rules live under `compiler.options.module`)\n * AND the bare `config` object Next.js hands you from `webpack(config)` (rules live directly under\n * `config.module`). It duck-types `compiler.options ?? compiler` to find the right host.\n */\nexport interface DomflaxWebpackCompiler extends DomflaxWebpackModuleHost {\n options?: DomflaxWebpackModuleHost;\n}\n\n/**\n * Minimal webpack-plugin shape. `apply(compiler)` is the webpack plugin entry point.\n */\nexport interface DomflaxWebpackPlugin {\n readonly name: string;\n apply(compiler: DomflaxWebpackCompiler): void;\n}\n\n/** `.jsx`/`.tsx` modules only (combinator-free with the JSX frontend; `.js`/`.ts` are skipped). */\nconst WEBPACK_JSX_TEST = /\\.[jt]sx$/;\n\n/**\n * Absolute path to the bundled webpack loader (`./webpack-loader`). Resolved lazily against THIS\n * module's location so it works whether `domflax` is loaded as ESM (`dist/index.js`) or CJS\n * (`dist/index.cjs`) — both sit beside `dist/webpack-loader.cjs`. webpack requires loaders via\n * CommonJS, so we always point at the `.cjs` output.\n */\nfunction webpackLoaderPath(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, 'webpack-loader.cjs');\n}\n\n/**\n * webpack adapter (also the Next.js path). Returns a plugin whose `apply(compiler)` injects a\n * pre-enforced `module.rule` that invokes the domflax {@link ./webpack-loader loader} on every\n * `.jsx`/`.tsx` module. The loader runs the SAME lazy engine as {@link createDomflax} (no eager\n * Tailwind/postcss load).\n *\n * Next.js wiring (`next.config.js`) — Next exposes the underlying webpack config via `webpack(config)`:\n * ```js\n * // next.config.js\n * const domflax = require('domflax');\n * module.exports = {\n * webpack(config) {\n * domflax.webpack({ provider: 'tailwind' }).apply(config);\n * return config;\n * },\n * };\n * ```\n * `apply(compiler)` is intentionally duck-typed on `compiler.options.module.rules`, so it accepts\n * both a real webpack `Compiler` and the bare `config` object Next.js hands you.\n *\n * Caveat: this targets the webpack builder only. **Turbopack is not yet supported** — it does not\n * accept arbitrary webpack loaders, so the `next.config.js` wiring above is a no-op under\n * `next dev --turbopack`. Run domflax through the webpack builder until Turbopack exposes a loader API.\n */\nexport function webpack(options: DomflaxOptions = {}): DomflaxWebpackPlugin {\n // Validate options eagerly (parity with the other adapters); the resolver stays lazy.\n createDomflax(options);\n return {\n name: 'domflax',\n apply(compiler: DomflaxWebpackCompiler): void {\n // Real webpack passes a `Compiler` (rules under `.options.module`); Next's `webpack(config)`\n // passes the bare config (rules under `.module`). Duck-type to the right host.\n const host: DomflaxWebpackModuleHost = compiler.options ?? compiler;\n const mod = (host.module ??= {});\n const rules = (mod.rules ??= []);\n const rule: DomflaxModuleRule = {\n test: WEBPACK_JSX_TEST,\n enforce: 'pre',\n exclude: /node_modules/,\n use: [{ loader: webpackLoaderPath(), options }],\n };\n rules.push(rule);\n },\n };\n}\n\n/**\n * The default-export namespace. Exposes the build adapters and the programmatic factory as an OBJECT\n * so the documented `import domflax from 'domflax'; domflax.vite()` / `domflax.webpack()` works (and a\n * CommonJS `const domflax = require('domflax'); domflax.vite()` too). The named exports\n * (`createDomflax`, `vite`, `webpack`, …) remain available for direct import.\n */\nexport interface DomflaxDefault {\n createDomflax(options?: DomflaxOptions): Domflax;\n vite(options?: DomflaxOptions): DomflaxVitePlugin;\n webpack(options?: DomflaxOptions): DomflaxWebpackPlugin;\n}\n\n/** Default export: an object exposing `vite`, `webpack`, and the programmatic `createDomflax`. */\nconst domflax: DomflaxDefault = { createDomflax, vite, webpack };\nexport default domflax;\n"],"mappings":"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","names":[]}