@rejot-dev/thalo-lsp 0.0.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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/capabilities.d.ts +12 -0
  4. package/dist/capabilities.d.ts.map +1 -0
  5. package/dist/capabilities.js +54 -0
  6. package/dist/capabilities.js.map +1 -0
  7. package/dist/handlers/completions/completions.js +33 -0
  8. package/dist/handlers/completions/completions.js.map +1 -0
  9. package/dist/handlers/completions/context.js +228 -0
  10. package/dist/handlers/completions/context.js.map +1 -0
  11. package/dist/handlers/completions/providers/directive.js +50 -0
  12. package/dist/handlers/completions/providers/directive.js.map +1 -0
  13. package/dist/handlers/completions/providers/entity.js +52 -0
  14. package/dist/handlers/completions/providers/entity.js.map +1 -0
  15. package/dist/handlers/completions/providers/link.js +113 -0
  16. package/dist/handlers/completions/providers/link.js.map +1 -0
  17. package/dist/handlers/completions/providers/metadata-key.js +43 -0
  18. package/dist/handlers/completions/providers/metadata-key.js.map +1 -0
  19. package/dist/handlers/completions/providers/metadata-value.js +71 -0
  20. package/dist/handlers/completions/providers/metadata-value.js.map +1 -0
  21. package/dist/handlers/completions/providers/providers.js +31 -0
  22. package/dist/handlers/completions/providers/providers.js.map +1 -0
  23. package/dist/handlers/completions/providers/schema-block.js +46 -0
  24. package/dist/handlers/completions/providers/schema-block.js.map +1 -0
  25. package/dist/handlers/completions/providers/section.js +37 -0
  26. package/dist/handlers/completions/providers/section.js.map +1 -0
  27. package/dist/handlers/completions/providers/tag.js +55 -0
  28. package/dist/handlers/completions/providers/tag.js.map +1 -0
  29. package/dist/handlers/completions/providers/timestamp.js +32 -0
  30. package/dist/handlers/completions/providers/timestamp.js.map +1 -0
  31. package/dist/handlers/completions/providers/type-expr.js +56 -0
  32. package/dist/handlers/completions/providers/type-expr.js.map +1 -0
  33. package/dist/handlers/definition.js +166 -0
  34. package/dist/handlers/definition.js.map +1 -0
  35. package/dist/handlers/diagnostics.js +77 -0
  36. package/dist/handlers/diagnostics.js.map +1 -0
  37. package/dist/handlers/hover.js +73 -0
  38. package/dist/handlers/hover.js.map +1 -0
  39. package/dist/handlers/references.js +233 -0
  40. package/dist/handlers/references.js.map +1 -0
  41. package/dist/handlers/semantic-tokens.js +36 -0
  42. package/dist/handlers/semantic-tokens.js.map +1 -0
  43. package/dist/mod.d.ts +2 -0
  44. package/dist/mod.js +3 -0
  45. package/dist/server.bundled.js +1764 -0
  46. package/dist/server.d.ts +18 -0
  47. package/dist/server.d.ts.map +1 -0
  48. package/dist/server.js +367 -0
  49. package/dist/server.js.map +1 -0
  50. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","names":["locations: Location[]"],"sources":["../../src/handlers/references.ts"],"sourcesContent":["import type { Position, Location, ReferenceContext } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n findNodeAtPosition,\n findReferences,\n findTagReferences,\n findEntityReferences,\n findFieldReferences,\n findSectionReferences,\n type Workspace,\n type Position as ThaloPosition,\n} from \"@rejot-dev/thalo\";\nimport { parseDocument } from \"@rejot-dev/thalo/native\";\n\n/**\n * Convert a file path to a URI\n */\nfunction pathToUri(path: string): string {\n if (!path.startsWith(\"file://\")) {\n return `file://${encodeURIComponent(path).replace(/%2F/g, \"/\")}`;\n }\n return path;\n}\n\n/**\n * Get the file type from a URI\n */\nfunction getFileType(uri: string): \"thalo\" | \"markdown\" {\n if (uri.endsWith(\".thalo\")) {\n return \"thalo\";\n }\n if (uri.endsWith(\".md\")) {\n return \"markdown\";\n }\n return \"thalo\";\n}\n\n/**\n * Convert LSP Position to thalo Position (both are 0-based).\n */\nfunction lspToThaloPosition(pos: Position): ThaloPosition {\n return { line: pos.line, column: pos.character };\n}\n\n/**\n * Handle textDocument/references request\n *\n * Finds all references to various syntax elements at the given position:\n * - ^link-id → All usages of that link\n * - #tag → All entries with that tag\n * - Entity name → All entries using that entity type\n * - Metadata key → All entries using that field\n * - Section header → All entries with that section\n *\n * Supports both standalone .thalo files and thalo blocks embedded in markdown.\n *\n * @param workspace - The thalo workspace\n * @param document - The text document\n * @param position - The position in the document (line/character)\n * @param context - Reference context (includeDeclaration)\n * @returns Array of reference locations, or null if not found\n */\nexport function handleReferences(\n workspace: Workspace,\n document: TextDocument,\n position: Position,\n context: ReferenceContext,\n): Location[] | null {\n const fileType = getFileType(document.uri);\n\n try {\n // Parse the document\n const parsed = parseDocument(document.getText(), {\n fileType,\n filename: document.uri,\n });\n\n // Find what element is at the position using the AST\n const nodeContext = findNodeAtPosition(parsed, lspToThaloPosition(position));\n\n switch (nodeContext.kind) {\n case \"link\": {\n // Find all references to this link\n const result = findReferences(workspace, nodeContext.linkId, context.includeDeclaration);\n if (result) {\n return result.locations.map((loc) => ({\n uri: pathToUri(loc.file),\n range: {\n start: {\n line: loc.location.startPosition.row,\n character: loc.location.startPosition.column,\n },\n end: {\n line: loc.location.endPosition.row,\n character: loc.location.endPosition.column,\n },\n },\n }));\n }\n return null;\n }\n\n case \"tag\": {\n // Find all entries with this tag\n const result = findTagReferences(workspace, nodeContext.tagName);\n return result.references.map((ref) => ({\n uri: pathToUri(ref.file),\n range: {\n start: {\n line: ref.location.startPosition.row,\n character: ref.location.startPosition.column,\n },\n end: {\n line: ref.location.endPosition.row,\n character: ref.location.endPosition.column,\n },\n },\n }));\n }\n\n case \"entity\":\n case \"schema_entity\": {\n // Find all entries using this entity type\n const entityName =\n nodeContext.kind === \"entity\" ? nodeContext.entityName : nodeContext.entityName;\n const result = findEntityReferences(workspace, entityName, context.includeDeclaration);\n return result.locations.map((loc) => ({\n uri: pathToUri(loc.file),\n range: {\n start: {\n line: loc.location.startPosition.row,\n character: loc.location.startPosition.column,\n },\n end: {\n line: loc.location.endPosition.row,\n character: loc.location.endPosition.column,\n },\n },\n }));\n }\n\n case \"metadata_key\": {\n // Find all entries using this field\n const result = findFieldReferences(workspace, nodeContext.key, nodeContext.entityContext);\n const locations: Location[] = [];\n\n // Include definition if requested\n if (context.includeDeclaration && result.definition) {\n locations.push({\n uri: pathToUri(result.definition.file),\n range: {\n start: {\n line: result.definition.location.startPosition.row,\n character: result.definition.location.startPosition.column,\n },\n end: {\n line: result.definition.location.endPosition.row,\n character: result.definition.location.endPosition.column,\n },\n },\n });\n }\n\n // Add all references\n for (const ref of result.references) {\n locations.push({\n uri: pathToUri(ref.file),\n range: {\n start: {\n line: ref.location.startPosition.row,\n character: ref.location.startPosition.column,\n },\n end: {\n line: ref.location.endPosition.row,\n character: ref.location.endPosition.column,\n },\n },\n });\n }\n\n return locations;\n }\n\n case \"section_header\": {\n // Find all entries with this section\n const result = findSectionReferences(\n workspace,\n nodeContext.sectionName,\n nodeContext.entityContext,\n );\n const locations: Location[] = [];\n\n // Include definition if requested\n if (context.includeDeclaration && result.definition) {\n locations.push({\n uri: pathToUri(result.definition.file),\n range: {\n start: {\n line: result.definition.location.startPosition.row,\n character: result.definition.location.startPosition.column,\n },\n end: {\n line: result.definition.location.endPosition.row,\n character: result.definition.location.endPosition.column,\n },\n },\n });\n }\n\n // Add all references\n for (const ref of result.references) {\n locations.push({\n uri: pathToUri(ref.file),\n range: {\n start: {\n line: ref.location.startPosition.row,\n character: ref.location.startPosition.column,\n },\n end: {\n line: ref.location.endPosition.row,\n character: ref.location.endPosition.column,\n },\n },\n });\n }\n\n return locations;\n }\n\n case \"field_name\": {\n // In schema definitions, find all usages of this field\n const result = findFieldReferences(\n workspace,\n nodeContext.fieldName,\n nodeContext.entityContext,\n );\n const locations: Location[] = [];\n\n // Include definition if requested\n if (context.includeDeclaration && result.definition) {\n locations.push({\n uri: pathToUri(result.definition.file),\n range: {\n start: {\n line: result.definition.location.startPosition.row,\n character: result.definition.location.startPosition.column,\n },\n end: {\n line: result.definition.location.endPosition.row,\n character: result.definition.location.endPosition.column,\n },\n },\n });\n }\n\n for (const ref of result.references) {\n locations.push({\n uri: pathToUri(ref.file),\n range: {\n start: {\n line: ref.location.startPosition.row,\n character: ref.location.startPosition.column,\n },\n end: {\n line: ref.location.endPosition.row,\n character: ref.location.endPosition.column,\n },\n },\n });\n }\n\n return locations;\n }\n\n case \"section_name\": {\n // In schema definitions, find all usages of this section\n const result = findSectionReferences(\n workspace,\n nodeContext.sectionName,\n nodeContext.entityContext,\n );\n const locations: Location[] = [];\n\n // Include definition if requested\n if (context.includeDeclaration && result.definition) {\n locations.push({\n uri: pathToUri(result.definition.file),\n range: {\n start: {\n line: result.definition.location.startPosition.row,\n character: result.definition.location.startPosition.column,\n },\n end: {\n line: result.definition.location.endPosition.row,\n character: result.definition.location.endPosition.column,\n },\n },\n });\n }\n\n for (const ref of result.references) {\n locations.push({\n uri: pathToUri(ref.file),\n range: {\n start: {\n line: ref.location.startPosition.row,\n character: ref.location.startPosition.column,\n },\n end: {\n line: ref.location.endPosition.row,\n character: ref.location.endPosition.column,\n },\n },\n });\n }\n\n return locations;\n }\n\n default:\n return null;\n }\n } catch (error) {\n console.error(`[thalo-lsp] Error in references handler:`, error);\n return null;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { parseDocument } from "@rejot-dev/thalo/native";
2
+ import { encodeSemanticTokens, extractSemanticTokens } from "@rejot-dev/thalo";
3
+
4
+ //#region src/handlers/semantic-tokens.ts
5
+ /**
6
+ * Get the file type from a URI
7
+ */
8
+ function getFileType(uri) {
9
+ if (uri.endsWith(".thalo")) return "thalo";
10
+ if (uri.endsWith(".md")) return "markdown";
11
+ return "thalo";
12
+ }
13
+ /**
14
+ * Handle textDocument/semanticTokens/full request
15
+ *
16
+ * Returns semantic tokens for syntax highlighting.
17
+ *
18
+ * @param document - The text document
19
+ * @returns Semantic tokens in LSP format
20
+ */
21
+ function handleSemanticTokens(document) {
22
+ const fileType = getFileType(document.uri);
23
+ try {
24
+ return { data: encodeSemanticTokens(extractSemanticTokens(parseDocument(document.getText(), {
25
+ fileType,
26
+ filename: document.uri
27
+ }))) };
28
+ } catch (error) {
29
+ console.error(`[thalo-lsp] Error extracting semantic tokens:`, error);
30
+ return { data: [] };
31
+ }
32
+ }
33
+
34
+ //#endregion
35
+ export { handleSemanticTokens };
36
+ //# sourceMappingURL=semantic-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-tokens.js","names":[],"sources":["../../src/handlers/semantic-tokens.ts"],"sourcesContent":["import type { SemanticTokens } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { extractSemanticTokens, encodeSemanticTokens, type FileType } from \"@rejot-dev/thalo\";\nimport { parseDocument } from \"@rejot-dev/thalo/native\";\n\n/**\n * Get the file type from a URI\n */\nfunction getFileType(uri: string): FileType {\n if (uri.endsWith(\".thalo\")) {\n return \"thalo\";\n }\n if (uri.endsWith(\".md\")) {\n return \"markdown\";\n }\n return \"thalo\";\n}\n\n/**\n * Handle textDocument/semanticTokens/full request\n *\n * Returns semantic tokens for syntax highlighting.\n *\n * @param document - The text document\n * @returns Semantic tokens in LSP format\n */\nexport function handleSemanticTokens(document: TextDocument): SemanticTokens {\n const fileType = getFileType(document.uri);\n\n try {\n // Parse the document\n const parsed = parseDocument(document.getText(), {\n fileType,\n filename: document.uri,\n });\n\n // Extract semantic tokens\n const tokens = extractSemanticTokens(parsed);\n\n // Encode in LSP delta format\n const data = encodeSemanticTokens(tokens);\n\n return { data };\n } catch (error) {\n console.error(`[thalo-lsp] Error extracting semantic tokens:`, error);\n return { data: [] };\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAS,YAAY,KAAuB;AAC1C,KAAI,IAAI,SAAS,SAAS,CACxB,QAAO;AAET,KAAI,IAAI,SAAS,MAAM,CACrB,QAAO;AAET,QAAO;;;;;;;;;;AAWT,SAAgB,qBAAqB,UAAwC;CAC3E,MAAM,WAAW,YAAY,SAAS,IAAI;AAE1C,KAAI;AAaF,SAAO,EAAE,MAFI,qBAHE,sBANA,cAAc,SAAS,SAAS,EAAE;GAC/C;GACA,UAAU,SAAS;GACpB,CAAC,CAG0C,CAGH,EAE1B;UACR,OAAO;AACd,UAAQ,MAAM,iDAAiD,MAAM;AACrE,SAAO,EAAE,MAAM,EAAE,EAAE"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { startServer } from "./server.js";
2
+ export { startServer };
package/dist/mod.js ADDED
@@ -0,0 +1,3 @@
1
+ import { startServer } from "./server.js";
2
+
3
+ export { startServer };