@rejot-dev/thalo 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 (237) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +396 -0
  3. package/dist/ast/ast-types.d.ts +469 -0
  4. package/dist/ast/ast-types.d.ts.map +1 -0
  5. package/dist/ast/ast-types.js +11 -0
  6. package/dist/ast/ast-types.js.map +1 -0
  7. package/dist/ast/builder.js +158 -0
  8. package/dist/ast/builder.js.map +1 -0
  9. package/dist/ast/extract.js +748 -0
  10. package/dist/ast/extract.js.map +1 -0
  11. package/dist/ast/node-at-position.d.ts +147 -0
  12. package/dist/ast/node-at-position.d.ts.map +1 -0
  13. package/dist/ast/node-at-position.js +382 -0
  14. package/dist/ast/node-at-position.js.map +1 -0
  15. package/dist/ast/visitor.js +232 -0
  16. package/dist/ast/visitor.js.map +1 -0
  17. package/dist/checker/check.d.ts +53 -0
  18. package/dist/checker/check.d.ts.map +1 -0
  19. package/dist/checker/check.js +105 -0
  20. package/dist/checker/check.js.map +1 -0
  21. package/dist/checker/rules/actualize-missing-updated.js +34 -0
  22. package/dist/checker/rules/actualize-missing-updated.js.map +1 -0
  23. package/dist/checker/rules/actualize-unresolved-target.js +42 -0
  24. package/dist/checker/rules/actualize-unresolved-target.js.map +1 -0
  25. package/dist/checker/rules/alter-before-define.js +53 -0
  26. package/dist/checker/rules/alter-before-define.js.map +1 -0
  27. package/dist/checker/rules/alter-undefined-entity.js +32 -0
  28. package/dist/checker/rules/alter-undefined-entity.js.map +1 -0
  29. package/dist/checker/rules/create-requires-section.js +34 -0
  30. package/dist/checker/rules/create-requires-section.js.map +1 -0
  31. package/dist/checker/rules/define-entity-requires-section.js +31 -0
  32. package/dist/checker/rules/define-entity-requires-section.js.map +1 -0
  33. package/dist/checker/rules/duplicate-entity-definition.js +37 -0
  34. package/dist/checker/rules/duplicate-entity-definition.js.map +1 -0
  35. package/dist/checker/rules/duplicate-field-in-schema.js +38 -0
  36. package/dist/checker/rules/duplicate-field-in-schema.js.map +1 -0
  37. package/dist/checker/rules/duplicate-link-id.js +52 -0
  38. package/dist/checker/rules/duplicate-link-id.js.map +1 -0
  39. package/dist/checker/rules/duplicate-metadata-key.js +21 -0
  40. package/dist/checker/rules/duplicate-metadata-key.js.map +1 -0
  41. package/dist/checker/rules/duplicate-section-heading.js +41 -0
  42. package/dist/checker/rules/duplicate-section-heading.js.map +1 -0
  43. package/dist/checker/rules/duplicate-section-in-schema.js +38 -0
  44. package/dist/checker/rules/duplicate-section-in-schema.js.map +1 -0
  45. package/dist/checker/rules/duplicate-timestamp.js +104 -0
  46. package/dist/checker/rules/duplicate-timestamp.js.map +1 -0
  47. package/dist/checker/rules/empty-required-value.js +45 -0
  48. package/dist/checker/rules/empty-required-value.js.map +1 -0
  49. package/dist/checker/rules/empty-section.js +21 -0
  50. package/dist/checker/rules/empty-section.js.map +1 -0
  51. package/dist/checker/rules/invalid-date-range-value.js +56 -0
  52. package/dist/checker/rules/invalid-date-range-value.js.map +1 -0
  53. package/dist/checker/rules/invalid-default-value.js +86 -0
  54. package/dist/checker/rules/invalid-default-value.js.map +1 -0
  55. package/dist/checker/rules/invalid-field-type.js +45 -0
  56. package/dist/checker/rules/invalid-field-type.js.map +1 -0
  57. package/dist/checker/rules/missing-required-field.js +48 -0
  58. package/dist/checker/rules/missing-required-field.js.map +1 -0
  59. package/dist/checker/rules/missing-required-section.js +51 -0
  60. package/dist/checker/rules/missing-required-section.js.map +1 -0
  61. package/dist/checker/rules/missing-title.js +56 -0
  62. package/dist/checker/rules/missing-title.js.map +1 -0
  63. package/dist/checker/rules/remove-undefined-field.js +42 -0
  64. package/dist/checker/rules/remove-undefined-field.js.map +1 -0
  65. package/dist/checker/rules/remove-undefined-section.js +42 -0
  66. package/dist/checker/rules/remove-undefined-section.js.map +1 -0
  67. package/dist/checker/rules/rules.d.ts +71 -0
  68. package/dist/checker/rules/rules.d.ts.map +1 -0
  69. package/dist/checker/rules/rules.js +102 -0
  70. package/dist/checker/rules/rules.js.map +1 -0
  71. package/dist/checker/rules/synthesis-empty-query.js +35 -0
  72. package/dist/checker/rules/synthesis-empty-query.js.map +1 -0
  73. package/dist/checker/rules/synthesis-missing-prompt.js +42 -0
  74. package/dist/checker/rules/synthesis-missing-prompt.js.map +1 -0
  75. package/dist/checker/rules/synthesis-missing-sources.js +32 -0
  76. package/dist/checker/rules/synthesis-missing-sources.js.map +1 -0
  77. package/dist/checker/rules/synthesis-unknown-query-entity.js +39 -0
  78. package/dist/checker/rules/synthesis-unknown-query-entity.js.map +1 -0
  79. package/dist/checker/rules/timestamp-out-of-order.js +55 -0
  80. package/dist/checker/rules/timestamp-out-of-order.js.map +1 -0
  81. package/dist/checker/rules/unknown-entity.js +32 -0
  82. package/dist/checker/rules/unknown-entity.js.map +1 -0
  83. package/dist/checker/rules/unknown-field.js +40 -0
  84. package/dist/checker/rules/unknown-field.js.map +1 -0
  85. package/dist/checker/rules/unknown-section.js +47 -0
  86. package/dist/checker/rules/unknown-section.js.map +1 -0
  87. package/dist/checker/rules/unresolved-link.js +34 -0
  88. package/dist/checker/rules/unresolved-link.js.map +1 -0
  89. package/dist/checker/rules/update-without-create.js +65 -0
  90. package/dist/checker/rules/update-without-create.js.map +1 -0
  91. package/dist/checker/visitor.d.ts +69 -0
  92. package/dist/checker/visitor.d.ts.map +1 -0
  93. package/dist/checker/visitor.js +67 -0
  94. package/dist/checker/visitor.js.map +1 -0
  95. package/dist/checker/workspace-index.d.ts +50 -0
  96. package/dist/checker/workspace-index.d.ts.map +1 -0
  97. package/dist/checker/workspace-index.js +108 -0
  98. package/dist/checker/workspace-index.js.map +1 -0
  99. package/dist/commands/actualize.d.ts +113 -0
  100. package/dist/commands/actualize.d.ts.map +1 -0
  101. package/dist/commands/actualize.js +111 -0
  102. package/dist/commands/actualize.js.map +1 -0
  103. package/dist/commands/check.d.ts +65 -0
  104. package/dist/commands/check.d.ts.map +1 -0
  105. package/dist/commands/check.js +61 -0
  106. package/dist/commands/check.js.map +1 -0
  107. package/dist/commands/format.d.ts +90 -0
  108. package/dist/commands/format.d.ts.map +1 -0
  109. package/dist/commands/format.js +80 -0
  110. package/dist/commands/format.js.map +1 -0
  111. package/dist/commands/query.d.ts +152 -0
  112. package/dist/commands/query.d.ts.map +1 -0
  113. package/dist/commands/query.js +151 -0
  114. package/dist/commands/query.js.map +1 -0
  115. package/dist/constants.d.ts +31 -0
  116. package/dist/constants.d.ts.map +1 -0
  117. package/dist/constants.js +51 -0
  118. package/dist/constants.js.map +1 -0
  119. package/dist/files.d.ts +58 -0
  120. package/dist/files.d.ts.map +1 -0
  121. package/dist/files.js +103 -0
  122. package/dist/files.js.map +1 -0
  123. package/dist/formatters.d.ts +39 -0
  124. package/dist/formatters.d.ts.map +1 -0
  125. package/dist/formatters.js +200 -0
  126. package/dist/formatters.js.map +1 -0
  127. package/dist/fragment.d.ts +22 -0
  128. package/dist/fragment.d.ts.map +1 -0
  129. package/dist/git/git.js +240 -0
  130. package/dist/git/git.js.map +1 -0
  131. package/dist/merge/conflict-detector.d.ts +89 -0
  132. package/dist/merge/conflict-detector.d.ts.map +1 -0
  133. package/dist/merge/conflict-detector.js +352 -0
  134. package/dist/merge/conflict-detector.js.map +1 -0
  135. package/dist/merge/conflict-formatter.js +143 -0
  136. package/dist/merge/conflict-formatter.js.map +1 -0
  137. package/dist/merge/driver.d.ts +54 -0
  138. package/dist/merge/driver.d.ts.map +1 -0
  139. package/dist/merge/driver.js +112 -0
  140. package/dist/merge/driver.js.map +1 -0
  141. package/dist/merge/entry-matcher.d.ts +50 -0
  142. package/dist/merge/entry-matcher.d.ts.map +1 -0
  143. package/dist/merge/entry-matcher.js +141 -0
  144. package/dist/merge/entry-matcher.js.map +1 -0
  145. package/dist/merge/entry-merger.js +194 -0
  146. package/dist/merge/entry-merger.js.map +1 -0
  147. package/dist/merge/merge-result-builder.d.ts +62 -0
  148. package/dist/merge/merge-result-builder.d.ts.map +1 -0
  149. package/dist/merge/merge-result-builder.js +89 -0
  150. package/dist/merge/merge-result-builder.js.map +1 -0
  151. package/dist/mod.d.ts +31 -0
  152. package/dist/mod.js +23 -0
  153. package/dist/model/document.d.ts +134 -0
  154. package/dist/model/document.d.ts.map +1 -0
  155. package/dist/model/document.js +275 -0
  156. package/dist/model/document.js.map +1 -0
  157. package/dist/model/line-index.d.ts +85 -0
  158. package/dist/model/line-index.d.ts.map +1 -0
  159. package/dist/model/line-index.js +159 -0
  160. package/dist/model/line-index.js.map +1 -0
  161. package/dist/model/workspace.d.ts +296 -0
  162. package/dist/model/workspace.d.ts.map +1 -0
  163. package/dist/model/workspace.js +562 -0
  164. package/dist/model/workspace.js.map +1 -0
  165. package/dist/parser.js +27 -0
  166. package/dist/parser.js.map +1 -0
  167. package/dist/parser.native.d.ts +51 -0
  168. package/dist/parser.native.d.ts.map +1 -0
  169. package/dist/parser.native.js +62 -0
  170. package/dist/parser.native.js.map +1 -0
  171. package/dist/parser.shared.d.ts +99 -0
  172. package/dist/parser.shared.d.ts.map +1 -0
  173. package/dist/parser.shared.js +124 -0
  174. package/dist/parser.shared.js.map +1 -0
  175. package/dist/parser.web.d.ts +67 -0
  176. package/dist/parser.web.d.ts.map +1 -0
  177. package/dist/parser.web.js +49 -0
  178. package/dist/parser.web.js.map +1 -0
  179. package/dist/schema/registry.d.ts +108 -0
  180. package/dist/schema/registry.d.ts.map +1 -0
  181. package/dist/schema/registry.js +281 -0
  182. package/dist/schema/registry.js.map +1 -0
  183. package/dist/semantic/analyzer.d.ts +107 -0
  184. package/dist/semantic/analyzer.d.ts.map +1 -0
  185. package/dist/semantic/analyzer.js +261 -0
  186. package/dist/semantic/analyzer.js.map +1 -0
  187. package/dist/services/change-tracker/change-tracker.d.ts +111 -0
  188. package/dist/services/change-tracker/change-tracker.d.ts.map +1 -0
  189. package/dist/services/change-tracker/change-tracker.js +62 -0
  190. package/dist/services/change-tracker/change-tracker.js.map +1 -0
  191. package/dist/services/change-tracker/create-tracker.d.ts +42 -0
  192. package/dist/services/change-tracker/create-tracker.d.ts.map +1 -0
  193. package/dist/services/change-tracker/create-tracker.js +53 -0
  194. package/dist/services/change-tracker/create-tracker.js.map +1 -0
  195. package/dist/services/change-tracker/git-tracker.d.ts +59 -0
  196. package/dist/services/change-tracker/git-tracker.d.ts.map +1 -0
  197. package/dist/services/change-tracker/git-tracker.js +218 -0
  198. package/dist/services/change-tracker/git-tracker.js.map +1 -0
  199. package/dist/services/change-tracker/timestamp-tracker.d.ts +22 -0
  200. package/dist/services/change-tracker/timestamp-tracker.d.ts.map +1 -0
  201. package/dist/services/change-tracker/timestamp-tracker.js +74 -0
  202. package/dist/services/change-tracker/timestamp-tracker.js.map +1 -0
  203. package/dist/services/definition.d.ts +37 -0
  204. package/dist/services/definition.d.ts.map +1 -0
  205. package/dist/services/definition.js +43 -0
  206. package/dist/services/definition.js.map +1 -0
  207. package/dist/services/entity-navigation.d.ts +200 -0
  208. package/dist/services/entity-navigation.d.ts.map +1 -0
  209. package/dist/services/entity-navigation.js +211 -0
  210. package/dist/services/entity-navigation.js.map +1 -0
  211. package/dist/services/hover.d.ts +81 -0
  212. package/dist/services/hover.d.ts.map +1 -0
  213. package/dist/services/hover.js +669 -0
  214. package/dist/services/hover.js.map +1 -0
  215. package/dist/services/query.d.ts +116 -0
  216. package/dist/services/query.d.ts.map +1 -0
  217. package/dist/services/query.js +225 -0
  218. package/dist/services/query.js.map +1 -0
  219. package/dist/services/references.d.ts +52 -0
  220. package/dist/services/references.d.ts.map +1 -0
  221. package/dist/services/references.js +66 -0
  222. package/dist/services/references.js.map +1 -0
  223. package/dist/services/semantic-tokens.d.ts +54 -0
  224. package/dist/services/semantic-tokens.d.ts.map +1 -0
  225. package/dist/services/semantic-tokens.js +213 -0
  226. package/dist/services/semantic-tokens.js.map +1 -0
  227. package/dist/services/synthesis.d.ts +90 -0
  228. package/dist/services/synthesis.d.ts.map +1 -0
  229. package/dist/services/synthesis.js +113 -0
  230. package/dist/services/synthesis.js.map +1 -0
  231. package/dist/source-map.d.ts +42 -0
  232. package/dist/source-map.d.ts.map +1 -0
  233. package/dist/source-map.js +170 -0
  234. package/dist/source-map.js.map +1 -0
  235. package/package.json +128 -0
  236. package/tree-sitter-thalo.wasm +0 -0
  237. package/web-tree-sitter.wasm +0 -0
@@ -0,0 +1,170 @@
1
+ //#region src/source-map.ts
2
+ /**
3
+ * A cached identity source map instance for standalone files.
4
+ */
5
+ const IDENTITY_SOURCE_MAP = Object.freeze({
6
+ charOffset: 0,
7
+ lineOffset: 0,
8
+ columnOffset: 0,
9
+ lineCount: 0
10
+ });
11
+ /**
12
+ * Create an identity source map for standalone .thalo files.
13
+ * All offsets are zero, so positions pass through unchanged.
14
+ */
15
+ function identitySourceMap() {
16
+ return IDENTITY_SOURCE_MAP;
17
+ }
18
+ /**
19
+ * Check if a source map is an identity map (no offset).
20
+ */
21
+ function isIdentityMap(map) {
22
+ return map.charOffset === 0 && map.lineOffset === 0 && map.columnOffset === 0;
23
+ }
24
+ /**
25
+ * Create a source map for an embedded block.
26
+ *
27
+ * @param fullSource - The complete source text of the containing file
28
+ * @param charOffset - Character offset where the block content starts
29
+ * @param blockSource - The block's source text (for calculating line count)
30
+ * @returns A SourceMap for the block
31
+ */
32
+ function createSourceMap(fullSource, charOffset, blockSource) {
33
+ let lineOffset = 0;
34
+ let columnOffset = 0;
35
+ let lastNewlineIndex = -1;
36
+ for (let i = 0; i < charOffset; i++) if (fullSource[i] === "\n") {
37
+ lineOffset++;
38
+ lastNewlineIndex = i;
39
+ }
40
+ columnOffset = lastNewlineIndex === -1 ? charOffset : charOffset - lastNewlineIndex - 1;
41
+ let lineCount = 1;
42
+ for (const char of blockSource) if (char === "\n") lineCount++;
43
+ return Object.freeze({
44
+ charOffset,
45
+ lineOffset,
46
+ columnOffset,
47
+ lineCount
48
+ });
49
+ }
50
+ /**
51
+ * Convert a block-relative position to a file-absolute position.
52
+ *
53
+ * @param map - The source map for the block
54
+ * @param blockPos - Position relative to the block start
55
+ * @returns Position relative to the file start
56
+ */
57
+ function toFilePosition(map, blockPos) {
58
+ if (blockPos.line === 0) return {
59
+ line: map.lineOffset + blockPos.line,
60
+ column: map.columnOffset + blockPos.column
61
+ };
62
+ return {
63
+ line: map.lineOffset + blockPos.line,
64
+ column: blockPos.column
65
+ };
66
+ }
67
+ /**
68
+ * Convert a file-absolute position to a block-relative position.
69
+ * Returns null if the position is outside the block.
70
+ *
71
+ * @param map - The source map for the block
72
+ * @param filePos - Position relative to the file start
73
+ * @returns Position relative to the block start, or null if outside
74
+ */
75
+ function toBlockPosition(map, filePos) {
76
+ if (isIdentityMap(map)) return {
77
+ line: filePos.line,
78
+ column: filePos.column
79
+ };
80
+ const blockLine = filePos.line - map.lineOffset;
81
+ if (blockLine < 0) return null;
82
+ if (blockLine >= map.lineCount) return null;
83
+ if (blockLine === 0) {
84
+ const blockColumn = filePos.column - map.columnOffset;
85
+ if (blockColumn < 0) return null;
86
+ return {
87
+ line: blockLine,
88
+ column: blockColumn
89
+ };
90
+ }
91
+ return {
92
+ line: blockLine,
93
+ column: filePos.column
94
+ };
95
+ }
96
+ /**
97
+ * Convert a tree-sitter Point to a Position.
98
+ */
99
+ function pointToPosition(point) {
100
+ return {
101
+ line: point.row,
102
+ column: point.column
103
+ };
104
+ }
105
+ /**
106
+ * Convert a Position to a tree-sitter Point.
107
+ */
108
+ function positionToPoint(pos) {
109
+ return {
110
+ row: pos.line,
111
+ column: pos.column
112
+ };
113
+ }
114
+ /**
115
+ * Convert a character offset in source text to a Position (line, column).
116
+ *
117
+ * @param source - The source text
118
+ * @param offset - Character offset (0-based)
119
+ * @returns Position with 0-based line and column
120
+ */
121
+ function positionFromOffset(source, offset) {
122
+ let line = 0;
123
+ let column = 0;
124
+ for (let i = 0; i < offset && i < source.length; i++) if (source[i] === "\n") {
125
+ line++;
126
+ column = 0;
127
+ } else column++;
128
+ return {
129
+ line,
130
+ column
131
+ };
132
+ }
133
+ /**
134
+ * Convert a block-relative Location to a file-absolute Location.
135
+ *
136
+ * @param map - The source map for the block
137
+ * @param blockLoc - Location relative to the block start
138
+ * @returns Location relative to the file start
139
+ */
140
+ function toFileLocation(map, blockLoc) {
141
+ const startPos = toFilePosition(map, pointToPosition(blockLoc.startPosition));
142
+ const endPos = toFilePosition(map, pointToPosition(blockLoc.endPosition));
143
+ return {
144
+ startIndex: map.charOffset + blockLoc.startIndex,
145
+ endIndex: map.charOffset + blockLoc.endIndex,
146
+ startPosition: positionToPoint(startPos),
147
+ endPosition: positionToPoint(endPos)
148
+ };
149
+ }
150
+ /**
151
+ * Find which block (if any) contains a file-absolute position.
152
+ *
153
+ * @param blocks - Array of objects with sourceMap property
154
+ * @param filePosition - Position relative to the file start (0-based)
155
+ * @returns The matching block and block-relative position, or null if not in any block
156
+ */
157
+ function findBlockAtPosition(blocks, filePosition) {
158
+ for (const block of blocks) {
159
+ const blockPosition = toBlockPosition(block.sourceMap, filePosition);
160
+ if (blockPosition) return {
161
+ block,
162
+ blockPosition
163
+ };
164
+ }
165
+ return null;
166
+ }
167
+
168
+ //#endregion
169
+ export { createSourceMap, findBlockAtPosition, identitySourceMap, positionFromOffset, positionToPoint, toFileLocation };
170
+ //# sourceMappingURL=source-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-map.js","names":["IDENTITY_SOURCE_MAP: SourceMap"],"sources":["../src/source-map.ts"],"sourcesContent":["import type { Location } from \"./ast/ast-types.js\";\n\n/**\n * A simple position (line and column).\n * Both are 0-based to match tree-sitter's Point type.\n */\nexport interface Position {\n /** 0-based line number */\n line: number;\n /** 0-based column number */\n column: number;\n}\n\n/**\n * Tree-sitter Point interface (row and column).\n * Defined locally to avoid bundling native tree-sitter.\n */\ninterface Point {\n row: number;\n column: number;\n}\n\n/**\n * SourceMap tracks the relationship between block-relative positions\n * (as returned by tree-sitter) and file-absolute positions.\n *\n * For standalone .thalo files, this is an identity map (all offsets are 0).\n * For embedded blocks in markdown, this contains the offset to the block start.\n */\nexport interface SourceMap {\n /** Character offset where block content starts in the file */\n readonly charOffset: number;\n /** Line number where block content starts (0-based) */\n readonly lineOffset: number;\n /** Column offset on the starting line (usually 0 for fenced code blocks) */\n readonly columnOffset: number;\n /** Number of lines in the block content */\n readonly lineCount: number;\n}\n\n/**\n * A cached identity source map instance for standalone files.\n */\nconst IDENTITY_SOURCE_MAP: SourceMap = Object.freeze({\n charOffset: 0,\n lineOffset: 0,\n columnOffset: 0,\n lineCount: 0,\n});\n\n/**\n * Create an identity source map for standalone .thalo files.\n * All offsets are zero, so positions pass through unchanged.\n */\nexport function identitySourceMap(): SourceMap {\n return IDENTITY_SOURCE_MAP;\n}\n\n/**\n * Check if a source map is an identity map (no offset).\n */\nexport function isIdentityMap(map: SourceMap): boolean {\n return map.charOffset === 0 && map.lineOffset === 0 && map.columnOffset === 0;\n}\n\n/**\n * Create a source map for an embedded block.\n *\n * @param fullSource - The complete source text of the containing file\n * @param charOffset - Character offset where the block content starts\n * @param blockSource - The block's source text (for calculating line count)\n * @returns A SourceMap for the block\n */\nexport function createSourceMap(\n fullSource: string,\n charOffset: number,\n blockSource: string,\n): SourceMap {\n // Count newlines before the block to get the line offset\n let lineOffset = 0;\n let columnOffset = 0;\n let lastNewlineIndex = -1;\n\n for (let i = 0; i < charOffset; i++) {\n if (fullSource[i] === \"\\n\") {\n lineOffset++;\n lastNewlineIndex = i;\n }\n }\n\n // Column offset is the distance from the last newline to the block start\n // If no newline found, column offset is the char offset itself\n columnOffset = lastNewlineIndex === -1 ? charOffset : charOffset - lastNewlineIndex - 1;\n\n // Count lines in the block content\n let lineCount = 1;\n for (const char of blockSource) {\n if (char === \"\\n\") {\n lineCount++;\n }\n }\n\n return Object.freeze({\n charOffset,\n lineOffset,\n columnOffset,\n lineCount,\n });\n}\n\n/**\n * Convert a block-relative position to a file-absolute position.\n *\n * @param map - The source map for the block\n * @param blockPos - Position relative to the block start\n * @returns Position relative to the file start\n */\nexport function toFilePosition(map: SourceMap, blockPos: Position): Position {\n // For the first line, add both line offset and column offset\n // For subsequent lines, only add line offset (column is already correct)\n if (blockPos.line === 0) {\n return {\n line: map.lineOffset + blockPos.line,\n column: map.columnOffset + blockPos.column,\n };\n }\n return {\n line: map.lineOffset + blockPos.line,\n column: blockPos.column,\n };\n}\n\n/**\n * Convert a file-absolute position to a block-relative position.\n * Returns null if the position is outside the block.\n *\n * @param map - The source map for the block\n * @param filePos - Position relative to the file start\n * @returns Position relative to the block start, or null if outside\n */\nexport function toBlockPosition(map: SourceMap, filePos: Position): Position | null {\n // For identity maps, just pass through (no bounds checking needed)\n if (isIdentityMap(map)) {\n return { line: filePos.line, column: filePos.column };\n }\n\n const blockLine = filePos.line - map.lineOffset;\n\n // Check if position is before the block\n if (blockLine < 0) {\n return null;\n }\n\n // Check if position is after the block\n if (blockLine >= map.lineCount) {\n return null;\n }\n\n // For the first line, subtract column offset\n // For subsequent lines, column is already correct\n if (blockLine === 0) {\n const blockColumn = filePos.column - map.columnOffset;\n // Check if position is before the block on the first line\n if (blockColumn < 0) {\n return null;\n }\n return {\n line: blockLine,\n column: blockColumn,\n };\n }\n\n return {\n line: blockLine,\n column: filePos.column,\n };\n}\n\n/**\n * Convert a tree-sitter Point to a Position.\n */\nexport function pointToPosition(point: Point): Position {\n return {\n line: point.row,\n column: point.column,\n };\n}\n\n/**\n * Convert a Position to a tree-sitter Point.\n */\nexport function positionToPoint(pos: Position): Point {\n return {\n row: pos.line,\n column: pos.column,\n };\n}\n\n/**\n * Convert a character offset in source text to a Position (line, column).\n *\n * @param source - The source text\n * @param offset - Character offset (0-based)\n * @returns Position with 0-based line and column\n */\nexport function positionFromOffset(source: string, offset: number): Position {\n let line = 0;\n let column = 0;\n\n for (let i = 0; i < offset && i < source.length; i++) {\n if (source[i] === \"\\n\") {\n line++;\n column = 0;\n } else {\n column++;\n }\n }\n\n return { line, column };\n}\n\n/**\n * Convert a block-relative Location to a file-absolute Location.\n *\n * @param map - The source map for the block\n * @param blockLoc - Location relative to the block start\n * @returns Location relative to the file start\n */\nexport function toFileLocation(map: SourceMap, blockLoc: Location): Location {\n const startPos = toFilePosition(map, pointToPosition(blockLoc.startPosition));\n const endPos = toFilePosition(map, pointToPosition(blockLoc.endPosition));\n\n return {\n startIndex: map.charOffset + blockLoc.startIndex,\n endIndex: map.charOffset + blockLoc.endIndex,\n startPosition: positionToPoint(startPos),\n endPosition: positionToPoint(endPos),\n };\n}\n\n/**\n * Convert a file-absolute Location to a block-relative Location.\n * Returns null if the location is outside the block.\n *\n * @param map - The source map for the block\n * @param fileLoc - Location relative to the file start\n * @returns Location relative to the block start, or null if outside\n */\nexport function toBlockLocation(map: SourceMap, fileLoc: Location): Location | null {\n const startPos = toBlockPosition(map, pointToPosition(fileLoc.startPosition));\n const endPos = toBlockPosition(map, pointToPosition(fileLoc.endPosition));\n\n if (!startPos || !endPos) {\n return null;\n }\n\n return {\n startIndex: fileLoc.startIndex - map.charOffset,\n endIndex: fileLoc.endIndex - map.charOffset,\n startPosition: positionToPoint(startPos),\n endPosition: positionToPoint(endPos),\n };\n}\n\n/**\n * Result of finding a block at a position.\n */\nexport interface BlockMatch<T extends { sourceMap: SourceMap }> {\n /** The matched block */\n block: T;\n /** Position relative to the block start (0-based line and column) */\n blockPosition: Position;\n}\n\n/**\n * Find which block (if any) contains a file-absolute position.\n *\n * @param blocks - Array of objects with sourceMap property\n * @param filePosition - Position relative to the file start (0-based)\n * @returns The matching block and block-relative position, or null if not in any block\n */\nexport function findBlockAtPosition<T extends { sourceMap: SourceMap }>(\n blocks: T[],\n filePosition: Position,\n): BlockMatch<T> | null {\n for (const block of blocks) {\n const blockPosition = toBlockPosition(block.sourceMap, filePosition);\n if (blockPosition) {\n return { block, blockPosition };\n }\n }\n return null;\n}\n"],"mappings":";;;;AA2CA,MAAMA,sBAAiC,OAAO,OAAO;CACnD,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,WAAW;CACZ,CAAC;;;;;AAMF,SAAgB,oBAA+B;AAC7C,QAAO;;;;;AAMT,SAAgB,cAAc,KAAyB;AACrD,QAAO,IAAI,eAAe,KAAK,IAAI,eAAe,KAAK,IAAI,iBAAiB;;;;;;;;;;AAW9E,SAAgB,gBACd,YACA,YACA,aACW;CAEX,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,mBAAmB;AAEvB,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAC9B,KAAI,WAAW,OAAO,MAAM;AAC1B;AACA,qBAAmB;;AAMvB,gBAAe,qBAAqB,KAAK,aAAa,aAAa,mBAAmB;CAGtF,IAAI,YAAY;AAChB,MAAK,MAAM,QAAQ,YACjB,KAAI,SAAS,KACX;AAIJ,QAAO,OAAO,OAAO;EACnB;EACA;EACA;EACA;EACD,CAAC;;;;;;;;;AAUJ,SAAgB,eAAe,KAAgB,UAA8B;AAG3E,KAAI,SAAS,SAAS,EACpB,QAAO;EACL,MAAM,IAAI,aAAa,SAAS;EAChC,QAAQ,IAAI,eAAe,SAAS;EACrC;AAEH,QAAO;EACL,MAAM,IAAI,aAAa,SAAS;EAChC,QAAQ,SAAS;EAClB;;;;;;;;;;AAWH,SAAgB,gBAAgB,KAAgB,SAAoC;AAElF,KAAI,cAAc,IAAI,CACpB,QAAO;EAAE,MAAM,QAAQ;EAAM,QAAQ,QAAQ;EAAQ;CAGvD,MAAM,YAAY,QAAQ,OAAO,IAAI;AAGrC,KAAI,YAAY,EACd,QAAO;AAIT,KAAI,aAAa,IAAI,UACnB,QAAO;AAKT,KAAI,cAAc,GAAG;EACnB,MAAM,cAAc,QAAQ,SAAS,IAAI;AAEzC,MAAI,cAAc,EAChB,QAAO;AAET,SAAO;GACL,MAAM;GACN,QAAQ;GACT;;AAGH,QAAO;EACL,MAAM;EACN,QAAQ,QAAQ;EACjB;;;;;AAMH,SAAgB,gBAAgB,OAAwB;AACtD,QAAO;EACL,MAAM,MAAM;EACZ,QAAQ,MAAM;EACf;;;;;AAMH,SAAgB,gBAAgB,KAAsB;AACpD,QAAO;EACL,KAAK,IAAI;EACT,QAAQ,IAAI;EACb;;;;;;;;;AAUH,SAAgB,mBAAmB,QAAgB,QAA0B;CAC3E,IAAI,OAAO;CACX,IAAI,SAAS;AAEb,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAI,OAAO,QAAQ,IAC/C,KAAI,OAAO,OAAO,MAAM;AACtB;AACA,WAAS;OAET;AAIJ,QAAO;EAAE;EAAM;EAAQ;;;;;;;;;AAUzB,SAAgB,eAAe,KAAgB,UAA8B;CAC3E,MAAM,WAAW,eAAe,KAAK,gBAAgB,SAAS,cAAc,CAAC;CAC7E,MAAM,SAAS,eAAe,KAAK,gBAAgB,SAAS,YAAY,CAAC;AAEzE,QAAO;EACL,YAAY,IAAI,aAAa,SAAS;EACtC,UAAU,IAAI,aAAa,SAAS;EACpC,eAAe,gBAAgB,SAAS;EACxC,aAAa,gBAAgB,OAAO;EACrC;;;;;;;;;AA4CH,SAAgB,oBACd,QACA,cACsB;AACtB,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,gBAAgB,gBAAgB,MAAM,WAAW,aAAa;AACpE,MAAI,cACF,QAAO;GAAE;GAAO;GAAe;;AAGnC,QAAO"}
package/package.json ADDED
@@ -0,0 +1,128 @@
1
+ {
2
+ "name": "@rejot-dev/thalo",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/rejot-dev/thalo.git",
8
+ "directory": "packages/thalo"
9
+ },
10
+ "license": "MIT",
11
+ "files": [
12
+ "dist",
13
+ "tree-sitter-thalo.wasm",
14
+ "web-tree-sitter.wasm"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "development": "./src/mod.ts",
19
+ "types": "./dist/mod.d.ts",
20
+ "default": "./dist/mod.js"
21
+ },
22
+ "./native": {
23
+ "development": "./src/parser.native.ts",
24
+ "types": "./dist/parser.native.d.ts",
25
+ "default": "./dist/parser.native.js"
26
+ },
27
+ "./web": {
28
+ "development": "./src/parser.web.ts",
29
+ "types": "./dist/parser.web.d.ts",
30
+ "default": "./dist/parser.web.js"
31
+ },
32
+ "./services/semantic-tokens": {
33
+ "development": "./src/services/semantic-tokens.ts",
34
+ "types": "./dist/services/semantic-tokens.d.ts",
35
+ "default": "./dist/services/semantic-tokens.js"
36
+ },
37
+ "./services/definition": {
38
+ "development": "./src/services/definition.ts",
39
+ "types": "./dist/services/definition.d.ts",
40
+ "default": "./dist/services/definition.js"
41
+ },
42
+ "./services/references": {
43
+ "development": "./src/services/references.ts",
44
+ "types": "./dist/services/references.d.ts",
45
+ "default": "./dist/services/references.js"
46
+ },
47
+ "./services/hover": {
48
+ "development": "./src/services/hover.ts",
49
+ "types": "./dist/services/hover.d.ts",
50
+ "default": "./dist/services/hover.js"
51
+ },
52
+ "./change-tracker": {
53
+ "development": "./src/services/change-tracker/change-tracker.ts",
54
+ "types": "./dist/services/change-tracker/change-tracker.d.ts",
55
+ "default": "./dist/services/change-tracker/change-tracker.js"
56
+ },
57
+ "./change-tracker/node": {
58
+ "development": "./src/services/change-tracker/create-tracker.ts",
59
+ "types": "./dist/services/change-tracker/create-tracker.d.ts",
60
+ "default": "./dist/services/change-tracker/create-tracker.js"
61
+ },
62
+ "./commands/check": {
63
+ "development": "./src/commands/check.ts",
64
+ "types": "./dist/commands/check.d.ts",
65
+ "default": "./dist/commands/check.js"
66
+ },
67
+ "./commands/format": {
68
+ "development": "./src/commands/format.ts",
69
+ "types": "./dist/commands/format.d.ts",
70
+ "default": "./dist/commands/format.js"
71
+ },
72
+ "./commands/query": {
73
+ "development": "./src/commands/query.ts",
74
+ "types": "./dist/commands/query.d.ts",
75
+ "default": "./dist/commands/query.js"
76
+ },
77
+ "./commands/actualize": {
78
+ "development": "./src/commands/actualize.ts",
79
+ "types": "./dist/commands/actualize.d.ts",
80
+ "default": "./dist/commands/actualize.js"
81
+ },
82
+ "./formatters": {
83
+ "development": "./src/formatters.ts",
84
+ "types": "./dist/formatters.d.ts",
85
+ "default": "./dist/formatters.js"
86
+ },
87
+ "./files": {
88
+ "development": "./src/files.ts",
89
+ "types": "./dist/files.d.ts",
90
+ "default": "./dist/files.js"
91
+ }
92
+ },
93
+ "main": "./dist/mod.js",
94
+ "types": "./dist/mod.d.ts",
95
+ "peerDependencies": {
96
+ "tree-sitter": "^0.25.0",
97
+ "web-tree-sitter": "^0.25.0",
98
+ "@rejot-dev/tree-sitter-thalo": "0.0.0"
99
+ },
100
+ "peerDependenciesMeta": {
101
+ "@rejot-dev/tree-sitter-thalo": {
102
+ "optional": true
103
+ },
104
+ "tree-sitter": {
105
+ "optional": true
106
+ },
107
+ "web-tree-sitter": {
108
+ "optional": true
109
+ }
110
+ },
111
+ "devDependencies": {
112
+ "@types/node": "^24",
113
+ "tree-sitter": "^0.25.0",
114
+ "tsdown": "^0.15.12",
115
+ "typescript": "^5.7.3",
116
+ "vitest": "^3.2.4",
117
+ "web-tree-sitter": "^0.25.0",
118
+ "@rejot-dev/tree-sitter-thalo": "0.0.0",
119
+ "@rejot-private/typescript-config": "0.0.1"
120
+ },
121
+ "scripts": {
122
+ "build": "tsdown",
123
+ "build:watch": "tsdown --watch",
124
+ "types:check": "tsc --noEmit",
125
+ "test": "vitest run",
126
+ "test:watch": "vitest --watch"
127
+ }
128
+ }
Binary file
Binary file