@forinda/kickjs-view-language-server 0.0.0 → 0.1.0

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":";;;;;;;UAmBiB;;EAEf;;EAEA;;EAEA;;;;;EAKA;;wBAcc;;;;;;;;UCvCC;;EAEf;EACA;EACA;;;;KCKU,oBAAoB;UAEf;EACf;;EAEA;EACA;;EAEA;EACA,MAAM;EACN,KAAK,eAAe;;EAEpB,KAAK,cAAc;;qBAaR;mBAMkB;mBALZ;mBACA;UACT;UACA;EAER,YAA6B,MAAM;MAE/B,QAAQ;EAIN,QAAQ;UAUN;EAMR,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;EAc5B;;EAKA,gBAAgB,eAAe;EAI/B;EAIA,WAAW,KAAK;;EAShB,eAAe,cAAc;;;;qBCNlB,2BAA2B;WAOjB;WANZ;WACA;WACA,UAAU;WACV,UAAU;WACV,eAAe;EAExB,YAAqB;;qBA0CV,oBAAoB,eAAe;;;wBC/QhC,wBAAwB,IAAI,YAAY;;;wBC0ClC,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":";;;;;;;UAmBiB;;EAEf;;EAEA;;EAEA;;;;;EAKA;;wBAsBc;;;;;;;;UC/CC;;EAEf;EACA;EACA;;;;KCKU,oBAAoB;UAEf;EACf;;EAEA;EACA;;EAEA;EACA,MAAM;EACN,KAAK,eAAe;;EAEpB,KAAK,cAAc;;qBAaR;mBAMkB;mBALZ;mBACA;UACT;UACA;EAER,YAA6B,MAAM;MAE/B,QAAQ;EAIN,QAAQ;UAUN;EAMR,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;EAc5B;;EAKA,gBAAgB,eAAe;EAI/B;EAIA,WAAW,KAAK;;EAShB,eAAe,cAAc;;;;qBCLlB,2BAA2B;WAOjB;WANZ;WACA;WACA,UAAU;WACV,UAAU;WACV,eAAe;EAExB,YAAqB;;qBA0CV,oBAAoB,eAAe;;;wBChRhC,wBAAwB,IAAI,YAAY;;;wBC0ClC,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.0.0
2
+ * @forinda/kickjs-view-language-server v0.1.0
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-BINLQyYR.js";
11
+ export { a as KickVirtualCode, n as Workspace, i as createKickServicePlugin, o as kickLanguagePlugin, r as loadViewModule, t as startServer } from "./server-3edMz3HM.js";
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @forinda/kickjs-view-language-server v0.0.0
2
+ * @forinda/kickjs-view-language-server v0.1.0
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-BINLQyYR.js";
11
+ import { t as startServer } from "./server-3edMz3HM.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.0.0
2
+ * @forinda/kickjs-view-language-server v0.1.0
3
3
  *
4
4
  * Copyright (c) Felix Orinda
5
5
  *
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import { existsSync, readFileSync } from "node:fs";
12
12
  import { readFile, readdir } from "node:fs/promises";
13
- import { dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
13
+ import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
14
14
  import { createConnection, createServer, createSimpleProject } from "@volar/language-server/node.js";
15
15
  import { create } from "volar-service-css";
16
16
  import { create as create$1 } from "volar-service-emmet";
@@ -98,7 +98,7 @@ function scan(s) {
98
98
  i = end < 0 ? s.length : end + 3;
99
99
  continue;
100
100
  }
101
- if (c === "<" && /[A-Za-z/]/.test(s[i + 1] ?? "")) {
101
+ if (c === "<" && /^<\/?[A-Za-z]/.test(s.slice(i, i + 3))) {
102
102
  i = tag(s, i, out);
103
103
  continue;
104
104
  }
@@ -786,7 +786,7 @@ function createKickServicePlugin(ws) {
786
786
  * copy bundled with the server when the project has none (or one too old to
787
787
  * have what the editor calls).
788
788
  */
789
- const BUNDLED_VERSION = "0.0.0";
789
+ const BUNDLED_VERSION = "0.1.0";
790
790
  const REQUIRED = [
791
791
  "parse",
792
792
  "check",
@@ -857,17 +857,18 @@ async function loadViewModule(root, warn, trusted) {
857
857
  }
858
858
  //#endregion
859
859
  //#region src/pipes.ts
860
- const DECL = /^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*\(([^)]*)\))/;
860
+ const DECL = /^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;
861
861
  function pipeDeclarations(source) {
862
862
  const out = /* @__PURE__ */ new Map();
863
863
  source.split("\n").forEach((text, line) => {
864
864
  const m = DECL.exec(text);
865
865
  if (!m) return;
866
- const name = m[1] ?? m[4];
866
+ const group = m[1] === void 0 ? 4 : 1;
867
+ const name = m[group];
867
868
  const params = (m[2] ?? m[3] ?? m[5] ?? "").replace(/\s+/g, " ").trim();
868
869
  out.set(name, {
869
870
  line,
870
- column: text.indexOf(name),
871
+ column: m.indices[group][0],
871
872
  signature: `${name}(${params})`
872
873
  });
873
874
  });
@@ -943,7 +944,7 @@ var Workspace = class {
943
944
  const name = this.nameOf(uri);
944
945
  if (!name) return;
945
946
  const e = this.entries.get(name);
946
- if (text === void 0 && !e?.disk) {
947
+ if (text === void 0 && e?.disk === void 0) {
947
948
  this.remove(name);
948
949
  return;
949
950
  }
@@ -1082,20 +1083,25 @@ var Workspace = class {
1082
1083
  * the HTML, CSS, Emmet and kick service plugins, over the project's own
1083
1084
  * `@forinda/kickjs-view` when it has one.
1084
1085
  */
1086
+ /** Every `.kick` file under `dir`; none when it doesn't exist. */
1085
1087
  async function listKick(dir) {
1086
1088
  try {
1087
- return (await readdir(dir, {
1088
- recursive: true,
1089
- withFileTypes: true
1090
- })).filter((e) => e.isFile() && e.name.endsWith(".kick")).map((e) => join(e.parentPath, e.name));
1089
+ return (await readdir(dir, { recursive: true })).filter((n) => n.endsWith(".kick")).map((n) => join(dir, n));
1091
1090
  } catch {
1092
1091
  return [];
1093
1092
  }
1094
1093
  }
1094
+ /** What the server watches: every template, and the pipes file wherever it's configured. */
1095
+ function watchPatterns(root, pipesFile) {
1096
+ const patterns = ["**/*.kick", "**/pipes.{ts,js}"];
1097
+ if (!/^pipes\.(ts|js)$/.test(basename(pipesFile))) patterns.push(relative(root, pipesFile).split(sep).join("/"));
1098
+ return patterns;
1099
+ }
1095
1100
  function startServer() {
1096
1101
  const connection = createConnection();
1097
1102
  const server = createServer(connection);
1098
1103
  let ws;
1104
+ let watched = [];
1099
1105
  connection.listen();
1100
1106
  connection.onInitialize(async (params) => {
1101
1107
  const folder = params.workspaceFolders?.[0]?.uri ?? params.rootUri;
@@ -1105,11 +1111,13 @@ function startServer() {
1105
1111
  const viewsDir = at(opts.viewsDir ?? "src/views");
1106
1112
  const hasViews = existsSync(viewsDir);
1107
1113
  const { view } = await loadViewModule(root, (m) => hasViews && connection.console.warn(m), opts.trusted === true);
1114
+ const pipesFile = at(opts.pipesFile ?? join(viewsDir, "pipes.ts"));
1115
+ watched = watchPatterns(root, pipesFile);
1108
1116
  ws = new Workspace({
1109
1117
  root,
1110
1118
  viewsDir,
1111
1119
  componentsDir: opts.componentsDir ?? "components",
1112
- pipesFile: at(opts.pipesFile ?? join(viewsDir, "pipes.ts")),
1120
+ pipesFile,
1113
1121
  view,
1114
1122
  read: (p) => readFile(p, "utf8").catch(() => void 0),
1115
1123
  list: listKick
@@ -1124,7 +1132,7 @@ function startServer() {
1124
1132
  });
1125
1133
  connection.onInitialized(() => {
1126
1134
  server.initialized();
1127
- server.fileWatcher.watchFiles(["**/*.kick", "**/pipes.{ts,js}"]);
1135
+ server.fileWatcher.watchFiles(watched);
1128
1136
  });
1129
1137
  server.fileWatcher.onDidChangeWatchedFiles(async ({ changes }) => {
1130
1138
  if (!ws) return;
@@ -1146,4 +1154,4 @@ function startServer() {
1146
1154
  //#endregion
1147
1155
  export { KickVirtualCode as a, createKickServicePlugin as i, Workspace as n, kickLanguagePlugin as o, loadViewModule as r, startServer as t };
1148
1156
 
1149
- //# sourceMappingURL=server-BINLQyYR.js.map
1157
+ //# sourceMappingURL=server-3edMz3HM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-3edMz3HM.js","names":["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/diagnostics.ts","../src/plugin/format.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\nconst 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. */\nfunction 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/** The end of a `{{ … }}` starting at `i`; the text's end when unclosed. */\nfunction 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 semi = kw === 'let' ? s.indexOf(';', j) : -1\n const eol = s.indexOf('\\n', j)\n const stop = semi >= 0 && (eol < 0 || semi < eol) ? semi + 1 : 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 let d = 0\n let k = b\n for (; k < s.length; k++) {\n if (s[k] === '{') d++\n else if (s[k] === '}' && --d === 0) break\n }\n const stop = Math.min(k + 1, s.length)\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\nexport const kickLanguagePlugin: LanguagePlugin<URI> = {\n getLanguageId(uri) {\n return uri.path.endsWith('.kick') ? 'kick' : undefined\n },\n createVirtualCode(_uri, languageId, snapshot) {\n return languageId === 'kick'\n ? new KickVirtualCode(snapshot.getText(0, snapshot.getLength()))\n : 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 let layout = name === undefined ? undefined : ws.astOf(name)?.layout\n while (typeof layout === 'string' && !seen.has(layout)) {\n seen.add(layout)\n const ast = ws.astOf(layout)\n if (!ast) break\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 layout = ast.layout\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 * 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'\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') 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 * 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 } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { completions } from './completion'\nimport { definition } from './definition'\nimport { createDiagnosticsPlugin, sourceUri } from './diagnostics'\nimport { formatEdits } from './format'\nimport { hover } from './hover'\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 },\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 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 const d = open(document)\n const link = d && definition(ws, d.uri, d.text, document.offsetAt(position))\n return link ? [link] : undefined\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 { pathToFileURL } from 'node:url'\nimport * as bundled from '@forinda/kickjs-view'\nimport type { ViewModule } from './workspace'\n\ndeclare const __KICK_VIEW_VERSION__: string | undefined\nconst BUNDLED_VERSION =\n typeof __KICK_VIEW_VERSION__ === 'string' ? __KICK_VIEW_VERSION__ : 'unknown'\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 =\n typeof dot === 'string' ? dot : (dot?.node ?? dot?.import ?? dot?.default ?? 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 { 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}\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 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 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 }\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 { 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 /**\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\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 })\n await ws.load()\n return server.initialize(params, createSimpleProject([kickLanguagePlugin]), [\n createHtmlService(),\n createCssService(),\n createEmmetService(),\n createKickServicePlugin(ws),\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 server.documents.onDidClose(({ document }) => ws?.setBuffer(document.uri, undefined))\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 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.0.0",
3
+ "version": "0.1.0",
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.0.0"
59
+ "@forinda/kickjs-view": "^0.1.0"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "tsdown",
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-BINLQyYR.js","names":["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/diagnostics.ts","../src/plugin/format.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\nconst 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. */\nfunction 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/** The end of a `{{ … }}` starting at `i`; the text's end when unclosed. */\nfunction 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 if (c === '<' && /[A-Za-z/]/.test(s[i + 1] ?? '')) {\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 semi = kw === 'let' ? s.indexOf(';', j) : -1\n const eol = s.indexOf('\\n', j)\n const stop = semi >= 0 && (eol < 0 || semi < eol) ? semi + 1 : 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 let d = 0\n let k = b\n for (; k < s.length; k++) {\n if (s[k] === '{') d++\n else if (s[k] === '}' && --d === 0) break\n }\n const stop = Math.min(k + 1, s.length)\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\nexport const kickLanguagePlugin: LanguagePlugin<URI> = {\n getLanguageId(uri) {\n return uri.path.endsWith('.kick') ? 'kick' : undefined\n },\n createVirtualCode(_uri, languageId, snapshot) {\n return languageId === 'kick'\n ? new KickVirtualCode(snapshot.getText(0, snapshot.getLength()))\n : 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 let layout = name === undefined ? undefined : ws.astOf(name)?.layout\n while (typeof layout === 'string' && !seen.has(layout)) {\n seen.add(layout)\n const ast = ws.astOf(layout)\n if (!ast) break\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 layout = ast.layout\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 * 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'\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') 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 * 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 } from '@volar/language-service'\nimport type { Workspace } from '../workspace'\nimport { completions } from './completion'\nimport { definition } from './definition'\nimport { createDiagnosticsPlugin, sourceUri } from './diagnostics'\nimport { formatEdits } from './format'\nimport { hover } from './hover'\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 },\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 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 const d = open(document)\n const link = d && definition(ws, d.uri, d.text, document.offsetAt(position))\n return link ? [link] : undefined\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 { pathToFileURL } from 'node:url'\nimport * as bundled from '@forinda/kickjs-view'\nimport type { ViewModule } from './workspace'\n\ndeclare const __KICK_VIEW_VERSION__: string | undefined\nconst BUNDLED_VERSION =\n typeof __KICK_VIEW_VERSION__ === 'string' ? __KICK_VIEW_VERSION__ : 'unknown'\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 =\n typeof dot === 'string' ? dot : (dot?.node ?? dot?.import ?? dot?.default ?? 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*\\(([^)]*)\\))/\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 name = (m[1] ?? m[4])!\n const params = (m[2] ?? m[3] ?? m[5] ?? '').replace(/\\s+/g, ' ').trim()\n out.set(name, { line, column: text.indexOf(name), 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 { 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}\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 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) {\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 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 }\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 { isAbsolute, join, resolve } 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 { 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 /**\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\nasync function listKick(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { recursive: true, withFileTypes: true })\n return entries\n .filter((e) => e.isFile() && e.name.endsWith('.kick'))\n .map((e) => join(e.parentPath, e.name))\n } catch {\n return []\n }\n}\n\nexport function startServer(): void {\n const connection = createConnection()\n const server = createServer(connection)\n let ws: Workspace | undefined\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 ws = new Workspace({\n root,\n viewsDir,\n componentsDir: opts.componentsDir ?? 'components',\n pipesFile: at(opts.pipesFile ?? join(viewsDir, 'pipes.ts')),\n view,\n read: (p) => readFile(p, 'utf8').catch(() => undefined),\n list: listKick,\n })\n await ws.load()\n return server.initialize(params, createSimpleProject([kickLanguagePlugin]), [\n createHtmlService(),\n createCssService(),\n createEmmetService(),\n createKickServicePlugin(ws),\n ])\n })\n\n connection.onInitialized(() => {\n server.initialized()\n void server.fileWatcher.watchFiles(['**/*.kick', '**/pipes.{ts,js}'])\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 server.documents.onDidClose(({ document }) => ws?.setBuffer(document.uri, undefined))\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 connection.onShutdown(() => server.shutdown())\n}\n"],"mappings":"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"}