@forinda/kickjs-view-language-server 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/server.ts","../src/pipes.ts","../src/workspace.ts","../src/language-plugin.ts","../src/plugin/index.ts","../src/view-module.ts"],"mappings":";;;;;;;UAoBiB;;EAEf;;EAEA;;EAEA;;EAEA,kBAAkB;;EAElB;;;;;EAKA;;wBAgEc;;;;;;;;UC9FC;;EAEf;EACA;EACA;;;;KCKU,oBAAoB;UAEf;EACf;;EAEA;EACA;;EAEA;EACA,MAAM;EACN,KAAK,eAAe;;EAEpB,KAAK,cAAc;;EAEnB,kBAAkB;;EAElB;;EAEA,YAAY,QAAQ;IAAQ;IAAa;;;qBAa9B;mBAMkB;mBALZ;mBACA;UACT;UACA;EAER,YAA6B,MAAM;MAE/B,QAAQ;EAIN,QAAQ;UAUN;;EAOR,MAAM;EAKN,OAAO;EAIP,MAAM;EAIN;EAIA,OAAO;EAIP;EAIA,OAAO;EAKP,MAAM,eAAe,KAAK;;EAO1B,UAAU,aAAa;;EAYvB,KAAK,aAAa;EAIZ,YAAY,eAAe;EAc3B,YAAY,eAAe;UAenB;UAON;UA8BA;;UAMA;;EAkBR,aAAa,eAAe;EAgB5B;;EAKA,gBAAgB,eAAe;EAI/B;EAIA,WAAW,KAAK;;EAWhB,qBAAqB;EAOrB,WAAW,QAAQ;IAAQ;IAAa;;EAIxC;;;;;EAQA,SAAS;;EAmBT,eAAe,cAAc;;;;qBC9BlB,2BAA2B;WAOjB;WANZ;WACA;WACA,UAAU;WACV,UAAU;WACV,eAAe;EAExB,YAAqB;;qBA8DV,oBAAoB,eAAe;;;wBC9ThC,wBAAwB,IAAI,YAAY;;;wBCgFlC,eACpB,cACA,OAAO;;AAEP,mBACC;EAAU,MAAM;EAAY;EAA+B"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/server.ts","../src/pipes.ts","../src/workspace.ts","../src/language-plugin.ts","../src/plugin/index.ts","../src/view-module.ts"],"mappings":";;;;;;;UAoBiB;;EAEf;;EAEA;;EAEA;;EAEA,kBAAkB;;EAElB;;;;;EAKA;;wBAgEc;;;;;;;;UC9FC;;EAEf;EACA;EACA;;;;KCKU,oBAAoB;UAEf;EACf;;EAEA;EACA;;EAEA;EACA,MAAM;EACN,KAAK,eAAe;;EAEpB,KAAK,cAAc;;EAEnB,kBAAkB;;EAElB;;EAEA,YAAY,QAAQ;IAAQ;IAAa;;;qBAa9B;mBAMkB;mBALZ;mBACA;UACT;UACA;EAER,YAA6B,MAAM;MAE/B,QAAQ;EAIN,QAAQ;UAUN;;EAOR,MAAM;EAKN,OAAO;EAIP,MAAM;EAIN;EAIA,OAAO;EAIP;EAIA,OAAO;EAKP,MAAM,eAAe,KAAK;;EAO1B,UAAU,aAAa;;EAYvB,KAAK,aAAa;EAIZ,YAAY,eAAe;EAc3B,YAAY,eAAe;UAenB;UAON;UA8BA;;UAMA;;EAkBR,aAAa,eAAe;EAgB5B;;EAKA,gBAAgB,eAAe;EAI/B;EAIA,WAAW,KAAK;;EAWhB,qBAAqB;EAOrB,WAAW,QAAQ;IAAQ;IAAa;;EAIxC;;;;;EAQA,SAAS;;EAmBT,eAAe,cAAc;;;;qBC3BlB,2BAA2B;WAOjB;WANZ;WACA;WACA,UAAU;WACV,UAAU;WACV,eAAe;EAExB,YAAqB;;qBAgEV,oBAAoB,eAAe;;;wBCnUhC,wBAAwB,IAAI,YAAY;;;wBCgFlC,eACpB,cACA,OAAO;;AAEP,mBACC;EAAU,MAAM;EAAY;EAA+B"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view-language-server v0.2.0
2
+ * @forinda/kickjs-view-language-server v0.3.1
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -8,4 +8,4 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- export { a as KickVirtualCode, n as Workspace, i as createKickServicePlugin, o as kickLanguagePlugin, r as loadViewModule, t as startServer } from "./server-pe6A1Wn-.js";
11
+ export { a as KickVirtualCode, n as Workspace, i as createKickServicePlugin, o as kickLanguagePlugin, r as loadViewModule, t as startServer } from "./server-DuAjCdYp.js";
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view-language-server v0.2.0
2
+ * @forinda/kickjs-view-language-server v0.3.1
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @license MIT
10
10
  */
11
- import { t as startServer } from "./server-pe6A1Wn-.js";
11
+ import { t as startServer } from "./server-DuAjCdYp.js";
12
12
  //#region src/main.ts
13
13
  /** Runs the server — the entry editors launch (the bin and the VS Code bundle). */
14
14
  startServer();
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view-language-server v0.2.0
2
+ * @forinda/kickjs-view-language-server v0.3.1
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -32,7 +32,7 @@ const EMBEDDED = {
32
32
  ...ALL,
33
33
  format: false
34
34
  };
35
- const KEYWORD$1 = /^@(else\s+if|if|for|switch|case|slot|layout|assets|verbatim|let|input|else|empty|default)(?![\w$-])/;
35
+ const KEYWORD$1 = /^@(else\s+if|if|for|switch|case|slot|error|layout|assets|verbatim|let|input|else|empty|default)(?![\w$-])/;
36
36
  const snapshotOf = (text) => ({
37
37
  getText: (start, end) => text.slice(start, end),
38
38
  getLength: () => text.length,
@@ -243,7 +243,10 @@ function tag(s, i, out) {
243
243
  k = e - 1;
244
244
  }
245
245
  if (name === "style") out.styles.push([j, end]);
246
- else if (type !== "application/json" && type !== "application/ld+json") out.scripts.push([j, end]);
246
+ else if (type !== "application/json" && type !== "application/ld+json") out.scripts.push({
247
+ range: [j, end],
248
+ ts: /\sclient(?=[\s/>=]|$)/i.test(s.slice(i, j))
249
+ });
247
250
  return end;
248
251
  }
249
252
  function embedded(id, languageId, text, [from, to]) {
@@ -311,7 +314,7 @@ var KickVirtualCode = class {
311
314
  mappings: htmlMappings
312
315
  },
313
316
  ...styles.map((r, n) => embedded(`css_${n}`, "css", text, r)),
314
- ...scripts.map((r, n) => embedded(`js_${n}`, "javascript", text, r))
317
+ ...scripts.map((c, n) => embedded(`js_${n}`, c.ts ? "typescript" : "javascript", text, c.range))
315
318
  ];
316
319
  }
317
320
  };
@@ -387,6 +390,7 @@ function headerNames(kw, header) {
387
390
  }
388
391
  return [...names.filter(Boolean), ...LOOP_VARS];
389
392
  }
393
+ if (kw === "error") return ["$message"];
390
394
  if (kw === "if" || kw === "else if") {
391
395
  const as = /;\s*as\s+([\w$]+)/.exec(header);
392
396
  return as ? [as[1]] : [];
@@ -413,7 +417,7 @@ function scopeAt(s, stop) {
413
417
  continue;
414
418
  }
415
419
  if (c === "@" && !/[\w@.-]/.test(s[i - 1] ?? "")) {
416
- const m = /^@(else\s+if|for|if|switch|case|slot|else|empty|default|let|input)(?![\w$-])/.exec(s.slice(i, i + 16));
420
+ const m = /^@(else\s+if|for|if|switch|case|slot|error|else|empty|default|let|input)(?![\w$-])/.exec(s.slice(i, i + 16));
417
421
  if (m) {
418
422
  const kw = m[1].replace(/\s+/g, " ");
419
423
  let j = i + m[0].length;
@@ -528,6 +532,12 @@ const CLASS = 7;
528
532
  const PROPERTY = 10;
529
533
  const FILE$1 = 17;
530
534
  const VARIABLE = 6;
535
+ /** Request-wide names every template has (see `@forinda/kickjs-view`'s form state). */
536
+ const FORM_STATE = [
537
+ "$errors",
538
+ "$old",
539
+ "$flash"
540
+ ];
531
541
  const KEYWORDS = {
532
542
  if: "if (${1:condition}) {\n $0\n}",
533
543
  "else if": "else if (${1:condition}) {\n $0\n}",
@@ -541,6 +551,7 @@ const KEYWORDS = {
541
551
  input: "input ${1:name}",
542
552
  layout: "layout('$1')",
543
553
  slot: "slot('${1:name}') {\n $0\n}",
554
+ error: "error('${1:field}') {\n $0\n}",
544
555
  assets: "assets('$1')",
545
556
  verbatim: "verbatim {\n $0\n}"
546
557
  };
@@ -640,7 +651,7 @@ function completions(ws, uri, text, offset) {
640
651
  label,
641
652
  kind: PROPERTY
642
653
  }));
643
- case "expr": return [...new Set(c.scope)].map((label) => ({
654
+ case "expr": return [.../* @__PURE__ */ new Set([...c.scope, ...FORM_STATE])].map((label) => ({
644
655
  label,
645
656
  kind: VARIABLE
646
657
  }));
@@ -1900,4 +1911,4 @@ function startServer() {
1900
1911
  //#endregion
1901
1912
  export { KickVirtualCode as a, createKickServicePlugin as i, Workspace as n, kickLanguagePlugin as o, loadViewModule as r, startServer as t };
1902
1913
 
1903
- //# sourceMappingURL=server-pe6A1Wn-.js.map
1914
+ //# sourceMappingURL=server-DuAjCdYp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-DuAjCdYp.js","names":["KEYWORD","closeParen","IDENT","FILE","TOP","KEYWORD","closeParen","createHtmlService","createCssService","createEmmetService"],"sources":["../src/language-plugin.ts","../src/context.ts","../src/plugin/completion.ts","../src/plugin/hover.ts","../src/plugin/definition.ts","../src/plugin/render-calls.ts","../src/plugin/diagnostics.ts","../src/plugin/format.ts","../src/plugin/tokens.ts","../src/plugin/references.ts","../src/plugin/index.ts","../src/view-module.ts","../src/pipes.ts","../src/positions.ts","../src/workspace.ts","../src/server.ts"],"sourcesContent":["/**\n * The Volar language plugin: each `.kick` file becomes a `KickVirtualCode`\n * whose embedded codes the HTML, CSS and JS services work on. The HTML copy\n * is the source with template syntax blanked to spaces, so every offset is\n * the same in both; blanked ranges aren't mapped, so the HTML service never\n * reports or completes inside them.\n *\n * Found by a lexical scan rather than the parser: the buffer being typed in\n * rarely parses, and the HTML service has to keep working while it doesn't.\n */\nimport type {\n CodeInformation,\n CodeMapping,\n IScriptSnapshot,\n LanguagePlugin,\n VirtualCode,\n} from '@volar/language-core'\nimport type { URI } from 'vscode-uri'\n\nconst ALL: CodeInformation = {\n verification: true,\n completion: true,\n semantic: true,\n navigation: true,\n structure: true,\n format: true,\n}\n/** Embedded documents never format: the kick formatter owns the whole file. */\nconst EMBEDDED: CodeInformation = { ...ALL, format: false }\n\nexport const KEYWORD =\n /^@(else\\s+if|if|for|switch|case|slot|error|layout|assets|verbatim|let|input|else|empty|default)(?![\\w$-])/\n\nconst snapshotOf = (text: string): IScriptSnapshot => ({\n getText: (start, end) => text.slice(start, end),\n getLength: () => text.length,\n getChangeRange: () => undefined,\n})\n\ntype Range = [number, number]\n\ninterface Scan {\n blank: Range[]\n styles: Range[]\n /** A script's range, and whether it's a `<script client>` (TypeScript). */\n scripts: Array<{ range: Range; ts: boolean }>\n}\n\n/** The end of a `(`…`)` group starting at `i` (at `(`); the text's end when unclosed. */\nexport function closeParen(s: string, i: number): number {\n let depth = 0\n let quote = ''\n for (let j = i; j < s.length; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '(') depth++\n else if (c === ')' && --depth === 0) return j + 1\n }\n return s.length\n}\n\n/**\n * Where an `@let` value from `from` ends: its `;` outside quotes, as the\n * parser reads it; the line's end while it's unterminated, so typing one\n * doesn't swallow the lines below.\n */\nexport function letEnd(s: string, from: number): { at: number; closed: boolean } {\n let quote = ''\n for (let j = from; j < s.length; j++) {\n const c = s[j]!\n if (c === '\\n') return { at: j, closed: false }\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === ';') return { at: j, closed: true }\n }\n return { at: s.length, closed: false }\n}\n\n/** The end of `@verbatim { … }` from `brace` (at `{`): after its `}`, quoted braces skipped as the parser does. */\nexport function verbatimEnd(s: string, brace: number): number {\n let depth = 0\n let quote = ''\n for (let k = brace; k < s.length; k++) {\n const c = s[k]!\n if (quote) {\n if (c === '\\\\') k++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"' || c === '`') quote = c\n else if (c === '{') depth++\n else if (c === '}' && --depth === 0) return k + 1\n }\n return s.length\n}\n\n/** The end of a `{{ … }}` starting at `i`; the text's end when unclosed. */\nexport function closeInterp(s: string, i: number): number {\n let quote = ''\n for (let j = i + 2; j < s.length; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '}' && s[j + 1] === '}') return j + 2\n }\n return s.length\n}\n\nfunction scan(s: string): Scan {\n const out: Scan = { blank: [], styles: [], scripts: [] }\n let depth = 0\n let i = 0\n const skipWs = (j: number) => {\n while (j < s.length && /\\s/.test(s[j]!)) j++\n return j\n }\n while (i < s.length) {\n const c = s[i]!\n if (c === '{' && s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n const stop = end < 0 ? s.length : end + 4\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (c === '{' && s[i + 1] === '{') {\n const stop = closeInterp(s, i)\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (c === '<' && s.startsWith('<!--', i)) {\n const end = s.indexOf('-->', i + 4)\n i = end < 0 ? s.length : end + 3\n continue\n }\n // `</` alone (a close tag being typed) is text until a name follows.\n if (c === '<' && /^<\\/?[A-Za-z]/.test(s.slice(i, i + 3))) {\n i = tag(s, i, out)\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m = KEYWORD.exec(s.slice(i, i + 16))\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n let j = i + m[0].length\n if (kw === 'let' || kw === 'input') {\n const eol = s.indexOf('\\n', j)\n const end = kw === 'let' ? letEnd(s, j) : undefined\n const stop = end ? end.at + (end.closed ? 1 : 0) : eol < 0 ? s.length : eol\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (kw === 'verbatim') {\n const b = skipWs(j)\n if (s[b] === '{') {\n const stop = verbatimEnd(s, b)\n out.blank.push([i, stop])\n i = stop\n continue\n }\n }\n const p = skipWs(j)\n if (s[p] === '(') j = closeParen(s, p)\n else if (kw !== 'else' && kw !== 'empty' && kw !== 'default') {\n i++\n continue\n }\n if (kw === 'layout' || kw === 'assets') {\n out.blank.push([i, j])\n i = j\n continue\n }\n const b = skipWs(j)\n if (s[b] === '{') {\n out.blank.push([i, b + 1])\n depth++\n i = b + 1\n continue\n }\n out.blank.push([i, j])\n i = j\n continue\n }\n }\n if (c === '}' && depth > 0) {\n out.blank.push([i, i + 1])\n depth--\n i++\n continue\n }\n i++\n }\n return out\n}\n\n/** One tag from `i` (at `<`): interpolations and binding values blanked; script / style content recorded. */\nfunction tag(s: string, i: number, out: Scan): number {\n const m = /^<(\\/?)([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 64))!\n let j = i + m[0].length\n const closing = !!m[1]\n const name = m[2]!.toLowerCase()\n let type = ''\n while (j < s.length && s[j] !== '>') {\n const binding = /^\\[[^\\]\\s]+\\]\\s*=\\s*([\"'])/.exec(s.slice(j, j + 128))\n if (binding) {\n const q = binding[1]!\n const from = j + binding[0].length\n const end = s.indexOf(q, from)\n const stop = end < 0 ? s.length : end\n out.blank.push([from, stop])\n j = stop + 1\n continue\n }\n const t = /^type\\s*=\\s*([\"'])([^\"']*)\\1/i.exec(s.slice(j, j + 128))\n if (t) type = t[2]!.trim().toLowerCase()\n const q = s[j]\n if (q === '\"' || q === \"'\") {\n const end = s.indexOf(q, j + 1)\n const stop = end < 0 ? s.length : end\n for (let k = j + 1; k < stop; k++) {\n if (s[k] === '{' && s[k + 1] === '{') {\n const e = Math.min(closeInterp(s, k), stop)\n out.blank.push([k, e])\n k = e - 1\n }\n }\n j = stop + 1\n continue\n }\n j++\n }\n j = Math.min(j + 1, s.length)\n if (closing || (name !== 'script' && name !== 'style') || s[j - 2] === '/') return j\n // Raw text: up to its close tag, with {{ }} blanked (a JSON script's value).\n const close = new RegExp(`</${name}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i').exec(s.slice(j))\n const end = close ? j + close.index : s.length\n for (let k = j; k < end; k++) {\n if (s[k] === '{' && s[k + 1] === '{') {\n const e = Math.min(closeInterp(s, k), end)\n out.blank.push([k, e])\n k = e - 1\n }\n }\n if (name === 'style') out.styles.push([j, end])\n else if (type !== 'application/json' && type !== 'application/ld+json')\n // `<script client>`: a component's browser code, written in TypeScript.\n out.scripts.push({ range: [j, end], ts: /\\sclient(?=[\\s/>=]|$)/i.test(s.slice(i, j)) })\n return end\n}\n\nfunction embedded(id: string, languageId: string, text: string, [from, to]: Range): VirtualCode {\n return {\n id,\n languageId,\n snapshot: snapshotOf(text.slice(from, to)),\n mappings: [\n { sourceOffsets: [from], generatedOffsets: [0], lengths: [to - from], data: EMBEDDED },\n ],\n }\n}\n\nexport class KickVirtualCode implements VirtualCode {\n readonly id = 'root'\n readonly languageId = 'kick'\n readonly snapshot: IScriptSnapshot\n readonly mappings: CodeMapping[]\n readonly embeddedCodes: VirtualCode[]\n\n constructor(readonly text: string) {\n this.snapshot = snapshotOf(text)\n this.mappings = [\n { sourceOffsets: [0], generatedOffsets: [0], lengths: [text.length], data: ALL },\n ]\n const { blank, styles, scripts } = scan(text)\n const sorted = blank.toSorted((a, b) => a[0] - b[0])\n let html = ''\n const htmlMappings: CodeMapping[] = []\n let at = 0\n const keep = (from: number, to: number) => {\n if (to <= from) return\n html += text.slice(from, to)\n htmlMappings.push({\n sourceOffsets: [from],\n generatedOffsets: [from],\n lengths: [to - from],\n data: EMBEDDED,\n })\n }\n for (const [a, b] of sorted) {\n if (a < at) {\n // Overlapping range: blank the part not yet covered.\n if (b > at) {\n html += text.slice(at, b).replace(/[^\\n\\r]/g, ' ')\n at = b\n }\n continue\n }\n keep(at, a)\n html += text.slice(a, b).replace(/[^\\n\\r]/g, ' ')\n at = b\n }\n keep(at, text.length)\n this.embeddedCodes = [\n { id: 'html', languageId: 'html', snapshot: snapshotOf(html), mappings: htmlMappings },\n ...styles.map((r, n) => embedded(`css_${n}`, 'css', text, r)),\n ...scripts.map((c, n) =>\n embedded(`js_${n}`, c.ts ? 'typescript' : 'javascript', text, c.range),\n ),\n ]\n }\n}\n\n/** TS / JS: a code only the kick service plugin reads, for `ctx.render('…')` names. */\nconst SCRIPT_IDS = new Set(['typescript', 'typescriptreact', 'javascript', 'javascriptreact'])\nconst SCRIPT_FILE = /\\.(?:[cm]?[jt]s|[jt]sx)$/\n\nclass RenderCallsCode implements VirtualCode {\n readonly id = 'root'\n // Not `typescript`: the HTML, CSS and Emmet services leave it alone.\n readonly languageId = 'kick-render'\n readonly snapshot: IScriptSnapshot\n readonly mappings: CodeMapping[]\n readonly embeddedCodes: VirtualCode[] = []\n\n constructor(text: string) {\n this.snapshot = snapshotOf(text)\n this.mappings = [\n { sourceOffsets: [0], generatedOffsets: [0], lengths: [text.length], data: EMBEDDED },\n ]\n }\n}\n\nexport const kickLanguagePlugin: LanguagePlugin<URI> = {\n getLanguageId(uri) {\n return uri.path.endsWith('.kick') ? 'kick' : undefined\n },\n // By the file name too: not every editor sends the `kick` languageId.\n createVirtualCode(uri, languageId, snapshot) {\n const text = snapshot.getText(0, snapshot.getLength())\n if (languageId === 'kick' || uri.path.endsWith('.kick')) return new KickVirtualCode(text)\n if (SCRIPT_IDS.has(languageId) || SCRIPT_FILE.test(uri.path)) return new RenderCallsCode(text)\n return undefined\n },\n}\n","/**\n * What sits at the cursor — read lexically from the text before it, because\n * the buffer being typed in rarely parses. Decides which completions apply\n * and which names are in scope there.\n */\nexport type CursorContext =\n | { kind: 'keyword'; prefix: string }\n | { kind: 'pipe'; prefix: string }\n | { kind: 'expr'; prefix: string; scope: string[] }\n | { kind: 'tag'; prefix: string }\n | { kind: 'attr'; tag: string; prefix: string }\n | { kind: 'template-name'; prefix: string }\n | { kind: 'slot-name'; prefix: string }\n | { kind: 'other' }\n\nexport const LOOP_VARS = ['$index', '$first', '$last', '$even', '$odd', '$count']\n\nconst IDENT = /[A-Za-z_$][\\w$]*/\n\n/** The end of `(`…`)` from `i` (at `(`), or -1 when it doesn't close before `stop`. */\nfunction closeParen(s: string, i: number, stop: number): number {\n let depth = 0\n let quote = ''\n for (let j = i; j < stop; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '(') depth++\n else if (c === ')' && --depth === 0) return j + 1\n }\n return -1\n}\n\n/** Names a block header brings into its body. */\nfunction headerNames(kw: string, header: string): string[] {\n if (kw === 'for') {\n const [head, ...rest] = header.split(';')\n const m = /^\\s*(?:\\[\\s*([\\w$]+)\\s*,\\s*([\\w$]+)\\s*\\]|([\\w$]+))\\s+of\\b/.exec(head ?? '')\n const names = m ? (m[3] ? [m[3]] : [m[1]!, m[2]!]) : []\n for (const part of rest) {\n const lets = /^\\s*let\\s+(.*)$/.exec(part)\n if (lets) for (const d of lets[1]!.split(',')) names.push(d.split('=')[0]!.trim())\n }\n return [...names.filter(Boolean), ...LOOP_VARS]\n }\n // `@error('field') { … }` gives its body the field's message.\n if (kw === 'error') return ['$message']\n if (kw === 'if' || kw === 'else if') {\n const as = /;\\s*as\\s+([\\w$]+)/.exec(header)\n return as ? [as[1]!] : []\n }\n return []\n}\n\n/** Names in scope at `stop`: inputs, then each enclosing block's, outermost first. */\nexport function scopeAt(s: string, stop: number): string[] {\n const inputs: string[] = []\n const frames: string[][] = [[]]\n let i = 0\n while (i < stop) {\n const c = s[i]!\n if (c === '{' && s[i + 1] === '{') {\n const end = s.indexOf(s.startsWith('{{--', i) ? '--}}' : '}}', i + 2)\n if (end < 0 || end >= stop) break\n i = end + 2\n continue\n }\n if (c === '<') {\n const end = s.startsWith('<!--', i) ? s.indexOf('-->', i) : s.indexOf('>', i)\n if (end < 0 || end >= stop) break\n i = end + 1\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m =\n /^@(else\\s+if|for|if|switch|case|slot|error|else|empty|default|let|input)(?![\\w$-])/.exec(\n s.slice(i, i + 16),\n )\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n let j = i + m[0].length\n if (kw === 'input') {\n const name = IDENT.exec(s.slice(j, j + 64))\n if (name) inputs.push(name[0])\n i = j\n continue\n }\n if (kw === 'let') {\n const name = /^\\s+([\\w$]+)\\s*=/.exec(s.slice(j, j + 64))\n const semi = s.indexOf(';', j)\n if (name && semi >= 0 && semi < stop) frames.at(-1)!.push(name[1]!)\n i = semi >= 0 && semi < stop ? semi + 1 : stop\n continue\n }\n let header = ''\n while (j < stop && /\\s/.test(s[j]!)) j++\n if (s[j] === '(') {\n const end = closeParen(s, j, stop)\n if (end < 0) break\n header = s.slice(j + 1, end - 1)\n j = end\n }\n while (j < stop && /\\s/.test(s[j]!)) j++\n if (s[j] === '{') {\n frames.push(headerNames(kw, header))\n i = j + 1\n continue\n }\n i = j\n continue\n }\n }\n if (c === '}' && frames.length > 1) frames.pop()\n i++\n }\n return [...inputs, ...frames.flat()]\n}\n\nfunction exprContext(segment: string, s: string, offset: number): CursorContext {\n const pipe = /\\|\\s*([A-Za-z_$][\\w$]*)?$/.exec(segment)\n if (pipe && !/\\|\\|\\s*[\\w$]*$/.test(segment)) return { kind: 'pipe', prefix: pipe[1] ?? '' }\n if (/\\??\\.\\s*[\\w$]*$/.test(segment)) return { kind: 'other' }\n const word = /([A-Za-z_$][\\w$]*)?$/.exec(segment)!\n return { kind: 'expr', prefix: word[1] ?? '', scope: scopeAt(s, offset) }\n}\n\nexport function cursorContext(s: string, offset: number): CursorContext {\n const before = s.slice(0, offset)\n\n // Inside {{ … }}\n const open = before.lastIndexOf('{{')\n if (open >= 0 && open > before.lastIndexOf('}}') && !before.startsWith('{{--', open)) {\n return exprContext(before.slice(open + 2), s, offset)\n }\n\n // @layout('… / @slot('…\n const named = /@(layout|slot)\\s*\\(\\s*['\"]([^'\"]*)$/.exec(before)\n if (named)\n return { kind: named[1] === 'layout' ? 'template-name' : 'slot-name', prefix: named[2]! }\n\n // @let name = …\n const letExpr = /@let\\s+[\\w$]+\\s*=\\s*([^;\\n]*)$/.exec(before)\n if (letExpr) return exprContext(letExpr[1]!, s, offset)\n\n // A block header that hasn't closed: @if (…, @for (…\n const header = /@(?:else\\s+if|if|for|switch|case)\\s*\\(([^]*)$/.exec(before)\n if (header && closeParen(before, before.length - header[1]!.length - 1, before.length) < 0) {\n return exprContext(header[1]!, s, offset)\n }\n\n // Inside a tag\n const tag = /<([A-Za-z][\\w:.-]*)((?:[^<>\"']|\"[^\"]*\"|'[^']*')*?)([\"'][^\"']*)?$/.exec(before)\n if (tag && !before.endsWith('>')) {\n const [, name, attrs = '', openValue] = tag\n if (openValue !== undefined) {\n // In a binding's value: an expression.\n if (/\\[[^\\]]+\\]\\s*=\\s*$/.test(attrs)) return exprContext(openValue.slice(1), s, offset)\n return { kind: 'other' }\n }\n if (!attrs) return { kind: 'tag', prefix: name! }\n if (name!.includes('-')) {\n const attr = /\\s\\[?([\\w-]*)$/.exec(attrs)\n if (attr) return { kind: 'attr', tag: name!.toLowerCase(), prefix: attr[1]! }\n }\n return { kind: 'other' }\n }\n\n // @keyword in text\n const kw = /(?<![\\w@.-])@([A-Za-z]*)$/.exec(before)\n if (kw) return { kind: 'keyword', prefix: kw[1]! }\n\n return { kind: 'other' }\n}\n\n/** The name under the cursor (pipes, tags, template names) and its range. */\nexport function wordAt(s: string, offset: number): { word: string; start: number; end: number } {\n let start = offset\n let end = offset\n while (start > 0 && /[\\w$/-]/.test(s[start - 1]!)) start--\n while (end < s.length && /[\\w$/-]/.test(s[end]!)) end++\n return { word: s.slice(start, end), start, end }\n}\n","/**\n * Completions the HTML service can't give: control-flow keywords, pipes,\n * components and their inputs, template and slot names, and the names in\n * scope inside an expression. Everything else is left to the HTML service.\n */\nimport type { CompletionItem } from '@volar/language-service'\nimport { cursorContext } from '../context'\nimport type { Workspace } from '../workspace'\n\nconst SNIPPET = 2 as const\nconst KEYWORD = 14 as const\nconst FUNCTION = 3 as const\nconst CLASS = 7 as const\nconst PROPERTY = 10 as const\nconst FILE = 17 as const\nconst VARIABLE = 6 as const\n\n/** Request-wide names every template has (see `@forinda/kickjs-view`'s form state). */\nconst FORM_STATE = ['$errors', '$old', '$flash']\n\nconst KEYWORDS: Record<string, string> = {\n if: 'if (${1:condition}) {\\n\\t$0\\n}',\n 'else if': 'else if (${1:condition}) {\\n\\t$0\\n}',\n else: 'else {\\n\\t$0\\n}',\n for: 'for (${1:item} of ${2:items}) {\\n\\t$0\\n}',\n empty: 'empty {\\n\\t$0\\n}',\n switch: 'switch (${1:value}) {\\n\\t@case (${2:match}) {\\n\\t\\t$0\\n\\t}\\n}',\n case: 'case (${1:match}) {\\n\\t$0\\n}',\n default: 'default {\\n\\t$0\\n}',\n let: 'let ${1:name} = $2;',\n input: 'input ${1:name}',\n layout: \"layout('$1')\",\n slot: \"slot('${1:name}') {\\n\\t$0\\n}\",\n error: \"error('${1:field}') {\\n\\t$0\\n}\",\n assets: \"assets('$1')\",\n verbatim: 'verbatim {\\n\\t$0\\n}',\n}\n\n/** The template a component tag names, if any. */\nexport function componentOf(ws: Workspace, tag: string): string | undefined {\n const dir = ws.componentsDir()\n return ws.names().find((n) => n.startsWith(`${dir}/`) && ws.view.componentTag(n, dir) === tag)\n}\n\n/** Slot names the layouts above `name` declare, nearest first. */\nfunction layoutSlots(ws: Workspace, name: string | undefined): string[] {\n const out = new Set<string>()\n const seen = new Set<string>()\n const chain: string[] = []\n let layout = name === undefined ? undefined : ws.layoutOf(name)\n while (layout !== undefined && !seen.has(layout)) {\n seen.add(layout)\n chain.push(layout)\n layout = ws.layoutOf(layout)\n }\n // The base layout wraps the chain, so its slots are fillable too.\n const base = ws.baseLayout()\n const page = name === undefined ? undefined : ws.astOf(name)\n if (\n base !== undefined &&\n name !== undefined &&\n page?.layout !== null &&\n !name.startsWith(`${ws.componentsDir()}/`) &&\n name !== base &&\n !seen.has(base)\n )\n chain.push(base)\n for (const l of chain) {\n const ast = ws.astOf(l)\n if (!ast) continue\n const stack = [ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'slot-outlet') {\n if (n.name) out.add(n.name)\n stack.push(n.fallback)\n } else if (n.k === 'element') 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 }\n return [...out]\n}\n\nexport function completions(\n ws: Workspace,\n uri: string,\n text: string,\n offset: number,\n): CompletionItem[] {\n const c = cursorContext(text, offset)\n switch (c.kind) {\n case 'keyword':\n return Object.entries(KEYWORDS).map(([label, insertText]) => ({\n label,\n kind: KEYWORD,\n insertText,\n insertTextFormat: SNIPPET,\n }))\n case 'pipe':\n return ws.pipeNames().map((label) => ({ label, kind: FUNCTION }))\n case 'tag': {\n const dir = ws.componentsDir()\n return ws\n .names()\n .filter((n) => n.startsWith(`${dir}/`))\n .map((n) => {\n const tag = ws.view.componentTag(n, dir)\n const required = (ws.astOf(n)?.inputs ?? []).filter((i) => !i.default)\n const attrs = required.map((i, k) => ` [${i.name}]=\"$${k + 1}\"`).join('')\n return {\n label: tag,\n kind: CLASS,\n insertText: `${tag}${attrs} />`,\n insertTextFormat: SNIPPET,\n }\n })\n }\n case 'attr': {\n const name = componentOf(ws, c.tag)\n if (!name) return []\n const inputs = ws.astOf(name)?.inputs ?? []\n return [\n ...inputs.flatMap((i) => [\n {\n label: `[${i.name}]`,\n kind: PROPERTY,\n insertText: `[${i.name}]=\"$1\"`,\n insertTextFormat: SNIPPET,\n },\n {\n label: i.name,\n kind: PROPERTY,\n insertText: `${i.name}=\"$1\"`,\n insertTextFormat: SNIPPET,\n },\n ]),\n { label: 'class', kind: PROPERTY },\n { label: 'id', kind: PROPERTY },\n ]\n }\n case 'template-name': {\n const dir = ws.componentsDir()\n return ws\n .names()\n .filter((n) => !n.startsWith(`${dir}/`))\n .map((label) => ({ label, kind: FILE }))\n }\n case 'slot-name':\n return layoutSlots(ws, ws.nameOf(uri)).map((label) => ({ label, kind: PROPERTY }))\n case 'expr':\n // Form state is in every template: errors, what was typed, flash messages.\n return [...new Set([...c.scope, ...FORM_STATE])].map((label) => ({ label, kind: VARIABLE }))\n default:\n return []\n }\n}\n","/** Hover for pipes (built-in descriptions, app signatures) and component tags (their inputs). */\nimport type { Hover } from '@volar/language-service'\nimport { cursorContext, wordAt } from '../context'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\n\n/** Worded as in the guide's pipe table. */\nconst BUILTIN: Record<string, string> = {\n uppercase: '`uppercase` — the text in upper case',\n lowercase: '`lowercase` — the text in lower case',\n titlecase: '`titlecase` — each word capitalised',\n date: \"`date:format:timeZone?` — `short`, `medium`, `long`, `full`, `shortDate`, … e.g. `date:'short'`\",\n number: \"`number:digits` — `minInt.minFrac-maxFrac`, e.g. `number:'1.0-2'`\",\n currency: \"`currency:code:digits?` — e.g. `currency:'KES'`\",\n percent: '`percent:digits?` — a ratio as a percentage',\n slice: '`slice:start:end` — part of a list or string',\n keys: '`keys` — an object’s keys',\n entries: '`entries` — an object’s `[key, value]` pairs',\n json: '`json` — the value as JSON',\n url: '`url` — URL-encoded for a query string',\n raw: '`raw` — the HTML unescaped; only for trusted markup',\n}\n\nexport function hover(ws: Workspace, _uri: string, text: string, offset: number): Hover | null {\n const { word, start, end } = wordAt(text, offset)\n if (!word) return null\n const c = cursorContext(text, end)\n const md = (value: string): Hover => ({\n contents: { kind: 'markdown', value },\n range: { start: posOf(text, start), end: posOf(text, end) },\n })\n if (c.kind === 'pipe') {\n if (BUILTIN[word]) return md(BUILTIN[word])\n const decl = ws.pipeDeclaration(word)\n return decl ? md(`\\`\\`\\`ts\\n${decl.signature}\\n\\`\\`\\``) : null\n }\n if (c.kind === 'tag') {\n const name = componentOf(ws, word.toLowerCase())\n const ast = name === undefined ? undefined : ws.astOf(name)\n if (!ast) return null\n const lines = ast.inputs.map((i) =>\n i.default\n ? `- \\`${i.name}\\` = \\`${JSON.stringify(i.default.value)}\\``\n : `- \\`${i.name}\\` (required)`,\n )\n return md([`**<${word}>** — \\`${name}.kick\\``, ...lines].join('\\n'))\n }\n return null\n}\n\nexport function posOf(text: string, offset: number) {\n const before = text.slice(0, offset).split('\\n')\n return { line: before.length - 1, character: before.at(-1)!.length }\n}\n","/** Go to definition: a component tag to its file, `@layout('…')` to the layout, a pipe to `pipes.ts`. */\nimport type { LocationLink } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport { cursorContext, wordAt } from '../context'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\nimport { posOf } from './hover'\n\nconst TOP = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n\nexport function definition(\n ws: Workspace,\n _uri: string,\n text: string,\n offset: number,\n): LocationLink | null {\n const { word, start, end } = wordAt(text, offset)\n if (!word) return null\n const origin = { start: posOf(text, start), end: posOf(text, end) }\n const link = (targetUri: string, targetRange = TOP): LocationLink => ({\n originSelectionRange: origin,\n targetUri,\n targetRange,\n targetSelectionRange: targetRange,\n })\n const c = cursorContext(text, end)\n if (c.kind === 'tag') {\n const name = componentOf(ws, word.toLowerCase())\n return name === undefined ? null : link(ws.uriOf(name))\n }\n if (c.kind === 'template-name') {\n return ws.astOf(word) ? link(ws.uriOf(word)) : null\n }\n if (c.kind === 'pipe') {\n const decl = ws.pipeDeclaration(word)\n if (!decl) return null\n const at = { line: decl.line, character: decl.column }\n const range = { start: at, end: { line: decl.line, character: decl.column + word.length } }\n return link(URI.file(ws.pipesFile()).toString(), range)\n }\n return null\n}\n","/**\n * `ctx.render('…')` and `views.render('…')` in TypeScript and JavaScript:\n * template names completed, linked to their files, and checked. For editors\n * that attach this server to TS / JS files too.\n */\nimport type { CompletionItem, Diagnostic, LocationLink } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { posOf } from './hover'\n\n/** A call's template name as typed so far, up to the cursor. */\nconst OPEN_CALL = /\\b(?:ctx|views)\\.render\\(\\s*(['\"`])([^'\"`\\n]*)$/\n/** Every call with a literal name. */\nconst CALLS = /\\b(?:ctx|views)\\.render\\(\\s*(['\"`])([^'\"`\\n]*)\\1/g\n\nconst FILE = 17\n\n/** Template names a page can render: everything but components. */\nfunction renderable(ws: Workspace): string[] {\n const dir = `${ws.componentsDir()}/`\n return ws.names().filter((n) => !n.startsWith(dir))\n}\n\nexport function renderCompletions(\n ws: Workspace,\n text: string,\n offset: number,\n): CompletionItem[] | undefined {\n const m = OPEN_CALL.exec(text.slice(0, offset))\n if (!m) return undefined\n const range = { start: posOf(text, offset - m[2]!.length), end: posOf(text, offset) }\n return renderable(ws).map((name) => ({\n label: name,\n kind: FILE,\n textEdit: { range, newText: name },\n }))\n}\n\n/** Calls whose name is a plain literal (not a template string with `${…}`). */\nexport function calls(text: string): Array<{ name: string; offset: number }> {\n return [...text.matchAll(CALLS)]\n .filter((m) => !m[2]!.includes('${'))\n .map((m) => ({ name: m[2]!, offset: m.index + m[0].length - m[2]!.length - 1 }))\n}\n\nexport function renderDefinition(ws: Workspace, text: string, offset: number): LocationLink | null {\n const call = calls(text).find((c) => offset >= c.offset && offset <= c.offset + c.name.length)\n if (!call || !ws.astOf(call.name)) return null\n const top = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n return {\n originSelectionRange: {\n start: posOf(text, call.offset),\n end: posOf(text, call.offset + call.name.length),\n },\n targetUri: ws.uriOf(call.name),\n targetRange: top,\n targetSelectionRange: top,\n }\n}\n\nexport function renderDiagnostics(ws: Workspace, text: string): Diagnostic[] {\n return calls(text)\n .filter((c) => !ws.astOf(c.name))\n .map((c) => ({\n range: { start: posOf(text, c.offset), end: posOf(text, c.offset + c.name.length) },\n severity: 2,\n source: 'kick',\n message: `template '${c.name}' not found`,\n }))\n}\n","/**\n * Template diagnostics as a Volar service plugin — the shape of Vue's\n * `vue-compiler-dom-errors`, around the engine's own `parse` + `check`.\n */\nimport type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type { Workspace } from '../workspace'\nimport { renderDiagnostics } from './render-calls'\n\n/** The `.kick` file a root virtual-code document belongs to. */\nexport function sourceUri(context: LanguageServiceContext, uri: string): string {\n return context.decodeEmbeddedDocumentUri?.(URI.parse(uri))?.[0].toString() ?? uri\n}\n\nexport function createDiagnosticsPlugin(ws: Workspace): LanguageServicePlugin {\n return {\n name: 'kick-diagnostics',\n capabilities: {\n // A component or layout changing changes its users' diagnostics.\n diagnosticProvider: { interFileDependencies: true, workspaceDiagnostics: false },\n },\n create(context) {\n return {\n provideDiagnostics(document) {\n if (document.languageId === 'kick-render')\n return renderDiagnostics(ws, document.getText())\n if (document.languageId !== 'kick') return undefined\n // The document's text is the editor's buffer: the workspace checks that.\n const uri = sourceUri(context, document.uri)\n ws.sync(uri, document.getText())\n return ws.diagnosticsFor(uri)\n },\n }\n },\n }\n}\n","/** Document formatting through the engine's own `format` — the same output as `kick fmt:views`. */\nimport type { TextEdit } from '@volar/language-service'\nimport type { ViewModule } from '../workspace'\nimport { posOf } from './hover'\n\n/** One whole-document edit, or none on a parse error or when nothing changes. */\nexport function formatEdits(\n view: ViewModule,\n text: string,\n file: string,\n tabSize: number,\n): TextEdit[] {\n const { output } = view.format(text, file, { indent: tabSize })\n if (output === undefined || output === text) return []\n return [\n { range: { start: { line: 0, character: 0 }, end: posOf(text, text.length) }, newText: output },\n ]\n}\n","/**\n * Semantic tokens for `.kick` templates, so every LSP editor highlights the\n * template syntax, not only VS Code with its TextMate grammar. Found by a\n * lexical scan, like the language plugin's: the buffer being typed in rarely\n * parses.\n */\nimport { closeInterp, closeParen, KEYWORD, letEnd, verbatimEnd } from '../language-plugin'\n\n/** The legend, in order: standard types, so themes colour them. */\nexport const TOKEN_TYPES = [\n 'keyword',\n 'comment',\n 'operator',\n 'function',\n 'variable',\n 'property',\n 'string',\n 'number',\n 'class',\n 'parameter',\n] as const\n\nexport type TokenType = (typeof TOKEN_TYPES)[number]\n\nexport interface KickToken {\n offset: number\n length: number\n type: TokenType\n}\n\nconst LITERALS = new Set(['true', 'false', 'null', 'undefined'])\n/** Words with a meaning in block headers: `@for (x of xs; track x.id; let i = $index)`, `@if (a; as b)`, `@layout(none)`. */\nconst HEADER_WORDS = new Set(['of', 'track', 'let', 'as', 'none'])\n\nexport function kickTokens(s: string, isComponent: (tag: string) => boolean): KickToken[] {\n const out: KickToken[] = []\n const push = (offset: number, length: number, type: TokenType) => {\n if (length > 0) out.push({ offset, length, type })\n }\n\n /** An expression in `[from, to)`. */\n const expr = (from: number, to: number, header: boolean) => {\n let prev = ''\n for (let i = from; i < to;) {\n const c = s[i]!\n if (/\\s/.test(c)) {\n i++\n continue\n }\n if (c === \"'\" || c === '\"' || c === '`') {\n let j = i + 1\n while (j < to && s[j] !== c) j += s[j] === '\\\\' ? 2 : 1\n j = Math.min(j + 1, to)\n push(i, j - i, 'string')\n prev = 'lit'\n i = j\n continue\n }\n const num = /^\\d+(?:\\.\\d+)?/.exec(s.slice(i, Math.min(to, i + 32)))\n if (num) {\n push(i, num[0].length, 'number')\n prev = 'lit'\n i += num[0].length\n continue\n }\n const word = /^[A-Za-z_$][\\w$]*/.exec(s.slice(i, Math.min(to, i + 128)))\n if (word) {\n const w = word[0]\n const type: TokenType =\n prev === '.'\n ? 'property'\n : prev === '|'\n ? 'function'\n : LITERALS.has(w) || (header && HEADER_WORDS.has(w))\n ? 'keyword'\n : 'variable'\n push(i, w.length, type)\n prev = 'word'\n i += w.length\n continue\n }\n if (c === '|' && s[i + 1] === '|') {\n prev = '||'\n i += 2\n continue\n }\n if (c === '|') push(i, 1, 'operator')\n // `?.` reads as `.`: the name after it is a property.\n prev = c === '?' && s[i + 1] === '.' ? '.' : c\n i += c === '?' && s[i + 1] === '.' ? 2 : 1\n }\n }\n\n /** `{{ … }}` from `i` (at `{{`); returns its end. */\n const interp = (i: number, limit: number) => {\n const end = Math.min(closeInterp(s, i), limit)\n const closed = s.startsWith('}}', end - 2) && end - 2 >= i + 2\n push(i, 2, 'operator')\n expr(i + 2, closed ? end - 2 : end, false)\n if (closed) push(end - 2, 2, 'operator')\n return end\n }\n\n /** One tag from `i` (at `<`); returns where scanning continues. */\n const tag = (i: number) => {\n const m = /^<(\\/?)([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 64))!\n const name = m[2]!.toLowerCase()\n if (isComponent(name)) push(i + 1 + m[1]!.length, m[2]!.length, 'class')\n let j = i + m[0].length\n while (j < s.length && s[j] !== '>') {\n const binding = /^\\[([^\\]\\s]+)\\]\\s*=\\s*([\"'])/.exec(s.slice(j, j + 128))\n if (binding) {\n push(j + 1, binding[1]!.length, 'property')\n const from = j + binding[0].length\n const close = s.indexOf(binding[2]!, from)\n const stop = close < 0 ? s.length : close\n expr(from, stop, false)\n j = stop + 1\n continue\n }\n const q = s[j]\n if (q === '\"' || q === \"'\") {\n const close = s.indexOf(q, j + 1)\n const stop = close < 0 ? s.length : close\n for (let k = j + 1; k < stop; k++) if (s.startsWith('{{', k)) k = interp(k, stop) - 1\n j = stop + 1\n continue\n }\n j++\n }\n j = Math.min(j + 1, s.length)\n if (m[1] || (name !== 'script' && name !== 'style') || s[j - 2] === '/') return j\n // Raw text: only `{{ }}` (a JSON script's value) is template syntax.\n const close = new RegExp(`</${name}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i').exec(s.slice(j))\n const end = close ? j + close.index : s.length\n for (let k = j; k < end; k++) if (s.startsWith('{{', k)) k = interp(k, end) - 1\n return end\n }\n\n let i = 0\n while (i < s.length) {\n const c = s[i]!\n if (s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n const stop = end < 0 ? s.length : end + 4\n push(i, stop - i, 'comment')\n i = stop\n continue\n }\n if (s.startsWith('{{', i)) {\n i = interp(i, s.length)\n continue\n }\n if (s.startsWith('<!--', i)) {\n const end = s.indexOf('-->', i + 4)\n i = end < 0 ? s.length : end + 3\n continue\n }\n if (c === '<' && /^<\\/?[A-Za-z]/.test(s.slice(i, i + 3))) {\n i = tag(i)\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m = KEYWORD.exec(s.slice(i, i + 16))\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n push(i, m[0].length, 'keyword')\n let j = i + m[0].length\n if (kw === 'input' || kw === 'let') {\n const decl = /^\\s+([\\w$]+)/.exec(s.slice(j, j + 64))\n if (decl)\n push(\n j + decl[0].length - decl[1]!.length,\n decl[1]!.length,\n kw === 'input' ? 'parameter' : 'variable',\n )\n const eol = s.indexOf('\\n', j)\n const stop = kw === 'let' ? letEnd(s, j).at : eol < 0 ? s.length : eol\n const eq = s.indexOf('=', j)\n if (eq >= 0 && eq < stop) expr(eq + 1, stop, false)\n i = stop\n continue\n }\n while (j < s.length && /\\s/.test(s[j]!)) j++\n if (kw === 'verbatim' && s[j] === '{') {\n i = verbatimEnd(s, j)\n continue\n }\n if (s[j] === '(') {\n const end = closeParen(s, j)\n expr(j + 1, s[end - 1] === ')' ? end - 1 : end, true)\n i = end\n continue\n }\n i = i + m[0].length\n continue\n }\n }\n i++\n }\n return out\n}\n","/**\n * Find references and rename for the names templates share: component tags,\n * layout names and pipes. Renaming a component or layout renames its file\n * too; renaming the file in the editor updates its uses (`fileRenameEdits`).\n */\nimport type { Location, Range, TextEdit, WorkspaceEdit } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\nimport { posOf } from './hover'\nimport { calls } from './render-calls'\nimport { kickTokens } from './tokens'\n\ntype Target =\n | { kind: 'component'; name: string; tag: string }\n | { kind: 'layout'; name: string }\n | { kind: 'pipe'; name: string }\n\ninterface Use {\n uri: string\n text: string\n offset: number\n length: number\n}\n\nconst TOP = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\nconst IDENT = /^[A-Za-z_$][\\w$]*$/\nconst LAYOUT = /@layout\\s*\\(\\s*(['\"])([^'\"]*)\\1/g\n\nconst rangeOf = (text: string, offset: number, length: number): Range => ({\n start: posOf(text, offset),\n end: posOf(text, offset + length),\n})\n\n/** The shared name under the cursor, with where it sits in `text`. */\nfunction targetAt(\n ws: Workspace,\n text: string,\n offset: number,\n): { target: Target; offset: number; length: number } | undefined {\n const tokens = kickTokens(text, (tag) => componentOf(ws, tag) !== undefined)\n const t = tokens.find((k) => offset >= k.offset && offset <= k.offset + k.length)\n if (!t) return undefined\n const word = text.slice(t.offset, t.offset + t.length)\n if (t.type === 'class') {\n const name = componentOf(ws, word.toLowerCase())\n return name === undefined\n ? undefined\n : { target: { kind: 'component', name, tag: word.toLowerCase() }, ...t }\n }\n if (t.type === 'function') return { target: { kind: 'pipe', name: word }, ...t }\n if (t.type === 'string' && /@layout\\s*\\(\\s*$/.test(text.slice(0, t.offset))) {\n const name = word.slice(1, -1)\n return ws.astOf(name)\n ? { target: { kind: 'layout', name }, offset: t.offset + 1, length: name.length }\n : undefined\n }\n return undefined\n}\n\n/** Every use of `target` in the templates. */\nfunction usesOf(ws: Workspace, target: Target): Use[] {\n const out: Use[] = []\n for (const name of ws.names()) {\n const text = ws.textOf(name)\n if (text === undefined) continue\n const uri = ws.uriOf(name)\n if (target.kind === 'layout') {\n for (const m of text.matchAll(LAYOUT))\n if (m[2] === target.name)\n out.push({\n uri,\n text,\n offset: m.index + m[0].length - m[2].length - 1,\n length: m[2].length,\n })\n continue\n }\n const want = target.kind === 'component' ? 'class' : 'function'\n const match = target.kind === 'component' ? target.tag : target.name\n for (const t of kickTokens(text, (tag) => target.kind === 'component' && tag === target.tag))\n if (\n t.type === want &&\n text.slice(t.offset, t.offset + t.length).toLowerCase() === match.toLowerCase()\n )\n out.push({ uri, text, ...t })\n }\n return out\n}\n\n/** Where a pipe is declared in `pipes.ts`; only the forms the server can read. */\nfunction pipeDeclaration(ws: Workspace, name: string): Location | undefined {\n const decl = ws.pipeDeclaration(name)\n if (!decl) return undefined\n const start = { line: decl.line, character: decl.column }\n return {\n uri: URI.file(ws.pipesFile()).toString(),\n range: { start, end: { line: decl.line, character: decl.column + name.length } },\n }\n}\n\nexport function references(\n ws: Workspace,\n text: string,\n offset: number,\n includeDeclaration: boolean,\n): Location[] {\n const at = targetAt(ws, text, offset)\n if (!at) return []\n const { target } = at\n const locations: Location[] = usesOf(ws, target).map((u) => ({\n uri: u.uri,\n range: rangeOf(u.text, u.offset, u.length),\n }))\n if (includeDeclaration) {\n if (target.kind === 'pipe') {\n const decl = pipeDeclaration(ws, target.name)\n if (decl) locations.push(decl)\n } else locations.push({ uri: ws.uriOf(target.name), range: TOP })\n }\n return locations\n}\n\n/** What F2 renames here: a pipe, a component tag or a layout name. */\nexport function renameRange(\n ws: Workspace,\n text: string,\n offset: number,\n): Range | { message: string } | undefined {\n const at = targetAt(ws, text, offset)\n if (!at) return undefined\n if (at.target.kind === 'pipe' && !pipeDeclaration(ws, at.target.name))\n return {\n message: `Rename ${at.target.name} in your pipes file; it isn't declared in a form the editor can rename.`,\n }\n return rangeOf(text, at.offset, at.length)\n}\n\nconst TAG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/\n\n/** The component file for `tag`, kept in the old one's folder when the tag still starts with it. */\nfunction componentNameFor(ws: Workspace, oldName: string, tag: string): string | undefined {\n if (!TAG.test(tag)) return undefined\n const dir = ws.componentsDir()\n const folders = oldName\n .slice(dir.length + 1)\n .split('/')\n .slice(0, -1)\n const prefix = folders.join('-')\n const name =\n prefix && tag.startsWith(`${prefix}-`)\n ? `${dir}/${folders.join('/')}/${tag.slice(prefix.length + 1)}`\n : `${dir}/${tag}`\n return ws.view.componentTag(name, dir) === tag ? name : undefined\n}\n\n/** Every use of `target` replaced with `newText`, then the template's file renamed. */\nfunction renameTemplate(\n ws: Workspace,\n target: Target,\n newText: string,\n newName: string,\n): WorkspaceEdit | undefined {\n if (target.kind === 'pipe') return undefined\n if (ws.view.templateName(newName) !== newName || ws.astOf(newName)) return undefined\n const byUri = new Map<string, TextEdit[]>()\n for (const u of usesOf(ws, target)) {\n const edits = byUri.get(u.uri) ?? []\n edits.push({ range: rangeOf(u.text, u.offset, u.length), newText })\n byUri.set(u.uri, edits)\n }\n return {\n documentChanges: [\n // Edits first, at the old URIs: the file moves after them.\n ...[...byUri].map(([uri, edits]) => ({ textDocument: { uri, version: null }, edits })),\n { kind: 'rename' as const, oldUri: ws.uriOf(target.name), newUri: ws.uriOf(newName) },\n ],\n }\n}\n\n/** A pipe renamed in every template and in `pipes.ts`; a component or layout, file included. */\nexport function renameEdits(\n ws: Workspace,\n text: string,\n offset: number,\n newName: string,\n): WorkspaceEdit | undefined {\n const at = targetAt(ws, text, offset)\n if (!at) return undefined\n const { target } = at\n if (target.kind === 'component') {\n const name = componentNameFor(ws, target.name, newName)\n return name === undefined ? undefined : renameTemplate(ws, target, newName, name)\n }\n if (target.kind === 'layout') return renameTemplate(ws, target, newName, newName)\n if (!IDENT.test(newName) || ws.project().pipes.has(newName)) return undefined\n const decl = pipeDeclaration(ws, target.name)\n if (!decl) return undefined\n const changes: Record<string, TextEdit[]> = {}\n const add = (uri: string, range: Range) => (changes[uri] ??= []).push({ range, newText: newName })\n for (const u of usesOf(ws, target)) add(u.uri, rangeOf(u.text, u.offset, u.length))\n add(decl.uri, decl.range)\n return { changes }\n}\n\n/**\n * Edits that keep uses pointing at renamed templates: a component's tags, a\n * layout's `@layout('…')`, a page's `ctx.render('…')`. `oldUri` / `newUri`\n * can be a file or a folder.\n */\nexport async function fileRenameEdits(\n ws: Workspace,\n oldUri: string,\n newUri: string,\n): Promise<WorkspaceEdit | undefined> {\n const from = ws.relOf(oldUri)?.replace(/\\.kick$/, '')\n const to = ws.relOf(newUri)?.replace(/\\.kick$/, '')\n if (from === undefined || to === undefined || from === to) return undefined\n const renamed = new Map<string, string>()\n for (const name of ws.names()) {\n if (name === from) renamed.set(name, to)\n else if (name.startsWith(`${from}/`)) renamed.set(name, to + name.slice(from.length))\n }\n if (!renamed.size) return undefined\n const changes: Record<string, TextEdit[]> = {}\n const dir = ws.componentsDir()\n for (const [oldName, newName] of renamed) {\n const comp = oldName.startsWith(`${dir}/`)\n const newTag = newName.startsWith(`${dir}/`) ? ws.view.componentTag(newName, dir) : undefined\n const targets: Array<[Target, string]> = [[{ kind: 'layout', name: oldName }, newName]]\n if (comp && newTag)\n targets.push([\n { kind: 'component', name: oldName, tag: ws.view.componentTag(oldName, dir)! },\n newTag,\n ])\n for (const [target, newText] of targets)\n for (const u of usesOf(ws, target))\n (changes[u.uri] ??= []).push({ range: rangeOf(u.text, u.offset, u.length), newText })\n }\n // Pages named in `ctx.render('…')` / `views.render('…')`.\n const pages = [...renamed].filter(([n]) => !n.startsWith(`${dir}/`))\n if (pages.length) {\n const to = new Map(pages)\n for (const script of await ws.scripts())\n for (const c of calls(script.text)) {\n const newName = to.get(c.name)\n if (newName !== undefined)\n (changes[script.uri] ??= []).push({\n range: rangeOf(script.text, c.offset, c.name.length),\n newText: newName,\n })\n }\n }\n return Object.keys(changes).length ? { changes } : undefined\n}\n","/**\n * The kick service plugin: diagnostics, completion, hover, go to definition\n * and formatting on the root `.kick` document. The embedded HTML / CSS / JS\n * codes are left to their own services.\n */\nimport type { LanguageServicePlugin, SemanticToken } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { completions, componentOf } from './completion'\nimport { definition } from './definition'\nimport { createDiagnosticsPlugin, sourceUri } from './diagnostics'\nimport { formatEdits } from './format'\nimport { hover } from './hover'\nimport { fileRenameEdits, references, renameEdits, renameRange } from './references'\nimport { renderCompletions, renderDefinition } from './render-calls'\nimport { kickTokens, TOKEN_TYPES } from './tokens'\n\nexport function createKickServicePlugin(ws: Workspace): LanguageServicePlugin {\n const diagnostics = createDiagnosticsPlugin(ws)\n return {\n name: 'kick',\n capabilities: {\n ...diagnostics.capabilities,\n completionProvider: { triggerCharacters: ['@', '|', '<', '[', \"'\", '\"'] },\n hoverProvider: true,\n definitionProvider: true,\n documentFormattingProvider: true,\n semanticTokensProvider: { legend: { tokenTypes: [...TOKEN_TYPES], tokenModifiers: [] } },\n referencesProvider: true,\n renameProvider: { prepareProvider: true },\n fileRenameEditsProvider: true,\n },\n create(context) {\n /** The source file's uri and text, with the workspace synced to the buffer. */\n const open = (document: { uri: string; languageId: string; getText(): string }) => {\n if (document.languageId !== 'kick') return undefined\n const uri = sourceUri(context, document.uri)\n const text = document.getText()\n ws.sync(uri, text)\n return { uri, text }\n }\n return {\n ...diagnostics.create(context),\n provideCompletionItems(document, position) {\n if (document.languageId === 'kick-render') {\n const items = renderCompletions(ws, document.getText(), document.offsetAt(position))\n return items && { isIncomplete: false, items }\n }\n const d = open(document)\n if (!d) return undefined\n const items = completions(ws, d.uri, d.text, document.offsetAt(position))\n return items.length ? { isIncomplete: false, items } : undefined\n },\n provideHover(document, position) {\n const d = open(document)\n return d\n ? (hover(ws, d.uri, d.text, document.offsetAt(position)) ?? undefined)\n : undefined\n },\n provideDefinition(document, position) {\n if (document.languageId === 'kick-render') {\n const link = renderDefinition(ws, document.getText(), document.offsetAt(position))\n return link ? [link] : undefined\n }\n const d = open(document)\n const link = d && definition(ws, d.uri, d.text, document.offsetAt(position))\n return link ? [link] : undefined\n },\n provideReferences(document, position, context) {\n const d = open(document)\n return d\n ? references(ws, d.text, document.offsetAt(position), context.includeDeclaration)\n : undefined\n },\n provideRenameRange(document, position) {\n const d = open(document)\n return d ? renameRange(ws, d.text, document.offsetAt(position)) : undefined\n },\n provideRenameEdits(document, position, newName) {\n const d = open(document)\n return d ? renameEdits(ws, d.text, document.offsetAt(position), newName) : undefined\n },\n provideFileRenameEdits(oldUri, newUri) {\n return fileRenameEdits(ws, oldUri.toString(), newUri.toString())\n },\n provideDocumentSemanticTokens(document, range, legend) {\n const d = open(document)\n if (!d) return undefined\n const tokens: SemanticToken[] = []\n for (const t of kickTokens(d.text, (tag) => componentOf(ws, tag) !== undefined)) {\n const type = legend.tokenTypes.indexOf(t.type)\n if (type < 0) continue\n // One token per line: not every client takes multi-line tokens.\n let at = t.offset\n for (const part of d.text.slice(t.offset, t.offset + t.length).split('\\n')) {\n const p = document.positionAt(at)\n if (part && p.line >= range.start.line && p.line <= range.end.line)\n tokens.push([p.line, p.character, part.length, type, 0])\n at += part.length + 1\n }\n }\n return tokens\n },\n provideDocumentFormattingEdits(document, _range, options) {\n const d = open(document)\n if (!d) return undefined\n return formatEdits(\n ws.view,\n d.text,\n `${ws.nameOf(d.uri) ?? 'template'}.kick`,\n options.tabSize,\n )\n },\n }\n },\n }\n}\n","/**\n * Which `@forinda/kickjs-view` the server runs: the project's own, so the\n * editor parses, checks and formats exactly as the app's build does, or the\n * copy bundled with the server when the project has none (or one too old to\n * have what the editor calls).\n */\nimport { readFileSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport * as bundled from '@forinda/kickjs-view'\nimport type { ViewModule } from './workspace'\n\ndeclare const __KICK_VIEW_VERSION__: string | undefined\n\n/** The version of the `@forinda/kickjs-view` package holding `entry`. */\nexport function packageVersion(entry: string): string | undefined {\n for (let dir = dirname(entry); dir !== dirname(dir); dir = dirname(dir)) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))\n if (pkg.name === '@forinda/kickjs-view') return pkg.version\n } catch {}\n }\n return undefined\n}\n\n/**\n * Inlined into the editor extension's bundle at build time. The standalone\n * server imports whichever copy npm installed beside it, so read that one.\n */\nconst BUNDLED_VERSION =\n typeof __KICK_VIEW_VERSION__ === 'string'\n ? __KICK_VIEW_VERSION__\n : ((() => {\n try {\n return packageVersion(fileURLToPath(import.meta.resolve('@forinda/kickjs-view')))\n } catch {\n return undefined\n }\n })() ?? 'unknown')\n\n/** Conditions active for a Node `import`. */\nconst CONDITIONS = new Set(['node', 'import', 'default'])\n\n/**\n * The entry an exports target resolves to, as Node picks it: the first active\n * condition in the order the package declares them, following nested ones.\n */\nfunction pick(target: unknown): string | undefined {\n if (typeof target === 'string') return target\n if (!target || typeof target !== 'object') return undefined\n for (const [key, value] of Object.entries(target)) {\n if (!CONDITIONS.has(key)) continue\n const found = pick(value)\n if (found) return found\n }\n return undefined\n}\n\nconst REQUIRED = [\n 'parse',\n 'check',\n 'format',\n 'readPipeExports',\n 'templateName',\n 'componentTag',\n 'BUILTIN_PIPES',\n]\n\nlet warned = false\n\n/**\n * The project's `@forinda/kickjs-view` entry and version. Its exports map\n * only has `import`, which `require.resolve` can't see — so find the\n * package folder and read the entry from its exports.\n */\nfunction findProjectView(root: string): { entry: string; version: string } | undefined {\n // node_modules at and above the root only — not NODE_PATH or global folders.\n for (let dir = root; ; dir = dirname(dir)) {\n const pkgDir = join(dir, 'node_modules/@forinda/kickjs-view')\n let pkg\n try {\n pkg = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8'))\n } catch {\n if (dir === dirname(dir)) return undefined\n continue\n }\n const dot = typeof pkg.exports === 'string' ? pkg.exports : pkg.exports?.['.']\n const rel = pick(dot) ?? pkg.main\n const entry = resolve(pkgDir, typeof rel === 'string' ? rel : 'index.js')\n // An exports map pointing outside the package isn't followed.\n if (relative(pkgDir, entry).startsWith('..') || isAbsolute(relative(pkgDir, entry)))\n return undefined\n return { entry, version: pkg.version }\n }\n}\n\nexport async function loadViewModule(\n root: string,\n warn: (message: string) => void,\n /** The editor trusts this workspace: only then is the project's code imported. */\n trusted: boolean,\n): Promise<{ view: ViewModule; source: 'project' | 'bundled'; version: string }> {\n if (!trusted) return { view: bundled, source: 'bundled', version: BUNDLED_VERSION }\n const found = findProjectView(root)\n let reason = 'the project has no @forinda/kickjs-view'\n if (found) {\n reason = `the project's @forinda/kickjs-view ${found.version}`\n try {\n const mod = await import(pathToFileURL(found.entry).href)\n const missing = REQUIRED.filter((k) => !(k in mod))\n if (!missing.length)\n return { view: mod as ViewModule, source: 'project', version: found.version }\n reason += ` lacks ${missing.join(', ')}`\n } catch (err) {\n reason += ` failed to load: ${(err as Error).message}`\n }\n }\n if (!warned) {\n warned = true\n warn(`kick views: ${reason} — using the bundled ${BUNDLED_VERSION}`)\n }\n return { view: bundled, source: 'bundled', version: BUNDLED_VERSION }\n}\n","/**\n * Where each pipe in `pipes.ts` is declared and what it takes — for hover and\n * go to definition. Read lexically, like the engine's `readPipeExports`: only\n * `export const|let|var name = (…) =>` and `export function name(…)` forms.\n */\nexport interface PipeDeclaration {\n /** 0-based. */\n line: number\n column: number\n signature: string\n}\n\nconst DECL =\n /^export\\s+(?:(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*(?::[^=]*)?=\\s*(?:\\(([^)]*)\\)|([A-Za-z_$][\\w$]*)\\s*=>)|function\\s+([A-Za-z_$][\\w$]*)\\s*(?:<[^>]*>)?\\s*\\(([^)]*)\\))/d\n\nexport function pipeDeclarations(source: string): Map<string, PipeDeclaration> {\n const out = new Map<string, PipeDeclaration>()\n source.split('\\n').forEach((text, line) => {\n const m = DECL.exec(text)\n if (!m) return\n const group = m[1] === undefined ? 4 : 1\n const name = m[group]!\n const params = (m[2] ?? m[3] ?? m[5] ?? '').replace(/\\s+/g, ' ').trim()\n out.set(name, { line, column: m.indices![group]![0], signature: `${name}(${params})` })\n })\n return out\n}\n","/** The engine's 1-based line/column (UTF-16 units) to LSP's 0-based positions. */\nimport type { Position, Range } from '@volar/language-service'\nimport type { Pos, Span } from '@forinda/kickjs-view'\n\nexport const toPosition = (pos: Pos): Position => ({\n line: pos.line - 1,\n character: pos.column - 1,\n})\n\nexport const toRange = (span: Span): Range => ({\n start: toPosition(span.start),\n end: toPosition(span.end),\n})\n","/**\n * The editor's view of an app's templates: every `.kick` file under the\n * views folder (an open buffer wins over the file on disk) and the pipe names\n * from `pipes.ts`. Diagnostics come from the same `parse` + `check` the\n * runtime uses, cached per template and invalidated along the graph of\n * which template uses which component or layout.\n */\nimport { isAbsolute, posix, relative, sep } from 'node:path'\nimport type { Diagnostic } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type * as View from '@forinda/kickjs-view'\nimport { pipeDeclarations, type PipeDeclaration } from './pipes'\nimport { toRange } from './positions'\n\nexport type ViewModule = typeof View\n\nexport interface WorkspaceOptions {\n root: string\n /** Absolute. */\n viewsDir: string\n componentsDir: string\n /** Absolute. */\n pipesFile: string\n view: ViewModule\n read(path: string): Promise<string | undefined>\n /** Every `.kick` file (absolute paths) under `dir`. */\n list(dir: string): Promise<string[]>\n /** `createViews({ layout })`: a page's layout when it declares none; one name, or folder prefix → layout. */\n layout?: string | Record<string, string>\n /** `createViews({ baseLayout })`: the shell around every page's outermost layout. */\n baseLayout?: string\n /** The project's TS / JS files with their text (an open buffer's when there is one), for `ctx.render('…')` names. */\n scripts?(): Promise<Array<{ uri: string; text: string }>>\n}\n\ninterface Entry {\n disk?: string\n buffer?: string\n ast: View.TemplateAst\n parseDiagnostics: View.Diagnostic[]\n /** Component tags and layout names the template refers to. */\n tags: Set<string>\n layouts: Set<string>\n}\n\nexport class Workspace {\n private readonly entries = new Map<string, Entry>()\n private readonly cache = new Map<string, Diagnostic[]>()\n private pipes: string[] = []\n private pipeDecls = new Map<string, PipeDeclaration>()\n\n constructor(private readonly opts: WorkspaceOptions) {}\n\n get view(): ViewModule {\n return this.opts.view\n }\n\n async load(): Promise<void> {\n await this.loadPipes()\n for (const path of await this.opts.list(this.opts.viewsDir)) {\n const name = this.nameOfPath(path)\n if (name) this.update(name, { disk: await this.opts.read(path) })\n }\n }\n\n // ── names ─────────────────────────────────────────────────────────────\n\n private nameOfPath(path: string): string | undefined {\n const rel = relative(this.opts.viewsDir, path).split(sep).join(posix.sep)\n if (rel.startsWith('..') || !rel.endsWith('.kick')) return undefined\n return this.opts.view.templateName(rel.slice(0, -'.kick'.length))\n }\n\n /** `uri`'s path inside the views folder (`layouts/main.kick`, `layouts`); `undefined` outside it. */\n relOf(uri: string): string | undefined {\n const rel = relative(this.opts.viewsDir, URI.parse(uri).fsPath).split(sep).join(posix.sep)\n return rel.startsWith('..') || isAbsolute(rel) ? undefined : rel\n }\n\n nameOf(uri: string): string | undefined {\n return this.nameOfPath(URI.parse(uri).fsPath)\n }\n\n uriOf(name: string): string {\n return URI.file(`${this.opts.viewsDir}/${name}.kick`).toString()\n }\n\n componentsDir(): string {\n return this.opts.componentsDir\n }\n\n pathOf(name: string): string {\n return `${this.opts.viewsDir}/${name}.kick`\n }\n\n names(): string[] {\n return [...this.entries.keys()]\n }\n\n textOf(name: string): string | undefined {\n const e = this.entries.get(name)\n return e?.buffer ?? e?.disk\n }\n\n astOf(name: string): View.TemplateAst | undefined {\n return this.entries.get(name)?.ast\n }\n\n // ── changes ───────────────────────────────────────────────────────────\n\n /** An editor buffer for `uri`; `undefined` drops it and the file on disk applies again. */\n setBuffer(uri: string, text: string | undefined): void {\n const name = this.nameOf(uri)\n if (!name) return\n const e = this.entries.get(name)\n if (text === undefined && e?.disk === undefined) {\n this.remove(name)\n return\n }\n this.update(name, { disk: e?.disk, buffer: text })\n }\n\n /** `setBuffer`, skipped when the buffer is already `text`. */\n sync(uri: string, text: string): void {\n if (this.textOf(this.nameOf(uri) ?? '') !== text) this.setBuffer(uri, text)\n }\n\n async fileChanged(path: string): Promise<void> {\n if (path === this.opts.pipesFile) {\n await this.loadPipes()\n this.cache.clear()\n return\n }\n const name = this.nameOfPath(path)\n if (name)\n this.update(name, {\n disk: await this.opts.read(path),\n buffer: this.entries.get(name)?.buffer,\n })\n }\n\n async fileDeleted(path: string): Promise<void> {\n if (path === this.opts.pipesFile) {\n this.pipes = []\n this.pipeDecls = new Map()\n this.cache.clear()\n return\n }\n const name = this.nameOfPath(path)\n if (!name) return\n const buffer = this.entries.get(name)?.buffer\n // Still open in an editor: keep the buffer, but closing it now removes the template.\n if (buffer !== undefined) this.update(name, { buffer })\n else this.remove(name)\n }\n\n private async loadPipes(): Promise<void> {\n const source = await this.opts.read(this.opts.pipesFile)\n this.pipes =\n source === undefined ? [] : this.opts.view.readPipeExports(source, this.opts.pipesFile).names\n this.pipeDecls = source === undefined ? new Map() : pipeDeclarations(source)\n }\n\n private update(name: string, src: { disk?: string; buffer?: string }): void {\n const text = src.buffer ?? src.disk ?? ''\n const parsed = this.opts.view.parse(text, `${name}.kick`)\n const tags = new Set<string>()\n const layouts = new Set<string>()\n if (typeof parsed.ast.layout === 'string') layouts.add(parsed.ast.layout)\n const stack: View.Node[][] = [parsed.ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'element') {\n if (!n.foreign && n.tag.includes('-')) tags.add(n.tag.toLowerCase())\n 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-outlet') stack.push(n.fallback)\n else if (n.k === 'slot-fill') stack.push(n.body)\n }\n }\n const isNew = !this.entries.has(name)\n this.entries.set(name, {\n ...src,\n ast: parsed.ast,\n parseDiagnostics: parsed.diagnostics,\n tags,\n layouts,\n })\n this.invalidate(name, isNew)\n }\n\n private remove(name: string): void {\n this.entries.delete(name)\n this.invalidate(name, true)\n }\n\n /** Drop cached diagnostics for `name` and every template that uses it, transitively. */\n private invalidate(name: string, membershipChanged: boolean): void {\n const todo = [name]\n const seen = new Set<string>()\n while (todo.length) {\n const n = todo.pop()!\n if (seen.has(n)) continue\n seen.add(n)\n this.cache.delete(n)\n for (const d of this.dependentsOf(n)) todo.push(d)\n }\n // A template appearing or disappearing can change how unknown tags resolve elsewhere.\n if (membershipChanged && name.startsWith(`${this.opts.componentsDir}/`)) {\n const tag = this.opts.view.componentTag(name, this.opts.componentsDir)\n for (const [n, e] of this.entries) if (e.tags.has(tag)) this.cache.delete(n)\n }\n }\n\n /** Templates that use `name` as a component or a layout — a layout even after it's gone. */\n dependentsOf(name: string): Set<string> {\n // A configured layout can wrap any page: re-check them all.\n if (this.configuredLayouts().has(name)) return new Set(this.names().filter((n) => n !== name))\n const out = new Set<string>()\n const tag = name.startsWith(`${this.opts.componentsDir}/`)\n ? this.opts.view.componentTag(name, this.opts.componentsDir)\n : undefined\n for (const [n, e] of this.entries) {\n if (n === name) continue\n if ((tag && e.tags.has(tag) && this.entries.has(name)) || e.layouts.has(name)) out.add(n)\n }\n return out\n }\n\n // ── what check sees ───────────────────────────────────────────────────\n\n pipeNames(): string[] {\n return [...this.opts.view.BUILTIN_PIPES, ...this.pipes]\n }\n\n /** Where an app pipe is declared in `pipes.ts`, and its parameters. */\n pipeDeclaration(name: string): PipeDeclaration | undefined {\n return this.pipeDecls.get(name)\n }\n\n pipesFile(): string {\n return this.opts.pipesFile\n }\n\n project(): View.Project {\n return {\n templates: new Map([...this.entries].map(([n, e]) => [n, e.ast])),\n pipes: new Set(this.pipeNames()),\n componentsDir: this.opts.componentsDir,\n layouts: this.opts.layout,\n baseLayout: this.opts.baseLayout,\n }\n }\n\n /** Templates that are layouts by configuration: the mapping's targets and the base layout. */\n configuredLayouts(): Set<string> {\n const { layout, baseLayout } = this.opts\n const out = new Set(typeof layout === 'string' ? [layout] : Object.values(layout ?? {}))\n if (baseLayout) out.add(baseLayout)\n return out\n }\n\n scripts(): Promise<Array<{ uri: string; text: string }>> {\n return this.opts.scripts?.() ?? Promise.resolve([])\n }\n\n baseLayout(): string | undefined {\n return this.opts.baseLayout\n }\n\n /**\n * The layout `name` renders in: its own `@layout`, else the configured\n * mapping's longest matching folder prefix (pages only, as `check` does).\n */\n layoutOf(name: string): string | undefined {\n const ast = this.astOf(name)\n if (!ast) return undefined\n if (ast.layout !== undefined) return ast.layout ?? undefined\n const { layout } = this.opts\n if (\n layout === undefined ||\n name.startsWith(`${this.opts.componentsDir}/`) ||\n this.configuredLayouts().has(name)\n )\n return undefined\n if (typeof layout === 'string') return layout\n const hit = Object.keys(layout)\n .toSorted((a, b) => b.length - a.length)\n .find((p) => p === '' || name === p || name.startsWith(`${p}/`))\n return hit === undefined ? undefined : layout[hit]\n }\n\n /** Parse errors, else everything `check` reports — as LSP diagnostics. */\n diagnosticsFor(uri: string): Diagnostic[] {\n const name = this.nameOf(uri)\n const e = name === undefined ? undefined : this.entries.get(name)\n if (!name || !e) return []\n const cached = this.cache.get(name)\n if (cached) return cached\n const engine = e.parseDiagnostics.some((d) => d.severity === 'error')\n ? e.parseDiagnostics\n : [...e.parseDiagnostics, ...this.opts.view.check(name, this.project()).diagnostics]\n const out = engine.map((d): Diagnostic => ({\n range: toRange(d.span),\n severity: d.severity === 'error' ? 1 : 2,\n source: 'kick',\n message: d.message,\n }))\n this.cache.set(name, out)\n return out\n }\n}\n","/**\n * The language server: Volar's server with the `.kick` language plugin and\n * the HTML, CSS, Emmet and kick service plugins, over the project's own\n * `@forinda/kickjs-view` when it has one.\n */\nimport { existsSync } from 'node:fs'\nimport { readdir, readFile } from 'node:fs/promises'\nimport { basename, isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport { createConnection, createServer, createSimpleProject } from '@volar/language-server/node.js'\nimport { create as createCssService } from 'volar-service-css'\nimport { create as createEmmetService } from 'volar-service-emmet'\nimport { create as createHtmlService } from 'volar-service-html'\nimport { URI } from 'vscode-uri'\nimport { kickLanguagePlugin } from './language-plugin'\nimport { createKickServicePlugin } from './plugin/index'\nimport { renderDefinition, renderDiagnostics } from './plugin/render-calls'\nimport { loadViewModule } from './view-module'\nimport { Workspace } from './workspace'\n\n/** `initializationOptions`; paths are relative to the workspace folder. */\nexport interface ServerOptions {\n /** Default `src/views`. */\n viewsDir?: string\n /** Default `components`, inside the views folder. */\n componentsDir?: string\n /** Default `<viewsDir>/pipes.ts`. */\n pipesFile?: string\n /** `createViews({ layout })`: a page's layout when it declares none; one name, or folder prefix → layout. */\n layout?: string | Record<string, string>\n /** `createViews({ baseLayout })`. */\n baseLayout?: string\n /**\n * The editor trusts the workspace, so the project's own `@forinda/kickjs-view`\n * may be imported. Otherwise the bundled copy is used. Default `false`.\n */\n trusted?: boolean\n}\n\n/** Every `.kick` file under `dir`; none when it doesn't exist. */\nexport async function listKick(dir: string): Promise<string[]> {\n try {\n // Names, not Dirents: Dirent.parentPath needs Node 20.12.\n const names = await readdir(dir, { recursive: true })\n return names.filter((n) => n.endsWith('.kick')).map((n) => join(dir, n))\n } catch {\n return []\n }\n}\n\nconst SKIP = new Set(['node_modules', 'dist', 'build', 'coverage', 'out'])\nconst SCRIPT = /\\.(?:[cm]?[jt]s|[jt]sx)$/\n\n/** TS / JS files under `root`, for `ctx.render('…')` names: no dependencies, build output, dot folders or `.d.ts`. */\nexport async function listScripts(root: string): Promise<string[]> {\n const out: string[] = []\n const walk = async (dir: string) => {\n let entries\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return\n }\n for (const e of entries) {\n if (e.name.startsWith('.') || SKIP.has(e.name)) continue\n const p = join(dir, e.name)\n if (e.isDirectory()) await walk(p)\n else if (SCRIPT.test(e.name) && !e.name.endsWith('.d.ts')) out.push(p)\n }\n }\n await walk(root)\n return out\n}\n\n/** `fn` over `items` with at most `limit` running at once, results in order. */\nexport async function mapLimit<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const out: R[] = Array.from({ length: items.length })\n let next = 0\n const worker = async () => {\n while (next < items.length) {\n const i = next++\n out[i] = await fn(items[i]!)\n }\n }\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker))\n return out\n}\n\n/** What the server watches: every template, and the pipes file wherever it's configured. */\nexport function watchPatterns(root: string, pipesFile: string): string[] {\n const patterns = ['**/*.kick', '**/pipes.{ts,js}']\n if (!/^pipes\\.(ts|js)$/.test(basename(pipesFile)))\n patterns.push(relative(root, pipesFile).split(sep).join('/'))\n return patterns\n}\n\nexport function startServer(): void {\n const connection = createConnection()\n const server = createServer(connection)\n let ws: Workspace | undefined\n let watched: string[] = []\n\n connection.listen()\n\n connection.onInitialize(async (params) => {\n // ponytail: the first workspace folder only; one Workspace per folder if multi-root matters.\n const folder = params.workspaceFolders?.[0]?.uri ?? params.rootUri\n const root = folder ? URI.parse(folder).fsPath : process.cwd()\n const opts = (params.initializationOptions ?? {}) as ServerOptions\n const at = (p: string) => (isAbsolute(p) ? p : resolve(root, p))\n const viewsDir = at(opts.viewsDir ?? 'src/views')\n const hasViews = existsSync(viewsDir)\n // A folder without templates stays quiet, even about the fallback.\n const { view } = await loadViewModule(\n root,\n (m) => hasViews && connection.console.warn(m),\n opts.trusted === true,\n )\n const pipesFile = at(opts.pipesFile ?? join(viewsDir, 'pipes.ts'))\n watched = watchPatterns(root, pipesFile)\n ws = new Workspace({\n root,\n viewsDir,\n componentsDir: opts.componentsDir ?? 'components',\n pipesFile,\n view,\n read: (p) => readFile(p, 'utf8').catch(() => undefined),\n list: listKick,\n layout: opts.layout || undefined,\n baseLayout: opts.baseLayout || undefined,\n // Read when a template is renamed: an open buffer's text, else the file's.\n // A bounded number of reads at once: a big project would otherwise run\n // out of file handles, and the failed reads would skip their calls.\n scripts: async () =>\n mapLimit(await listScripts(root), 64, async (p) => {\n const uri = URI.file(p).toString()\n const open = server.documents.get(URI.parse(uri))\n return { uri, text: open?.getText() ?? (await readFile(p, 'utf8').catch(() => '')) }\n }),\n })\n await ws.load()\n // Kick first: where a single answer wins (rename, hover), a component tag\n // is ours, not the HTML service's plain tag.\n return server.initialize(params, createSimpleProject([kickLanguagePlugin]), [\n createKickServicePlugin(ws),\n createHtmlService(),\n createCssService(),\n createEmmetService(),\n ])\n })\n\n connection.onInitialized(() => {\n server.initialized()\n void server.fileWatcher.watchFiles(watched)\n })\n\n server.fileWatcher.onDidChangeWatchedFiles(async ({ changes }) => {\n if (!ws) return\n for (const c of changes) {\n const path = URI.parse(c.uri).fsPath\n // 3: deleted; 1 / 2: created / changed.\n if (c.type === 3) await ws.fileDeleted(path)\n else await ws.fileChanged(path)\n }\n await server.languageFeatures.requestRefresh(false)\n })\n\n // Buffers count from the moment they open or change, not when a feature first\n // touches them: a page checked before its new component's buffer synced\n // would keep a stale error.\n server.documents.onDidChangeContent(({ document }) => {\n if (document.uri.endsWith('.kick')) ws?.sync(document.uri, document.getText())\n })\n\n // A closed buffer that was never saved stops counting: re-check what used it.\n server.documents.onDidClose(async ({ document }) => {\n if (!ws) return\n await ws.setBuffer(document.uri, undefined)\n await server.languageFeatures.requestRefresh(false)\n })\n\n connection.onRequest('kick/templateNames', () => {\n if (!ws) return []\n const dir = `${ws.componentsDir()}/`\n return ws.names().filter((n) => !n.startsWith(dir))\n })\n\n // For clients that keep TS / JS files to themselves (the VS Code extension):\n // the same render-call answers, over requests instead of document features.\n connection.onRequest(\n 'kick/renderDefinition',\n ({ text, offset }: { text: string; offset: number }) => {\n const link = ws && renderDefinition(ws, text, offset)\n return link ? { uri: link.targetUri, range: link.originSelectionRange } : null\n },\n )\n connection.onRequest('kick/renderDiagnostics', ({ text }: { text: string }) =>\n ws ? renderDiagnostics(ws, text) : [],\n )\n\n connection.onShutdown(() => server.shutdown())\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forinda/kickjs-view-language-server",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Language server for KickJS .kick views — diagnostics, completion, hover, definition and formatting from the runtime's own parser and checker",
5
5
  "keywords": [
6
6
  "kickjs",
@@ -56,7 +56,7 @@
56
56
  "volar-service-emmet": "~0.0.71",
57
57
  "volar-service-html": "~0.0.71",
58
58
  "vscode-uri": "^3.2.0",
59
- "@forinda/kickjs-view": "^0.1.1"
59
+ "@forinda/kickjs-view": "^0.3.0"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "tsdown",
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-pe6A1Wn-.js","names":["KEYWORD","closeParen","IDENT","FILE","TOP","KEYWORD","closeParen","createHtmlService","createCssService","createEmmetService"],"sources":["../src/language-plugin.ts","../src/context.ts","../src/plugin/completion.ts","../src/plugin/hover.ts","../src/plugin/definition.ts","../src/plugin/render-calls.ts","../src/plugin/diagnostics.ts","../src/plugin/format.ts","../src/plugin/tokens.ts","../src/plugin/references.ts","../src/plugin/index.ts","../src/view-module.ts","../src/pipes.ts","../src/positions.ts","../src/workspace.ts","../src/server.ts"],"sourcesContent":["/**\n * The Volar language plugin: each `.kick` file becomes a `KickVirtualCode`\n * whose embedded codes the HTML, CSS and JS services work on. The HTML copy\n * is the source with template syntax blanked to spaces, so every offset is\n * the same in both; blanked ranges aren't mapped, so the HTML service never\n * reports or completes inside them.\n *\n * Found by a lexical scan rather than the parser: the buffer being typed in\n * rarely parses, and the HTML service has to keep working while it doesn't.\n */\nimport type {\n CodeInformation,\n CodeMapping,\n IScriptSnapshot,\n LanguagePlugin,\n VirtualCode,\n} from '@volar/language-core'\nimport type { URI } from 'vscode-uri'\n\nconst ALL: CodeInformation = {\n verification: true,\n completion: true,\n semantic: true,\n navigation: true,\n structure: true,\n format: true,\n}\n/** Embedded documents never format: the kick formatter owns the whole file. */\nconst EMBEDDED: CodeInformation = { ...ALL, format: false }\n\nexport const KEYWORD =\n /^@(else\\s+if|if|for|switch|case|slot|layout|assets|verbatim|let|input|else|empty|default)(?![\\w$-])/\n\nconst snapshotOf = (text: string): IScriptSnapshot => ({\n getText: (start, end) => text.slice(start, end),\n getLength: () => text.length,\n getChangeRange: () => undefined,\n})\n\ntype Range = [number, number]\n\ninterface Scan {\n blank: Range[]\n styles: Range[]\n scripts: Range[]\n}\n\n/** The end of a `(`…`)` group starting at `i` (at `(`); the text's end when unclosed. */\nexport function closeParen(s: string, i: number): number {\n let depth = 0\n let quote = ''\n for (let j = i; j < s.length; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '(') depth++\n else if (c === ')' && --depth === 0) return j + 1\n }\n return s.length\n}\n\n/**\n * Where an `@let` value from `from` ends: its `;` outside quotes, as the\n * parser reads it; the line's end while it's unterminated, so typing one\n * doesn't swallow the lines below.\n */\nexport function letEnd(s: string, from: number): { at: number; closed: boolean } {\n let quote = ''\n for (let j = from; j < s.length; j++) {\n const c = s[j]!\n if (c === '\\n') return { at: j, closed: false }\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === ';') return { at: j, closed: true }\n }\n return { at: s.length, closed: false }\n}\n\n/** The end of `@verbatim { … }` from `brace` (at `{`): after its `}`, quoted braces skipped as the parser does. */\nexport function verbatimEnd(s: string, brace: number): number {\n let depth = 0\n let quote = ''\n for (let k = brace; k < s.length; k++) {\n const c = s[k]!\n if (quote) {\n if (c === '\\\\') k++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"' || c === '`') quote = c\n else if (c === '{') depth++\n else if (c === '}' && --depth === 0) return k + 1\n }\n return s.length\n}\n\n/** The end of a `{{ … }}` starting at `i`; the text's end when unclosed. */\nexport function closeInterp(s: string, i: number): number {\n let quote = ''\n for (let j = i + 2; j < s.length; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '}' && s[j + 1] === '}') return j + 2\n }\n return s.length\n}\n\nfunction scan(s: string): Scan {\n const out: Scan = { blank: [], styles: [], scripts: [] }\n let depth = 0\n let i = 0\n const skipWs = (j: number) => {\n while (j < s.length && /\\s/.test(s[j]!)) j++\n return j\n }\n while (i < s.length) {\n const c = s[i]!\n if (c === '{' && s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n const stop = end < 0 ? s.length : end + 4\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (c === '{' && s[i + 1] === '{') {\n const stop = closeInterp(s, i)\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (c === '<' && s.startsWith('<!--', i)) {\n const end = s.indexOf('-->', i + 4)\n i = end < 0 ? s.length : end + 3\n continue\n }\n // `</` alone (a close tag being typed) is text until a name follows.\n if (c === '<' && /^<\\/?[A-Za-z]/.test(s.slice(i, i + 3))) {\n i = tag(s, i, out)\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m = KEYWORD.exec(s.slice(i, i + 16))\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n let j = i + m[0].length\n if (kw === 'let' || kw === 'input') {\n const eol = s.indexOf('\\n', j)\n const end = kw === 'let' ? letEnd(s, j) : undefined\n const stop = end ? end.at + (end.closed ? 1 : 0) : eol < 0 ? s.length : eol\n out.blank.push([i, stop])\n i = stop\n continue\n }\n if (kw === 'verbatim') {\n const b = skipWs(j)\n if (s[b] === '{') {\n const stop = verbatimEnd(s, b)\n out.blank.push([i, stop])\n i = stop\n continue\n }\n }\n const p = skipWs(j)\n if (s[p] === '(') j = closeParen(s, p)\n else if (kw !== 'else' && kw !== 'empty' && kw !== 'default') {\n i++\n continue\n }\n if (kw === 'layout' || kw === 'assets') {\n out.blank.push([i, j])\n i = j\n continue\n }\n const b = skipWs(j)\n if (s[b] === '{') {\n out.blank.push([i, b + 1])\n depth++\n i = b + 1\n continue\n }\n out.blank.push([i, j])\n i = j\n continue\n }\n }\n if (c === '}' && depth > 0) {\n out.blank.push([i, i + 1])\n depth--\n i++\n continue\n }\n i++\n }\n return out\n}\n\n/** One tag from `i` (at `<`): interpolations and binding values blanked; script / style content recorded. */\nfunction tag(s: string, i: number, out: Scan): number {\n const m = /^<(\\/?)([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 64))!\n let j = i + m[0].length\n const closing = !!m[1]\n const name = m[2]!.toLowerCase()\n let type = ''\n while (j < s.length && s[j] !== '>') {\n const binding = /^\\[[^\\]\\s]+\\]\\s*=\\s*([\"'])/.exec(s.slice(j, j + 128))\n if (binding) {\n const q = binding[1]!\n const from = j + binding[0].length\n const end = s.indexOf(q, from)\n const stop = end < 0 ? s.length : end\n out.blank.push([from, stop])\n j = stop + 1\n continue\n }\n const t = /^type\\s*=\\s*([\"'])([^\"']*)\\1/i.exec(s.slice(j, j + 128))\n if (t) type = t[2]!.trim().toLowerCase()\n const q = s[j]\n if (q === '\"' || q === \"'\") {\n const end = s.indexOf(q, j + 1)\n const stop = end < 0 ? s.length : end\n for (let k = j + 1; k < stop; k++) {\n if (s[k] === '{' && s[k + 1] === '{') {\n const e = Math.min(closeInterp(s, k), stop)\n out.blank.push([k, e])\n k = e - 1\n }\n }\n j = stop + 1\n continue\n }\n j++\n }\n j = Math.min(j + 1, s.length)\n if (closing || (name !== 'script' && name !== 'style') || s[j - 2] === '/') return j\n // Raw text: up to its close tag, with {{ }} blanked (a JSON script's value).\n const close = new RegExp(`</${name}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i').exec(s.slice(j))\n const end = close ? j + close.index : s.length\n for (let k = j; k < end; k++) {\n if (s[k] === '{' && s[k + 1] === '{') {\n const e = Math.min(closeInterp(s, k), end)\n out.blank.push([k, e])\n k = e - 1\n }\n }\n if (name === 'style') out.styles.push([j, end])\n else if (type !== 'application/json' && type !== 'application/ld+json') out.scripts.push([j, end])\n return end\n}\n\nfunction embedded(id: string, languageId: string, text: string, [from, to]: Range): VirtualCode {\n return {\n id,\n languageId,\n snapshot: snapshotOf(text.slice(from, to)),\n mappings: [\n { sourceOffsets: [from], generatedOffsets: [0], lengths: [to - from], data: EMBEDDED },\n ],\n }\n}\n\nexport class KickVirtualCode implements VirtualCode {\n readonly id = 'root'\n readonly languageId = 'kick'\n readonly snapshot: IScriptSnapshot\n readonly mappings: CodeMapping[]\n readonly embeddedCodes: VirtualCode[]\n\n constructor(readonly text: string) {\n this.snapshot = snapshotOf(text)\n this.mappings = [\n { sourceOffsets: [0], generatedOffsets: [0], lengths: [text.length], data: ALL },\n ]\n const { blank, styles, scripts } = scan(text)\n const sorted = blank.toSorted((a, b) => a[0] - b[0])\n let html = ''\n const htmlMappings: CodeMapping[] = []\n let at = 0\n const keep = (from: number, to: number) => {\n if (to <= from) return\n html += text.slice(from, to)\n htmlMappings.push({\n sourceOffsets: [from],\n generatedOffsets: [from],\n lengths: [to - from],\n data: EMBEDDED,\n })\n }\n for (const [a, b] of sorted) {\n if (a < at) {\n // Overlapping range: blank the part not yet covered.\n if (b > at) {\n html += text.slice(at, b).replace(/[^\\n\\r]/g, ' ')\n at = b\n }\n continue\n }\n keep(at, a)\n html += text.slice(a, b).replace(/[^\\n\\r]/g, ' ')\n at = b\n }\n keep(at, text.length)\n this.embeddedCodes = [\n { id: 'html', languageId: 'html', snapshot: snapshotOf(html), mappings: htmlMappings },\n ...styles.map((r, n) => embedded(`css_${n}`, 'css', text, r)),\n ...scripts.map((r, n) => embedded(`js_${n}`, 'javascript', text, r)),\n ]\n }\n}\n\n/** TS / JS: a code only the kick service plugin reads, for `ctx.render('…')` names. */\nconst SCRIPT_IDS = new Set(['typescript', 'typescriptreact', 'javascript', 'javascriptreact'])\nconst SCRIPT_FILE = /\\.(?:[cm]?[jt]s|[jt]sx)$/\n\nclass RenderCallsCode implements VirtualCode {\n readonly id = 'root'\n // Not `typescript`: the HTML, CSS and Emmet services leave it alone.\n readonly languageId = 'kick-render'\n readonly snapshot: IScriptSnapshot\n readonly mappings: CodeMapping[]\n readonly embeddedCodes: VirtualCode[] = []\n\n constructor(text: string) {\n this.snapshot = snapshotOf(text)\n this.mappings = [\n { sourceOffsets: [0], generatedOffsets: [0], lengths: [text.length], data: EMBEDDED },\n ]\n }\n}\n\nexport const kickLanguagePlugin: LanguagePlugin<URI> = {\n getLanguageId(uri) {\n return uri.path.endsWith('.kick') ? 'kick' : undefined\n },\n // By the file name too: not every editor sends the `kick` languageId.\n createVirtualCode(uri, languageId, snapshot) {\n const text = snapshot.getText(0, snapshot.getLength())\n if (languageId === 'kick' || uri.path.endsWith('.kick')) return new KickVirtualCode(text)\n if (SCRIPT_IDS.has(languageId) || SCRIPT_FILE.test(uri.path)) return new RenderCallsCode(text)\n return undefined\n },\n}\n","/**\n * What sits at the cursor — read lexically from the text before it, because\n * the buffer being typed in rarely parses. Decides which completions apply\n * and which names are in scope there.\n */\nexport type CursorContext =\n | { kind: 'keyword'; prefix: string }\n | { kind: 'pipe'; prefix: string }\n | { kind: 'expr'; prefix: string; scope: string[] }\n | { kind: 'tag'; prefix: string }\n | { kind: 'attr'; tag: string; prefix: string }\n | { kind: 'template-name'; prefix: string }\n | { kind: 'slot-name'; prefix: string }\n | { kind: 'other' }\n\nexport const LOOP_VARS = ['$index', '$first', '$last', '$even', '$odd', '$count']\n\nconst IDENT = /[A-Za-z_$][\\w$]*/\n\n/** The end of `(`…`)` from `i` (at `(`), or -1 when it doesn't close before `stop`. */\nfunction closeParen(s: string, i: number, stop: number): number {\n let depth = 0\n let quote = ''\n for (let j = i; j < stop; j++) {\n const c = s[j]!\n if (quote) {\n if (c === '\\\\') j++\n else if (c === quote) quote = ''\n } else if (c === \"'\" || c === '\"') quote = c\n else if (c === '(') depth++\n else if (c === ')' && --depth === 0) return j + 1\n }\n return -1\n}\n\n/** Names a block header brings into its body. */\nfunction headerNames(kw: string, header: string): string[] {\n if (kw === 'for') {\n const [head, ...rest] = header.split(';')\n const m = /^\\s*(?:\\[\\s*([\\w$]+)\\s*,\\s*([\\w$]+)\\s*\\]|([\\w$]+))\\s+of\\b/.exec(head ?? '')\n const names = m ? (m[3] ? [m[3]] : [m[1]!, m[2]!]) : []\n for (const part of rest) {\n const lets = /^\\s*let\\s+(.*)$/.exec(part)\n if (lets) for (const d of lets[1]!.split(',')) names.push(d.split('=')[0]!.trim())\n }\n return [...names.filter(Boolean), ...LOOP_VARS]\n }\n if (kw === 'if' || kw === 'else if') {\n const as = /;\\s*as\\s+([\\w$]+)/.exec(header)\n return as ? [as[1]!] : []\n }\n return []\n}\n\n/** Names in scope at `stop`: inputs, then each enclosing block's, outermost first. */\nexport function scopeAt(s: string, stop: number): string[] {\n const inputs: string[] = []\n const frames: string[][] = [[]]\n let i = 0\n while (i < stop) {\n const c = s[i]!\n if (c === '{' && s[i + 1] === '{') {\n const end = s.indexOf(s.startsWith('{{--', i) ? '--}}' : '}}', i + 2)\n if (end < 0 || end >= stop) break\n i = end + 2\n continue\n }\n if (c === '<') {\n const end = s.startsWith('<!--', i) ? s.indexOf('-->', i) : s.indexOf('>', i)\n if (end < 0 || end >= stop) break\n i = end + 1\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m = /^@(else\\s+if|for|if|switch|case|slot|else|empty|default|let|input)(?![\\w$-])/.exec(\n s.slice(i, i + 16),\n )\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n let j = i + m[0].length\n if (kw === 'input') {\n const name = IDENT.exec(s.slice(j, j + 64))\n if (name) inputs.push(name[0])\n i = j\n continue\n }\n if (kw === 'let') {\n const name = /^\\s+([\\w$]+)\\s*=/.exec(s.slice(j, j + 64))\n const semi = s.indexOf(';', j)\n if (name && semi >= 0 && semi < stop) frames.at(-1)!.push(name[1]!)\n i = semi >= 0 && semi < stop ? semi + 1 : stop\n continue\n }\n let header = ''\n while (j < stop && /\\s/.test(s[j]!)) j++\n if (s[j] === '(') {\n const end = closeParen(s, j, stop)\n if (end < 0) break\n header = s.slice(j + 1, end - 1)\n j = end\n }\n while (j < stop && /\\s/.test(s[j]!)) j++\n if (s[j] === '{') {\n frames.push(headerNames(kw, header))\n i = j + 1\n continue\n }\n i = j\n continue\n }\n }\n if (c === '}' && frames.length > 1) frames.pop()\n i++\n }\n return [...inputs, ...frames.flat()]\n}\n\nfunction exprContext(segment: string, s: string, offset: number): CursorContext {\n const pipe = /\\|\\s*([A-Za-z_$][\\w$]*)?$/.exec(segment)\n if (pipe && !/\\|\\|\\s*[\\w$]*$/.test(segment)) return { kind: 'pipe', prefix: pipe[1] ?? '' }\n if (/\\??\\.\\s*[\\w$]*$/.test(segment)) return { kind: 'other' }\n const word = /([A-Za-z_$][\\w$]*)?$/.exec(segment)!\n return { kind: 'expr', prefix: word[1] ?? '', scope: scopeAt(s, offset) }\n}\n\nexport function cursorContext(s: string, offset: number): CursorContext {\n const before = s.slice(0, offset)\n\n // Inside {{ … }}\n const open = before.lastIndexOf('{{')\n if (open >= 0 && open > before.lastIndexOf('}}') && !before.startsWith('{{--', open)) {\n return exprContext(before.slice(open + 2), s, offset)\n }\n\n // @layout('… / @slot('…\n const named = /@(layout|slot)\\s*\\(\\s*['\"]([^'\"]*)$/.exec(before)\n if (named)\n return { kind: named[1] === 'layout' ? 'template-name' : 'slot-name', prefix: named[2]! }\n\n // @let name = …\n const letExpr = /@let\\s+[\\w$]+\\s*=\\s*([^;\\n]*)$/.exec(before)\n if (letExpr) return exprContext(letExpr[1]!, s, offset)\n\n // A block header that hasn't closed: @if (…, @for (…\n const header = /@(?:else\\s+if|if|for|switch|case)\\s*\\(([^]*)$/.exec(before)\n if (header && closeParen(before, before.length - header[1]!.length - 1, before.length) < 0) {\n return exprContext(header[1]!, s, offset)\n }\n\n // Inside a tag\n const tag = /<([A-Za-z][\\w:.-]*)((?:[^<>\"']|\"[^\"]*\"|'[^']*')*?)([\"'][^\"']*)?$/.exec(before)\n if (tag && !before.endsWith('>')) {\n const [, name, attrs = '', openValue] = tag\n if (openValue !== undefined) {\n // In a binding's value: an expression.\n if (/\\[[^\\]]+\\]\\s*=\\s*$/.test(attrs)) return exprContext(openValue.slice(1), s, offset)\n return { kind: 'other' }\n }\n if (!attrs) return { kind: 'tag', prefix: name! }\n if (name!.includes('-')) {\n const attr = /\\s\\[?([\\w-]*)$/.exec(attrs)\n if (attr) return { kind: 'attr', tag: name!.toLowerCase(), prefix: attr[1]! }\n }\n return { kind: 'other' }\n }\n\n // @keyword in text\n const kw = /(?<![\\w@.-])@([A-Za-z]*)$/.exec(before)\n if (kw) return { kind: 'keyword', prefix: kw[1]! }\n\n return { kind: 'other' }\n}\n\n/** The name under the cursor (pipes, tags, template names) and its range. */\nexport function wordAt(s: string, offset: number): { word: string; start: number; end: number } {\n let start = offset\n let end = offset\n while (start > 0 && /[\\w$/-]/.test(s[start - 1]!)) start--\n while (end < s.length && /[\\w$/-]/.test(s[end]!)) end++\n return { word: s.slice(start, end), start, end }\n}\n","/**\n * Completions the HTML service can't give: control-flow keywords, pipes,\n * components and their inputs, template and slot names, and the names in\n * scope inside an expression. Everything else is left to the HTML service.\n */\nimport type { CompletionItem } from '@volar/language-service'\nimport { cursorContext } from '../context'\nimport type { Workspace } from '../workspace'\n\nconst SNIPPET = 2 as const\nconst KEYWORD = 14 as const\nconst FUNCTION = 3 as const\nconst CLASS = 7 as const\nconst PROPERTY = 10 as const\nconst FILE = 17 as const\nconst VARIABLE = 6 as const\n\nconst KEYWORDS: Record<string, string> = {\n if: 'if (${1:condition}) {\\n\\t$0\\n}',\n 'else if': 'else if (${1:condition}) {\\n\\t$0\\n}',\n else: 'else {\\n\\t$0\\n}',\n for: 'for (${1:item} of ${2:items}) {\\n\\t$0\\n}',\n empty: 'empty {\\n\\t$0\\n}',\n switch: 'switch (${1:value}) {\\n\\t@case (${2:match}) {\\n\\t\\t$0\\n\\t}\\n}',\n case: 'case (${1:match}) {\\n\\t$0\\n}',\n default: 'default {\\n\\t$0\\n}',\n let: 'let ${1:name} = $2;',\n input: 'input ${1:name}',\n layout: \"layout('$1')\",\n slot: \"slot('${1:name}') {\\n\\t$0\\n}\",\n assets: \"assets('$1')\",\n verbatim: 'verbatim {\\n\\t$0\\n}',\n}\n\n/** The template a component tag names, if any. */\nexport function componentOf(ws: Workspace, tag: string): string | undefined {\n const dir = ws.componentsDir()\n return ws.names().find((n) => n.startsWith(`${dir}/`) && ws.view.componentTag(n, dir) === tag)\n}\n\n/** Slot names the layouts above `name` declare, nearest first. */\nfunction layoutSlots(ws: Workspace, name: string | undefined): string[] {\n const out = new Set<string>()\n const seen = new Set<string>()\n const chain: string[] = []\n let layout = name === undefined ? undefined : ws.layoutOf(name)\n while (layout !== undefined && !seen.has(layout)) {\n seen.add(layout)\n chain.push(layout)\n layout = ws.layoutOf(layout)\n }\n // The base layout wraps the chain, so its slots are fillable too.\n const base = ws.baseLayout()\n const page = name === undefined ? undefined : ws.astOf(name)\n if (\n base !== undefined &&\n name !== undefined &&\n page?.layout !== null &&\n !name.startsWith(`${ws.componentsDir()}/`) &&\n name !== base &&\n !seen.has(base)\n )\n chain.push(base)\n for (const l of chain) {\n const ast = ws.astOf(l)\n if (!ast) continue\n const stack = [ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'slot-outlet') {\n if (n.name) out.add(n.name)\n stack.push(n.fallback)\n } else if (n.k === 'element') 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 }\n return [...out]\n}\n\nexport function completions(\n ws: Workspace,\n uri: string,\n text: string,\n offset: number,\n): CompletionItem[] {\n const c = cursorContext(text, offset)\n switch (c.kind) {\n case 'keyword':\n return Object.entries(KEYWORDS).map(([label, insertText]) => ({\n label,\n kind: KEYWORD,\n insertText,\n insertTextFormat: SNIPPET,\n }))\n case 'pipe':\n return ws.pipeNames().map((label) => ({ label, kind: FUNCTION }))\n case 'tag': {\n const dir = ws.componentsDir()\n return ws\n .names()\n .filter((n) => n.startsWith(`${dir}/`))\n .map((n) => {\n const tag = ws.view.componentTag(n, dir)\n const required = (ws.astOf(n)?.inputs ?? []).filter((i) => !i.default)\n const attrs = required.map((i, k) => ` [${i.name}]=\"$${k + 1}\"`).join('')\n return {\n label: tag,\n kind: CLASS,\n insertText: `${tag}${attrs} />`,\n insertTextFormat: SNIPPET,\n }\n })\n }\n case 'attr': {\n const name = componentOf(ws, c.tag)\n if (!name) return []\n const inputs = ws.astOf(name)?.inputs ?? []\n return [\n ...inputs.flatMap((i) => [\n {\n label: `[${i.name}]`,\n kind: PROPERTY,\n insertText: `[${i.name}]=\"$1\"`,\n insertTextFormat: SNIPPET,\n },\n {\n label: i.name,\n kind: PROPERTY,\n insertText: `${i.name}=\"$1\"`,\n insertTextFormat: SNIPPET,\n },\n ]),\n { label: 'class', kind: PROPERTY },\n { label: 'id', kind: PROPERTY },\n ]\n }\n case 'template-name': {\n const dir = ws.componentsDir()\n return ws\n .names()\n .filter((n) => !n.startsWith(`${dir}/`))\n .map((label) => ({ label, kind: FILE }))\n }\n case 'slot-name':\n return layoutSlots(ws, ws.nameOf(uri)).map((label) => ({ label, kind: PROPERTY }))\n case 'expr':\n return [...new Set(c.scope)].map((label) => ({ label, kind: VARIABLE }))\n default:\n return []\n }\n}\n","/** Hover for pipes (built-in descriptions, app signatures) and component tags (their inputs). */\nimport type { Hover } from '@volar/language-service'\nimport { cursorContext, wordAt } from '../context'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\n\n/** Worded as in the guide's pipe table. */\nconst BUILTIN: Record<string, string> = {\n uppercase: '`uppercase` — the text in upper case',\n lowercase: '`lowercase` — the text in lower case',\n titlecase: '`titlecase` — each word capitalised',\n date: \"`date:format:timeZone?` — `short`, `medium`, `long`, `full`, `shortDate`, … e.g. `date:'short'`\",\n number: \"`number:digits` — `minInt.minFrac-maxFrac`, e.g. `number:'1.0-2'`\",\n currency: \"`currency:code:digits?` — e.g. `currency:'KES'`\",\n percent: '`percent:digits?` — a ratio as a percentage',\n slice: '`slice:start:end` — part of a list or string',\n keys: '`keys` — an object’s keys',\n entries: '`entries` — an object’s `[key, value]` pairs',\n json: '`json` — the value as JSON',\n url: '`url` — URL-encoded for a query string',\n raw: '`raw` — the HTML unescaped; only for trusted markup',\n}\n\nexport function hover(ws: Workspace, _uri: string, text: string, offset: number): Hover | null {\n const { word, start, end } = wordAt(text, offset)\n if (!word) return null\n const c = cursorContext(text, end)\n const md = (value: string): Hover => ({\n contents: { kind: 'markdown', value },\n range: { start: posOf(text, start), end: posOf(text, end) },\n })\n if (c.kind === 'pipe') {\n if (BUILTIN[word]) return md(BUILTIN[word])\n const decl = ws.pipeDeclaration(word)\n return decl ? md(`\\`\\`\\`ts\\n${decl.signature}\\n\\`\\`\\``) : null\n }\n if (c.kind === 'tag') {\n const name = componentOf(ws, word.toLowerCase())\n const ast = name === undefined ? undefined : ws.astOf(name)\n if (!ast) return null\n const lines = ast.inputs.map((i) =>\n i.default\n ? `- \\`${i.name}\\` = \\`${JSON.stringify(i.default.value)}\\``\n : `- \\`${i.name}\\` (required)`,\n )\n return md([`**<${word}>** — \\`${name}.kick\\``, ...lines].join('\\n'))\n }\n return null\n}\n\nexport function posOf(text: string, offset: number) {\n const before = text.slice(0, offset).split('\\n')\n return { line: before.length - 1, character: before.at(-1)!.length }\n}\n","/** Go to definition: a component tag to its file, `@layout('…')` to the layout, a pipe to `pipes.ts`. */\nimport type { LocationLink } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport { cursorContext, wordAt } from '../context'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\nimport { posOf } from './hover'\n\nconst TOP = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n\nexport function definition(\n ws: Workspace,\n _uri: string,\n text: string,\n offset: number,\n): LocationLink | null {\n const { word, start, end } = wordAt(text, offset)\n if (!word) return null\n const origin = { start: posOf(text, start), end: posOf(text, end) }\n const link = (targetUri: string, targetRange = TOP): LocationLink => ({\n originSelectionRange: origin,\n targetUri,\n targetRange,\n targetSelectionRange: targetRange,\n })\n const c = cursorContext(text, end)\n if (c.kind === 'tag') {\n const name = componentOf(ws, word.toLowerCase())\n return name === undefined ? null : link(ws.uriOf(name))\n }\n if (c.kind === 'template-name') {\n return ws.astOf(word) ? link(ws.uriOf(word)) : null\n }\n if (c.kind === 'pipe') {\n const decl = ws.pipeDeclaration(word)\n if (!decl) return null\n const at = { line: decl.line, character: decl.column }\n const range = { start: at, end: { line: decl.line, character: decl.column + word.length } }\n return link(URI.file(ws.pipesFile()).toString(), range)\n }\n return null\n}\n","/**\n * `ctx.render('…')` and `views.render('…')` in TypeScript and JavaScript:\n * template names completed, linked to their files, and checked. For editors\n * that attach this server to TS / JS files too.\n */\nimport type { CompletionItem, Diagnostic, LocationLink } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { posOf } from './hover'\n\n/** A call's template name as typed so far, up to the cursor. */\nconst OPEN_CALL = /\\b(?:ctx|views)\\.render\\(\\s*(['\"`])([^'\"`\\n]*)$/\n/** Every call with a literal name. */\nconst CALLS = /\\b(?:ctx|views)\\.render\\(\\s*(['\"`])([^'\"`\\n]*)\\1/g\n\nconst FILE = 17\n\n/** Template names a page can render: everything but components. */\nfunction renderable(ws: Workspace): string[] {\n const dir = `${ws.componentsDir()}/`\n return ws.names().filter((n) => !n.startsWith(dir))\n}\n\nexport function renderCompletions(\n ws: Workspace,\n text: string,\n offset: number,\n): CompletionItem[] | undefined {\n const m = OPEN_CALL.exec(text.slice(0, offset))\n if (!m) return undefined\n const range = { start: posOf(text, offset - m[2]!.length), end: posOf(text, offset) }\n return renderable(ws).map((name) => ({\n label: name,\n kind: FILE,\n textEdit: { range, newText: name },\n }))\n}\n\n/** Calls whose name is a plain literal (not a template string with `${…}`). */\nexport function calls(text: string): Array<{ name: string; offset: number }> {\n return [...text.matchAll(CALLS)]\n .filter((m) => !m[2]!.includes('${'))\n .map((m) => ({ name: m[2]!, offset: m.index + m[0].length - m[2]!.length - 1 }))\n}\n\nexport function renderDefinition(ws: Workspace, text: string, offset: number): LocationLink | null {\n const call = calls(text).find((c) => offset >= c.offset && offset <= c.offset + c.name.length)\n if (!call || !ws.astOf(call.name)) return null\n const top = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\n return {\n originSelectionRange: {\n start: posOf(text, call.offset),\n end: posOf(text, call.offset + call.name.length),\n },\n targetUri: ws.uriOf(call.name),\n targetRange: top,\n targetSelectionRange: top,\n }\n}\n\nexport function renderDiagnostics(ws: Workspace, text: string): Diagnostic[] {\n return calls(text)\n .filter((c) => !ws.astOf(c.name))\n .map((c) => ({\n range: { start: posOf(text, c.offset), end: posOf(text, c.offset + c.name.length) },\n severity: 2,\n source: 'kick',\n message: `template '${c.name}' not found`,\n }))\n}\n","/**\n * Template diagnostics as a Volar service plugin — the shape of Vue's\n * `vue-compiler-dom-errors`, around the engine's own `parse` + `check`.\n */\nimport type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type { Workspace } from '../workspace'\nimport { renderDiagnostics } from './render-calls'\n\n/** The `.kick` file a root virtual-code document belongs to. */\nexport function sourceUri(context: LanguageServiceContext, uri: string): string {\n return context.decodeEmbeddedDocumentUri?.(URI.parse(uri))?.[0].toString() ?? uri\n}\n\nexport function createDiagnosticsPlugin(ws: Workspace): LanguageServicePlugin {\n return {\n name: 'kick-diagnostics',\n capabilities: {\n // A component or layout changing changes its users' diagnostics.\n diagnosticProvider: { interFileDependencies: true, workspaceDiagnostics: false },\n },\n create(context) {\n return {\n provideDiagnostics(document) {\n if (document.languageId === 'kick-render')\n return renderDiagnostics(ws, document.getText())\n if (document.languageId !== 'kick') return undefined\n // The document's text is the editor's buffer: the workspace checks that.\n const uri = sourceUri(context, document.uri)\n ws.sync(uri, document.getText())\n return ws.diagnosticsFor(uri)\n },\n }\n },\n }\n}\n","/** Document formatting through the engine's own `format` — the same output as `kick fmt:views`. */\nimport type { TextEdit } from '@volar/language-service'\nimport type { ViewModule } from '../workspace'\nimport { posOf } from './hover'\n\n/** One whole-document edit, or none on a parse error or when nothing changes. */\nexport function formatEdits(\n view: ViewModule,\n text: string,\n file: string,\n tabSize: number,\n): TextEdit[] {\n const { output } = view.format(text, file, { indent: tabSize })\n if (output === undefined || output === text) return []\n return [\n { range: { start: { line: 0, character: 0 }, end: posOf(text, text.length) }, newText: output },\n ]\n}\n","/**\n * Semantic tokens for `.kick` templates, so every LSP editor highlights the\n * template syntax, not only VS Code with its TextMate grammar. Found by a\n * lexical scan, like the language plugin's: the buffer being typed in rarely\n * parses.\n */\nimport { closeInterp, closeParen, KEYWORD, letEnd, verbatimEnd } from '../language-plugin'\n\n/** The legend, in order: standard types, so themes colour them. */\nexport const TOKEN_TYPES = [\n 'keyword',\n 'comment',\n 'operator',\n 'function',\n 'variable',\n 'property',\n 'string',\n 'number',\n 'class',\n 'parameter',\n] as const\n\nexport type TokenType = (typeof TOKEN_TYPES)[number]\n\nexport interface KickToken {\n offset: number\n length: number\n type: TokenType\n}\n\nconst LITERALS = new Set(['true', 'false', 'null', 'undefined'])\n/** Words with a meaning in block headers: `@for (x of xs; track x.id; let i = $index)`, `@if (a; as b)`, `@layout(none)`. */\nconst HEADER_WORDS = new Set(['of', 'track', 'let', 'as', 'none'])\n\nexport function kickTokens(s: string, isComponent: (tag: string) => boolean): KickToken[] {\n const out: KickToken[] = []\n const push = (offset: number, length: number, type: TokenType) => {\n if (length > 0) out.push({ offset, length, type })\n }\n\n /** An expression in `[from, to)`. */\n const expr = (from: number, to: number, header: boolean) => {\n let prev = ''\n for (let i = from; i < to;) {\n const c = s[i]!\n if (/\\s/.test(c)) {\n i++\n continue\n }\n if (c === \"'\" || c === '\"' || c === '`') {\n let j = i + 1\n while (j < to && s[j] !== c) j += s[j] === '\\\\' ? 2 : 1\n j = Math.min(j + 1, to)\n push(i, j - i, 'string')\n prev = 'lit'\n i = j\n continue\n }\n const num = /^\\d+(?:\\.\\d+)?/.exec(s.slice(i, Math.min(to, i + 32)))\n if (num) {\n push(i, num[0].length, 'number')\n prev = 'lit'\n i += num[0].length\n continue\n }\n const word = /^[A-Za-z_$][\\w$]*/.exec(s.slice(i, Math.min(to, i + 128)))\n if (word) {\n const w = word[0]\n const type: TokenType =\n prev === '.'\n ? 'property'\n : prev === '|'\n ? 'function'\n : LITERALS.has(w) || (header && HEADER_WORDS.has(w))\n ? 'keyword'\n : 'variable'\n push(i, w.length, type)\n prev = 'word'\n i += w.length\n continue\n }\n if (c === '|' && s[i + 1] === '|') {\n prev = '||'\n i += 2\n continue\n }\n if (c === '|') push(i, 1, 'operator')\n // `?.` reads as `.`: the name after it is a property.\n prev = c === '?' && s[i + 1] === '.' ? '.' : c\n i += c === '?' && s[i + 1] === '.' ? 2 : 1\n }\n }\n\n /** `{{ … }}` from `i` (at `{{`); returns its end. */\n const interp = (i: number, limit: number) => {\n const end = Math.min(closeInterp(s, i), limit)\n const closed = s.startsWith('}}', end - 2) && end - 2 >= i + 2\n push(i, 2, 'operator')\n expr(i + 2, closed ? end - 2 : end, false)\n if (closed) push(end - 2, 2, 'operator')\n return end\n }\n\n /** One tag from `i` (at `<`); returns where scanning continues. */\n const tag = (i: number) => {\n const m = /^<(\\/?)([A-Za-z][\\w:.-]*)/.exec(s.slice(i, i + 64))!\n const name = m[2]!.toLowerCase()\n if (isComponent(name)) push(i + 1 + m[1]!.length, m[2]!.length, 'class')\n let j = i + m[0].length\n while (j < s.length && s[j] !== '>') {\n const binding = /^\\[([^\\]\\s]+)\\]\\s*=\\s*([\"'])/.exec(s.slice(j, j + 128))\n if (binding) {\n push(j + 1, binding[1]!.length, 'property')\n const from = j + binding[0].length\n const close = s.indexOf(binding[2]!, from)\n const stop = close < 0 ? s.length : close\n expr(from, stop, false)\n j = stop + 1\n continue\n }\n const q = s[j]\n if (q === '\"' || q === \"'\") {\n const close = s.indexOf(q, j + 1)\n const stop = close < 0 ? s.length : close\n for (let k = j + 1; k < stop; k++) if (s.startsWith('{{', k)) k = interp(k, stop) - 1\n j = stop + 1\n continue\n }\n j++\n }\n j = Math.min(j + 1, s.length)\n if (m[1] || (name !== 'script' && name !== 'style') || s[j - 2] === '/') return j\n // Raw text: only `{{ }}` (a JSON script's value) is template syntax.\n const close = new RegExp(`</${name}(?=[\\\\t\\\\n\\\\f\\\\r />])`, 'i').exec(s.slice(j))\n const end = close ? j + close.index : s.length\n for (let k = j; k < end; k++) if (s.startsWith('{{', k)) k = interp(k, end) - 1\n return end\n }\n\n let i = 0\n while (i < s.length) {\n const c = s[i]!\n if (s.startsWith('{{--', i)) {\n const end = s.indexOf('--}}', i + 4)\n const stop = end < 0 ? s.length : end + 4\n push(i, stop - i, 'comment')\n i = stop\n continue\n }\n if (s.startsWith('{{', i)) {\n i = interp(i, s.length)\n continue\n }\n if (s.startsWith('<!--', i)) {\n const end = s.indexOf('-->', i + 4)\n i = end < 0 ? s.length : end + 3\n continue\n }\n if (c === '<' && /^<\\/?[A-Za-z]/.test(s.slice(i, i + 3))) {\n i = tag(i)\n continue\n }\n if (c === '@' && !/[\\w@.-]/.test(s[i - 1] ?? '')) {\n const m = KEYWORD.exec(s.slice(i, i + 16))\n if (m) {\n const kw = m[1]!.replace(/\\s+/g, ' ')\n push(i, m[0].length, 'keyword')\n let j = i + m[0].length\n if (kw === 'input' || kw === 'let') {\n const decl = /^\\s+([\\w$]+)/.exec(s.slice(j, j + 64))\n if (decl)\n push(\n j + decl[0].length - decl[1]!.length,\n decl[1]!.length,\n kw === 'input' ? 'parameter' : 'variable',\n )\n const eol = s.indexOf('\\n', j)\n const stop = kw === 'let' ? letEnd(s, j).at : eol < 0 ? s.length : eol\n const eq = s.indexOf('=', j)\n if (eq >= 0 && eq < stop) expr(eq + 1, stop, false)\n i = stop\n continue\n }\n while (j < s.length && /\\s/.test(s[j]!)) j++\n if (kw === 'verbatim' && s[j] === '{') {\n i = verbatimEnd(s, j)\n continue\n }\n if (s[j] === '(') {\n const end = closeParen(s, j)\n expr(j + 1, s[end - 1] === ')' ? end - 1 : end, true)\n i = end\n continue\n }\n i = i + m[0].length\n continue\n }\n }\n i++\n }\n return out\n}\n","/**\n * Find references and rename for the names templates share: component tags,\n * layout names and pipes. Renaming a component or layout renames its file\n * too; renaming the file in the editor updates its uses (`fileRenameEdits`).\n */\nimport type { Location, Range, TextEdit, WorkspaceEdit } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type { Workspace } from '../workspace'\nimport { componentOf } from './completion'\nimport { posOf } from './hover'\nimport { calls } from './render-calls'\nimport { kickTokens } from './tokens'\n\ntype Target =\n | { kind: 'component'; name: string; tag: string }\n | { kind: 'layout'; name: string }\n | { kind: 'pipe'; name: string }\n\ninterface Use {\n uri: string\n text: string\n offset: number\n length: number\n}\n\nconst TOP = { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }\nconst IDENT = /^[A-Za-z_$][\\w$]*$/\nconst LAYOUT = /@layout\\s*\\(\\s*(['\"])([^'\"]*)\\1/g\n\nconst rangeOf = (text: string, offset: number, length: number): Range => ({\n start: posOf(text, offset),\n end: posOf(text, offset + length),\n})\n\n/** The shared name under the cursor, with where it sits in `text`. */\nfunction targetAt(\n ws: Workspace,\n text: string,\n offset: number,\n): { target: Target; offset: number; length: number } | undefined {\n const tokens = kickTokens(text, (tag) => componentOf(ws, tag) !== undefined)\n const t = tokens.find((k) => offset >= k.offset && offset <= k.offset + k.length)\n if (!t) return undefined\n const word = text.slice(t.offset, t.offset + t.length)\n if (t.type === 'class') {\n const name = componentOf(ws, word.toLowerCase())\n return name === undefined\n ? undefined\n : { target: { kind: 'component', name, tag: word.toLowerCase() }, ...t }\n }\n if (t.type === 'function') return { target: { kind: 'pipe', name: word }, ...t }\n if (t.type === 'string' && /@layout\\s*\\(\\s*$/.test(text.slice(0, t.offset))) {\n const name = word.slice(1, -1)\n return ws.astOf(name)\n ? { target: { kind: 'layout', name }, offset: t.offset + 1, length: name.length }\n : undefined\n }\n return undefined\n}\n\n/** Every use of `target` in the templates. */\nfunction usesOf(ws: Workspace, target: Target): Use[] {\n const out: Use[] = []\n for (const name of ws.names()) {\n const text = ws.textOf(name)\n if (text === undefined) continue\n const uri = ws.uriOf(name)\n if (target.kind === 'layout') {\n for (const m of text.matchAll(LAYOUT))\n if (m[2] === target.name)\n out.push({\n uri,\n text,\n offset: m.index + m[0].length - m[2].length - 1,\n length: m[2].length,\n })\n continue\n }\n const want = target.kind === 'component' ? 'class' : 'function'\n const match = target.kind === 'component' ? target.tag : target.name\n for (const t of kickTokens(text, (tag) => target.kind === 'component' && tag === target.tag))\n if (\n t.type === want &&\n text.slice(t.offset, t.offset + t.length).toLowerCase() === match.toLowerCase()\n )\n out.push({ uri, text, ...t })\n }\n return out\n}\n\n/** Where a pipe is declared in `pipes.ts`; only the forms the server can read. */\nfunction pipeDeclaration(ws: Workspace, name: string): Location | undefined {\n const decl = ws.pipeDeclaration(name)\n if (!decl) return undefined\n const start = { line: decl.line, character: decl.column }\n return {\n uri: URI.file(ws.pipesFile()).toString(),\n range: { start, end: { line: decl.line, character: decl.column + name.length } },\n }\n}\n\nexport function references(\n ws: Workspace,\n text: string,\n offset: number,\n includeDeclaration: boolean,\n): Location[] {\n const at = targetAt(ws, text, offset)\n if (!at) return []\n const { target } = at\n const locations: Location[] = usesOf(ws, target).map((u) => ({\n uri: u.uri,\n range: rangeOf(u.text, u.offset, u.length),\n }))\n if (includeDeclaration) {\n if (target.kind === 'pipe') {\n const decl = pipeDeclaration(ws, target.name)\n if (decl) locations.push(decl)\n } else locations.push({ uri: ws.uriOf(target.name), range: TOP })\n }\n return locations\n}\n\n/** What F2 renames here: a pipe, a component tag or a layout name. */\nexport function renameRange(\n ws: Workspace,\n text: string,\n offset: number,\n): Range | { message: string } | undefined {\n const at = targetAt(ws, text, offset)\n if (!at) return undefined\n if (at.target.kind === 'pipe' && !pipeDeclaration(ws, at.target.name))\n return {\n message: `Rename ${at.target.name} in your pipes file; it isn't declared in a form the editor can rename.`,\n }\n return rangeOf(text, at.offset, at.length)\n}\n\nconst TAG = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/\n\n/** The component file for `tag`, kept in the old one's folder when the tag still starts with it. */\nfunction componentNameFor(ws: Workspace, oldName: string, tag: string): string | undefined {\n if (!TAG.test(tag)) return undefined\n const dir = ws.componentsDir()\n const folders = oldName\n .slice(dir.length + 1)\n .split('/')\n .slice(0, -1)\n const prefix = folders.join('-')\n const name =\n prefix && tag.startsWith(`${prefix}-`)\n ? `${dir}/${folders.join('/')}/${tag.slice(prefix.length + 1)}`\n : `${dir}/${tag}`\n return ws.view.componentTag(name, dir) === tag ? name : undefined\n}\n\n/** Every use of `target` replaced with `newText`, then the template's file renamed. */\nfunction renameTemplate(\n ws: Workspace,\n target: Target,\n newText: string,\n newName: string,\n): WorkspaceEdit | undefined {\n if (target.kind === 'pipe') return undefined\n if (ws.view.templateName(newName) !== newName || ws.astOf(newName)) return undefined\n const byUri = new Map<string, TextEdit[]>()\n for (const u of usesOf(ws, target)) {\n const edits = byUri.get(u.uri) ?? []\n edits.push({ range: rangeOf(u.text, u.offset, u.length), newText })\n byUri.set(u.uri, edits)\n }\n return {\n documentChanges: [\n // Edits first, at the old URIs: the file moves after them.\n ...[...byUri].map(([uri, edits]) => ({ textDocument: { uri, version: null }, edits })),\n { kind: 'rename' as const, oldUri: ws.uriOf(target.name), newUri: ws.uriOf(newName) },\n ],\n }\n}\n\n/** A pipe renamed in every template and in `pipes.ts`; a component or layout, file included. */\nexport function renameEdits(\n ws: Workspace,\n text: string,\n offset: number,\n newName: string,\n): WorkspaceEdit | undefined {\n const at = targetAt(ws, text, offset)\n if (!at) return undefined\n const { target } = at\n if (target.kind === 'component') {\n const name = componentNameFor(ws, target.name, newName)\n return name === undefined ? undefined : renameTemplate(ws, target, newName, name)\n }\n if (target.kind === 'layout') return renameTemplate(ws, target, newName, newName)\n if (!IDENT.test(newName) || ws.project().pipes.has(newName)) return undefined\n const decl = pipeDeclaration(ws, target.name)\n if (!decl) return undefined\n const changes: Record<string, TextEdit[]> = {}\n const add = (uri: string, range: Range) => (changes[uri] ??= []).push({ range, newText: newName })\n for (const u of usesOf(ws, target)) add(u.uri, rangeOf(u.text, u.offset, u.length))\n add(decl.uri, decl.range)\n return { changes }\n}\n\n/**\n * Edits that keep uses pointing at renamed templates: a component's tags, a\n * layout's `@layout('…')`, a page's `ctx.render('…')`. `oldUri` / `newUri`\n * can be a file or a folder.\n */\nexport async function fileRenameEdits(\n ws: Workspace,\n oldUri: string,\n newUri: string,\n): Promise<WorkspaceEdit | undefined> {\n const from = ws.relOf(oldUri)?.replace(/\\.kick$/, '')\n const to = ws.relOf(newUri)?.replace(/\\.kick$/, '')\n if (from === undefined || to === undefined || from === to) return undefined\n const renamed = new Map<string, string>()\n for (const name of ws.names()) {\n if (name === from) renamed.set(name, to)\n else if (name.startsWith(`${from}/`)) renamed.set(name, to + name.slice(from.length))\n }\n if (!renamed.size) return undefined\n const changes: Record<string, TextEdit[]> = {}\n const dir = ws.componentsDir()\n for (const [oldName, newName] of renamed) {\n const comp = oldName.startsWith(`${dir}/`)\n const newTag = newName.startsWith(`${dir}/`) ? ws.view.componentTag(newName, dir) : undefined\n const targets: Array<[Target, string]> = [[{ kind: 'layout', name: oldName }, newName]]\n if (comp && newTag)\n targets.push([\n { kind: 'component', name: oldName, tag: ws.view.componentTag(oldName, dir)! },\n newTag,\n ])\n for (const [target, newText] of targets)\n for (const u of usesOf(ws, target))\n (changes[u.uri] ??= []).push({ range: rangeOf(u.text, u.offset, u.length), newText })\n }\n // Pages named in `ctx.render('…')` / `views.render('…')`.\n const pages = [...renamed].filter(([n]) => !n.startsWith(`${dir}/`))\n if (pages.length) {\n const to = new Map(pages)\n for (const script of await ws.scripts())\n for (const c of calls(script.text)) {\n const newName = to.get(c.name)\n if (newName !== undefined)\n (changes[script.uri] ??= []).push({\n range: rangeOf(script.text, c.offset, c.name.length),\n newText: newName,\n })\n }\n }\n return Object.keys(changes).length ? { changes } : undefined\n}\n","/**\n * The kick service plugin: diagnostics, completion, hover, go to definition\n * and formatting on the root `.kick` document. The embedded HTML / CSS / JS\n * codes are left to their own services.\n */\nimport type { LanguageServicePlugin, SemanticToken } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { completions, componentOf } from './completion'\nimport { definition } from './definition'\nimport { createDiagnosticsPlugin, sourceUri } from './diagnostics'\nimport { formatEdits } from './format'\nimport { hover } from './hover'\nimport { fileRenameEdits, references, renameEdits, renameRange } from './references'\nimport { renderCompletions, renderDefinition } from './render-calls'\nimport { kickTokens, TOKEN_TYPES } from './tokens'\n\nexport function createKickServicePlugin(ws: Workspace): LanguageServicePlugin {\n const diagnostics = createDiagnosticsPlugin(ws)\n return {\n name: 'kick',\n capabilities: {\n ...diagnostics.capabilities,\n completionProvider: { triggerCharacters: ['@', '|', '<', '[', \"'\", '\"'] },\n hoverProvider: true,\n definitionProvider: true,\n documentFormattingProvider: true,\n semanticTokensProvider: { legend: { tokenTypes: [...TOKEN_TYPES], tokenModifiers: [] } },\n referencesProvider: true,\n renameProvider: { prepareProvider: true },\n fileRenameEditsProvider: true,\n },\n create(context) {\n /** The source file's uri and text, with the workspace synced to the buffer. */\n const open = (document: { uri: string; languageId: string; getText(): string }) => {\n if (document.languageId !== 'kick') return undefined\n const uri = sourceUri(context, document.uri)\n const text = document.getText()\n ws.sync(uri, text)\n return { uri, text }\n }\n return {\n ...diagnostics.create(context),\n provideCompletionItems(document, position) {\n if (document.languageId === 'kick-render') {\n const items = renderCompletions(ws, document.getText(), document.offsetAt(position))\n return items && { isIncomplete: false, items }\n }\n const d = open(document)\n if (!d) return undefined\n const items = completions(ws, d.uri, d.text, document.offsetAt(position))\n return items.length ? { isIncomplete: false, items } : undefined\n },\n provideHover(document, position) {\n const d = open(document)\n return d\n ? (hover(ws, d.uri, d.text, document.offsetAt(position)) ?? undefined)\n : undefined\n },\n provideDefinition(document, position) {\n if (document.languageId === 'kick-render') {\n const link = renderDefinition(ws, document.getText(), document.offsetAt(position))\n return link ? [link] : undefined\n }\n const d = open(document)\n const link = d && definition(ws, d.uri, d.text, document.offsetAt(position))\n return link ? [link] : undefined\n },\n provideReferences(document, position, context) {\n const d = open(document)\n return d\n ? references(ws, d.text, document.offsetAt(position), context.includeDeclaration)\n : undefined\n },\n provideRenameRange(document, position) {\n const d = open(document)\n return d ? renameRange(ws, d.text, document.offsetAt(position)) : undefined\n },\n provideRenameEdits(document, position, newName) {\n const d = open(document)\n return d ? renameEdits(ws, d.text, document.offsetAt(position), newName) : undefined\n },\n provideFileRenameEdits(oldUri, newUri) {\n return fileRenameEdits(ws, oldUri.toString(), newUri.toString())\n },\n provideDocumentSemanticTokens(document, range, legend) {\n const d = open(document)\n if (!d) return undefined\n const tokens: SemanticToken[] = []\n for (const t of kickTokens(d.text, (tag) => componentOf(ws, tag) !== undefined)) {\n const type = legend.tokenTypes.indexOf(t.type)\n if (type < 0) continue\n // One token per line: not every client takes multi-line tokens.\n let at = t.offset\n for (const part of d.text.slice(t.offset, t.offset + t.length).split('\\n')) {\n const p = document.positionAt(at)\n if (part && p.line >= range.start.line && p.line <= range.end.line)\n tokens.push([p.line, p.character, part.length, type, 0])\n at += part.length + 1\n }\n }\n return tokens\n },\n provideDocumentFormattingEdits(document, _range, options) {\n const d = open(document)\n if (!d) return undefined\n return formatEdits(\n ws.view,\n d.text,\n `${ws.nameOf(d.uri) ?? 'template'}.kick`,\n options.tabSize,\n )\n },\n }\n },\n }\n}\n","/**\n * Which `@forinda/kickjs-view` the server runs: the project's own, so the\n * editor parses, checks and formats exactly as the app's build does, or the\n * copy bundled with the server when the project has none (or one too old to\n * have what the editor calls).\n */\nimport { readFileSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport * as bundled from '@forinda/kickjs-view'\nimport type { ViewModule } from './workspace'\n\ndeclare const __KICK_VIEW_VERSION__: string | undefined\n\n/** The version of the `@forinda/kickjs-view` package holding `entry`. */\nexport function packageVersion(entry: string): string | undefined {\n for (let dir = dirname(entry); dir !== dirname(dir); dir = dirname(dir)) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'))\n if (pkg.name === '@forinda/kickjs-view') return pkg.version\n } catch {}\n }\n return undefined\n}\n\n/**\n * Inlined into the editor extension's bundle at build time. The standalone\n * server imports whichever copy npm installed beside it, so read that one.\n */\nconst BUNDLED_VERSION =\n typeof __KICK_VIEW_VERSION__ === 'string'\n ? __KICK_VIEW_VERSION__\n : ((() => {\n try {\n return packageVersion(fileURLToPath(import.meta.resolve('@forinda/kickjs-view')))\n } catch {\n return undefined\n }\n })() ?? 'unknown')\n\n/** Conditions active for a Node `import`. */\nconst CONDITIONS = new Set(['node', 'import', 'default'])\n\n/**\n * The entry an exports target resolves to, as Node picks it: the first active\n * condition in the order the package declares them, following nested ones.\n */\nfunction pick(target: unknown): string | undefined {\n if (typeof target === 'string') return target\n if (!target || typeof target !== 'object') return undefined\n for (const [key, value] of Object.entries(target)) {\n if (!CONDITIONS.has(key)) continue\n const found = pick(value)\n if (found) return found\n }\n return undefined\n}\n\nconst REQUIRED = [\n 'parse',\n 'check',\n 'format',\n 'readPipeExports',\n 'templateName',\n 'componentTag',\n 'BUILTIN_PIPES',\n]\n\nlet warned = false\n\n/**\n * The project's `@forinda/kickjs-view` entry and version. Its exports map\n * only has `import`, which `require.resolve` can't see — so find the\n * package folder and read the entry from its exports.\n */\nfunction findProjectView(root: string): { entry: string; version: string } | undefined {\n // node_modules at and above the root only — not NODE_PATH or global folders.\n for (let dir = root; ; dir = dirname(dir)) {\n const pkgDir = join(dir, 'node_modules/@forinda/kickjs-view')\n let pkg\n try {\n pkg = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8'))\n } catch {\n if (dir === dirname(dir)) return undefined\n continue\n }\n const dot = typeof pkg.exports === 'string' ? pkg.exports : pkg.exports?.['.']\n const rel = pick(dot) ?? pkg.main\n const entry = resolve(pkgDir, typeof rel === 'string' ? rel : 'index.js')\n // An exports map pointing outside the package isn't followed.\n if (relative(pkgDir, entry).startsWith('..') || isAbsolute(relative(pkgDir, entry)))\n return undefined\n return { entry, version: pkg.version }\n }\n}\n\nexport async function loadViewModule(\n root: string,\n warn: (message: string) => void,\n /** The editor trusts this workspace: only then is the project's code imported. */\n trusted: boolean,\n): Promise<{ view: ViewModule; source: 'project' | 'bundled'; version: string }> {\n if (!trusted) return { view: bundled, source: 'bundled', version: BUNDLED_VERSION }\n const found = findProjectView(root)\n let reason = 'the project has no @forinda/kickjs-view'\n if (found) {\n reason = `the project's @forinda/kickjs-view ${found.version}`\n try {\n const mod = await import(pathToFileURL(found.entry).href)\n const missing = REQUIRED.filter((k) => !(k in mod))\n if (!missing.length)\n return { view: mod as ViewModule, source: 'project', version: found.version }\n reason += ` lacks ${missing.join(', ')}`\n } catch (err) {\n reason += ` failed to load: ${(err as Error).message}`\n }\n }\n if (!warned) {\n warned = true\n warn(`kick views: ${reason} — using the bundled ${BUNDLED_VERSION}`)\n }\n return { view: bundled, source: 'bundled', version: BUNDLED_VERSION }\n}\n","/**\n * Where each pipe in `pipes.ts` is declared and what it takes — for hover and\n * go to definition. Read lexically, like the engine's `readPipeExports`: only\n * `export const|let|var name = (…) =>` and `export function name(…)` forms.\n */\nexport interface PipeDeclaration {\n /** 0-based. */\n line: number\n column: number\n signature: string\n}\n\nconst DECL =\n /^export\\s+(?:(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*(?::[^=]*)?=\\s*(?:\\(([^)]*)\\)|([A-Za-z_$][\\w$]*)\\s*=>)|function\\s+([A-Za-z_$][\\w$]*)\\s*(?:<[^>]*>)?\\s*\\(([^)]*)\\))/d\n\nexport function pipeDeclarations(source: string): Map<string, PipeDeclaration> {\n const out = new Map<string, PipeDeclaration>()\n source.split('\\n').forEach((text, line) => {\n const m = DECL.exec(text)\n if (!m) return\n const group = m[1] === undefined ? 4 : 1\n const name = m[group]!\n const params = (m[2] ?? m[3] ?? m[5] ?? '').replace(/\\s+/g, ' ').trim()\n out.set(name, { line, column: m.indices![group]![0], signature: `${name}(${params})` })\n })\n return out\n}\n","/** The engine's 1-based line/column (UTF-16 units) to LSP's 0-based positions. */\nimport type { Position, Range } from '@volar/language-service'\nimport type { Pos, Span } from '@forinda/kickjs-view'\n\nexport const toPosition = (pos: Pos): Position => ({\n line: pos.line - 1,\n character: pos.column - 1,\n})\n\nexport const toRange = (span: Span): Range => ({\n start: toPosition(span.start),\n end: toPosition(span.end),\n})\n","/**\n * The editor's view of an app's templates: every `.kick` file under the\n * views folder (an open buffer wins over the file on disk) and the pipe names\n * from `pipes.ts`. Diagnostics come from the same `parse` + `check` the\n * runtime uses, cached per template and invalidated along the graph of\n * which template uses which component or layout.\n */\nimport { isAbsolute, posix, relative, sep } from 'node:path'\nimport type { Diagnostic } from '@volar/language-service'\nimport { URI } from 'vscode-uri'\nimport type * as View from '@forinda/kickjs-view'\nimport { pipeDeclarations, type PipeDeclaration } from './pipes'\nimport { toRange } from './positions'\n\nexport type ViewModule = typeof View\n\nexport interface WorkspaceOptions {\n root: string\n /** Absolute. */\n viewsDir: string\n componentsDir: string\n /** Absolute. */\n pipesFile: string\n view: ViewModule\n read(path: string): Promise<string | undefined>\n /** Every `.kick` file (absolute paths) under `dir`. */\n list(dir: string): Promise<string[]>\n /** `createViews({ layout })`: a page's layout when it declares none; one name, or folder prefix → layout. */\n layout?: string | Record<string, string>\n /** `createViews({ baseLayout })`: the shell around every page's outermost layout. */\n baseLayout?: string\n /** The project's TS / JS files with their text (an open buffer's when there is one), for `ctx.render('…')` names. */\n scripts?(): Promise<Array<{ uri: string; text: string }>>\n}\n\ninterface Entry {\n disk?: string\n buffer?: string\n ast: View.TemplateAst\n parseDiagnostics: View.Diagnostic[]\n /** Component tags and layout names the template refers to. */\n tags: Set<string>\n layouts: Set<string>\n}\n\nexport class Workspace {\n private readonly entries = new Map<string, Entry>()\n private readonly cache = new Map<string, Diagnostic[]>()\n private pipes: string[] = []\n private pipeDecls = new Map<string, PipeDeclaration>()\n\n constructor(private readonly opts: WorkspaceOptions) {}\n\n get view(): ViewModule {\n return this.opts.view\n }\n\n async load(): Promise<void> {\n await this.loadPipes()\n for (const path of await this.opts.list(this.opts.viewsDir)) {\n const name = this.nameOfPath(path)\n if (name) this.update(name, { disk: await this.opts.read(path) })\n }\n }\n\n // ── names ─────────────────────────────────────────────────────────────\n\n private nameOfPath(path: string): string | undefined {\n const rel = relative(this.opts.viewsDir, path).split(sep).join(posix.sep)\n if (rel.startsWith('..') || !rel.endsWith('.kick')) return undefined\n return this.opts.view.templateName(rel.slice(0, -'.kick'.length))\n }\n\n /** `uri`'s path inside the views folder (`layouts/main.kick`, `layouts`); `undefined` outside it. */\n relOf(uri: string): string | undefined {\n const rel = relative(this.opts.viewsDir, URI.parse(uri).fsPath).split(sep).join(posix.sep)\n return rel.startsWith('..') || isAbsolute(rel) ? undefined : rel\n }\n\n nameOf(uri: string): string | undefined {\n return this.nameOfPath(URI.parse(uri).fsPath)\n }\n\n uriOf(name: string): string {\n return URI.file(`${this.opts.viewsDir}/${name}.kick`).toString()\n }\n\n componentsDir(): string {\n return this.opts.componentsDir\n }\n\n pathOf(name: string): string {\n return `${this.opts.viewsDir}/${name}.kick`\n }\n\n names(): string[] {\n return [...this.entries.keys()]\n }\n\n textOf(name: string): string | undefined {\n const e = this.entries.get(name)\n return e?.buffer ?? e?.disk\n }\n\n astOf(name: string): View.TemplateAst | undefined {\n return this.entries.get(name)?.ast\n }\n\n // ── changes ───────────────────────────────────────────────────────────\n\n /** An editor buffer for `uri`; `undefined` drops it and the file on disk applies again. */\n setBuffer(uri: string, text: string | undefined): void {\n const name = this.nameOf(uri)\n if (!name) return\n const e = this.entries.get(name)\n if (text === undefined && e?.disk === undefined) {\n this.remove(name)\n return\n }\n this.update(name, { disk: e?.disk, buffer: text })\n }\n\n /** `setBuffer`, skipped when the buffer is already `text`. */\n sync(uri: string, text: string): void {\n if (this.textOf(this.nameOf(uri) ?? '') !== text) this.setBuffer(uri, text)\n }\n\n async fileChanged(path: string): Promise<void> {\n if (path === this.opts.pipesFile) {\n await this.loadPipes()\n this.cache.clear()\n return\n }\n const name = this.nameOfPath(path)\n if (name)\n this.update(name, {\n disk: await this.opts.read(path),\n buffer: this.entries.get(name)?.buffer,\n })\n }\n\n async fileDeleted(path: string): Promise<void> {\n if (path === this.opts.pipesFile) {\n this.pipes = []\n this.pipeDecls = new Map()\n this.cache.clear()\n return\n }\n const name = this.nameOfPath(path)\n if (!name) return\n const buffer = this.entries.get(name)?.buffer\n // Still open in an editor: keep the buffer, but closing it now removes the template.\n if (buffer !== undefined) this.update(name, { buffer })\n else this.remove(name)\n }\n\n private async loadPipes(): Promise<void> {\n const source = await this.opts.read(this.opts.pipesFile)\n this.pipes =\n source === undefined ? [] : this.opts.view.readPipeExports(source, this.opts.pipesFile).names\n this.pipeDecls = source === undefined ? new Map() : pipeDeclarations(source)\n }\n\n private update(name: string, src: { disk?: string; buffer?: string }): void {\n const text = src.buffer ?? src.disk ?? ''\n const parsed = this.opts.view.parse(text, `${name}.kick`)\n const tags = new Set<string>()\n const layouts = new Set<string>()\n if (typeof parsed.ast.layout === 'string') layouts.add(parsed.ast.layout)\n const stack: View.Node[][] = [parsed.ast.body]\n while (stack.length) {\n for (const n of stack.pop()!) {\n if (n.k === 'element') {\n if (!n.foreign && n.tag.includes('-')) tags.add(n.tag.toLowerCase())\n 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-outlet') stack.push(n.fallback)\n else if (n.k === 'slot-fill') stack.push(n.body)\n }\n }\n const isNew = !this.entries.has(name)\n this.entries.set(name, {\n ...src,\n ast: parsed.ast,\n parseDiagnostics: parsed.diagnostics,\n tags,\n layouts,\n })\n this.invalidate(name, isNew)\n }\n\n private remove(name: string): void {\n this.entries.delete(name)\n this.invalidate(name, true)\n }\n\n /** Drop cached diagnostics for `name` and every template that uses it, transitively. */\n private invalidate(name: string, membershipChanged: boolean): void {\n const todo = [name]\n const seen = new Set<string>()\n while (todo.length) {\n const n = todo.pop()!\n if (seen.has(n)) continue\n seen.add(n)\n this.cache.delete(n)\n for (const d of this.dependentsOf(n)) todo.push(d)\n }\n // A template appearing or disappearing can change how unknown tags resolve elsewhere.\n if (membershipChanged && name.startsWith(`${this.opts.componentsDir}/`)) {\n const tag = this.opts.view.componentTag(name, this.opts.componentsDir)\n for (const [n, e] of this.entries) if (e.tags.has(tag)) this.cache.delete(n)\n }\n }\n\n /** Templates that use `name` as a component or a layout — a layout even after it's gone. */\n dependentsOf(name: string): Set<string> {\n // A configured layout can wrap any page: re-check them all.\n if (this.configuredLayouts().has(name)) return new Set(this.names().filter((n) => n !== name))\n const out = new Set<string>()\n const tag = name.startsWith(`${this.opts.componentsDir}/`)\n ? this.opts.view.componentTag(name, this.opts.componentsDir)\n : undefined\n for (const [n, e] of this.entries) {\n if (n === name) continue\n if ((tag && e.tags.has(tag) && this.entries.has(name)) || e.layouts.has(name)) out.add(n)\n }\n return out\n }\n\n // ── what check sees ───────────────────────────────────────────────────\n\n pipeNames(): string[] {\n return [...this.opts.view.BUILTIN_PIPES, ...this.pipes]\n }\n\n /** Where an app pipe is declared in `pipes.ts`, and its parameters. */\n pipeDeclaration(name: string): PipeDeclaration | undefined {\n return this.pipeDecls.get(name)\n }\n\n pipesFile(): string {\n return this.opts.pipesFile\n }\n\n project(): View.Project {\n return {\n templates: new Map([...this.entries].map(([n, e]) => [n, e.ast])),\n pipes: new Set(this.pipeNames()),\n componentsDir: this.opts.componentsDir,\n layouts: this.opts.layout,\n baseLayout: this.opts.baseLayout,\n }\n }\n\n /** Templates that are layouts by configuration: the mapping's targets and the base layout. */\n configuredLayouts(): Set<string> {\n const { layout, baseLayout } = this.opts\n const out = new Set(typeof layout === 'string' ? [layout] : Object.values(layout ?? {}))\n if (baseLayout) out.add(baseLayout)\n return out\n }\n\n scripts(): Promise<Array<{ uri: string; text: string }>> {\n return this.opts.scripts?.() ?? Promise.resolve([])\n }\n\n baseLayout(): string | undefined {\n return this.opts.baseLayout\n }\n\n /**\n * The layout `name` renders in: its own `@layout`, else the configured\n * mapping's longest matching folder prefix (pages only, as `check` does).\n */\n layoutOf(name: string): string | undefined {\n const ast = this.astOf(name)\n if (!ast) return undefined\n if (ast.layout !== undefined) return ast.layout ?? undefined\n const { layout } = this.opts\n if (\n layout === undefined ||\n name.startsWith(`${this.opts.componentsDir}/`) ||\n this.configuredLayouts().has(name)\n )\n return undefined\n if (typeof layout === 'string') return layout\n const hit = Object.keys(layout)\n .toSorted((a, b) => b.length - a.length)\n .find((p) => p === '' || name === p || name.startsWith(`${p}/`))\n return hit === undefined ? undefined : layout[hit]\n }\n\n /** Parse errors, else everything `check` reports — as LSP diagnostics. */\n diagnosticsFor(uri: string): Diagnostic[] {\n const name = this.nameOf(uri)\n const e = name === undefined ? undefined : this.entries.get(name)\n if (!name || !e) return []\n const cached = this.cache.get(name)\n if (cached) return cached\n const engine = e.parseDiagnostics.some((d) => d.severity === 'error')\n ? e.parseDiagnostics\n : [...e.parseDiagnostics, ...this.opts.view.check(name, this.project()).diagnostics]\n const out = engine.map((d): Diagnostic => ({\n range: toRange(d.span),\n severity: d.severity === 'error' ? 1 : 2,\n source: 'kick',\n message: d.message,\n }))\n this.cache.set(name, out)\n return out\n }\n}\n","/**\n * The language server: Volar's server with the `.kick` language plugin and\n * the HTML, CSS, Emmet and kick service plugins, over the project's own\n * `@forinda/kickjs-view` when it has one.\n */\nimport { existsSync } from 'node:fs'\nimport { readdir, readFile } from 'node:fs/promises'\nimport { basename, isAbsolute, join, relative, resolve, sep } from 'node:path'\nimport { createConnection, createServer, createSimpleProject } from '@volar/language-server/node.js'\nimport { create as createCssService } from 'volar-service-css'\nimport { create as createEmmetService } from 'volar-service-emmet'\nimport { create as createHtmlService } from 'volar-service-html'\nimport { URI } from 'vscode-uri'\nimport { kickLanguagePlugin } from './language-plugin'\nimport { createKickServicePlugin } from './plugin/index'\nimport { renderDefinition, renderDiagnostics } from './plugin/render-calls'\nimport { loadViewModule } from './view-module'\nimport { Workspace } from './workspace'\n\n/** `initializationOptions`; paths are relative to the workspace folder. */\nexport interface ServerOptions {\n /** Default `src/views`. */\n viewsDir?: string\n /** Default `components`, inside the views folder. */\n componentsDir?: string\n /** Default `<viewsDir>/pipes.ts`. */\n pipesFile?: string\n /** `createViews({ layout })`: a page's layout when it declares none; one name, or folder prefix → layout. */\n layout?: string | Record<string, string>\n /** `createViews({ baseLayout })`. */\n baseLayout?: string\n /**\n * The editor trusts the workspace, so the project's own `@forinda/kickjs-view`\n * may be imported. Otherwise the bundled copy is used. Default `false`.\n */\n trusted?: boolean\n}\n\n/** Every `.kick` file under `dir`; none when it doesn't exist. */\nexport async function listKick(dir: string): Promise<string[]> {\n try {\n // Names, not Dirents: Dirent.parentPath needs Node 20.12.\n const names = await readdir(dir, { recursive: true })\n return names.filter((n) => n.endsWith('.kick')).map((n) => join(dir, n))\n } catch {\n return []\n }\n}\n\nconst SKIP = new Set(['node_modules', 'dist', 'build', 'coverage', 'out'])\nconst SCRIPT = /\\.(?:[cm]?[jt]s|[jt]sx)$/\n\n/** TS / JS files under `root`, for `ctx.render('…')` names: no dependencies, build output, dot folders or `.d.ts`. */\nexport async function listScripts(root: string): Promise<string[]> {\n const out: string[] = []\n const walk = async (dir: string) => {\n let entries\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return\n }\n for (const e of entries) {\n if (e.name.startsWith('.') || SKIP.has(e.name)) continue\n const p = join(dir, e.name)\n if (e.isDirectory()) await walk(p)\n else if (SCRIPT.test(e.name) && !e.name.endsWith('.d.ts')) out.push(p)\n }\n }\n await walk(root)\n return out\n}\n\n/** `fn` over `items` with at most `limit` running at once, results in order. */\nexport async function mapLimit<T, R>(\n items: T[],\n limit: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const out: R[] = Array.from({ length: items.length })\n let next = 0\n const worker = async () => {\n while (next < items.length) {\n const i = next++\n out[i] = await fn(items[i]!)\n }\n }\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker))\n return out\n}\n\n/** What the server watches: every template, and the pipes file wherever it's configured. */\nexport function watchPatterns(root: string, pipesFile: string): string[] {\n const patterns = ['**/*.kick', '**/pipes.{ts,js}']\n if (!/^pipes\\.(ts|js)$/.test(basename(pipesFile)))\n patterns.push(relative(root, pipesFile).split(sep).join('/'))\n return patterns\n}\n\nexport function startServer(): void {\n const connection = createConnection()\n const server = createServer(connection)\n let ws: Workspace | undefined\n let watched: string[] = []\n\n connection.listen()\n\n connection.onInitialize(async (params) => {\n // ponytail: the first workspace folder only; one Workspace per folder if multi-root matters.\n const folder = params.workspaceFolders?.[0]?.uri ?? params.rootUri\n const root = folder ? URI.parse(folder).fsPath : process.cwd()\n const opts = (params.initializationOptions ?? {}) as ServerOptions\n const at = (p: string) => (isAbsolute(p) ? p : resolve(root, p))\n const viewsDir = at(opts.viewsDir ?? 'src/views')\n const hasViews = existsSync(viewsDir)\n // A folder without templates stays quiet, even about the fallback.\n const { view } = await loadViewModule(\n root,\n (m) => hasViews && connection.console.warn(m),\n opts.trusted === true,\n )\n const pipesFile = at(opts.pipesFile ?? join(viewsDir, 'pipes.ts'))\n watched = watchPatterns(root, pipesFile)\n ws = new Workspace({\n root,\n viewsDir,\n componentsDir: opts.componentsDir ?? 'components',\n pipesFile,\n view,\n read: (p) => readFile(p, 'utf8').catch(() => undefined),\n list: listKick,\n layout: opts.layout || undefined,\n baseLayout: opts.baseLayout || undefined,\n // Read when a template is renamed: an open buffer's text, else the file's.\n // A bounded number of reads at once: a big project would otherwise run\n // out of file handles, and the failed reads would skip their calls.\n scripts: async () =>\n mapLimit(await listScripts(root), 64, async (p) => {\n const uri = URI.file(p).toString()\n const open = server.documents.get(URI.parse(uri))\n return { uri, text: open?.getText() ?? (await readFile(p, 'utf8').catch(() => '')) }\n }),\n })\n await ws.load()\n // Kick first: where a single answer wins (rename, hover), a component tag\n // is ours, not the HTML service's plain tag.\n return server.initialize(params, createSimpleProject([kickLanguagePlugin]), [\n createKickServicePlugin(ws),\n createHtmlService(),\n createCssService(),\n createEmmetService(),\n ])\n })\n\n connection.onInitialized(() => {\n server.initialized()\n void server.fileWatcher.watchFiles(watched)\n })\n\n server.fileWatcher.onDidChangeWatchedFiles(async ({ changes }) => {\n if (!ws) return\n for (const c of changes) {\n const path = URI.parse(c.uri).fsPath\n // 3: deleted; 1 / 2: created / changed.\n if (c.type === 3) await ws.fileDeleted(path)\n else await ws.fileChanged(path)\n }\n await server.languageFeatures.requestRefresh(false)\n })\n\n // Buffers count from the moment they open or change, not when a feature first\n // touches them: a page checked before its new component's buffer synced\n // would keep a stale error.\n server.documents.onDidChangeContent(({ document }) => {\n if (document.uri.endsWith('.kick')) ws?.sync(document.uri, document.getText())\n })\n\n // A closed buffer that was never saved stops counting: re-check what used it.\n server.documents.onDidClose(async ({ document }) => {\n if (!ws) return\n await ws.setBuffer(document.uri, undefined)\n await server.languageFeatures.requestRefresh(false)\n })\n\n connection.onRequest('kick/templateNames', () => {\n if (!ws) return []\n const dir = `${ws.componentsDir()}/`\n return ws.names().filter((n) => !n.startsWith(dir))\n })\n\n // For clients that keep TS / JS files to themselves (the VS Code extension):\n // the same render-call answers, over requests instead of document features.\n connection.onRequest(\n 'kick/renderDefinition',\n ({ text, offset }: { text: string; offset: number }) => {\n const link = ws && renderDefinition(ws, text, offset)\n return link ? { uri: link.targetUri, range: link.originSelectionRange } : null\n },\n )\n connection.onRequest('kick/renderDiagnostics', ({ text }: { text: string }) =>\n ws ? renderDiagnostics(ws, text) : [],\n )\n\n connection.onShutdown(() => server.shutdown())\n}\n"],"mappings":"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"}