@forinda/kickjs-view 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.
- package/README.md +9 -0
- package/dist/{assets-30rOQ1d0.d.ts → assets-DzVT6upX.d.ts} +2 -2
- package/dist/{assets-30rOQ1d0.d.ts.map → assets-DzVT6upX.d.ts.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/edge.d.ts +2 -2
- package/dist/edge.js +2 -2
- package/dist/{exports-WibN1iWb.js → exports-CE5wwor2.js} +3 -3
- package/dist/exports-CE5wwor2.js.map +1 -0
- package/dist/file-loader.d.ts +1 -1
- package/dist/file-loader.js +1 -1
- package/dist/format-Qy3r4aci.js +18 -0
- package/dist/format-Qy3r4aci.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/{read-exports-CtiwXL4e.js → read-exports-BdIwY1WT.js} +2 -2
- package/dist/{read-exports-CtiwXL4e.js.map → read-exports-BdIwY1WT.js.map} +1 -1
- package/dist/{views-DA6Conh5.d.ts → views-BNSzhk2I.d.ts} +2 -2
- package/dist/{views-DA6Conh5.d.ts.map → views-BNSzhk2I.d.ts.map} +1 -1
- package/package.json +3 -3
- package/dist/exports-WibN1iWb.js.map +0 -1
- package/dist/format-BVAljUk8.js +0 -18
- package/dist/format-BVAljUk8.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-exports-CtiwXL4e.js","names":["LOOP_VARS","KEYWORDS"],"sources":["../src/ast.ts","../src/diagnostics.ts","../src/entities.ts","../src/urls.ts","../src/check/project.ts","../src/check/optimize.ts","../src/check/check.ts","../src/parse/expression.ts","../src/parse/template.ts","../src/render/safe.ts","../src/pipes/builtins.ts","../src/pipes/read-exports.ts"],"sourcesContent":["import type { Span } from './diagnostics'\n\n/** Bumped when the shape of a checked template changes; builds and runtimes must agree. */\nexport const AST_FORMAT_VERSION = 1\n\nexport type Literal = string | number | boolean | null\n\nexport interface PathSegment {\n /** `.name` / `?.name` */\n name?: string\n /** `[expr]` / `?.[expr]` */\n computed?: Expr\n optional: boolean\n}\n\nexport type Expr =\n | { kind: 'literal'; value: Literal; span: Span }\n | { kind: 'path'; root: string; segments: PathSegment[]; span: Span }\n | { kind: 'unary'; op: '!' | '-'; arg: Expr; span: Span }\n | {\n kind: 'binary'\n op: '+' | '-' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '===' | '!=='\n left: Expr\n right: Expr\n span: Span\n }\n | { kind: 'logical'; op: '&&' | '||' | '??'; left: Expr; right: Expr; span: Span }\n | { kind: 'conditional'; test: Expr; whenTrue: Expr; whenFalse: Expr; span: Span }\n | { kind: 'pipe'; input: Expr; name: string; args: Expr[]; span: Span }\n\n/** Where an interpolation lands, which decides how its value is escaped (spec §4). */\nexport type Ctx = 'text' | 'rcdata' | 'raw-text' | 'comment'\n\nexport interface Attr {\n /** As written: `href`, `userId` (from `[userId]`), `on` (from `[class.on]`). */\n name: string\n /**\n * `static` `a=\"x\"`, `interp` `a=\"x{{ y }}\"`, `bare` `a`, `bind` `[a]=\"expr\"`,\n * `class` `[class.a]=\"expr\"`, `style` `[style.a(.unit)]=\"expr\"`.\n */\n kind: 'static' | 'interp' | 'bare' | 'bind' | 'class' | 'style'\n /** `static` / `interp`: the value, literal text and expressions in order. */\n parts?: Array<string | Expr>\n /** `bind` / `class` / `style`: the bound expression. */\n expr?: Expr\n /** `[style.width.px]`: `px`. */\n unit?: string\n quoted: boolean\n span: Span\n}\n\nexport interface Element {\n k: 'element'\n /** As written. */\n tag: string\n attrs: Attr[]\n children: Node[]\n /** Inside `<svg>` / `<math>`: names keep their case. */\n foreign: boolean\n void: boolean\n selfClosing: boolean\n span: Span\n}\n\nexport interface IfBranch {\n /** Absent on `@else`. */\n cond?: Expr\n /** `@if (x; as y)` */\n alias?: string\n body: Node[]\n}\n\nexport type LoopVar = '$index' | '$first' | '$last' | '$even' | '$odd' | '$count'\n\nexport type Node =\n | { k: 'text'; value: string; span: Span }\n | { k: 'interp'; expr: Expr; ctx: Ctx; span: Span }\n | Element\n | { k: 'comment'; children: Node[]; span: Span }\n | { k: 'if'; branches: IfBranch[]; span: Span }\n | {\n k: 'for'\n item: string | [string, string]\n of: Expr\n lets: Record<string, LoopVar>\n body: Node[]\n empty?: Node[]\n span: Span\n }\n | {\n k: 'switch'\n on: Expr\n cases: Array<{ value: Expr; body: Node[] }>\n default?: Node[]\n span: Span\n }\n | { k: 'let'; name: string; expr: Expr; span: Span }\n | { k: 'verbatim'; text: string; span: Span }\n | { k: 'slot-outlet'; name?: string; fallback: Node[]; span: Span }\n | { k: 'slot-fill'; name: string; body: Node[]; span: Span }\n | { k: 'assets'; entry: string; span: Span }\n\nexport interface InputDecl {\n name: string\n default?: { value: Literal; span: Span }\n span: Span\n}\n\nexport interface TemplateAst {\n file: string\n /** `undefined`: none declared (the default layout applies); `null`: `@layout(none)`. */\n layout?: string | null\n layoutSpan?: Span\n inputs: InputDecl[]\n body: Node[]\n}\n\n/** `[line, column]` of a node in its template, for render errors. */\nexport type At = [number, number]\n\n// ── Checked templates: what `check` produces and `render` walks. Plain JSON,\n// so a build can ship them as data. Short keys keep edge bundles small.\n\n/** A path segment: `.n` or `[e]`; `o` marks `?.`. */\nexport type CSeg = { n: string; o?: 1 } | { e: CExpr; o?: 1 }\n\nexport type CExpr =\n /** literal */\n | { k: 'l'; v: Literal }\n /** undefined (a name a component doesn't have) */\n | { k: 'x' }\n /** page / shared data: `n` then the path */\n | { k: 'd'; n: string; p: CSeg[] }\n /** a scope slot (@let, loop item, @if alias, component input) then the path */\n | { k: 'v'; s: number; p: CSeg[] }\n /** a loop variable of the loop whose meta is in slot `s` */\n | { k: 'm'; s: number; w: LoopVar }\n | { k: 'u'; o: '!' | '-'; a: CExpr }\n | { k: 'b'; o: string; l: CExpr; r: CExpr }\n | { k: 'c'; t: CExpr; y: CExpr; n: CExpr }\n | { k: 'p'; n: string; i: CExpr; a: CExpr[] }\n\n/** One attribute of an element whose attributes need work at render time. */\nexport type CAttr =\n /** static; `v: true` is a bare attribute */\n | { t: 's'; n: string; v: string | true }\n /** `n=\"text {{ e }}\"`; `u` marks a URL attribute (`srcset` checks each candidate) */\n | { t: 'i'; n: string; p: Array<string | CExpr>; u?: 'url' | 'srcset' }\n /** `[n]=\"e\"` */\n | { t: 'b'; n: string; e: CExpr; u?: 'url' | 'srcset' }\n /** `[class.n]=\"e\"` */\n | { t: 'c'; n: string; e: CExpr }\n /** `[style.n(.x)]=\"e\"` */\n | { t: 'y'; n: string; e: CExpr; x?: string }\n\nexport type CNode =\n /** static output */\n | { k: 's'; t: string }\n /** `{{ e }}`: `text` escapes HTML (trusted HTML prints as is), `rcdata` (`<title>`, `<textarea>`) escapes everything, `json` is the one value of a JSON script */\n | { k: 'i'; c: 'text' | 'rcdata' | 'json'; e: CExpr; at: At }\n /** the attributes of an element (between `<tag` and `>`); `f` takes a component caller's fallthrough attributes */\n | { k: 'A'; tag: string; a: CAttr[]; f?: 1; at: At }\n | { k: 'if'; br: Array<{ c?: CExpr; a?: number; b: CNode[] }> }\n | {\n k: 'for'\n e: CExpr\n it: number | [number, number]\n m: number\n b: CNode[]\n em?: CNode[]\n at: At\n }\n | { k: 'sw'; e: CExpr; cs: Array<{ e: CExpr; b: CNode[] }>; d?: CNode[] }\n | { k: 'let'; s: number; e: CExpr }\n /** a component: inputs into its slots, fallthrough attributes, slot fills (`''` is the default) */\n | {\n k: 'cmp'\n n: string\n in: Array<{ s: number; e: CExpr }>\n fa: CAttr[]\n f: Record<string, CNode[]>\n at: At\n }\n /** `<slot name=\"n\">fallback</slot>` */\n | { k: 'o'; n: string; fb: CNode[] }\n | { k: 'as'; en: string }\n\nexport interface CheckedTemplate {\n v: typeof AST_FORMAT_VERSION\n name: string\n file: string\n /** declared layout; `null` is `@layout(none)`; absent means the default layout applies to a page */\n layout?: string | null\n /** scope slots the template needs */\n slots: number\n /** a component's inputs: name, slot, default, required */\n inputs: Array<{ n: string; s: number; d?: Literal; r: boolean }>\n /** `@slot('name') { }` fills a page passes to its layout */\n fills: Record<string, CNode[]>\n body: CNode[]\n}\n","/** A point in a template: 0-based offset, 1-based line and column (UTF-16 units). */\nexport interface Pos {\n offset: number\n line: number\n column: number\n}\n\nexport interface Span {\n start: Pos\n end: Pos\n}\n\nexport interface Diagnostic {\n file: string\n span: Span\n message: string\n severity: 'error' | 'warning'\n /** The templates being rendered, outermost first, when the error came from a render. */\n stack?: string[]\n}\n\n/**\n * The position `upTo` characters into `text`, which starts at `base`.\n * CRLF counts as one line break, as does a lone CR.\n */\nexport function advance(base: Pos, text: string, upTo: number): Pos {\n let { line, column } = base\n for (let i = 0; i < upTo; i++) {\n const c = text.charCodeAt(i)\n if (c === 10 /* \\n */) {\n line++\n column = 1\n } else if (c === 13 /* \\r */) {\n if (text.charCodeAt(i + 1) !== 10) {\n line++\n column = 1\n }\n } else {\n column++\n }\n }\n return { offset: base.offset + upTo, line, column }\n}\n\nexport const START: Pos = { offset: 0, line: 1, column: 1 }\n\n/** The position of `offset` in `source`. */\nexport const positionAt = (source: string, offset: number): Pos => advance(START, source, offset)\n\nexport const error = (file: string, span: Span, message: string): Diagnostic => ({\n file,\n span,\n message,\n severity: 'error',\n})\n\nexport const warning = (file: string, span: Span, message: string): Diagnostic => ({\n file,\n span,\n message,\n severity: 'warning',\n})\n","/**\n * Decode the character references a browser would in attribute text: every\n * numeric one, and the named ones that matter for reading a URL's scheme or\n * for common text. Unknown names stay as written.\n */\nconst NAMED: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: ' ',\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n sol: '/',\n bsol: '\\\\',\n period: '.',\n comma: ',',\n semi: ';',\n equals: '=',\n quest: '?',\n num: '#',\n excl: '!',\n lpar: '(',\n rpar: ')',\n plus: '+',\n hyphen: '-',\n dash: '-',\n copy: '©',\n reg: '®',\n trade: '™',\n hellip: '…',\n mdash: '—',\n ndash: '–',\n laquo: '«',\n raquo: '»',\n}\n\nexport function decodeEntities(s: string): string {\n if (!s.includes('&')) return s\n return s.replace(\n /&(?:#[xX]([0-9a-fA-F]+)|#(\\d+)|([A-Za-z][A-Za-z0-9]*));?/g,\n (m, hex, dec, name) => {\n if (hex !== undefined || dec !== undefined) {\n const code = parseInt(hex ?? dec, hex !== undefined ? 16 : 10)\n return code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff)\n ? String.fromCodePoint(code)\n : '�'\n }\n return Object.hasOwn(NAMED, name) && m.endsWith(';') ? NAMED[name]! : m\n },\n )\n}\n","/**\n * Attributes whose value is a URL a browser may navigate to, load or run\n * (spec §4). Their assembled value is scheme-checked when rendered.\n */\nexport const URL_ATTRS: ReadonlySet<string> = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'poster',\n 'cite',\n 'background',\n 'ping',\n 'xlink:href',\n 'srcset',\n])\n\nexport function isUrlAttr(tag: string, attr: string): boolean {\n const name = attr.toLowerCase()\n return URL_ATTRS.has(name) || (name === 'data' && tag.toLowerCase() === 'object')\n}\n","import type { TemplateAst } from '../ast'\n\n/** Everything `check` knows about an app's views — built the same way by the runtime, the build and the editor. */\nexport interface Project {\n /** Template name (`users/show`, `components/user-card`) → its parsed source. */\n templates: Map<string, TemplateAst>\n /** Pipe names: the built-ins and the app's. */\n pipes: Set<string>\n /** Folder (inside the views folder) holding components. Default `components`. */\n componentsDir: string\n /** A page's layout when it declares none: one name, or folder prefix → layout. */\n layouts?: string | Record<string, string>\n /** The shell around every page's outermost layout. */\n baseLayout?: string\n}\n\n/**\n * The layout for a page that declares none. A map's longest matching folder\n * prefix wins: `{ admin: 'layouts/admin', '': 'layouts/main' }` gives\n * `admin/users` the admin layout and everything else the main one.\n */\nexport function layoutResolver(\n layouts?: string | Record<string, string>,\n): (page: string) => string | undefined {\n if (layouts === undefined) return () => undefined\n if (typeof layouts === 'string') return () => layouts\n const prefixes = Object.keys(layouts).toSorted((a, b) => b.length - a.length)\n return (page) => {\n const hit = prefixes.find((p) => p === '' || page === p || page.startsWith(`${p}/`))\n return hit === undefined ? undefined : layouts[hit]\n }\n}\n\n/** Templates that are layouts by configuration — they never get a mapped layout themselves. */\nexport function configuredLayouts(project: Project): Set<string> {\n const names = new Set<string>()\n if (typeof project.layouts === 'string') names.add(project.layouts)\n else if (project.layouts) for (const v of Object.values(project.layouts)) names.add(v)\n if (project.baseLayout) names.add(project.baseLayout)\n return names\n}\n\nconst SEGMENT = /^[A-Za-z0-9_-]+$/\n\n/** A valid template name, or `undefined`: `/`-joined segments, no `..`, no extension, no absolute path. */\nexport function templateName(name: string): string | undefined {\n if (typeof name !== 'string' || !name) return undefined\n const segments = name.split('/')\n return segments.every((s) => SEGMENT.test(s)) ? name : undefined\n}\n\n/** `components/forms/text-field` → `forms-text-field`. */\nexport function componentTag(name: string, componentsDir: string): string {\n return name\n .slice(componentsDir.length + 1)\n .split('/')\n .join('-')\n .toLowerCase()\n}\n\nexport const isComponent = (name: string, componentsDir: string): boolean =>\n name.startsWith(`${componentsDir}/`)\n","import type { CNode } from '../ast'\n\n/** Merge adjacent static output and drop empty pieces, inside blocks too. */\nexport function optimize(nodes: CNode[]): CNode[] {\n const out: CNode[] = []\n for (const n of nodes) {\n const node = deep(n)\n const last = out[out.length - 1]\n if (node.k === 's') {\n if (!node.t) continue\n if (last?.k === 's') {\n last.t += node.t\n continue\n }\n }\n out.push(node)\n }\n return out\n}\n\nfunction deep(n: CNode): CNode {\n switch (n.k) {\n case 'if':\n return { ...n, br: n.br.map((b) => ({ ...b, b: optimize(b.b) })) }\n case 'for':\n return n.em ? { ...n, b: optimize(n.b), em: optimize(n.em) } : { ...n, b: optimize(n.b) }\n case 'sw':\n return {\n ...n,\n cs: n.cs.map((c) => ({ ...c, b: optimize(c.b) })),\n ...(n.d ? { d: optimize(n.d) } : {}),\n }\n case 'cmp':\n return { ...n, f: Object.fromEntries(Object.entries(n.f).map(([k, v]) => [k, optimize(v)])) }\n case 'o':\n return { ...n, fb: optimize(n.fb) }\n case 's':\n return { ...n }\n default:\n return n\n }\n}\n","/**\n * `check`: turn a parsed template into a checked one — names resolved,\n * pipes, components, slots and layouts verified, and every interpolation's\n * context enforced (spec §4). What passes here is safe to render.\n */\nimport {\n AST_FORMAT_VERSION,\n type Attr,\n type CAttr,\n type CExpr,\n type CNode,\n type CSeg,\n type CheckedTemplate,\n type Element,\n type Expr,\n type LoopVar,\n type Node,\n type TemplateAst,\n} from '../ast'\nimport { error, warning, type Diagnostic, type Span } from '../diagnostics'\nimport { decodeEntities } from '../entities'\nimport { isUrlAttr } from '../urls'\nimport {\n componentTag,\n configuredLayouts,\n isComponent,\n layoutResolver,\n templateName,\n type Project,\n} from './project'\nimport { optimize } from './optimize'\n\nexport type { CheckedTemplate } from '../ast'\n\nexport interface CheckResult {\n template?: CheckedTemplate\n diagnostics: Diagnostic[]\n}\n\n/** SVG animation elements can set any attribute — `href` included — to these values. */\nconst ANIMATION = new Set(['animate', 'set', 'animatemotion', 'animatetransform'])\nconst ANIMATION_VALUES = new Set(['values', 'to', 'from', 'by', 'attributename'])\n\nconst JSON_SCRIPT_TYPES = new Set(['application/json', 'application/ld+json'])\nconst LOOP_VARS: ReadonlySet<string> = new Set([\n '$index',\n '$first',\n '$last',\n '$even',\n '$odd',\n '$count',\n])\n\n/** Attributes on a component tag that go to its root element instead of being inputs. */\nconst isFallthrough = (a: Attr): boolean => {\n if (a.kind === 'class' || a.kind === 'style') return true\n const n = a.name.toLowerCase()\n return (\n ['class', 'id', 'style', 'role'].includes(n) || n.startsWith('aria-') || n.startsWith('data-')\n )\n}\n\nconst camel = (name: string) => name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())\n\ntype Binding = { kind: 'slot'; s: number } | { kind: 'meta'; s: number; w?: LoopVar }\n\n/** What a caller needs to know about a component without checking it. */\ninterface Signature {\n name: string\n inputs: Map<string, { required: boolean; def?: unknown }>\n outlets: Set<string>\n roots: number\n}\n\nclass Checker {\n readonly diagnostics: Diagnostic[] = []\n slots = 0\n private readonly scopes: Array<Map<string, Binding>> = [new Map()]\n private readonly loops: number[] = []\n private readonly warned = new Set<string>()\n private readonly tags = new Map<string, string[]>()\n private readonly signatures = new Map<string, Signature>()\n\n constructor(\n private readonly project: Project,\n private readonly ast: TemplateAst,\n private readonly component: boolean,\n ) {\n for (const name of project.templates.keys()) {\n if (!isComponent(name, project.componentsDir)) continue\n const tag = componentTag(name, project.componentsDir)\n this.tags.set(tag, [...(this.tags.get(tag) ?? []), name])\n }\n }\n\n private err(span: Span, message: string): void {\n this.diagnostics.push(error(this.ast.file, span, message))\n }\n private warn(span: Span, message: string): void {\n this.diagnostics.push(warning(this.ast.file, span, message))\n }\n\n // ── scope ─────────────────────────────────────────────────────────────\n\n private slot(): number {\n return this.slots++\n }\n bind(name: string, b: Binding): void {\n this.scopes[this.scopes.length - 1]!.set(name, b)\n }\n private lookup(name: string): Binding | undefined {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const b = this.scopes[i]!.get(name)\n if (b) return b\n }\n return undefined\n }\n private scoped<T>(fn: () => T): T {\n this.scopes.push(new Map())\n try {\n return fn()\n } finally {\n this.scopes.pop()\n }\n }\n\n // ── expressions ───────────────────────────────────────────────────────\n\n /**\n * `whole` is true only for the whole expression of a text `{{ }}` — the one\n * place `raw` may appear (as its outermost pipe). Nested anywhere else, raw\n * could smuggle markup into an attribute or another context.\n */\n expr(e: Expr, where: 'text' | 'attr' | 'rcdata' | 'json' = 'text', whole = false): CExpr {\n switch (e.kind) {\n case 'literal':\n return { k: 'l', v: e.value }\n case 'unary':\n return { k: 'u', o: e.op, a: this.expr(e.arg) }\n case 'binary':\n case 'logical':\n return { k: 'b', o: e.op, l: this.expr(e.left), r: this.expr(e.right) }\n case 'conditional':\n return { k: 'c', t: this.expr(e.test), y: this.expr(e.whenTrue), n: this.expr(e.whenFalse) }\n case 'pipe': {\n if (!this.project.pipes.has(e.name)) this.err(e.span, `unknown pipe '${e.name}'`)\n if (e.name === 'raw' && !(whole && where === 'text')) {\n this.err(\n e.span,\n where === 'attr'\n ? \"raw isn't allowed in an attribute: it could break out of the quotes\"\n : where === 'text'\n ? 'raw must be the last pipe of the whole {{ }}: {{ value | raw }}'\n : `raw isn't allowed inside <${where === 'rcdata' ? 'title> or <textarea' : 'script'}>`,\n )\n }\n return { k: 'p', n: e.name, i: this.expr(e.input), a: e.args.map((a) => this.expr(a)) }\n }\n case 'path': {\n const p: CSeg[] = e.segments.map((s) => {\n const seg: CSeg = s.computed ? { e: this.expr(s.computed) } : { n: s.name! }\n if (s.optional) seg.o = 1\n return seg\n })\n if (LOOP_VARS.has(e.root)) {\n const loop = this.loops[this.loops.length - 1]\n if (loop === undefined) {\n this.err(e.span, `${e.root} is only available inside @for`)\n return { k: 'x' }\n }\n return { k: 'm', s: loop, w: e.root as LoopVar }\n }\n const b = this.lookup(e.root)\n if (b?.kind === 'meta') return { k: 'm', s: b.s, w: b.w! }\n if (b) return { k: 'v', s: b.s, p }\n if (this.component) {\n if (!this.warned.has(e.root)) {\n this.warned.add(e.root)\n this.warn(\n e.span,\n `'${e.root}' isn't an input of this component — declare it with @input ${e.root}`,\n )\n }\n return { k: 'x' }\n }\n return { k: 'd', n: e.root, p }\n }\n }\n }\n\n // ── nodes ─────────────────────────────────────────────────────────────\n\n nodes(list: Node[], parent?: Element): CNode[] {\n const out: CNode[] = []\n // Elements are walked with an explicit stack, so deeply nested markup\n // can't overflow the call stack; blocks and components still recurse.\n const stack: Array<{ list: Node[]; i: number; parent?: Element; close?: string }> = [\n { list, i: 0, parent },\n ]\n while (stack.length) {\n const f = stack[stack.length - 1]!\n if (f.i >= f.list.length) {\n stack.pop()\n if (f.close) out.push({ k: 's', t: f.close })\n continue\n }\n const n = f.list[f.i++]!\n if (n.k !== 'element') {\n this.node(n, out, f.parent)\n continue\n }\n const open = this.element(n, out)\n if (open) stack.push({ list: open.children, i: 0, parent: open, close: `</${open.tag}>` })\n }\n return out\n }\n\n private node(n: Node, out: CNode[], parent?: Element): void {\n switch (n.k) {\n case 'text':\n out.push({ k: 's', t: n.value })\n return\n case 'interp': {\n if (n.ctx === 'comment') {\n this.err(\n n.span,\n \"{{ }} isn't allowed inside an HTML comment — use {{-- --}} for a template comment\",\n )\n return\n }\n if (n.ctx === 'raw-text') {\n out.push(...this.rawText(n, parent))\n return\n }\n out.push({\n k: 'i',\n c: n.ctx === 'rcdata' ? 'rcdata' : 'text',\n e: this.expr(n.expr, n.ctx === 'rcdata' ? 'rcdata' : 'text', true),\n at: at(n.span),\n })\n return\n }\n case 'comment':\n for (const c of n.children) {\n if (c.k === 'interp') this.node(c, out)\n }\n out.push({\n k: 's',\n t: `<!--${n.children.map((c) => (c.k === 'text' ? c.value : '')).join('')}-->`,\n })\n return\n case 'element': {\n const open = this.element(n, out)\n if (open) out.push(...this.nodes(open.children, open), { k: 's', t: `</${open.tag}>` })\n return\n }\n case 'if':\n out.push({\n k: 'if',\n br: n.branches.map((b) =>\n this.scoped(() => {\n const cond = b.cond && this.expr(b.cond)\n let alias: number | undefined\n if (b.alias) {\n alias = this.slot()\n this.bind(b.alias, { kind: 'slot', s: alias })\n }\n const br: { c?: CExpr; a?: number; b: CNode[] } = { b: this.nodes(b.body, parent) }\n if (cond) br.c = cond\n if (alias !== undefined) br.a = alias\n return br\n }),\n ),\n })\n return\n case 'for': {\n const e = this.expr(n.of)\n const m = this.slot()\n let it: number | [number, number]\n const body = this.scoped(() => {\n if (typeof n.item === 'string') {\n it = this.slot()\n this.bind(n.item, { kind: 'slot', s: it })\n } else {\n it = [this.slot(), this.slot()]\n this.bind(n.item[0], { kind: 'slot', s: it[0] })\n this.bind(n.item[1], { kind: 'slot', s: it[1] })\n }\n for (const [name, w] of Object.entries(n.lets)) this.bind(name, { kind: 'meta', s: m, w })\n this.loops.push(m)\n try {\n return this.nodes(n.body, parent)\n } finally {\n this.loops.pop()\n }\n })\n const node: Extract<CNode, { k: 'for' }> = {\n k: 'for',\n e,\n it: it!,\n m,\n b: body,\n at: at(n.span),\n }\n if (n.empty) node.em = this.scoped(() => this.nodes(n.empty!, parent))\n out.push(node)\n return\n }\n case 'switch': {\n const node: CNode = {\n k: 'sw',\n e: this.expr(n.on),\n cs: n.cases.map((c) => ({\n e: this.expr(c.value),\n b: this.scoped(() => this.nodes(c.body, parent)),\n })),\n }\n if (n.default) node.d = this.scoped(() => this.nodes(n.default!, parent))\n out.push(node)\n return\n }\n case 'let': {\n const e = this.expr(n.expr)\n const s = this.slot()\n if (this.scopes[this.scopes.length - 1]!.has(n.name))\n this.err(n.span, `@let ${n.name} is declared twice here`)\n this.bind(n.name, { kind: 'slot', s })\n out.push({ k: 'let', s, e })\n return\n }\n case 'verbatim':\n out.push({ k: 's', t: n.text })\n return\n case 'slot-outlet':\n out.push({ k: 'o', n: n.name ?? '', fb: this.scoped(() => this.nodes(n.fallback, parent)) })\n return\n case 'slot-fill':\n this.err(\n n.span,\n \"@slot('…') { } goes at the top of a page with a layout, or inside a component tag\",\n )\n return\n case 'assets':\n out.push({ k: 'as', en: n.entry })\n }\n }\n\n /** `{{ }}` inside `<script>` / `<style>`: only a JSON script's single value. */\n private rawText(n: Extract<Node, { k: 'interp' }>, parent?: Element): CNode[] {\n const tag = parent?.tag.toLowerCase()\n const type = parent?.attrs.find((a) => a.name.toLowerCase() === 'type')\n const typeValue =\n type?.kind === 'static'\n ? String(type.parts?.[0] ?? '')\n .trim()\n .toLowerCase()\n : ''\n const isJson = tag === 'script' && JSON_SCRIPT_TYPES.has(typeValue)\n const only = parent?.children.filter((c) => !(c.k === 'text' && !c.value.trim())).length === 1\n if (isJson && only && n.expr.kind === 'pipe' && n.expr.name === 'json') {\n return [{ k: 'i', c: 'json', e: this.expr(n.expr, 'json'), at: at(n.span) }]\n }\n this.err(\n n.span,\n tag === 'script'\n ? '{{ }} isn\\'t allowed inside <script>: pass data as <script type=\"application/json\">{{ value | json }}</script>'\n : `{{ }} isn't allowed inside <${tag}>`,\n )\n return []\n }\n\n // ── elements and attributes ───────────────────────────────────────────\n\n /** Write an element's opening tag; returns it when its children and closing tag follow. */\n private element(el: Element, out: CNode[]): Element | undefined {\n const lower = el.tag.toLowerCase()\n if (!el.foreign && lower.includes('-')) {\n const names = this.tags.get(lower)\n if (names && names.length > 1) {\n this.err(el.span, `<${lower}> matches more than one component: ${names.join(', ')}`)\n return undefined\n }\n if (names) {\n this.call(el, names[0]!, out)\n return undefined\n }\n this.warn(\n el.span,\n `<${lower}> isn't a component (no ${this.project.componentsDir}/…/${lower}.kick) — it's output as a custom element`,\n )\n }\n const attrs = this.attrs(el)\n const dynamic = attrs.some((a) => a.t !== 's')\n if (dynamic || el === this.rootElement) {\n out.push({ k: 's', t: `<${el.tag}` })\n const node: Extract<CNode, { k: 'A' }> = { k: 'A', tag: el.tag, a: attrs, at: at(el.span) }\n if (el === this.rootElement) node.f = 1\n out.push(node)\n } else {\n out.push({\n k: 's',\n t: `<${el.tag}${attrs.map((a) => staticAttr(a as Extract<CAttr, { t: 's' }>)).join('')}`,\n })\n }\n if (el.void || (el.selfClosing && el.foreign)) {\n out.push({ k: 's', t: el.selfClosing ? ' />' : '>' })\n return undefined\n }\n out.push({ k: 's', t: '>' })\n return el\n }\n\n /** The single root element of a component, which takes fallthrough attributes. */\n rootElement?: Element\n\n private attrs(el: Element): CAttr[] {\n const tag = el.tag\n const out: CAttr[] = []\n const httpEquiv = el.attrs.find((a) => a.name.toLowerCase() === 'http-equiv')\n const refresh =\n tag.toLowerCase() === 'meta' &&\n httpEquiv?.kind === 'static' &&\n String(httpEquiv.parts?.[0]).trim().toLowerCase() === 'refresh'\n for (const a of el.attrs) {\n const lower = a.name.toLowerCase()\n const dynamic = a.kind !== 'static' && a.kind !== 'bare'\n if (dynamic && a.kind !== 'class' && a.kind !== 'style') {\n if (lower.startsWith('on')) {\n this.err(\n a.span,\n `${a.name} can't be interpolated: event handler attributes run their value as script`,\n )\n continue\n }\n if (lower === 'srcdoc') {\n this.err(a.span, \"srcdoc can't be interpolated: its value is a whole HTML document\")\n continue\n }\n if (lower === 'style') {\n this.err(\n a.span,\n 'style can\\'t be interpolated — bind one property with [style.prop]=\"value\"',\n )\n continue\n }\n if (lower === 'class' && a.kind === 'interp') {\n this.err(\n a.span,\n 'class can\\'t be interpolated — add classes with [class.name]=\"condition\"',\n )\n continue\n }\n if (ANIMATION.has(tag.toLowerCase()) && ANIMATION_VALUES.has(lower)) {\n this.err(\n a.span,\n `${a.name} can't be interpolated on <${tag}>: an animation can set href to a javascript: URL`,\n )\n continue\n }\n if (refresh && lower === 'content') {\n this.err(\n a.span,\n \"a refresh <meta>'s content can't be interpolated: it holds a URL to navigate to\",\n )\n continue\n }\n }\n const url = isUrlAttr(tag, a.name) ? (lower === 'srcset' ? 'srcset' : 'url') : undefined\n // A binding whose expression didn't parse: the parser already reported it.\n if ((a.kind === 'bind' || a.kind === 'class' || a.kind === 'style') && !a.expr) continue\n switch (a.kind) {\n case 'bare':\n out.push({ t: 's', n: a.name, v: true })\n break\n case 'static':\n out.push({ t: 's', n: a.name, v: String(a.parts?.[0] ?? '') })\n break\n case 'interp': {\n const node: CAttr = {\n t: 'i',\n n: a.name,\n p: a.parts!.map((p) => (typeof p === 'string' ? p : this.expr(p, 'attr'))),\n }\n if (url) node.u = url\n out.push(node)\n break\n }\n case 'bind': {\n const node: CAttr = { t: 'b', n: a.name, e: this.expr(a.expr!, 'attr') }\n if (url) node.u = url\n out.push(node)\n break\n }\n case 'class':\n out.push({ t: 'c', n: a.name, e: this.expr(a.expr!, 'attr') })\n break\n case 'style': {\n const node: CAttr = { t: 'y', n: a.name, e: this.expr(a.expr!, 'attr') }\n if (a.unit) node.x = a.unit\n out.push(node)\n break\n }\n }\n }\n return out\n }\n\n // ── components ────────────────────────────────────────────────────────\n\n signature(name: string): Signature {\n const cached = this.signatures.get(name)\n if (cached) return cached\n const ast = this.project.templates.get(name)!\n const outlets = new Set<string>()\n const stack: Node[][] = [ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'slot-outlet') {\n outlets.add(n.name ?? '')\n stack.push(n.fallback)\n } else if (n.k === 'element' || n.k === 'comment') stack.push(n.children)\n else if (n.k === 'if') for (const b of n.branches) stack.push(b.body)\n else if (n.k === 'for') stack.push(n.body, n.empty ?? [])\n else if (n.k === 'switch') stack.push(...n.cases.map((c) => c.body), n.default ?? [])\n else if (n.k === 'slot-fill') stack.push(n.body)\n }\n }\n const sig: Signature = {\n name,\n inputs: new Map(\n ast.inputs.map((i) => [i.name, { required: !i.default, def: i.default?.value }]),\n ),\n outlets,\n roots: rootElements(ast.body).length,\n }\n this.signatures.set(name, sig)\n return sig\n }\n\n private call(el: Element, name: string, out: CNode[]): void {\n const sig = this.signature(name)\n const target = this.project.templates.get(name)!\n const slotOf = new Map<string, number>()\n target.inputs.forEach((i, idx) => slotOf.set(i.name, idx))\n const inputs: Array<{ s: number; e: CExpr }> = []\n const given = new Set<string>()\n const fallthrough: Attr[] = []\n for (const a of el.attrs) {\n if (isFallthrough(a)) {\n fallthrough.push(a)\n continue\n }\n const input = sig.inputs.has(a.name) ? a.name : camel(a.name)\n if (!sig.inputs.has(input)) {\n this.err(\n a.span,\n `unknown input '${a.name}' on <${el.tag}> — its inputs are ${[...sig.inputs.keys()].join(', ') || 'none'}`,\n )\n continue\n }\n if (a.kind === 'bind' && !a.expr) continue\n given.add(input)\n let e: CExpr\n if (a.kind === 'bind') e = this.expr(a.expr!)\n else if (a.kind === 'bare') e = { k: 'l', v: true }\n else if (a.kind === 'static') {\n const v = String(a.parts?.[0] ?? '')\n if (typeof sig.inputs.get(input)!.def === 'boolean' && (v === 'true' || v === 'false')) {\n this.warn(\n a.span,\n `${a.name}=\"${v}\" passes the string \"${v}\", which is truthy — write [${a.name}]=\"${v}\"`,\n )\n }\n // Text passed to an input is data: entities decoded here, the value\n // escaped wherever it's printed.\n e = { k: 'l', v: decodeEntities(v) }\n } else if (a.kind === 'interp') {\n e = a.parts!.reduce<CExpr>(\n (acc, p) => ({\n k: 'b',\n o: '+',\n l: acc,\n r: typeof p === 'string' ? { k: 'l', v: decodeEntities(p) } : this.expr(p),\n }),\n { k: 'l', v: '' },\n )\n } else {\n this.err(a.span, `[${a.kind}.${a.name}] goes on the component's root element, not an input`)\n continue\n }\n inputs.push({ s: slotOf.get(input)!, e })\n }\n for (const [input, info] of sig.inputs) {\n if (info.required && !given.has(input))\n this.err(el.span, `missing input '${input}' on <${el.tag}>`)\n }\n if (fallthrough.length && sig.roots !== 1) {\n this.err(\n fallthrough[0]!.span,\n `<${el.tag}> passes ${fallthrough.map((a) => a.name).join(', ')} to its root element, but ${name}.kick needs exactly one root element for that`,\n )\n }\n // Slot content: `@slot('x') { }` fills, the rest is the default slot. It\n // is compiled here, in the caller's scope.\n const fills: Record<string, CNode[]> = {}\n const rest: Node[] = []\n for (const c of el.children) {\n if (c.k !== 'slot-fill') {\n rest.push(c)\n continue\n }\n if (c.name in fills) this.err(c.span, `slot '${c.name}' is filled twice`)\n else if (!sig.outlets.has(c.name)) this.err(c.span, `<${el.tag}> has no slot '${c.name}'`)\n fills[c.name] = this.scoped(() => this.nodes(c.body))\n }\n if (rest.some((c) => !(c.k === 'text' && !c.value.trim()))) {\n if (!sig.outlets.has('')) {\n this.err(el.span, `<${el.tag}> has no default <slot /> for the content inside it`)\n } else {\n fills[''] = this.scoped(() => this.nodes(rest))\n }\n }\n const fa = this.attrs({ ...el, attrs: fallthrough })\n out.push({ k: 'cmp', n: name, in: inputs, fa, f: fills, at: at(el.span) })\n }\n\n // ── layouts ───────────────────────────────────────────────────────────\n\n /** The outlets a page can fill: its layout chain's. Reports bad names and cycles. */\n layoutChain(start: string | undefined, span: Span, page: string): Set<string> | undefined {\n const outlets = new Set<string>()\n const seen = [page]\n let name = start\n while (name) {\n if (!templateName(name)) {\n this.err(span, `'${name}' isn't a valid template name`)\n return undefined\n }\n if (seen.includes(name)) {\n this.err(span, `layout cycle: ${[...seen, name].join(' → ')}`)\n return undefined\n }\n const ast = this.project.templates.get(name)\n if (!ast) {\n this.err(span, `layout '${name}' not found`)\n return undefined\n }\n seen.push(name)\n for (const o of this.signature(name).outlets) outlets.add(o)\n name = ast.layout ?? undefined\n }\n return outlets\n }\n}\n\n/** Top-level elements, or -1 per other non-whitespace output (text, blocks). */\nfunction rootElements(body: Node[]): Array<Element | null> {\n const roots: Array<Element | null> = []\n for (const n of body) {\n if (n.k === 'text' && !n.value.trim()) continue\n if (n.k === 'comment' || n.k === 'let') continue\n roots.push(n.k === 'element' ? n : null)\n }\n return roots\n}\n\n/** An attribute as the author wrote it (entities kept), double-quoted. */\nfunction staticAttr(a: Extract<CAttr, { t: 's' }>): string {\n return a.v === true ? ` ${a.n}` : ` ${a.n}=\"${a.v.replace(/\"/g, '"')}\"`\n}\n\nconst at = (span: Span): [number, number] => [span.start.line, span.start.column]\n\nconst zero: Span = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: 0, line: 1, column: 1 },\n}\n\n/** Check one template of `project` by name. */\nexport function check(name: string, project: Project): CheckResult {\n const ast = project.templates.get(name)\n if (!ast || !templateName(name)) {\n return { diagnostics: [error(`${name}.kick`, zero, `template '${name}' not found`)] }\n }\n const component = isComponent(name, project.componentsDir)\n const c = new Checker(project, ast, component)\n\n if (!component && ast.inputs.length) {\n for (const i of ast.inputs)\n c.diagnostics.push(error(ast.file, i.span, 'only components declare @input'))\n }\n const inputs = ast.inputs.map((i, idx) => {\n const s = idx\n const entry: CheckedTemplate['inputs'][number] = { n: i.name, s, r: !i.default }\n if (i.default) entry.d = i.default.value\n return entry\n })\n // Input slots come first, in declaration order.\n c.slots = inputs.length\n for (const i of inputs) c.bind(i.n, { kind: 'slot', s: i.s })\n\n if (component) {\n const roots = rootElements(ast.body)\n if (roots.length === 1 && roots[0]) c.rootElement = roots[0]\n }\n\n // A page's top-level `@slot` blocks fill its layout's outlets.\n const fills: Record<string, CNode[]> = {}\n const body: Node[] = []\n const fillNodes: Array<Extract<Node, { k: 'slot-fill' }>> = []\n for (const n of ast.body) {\n if (n.k === 'slot-fill' && !component) fillNodes.push(n)\n else body.push(n)\n }\n\n const base = project.baseLayout\n if (base !== undefined && !project.templates.has(base)) {\n c.diagnostics.push(error(ast.file, zero, `base layout '${base}' not found`))\n }\n // A page's own @layout wins; otherwise the configured mapping applies —\n // to pages, not to components or to templates configured as layouts.\n const mapped =\n component || configuredLayouts(project).has(name)\n ? undefined\n : layoutResolver(project.layouts)(name)\n const layoutName = ast.layout === undefined ? mapped : (ast.layout ?? undefined)\n let outlets =\n layoutName === undefined ? undefined : c.layoutChain(layoutName, ast.layoutSpan ?? zero, name)\n // The base layout wraps the chain, so its outlets are fillable too.\n if (\n base !== undefined &&\n ast.layout !== null &&\n !component &&\n name !== base &&\n project.templates.has(base)\n ) {\n outlets = new Set([...(outlets ?? []), ...c.signature(base).outlets])\n }\n\n for (const f of fillNodes) {\n if (f.name in fills) {\n c.diagnostics.push(error(ast.file, f.span, `slot '${f.name}' is filled twice`))\n continue\n }\n if (!outlets) {\n // No layout is known here — a build that doesn't have the app's\n // mapping, say. Kept, and filled if the page gets a layout with it.\n c.diagnostics.push(warning(ast.file, f.span, `@slot('${f.name}') has no layout to fill here`))\n fills[f.name] = optimize(c.nodes(f.body))\n continue\n }\n if (!outlets.has(f.name)) {\n c.diagnostics.push(error(ast.file, f.span, `the layout has no slot '${f.name}'`))\n continue\n }\n fills[f.name] = optimize(c.nodes(f.body))\n }\n\n const template: CheckedTemplate = {\n v: AST_FORMAT_VERSION,\n name,\n file: ast.file,\n slots: 0,\n inputs,\n fills,\n body: optimize(c.nodes(body)),\n }\n template.slots = c.slots\n if (ast.layout !== undefined) template.layout = ast.layout\n const failed = c.diagnostics.some((d) => d.severity === 'error')\n return failed ? { diagnostics: c.diagnostics } : { template, diagnostics: c.diagnostics }\n}\n","/**\n * The template expression language: property paths, literals, comparisons,\n * logic, `??`, the ternary and pipes. Nothing that calls, assigns or\n * constructs — a template reads data, the controller computes it.\n */\nimport type { Expr, PathSegment } from '../ast'\nimport { advance, error, type Diagnostic, type Pos, type Span } from '../diagnostics'\n\nexport type { Expr } from '../ast'\n\n/** Property names a template never reads, even through `[...]` (checked at runtime). */\nexport const FORBIDDEN_NAMES: ReadonlySet<string> = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n])\n\nconst KEYWORDS: Record<string, string> = {\n new: 'constructing objects',\n typeof: '`typeof`',\n instanceof: '`instanceof`',\n in: '`in`',\n delete: '`delete`',\n void: '`void`',\n function: 'functions',\n class: 'classes',\n await: '`await`',\n yield: '`yield`',\n this: '`this`',\n}\n\n/** Characters and operators the language has no place for, with why. */\nconst FORBIDDEN_PUNCT: Record<string, string> = {\n '(': 'calls',\n '=': 'assignment',\n '=>': 'functions',\n '*': '`*`',\n '/': '`/`',\n '%': '`%`',\n '`': 'template literals',\n '{': 'object literals',\n '}': '`}`',\n '...': 'spread',\n ';': '`;`',\n ',': '`,`',\n '&': '`&`',\n '^': '`^`',\n '~': '`~`',\n}\n\n// Longest first, so `===` wins over `==` over `=`.\nconst PUNCT = [\n '===',\n '!==',\n '...',\n '?.',\n '??',\n '==',\n '!=',\n '<=',\n '>=',\n '&&',\n '||',\n '=>',\n '?',\n ':',\n '|',\n '!',\n '<',\n '>',\n '+',\n '-',\n '.',\n '[',\n ']',\n '(',\n ')',\n '=',\n '*',\n '/',\n '%',\n '`',\n '{',\n '}',\n ';',\n ',',\n '&',\n '^',\n '~',\n]\n\ntype Token =\n | { t: 'ident'; v: string; start: number; end: number }\n | { t: 'num'; v: number; start: number; end: number }\n | { t: 'str'; v: string; start: number; end: number }\n | { t: 'punct'; v: string; start: number; end: number }\n | { t: 'eof'; v: ''; start: number; end: number }\n\nclass Fail extends Error {\n constructor(\n readonly start: number,\n readonly end: number,\n message: string,\n ) {\n super(message)\n }\n}\n\nconst ESCAPES: Record<string, string> = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\"': '\"',\n n: '\\n',\n t: '\\t',\n r: '\\r',\n}\n\nfunction tokenize(src: string): Token[] {\n const out: Token[] = []\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n if (/\\s/.test(c)) {\n i++\n continue\n }\n const start = i\n if (/[A-Za-z_$]/.test(c)) {\n while (i < src.length && /[\\w$]/.test(src[i]!)) i++\n out.push({ t: 'ident', v: src.slice(start, i), start, end: i })\n continue\n }\n if (/\\d/.test(c)) {\n while (i < src.length && /\\d/.test(src[i]!)) i++\n if (src[i] === '.' && /\\d/.test(src[i + 1] ?? '')) {\n i++\n while (i < src.length && /\\d/.test(src[i]!)) i++\n }\n out.push({ t: 'num', v: Number(src.slice(start, i)), start, end: i })\n continue\n }\n if (c === \"'\" || c === '\"') {\n let v = ''\n i++\n while (i < src.length && src[i] !== c) {\n if (src[i] === '\\\\') {\n const e = src[i + 1] ?? ''\n if (e === 'u') {\n const hex = src.slice(i + 2, i + 6)\n if (!/^[0-9a-fA-F]{4}$/.test(hex))\n throw new Fail(i, i + 2, 'a \\\\u escape needs four hex digits')\n v += String.fromCharCode(parseInt(hex, 16))\n i += 6\n continue\n }\n if (!(e in ESCAPES)) throw new Fail(i, i + 2, `unknown escape \\\\${e}`)\n v += ESCAPES[e]\n i += 2\n continue\n }\n v += src[i]\n i++\n }\n if (i >= src.length) throw new Fail(start, i, 'unterminated string')\n i++\n out.push({ t: 'str', v, start, end: i })\n continue\n }\n const p = PUNCT.find((op) => src.startsWith(op, i))\n if (!p) throw new Fail(i, i + 1, `unexpected character '${c}'`)\n i += p.length\n out.push({ t: 'punct', v: p, start, end: i })\n }\n out.push({ t: 'eof', v: '', start: src.length, end: src.length })\n return out\n}\n\n// Binding powers, lowest first (spec §3): pipe, ternary, ??, ||, &&, equality,\n// relational, additive, unary, member.\nconst BP = { pipe: 1, ternary: 2, nullish: 3, or: 4, and: 5, eq: 6, rel: 7, add: 8, unary: 9 }\n\nconst BINARY: Record<string, [number, Expr['kind']]> = {\n '??': [BP.nullish, 'logical'],\n '||': [BP.or, 'logical'],\n '&&': [BP.and, 'logical'],\n '==': [BP.eq, 'binary'],\n '!=': [BP.eq, 'binary'],\n '===': [BP.eq, 'binary'],\n '!==': [BP.eq, 'binary'],\n '<': [BP.rel, 'binary'],\n '>': [BP.rel, 'binary'],\n '<=': [BP.rel, 'binary'],\n '>=': [BP.rel, 'binary'],\n '+': [BP.add, 'binary'],\n '-': [BP.add, 'binary'],\n}\n\nclass Parser {\n private i = 0\n constructor(\n private readonly src: string,\n private readonly base: Pos,\n private readonly tokens: Token[],\n ) {}\n\n private peek(): Token {\n return this.tokens[this.i]!\n }\n private next(): Token {\n return this.tokens[this.i++]!\n }\n private span(start: number, end: number): Span {\n return { start: advance(this.base, this.src, start), end: advance(this.base, this.src, end) }\n }\n private isPunct(v: string): boolean {\n const t = this.peek()\n return t.t === 'punct' && t.v === v\n }\n private expect(v: string): Token {\n const t = this.peek()\n if (t.t !== 'punct' || t.v !== v) {\n throw new Fail(\n t.start,\n t.end,\n t.t === 'eof' ? `expected '${v}'` : `expected '${v}', found '${this.text(t)}'`,\n )\n }\n return this.next()\n }\n private text(t: Token): string {\n return this.src.slice(t.start, t.end)\n }\n private forbidden(t: Token): never {\n const what = t.t === 'punct' ? FORBIDDEN_PUNCT[t.v] : KEYWORDS[t.v]\n throw new Fail(t.start, t.end, `${what ?? `'${this.text(t)}'`} aren't allowed in templates`)\n }\n\n parseAll(): Expr {\n const e = this.expr(0)\n const t = this.peek()\n if (t.t !== 'eof') {\n if (\n (t.t === 'punct' && Object.hasOwn(FORBIDDEN_PUNCT, t.v)) ||\n (t.t === 'ident' && Object.hasOwn(KEYWORDS, t.v))\n ) {\n this.forbidden(t)\n }\n throw new Fail(t.start, t.end, `unexpected '${this.text(t)}'`)\n }\n return e\n }\n\n private expr(min: number): Expr {\n let left = this.prefix()\n for (;;) {\n const t = this.peek()\n if (t.t === 'ident' && (t.v === 'in' || t.v === 'instanceof')) this.forbidden(t)\n if (t.t !== 'punct') break\n if (t.v === '|') {\n if (min > BP.pipe) break\n this.next()\n const name = this.next()\n if (name.t !== 'ident') throw new Fail(name.start, name.end, 'expected a pipe name after |')\n const args: Expr[] = []\n while (this.isPunct(':')) {\n this.next()\n args.push(this.expr(BP.nullish))\n if (this.isPunct('?')) {\n const q = this.peek()\n throw new Fail(q.start, q.end, 'wrap a conditional pipe argument in parentheses')\n }\n }\n left = { kind: 'pipe', input: left, name: name.v, args, span: this.join(left, name.end) }\n continue\n }\n if (t.v === '?') {\n if (min > BP.ternary) break\n this.next()\n const whenTrue = this.expr(BP.ternary)\n this.expect(':')\n const whenFalse = this.expr(BP.ternary)\n left = {\n kind: 'conditional',\n test: left,\n whenTrue,\n whenFalse,\n span: this.joinExpr(left, whenFalse),\n }\n continue\n }\n const bin = BINARY[t.v]\n if (bin) {\n const [bp, kind] = bin\n if (bp < min) break\n this.next()\n const right = this.expr(bp + 1)\n left = { kind, op: t.v, left, right, span: this.joinExpr(left, right) } as Expr\n continue\n }\n if (Object.hasOwn(FORBIDDEN_PUNCT, t.v)) this.forbidden(t)\n break\n }\n return left\n }\n\n private join(left: Expr, end: number): Span {\n return { start: left.span.start, end: advance(this.base, this.src, end) }\n }\n private joinExpr(left: Expr, right: Expr): Span {\n return { start: left.span.start, end: right.span.end }\n }\n\n private prefix(): Expr {\n const t = this.next()\n switch (t.t) {\n case 'num':\n return { kind: 'literal', value: t.v, span: this.span(t.start, t.end) }\n case 'str':\n return { kind: 'literal', value: t.v, span: this.span(t.start, t.end) }\n case 'ident': {\n if (Object.hasOwn(KEYWORDS, t.v)) this.forbidden(t)\n if (t.v === 'true' || t.v === 'false') {\n return { kind: 'literal', value: t.v === 'true', span: this.span(t.start, t.end) }\n }\n if (t.v === 'null') return { kind: 'literal', value: null, span: this.span(t.start, t.end) }\n if (FORBIDDEN_NAMES.has(t.v))\n throw new Fail(t.start, t.end, `'${t.v}' is not allowed in templates`)\n return this.path(t)\n }\n case 'punct': {\n if (t.v === '!' || t.v === '-') {\n const arg = this.expr(BP.unary)\n return {\n kind: 'unary',\n op: t.v,\n arg,\n span: { start: this.span(t.start, t.end).start, end: arg.span.end },\n }\n }\n if (t.v === '(') {\n const e = this.expr(0)\n this.expect(')')\n if (this.isPunct('.') || this.isPunct('[') || this.isPunct('?.')) {\n const m = this.peek()\n throw new Fail(\n m.start,\n m.end,\n 'property access needs a name in front: (…).x is not allowed',\n )\n }\n return e\n }\n if (t.v === '[')\n throw new Fail(t.start, t.end, \"array literals aren't allowed in templates\")\n if (Object.hasOwn(FORBIDDEN_PUNCT, t.v)) this.forbidden(t)\n throw new Fail(t.start, t.end, `unexpected '${t.v}'`)\n }\n case 'eof':\n throw new Fail(t.start, t.end, 'expected an expression')\n }\n }\n\n private path(root: Token & { t: 'ident' }): Expr {\n const segments: PathSegment[] = []\n let end = root.end\n for (;;) {\n const t = this.peek()\n if (t.t !== 'punct') break\n if (t.v === '.' || t.v === '?.') {\n this.next()\n const optional = t.v === '?.'\n if (optional && this.isPunct('[')) {\n this.next()\n const computed = this.expr(0)\n end = this.expect(']').end\n segments.push({ computed, optional })\n continue\n }\n if (optional && this.isPunct('(')) this.forbidden(this.peek())\n const name = this.next()\n if (name.t !== 'ident') throw new Fail(name.start, name.end, 'expected a property name')\n if (FORBIDDEN_NAMES.has(name.v)) {\n throw new Fail(name.start, name.end, `'${name.v}' is not allowed in templates`)\n }\n segments.push({ name: name.v, optional })\n end = name.end\n continue\n }\n if (t.v === '[') {\n this.next()\n const computed = this.expr(0)\n end = this.expect(']').end\n segments.push({ computed, optional: false })\n continue\n }\n if (t.v === '(') this.forbidden(t)\n break\n }\n return { kind: 'path', root: root.v, segments, span: this.span(root.start, end) }\n }\n}\n\n/**\n * Parse one expression. `base` is where `src` starts in the template, so\n * positions in diagnostics and spans point into the template file.\n */\nexport function parseExpression(\n src: string,\n file: string,\n base: Pos,\n): { expr?: Expr; diagnostics: Diagnostic[] } {\n try {\n const tokens = tokenize(src)\n return { expr: new Parser(src, base, tokens).parseAll(), diagnostics: [] }\n } catch (err) {\n if (!(err instanceof Fail)) throw err\n const span = { start: advance(base, src, err.start), end: advance(base, src, err.end) }\n return { diagnostics: [error(file, span, err.message)] }\n }\n}\n","/**\n * The `.kick` template parser: HTML-aware, because where a value lands\n * decides how it is escaped (spec §2). One pass over the source, with a stack\n * of open elements and blocks.\n */\nimport type {\n Attr,\n Ctx,\n Element,\n Expr,\n IfBranch,\n InputDecl,\n LoopVar,\n Node,\n TemplateAst,\n} from '../ast'\nimport { error, warning, type Diagnostic, type Pos, type Span } from '../diagnostics'\nimport { parseExpression } from './expression'\n\nexport type { Attr, Element, Node, TemplateAst } from '../ast'\n\nexport interface ParseResult {\n ast: TemplateAst\n diagnostics: Diagnostic[]\n}\n\nconst VOID = new Set(\n 'area base br col embed hr img input link meta param source track wbr'.split(' '),\n)\nconst RAW_TEXT = new Set(['script', 'style'])\nconst RCDATA = new Set(['title', 'textarea'])\n/**\n * Inside SVG and MathML, these elements' children follow HTML rules again\n * (HTML integration points), so `<textarea>` under `<foreignObject>` is RCDATA.\n */\nconst INTEGRATION_POINTS = new Set(['foreignobject', 'desc', 'title', 'annotation-xml'])\nconst KEYWORDS =\n /^@(if|else|for|empty|switch|case|default|let|layout|input|slot|verbatim|assets)(?![\\w$-])/\nconst LOOP_VARS = new Set<LoopVar>(['$index', '$first', '$last', '$even', '$odd', '$count'])\n\ntype Frame =\n | { type: 'root'; children: Node[] }\n | { type: 'element'; el: Element; children: Node[]; name: string }\n | { type: 'slot'; children: Node[] }\n | {\n type: 'block'\n children: Node[]\n /** What may follow its closing brace. */\n next?: 'else' | 'empty'\n node: Node\n keyword: string\n start: number\n }\n | { type: 'switch'; node: Extract<Node, { k: 'switch' }>; start: number }\n\nclass Fatal extends Error {}\n\nclass TemplateParser {\n private i = 0\n private text = ''\n private textStart = 0\n private seenOutput = false\n private readonly lineStarts: number[] = [0]\n readonly diagnostics: Diagnostic[] = []\n readonly ast: TemplateAst\n private readonly frames: Frame[]\n\n constructor(\n private readonly s: string,\n private readonly file: string,\n ) {\n for (let j = 0; j < s.length; j++) {\n const c = s.charCodeAt(j)\n if (c === 10 || (c === 13 && s.charCodeAt(j + 1) !== 10)) this.lineStarts.push(j + 1)\n }\n this.ast = { file, inputs: [], body: [] }\n this.frames = [{ type: 'root', children: this.ast.body }]\n }\n\n // ── positions and diagnostics ─────────────────────────────────────────\n\n pos(offset: number): Pos {\n let lo = 0\n let hi = this.lineStarts.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (this.lineStarts[mid]! <= offset) lo = mid\n else hi = mid - 1\n }\n return { offset, line: lo + 1, column: offset - this.lineStarts[lo]! + 1 }\n }\n private span(start: number, end: number): Span {\n return { start: this.pos(start), end: this.pos(end) }\n }\n private err(start: number, end: number, message: string): void {\n this.diagnostics.push(error(this.file, this.span(start, end), message))\n }\n private warn(start: number, end: number, message: string): void {\n this.diagnostics.push(warning(this.file, this.span(start, end), message))\n }\n private fatal(start: number, end: number, message: string): never {\n this.err(start, end, message)\n throw new Fatal()\n }\n\n private expr(src: string, start: number): Expr | undefined {\n const r = parseExpression(src, this.file, this.pos(start))\n this.diagnostics.push(...r.diagnostics)\n return r.expr\n }\n\n // ── output ────────────────────────────────────────────────────────────\n\n private get top(): Frame {\n return this.frames[this.frames.length - 1]!\n }\n private children(): Node[] {\n const f = this.top\n if (f.type === 'switch') return []\n return f.children\n }\n private flush(): void {\n if (this.text) {\n if (/\\S/.test(this.text)) this.seenOutput = true\n this.children().push({ k: 'text', value: this.text, span: this.span(this.textStart, this.i) })\n this.text = ''\n }\n }\n private emit(node: Node): void {\n this.flush()\n if (node.k !== 'let' && node.k !== 'slot-fill') this.seenOutput = true\n this.children().push(node)\n }\n private addText(chunk: string, at: number): void {\n if (!this.text) this.textStart = at\n this.text += chunk\n }\n\n private inPre(): boolean {\n return this.frames.some((f) => f.type === 'element' && f.name === 'pre')\n }\n\n /**\n * A block token alone on its line (only spaces or tabs around it) is\n * removed with its line break, so the output has no blank lines where the\n * template had `@if (…) {` and `}`. Returns where parsing continues.\n */\n private standalone(tokenStart: number, tokenEnd: number): number {\n if (this.inPre()) return tokenEnd\n let a = tokenStart\n while (a > 0 && (this.s[a - 1] === ' ' || this.s[a - 1] === '\\t')) a--\n if (a > 0 && this.s[a - 1] !== '\\n' && this.s[a - 1] !== '\\r') return tokenEnd\n let b = tokenEnd\n while (b < this.s.length && (this.s[b] === ' ' || this.s[b] === '\\t')) b++\n if (b < this.s.length && this.s[b] !== '\\n' && this.s[b] !== '\\r') return tokenEnd\n const lead = tokenStart - a\n if (lead && this.text.endsWith(this.s.slice(a, tokenStart))) {\n this.text = this.text.slice(0, -lead)\n }\n if (this.s[b] === '\\r') b++\n if (this.s[b] === '\\n') b++\n return b\n }\n\n // ── main loop ─────────────────────────────────────────────────────────\n\n run(): void {\n try {\n while (this.i < this.s.length) {\n if (this.top.type === 'switch') this.switchBody()\n else this.step()\n }\n this.flush()\n for (const f of this.frames) {\n if (f.type === 'block' || f.type === 'switch') {\n this.err(\n f.start,\n f.start + 1,\n `@${f.type === 'block' ? f.keyword : 'switch'} is never closed — expected }`,\n )\n }\n }\n } catch (e) {\n if (!(e instanceof Fatal)) throw e\n }\n }\n\n private step(): void {\n const s = this.s\n const i = this.i\n const c = s[i]!\n if (c === '{' && s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n if (end < 0) this.fatal(i, i + 4, 'template comment is never closed — expected --}}')\n this.i = end + 4\n return\n }\n if (c === '{' && s[i + 1] === '{') {\n this.interp(i, 'text')\n return\n }\n if (c === '<') {\n if (s.startsWith('<!--', i)) return this.htmlComment(i)\n if (s[i + 1] === '/' && /[A-Za-z]/.test(s[i + 2] ?? '')) return this.closeTag(i)\n if (/[A-Za-z]/.test(s[i + 1] ?? '')) return this.openTag(i)\n if (s[i + 1] === '{') this.fatal(i, i + 2, \"tag names can't be interpolated\")\n }\n if (c === '@') {\n const m = KEYWORDS.exec(s.slice(i, i + 12))\n if (m && this.block(m[1]!, i)) return\n }\n if (c === '}' && this.frames.some((f) => f.type === 'block')) {\n this.closeBlock(i)\n return\n }\n this.addText(c, i)\n this.i++\n }\n\n // ── interpolation ─────────────────────────────────────────────────────\n\n /** `{{ expr }}` at `i`; returns the end offset. */\n private interpSource(i: number): { src: string; at: number; end: number } {\n const at = i + 2\n let j = at\n let quote = ''\n while (j < this.s.length) {\n const ch = this.s[j]!\n if (quote) {\n if (ch === '\\\\') j++\n else if (ch === quote) quote = ''\n } else if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === '}' && this.s[j + 1] === '}') {\n return { src: this.s.slice(at, j), at, end: j + 2 }\n }\n j++\n }\n this.fatal(i, i + 2, 'interpolation is never closed — expected }}')\n }\n\n private interp(i: number, ctx: Ctx): void {\n const { src, at, end } = this.interpSource(i)\n const expr = this.expr(src, at)\n if (expr) this.emit({ k: 'interp', expr, ctx, span: this.span(i, end) })\n this.i = end\n }\n\n /** Text with `{{ }}` (raw text, rcdata, comments) up to `stop`. */\n private textWithInterps(from: number, stop: number, ctx: Ctx): Node[] {\n const out: Node[] = []\n let j = from\n let start = from\n while (j < stop) {\n if (this.s.startsWith('{{--', j)) {\n if (j > start)\n out.push({ k: 'text', value: this.s.slice(start, j), span: this.span(start, j) })\n const end = this.s.indexOf('--}}', j + 4)\n j = start = end < 0 || end > stop ? stop : end + 4\n continue\n }\n if (this.s.startsWith('{{', j)) {\n if (j > start)\n out.push({ k: 'text', value: this.s.slice(start, j), span: this.span(start, j) })\n const { src, at, end } = this.interpSource(j)\n const expr = this.expr(src, at)\n if (expr) out.push({ k: 'interp', expr, ctx, span: this.span(j, end) })\n j = start = end\n continue\n }\n j++\n }\n if (stop > start)\n out.push({ k: 'text', value: this.s.slice(start, stop), span: this.span(start, stop) })\n return out\n }\n\n private htmlComment(i: number): void {\n const end = this.s.indexOf('-->', i + 4)\n if (end < 0) this.fatal(i, i + 4, 'HTML comment is never closed — expected -->')\n this.emit({\n k: 'comment',\n children: this.textWithInterps(i + 4, end, 'comment'),\n span: this.span(i, end + 3),\n })\n this.i = end + 3\n }\n\n // ── tags ──────────────────────────────────────────────────────────────\n\n private openTag(i: number): void {\n const s = this.s\n const m = /^<([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 200))!\n const tag = m[1]!\n let j = i + m[0].length\n const parent = this.frames.findLast((f) => f.type === 'element') as\n | Extract<Frame, { type: 'element' }>\n | undefined\n const lower = tag.toLowerCase()\n const inForeign = !!parent?.el.foreign && !INTEGRATION_POINTS.has(parent.el.tag.toLowerCase())\n const foreign = inForeign || lower === 'svg' || lower === 'math'\n const attrs: Attr[] = []\n let selfClosing = false\n for (;;) {\n while (j < s.length && /\\s/.test(s[j]!)) j++\n if (j >= s.length) this.fatal(i, i + m[0].length, `<${tag}> is never closed — expected >`)\n if (s[j] === '>') {\n j++\n break\n }\n if (s[j] === '/' && s[j + 1] === '>') {\n selfClosing = true\n j += 2\n break\n }\n j = this.attr(j, attrs)\n }\n this.i = j\n const name = foreign ? tag : lower\n const el: Element = {\n k: 'element',\n tag,\n attrs,\n children: [],\n foreign,\n void: !foreign && VOID.has(lower),\n selfClosing,\n span: this.span(i, j),\n }\n if (!foreign && lower === 'slot') {\n const nameAttr = attrs.find((a) => a.name === 'name')\n const slotName = nameAttr?.kind === 'static' ? String(nameAttr.parts?.[0] ?? '') : undefined\n if (nameAttr && nameAttr.kind !== 'static') {\n this.err(\n nameAttr.span.start.offset,\n nameAttr.span.end.offset,\n 'a slot name must be plain text',\n )\n }\n const node: Node = { k: 'slot-outlet', name: slotName, fallback: [], span: el.span }\n this.emit(node)\n if (!selfClosing) this.frames.push({ type: 'slot', children: node.fallback })\n return\n }\n this.emit(el)\n if (el.void || selfClosing) return\n // `<script>` and `<style>` are raw text everywhere: a browser runs an SVG\n // `<script>` too, and HTML-escaping means nothing inside one.\n if (RAW_TEXT.has(lower) || (!foreign && RCDATA.has(lower))) {\n // Where a browser ends it: `</script` followed by whitespace, `/` or `>`\n // — `</scriptx` doesn't.\n const end = new RegExp(`</${lower}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i')\n end.lastIndex = 0\n const found = end.exec(s.slice(j))\n const close = found ? j + found.index : -1\n const stop = close < 0 ? s.length : close\n if (RAW_TEXT.has(lower)) {\n // Content a browser reads differently from a plain scan: `<!--` with\n // `<script` inside a script keeps it open past `</script>`, and CDATA\n // in SVG hides a close tag. Refused rather than guessed.\n const content = s.slice(j, stop)\n if (foreign && content.includes('<')) {\n // Inside SVG and MathML a browser parses script and style content\n // as markup, so any `<` there could hide the close tag from us.\n this.err(\n j,\n stop,\n `markup isn't allowed inside <${lower}> in SVG or MathML — move the code to a separate file`,\n )\n } else if (\n /<!\\[CDATA\\[/i.test(content) ||\n (lower === 'script' && /<!--/.test(content) && /<script/i.test(content))\n ) {\n this.err(\n j,\n stop,\n `this <${lower}> content (<!-- with <script, or CDATA) is read differently by browsers — move it to a separate file`,\n )\n }\n }\n el.children = this.textWithInterps(j, stop, RAW_TEXT.has(lower) ? 'raw-text' : 'rcdata')\n if (close < 0) {\n this.i = s.length\n return\n }\n const gt = s.indexOf('>', close)\n this.i = gt < 0 ? s.length : gt + 1\n return\n }\n this.frames.push({ type: 'element', el, children: el.children, name })\n }\n\n /** One attribute at `j`; returns where the next one starts. */\n private attr(j: number, attrs: Attr[]): number {\n const s = this.s\n const start = j\n if (s.startsWith('{{', j)) this.fatal(j, j + 2, \"attribute names can't be interpolated\")\n while (j < s.length && !/[\\s\"'>/=]/.test(s[j]!)) {\n if (s.startsWith('{{', j)) this.fatal(j, j + 2, \"attribute names can't be interpolated\")\n j++\n }\n if (j === start) this.fatal(j, j + 1, `unexpected '${s[j]}' in a tag`)\n const raw = s.slice(start, j)\n let k = j\n while (k < s.length && /[ \\t]/.test(s[k]!)) k++\n if (s[k] !== '=') {\n attrs.push(this.classify(raw, undefined, start, j, false))\n return j\n }\n k++\n while (k < s.length && /\\s/.test(s[k]!)) k++\n const q = s[k]\n if (q === '\"' || q === \"'\") {\n const close = s.indexOf(q, k + 1)\n if (close < 0) this.fatal(start, k + 1, `the value of ${raw} is never closed — expected ${q}`)\n attrs.push(this.classify(raw, { from: k + 1, to: close }, start, close + 1, true))\n return close + 1\n }\n let e = k\n while (e < s.length && !/[\\s>]/.test(s[e]!)) e++\n if (s.slice(k, e).includes('{{')) {\n this.fatal(k, e, `quote the value of ${raw}: an interpolated attribute must be in quotes`)\n }\n attrs.push(this.classify(raw, { from: k, to: e }, start, e, false))\n return e\n }\n\n private classify(\n raw: string,\n value: { from: number; to: number } | undefined,\n start: number,\n end: number,\n quoted: boolean,\n ): Attr {\n const span = this.span(start, end)\n const binding = /^\\[(?:(class)\\.([\\w-]+)|(style)\\.([\\w-]+)(?:\\.(\\w+))?|([^\\]]+))\\]$/.exec(raw)\n if (binding) {\n if (!value) this.fatal(start, end, `${raw} needs a value: ${raw}=\"expression\"`)\n const src = this.s.slice(value.from, value.to)\n if (src.includes('{{'))\n this.fatal(value.from, value.to, `${raw} takes an expression, without {{ }}`)\n const expr = this.expr(src, value.from)\n const [, cls, clsName, sty, styName, unit, bind] = binding\n if (cls) return { name: clsName!, kind: 'class', expr, quoted, span }\n if (sty) return { name: styName!, kind: 'style', expr, unit, quoted, span }\n return { name: bind!, kind: 'bind', expr, quoted, span }\n }\n if (!value) return { name: raw, kind: 'bare', quoted: false, span }\n const parts: Array<string | Expr> = []\n for (const n of this.textWithInterps(value.from, value.to, 'text')) {\n if (n.k === 'text') parts.push(n.value)\n else if (n.k === 'interp') parts.push(n.expr)\n }\n const dynamic = parts.some((p) => typeof p !== 'string')\n return {\n name: raw,\n kind: dynamic ? 'interp' : 'static',\n parts: parts.length ? parts : [''],\n quoted,\n span,\n }\n }\n\n private closeTag(i: number): void {\n const m = /^<\\/([A-Za-z][\\w:.-]*)\\s*>/.exec(this.s.slice(i, i + 200))\n if (!m) this.fatal(i, i + 2, 'malformed closing tag')\n this.i = i + m[0].length\n const tag = m[1]!\n for (let f = this.frames.length - 1; f > 0; f--) {\n const frame = this.frames[f]!\n if (frame.type === 'block' || frame.type === 'switch' || frame.type === 'root') break\n const matches =\n frame.type === 'slot'\n ? tag.toLowerCase() === 'slot'\n : frame.el.foreign\n ? frame.name === tag\n : frame.name === tag.toLowerCase()\n if (matches) {\n this.flush()\n this.frames.length = f\n return\n }\n }\n this.warn(i, this.i, `</${tag}> closes nothing`)\n }\n\n // ── blocks ────────────────────────────────────────────────────────────\n\n /** `( … )` from `j` (at `(`): the inside and the offset after `)`. */\n private parens(j: number, what: string): { src: string; at: number; end: number } {\n if (this.s[j] !== '(') this.fatal(j, j + 1, `expected ( after ${what}`)\n let depth = 0\n let quote = ''\n for (let k = j; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === '(') depth++\n else if (ch === ')' && --depth === 0)\n return { src: this.s.slice(j + 1, k), at: j + 1, end: k + 1 }\n }\n this.fatal(j, j + 1, `${what} ( is never closed — expected )`)\n }\n\n private skipWs(j: number): number {\n while (j < this.s.length && /\\s/.test(this.s[j]!)) j++\n return j\n }\n\n private openBrace(j: number, what: string): number {\n j = this.skipWs(j)\n if (this.s[j] !== '{') this.fatal(j, j + 1, `expected { after ${what}`)\n return j + 1\n }\n\n /** Split a block header on top-level `;`. */\n private splitHeader(src: string, at: number): Array<{ src: string; at: number }> {\n const out: Array<{ src: string; at: number }> = []\n let quote = ''\n let start = 0\n for (let k = 0; k < src.length; k++) {\n const ch = src[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n } else if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === ';') {\n out.push({ src: src.slice(start, k), at: at + start })\n start = k + 1\n }\n }\n out.push({ src: src.slice(start), at: at + start })\n return out\n }\n\n private stringArg(src: string, at: number, what: string): string {\n const m = /^\\s*(['\"])([^'\"]*)\\1\\s*$/.exec(src)\n if (!m) this.fatal(at, at + src.length, `${what} takes a quoted name`)\n return m[2]!\n }\n\n /** Handle `@keyword` at `i`. False when it isn't a block after all (stays text). */\n private block(kw: string, i: number): boolean {\n const s = this.s\n const after = i + 1 + kw.length\n const next = this.skipWs(after)\n const ch = s[next]\n switch (kw) {\n case 'if':\n case 'for':\n case 'switch':\n case 'slot':\n case 'layout':\n case 'assets':\n if (ch !== '(') return false\n break\n case 'verbatim':\n if (ch !== '{') return false\n break\n case 'let':\n case 'input':\n if (!/[ \\t]/.test(s[after] ?? '')) return false\n break\n case 'else':\n case 'empty':\n case 'case':\n case 'default':\n if (ch !== '{' && ch !== '(' && !(kw === 'else' && s.startsWith('if', next))) return false\n this.fatal(\n i,\n after,\n `@${kw} has no matching ${kw === 'else' ? '@if' : kw === 'empty' ? '@for' : '@switch'}`,\n )\n }\n\n if (kw === 'layout') return this.layout(i, next)\n if (kw === 'input') return this.input(i, after)\n if (kw === 'let') return this.let(i, after)\n if (kw === 'verbatim') return this.verbatim(i, next)\n if (kw === 'assets') {\n const p = this.parens(next, '@assets')\n const entry = this.stringArg(p.src, p.at, '@assets')\n this.i = this.standalone(i, p.end)\n this.emit({ k: 'assets', entry, span: this.span(i, p.end) })\n return true\n }\n\n const p = this.parens(next, `@${kw}`)\n const brace = this.openBrace(p.end, `@${kw} (…)`)\n const resume = this.standalone(i, brace)\n if (kw === 'if') {\n const branch = this.ifBranch(p.src, p.at)\n const node: Node = { k: 'if', branches: [branch], span: this.span(i, brace) }\n this.emit(node)\n this.frames.push({\n type: 'block',\n children: branch.body,\n next: 'else',\n node,\n keyword: 'if',\n start: i,\n })\n } else if (kw === 'for') {\n const node = this.forHeader(p.src, p.at, i, brace)\n this.emit(node)\n this.frames.push({\n type: 'block',\n children: node.body,\n next: 'empty',\n node,\n keyword: 'for',\n start: i,\n })\n } else if (kw === 'switch') {\n const on = this.expr(p.src, p.at)\n const node: Extract<Node, { k: 'switch' }> = {\n k: 'switch',\n on: on ?? { kind: 'literal', value: null, span: this.span(p.at, p.at) },\n cases: [],\n span: this.span(i, brace),\n }\n this.emit(node)\n this.frames.push({ type: 'switch', node, start: i })\n } else {\n const name = this.stringArg(p.src, p.at, '@slot')\n const node: Node = { k: 'slot-fill', name, body: [], span: this.span(i, brace) }\n this.emit(node)\n this.frames.push({ type: 'block', children: node.body, node, keyword: 'slot', start: i })\n }\n this.i = resume\n return true\n }\n\n private ifBranch(src: string, at: number): IfBranch {\n const parts = this.splitHeader(src, at)\n const cond = this.expr(parts[0]!.src, parts[0]!.at)\n const branch: IfBranch = { cond, body: [] }\n if (parts[1]) {\n const m = /^\\s*as\\s+([A-Za-z_$][\\w$]*)\\s*$/.exec(parts[1].src)\n if (!m) this.err(parts[1].at, parts[1].at + parts[1].src.length, 'expected `as name` after ;')\n else branch.alias = m[1]\n }\n if (parts.length > 2) this.err(parts[2]!.at, parts[2]!.at + 1, 'unexpected ; in @if')\n return branch\n }\n\n private forHeader(\n src: string,\n at: number,\n start: number,\n end: number,\n ): Extract<Node, { k: 'for' }> {\n const parts = this.splitHeader(src, at)\n const head = parts[0]!\n const m =\n /^(\\s*)(?:\\[\\s*([A-Za-z_$][\\w$]*)\\s*,\\s*([A-Za-z_$][\\w$]*)\\s*\\]|([A-Za-z_$][\\w$]*))\\s+of\\s+/.exec(\n head.src,\n )\n if (!m) this.fatal(head.at, head.at + head.src.length, '@for needs `item of items`')\n const item: string | [string, string] = m[4] ?? [m[2]!, m[3]!]\n const ofSrc = head.src.slice(m[0].length)\n const of = this.expr(ofSrc, head.at + m[0].length) ?? {\n kind: 'literal',\n value: null,\n span: this.span(at, at),\n }\n const lets: Record<string, LoopVar> = {}\n for (const part of parts.slice(1)) {\n const t = part.src.trim()\n if (t.startsWith('track')) {\n this.expr(\n part.src.replace(/^\\s*track\\b/, (w) => ' '.repeat(w.length)),\n part.at,\n )\n continue\n }\n if (t.startsWith('let')) {\n const body = part.src.replace(/^\\s*let\\b/, '')\n for (const decl of body.split(',')) {\n const d = /^\\s*([A-Za-z_$][\\w$]*)\\s*=\\s*(\\$\\w+)\\s*$/.exec(decl)\n if (!d || !LOOP_VARS.has(d[2] as LoopVar)) {\n this.err(\n part.at,\n part.at + part.src.length,\n `unknown loop variable in \\`${decl.trim()}\\` — use ${[...LOOP_VARS].join(', ')}`,\n )\n continue\n }\n lets[d[1]!] = d[2] as LoopVar\n }\n continue\n }\n this.err(part.at, part.at + part.src.length, `expected track or let in @for, found \\`${t}\\``)\n }\n return { k: 'for', item, of, lets, body: [], span: this.span(start, end) }\n }\n\n private closeBlock(i: number): void {\n let f = this.frames.length - 1\n while (this.frames[f]!.type !== 'block') f--\n const frame = this.frames[f] as Extract<Frame, { type: 'block' }>\n const s = this.s\n // A continuation: `} @else …`, `} @empty {`.\n const j = this.skipWs(i + 1)\n let branch: IfBranch | undefined\n let empty = false\n let end = i + 1\n if (frame.next === 'else' && /^@else(?![\\w$-])/.test(s.slice(j, j + 6))) {\n let k = this.skipWs(j + 5)\n if (s.startsWith('if', k) && /[\\s(]/.test(s[k + 2] ?? '')) {\n const p = this.parens(this.skipWs(k + 2), '@else if')\n branch = this.ifBranch(p.src, p.at)\n k = p.end\n } else {\n branch = { body: [] }\n }\n end = this.openBrace(k, '@else')\n } else if (frame.next === 'empty' && /^@empty(?![\\w$-])/.test(s.slice(j, j + 7))) {\n empty = true\n end = this.openBrace(j + 6, '@empty')\n }\n // Trim before flushing: the indentation in front of `}` is still pending.\n const resume = this.standalone(i, end)\n this.flush()\n // Elements opened inside the block close with it.\n this.frames.length = f\n this.i = resume\n if (branch) {\n const node = frame.node as Extract<Node, { k: 'if' }>\n node.branches.push(branch)\n this.frames.push({\n type: 'block',\n children: branch.body,\n next: branch.cond ? 'else' : undefined,\n node,\n keyword: 'else',\n start: j,\n })\n } else if (empty) {\n const node = frame.node as Extract<Node, { k: 'for' }>\n node.empty = []\n this.frames.push({ type: 'block', children: node.empty, node, keyword: 'empty', start: j })\n }\n }\n\n /** Inside `@switch { }`: only `@case (…) { }`, `@default { }` and whitespace. */\n private switchBody(): void {\n const s = this.s\n const j = this.skipWs(this.i)\n const frame = this.top as Extract<Frame, { type: 'switch' }>\n if (j >= s.length) {\n this.i = j\n return\n }\n if (s[j] === '}') {\n this.frames.pop()\n this.i = this.standalone(j, j + 1)\n return\n }\n const m = /^@(case|default)(?![\\w$-])/.exec(s.slice(j, j + 9))\n if (!m) this.fatal(j, j + 1, 'only @case and @default go inside @switch')\n let k = j + m[0].length\n let value: Expr | undefined\n if (m[1] === 'case') {\n const p = this.parens(this.skipWs(k), '@case')\n value = this.expr(p.src, p.at)\n k = p.end\n } else if (frame.node.default) {\n this.err(j, k, '@switch has two @default blocks')\n }\n const brace = this.openBrace(k, `@${m[1]}`)\n const body: Node[] = []\n if (m[1] === 'case') frame.node.cases.push({ value: value ?? frame.node.on, body })\n else frame.node.default = body\n this.i = this.standalone(j, brace)\n this.frames.push({ type: 'block', children: body, node: frame.node, keyword: m[1]!, start: j })\n }\n\n private verbatim(i: number, brace: number): boolean {\n let depth = 0\n let quote = ''\n for (let k = brace; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') quote = ch\n else if (ch === '{') depth++\n else if (ch === '}' && --depth === 0) {\n const resume = this.standalone(i, k + 1)\n this.emit({ k: 'verbatim', text: this.s.slice(brace + 1, k), span: this.span(i, k + 1) })\n this.i = resume\n return true\n }\n }\n this.fatal(i, brace + 1, '@verbatim is never closed — expected }')\n }\n\n private layout(i: number, at: number): boolean {\n const p = this.parens(at, '@layout')\n if (this.seenOutput || this.frames.length > 1) {\n this.err(i, p.end, '@layout must come before any output')\n } else if (this.ast.layout !== undefined) {\n this.err(i, p.end, 'a template has one @layout')\n } else {\n this.ast.layout = /^\\s*none\\s*$/.test(p.src) ? null : this.stringArg(p.src, p.at, '@layout')\n this.ast.layoutSpan = this.span(i, p.end)\n }\n this.i = this.standalone(i, p.end)\n return true\n }\n\n private input(i: number, after: number): boolean {\n let eol = this.s.indexOf('\\n', after)\n if (eol < 0) eol = this.s.length\n const line = this.s.slice(after, eol).replace(/\\r$/, '')\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*(?:=\\s*(.*?))?\\s*$/.exec(line)\n if (!m) this.fatal(i, eol, '@input needs a name: @input name or @input name = value')\n if (this.frames.length > 1)\n this.err(i, eol, '@input goes at the top of a component, outside any block')\n const decl: InputDecl = { name: m[1]!, span: this.span(i, after + line.length) }\n if (m[2] !== undefined) {\n const at = after + line.indexOf(m[2], m[0].indexOf('=') + 1)\n const e = this.expr(m[2], at)\n const literal =\n e?.kind === 'literal'\n ? e.value\n : e?.kind === 'unary' &&\n e.op === '-' &&\n e.arg.kind === 'literal' &&\n typeof e.arg.value === 'number'\n ? -e.arg.value\n : undefined\n if (e && literal === undefined) {\n this.err(\n at,\n at + m[2].length,\n 'an @input default must be a literal: a string, number, true, false or null',\n )\n } else if (e) {\n decl.default = { value: literal!, span: e.span }\n }\n }\n if (this.ast.inputs.some((d) => d.name === decl.name))\n this.err(i, eol, `@input ${decl.name} is declared twice`)\n this.ast.inputs.push(decl)\n this.i = this.standalone(i, after + line.length)\n return true\n }\n\n private let(i: number, after: number): boolean {\n let quote = ''\n for (let k = after; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === ';') {\n const src = this.s.slice(after, k)\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*=/.exec(src)\n if (!m) this.fatal(i, k, '@let needs a name: @let name = expression;')\n const expr = this.expr(src.slice(m[0].length), after + m[0].length)\n const resume = this.standalone(i, k + 1)\n if (expr) this.emit({ k: 'let', name: m[1]!, expr, span: this.span(i, k + 1) })\n this.i = resume\n return true\n }\n }\n this.fatal(i, after, '@let is never ended — expected ;')\n }\n}\n\n/** Parse a `.kick` source. A leading BOM is dropped; positions refer to the rest. */\nexport function parse(source: string, file: string): ParseResult {\n const p = new TemplateParser(source.charCodeAt(0) === 0xfeff ? source.slice(1) : source, file)\n p.run()\n return { ast: p.ast, diagnostics: p.diagnostics }\n}\n","/**\n * The few functions every rendered value passes through: a property read\n * that can't reach prototypes or functions, and escaping for each place a\n * value can land (spec §3, §4).\n */\nimport { FORBIDDEN_NAMES } from '../parse/expression'\n\nexport { isUrlAttr, URL_ATTRS } from '../urls'\n\n/** HTML a pipe or the app marked as trusted: printed unescaped, in text only. */\nexport class SafeHtml {\n constructor(readonly html: string) {}\n toString(): string {\n return this.html\n }\n}\n\n/**\n * Read `obj[key]` for a template. Forbidden names and function values read\n * as `undefined`, so a template can neither reach a prototype nor get hold of\n * something to call. Getters and Proxy traps run: they are the app's own code.\n */\nexport function read(obj: unknown, key: unknown): unknown {\n if (obj === null || obj === undefined) return undefined\n const k = typeof key === 'number' || typeof key === 'symbol' ? key : String(key)\n if (typeof k === 'string' && FORBIDDEN_NAMES.has(k)) return undefined\n const value = (obj as Record<PropertyKey, unknown>)[k]\n return typeof value === 'function' ? undefined : value\n}\n\nconst HTML_ESCAPES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport const escapeHtml = (s: string): string => s.replace(/[&<>\"']/g, (c) => HTML_ESCAPES[c]!)\n\nconst SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel'])\n\n/**\n * A URL attribute's value, or `#` when its scheme could run script.\n * Browsers ignore ASCII whitespace and control characters inside a scheme\n * (`java\\tscript:`), so those are removed before the scheme is read.\n */\nexport function sanitizeUrl(value: string): string {\n // oxlint-disable-next-line no-control-regex -- matching control characters is the point\n const normalised = value.replace(/[\\u0000- \\u007F]/g, '')\n const m = /^([a-z][a-z0-9+.-]*):/i.exec(normalised)\n if (!m) return value\n return SAFE_SCHEMES.has(m[1]!.toLowerCase()) ? value : '#'\n}\n\n/** `srcset`: each candidate URL is checked on its own. */\nexport function sanitizeSrcset(value: string): string {\n return value\n .split(',')\n .map((candidate) => {\n const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(candidate)\n if (!m) return candidate\n return `${m[1]}${sanitizeUrl(m[2]!)}${m[3]}`\n })\n .join(',')\n}\n\nconst JSON_ESCAPES: Record<string, string> = {\n '<': '\\\\u003c',\n '>': '\\\\u003e',\n '&': '\\\\u0026',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n}\n\n/** JSON text made safe inside `<script type=\"application/json\">`: no `</script`, no `<!--`. */\nexport const escapeJsonForScript = (json: string): string =>\n json.replace(/[<>&\\u2028\\u2029]/g, (c) => JSON_ESCAPES[c]!)\n\n/** A CSS value for `[style.prop]`, or `undefined` when it could leave its property. */\nexport function safeStyleValue(v: string): string | undefined {\n return /[;{}\\\\\"'<]|\\/\\*|url\\s*\\(|expression\\s*\\(/i.test(v) ? undefined : v\n}\n","/**\n * The built-in pipes (spec §7). Synchronous, locale- and time-zone-aware\n * through the render's env — never the server's.\n */\nimport type { Pipe } from '../render/render'\nimport { SafeHtml } from '../render/safe'\n\nexport const BUILTIN_PIPES: readonly string[] = [\n 'uppercase',\n 'lowercase',\n 'titlecase',\n 'json',\n 'slice',\n 'keys',\n 'entries',\n 'url',\n 'raw',\n 'date',\n 'number',\n 'currency',\n 'percent',\n]\n\nexport interface PipeEnv {\n locale: string\n timeZone: string\n}\n\nconst DATE_FORMATS: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'long' },\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n}\n\n/** Digits as `minInt.minFrac-maxFrac`, e.g. `1.0-2`. */\nfunction digits(info: unknown): Intl.NumberFormatOptions {\n if (info === undefined || info === null) return {}\n const m = /^(\\d+)\\.(\\d+)-(\\d+)$/.exec(String(info))\n if (!m) throw new Error(`digits must look like '1.0-2', got '${String(info)}'`)\n return {\n minimumIntegerDigits: Number(m[1]),\n minimumFractionDigits: Number(m[2]),\n maximumFractionDigits: Number(m[3]),\n }\n}\n\n/**\n * Intl formatters are costly to build: one per locale and options, reused.\n * Locales and pipe arguments can come from a request or data, so the cache\n * is capped — past the limit it starts over rather than growing.\n */\nexport const FORMATTER_CACHE_LIMIT = 256\nconst formatters = new Map<string, Intl.NumberFormat | Intl.DateTimeFormat>()\nexport const formatterCacheSize = (): number => formatters.size\nfunction remember<T extends Intl.NumberFormat | Intl.DateTimeFormat>(key: string, f: T): T {\n if (formatters.size >= FORMATTER_CACHE_LIMIT) formatters.clear()\n formatters.set(key, f)\n return f\n}\n/** The formatter cached under `key`, built by `make` on a miss. Keys are cheap strings, not serialised options. */\nfunction cached<T extends Intl.NumberFormat | Intl.DateTimeFormat>(key: string, make: () => T): T {\n return (formatters.get(key) as T | undefined) ?? remember(key, make())\n}\n\nconst toNumber = (v: unknown): number | undefined => {\n if (v === null || v === undefined || v === '') return undefined\n const n = Number(v)\n return Number.isNaN(n) ? undefined : n\n}\n\nconst str = (v: unknown): string => (v === null || v === undefined ? '' : String(v))\n\nexport function builtinPipes(env: PipeEnv): Record<string, Pipe> {\n return {\n uppercase: (v) => str(v).toUpperCase(),\n lowercase: (v) => str(v).toLowerCase(),\n titlecase: (v) => str(v).replace(/\\b\\p{L}/gu, (c) => c.toUpperCase()),\n json: (v) => JSON.stringify(v, null, 2),\n slice: (v, start, end) =>\n typeof v === 'string' || Array.isArray(v)\n ? v.slice(start as number | undefined, end as number | undefined)\n : v,\n keys: (v) =>\n v instanceof Map ? [...v.keys()] : v && typeof v === 'object' ? Object.keys(v) : [],\n entries: (v) =>\n v instanceof Map ? [...v.entries()] : v && typeof v === 'object' ? Object.entries(v) : [],\n url: (v) => encodeURIComponent(str(v)),\n raw: (v) => (v instanceof SafeHtml ? v : new SafeHtml(str(v))),\n date: (v, format = 'medium', timeZone) => {\n if (v === null || v === undefined || v === '') return ''\n const d = v instanceof Date ? v : new Date(v as string | number)\n if (Number.isNaN(d.getTime())) return ''\n const preset = DATE_FORMATS[String(format)]\n if (!preset) throw new Error(`unknown date format '${String(format)}'`)\n const tz = (timeZone as string | undefined) ?? env.timeZone\n return cached(\n `d|${env.locale}|${String(format)}|${tz}`,\n () => new Intl.DateTimeFormat(env.locale, { ...preset, timeZone: tz }),\n ).format(d)\n },\n number: (v, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `n|${env.locale}|${String(info)}`,\n () => new Intl.NumberFormat(env.locale, digits(info)),\n ).format(n)\n },\n currency: (v, code, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `c|${env.locale}|${String(code)}|${String(info)}`,\n () =>\n new Intl.NumberFormat(env.locale, {\n style: 'currency',\n currency: String(code ?? 'USD'),\n ...digits(info),\n }),\n ).format(n)\n },\n percent: (v, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `p|${env.locale}|${String(info)}`,\n () => new Intl.NumberFormat(env.locale, { style: 'percent', ...digits(info) }),\n ).format(n)\n },\n }\n}\n","/**\n * Read the names a pipes file exports, without running it — so the build\n * and the editor agree with the runtime on which pipes exist (spec §7).\n * Only top-level `export const|let|var|function` and `export { a, b as c }`\n * of local names; anything that needs another module to resolve is refused.\n */\nimport { error, positionAt, type Diagnostic } from '../diagnostics'\nimport { BUILTIN_PIPES } from './builtins'\n\ninterface Token {\n v: string\n start: number\n}\n\n/** Identifiers and punctuation at brace depth 0, skipping strings, comments and template literals. */\nfunction topLevelTokens(src: string): Token[] {\n const out: Token[] = []\n let depth = 0\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n if (c === '/' && src[i + 1] === '/') {\n const nl = src.indexOf('\\n', i)\n i = nl < 0 ? src.length : nl\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n const end = src.indexOf('*/', i + 2)\n i = end < 0 ? src.length : end + 2\n continue\n }\n if (c === \"'\" || c === '\"' || c === '`') {\n i++\n while (i < src.length && src[i] !== c) i += src[i] === '\\\\' ? 2 : 1\n i++\n continue\n }\n if (c === '{' || c === '(' || c === '[') {\n if (depth === 0) out.push({ v: c, start: i })\n depth++\n i++\n continue\n }\n if (c === '}' || c === ')' || c === ']') {\n depth--\n if (depth === 0) out.push({ v: c, start: i })\n i++\n continue\n }\n if (depth === 0 && /[A-Za-z_$*]/.test(c)) {\n const m = /^[A-Za-z_$][\\w$]*|^\\*/.exec(src.slice(i))!\n out.push({ v: m[0], start: i })\n i += m[0].length\n continue\n }\n if (depth === 0 && (c === ',' || c === ';' || c === '=')) out.push({ v: c, start: i })\n i++\n }\n return out\n}\n\n/** The tokens inside the `{ … }` that starts at `src[open]`. */\nfunction braceNames(\n src: string,\n open: number,\n): { names: Array<{ local: string; exported: string; at: number }>; end: number } {\n const close = src.indexOf('}', open)\n const body = src.slice(open + 1, close < 0 ? src.length : close)\n const names: Array<{ local: string; exported: string; at: number }> = []\n let offset = open + 1\n for (const part of body.split(',')) {\n const m = /^(\\s*)([A-Za-z_$][\\w$]*)(?:\\s+as\\s+([A-Za-z_$][\\w$]*))?\\s*$/.exec(part)\n if (m) names.push({ local: m[2]!, exported: m[3] ?? m[2]!, at: offset + m[1]!.length })\n offset += part.length + 1\n }\n return { names, end: close < 0 ? src.length : close + 1 }\n}\n\nexport function readPipeExports(\n source: string,\n file: string,\n): { names: string[]; diagnostics: Diagnostic[] } {\n const names: string[] = []\n const diagnostics: Diagnostic[] = []\n const fail = (at: number, len: number, message: string) =>\n diagnostics.push(\n error(file, { start: positionAt(source, at), end: positionAt(source, at + len) }, message),\n )\n const add = (name: string, at: number) => {\n if (BUILTIN_PIPES.includes(name)) {\n fail(at, name.length, `'${name}' is a built-in pipe — choose another name`)\n return\n }\n names.push(name)\n }\n\n const tokens = topLevelTokens(source)\n for (let t = 0; t < tokens.length; t++) {\n if (tokens[t]!.v !== 'export') continue\n const at = tokens[t]!.start\n const next = tokens[t + 1]\n const after = tokens[t + 2]\n switch (next?.v) {\n case 'const':\n case 'let':\n case 'var': {\n if (after && /^[A-Za-z_$]/.test(after.v)) add(after.v, after.start)\n else fail(at, 6, 'export one pipe per name: export const name = …')\n break\n }\n case 'function':\n if (after && /^[A-Za-z_$]/.test(after.v)) add(after.v, after.start)\n break\n case 'async':\n fail(at, 6, 'pipes must be synchronous — an async function returns a Promise')\n break\n case '{': {\n const { names: list, end } = braceNames(source, next.start)\n const rest = tokens.find((x) => x.start >= end)\n if (rest?.v === 'from') {\n fail(at, 6, \"re-exports aren't read — import the pipe and export it from this file\")\n break\n }\n for (const n of list) add(n.exported, n.at)\n break\n }\n case 'type':\n case 'interface':\n break\n case '*':\n fail(at, 6, \"export * isn't read — export each pipe by name\")\n break\n case 'default':\n fail(at, 6, 'a default export is not a pipe — export each pipe by name')\n break\n default:\n fail(at, 6, `export ${next?.v ?? ''} is not a pipe — export const or function`)\n }\n }\n return { names, diagnostics }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"read-exports-BdIwY1WT.js","names":["LOOP_VARS","KEYWORDS"],"sources":["../src/ast.ts","../src/diagnostics.ts","../src/entities.ts","../src/urls.ts","../src/check/project.ts","../src/check/optimize.ts","../src/check/check.ts","../src/parse/expression.ts","../src/parse/template.ts","../src/render/safe.ts","../src/pipes/builtins.ts","../src/pipes/read-exports.ts"],"sourcesContent":["import type { Span } from './diagnostics'\n\n/** Bumped when the shape of a checked template changes; builds and runtimes must agree. */\nexport const AST_FORMAT_VERSION = 1\n\nexport type Literal = string | number | boolean | null\n\nexport interface PathSegment {\n /** `.name` / `?.name` */\n name?: string\n /** `[expr]` / `?.[expr]` */\n computed?: Expr\n optional: boolean\n}\n\nexport type Expr =\n | { kind: 'literal'; value: Literal; span: Span }\n | { kind: 'path'; root: string; segments: PathSegment[]; span: Span }\n | { kind: 'unary'; op: '!' | '-'; arg: Expr; span: Span }\n | {\n kind: 'binary'\n op: '+' | '-' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '===' | '!=='\n left: Expr\n right: Expr\n span: Span\n }\n | { kind: 'logical'; op: '&&' | '||' | '??'; left: Expr; right: Expr; span: Span }\n | { kind: 'conditional'; test: Expr; whenTrue: Expr; whenFalse: Expr; span: Span }\n | { kind: 'pipe'; input: Expr; name: string; args: Expr[]; span: Span }\n\n/** Where an interpolation lands, which decides how its value is escaped (spec §4). */\nexport type Ctx = 'text' | 'rcdata' | 'raw-text' | 'comment'\n\nexport interface Attr {\n /** As written: `href`, `userId` (from `[userId]`), `on` (from `[class.on]`). */\n name: string\n /**\n * `static` `a=\"x\"`, `interp` `a=\"x{{ y }}\"`, `bare` `a`, `bind` `[a]=\"expr\"`,\n * `class` `[class.a]=\"expr\"`, `style` `[style.a(.unit)]=\"expr\"`.\n */\n kind: 'static' | 'interp' | 'bare' | 'bind' | 'class' | 'style'\n /** `static` / `interp`: the value, literal text and expressions in order. */\n parts?: Array<string | Expr>\n /** `bind` / `class` / `style`: the bound expression. */\n expr?: Expr\n /** `[style.width.px]`: `px`. */\n unit?: string\n quoted: boolean\n span: Span\n}\n\nexport interface Element {\n k: 'element'\n /** As written. */\n tag: string\n attrs: Attr[]\n children: Node[]\n /** Inside `<svg>` / `<math>`: names keep their case. */\n foreign: boolean\n void: boolean\n selfClosing: boolean\n span: Span\n}\n\nexport interface IfBranch {\n /** Absent on `@else`. */\n cond?: Expr\n /** `@if (x; as y)` */\n alias?: string\n body: Node[]\n}\n\nexport type LoopVar = '$index' | '$first' | '$last' | '$even' | '$odd' | '$count'\n\nexport type Node =\n | { k: 'text'; value: string; span: Span }\n | { k: 'interp'; expr: Expr; ctx: Ctx; span: Span }\n | Element\n | { k: 'comment'; children: Node[]; span: Span }\n | { k: 'if'; branches: IfBranch[]; span: Span }\n | {\n k: 'for'\n item: string | [string, string]\n of: Expr\n lets: Record<string, LoopVar>\n body: Node[]\n empty?: Node[]\n span: Span\n }\n | {\n k: 'switch'\n on: Expr\n cases: Array<{ value: Expr; body: Node[] }>\n default?: Node[]\n span: Span\n }\n | { k: 'let'; name: string; expr: Expr; span: Span }\n | { k: 'verbatim'; text: string; span: Span }\n | { k: 'slot-outlet'; name?: string; fallback: Node[]; span: Span }\n | { k: 'slot-fill'; name: string; body: Node[]; span: Span }\n | { k: 'assets'; entry: string; span: Span }\n\nexport interface InputDecl {\n name: string\n default?: { value: Literal; span: Span }\n span: Span\n}\n\nexport interface TemplateAst {\n file: string\n /** `undefined`: none declared (the default layout applies); `null`: `@layout(none)`. */\n layout?: string | null\n layoutSpan?: Span\n inputs: InputDecl[]\n body: Node[]\n}\n\n/** `[line, column]` of a node in its template, for render errors. */\nexport type At = [number, number]\n\n// ── Checked templates: what `check` produces and `render` walks. Plain JSON,\n// so a build can ship them as data. Short keys keep edge bundles small.\n\n/** A path segment: `.n` or `[e]`; `o` marks `?.`. */\nexport type CSeg = { n: string; o?: 1 } | { e: CExpr; o?: 1 }\n\nexport type CExpr =\n /** literal */\n | { k: 'l'; v: Literal }\n /** undefined (a name a component doesn't have) */\n | { k: 'x' }\n /** page / shared data: `n` then the path */\n | { k: 'd'; n: string; p: CSeg[] }\n /** a scope slot (@let, loop item, @if alias, component input) then the path */\n | { k: 'v'; s: number; p: CSeg[] }\n /** a loop variable of the loop whose meta is in slot `s` */\n | { k: 'm'; s: number; w: LoopVar }\n | { k: 'u'; o: '!' | '-'; a: CExpr }\n | { k: 'b'; o: string; l: CExpr; r: CExpr }\n | { k: 'c'; t: CExpr; y: CExpr; n: CExpr }\n | { k: 'p'; n: string; i: CExpr; a: CExpr[] }\n\n/** One attribute of an element whose attributes need work at render time. */\nexport type CAttr =\n /** static; `v: true` is a bare attribute */\n | { t: 's'; n: string; v: string | true }\n /** `n=\"text {{ e }}\"`; `u` marks a URL attribute (`srcset` checks each candidate) */\n | { t: 'i'; n: string; p: Array<string | CExpr>; u?: 'url' | 'srcset' }\n /** `[n]=\"e\"` */\n | { t: 'b'; n: string; e: CExpr; u?: 'url' | 'srcset' }\n /** `[class.n]=\"e\"` */\n | { t: 'c'; n: string; e: CExpr }\n /** `[style.n(.x)]=\"e\"` */\n | { t: 'y'; n: string; e: CExpr; x?: string }\n\nexport type CNode =\n /** static output */\n | { k: 's'; t: string }\n /** `{{ e }}`: `text` escapes HTML (trusted HTML prints as is), `rcdata` (`<title>`, `<textarea>`) escapes everything, `json` is the one value of a JSON script */\n | { k: 'i'; c: 'text' | 'rcdata' | 'json'; e: CExpr; at: At }\n /** the attributes of an element (between `<tag` and `>`); `f` takes a component caller's fallthrough attributes */\n | { k: 'A'; tag: string; a: CAttr[]; f?: 1; at: At }\n | { k: 'if'; br: Array<{ c?: CExpr; a?: number; b: CNode[] }> }\n | {\n k: 'for'\n e: CExpr\n it: number | [number, number]\n m: number\n b: CNode[]\n em?: CNode[]\n at: At\n }\n | { k: 'sw'; e: CExpr; cs: Array<{ e: CExpr; b: CNode[] }>; d?: CNode[] }\n | { k: 'let'; s: number; e: CExpr }\n /** a component: inputs into its slots, fallthrough attributes, slot fills (`''` is the default) */\n | {\n k: 'cmp'\n n: string\n in: Array<{ s: number; e: CExpr }>\n fa: CAttr[]\n f: Record<string, CNode[]>\n at: At\n }\n /** `<slot name=\"n\">fallback</slot>` */\n | { k: 'o'; n: string; fb: CNode[] }\n | { k: 'as'; en: string }\n\nexport interface CheckedTemplate {\n v: typeof AST_FORMAT_VERSION\n name: string\n file: string\n /** declared layout; `null` is `@layout(none)`; absent means the default layout applies to a page */\n layout?: string | null\n /** scope slots the template needs */\n slots: number\n /** a component's inputs: name, slot, default, required */\n inputs: Array<{ n: string; s: number; d?: Literal; r: boolean }>\n /** `@slot('name') { }` fills a page passes to its layout */\n fills: Record<string, CNode[]>\n body: CNode[]\n}\n","/** A point in a template: 0-based offset, 1-based line and column (UTF-16 units). */\nexport interface Pos {\n offset: number\n line: number\n column: number\n}\n\nexport interface Span {\n start: Pos\n end: Pos\n}\n\nexport interface Diagnostic {\n file: string\n span: Span\n message: string\n severity: 'error' | 'warning'\n /** The templates being rendered, outermost first, when the error came from a render. */\n stack?: string[]\n}\n\n/**\n * The position `upTo` characters into `text`, which starts at `base`.\n * CRLF counts as one line break, as does a lone CR.\n */\nexport function advance(base: Pos, text: string, upTo: number): Pos {\n let { line, column } = base\n for (let i = 0; i < upTo; i++) {\n const c = text.charCodeAt(i)\n if (c === 10 /* \\n */) {\n line++\n column = 1\n } else if (c === 13 /* \\r */) {\n if (text.charCodeAt(i + 1) !== 10) {\n line++\n column = 1\n }\n } else {\n column++\n }\n }\n return { offset: base.offset + upTo, line, column }\n}\n\nexport const START: Pos = { offset: 0, line: 1, column: 1 }\n\n/** The position of `offset` in `source`. */\nexport const positionAt = (source: string, offset: number): Pos => advance(START, source, offset)\n\nexport const error = (file: string, span: Span, message: string): Diagnostic => ({\n file,\n span,\n message,\n severity: 'error',\n})\n\nexport const warning = (file: string, span: Span, message: string): Diagnostic => ({\n file,\n span,\n message,\n severity: 'warning',\n})\n","/**\n * Decode the character references a browser would in attribute text: every\n * numeric one, and the named ones that matter for reading a URL's scheme or\n * for common text. Unknown names stay as written.\n */\nconst NAMED: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: ' ',\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n sol: '/',\n bsol: '\\\\',\n period: '.',\n comma: ',',\n semi: ';',\n equals: '=',\n quest: '?',\n num: '#',\n excl: '!',\n lpar: '(',\n rpar: ')',\n plus: '+',\n hyphen: '-',\n dash: '-',\n copy: '©',\n reg: '®',\n trade: '™',\n hellip: '…',\n mdash: '—',\n ndash: '–',\n laquo: '«',\n raquo: '»',\n}\n\nexport function decodeEntities(s: string): string {\n if (!s.includes('&')) return s\n return s.replace(\n /&(?:#[xX]([0-9a-fA-F]+)|#(\\d+)|([A-Za-z][A-Za-z0-9]*));?/g,\n (m, hex, dec, name) => {\n if (hex !== undefined || dec !== undefined) {\n const code = parseInt(hex ?? dec, hex !== undefined ? 16 : 10)\n return code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff)\n ? String.fromCodePoint(code)\n : '�'\n }\n return Object.hasOwn(NAMED, name) && m.endsWith(';') ? NAMED[name]! : m\n },\n )\n}\n","/**\n * Attributes whose value is a URL a browser may navigate to, load or run\n * (spec §4). Their assembled value is scheme-checked when rendered.\n */\nexport const URL_ATTRS: ReadonlySet<string> = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'poster',\n 'cite',\n 'background',\n 'ping',\n 'xlink:href',\n 'srcset',\n])\n\nexport function isUrlAttr(tag: string, attr: string): boolean {\n const name = attr.toLowerCase()\n return URL_ATTRS.has(name) || (name === 'data' && tag.toLowerCase() === 'object')\n}\n","import type { TemplateAst } from '../ast'\n\n/** Everything `check` knows about an app's views — built the same way by the runtime, the build and the editor. */\nexport interface Project {\n /** Template name (`users/show`, `components/user-card`) → its parsed source. */\n templates: Map<string, TemplateAst>\n /** Pipe names: the built-ins and the app's. */\n pipes: Set<string>\n /** Folder (inside the views folder) holding components. Default `components`. */\n componentsDir: string\n /** A page's layout when it declares none: one name, or folder prefix → layout. */\n layouts?: string | Record<string, string>\n /** The shell around every page's outermost layout. */\n baseLayout?: string\n}\n\n/**\n * The layout for a page that declares none. A map's longest matching folder\n * prefix wins: `{ admin: 'layouts/admin', '': 'layouts/main' }` gives\n * `admin/users` the admin layout and everything else the main one.\n */\nexport function layoutResolver(\n layouts?: string | Record<string, string>,\n): (page: string) => string | undefined {\n if (layouts === undefined) return () => undefined\n if (typeof layouts === 'string') return () => layouts\n const prefixes = Object.keys(layouts).toSorted((a, b) => b.length - a.length)\n return (page) => {\n const hit = prefixes.find((p) => p === '' || page === p || page.startsWith(`${p}/`))\n return hit === undefined ? undefined : layouts[hit]\n }\n}\n\n/** Templates that are layouts by configuration — they never get a mapped layout themselves. */\nexport function configuredLayouts(project: Project): Set<string> {\n const names = new Set<string>()\n if (typeof project.layouts === 'string') names.add(project.layouts)\n else if (project.layouts) for (const v of Object.values(project.layouts)) names.add(v)\n if (project.baseLayout) names.add(project.baseLayout)\n return names\n}\n\nconst SEGMENT = /^[A-Za-z0-9_-]+$/\n\n/** A valid template name, or `undefined`: `/`-joined segments, no `..`, no extension, no absolute path. */\nexport function templateName(name: string): string | undefined {\n if (typeof name !== 'string' || !name) return undefined\n const segments = name.split('/')\n return segments.every((s) => SEGMENT.test(s)) ? name : undefined\n}\n\n/** `components/forms/text-field` → `forms-text-field`. */\nexport function componentTag(name: string, componentsDir: string): string {\n return name\n .slice(componentsDir.length + 1)\n .split('/')\n .join('-')\n .toLowerCase()\n}\n\nexport const isComponent = (name: string, componentsDir: string): boolean =>\n name.startsWith(`${componentsDir}/`)\n","import type { CNode } from '../ast'\n\n/** Merge adjacent static output and drop empty pieces, inside blocks too. */\nexport function optimize(nodes: CNode[]): CNode[] {\n const out: CNode[] = []\n for (const n of nodes) {\n const node = deep(n)\n const last = out[out.length - 1]\n if (node.k === 's') {\n if (!node.t) continue\n if (last?.k === 's') {\n last.t += node.t\n continue\n }\n }\n out.push(node)\n }\n return out\n}\n\nfunction deep(n: CNode): CNode {\n switch (n.k) {\n case 'if':\n return { ...n, br: n.br.map((b) => ({ ...b, b: optimize(b.b) })) }\n case 'for':\n return n.em ? { ...n, b: optimize(n.b), em: optimize(n.em) } : { ...n, b: optimize(n.b) }\n case 'sw':\n return {\n ...n,\n cs: n.cs.map((c) => ({ ...c, b: optimize(c.b) })),\n ...(n.d ? { d: optimize(n.d) } : {}),\n }\n case 'cmp':\n return { ...n, f: Object.fromEntries(Object.entries(n.f).map(([k, v]) => [k, optimize(v)])) }\n case 'o':\n return { ...n, fb: optimize(n.fb) }\n case 's':\n return { ...n }\n default:\n return n\n }\n}\n","/**\n * `check`: turn a parsed template into a checked one — names resolved,\n * pipes, components, slots and layouts verified, and every interpolation's\n * context enforced (spec §4). What passes here is safe to render.\n */\nimport {\n AST_FORMAT_VERSION,\n type Attr,\n type CAttr,\n type CExpr,\n type CNode,\n type CSeg,\n type CheckedTemplate,\n type Element,\n type Expr,\n type LoopVar,\n type Node,\n type TemplateAst,\n} from '../ast'\nimport { error, warning, type Diagnostic, type Span } from '../diagnostics'\nimport { decodeEntities } from '../entities'\nimport { isUrlAttr } from '../urls'\nimport {\n componentTag,\n configuredLayouts,\n isComponent,\n layoutResolver,\n templateName,\n type Project,\n} from './project'\nimport { optimize } from './optimize'\n\nexport type { CheckedTemplate } from '../ast'\n\nexport interface CheckResult {\n template?: CheckedTemplate\n diagnostics: Diagnostic[]\n}\n\n/** SVG animation elements can set any attribute — `href` included — to these values. */\nconst ANIMATION = new Set(['animate', 'set', 'animatemotion', 'animatetransform'])\nconst ANIMATION_VALUES = new Set(['values', 'to', 'from', 'by', 'attributename'])\n\nconst JSON_SCRIPT_TYPES = new Set(['application/json', 'application/ld+json'])\nconst LOOP_VARS: ReadonlySet<string> = new Set([\n '$index',\n '$first',\n '$last',\n '$even',\n '$odd',\n '$count',\n])\n\n/** Attributes on a component tag that go to its root element instead of being inputs. */\nconst isFallthrough = (a: Attr): boolean => {\n if (a.kind === 'class' || a.kind === 'style') return true\n const n = a.name.toLowerCase()\n return (\n ['class', 'id', 'style', 'role'].includes(n) || n.startsWith('aria-') || n.startsWith('data-')\n )\n}\n\nconst camel = (name: string) => name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())\n\ntype Binding = { kind: 'slot'; s: number } | { kind: 'meta'; s: number; w?: LoopVar }\n\n/** What a caller needs to know about a component without checking it. */\ninterface Signature {\n name: string\n inputs: Map<string, { required: boolean; def?: unknown }>\n outlets: Set<string>\n roots: number\n}\n\nclass Checker {\n readonly diagnostics: Diagnostic[] = []\n slots = 0\n private readonly scopes: Array<Map<string, Binding>> = [new Map()]\n private readonly loops: number[] = []\n private readonly warned = new Set<string>()\n private readonly tags = new Map<string, string[]>()\n private readonly signatures = new Map<string, Signature>()\n\n constructor(\n private readonly project: Project,\n private readonly ast: TemplateAst,\n private readonly component: boolean,\n ) {\n for (const name of project.templates.keys()) {\n if (!isComponent(name, project.componentsDir)) continue\n const tag = componentTag(name, project.componentsDir)\n this.tags.set(tag, [...(this.tags.get(tag) ?? []), name])\n }\n }\n\n private err(span: Span, message: string): void {\n this.diagnostics.push(error(this.ast.file, span, message))\n }\n private warn(span: Span, message: string): void {\n this.diagnostics.push(warning(this.ast.file, span, message))\n }\n\n // ── scope ─────────────────────────────────────────────────────────────\n\n private slot(): number {\n return this.slots++\n }\n bind(name: string, b: Binding): void {\n this.scopes[this.scopes.length - 1]!.set(name, b)\n }\n private lookup(name: string): Binding | undefined {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const b = this.scopes[i]!.get(name)\n if (b) return b\n }\n return undefined\n }\n private scoped<T>(fn: () => T): T {\n this.scopes.push(new Map())\n try {\n return fn()\n } finally {\n this.scopes.pop()\n }\n }\n\n // ── expressions ───────────────────────────────────────────────────────\n\n /**\n * `whole` is true only for the whole expression of a text `{{ }}` — the one\n * place `raw` may appear (as its outermost pipe). Nested anywhere else, raw\n * could smuggle markup into an attribute or another context.\n */\n expr(e: Expr, where: 'text' | 'attr' | 'rcdata' | 'json' = 'text', whole = false): CExpr {\n switch (e.kind) {\n case 'literal':\n return { k: 'l', v: e.value }\n case 'unary':\n return { k: 'u', o: e.op, a: this.expr(e.arg) }\n case 'binary':\n case 'logical':\n return { k: 'b', o: e.op, l: this.expr(e.left), r: this.expr(e.right) }\n case 'conditional':\n return { k: 'c', t: this.expr(e.test), y: this.expr(e.whenTrue), n: this.expr(e.whenFalse) }\n case 'pipe': {\n if (!this.project.pipes.has(e.name)) this.err(e.span, `unknown pipe '${e.name}'`)\n if (e.name === 'raw' && !(whole && where === 'text')) {\n this.err(\n e.span,\n where === 'attr'\n ? \"raw isn't allowed in an attribute: it could break out of the quotes\"\n : where === 'text'\n ? 'raw must be the last pipe of the whole {{ }}: {{ value | raw }}'\n : `raw isn't allowed inside <${where === 'rcdata' ? 'title> or <textarea' : 'script'}>`,\n )\n }\n return { k: 'p', n: e.name, i: this.expr(e.input), a: e.args.map((a) => this.expr(a)) }\n }\n case 'path': {\n const p: CSeg[] = e.segments.map((s) => {\n const seg: CSeg = s.computed ? { e: this.expr(s.computed) } : { n: s.name! }\n if (s.optional) seg.o = 1\n return seg\n })\n if (LOOP_VARS.has(e.root)) {\n const loop = this.loops[this.loops.length - 1]\n if (loop === undefined) {\n this.err(e.span, `${e.root} is only available inside @for`)\n return { k: 'x' }\n }\n return { k: 'm', s: loop, w: e.root as LoopVar }\n }\n const b = this.lookup(e.root)\n if (b?.kind === 'meta') return { k: 'm', s: b.s, w: b.w! }\n if (b) return { k: 'v', s: b.s, p }\n if (this.component) {\n if (!this.warned.has(e.root)) {\n this.warned.add(e.root)\n this.warn(\n e.span,\n `'${e.root}' isn't an input of this component — declare it with @input ${e.root}`,\n )\n }\n return { k: 'x' }\n }\n return { k: 'd', n: e.root, p }\n }\n }\n }\n\n // ── nodes ─────────────────────────────────────────────────────────────\n\n nodes(list: Node[], parent?: Element): CNode[] {\n const out: CNode[] = []\n // Elements are walked with an explicit stack, so deeply nested markup\n // can't overflow the call stack; blocks and components still recurse.\n const stack: Array<{ list: Node[]; i: number; parent?: Element; close?: string }> = [\n { list, i: 0, parent },\n ]\n while (stack.length) {\n const f = stack[stack.length - 1]!\n if (f.i >= f.list.length) {\n stack.pop()\n if (f.close) out.push({ k: 's', t: f.close })\n continue\n }\n const n = f.list[f.i++]!\n if (n.k !== 'element') {\n this.node(n, out, f.parent)\n continue\n }\n const open = this.element(n, out)\n if (open) stack.push({ list: open.children, i: 0, parent: open, close: `</${open.tag}>` })\n }\n return out\n }\n\n private node(n: Node, out: CNode[], parent?: Element): void {\n switch (n.k) {\n case 'text':\n out.push({ k: 's', t: n.value })\n return\n case 'interp': {\n if (n.ctx === 'comment') {\n this.err(\n n.span,\n \"{{ }} isn't allowed inside an HTML comment — use {{-- --}} for a template comment\",\n )\n return\n }\n if (n.ctx === 'raw-text') {\n out.push(...this.rawText(n, parent))\n return\n }\n out.push({\n k: 'i',\n c: n.ctx === 'rcdata' ? 'rcdata' : 'text',\n e: this.expr(n.expr, n.ctx === 'rcdata' ? 'rcdata' : 'text', true),\n at: at(n.span),\n })\n return\n }\n case 'comment':\n for (const c of n.children) {\n if (c.k === 'interp') this.node(c, out)\n }\n out.push({\n k: 's',\n t: `<!--${n.children.map((c) => (c.k === 'text' ? c.value : '')).join('')}-->`,\n })\n return\n case 'element': {\n const open = this.element(n, out)\n if (open) out.push(...this.nodes(open.children, open), { k: 's', t: `</${open.tag}>` })\n return\n }\n case 'if':\n out.push({\n k: 'if',\n br: n.branches.map((b) =>\n this.scoped(() => {\n const cond = b.cond && this.expr(b.cond)\n let alias: number | undefined\n if (b.alias) {\n alias = this.slot()\n this.bind(b.alias, { kind: 'slot', s: alias })\n }\n const br: { c?: CExpr; a?: number; b: CNode[] } = { b: this.nodes(b.body, parent) }\n if (cond) br.c = cond\n if (alias !== undefined) br.a = alias\n return br\n }),\n ),\n })\n return\n case 'for': {\n const e = this.expr(n.of)\n const m = this.slot()\n let it: number | [number, number]\n const body = this.scoped(() => {\n if (typeof n.item === 'string') {\n it = this.slot()\n this.bind(n.item, { kind: 'slot', s: it })\n } else {\n it = [this.slot(), this.slot()]\n this.bind(n.item[0], { kind: 'slot', s: it[0] })\n this.bind(n.item[1], { kind: 'slot', s: it[1] })\n }\n for (const [name, w] of Object.entries(n.lets)) this.bind(name, { kind: 'meta', s: m, w })\n this.loops.push(m)\n try {\n return this.nodes(n.body, parent)\n } finally {\n this.loops.pop()\n }\n })\n const node: Extract<CNode, { k: 'for' }> = {\n k: 'for',\n e,\n it: it!,\n m,\n b: body,\n at: at(n.span),\n }\n if (n.empty) node.em = this.scoped(() => this.nodes(n.empty!, parent))\n out.push(node)\n return\n }\n case 'switch': {\n const node: CNode = {\n k: 'sw',\n e: this.expr(n.on),\n cs: n.cases.map((c) => ({\n e: this.expr(c.value),\n b: this.scoped(() => this.nodes(c.body, parent)),\n })),\n }\n if (n.default) node.d = this.scoped(() => this.nodes(n.default!, parent))\n out.push(node)\n return\n }\n case 'let': {\n const e = this.expr(n.expr)\n const s = this.slot()\n if (this.scopes[this.scopes.length - 1]!.has(n.name))\n this.err(n.span, `@let ${n.name} is declared twice here`)\n this.bind(n.name, { kind: 'slot', s })\n out.push({ k: 'let', s, e })\n return\n }\n case 'verbatim':\n out.push({ k: 's', t: n.text })\n return\n case 'slot-outlet':\n out.push({ k: 'o', n: n.name ?? '', fb: this.scoped(() => this.nodes(n.fallback, parent)) })\n return\n case 'slot-fill':\n this.err(\n n.span,\n \"@slot('…') { } goes at the top of a page with a layout, or inside a component tag\",\n )\n return\n case 'assets':\n out.push({ k: 'as', en: n.entry })\n }\n }\n\n /** `{{ }}` inside `<script>` / `<style>`: only a JSON script's single value. */\n private rawText(n: Extract<Node, { k: 'interp' }>, parent?: Element): CNode[] {\n const tag = parent?.tag.toLowerCase()\n const type = parent?.attrs.find((a) => a.name.toLowerCase() === 'type')\n const typeValue =\n type?.kind === 'static'\n ? String(type.parts?.[0] ?? '')\n .trim()\n .toLowerCase()\n : ''\n const isJson = tag === 'script' && JSON_SCRIPT_TYPES.has(typeValue)\n const only = parent?.children.filter((c) => !(c.k === 'text' && !c.value.trim())).length === 1\n if (isJson && only && n.expr.kind === 'pipe' && n.expr.name === 'json') {\n return [{ k: 'i', c: 'json', e: this.expr(n.expr, 'json'), at: at(n.span) }]\n }\n this.err(\n n.span,\n tag === 'script'\n ? '{{ }} isn\\'t allowed inside <script>: pass data as <script type=\"application/json\">{{ value | json }}</script>'\n : `{{ }} isn't allowed inside <${tag}>`,\n )\n return []\n }\n\n // ── elements and attributes ───────────────────────────────────────────\n\n /** Write an element's opening tag; returns it when its children and closing tag follow. */\n private element(el: Element, out: CNode[]): Element | undefined {\n const lower = el.tag.toLowerCase()\n if (!el.foreign && lower.includes('-')) {\n const names = this.tags.get(lower)\n if (names && names.length > 1) {\n this.err(el.span, `<${lower}> matches more than one component: ${names.join(', ')}`)\n return undefined\n }\n if (names) {\n this.call(el, names[0]!, out)\n return undefined\n }\n this.warn(\n el.span,\n `<${lower}> isn't a component (no ${this.project.componentsDir}/…/${lower}.kick) — it's output as a custom element`,\n )\n }\n const attrs = this.attrs(el)\n const dynamic = attrs.some((a) => a.t !== 's')\n if (dynamic || el === this.rootElement) {\n out.push({ k: 's', t: `<${el.tag}` })\n const node: Extract<CNode, { k: 'A' }> = { k: 'A', tag: el.tag, a: attrs, at: at(el.span) }\n if (el === this.rootElement) node.f = 1\n out.push(node)\n } else {\n out.push({\n k: 's',\n t: `<${el.tag}${attrs.map((a) => staticAttr(a as Extract<CAttr, { t: 's' }>)).join('')}`,\n })\n }\n if (el.void || (el.selfClosing && el.foreign)) {\n out.push({ k: 's', t: el.selfClosing ? ' />' : '>' })\n return undefined\n }\n out.push({ k: 's', t: '>' })\n return el\n }\n\n /** The single root element of a component, which takes fallthrough attributes. */\n rootElement?: Element\n\n private attrs(el: Element): CAttr[] {\n const tag = el.tag\n const out: CAttr[] = []\n const httpEquiv = el.attrs.find((a) => a.name.toLowerCase() === 'http-equiv')\n const refresh =\n tag.toLowerCase() === 'meta' &&\n httpEquiv?.kind === 'static' &&\n String(httpEquiv.parts?.[0]).trim().toLowerCase() === 'refresh'\n for (const a of el.attrs) {\n const lower = a.name.toLowerCase()\n const dynamic = a.kind !== 'static' && a.kind !== 'bare'\n if (dynamic && a.kind !== 'class' && a.kind !== 'style') {\n if (lower.startsWith('on')) {\n this.err(\n a.span,\n `${a.name} can't be interpolated: event handler attributes run their value as script`,\n )\n continue\n }\n if (lower === 'srcdoc') {\n this.err(a.span, \"srcdoc can't be interpolated: its value is a whole HTML document\")\n continue\n }\n if (lower === 'style') {\n this.err(\n a.span,\n 'style can\\'t be interpolated — bind one property with [style.prop]=\"value\"',\n )\n continue\n }\n if (lower === 'class' && a.kind === 'interp') {\n this.err(\n a.span,\n 'class can\\'t be interpolated — add classes with [class.name]=\"condition\"',\n )\n continue\n }\n if (ANIMATION.has(tag.toLowerCase()) && ANIMATION_VALUES.has(lower)) {\n this.err(\n a.span,\n `${a.name} can't be interpolated on <${tag}>: an animation can set href to a javascript: URL`,\n )\n continue\n }\n if (refresh && lower === 'content') {\n this.err(\n a.span,\n \"a refresh <meta>'s content can't be interpolated: it holds a URL to navigate to\",\n )\n continue\n }\n }\n const url = isUrlAttr(tag, a.name) ? (lower === 'srcset' ? 'srcset' : 'url') : undefined\n // A binding whose expression didn't parse: the parser already reported it.\n if ((a.kind === 'bind' || a.kind === 'class' || a.kind === 'style') && !a.expr) continue\n switch (a.kind) {\n case 'bare':\n out.push({ t: 's', n: a.name, v: true })\n break\n case 'static':\n out.push({ t: 's', n: a.name, v: String(a.parts?.[0] ?? '') })\n break\n case 'interp': {\n const node: CAttr = {\n t: 'i',\n n: a.name,\n p: a.parts!.map((p) => (typeof p === 'string' ? p : this.expr(p, 'attr'))),\n }\n if (url) node.u = url\n out.push(node)\n break\n }\n case 'bind': {\n const node: CAttr = { t: 'b', n: a.name, e: this.expr(a.expr!, 'attr') }\n if (url) node.u = url\n out.push(node)\n break\n }\n case 'class':\n out.push({ t: 'c', n: a.name, e: this.expr(a.expr!, 'attr') })\n break\n case 'style': {\n const node: CAttr = { t: 'y', n: a.name, e: this.expr(a.expr!, 'attr') }\n if (a.unit) node.x = a.unit\n out.push(node)\n break\n }\n }\n }\n return out\n }\n\n // ── components ────────────────────────────────────────────────────────\n\n signature(name: string): Signature {\n const cached = this.signatures.get(name)\n if (cached) return cached\n const ast = this.project.templates.get(name)!\n const outlets = new Set<string>()\n const stack: Node[][] = [ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'slot-outlet') {\n outlets.add(n.name ?? '')\n stack.push(n.fallback)\n } else if (n.k === 'element' || n.k === 'comment') stack.push(n.children)\n else if (n.k === 'if') for (const b of n.branches) stack.push(b.body)\n else if (n.k === 'for') stack.push(n.body, n.empty ?? [])\n else if (n.k === 'switch') stack.push(...n.cases.map((c) => c.body), n.default ?? [])\n else if (n.k === 'slot-fill') stack.push(n.body)\n }\n }\n const sig: Signature = {\n name,\n inputs: new Map(\n ast.inputs.map((i) => [i.name, { required: !i.default, def: i.default?.value }]),\n ),\n outlets,\n roots: rootElements(ast.body).length,\n }\n this.signatures.set(name, sig)\n return sig\n }\n\n private call(el: Element, name: string, out: CNode[]): void {\n const sig = this.signature(name)\n const target = this.project.templates.get(name)!\n const slotOf = new Map<string, number>()\n target.inputs.forEach((i, idx) => slotOf.set(i.name, idx))\n const inputs: Array<{ s: number; e: CExpr }> = []\n const given = new Set<string>()\n const fallthrough: Attr[] = []\n for (const a of el.attrs) {\n if (isFallthrough(a)) {\n fallthrough.push(a)\n continue\n }\n const input = sig.inputs.has(a.name) ? a.name : camel(a.name)\n if (!sig.inputs.has(input)) {\n this.err(\n a.span,\n `unknown input '${a.name}' on <${el.tag}> — its inputs are ${[...sig.inputs.keys()].join(', ') || 'none'}`,\n )\n continue\n }\n if (a.kind === 'bind' && !a.expr) continue\n given.add(input)\n let e: CExpr\n if (a.kind === 'bind') e = this.expr(a.expr!)\n else if (a.kind === 'bare') e = { k: 'l', v: true }\n else if (a.kind === 'static') {\n const v = String(a.parts?.[0] ?? '')\n if (typeof sig.inputs.get(input)!.def === 'boolean' && (v === 'true' || v === 'false')) {\n this.warn(\n a.span,\n `${a.name}=\"${v}\" passes the string \"${v}\", which is truthy — write [${a.name}]=\"${v}\"`,\n )\n }\n // Text passed to an input is data: entities decoded here, the value\n // escaped wherever it's printed.\n e = { k: 'l', v: decodeEntities(v) }\n } else if (a.kind === 'interp') {\n e = a.parts!.reduce<CExpr>(\n (acc, p) => ({\n k: 'b',\n o: '+',\n l: acc,\n r: typeof p === 'string' ? { k: 'l', v: decodeEntities(p) } : this.expr(p),\n }),\n { k: 'l', v: '' },\n )\n } else {\n this.err(a.span, `[${a.kind}.${a.name}] goes on the component's root element, not an input`)\n continue\n }\n inputs.push({ s: slotOf.get(input)!, e })\n }\n for (const [input, info] of sig.inputs) {\n if (info.required && !given.has(input))\n this.err(el.span, `missing input '${input}' on <${el.tag}>`)\n }\n if (fallthrough.length && sig.roots !== 1) {\n this.err(\n fallthrough[0]!.span,\n `<${el.tag}> passes ${fallthrough.map((a) => a.name).join(', ')} to its root element, but ${name}.kick needs exactly one root element for that`,\n )\n }\n // Slot content: `@slot('x') { }` fills, the rest is the default slot. It\n // is compiled here, in the caller's scope.\n const fills: Record<string, CNode[]> = {}\n const rest: Node[] = []\n for (const c of el.children) {\n if (c.k !== 'slot-fill') {\n rest.push(c)\n continue\n }\n if (c.name in fills) this.err(c.span, `slot '${c.name}' is filled twice`)\n else if (!sig.outlets.has(c.name)) this.err(c.span, `<${el.tag}> has no slot '${c.name}'`)\n fills[c.name] = this.scoped(() => this.nodes(c.body))\n }\n if (rest.some((c) => !(c.k === 'text' && !c.value.trim()))) {\n if (!sig.outlets.has('')) {\n this.err(el.span, `<${el.tag}> has no default <slot /> for the content inside it`)\n } else {\n fills[''] = this.scoped(() => this.nodes(rest))\n }\n }\n const fa = this.attrs({ ...el, attrs: fallthrough })\n out.push({ k: 'cmp', n: name, in: inputs, fa, f: fills, at: at(el.span) })\n }\n\n // ── layouts ───────────────────────────────────────────────────────────\n\n /** The outlets a page can fill: its layout chain's. Reports bad names and cycles. */\n layoutChain(start: string | undefined, span: Span, page: string): Set<string> | undefined {\n const outlets = new Set<string>()\n const seen = [page]\n let name = start\n while (name) {\n if (!templateName(name)) {\n this.err(span, `'${name}' isn't a valid template name`)\n return undefined\n }\n if (seen.includes(name)) {\n this.err(span, `layout cycle: ${[...seen, name].join(' → ')}`)\n return undefined\n }\n const ast = this.project.templates.get(name)\n if (!ast) {\n this.err(span, `layout '${name}' not found`)\n return undefined\n }\n seen.push(name)\n for (const o of this.signature(name).outlets) outlets.add(o)\n name = ast.layout ?? undefined\n }\n return outlets\n }\n}\n\n/** Top-level elements, or -1 per other non-whitespace output (text, blocks). */\nfunction rootElements(body: Node[]): Array<Element | null> {\n const roots: Array<Element | null> = []\n for (const n of body) {\n if (n.k === 'text' && !n.value.trim()) continue\n if (n.k === 'comment' || n.k === 'let') continue\n roots.push(n.k === 'element' ? n : null)\n }\n return roots\n}\n\n/** An attribute as the author wrote it (entities kept), double-quoted. */\nfunction staticAttr(a: Extract<CAttr, { t: 's' }>): string {\n return a.v === true ? ` ${a.n}` : ` ${a.n}=\"${a.v.replace(/\"/g, '"')}\"`\n}\n\nconst at = (span: Span): [number, number] => [span.start.line, span.start.column]\n\nconst zero: Span = {\n start: { offset: 0, line: 1, column: 1 },\n end: { offset: 0, line: 1, column: 1 },\n}\n\n/** Check one template of `project` by name. */\nexport function check(name: string, project: Project): CheckResult {\n const ast = project.templates.get(name)\n if (!ast || !templateName(name)) {\n return { diagnostics: [error(`${name}.kick`, zero, `template '${name}' not found`)] }\n }\n const component = isComponent(name, project.componentsDir)\n const c = new Checker(project, ast, component)\n\n if (!component && ast.inputs.length) {\n for (const i of ast.inputs)\n c.diagnostics.push(error(ast.file, i.span, 'only components declare @input'))\n }\n const inputs = ast.inputs.map((i, idx) => {\n const s = idx\n const entry: CheckedTemplate['inputs'][number] = { n: i.name, s, r: !i.default }\n if (i.default) entry.d = i.default.value\n return entry\n })\n // Input slots come first, in declaration order.\n c.slots = inputs.length\n for (const i of inputs) c.bind(i.n, { kind: 'slot', s: i.s })\n\n if (component) {\n const roots = rootElements(ast.body)\n if (roots.length === 1 && roots[0]) c.rootElement = roots[0]\n }\n\n // A page's top-level `@slot` blocks fill its layout's outlets.\n const fills: Record<string, CNode[]> = {}\n const body: Node[] = []\n const fillNodes: Array<Extract<Node, { k: 'slot-fill' }>> = []\n for (const n of ast.body) {\n if (n.k === 'slot-fill' && !component) fillNodes.push(n)\n else body.push(n)\n }\n\n const base = project.baseLayout\n if (base !== undefined && !project.templates.has(base)) {\n c.diagnostics.push(error(ast.file, zero, `base layout '${base}' not found`))\n }\n // A page's own @layout wins; otherwise the configured mapping applies —\n // to pages, not to components or to templates configured as layouts.\n const mapped =\n component || configuredLayouts(project).has(name)\n ? undefined\n : layoutResolver(project.layouts)(name)\n const layoutName = ast.layout === undefined ? mapped : (ast.layout ?? undefined)\n let outlets =\n layoutName === undefined ? undefined : c.layoutChain(layoutName, ast.layoutSpan ?? zero, name)\n // The base layout wraps the chain, so its outlets are fillable too.\n if (\n base !== undefined &&\n ast.layout !== null &&\n !component &&\n name !== base &&\n project.templates.has(base)\n ) {\n outlets = new Set([...(outlets ?? []), ...c.signature(base).outlets])\n }\n\n for (const f of fillNodes) {\n if (f.name in fills) {\n c.diagnostics.push(error(ast.file, f.span, `slot '${f.name}' is filled twice`))\n continue\n }\n if (!outlets) {\n // No layout is known here — a build that doesn't have the app's\n // mapping, say. Kept, and filled if the page gets a layout with it.\n c.diagnostics.push(warning(ast.file, f.span, `@slot('${f.name}') has no layout to fill here`))\n fills[f.name] = optimize(c.nodes(f.body))\n continue\n }\n if (!outlets.has(f.name)) {\n c.diagnostics.push(error(ast.file, f.span, `the layout has no slot '${f.name}'`))\n continue\n }\n fills[f.name] = optimize(c.nodes(f.body))\n }\n\n const template: CheckedTemplate = {\n v: AST_FORMAT_VERSION,\n name,\n file: ast.file,\n slots: 0,\n inputs,\n fills,\n body: optimize(c.nodes(body)),\n }\n template.slots = c.slots\n if (ast.layout !== undefined) template.layout = ast.layout\n const failed = c.diagnostics.some((d) => d.severity === 'error')\n return failed ? { diagnostics: c.diagnostics } : { template, diagnostics: c.diagnostics }\n}\n","/**\n * The template expression language: property paths, literals, comparisons,\n * logic, `??`, the ternary and pipes. Nothing that calls, assigns or\n * constructs — a template reads data, the controller computes it.\n */\nimport type { Expr, PathSegment } from '../ast'\nimport { advance, error, type Diagnostic, type Pos, type Span } from '../diagnostics'\n\nexport type { Expr } from '../ast'\n\n/** Property names a template never reads, even through `[...]` (checked at runtime). */\nexport const FORBIDDEN_NAMES: ReadonlySet<string> = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n])\n\nconst KEYWORDS: Record<string, string> = {\n new: 'constructing objects',\n typeof: '`typeof`',\n instanceof: '`instanceof`',\n in: '`in`',\n delete: '`delete`',\n void: '`void`',\n function: 'functions',\n class: 'classes',\n await: '`await`',\n yield: '`yield`',\n this: '`this`',\n}\n\n/** Characters and operators the language has no place for, with why. */\nconst FORBIDDEN_PUNCT: Record<string, string> = {\n '(': 'calls',\n '=': 'assignment',\n '=>': 'functions',\n '*': '`*`',\n '/': '`/`',\n '%': '`%`',\n '`': 'template literals',\n '{': 'object literals',\n '}': '`}`',\n '...': 'spread',\n ';': '`;`',\n ',': '`,`',\n '&': '`&`',\n '^': '`^`',\n '~': '`~`',\n}\n\n// Longest first, so `===` wins over `==` over `=`.\nconst PUNCT = [\n '===',\n '!==',\n '...',\n '?.',\n '??',\n '==',\n '!=',\n '<=',\n '>=',\n '&&',\n '||',\n '=>',\n '?',\n ':',\n '|',\n '!',\n '<',\n '>',\n '+',\n '-',\n '.',\n '[',\n ']',\n '(',\n ')',\n '=',\n '*',\n '/',\n '%',\n '`',\n '{',\n '}',\n ';',\n ',',\n '&',\n '^',\n '~',\n]\n\ntype Token =\n | { t: 'ident'; v: string; start: number; end: number }\n | { t: 'num'; v: number; start: number; end: number }\n | { t: 'str'; v: string; start: number; end: number }\n | { t: 'punct'; v: string; start: number; end: number }\n | { t: 'eof'; v: ''; start: number; end: number }\n\nclass Fail extends Error {\n constructor(\n readonly start: number,\n readonly end: number,\n message: string,\n ) {\n super(message)\n }\n}\n\nconst ESCAPES: Record<string, string> = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\"': '\"',\n n: '\\n',\n t: '\\t',\n r: '\\r',\n}\n\nfunction tokenize(src: string): Token[] {\n const out: Token[] = []\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n if (/\\s/.test(c)) {\n i++\n continue\n }\n const start = i\n if (/[A-Za-z_$]/.test(c)) {\n while (i < src.length && /[\\w$]/.test(src[i]!)) i++\n out.push({ t: 'ident', v: src.slice(start, i), start, end: i })\n continue\n }\n if (/\\d/.test(c)) {\n while (i < src.length && /\\d/.test(src[i]!)) i++\n if (src[i] === '.' && /\\d/.test(src[i + 1] ?? '')) {\n i++\n while (i < src.length && /\\d/.test(src[i]!)) i++\n }\n out.push({ t: 'num', v: Number(src.slice(start, i)), start, end: i })\n continue\n }\n if (c === \"'\" || c === '\"') {\n let v = ''\n i++\n while (i < src.length && src[i] !== c) {\n if (src[i] === '\\\\') {\n const e = src[i + 1] ?? ''\n if (e === 'u') {\n const hex = src.slice(i + 2, i + 6)\n if (!/^[0-9a-fA-F]{4}$/.test(hex))\n throw new Fail(i, i + 2, 'a \\\\u escape needs four hex digits')\n v += String.fromCharCode(parseInt(hex, 16))\n i += 6\n continue\n }\n if (!(e in ESCAPES)) throw new Fail(i, i + 2, `unknown escape \\\\${e}`)\n v += ESCAPES[e]\n i += 2\n continue\n }\n v += src[i]\n i++\n }\n if (i >= src.length) throw new Fail(start, i, 'unterminated string')\n i++\n out.push({ t: 'str', v, start, end: i })\n continue\n }\n const p = PUNCT.find((op) => src.startsWith(op, i))\n if (!p) throw new Fail(i, i + 1, `unexpected character '${c}'`)\n i += p.length\n out.push({ t: 'punct', v: p, start, end: i })\n }\n out.push({ t: 'eof', v: '', start: src.length, end: src.length })\n return out\n}\n\n// Binding powers, lowest first (spec §3): pipe, ternary, ??, ||, &&, equality,\n// relational, additive, unary, member.\nconst BP = { pipe: 1, ternary: 2, nullish: 3, or: 4, and: 5, eq: 6, rel: 7, add: 8, unary: 9 }\n\nconst BINARY: Record<string, [number, Expr['kind']]> = {\n '??': [BP.nullish, 'logical'],\n '||': [BP.or, 'logical'],\n '&&': [BP.and, 'logical'],\n '==': [BP.eq, 'binary'],\n '!=': [BP.eq, 'binary'],\n '===': [BP.eq, 'binary'],\n '!==': [BP.eq, 'binary'],\n '<': [BP.rel, 'binary'],\n '>': [BP.rel, 'binary'],\n '<=': [BP.rel, 'binary'],\n '>=': [BP.rel, 'binary'],\n '+': [BP.add, 'binary'],\n '-': [BP.add, 'binary'],\n}\n\nclass Parser {\n private i = 0\n constructor(\n private readonly src: string,\n private readonly base: Pos,\n private readonly tokens: Token[],\n ) {}\n\n private peek(): Token {\n return this.tokens[this.i]!\n }\n private next(): Token {\n return this.tokens[this.i++]!\n }\n private span(start: number, end: number): Span {\n return { start: advance(this.base, this.src, start), end: advance(this.base, this.src, end) }\n }\n private isPunct(v: string): boolean {\n const t = this.peek()\n return t.t === 'punct' && t.v === v\n }\n private expect(v: string): Token {\n const t = this.peek()\n if (t.t !== 'punct' || t.v !== v) {\n throw new Fail(\n t.start,\n t.end,\n t.t === 'eof' ? `expected '${v}'` : `expected '${v}', found '${this.text(t)}'`,\n )\n }\n return this.next()\n }\n private text(t: Token): string {\n return this.src.slice(t.start, t.end)\n }\n private forbidden(t: Token): never {\n const what = t.t === 'punct' ? FORBIDDEN_PUNCT[t.v] : KEYWORDS[t.v]\n throw new Fail(t.start, t.end, `${what ?? `'${this.text(t)}'`} aren't allowed in templates`)\n }\n\n parseAll(): Expr {\n const e = this.expr(0)\n const t = this.peek()\n if (t.t !== 'eof') {\n if (\n (t.t === 'punct' && Object.hasOwn(FORBIDDEN_PUNCT, t.v)) ||\n (t.t === 'ident' && Object.hasOwn(KEYWORDS, t.v))\n ) {\n this.forbidden(t)\n }\n throw new Fail(t.start, t.end, `unexpected '${this.text(t)}'`)\n }\n return e\n }\n\n private expr(min: number): Expr {\n let left = this.prefix()\n for (;;) {\n const t = this.peek()\n if (t.t === 'ident' && (t.v === 'in' || t.v === 'instanceof')) this.forbidden(t)\n if (t.t !== 'punct') break\n if (t.v === '|') {\n if (min > BP.pipe) break\n this.next()\n const name = this.next()\n if (name.t !== 'ident') throw new Fail(name.start, name.end, 'expected a pipe name after |')\n const args: Expr[] = []\n while (this.isPunct(':')) {\n this.next()\n args.push(this.expr(BP.nullish))\n if (this.isPunct('?')) {\n const q = this.peek()\n throw new Fail(q.start, q.end, 'wrap a conditional pipe argument in parentheses')\n }\n }\n left = { kind: 'pipe', input: left, name: name.v, args, span: this.join(left, name.end) }\n continue\n }\n if (t.v === '?') {\n if (min > BP.ternary) break\n this.next()\n const whenTrue = this.expr(BP.ternary)\n this.expect(':')\n const whenFalse = this.expr(BP.ternary)\n left = {\n kind: 'conditional',\n test: left,\n whenTrue,\n whenFalse,\n span: this.joinExpr(left, whenFalse),\n }\n continue\n }\n const bin = BINARY[t.v]\n if (bin) {\n const [bp, kind] = bin\n if (bp < min) break\n this.next()\n const right = this.expr(bp + 1)\n left = { kind, op: t.v, left, right, span: this.joinExpr(left, right) } as Expr\n continue\n }\n if (Object.hasOwn(FORBIDDEN_PUNCT, t.v)) this.forbidden(t)\n break\n }\n return left\n }\n\n private join(left: Expr, end: number): Span {\n return { start: left.span.start, end: advance(this.base, this.src, end) }\n }\n private joinExpr(left: Expr, right: Expr): Span {\n return { start: left.span.start, end: right.span.end }\n }\n\n private prefix(): Expr {\n const t = this.next()\n switch (t.t) {\n case 'num':\n return { kind: 'literal', value: t.v, span: this.span(t.start, t.end) }\n case 'str':\n return { kind: 'literal', value: t.v, span: this.span(t.start, t.end) }\n case 'ident': {\n if (Object.hasOwn(KEYWORDS, t.v)) this.forbidden(t)\n if (t.v === 'true' || t.v === 'false') {\n return { kind: 'literal', value: t.v === 'true', span: this.span(t.start, t.end) }\n }\n if (t.v === 'null') return { kind: 'literal', value: null, span: this.span(t.start, t.end) }\n if (FORBIDDEN_NAMES.has(t.v))\n throw new Fail(t.start, t.end, `'${t.v}' is not allowed in templates`)\n return this.path(t)\n }\n case 'punct': {\n if (t.v === '!' || t.v === '-') {\n const arg = this.expr(BP.unary)\n return {\n kind: 'unary',\n op: t.v,\n arg,\n span: { start: this.span(t.start, t.end).start, end: arg.span.end },\n }\n }\n if (t.v === '(') {\n const e = this.expr(0)\n this.expect(')')\n if (this.isPunct('.') || this.isPunct('[') || this.isPunct('?.')) {\n const m = this.peek()\n throw new Fail(\n m.start,\n m.end,\n 'property access needs a name in front: (…).x is not allowed',\n )\n }\n return e\n }\n if (t.v === '[')\n throw new Fail(t.start, t.end, \"array literals aren't allowed in templates\")\n if (Object.hasOwn(FORBIDDEN_PUNCT, t.v)) this.forbidden(t)\n throw new Fail(t.start, t.end, `unexpected '${t.v}'`)\n }\n case 'eof':\n throw new Fail(t.start, t.end, 'expected an expression')\n }\n }\n\n private path(root: Token & { t: 'ident' }): Expr {\n const segments: PathSegment[] = []\n let end = root.end\n for (;;) {\n const t = this.peek()\n if (t.t !== 'punct') break\n if (t.v === '.' || t.v === '?.') {\n this.next()\n const optional = t.v === '?.'\n if (optional && this.isPunct('[')) {\n this.next()\n const computed = this.expr(0)\n end = this.expect(']').end\n segments.push({ computed, optional })\n continue\n }\n if (optional && this.isPunct('(')) this.forbidden(this.peek())\n const name = this.next()\n if (name.t !== 'ident') throw new Fail(name.start, name.end, 'expected a property name')\n if (FORBIDDEN_NAMES.has(name.v)) {\n throw new Fail(name.start, name.end, `'${name.v}' is not allowed in templates`)\n }\n segments.push({ name: name.v, optional })\n end = name.end\n continue\n }\n if (t.v === '[') {\n this.next()\n const computed = this.expr(0)\n end = this.expect(']').end\n segments.push({ computed, optional: false })\n continue\n }\n if (t.v === '(') this.forbidden(t)\n break\n }\n return { kind: 'path', root: root.v, segments, span: this.span(root.start, end) }\n }\n}\n\n/**\n * Parse one expression. `base` is where `src` starts in the template, so\n * positions in diagnostics and spans point into the template file.\n */\nexport function parseExpression(\n src: string,\n file: string,\n base: Pos,\n): { expr?: Expr; diagnostics: Diagnostic[] } {\n try {\n const tokens = tokenize(src)\n return { expr: new Parser(src, base, tokens).parseAll(), diagnostics: [] }\n } catch (err) {\n if (!(err instanceof Fail)) throw err\n const span = { start: advance(base, src, err.start), end: advance(base, src, err.end) }\n return { diagnostics: [error(file, span, err.message)] }\n }\n}\n","/**\n * The `.kick` template parser: HTML-aware, because where a value lands\n * decides how it is escaped (spec §2). One pass over the source, with a stack\n * of open elements and blocks.\n */\nimport type {\n Attr,\n Ctx,\n Element,\n Expr,\n IfBranch,\n InputDecl,\n LoopVar,\n Node,\n TemplateAst,\n} from '../ast'\nimport { error, warning, type Diagnostic, type Pos, type Span } from '../diagnostics'\nimport { parseExpression } from './expression'\n\nexport type { Attr, Element, Node, TemplateAst } from '../ast'\n\nexport interface ParseResult {\n ast: TemplateAst\n diagnostics: Diagnostic[]\n}\n\nconst VOID = new Set(\n 'area base br col embed hr img input link meta param source track wbr'.split(' '),\n)\nconst RAW_TEXT = new Set(['script', 'style'])\nconst RCDATA = new Set(['title', 'textarea'])\n/**\n * Inside SVG and MathML, these elements' children follow HTML rules again\n * (HTML integration points), so `<textarea>` under `<foreignObject>` is RCDATA.\n */\nconst INTEGRATION_POINTS = new Set(['foreignobject', 'desc', 'title', 'annotation-xml'])\nconst KEYWORDS =\n /^@(if|else|for|empty|switch|case|default|let|layout|input|slot|verbatim|assets)(?![\\w$-])/\nconst LOOP_VARS = new Set<LoopVar>(['$index', '$first', '$last', '$even', '$odd', '$count'])\n\ntype Frame =\n | { type: 'root'; children: Node[] }\n | { type: 'element'; el: Element; children: Node[]; name: string }\n | { type: 'slot'; children: Node[] }\n | {\n type: 'block'\n children: Node[]\n /** What may follow its closing brace. */\n next?: 'else' | 'empty'\n node: Node\n keyword: string\n start: number\n }\n | { type: 'switch'; node: Extract<Node, { k: 'switch' }>; start: number }\n\nclass Fatal extends Error {}\n\nclass TemplateParser {\n private i = 0\n private text = ''\n private textStart = 0\n private seenOutput = false\n private readonly lineStarts: number[] = [0]\n readonly diagnostics: Diagnostic[] = []\n readonly ast: TemplateAst\n private readonly frames: Frame[]\n\n constructor(\n private readonly s: string,\n private readonly file: string,\n ) {\n for (let j = 0; j < s.length; j++) {\n const c = s.charCodeAt(j)\n if (c === 10 || (c === 13 && s.charCodeAt(j + 1) !== 10)) this.lineStarts.push(j + 1)\n }\n this.ast = { file, inputs: [], body: [] }\n this.frames = [{ type: 'root', children: this.ast.body }]\n }\n\n // ── positions and diagnostics ─────────────────────────────────────────\n\n pos(offset: number): Pos {\n let lo = 0\n let hi = this.lineStarts.length - 1\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1\n if (this.lineStarts[mid]! <= offset) lo = mid\n else hi = mid - 1\n }\n return { offset, line: lo + 1, column: offset - this.lineStarts[lo]! + 1 }\n }\n private span(start: number, end: number): Span {\n return { start: this.pos(start), end: this.pos(end) }\n }\n private err(start: number, end: number, message: string): void {\n this.diagnostics.push(error(this.file, this.span(start, end), message))\n }\n private warn(start: number, end: number, message: string): void {\n this.diagnostics.push(warning(this.file, this.span(start, end), message))\n }\n private fatal(start: number, end: number, message: string): never {\n this.err(start, end, message)\n throw new Fatal()\n }\n\n private expr(src: string, start: number): Expr | undefined {\n const r = parseExpression(src, this.file, this.pos(start))\n this.diagnostics.push(...r.diagnostics)\n return r.expr\n }\n\n // ── output ────────────────────────────────────────────────────────────\n\n private get top(): Frame {\n return this.frames[this.frames.length - 1]!\n }\n private children(): Node[] {\n const f = this.top\n if (f.type === 'switch') return []\n return f.children\n }\n private flush(): void {\n if (this.text) {\n if (/\\S/.test(this.text)) this.seenOutput = true\n this.children().push({ k: 'text', value: this.text, span: this.span(this.textStart, this.i) })\n this.text = ''\n }\n }\n private emit(node: Node): void {\n this.flush()\n if (node.k !== 'let' && node.k !== 'slot-fill') this.seenOutput = true\n this.children().push(node)\n }\n private addText(chunk: string, at: number): void {\n if (!this.text) this.textStart = at\n this.text += chunk\n }\n\n private inPre(): boolean {\n return this.frames.some((f) => f.type === 'element' && f.name === 'pre')\n }\n\n /**\n * A block token alone on its line (only spaces or tabs around it) is\n * removed with its line break, so the output has no blank lines where the\n * template had `@if (…) {` and `}`. Returns where parsing continues.\n */\n private standalone(tokenStart: number, tokenEnd: number): number {\n if (this.inPre()) return tokenEnd\n let a = tokenStart\n while (a > 0 && (this.s[a - 1] === ' ' || this.s[a - 1] === '\\t')) a--\n if (a > 0 && this.s[a - 1] !== '\\n' && this.s[a - 1] !== '\\r') return tokenEnd\n let b = tokenEnd\n while (b < this.s.length && (this.s[b] === ' ' || this.s[b] === '\\t')) b++\n if (b < this.s.length && this.s[b] !== '\\n' && this.s[b] !== '\\r') return tokenEnd\n const lead = tokenStart - a\n if (lead && this.text.endsWith(this.s.slice(a, tokenStart))) {\n this.text = this.text.slice(0, -lead)\n }\n if (this.s[b] === '\\r') b++\n if (this.s[b] === '\\n') b++\n return b\n }\n\n // ── main loop ─────────────────────────────────────────────────────────\n\n run(): void {\n try {\n while (this.i < this.s.length) {\n if (this.top.type === 'switch') this.switchBody()\n else this.step()\n }\n this.flush()\n for (const f of this.frames) {\n if (f.type === 'block' || f.type === 'switch') {\n this.err(\n f.start,\n f.start + 1,\n `@${f.type === 'block' ? f.keyword : 'switch'} is never closed — expected }`,\n )\n }\n }\n } catch (e) {\n if (!(e instanceof Fatal)) throw e\n }\n }\n\n private step(): void {\n const s = this.s\n const i = this.i\n const c = s[i]!\n if (c === '{' && s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n if (end < 0) this.fatal(i, i + 4, 'template comment is never closed — expected --}}')\n this.i = end + 4\n return\n }\n if (c === '{' && s[i + 1] === '{') {\n this.interp(i, 'text')\n return\n }\n if (c === '<') {\n if (s.startsWith('<!--', i)) return this.htmlComment(i)\n if (s[i + 1] === '/' && /[A-Za-z]/.test(s[i + 2] ?? '')) return this.closeTag(i)\n if (/[A-Za-z]/.test(s[i + 1] ?? '')) return this.openTag(i)\n if (s[i + 1] === '{') this.fatal(i, i + 2, \"tag names can't be interpolated\")\n }\n if (c === '@') {\n const m = KEYWORDS.exec(s.slice(i, i + 12))\n if (m && this.block(m[1]!, i)) return\n }\n if (c === '}' && this.frames.some((f) => f.type === 'block')) {\n this.closeBlock(i)\n return\n }\n this.addText(c, i)\n this.i++\n }\n\n // ── interpolation ─────────────────────────────────────────────────────\n\n /** `{{ expr }}` at `i`; returns the end offset. */\n private interpSource(i: number): { src: string; at: number; end: number } {\n const at = i + 2\n let j = at\n let quote = ''\n while (j < this.s.length) {\n const ch = this.s[j]!\n if (quote) {\n if (ch === '\\\\') j++\n else if (ch === quote) quote = ''\n } else if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === '}' && this.s[j + 1] === '}') {\n return { src: this.s.slice(at, j), at, end: j + 2 }\n }\n j++\n }\n this.fatal(i, i + 2, 'interpolation is never closed — expected }}')\n }\n\n private interp(i: number, ctx: Ctx): void {\n const { src, at, end } = this.interpSource(i)\n const expr = this.expr(src, at)\n if (expr) this.emit({ k: 'interp', expr, ctx, span: this.span(i, end) })\n this.i = end\n }\n\n /** Text with `{{ }}` (raw text, rcdata, comments) up to `stop`. */\n private textWithInterps(from: number, stop: number, ctx: Ctx): Node[] {\n const out: Node[] = []\n let j = from\n let start = from\n while (j < stop) {\n if (this.s.startsWith('{{--', j)) {\n if (j > start)\n out.push({ k: 'text', value: this.s.slice(start, j), span: this.span(start, j) })\n const end = this.s.indexOf('--}}', j + 4)\n j = start = end < 0 || end > stop ? stop : end + 4\n continue\n }\n if (this.s.startsWith('{{', j)) {\n if (j > start)\n out.push({ k: 'text', value: this.s.slice(start, j), span: this.span(start, j) })\n const { src, at, end } = this.interpSource(j)\n const expr = this.expr(src, at)\n if (expr) out.push({ k: 'interp', expr, ctx, span: this.span(j, end) })\n j = start = end\n continue\n }\n j++\n }\n if (stop > start)\n out.push({ k: 'text', value: this.s.slice(start, stop), span: this.span(start, stop) })\n return out\n }\n\n private htmlComment(i: number): void {\n const end = this.s.indexOf('-->', i + 4)\n if (end < 0) this.fatal(i, i + 4, 'HTML comment is never closed — expected -->')\n this.emit({\n k: 'comment',\n children: this.textWithInterps(i + 4, end, 'comment'),\n span: this.span(i, end + 3),\n })\n this.i = end + 3\n }\n\n // ── tags ──────────────────────────────────────────────────────────────\n\n private openTag(i: number): void {\n const s = this.s\n const m = /^<([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 200))!\n const tag = m[1]!\n let j = i + m[0].length\n const parent = this.frames.findLast((f) => f.type === 'element') as\n | Extract<Frame, { type: 'element' }>\n | undefined\n const lower = tag.toLowerCase()\n const inForeign = !!parent?.el.foreign && !INTEGRATION_POINTS.has(parent.el.tag.toLowerCase())\n const foreign = inForeign || lower === 'svg' || lower === 'math'\n const attrs: Attr[] = []\n let selfClosing = false\n for (;;) {\n while (j < s.length && /\\s/.test(s[j]!)) j++\n if (j >= s.length) this.fatal(i, i + m[0].length, `<${tag}> is never closed — expected >`)\n if (s[j] === '>') {\n j++\n break\n }\n if (s[j] === '/' && s[j + 1] === '>') {\n selfClosing = true\n j += 2\n break\n }\n j = this.attr(j, attrs)\n }\n this.i = j\n const name = foreign ? tag : lower\n const el: Element = {\n k: 'element',\n tag,\n attrs,\n children: [],\n foreign,\n void: !foreign && VOID.has(lower),\n selfClosing,\n span: this.span(i, j),\n }\n if (!foreign && lower === 'slot') {\n const nameAttr = attrs.find((a) => a.name === 'name')\n const slotName = nameAttr?.kind === 'static' ? String(nameAttr.parts?.[0] ?? '') : undefined\n if (nameAttr && nameAttr.kind !== 'static') {\n this.err(\n nameAttr.span.start.offset,\n nameAttr.span.end.offset,\n 'a slot name must be plain text',\n )\n }\n const node: Node = { k: 'slot-outlet', name: slotName, fallback: [], span: el.span }\n this.emit(node)\n if (!selfClosing) this.frames.push({ type: 'slot', children: node.fallback })\n return\n }\n this.emit(el)\n if (el.void || selfClosing) return\n // `<script>` and `<style>` are raw text everywhere: a browser runs an SVG\n // `<script>` too, and HTML-escaping means nothing inside one.\n if (RAW_TEXT.has(lower) || (!foreign && RCDATA.has(lower))) {\n // Where a browser ends it: `</script` followed by whitespace, `/` or `>`\n // — `</scriptx` doesn't.\n const end = new RegExp(`</${lower}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i')\n end.lastIndex = 0\n const found = end.exec(s.slice(j))\n const close = found ? j + found.index : -1\n const stop = close < 0 ? s.length : close\n if (RAW_TEXT.has(lower)) {\n // Content a browser reads differently from a plain scan: `<!--` with\n // `<script` inside a script keeps it open past `</script>`, and CDATA\n // in SVG hides a close tag. Refused rather than guessed.\n const content = s.slice(j, stop)\n if (foreign && content.includes('<')) {\n // Inside SVG and MathML a browser parses script and style content\n // as markup, so any `<` there could hide the close tag from us.\n this.err(\n j,\n stop,\n `markup isn't allowed inside <${lower}> in SVG or MathML — move the code to a separate file`,\n )\n } else if (\n /<!\\[CDATA\\[/i.test(content) ||\n (lower === 'script' && /<!--/.test(content) && /<script/i.test(content))\n ) {\n this.err(\n j,\n stop,\n `this <${lower}> content (<!-- with <script, or CDATA) is read differently by browsers — move it to a separate file`,\n )\n }\n }\n el.children = this.textWithInterps(j, stop, RAW_TEXT.has(lower) ? 'raw-text' : 'rcdata')\n if (close < 0) {\n this.i = s.length\n return\n }\n const gt = s.indexOf('>', close)\n this.i = gt < 0 ? s.length : gt + 1\n return\n }\n this.frames.push({ type: 'element', el, children: el.children, name })\n }\n\n /** One attribute at `j`; returns where the next one starts. */\n private attr(j: number, attrs: Attr[]): number {\n const s = this.s\n const start = j\n if (s.startsWith('{{', j)) this.fatal(j, j + 2, \"attribute names can't be interpolated\")\n while (j < s.length && !/[\\s\"'>/=]/.test(s[j]!)) {\n if (s.startsWith('{{', j)) this.fatal(j, j + 2, \"attribute names can't be interpolated\")\n j++\n }\n if (j === start) this.fatal(j, j + 1, `unexpected '${s[j]}' in a tag`)\n const raw = s.slice(start, j)\n let k = j\n while (k < s.length && /[ \\t]/.test(s[k]!)) k++\n if (s[k] !== '=') {\n attrs.push(this.classify(raw, undefined, start, j, false))\n return j\n }\n k++\n while (k < s.length && /\\s/.test(s[k]!)) k++\n const q = s[k]\n if (q === '\"' || q === \"'\") {\n const close = s.indexOf(q, k + 1)\n if (close < 0) this.fatal(start, k + 1, `the value of ${raw} is never closed — expected ${q}`)\n attrs.push(this.classify(raw, { from: k + 1, to: close }, start, close + 1, true))\n return close + 1\n }\n let e = k\n while (e < s.length && !/[\\s>]/.test(s[e]!)) e++\n if (s.slice(k, e).includes('{{')) {\n this.fatal(k, e, `quote the value of ${raw}: an interpolated attribute must be in quotes`)\n }\n attrs.push(this.classify(raw, { from: k, to: e }, start, e, false))\n return e\n }\n\n private classify(\n raw: string,\n value: { from: number; to: number } | undefined,\n start: number,\n end: number,\n quoted: boolean,\n ): Attr {\n const span = this.span(start, end)\n const binding = /^\\[(?:(class)\\.([\\w-]+)|(style)\\.([\\w-]+)(?:\\.(\\w+))?|([^\\]]+))\\]$/.exec(raw)\n if (binding) {\n if (!value) this.fatal(start, end, `${raw} needs a value: ${raw}=\"expression\"`)\n const src = this.s.slice(value.from, value.to)\n if (src.includes('{{'))\n this.fatal(value.from, value.to, `${raw} takes an expression, without {{ }}`)\n const expr = this.expr(src, value.from)\n const [, cls, clsName, sty, styName, unit, bind] = binding\n if (cls) return { name: clsName!, kind: 'class', expr, quoted, span }\n if (sty) return { name: styName!, kind: 'style', expr, unit, quoted, span }\n return { name: bind!, kind: 'bind', expr, quoted, span }\n }\n if (!value) return { name: raw, kind: 'bare', quoted: false, span }\n const parts: Array<string | Expr> = []\n for (const n of this.textWithInterps(value.from, value.to, 'text')) {\n if (n.k === 'text') parts.push(n.value)\n else if (n.k === 'interp') parts.push(n.expr)\n }\n const dynamic = parts.some((p) => typeof p !== 'string')\n return {\n name: raw,\n kind: dynamic ? 'interp' : 'static',\n parts: parts.length ? parts : [''],\n quoted,\n span,\n }\n }\n\n private closeTag(i: number): void {\n const m = /^<\\/([A-Za-z][\\w:.-]*)\\s*>/.exec(this.s.slice(i, i + 200))\n if (!m) this.fatal(i, i + 2, 'malformed closing tag')\n this.i = i + m[0].length\n const tag = m[1]!\n for (let f = this.frames.length - 1; f > 0; f--) {\n const frame = this.frames[f]!\n if (frame.type === 'block' || frame.type === 'switch' || frame.type === 'root') break\n const matches =\n frame.type === 'slot'\n ? tag.toLowerCase() === 'slot'\n : frame.el.foreign\n ? frame.name === tag\n : frame.name === tag.toLowerCase()\n if (matches) {\n this.flush()\n this.frames.length = f\n return\n }\n }\n this.warn(i, this.i, `</${tag}> closes nothing`)\n }\n\n // ── blocks ────────────────────────────────────────────────────────────\n\n /** `( … )` from `j` (at `(`): the inside and the offset after `)`. */\n private parens(j: number, what: string): { src: string; at: number; end: number } {\n if (this.s[j] !== '(') this.fatal(j, j + 1, `expected ( after ${what}`)\n let depth = 0\n let quote = ''\n for (let k = j; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === '(') depth++\n else if (ch === ')' && --depth === 0)\n return { src: this.s.slice(j + 1, k), at: j + 1, end: k + 1 }\n }\n this.fatal(j, j + 1, `${what} ( is never closed — expected )`)\n }\n\n private skipWs(j: number): number {\n while (j < this.s.length && /\\s/.test(this.s[j]!)) j++\n return j\n }\n\n private openBrace(j: number, what: string): number {\n j = this.skipWs(j)\n if (this.s[j] !== '{') this.fatal(j, j + 1, `expected { after ${what}`)\n return j + 1\n }\n\n /** Split a block header on top-level `;`. */\n private splitHeader(src: string, at: number): Array<{ src: string; at: number }> {\n const out: Array<{ src: string; at: number }> = []\n let quote = ''\n let start = 0\n for (let k = 0; k < src.length; k++) {\n const ch = src[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n } else if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === ';') {\n out.push({ src: src.slice(start, k), at: at + start })\n start = k + 1\n }\n }\n out.push({ src: src.slice(start), at: at + start })\n return out\n }\n\n private stringArg(src: string, at: number, what: string): string {\n const m = /^\\s*(['\"])([^'\"]*)\\1\\s*$/.exec(src)\n if (!m) this.fatal(at, at + src.length, `${what} takes a quoted name`)\n return m[2]!\n }\n\n /** Handle `@keyword` at `i`. False when it isn't a block after all (stays text). */\n private block(kw: string, i: number): boolean {\n const s = this.s\n const after = i + 1 + kw.length\n const next = this.skipWs(after)\n const ch = s[next]\n switch (kw) {\n case 'if':\n case 'for':\n case 'switch':\n case 'slot':\n case 'layout':\n case 'assets':\n if (ch !== '(') return false\n break\n case 'verbatim':\n if (ch !== '{') return false\n break\n case 'let':\n case 'input':\n if (!/[ \\t]/.test(s[after] ?? '')) return false\n break\n case 'else':\n case 'empty':\n case 'case':\n case 'default':\n if (ch !== '{' && ch !== '(' && !(kw === 'else' && s.startsWith('if', next))) return false\n this.fatal(\n i,\n after,\n `@${kw} has no matching ${kw === 'else' ? '@if' : kw === 'empty' ? '@for' : '@switch'}`,\n )\n }\n\n if (kw === 'layout') return this.layout(i, next)\n if (kw === 'input') return this.input(i, after)\n if (kw === 'let') return this.let(i, after)\n if (kw === 'verbatim') return this.verbatim(i, next)\n if (kw === 'assets') {\n const p = this.parens(next, '@assets')\n const entry = this.stringArg(p.src, p.at, '@assets')\n this.i = this.standalone(i, p.end)\n this.emit({ k: 'assets', entry, span: this.span(i, p.end) })\n return true\n }\n\n const p = this.parens(next, `@${kw}`)\n const brace = this.openBrace(p.end, `@${kw} (…)`)\n const resume = this.standalone(i, brace)\n if (kw === 'if') {\n const branch = this.ifBranch(p.src, p.at)\n const node: Node = { k: 'if', branches: [branch], span: this.span(i, brace) }\n this.emit(node)\n this.frames.push({\n type: 'block',\n children: branch.body,\n next: 'else',\n node,\n keyword: 'if',\n start: i,\n })\n } else if (kw === 'for') {\n const node = this.forHeader(p.src, p.at, i, brace)\n this.emit(node)\n this.frames.push({\n type: 'block',\n children: node.body,\n next: 'empty',\n node,\n keyword: 'for',\n start: i,\n })\n } else if (kw === 'switch') {\n const on = this.expr(p.src, p.at)\n const node: Extract<Node, { k: 'switch' }> = {\n k: 'switch',\n on: on ?? { kind: 'literal', value: null, span: this.span(p.at, p.at) },\n cases: [],\n span: this.span(i, brace),\n }\n this.emit(node)\n this.frames.push({ type: 'switch', node, start: i })\n } else {\n const name = this.stringArg(p.src, p.at, '@slot')\n const node: Node = { k: 'slot-fill', name, body: [], span: this.span(i, brace) }\n this.emit(node)\n this.frames.push({ type: 'block', children: node.body, node, keyword: 'slot', start: i })\n }\n this.i = resume\n return true\n }\n\n private ifBranch(src: string, at: number): IfBranch {\n const parts = this.splitHeader(src, at)\n const cond = this.expr(parts[0]!.src, parts[0]!.at)\n const branch: IfBranch = { cond, body: [] }\n if (parts[1]) {\n const m = /^\\s*as\\s+([A-Za-z_$][\\w$]*)\\s*$/.exec(parts[1].src)\n if (!m) this.err(parts[1].at, parts[1].at + parts[1].src.length, 'expected `as name` after ;')\n else branch.alias = m[1]\n }\n if (parts.length > 2) this.err(parts[2]!.at, parts[2]!.at + 1, 'unexpected ; in @if')\n return branch\n }\n\n private forHeader(\n src: string,\n at: number,\n start: number,\n end: number,\n ): Extract<Node, { k: 'for' }> {\n const parts = this.splitHeader(src, at)\n const head = parts[0]!\n const m =\n /^(\\s*)(?:\\[\\s*([A-Za-z_$][\\w$]*)\\s*,\\s*([A-Za-z_$][\\w$]*)\\s*\\]|([A-Za-z_$][\\w$]*))\\s+of\\s+/.exec(\n head.src,\n )\n if (!m) this.fatal(head.at, head.at + head.src.length, '@for needs `item of items`')\n const item: string | [string, string] = m[4] ?? [m[2]!, m[3]!]\n const ofSrc = head.src.slice(m[0].length)\n const of = this.expr(ofSrc, head.at + m[0].length) ?? {\n kind: 'literal',\n value: null,\n span: this.span(at, at),\n }\n const lets: Record<string, LoopVar> = {}\n for (const part of parts.slice(1)) {\n const t = part.src.trim()\n if (t.startsWith('track')) {\n this.expr(\n part.src.replace(/^\\s*track\\b/, (w) => ' '.repeat(w.length)),\n part.at,\n )\n continue\n }\n if (t.startsWith('let')) {\n const body = part.src.replace(/^\\s*let\\b/, '')\n for (const decl of body.split(',')) {\n const d = /^\\s*([A-Za-z_$][\\w$]*)\\s*=\\s*(\\$\\w+)\\s*$/.exec(decl)\n if (!d || !LOOP_VARS.has(d[2] as LoopVar)) {\n this.err(\n part.at,\n part.at + part.src.length,\n `unknown loop variable in \\`${decl.trim()}\\` — use ${[...LOOP_VARS].join(', ')}`,\n )\n continue\n }\n lets[d[1]!] = d[2] as LoopVar\n }\n continue\n }\n this.err(part.at, part.at + part.src.length, `expected track or let in @for, found \\`${t}\\``)\n }\n return { k: 'for', item, of, lets, body: [], span: this.span(start, end) }\n }\n\n private closeBlock(i: number): void {\n let f = this.frames.length - 1\n while (this.frames[f]!.type !== 'block') f--\n const frame = this.frames[f] as Extract<Frame, { type: 'block' }>\n const s = this.s\n // A continuation: `} @else …`, `} @empty {`.\n const j = this.skipWs(i + 1)\n let branch: IfBranch | undefined\n let empty = false\n let end = i + 1\n if (frame.next === 'else' && /^@else(?![\\w$-])/.test(s.slice(j, j + 6))) {\n let k = this.skipWs(j + 5)\n if (s.startsWith('if', k) && /[\\s(]/.test(s[k + 2] ?? '')) {\n const p = this.parens(this.skipWs(k + 2), '@else if')\n branch = this.ifBranch(p.src, p.at)\n k = p.end\n } else {\n branch = { body: [] }\n }\n end = this.openBrace(k, '@else')\n } else if (frame.next === 'empty' && /^@empty(?![\\w$-])/.test(s.slice(j, j + 7))) {\n empty = true\n end = this.openBrace(j + 6, '@empty')\n }\n // Trim before flushing: the indentation in front of `}` is still pending.\n const resume = this.standalone(i, end)\n this.flush()\n // Elements opened inside the block close with it.\n this.frames.length = f\n this.i = resume\n if (branch) {\n const node = frame.node as Extract<Node, { k: 'if' }>\n node.branches.push(branch)\n this.frames.push({\n type: 'block',\n children: branch.body,\n next: branch.cond ? 'else' : undefined,\n node,\n keyword: 'else',\n start: j,\n })\n } else if (empty) {\n const node = frame.node as Extract<Node, { k: 'for' }>\n node.empty = []\n this.frames.push({ type: 'block', children: node.empty, node, keyword: 'empty', start: j })\n }\n }\n\n /** Inside `@switch { }`: only `@case (…) { }`, `@default { }` and whitespace. */\n private switchBody(): void {\n const s = this.s\n const j = this.skipWs(this.i)\n const frame = this.top as Extract<Frame, { type: 'switch' }>\n if (j >= s.length) {\n this.i = j\n return\n }\n if (s[j] === '}') {\n this.frames.pop()\n this.i = this.standalone(j, j + 1)\n return\n }\n const m = /^@(case|default)(?![\\w$-])/.exec(s.slice(j, j + 9))\n if (!m) this.fatal(j, j + 1, 'only @case and @default go inside @switch')\n let k = j + m[0].length\n let value: Expr | undefined\n if (m[1] === 'case') {\n const p = this.parens(this.skipWs(k), '@case')\n value = this.expr(p.src, p.at)\n k = p.end\n } else if (frame.node.default) {\n this.err(j, k, '@switch has two @default blocks')\n }\n const brace = this.openBrace(k, `@${m[1]}`)\n const body: Node[] = []\n if (m[1] === 'case') frame.node.cases.push({ value: value ?? frame.node.on, body })\n else frame.node.default = body\n this.i = this.standalone(j, brace)\n this.frames.push({ type: 'block', children: body, node: frame.node, keyword: m[1]!, start: j })\n }\n\n private verbatim(i: number, brace: number): boolean {\n let depth = 0\n let quote = ''\n for (let k = brace; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') quote = ch\n else if (ch === '{') depth++\n else if (ch === '}' && --depth === 0) {\n const resume = this.standalone(i, k + 1)\n this.emit({ k: 'verbatim', text: this.s.slice(brace + 1, k), span: this.span(i, k + 1) })\n this.i = resume\n return true\n }\n }\n this.fatal(i, brace + 1, '@verbatim is never closed — expected }')\n }\n\n private layout(i: number, at: number): boolean {\n const p = this.parens(at, '@layout')\n if (this.seenOutput || this.frames.length > 1) {\n this.err(i, p.end, '@layout must come before any output')\n } else if (this.ast.layout !== undefined) {\n this.err(i, p.end, 'a template has one @layout')\n } else {\n this.ast.layout = /^\\s*none\\s*$/.test(p.src) ? null : this.stringArg(p.src, p.at, '@layout')\n this.ast.layoutSpan = this.span(i, p.end)\n }\n this.i = this.standalone(i, p.end)\n return true\n }\n\n private input(i: number, after: number): boolean {\n let eol = this.s.indexOf('\\n', after)\n if (eol < 0) eol = this.s.length\n const line = this.s.slice(after, eol).replace(/\\r$/, '')\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*(?:=\\s*(.*?))?\\s*$/.exec(line)\n if (!m) this.fatal(i, eol, '@input needs a name: @input name or @input name = value')\n if (this.frames.length > 1)\n this.err(i, eol, '@input goes at the top of a component, outside any block')\n const decl: InputDecl = { name: m[1]!, span: this.span(i, after + line.length) }\n if (m[2] !== undefined) {\n const at = after + line.indexOf(m[2], m[0].indexOf('=') + 1)\n const e = this.expr(m[2], at)\n const literal =\n e?.kind === 'literal'\n ? e.value\n : e?.kind === 'unary' &&\n e.op === '-' &&\n e.arg.kind === 'literal' &&\n typeof e.arg.value === 'number'\n ? -e.arg.value\n : undefined\n if (e && literal === undefined) {\n this.err(\n at,\n at + m[2].length,\n 'an @input default must be a literal: a string, number, true, false or null',\n )\n } else if (e) {\n decl.default = { value: literal!, span: e.span }\n }\n }\n if (this.ast.inputs.some((d) => d.name === decl.name))\n this.err(i, eol, `@input ${decl.name} is declared twice`)\n this.ast.inputs.push(decl)\n this.i = this.standalone(i, after + line.length)\n return true\n }\n\n private let(i: number, after: number): boolean {\n let quote = ''\n for (let k = after; k < this.s.length; k++) {\n const ch = this.s[k]!\n if (quote) {\n if (ch === '\\\\') k++\n else if (ch === quote) quote = ''\n continue\n }\n if (ch === \"'\" || ch === '\"') quote = ch\n else if (ch === ';') {\n const src = this.s.slice(after, k)\n const m = /^\\s*([A-Za-z_$][\\w$]*)\\s*=/.exec(src)\n if (!m) this.fatal(i, k, '@let needs a name: @let name = expression;')\n const expr = this.expr(src.slice(m[0].length), after + m[0].length)\n const resume = this.standalone(i, k + 1)\n if (expr) this.emit({ k: 'let', name: m[1]!, expr, span: this.span(i, k + 1) })\n this.i = resume\n return true\n }\n }\n this.fatal(i, after, '@let is never ended — expected ;')\n }\n}\n\n/** Parse a `.kick` source. A leading BOM is dropped; positions refer to the rest. */\nexport function parse(source: string, file: string): ParseResult {\n const p = new TemplateParser(source.charCodeAt(0) === 0xfeff ? source.slice(1) : source, file)\n p.run()\n return { ast: p.ast, diagnostics: p.diagnostics }\n}\n","/**\n * The few functions every rendered value passes through: a property read\n * that can't reach prototypes or functions, and escaping for each place a\n * value can land (spec §3, §4).\n */\nimport { FORBIDDEN_NAMES } from '../parse/expression'\n\nexport { isUrlAttr, URL_ATTRS } from '../urls'\n\n/** HTML a pipe or the app marked as trusted: printed unescaped, in text only. */\nexport class SafeHtml {\n constructor(readonly html: string) {}\n toString(): string {\n return this.html\n }\n}\n\n/**\n * Read `obj[key]` for a template. Forbidden names and function values read\n * as `undefined`, so a template can neither reach a prototype nor get hold of\n * something to call. Getters and Proxy traps run: they are the app's own code.\n */\nexport function read(obj: unknown, key: unknown): unknown {\n if (obj === null || obj === undefined) return undefined\n const k = typeof key === 'number' || typeof key === 'symbol' ? key : String(key)\n if (typeof k === 'string' && FORBIDDEN_NAMES.has(k)) return undefined\n const value = (obj as Record<PropertyKey, unknown>)[k]\n return typeof value === 'function' ? undefined : value\n}\n\nconst HTML_ESCAPES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport const escapeHtml = (s: string): string => s.replace(/[&<>\"']/g, (c) => HTML_ESCAPES[c]!)\n\nconst SAFE_SCHEMES = new Set(['http', 'https', 'mailto', 'tel'])\n\n/**\n * A URL attribute's value, or `#` when its scheme could run script.\n * Browsers ignore ASCII whitespace and control characters inside a scheme\n * (`java\\tscript:`), so those are removed before the scheme is read.\n */\nexport function sanitizeUrl(value: string): string {\n // oxlint-disable-next-line no-control-regex -- matching control characters is the point\n const normalised = value.replace(/[\\u0000- \\u007F]/g, '')\n const m = /^([a-z][a-z0-9+.-]*):/i.exec(normalised)\n if (!m) return value\n return SAFE_SCHEMES.has(m[1]!.toLowerCase()) ? value : '#'\n}\n\n/** `srcset`: each candidate URL is checked on its own. */\nexport function sanitizeSrcset(value: string): string {\n return value\n .split(',')\n .map((candidate) => {\n const m = /^(\\s*)(\\S+)([\\s\\S]*)$/.exec(candidate)\n if (!m) return candidate\n return `${m[1]}${sanitizeUrl(m[2]!)}${m[3]}`\n })\n .join(',')\n}\n\nconst JSON_ESCAPES: Record<string, string> = {\n '<': '\\\\u003c',\n '>': '\\\\u003e',\n '&': '\\\\u0026',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n}\n\n/** JSON text made safe inside `<script type=\"application/json\">`: no `</script`, no `<!--`. */\nexport const escapeJsonForScript = (json: string): string =>\n json.replace(/[<>&\\u2028\\u2029]/g, (c) => JSON_ESCAPES[c]!)\n\n/** A CSS value for `[style.prop]`, or `undefined` when it could leave its property. */\nexport function safeStyleValue(v: string): string | undefined {\n return /[;{}\\\\\"'<]|\\/\\*|url\\s*\\(|expression\\s*\\(/i.test(v) ? undefined : v\n}\n","/**\n * The built-in pipes (spec §7). Synchronous, locale- and time-zone-aware\n * through the render's env — never the server's.\n */\nimport type { Pipe } from '../render/render'\nimport { SafeHtml } from '../render/safe'\n\nexport const BUILTIN_PIPES: readonly string[] = [\n 'uppercase',\n 'lowercase',\n 'titlecase',\n 'json',\n 'slice',\n 'keys',\n 'entries',\n 'url',\n 'raw',\n 'date',\n 'number',\n 'currency',\n 'percent',\n]\n\nexport interface PipeEnv {\n locale: string\n timeZone: string\n}\n\nconst DATE_FORMATS: Record<string, Intl.DateTimeFormatOptions> = {\n short: { dateStyle: 'short', timeStyle: 'short' },\n medium: { dateStyle: 'medium', timeStyle: 'medium' },\n long: { dateStyle: 'long', timeStyle: 'long' },\n full: { dateStyle: 'full', timeStyle: 'long' },\n shortDate: { dateStyle: 'short' },\n mediumDate: { dateStyle: 'medium' },\n longDate: { dateStyle: 'long' },\n fullDate: { dateStyle: 'full' },\n shortTime: { timeStyle: 'short' },\n mediumTime: { timeStyle: 'medium' },\n}\n\n/** Digits as `minInt.minFrac-maxFrac`, e.g. `1.0-2`. */\nfunction digits(info: unknown): Intl.NumberFormatOptions {\n if (info === undefined || info === null) return {}\n const m = /^(\\d+)\\.(\\d+)-(\\d+)$/.exec(String(info))\n if (!m) throw new Error(`digits must look like '1.0-2', got '${String(info)}'`)\n return {\n minimumIntegerDigits: Number(m[1]),\n minimumFractionDigits: Number(m[2]),\n maximumFractionDigits: Number(m[3]),\n }\n}\n\n/**\n * Intl formatters are costly to build: one per locale and options, reused.\n * Locales and pipe arguments can come from a request or data, so the cache\n * is capped — past the limit it starts over rather than growing.\n */\nexport const FORMATTER_CACHE_LIMIT = 256\nconst formatters = new Map<string, Intl.NumberFormat | Intl.DateTimeFormat>()\nexport const formatterCacheSize = (): number => formatters.size\nfunction remember<T extends Intl.NumberFormat | Intl.DateTimeFormat>(key: string, f: T): T {\n if (formatters.size >= FORMATTER_CACHE_LIMIT) formatters.clear()\n formatters.set(key, f)\n return f\n}\n/** The formatter cached under `key`, built by `make` on a miss. Keys are cheap strings, not serialised options. */\nfunction cached<T extends Intl.NumberFormat | Intl.DateTimeFormat>(key: string, make: () => T): T {\n return (formatters.get(key) as T | undefined) ?? remember(key, make())\n}\n\nconst toNumber = (v: unknown): number | undefined => {\n if (v === null || v === undefined || v === '') return undefined\n const n = Number(v)\n return Number.isNaN(n) ? undefined : n\n}\n\nconst str = (v: unknown): string => (v === null || v === undefined ? '' : String(v))\n\nexport function builtinPipes(env: PipeEnv): Record<string, Pipe> {\n return {\n uppercase: (v) => str(v).toUpperCase(),\n lowercase: (v) => str(v).toLowerCase(),\n titlecase: (v) => str(v).replace(/\\b\\p{L}/gu, (c) => c.toUpperCase()),\n json: (v) => JSON.stringify(v, null, 2),\n slice: (v, start, end) =>\n typeof v === 'string' || Array.isArray(v)\n ? v.slice(start as number | undefined, end as number | undefined)\n : v,\n keys: (v) =>\n v instanceof Map ? [...v.keys()] : v && typeof v === 'object' ? Object.keys(v) : [],\n entries: (v) =>\n v instanceof Map ? [...v.entries()] : v && typeof v === 'object' ? Object.entries(v) : [],\n url: (v) => encodeURIComponent(str(v)),\n raw: (v) => (v instanceof SafeHtml ? v : new SafeHtml(str(v))),\n date: (v, format = 'medium', timeZone) => {\n if (v === null || v === undefined || v === '') return ''\n const d = v instanceof Date ? v : new Date(v as string | number)\n if (Number.isNaN(d.getTime())) return ''\n const preset = DATE_FORMATS[String(format)]\n if (!preset) throw new Error(`unknown date format '${String(format)}'`)\n const tz = (timeZone as string | undefined) ?? env.timeZone\n return cached(\n `d|${env.locale}|${String(format)}|${tz}`,\n () => new Intl.DateTimeFormat(env.locale, { ...preset, timeZone: tz }),\n ).format(d)\n },\n number: (v, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `n|${env.locale}|${String(info)}`,\n () => new Intl.NumberFormat(env.locale, digits(info)),\n ).format(n)\n },\n currency: (v, code, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `c|${env.locale}|${String(code)}|${String(info)}`,\n () =>\n new Intl.NumberFormat(env.locale, {\n style: 'currency',\n currency: String(code ?? 'USD'),\n ...digits(info),\n }),\n ).format(n)\n },\n percent: (v, info) => {\n const n = toNumber(v)\n if (n === undefined) return ''\n return cached(\n `p|${env.locale}|${String(info)}`,\n () => new Intl.NumberFormat(env.locale, { style: 'percent', ...digits(info) }),\n ).format(n)\n },\n }\n}\n","/**\n * Read the names a pipes file exports, without running it — so the build\n * and the editor agree with the runtime on which pipes exist (spec §7).\n * Only top-level `export const|let|var|function` and `export { a, b as c }`\n * of local names; anything that needs another module to resolve is refused.\n */\nimport { error, positionAt, type Diagnostic } from '../diagnostics'\nimport { BUILTIN_PIPES } from './builtins'\n\ninterface Token {\n v: string\n start: number\n}\n\n/** Identifiers and punctuation at brace depth 0, skipping strings, comments and template literals. */\nfunction topLevelTokens(src: string): Token[] {\n const out: Token[] = []\n let depth = 0\n let i = 0\n while (i < src.length) {\n const c = src[i]!\n if (c === '/' && src[i + 1] === '/') {\n const nl = src.indexOf('\\n', i)\n i = nl < 0 ? src.length : nl\n continue\n }\n if (c === '/' && src[i + 1] === '*') {\n const end = src.indexOf('*/', i + 2)\n i = end < 0 ? src.length : end + 2\n continue\n }\n if (c === \"'\" || c === '\"' || c === '`') {\n i++\n while (i < src.length && src[i] !== c) i += src[i] === '\\\\' ? 2 : 1\n i++\n continue\n }\n if (c === '{' || c === '(' || c === '[') {\n if (depth === 0) out.push({ v: c, start: i })\n depth++\n i++\n continue\n }\n if (c === '}' || c === ')' || c === ']') {\n depth--\n if (depth === 0) out.push({ v: c, start: i })\n i++\n continue\n }\n if (depth === 0 && /[A-Za-z_$*]/.test(c)) {\n const m = /^[A-Za-z_$][\\w$]*|^\\*/.exec(src.slice(i))!\n out.push({ v: m[0], start: i })\n i += m[0].length\n continue\n }\n if (depth === 0 && (c === ',' || c === ';' || c === '=')) out.push({ v: c, start: i })\n i++\n }\n return out\n}\n\n/** The tokens inside the `{ … }` that starts at `src[open]`. */\nfunction braceNames(\n src: string,\n open: number,\n): { names: Array<{ local: string; exported: string; at: number }>; end: number } {\n const close = src.indexOf('}', open)\n const body = src.slice(open + 1, close < 0 ? src.length : close)\n const names: Array<{ local: string; exported: string; at: number }> = []\n let offset = open + 1\n for (const part of body.split(',')) {\n const m = /^(\\s*)([A-Za-z_$][\\w$]*)(?:\\s+as\\s+([A-Za-z_$][\\w$]*))?\\s*$/.exec(part)\n if (m) names.push({ local: m[2]!, exported: m[3] ?? m[2]!, at: offset + m[1]!.length })\n offset += part.length + 1\n }\n return { names, end: close < 0 ? src.length : close + 1 }\n}\n\nexport function readPipeExports(\n source: string,\n file: string,\n): { names: string[]; diagnostics: Diagnostic[] } {\n const names: string[] = []\n const diagnostics: Diagnostic[] = []\n const fail = (at: number, len: number, message: string) =>\n diagnostics.push(\n error(file, { start: positionAt(source, at), end: positionAt(source, at + len) }, message),\n )\n const add = (name: string, at: number) => {\n if (BUILTIN_PIPES.includes(name)) {\n fail(at, name.length, `'${name}' is a built-in pipe — choose another name`)\n return\n }\n names.push(name)\n }\n\n const tokens = topLevelTokens(source)\n for (let t = 0; t < tokens.length; t++) {\n if (tokens[t]!.v !== 'export') continue\n const at = tokens[t]!.start\n const next = tokens[t + 1]\n const after = tokens[t + 2]\n switch (next?.v) {\n case 'const':\n case 'let':\n case 'var': {\n if (after && /^[A-Za-z_$]/.test(after.v)) add(after.v, after.start)\n else fail(at, 6, 'export one pipe per name: export const name = …')\n break\n }\n case 'function':\n if (after && /^[A-Za-z_$]/.test(after.v)) add(after.v, after.start)\n break\n case 'async':\n fail(at, 6, 'pipes must be synchronous — an async function returns a Promise')\n break\n case '{': {\n const { names: list, end } = braceNames(source, next.start)\n const rest = tokens.find((x) => x.start >= end)\n if (rest?.v === 'from') {\n fail(at, 6, \"re-exports aren't read — import the pipe and export it from this file\")\n break\n }\n for (const n of list) add(n.exported, n.at)\n break\n }\n case 'type':\n case 'interface':\n break\n case '*':\n fail(at, 6, \"export * isn't read — export each pipe by name\")\n break\n case 'default':\n fail(at, 6, 'a default export is not a pipe — export each pipe by name')\n break\n default:\n fail(at, 6, `export ${next?.v ?? ''} is not a pipe — export const or function`)\n }\n }\n return { names, diagnostics }\n}\n"],"mappings":"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"}
|