@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.
- package/LICENSE +21 -0
- package/README.md +396 -0
- package/dist/ast/ast-types.d.ts +469 -0
- package/dist/ast/ast-types.d.ts.map +1 -0
- package/dist/ast/ast-types.js +11 -0
- package/dist/ast/ast-types.js.map +1 -0
- package/dist/ast/builder.js +158 -0
- package/dist/ast/builder.js.map +1 -0
- package/dist/ast/extract.js +748 -0
- package/dist/ast/extract.js.map +1 -0
- package/dist/ast/node-at-position.d.ts +147 -0
- package/dist/ast/node-at-position.d.ts.map +1 -0
- package/dist/ast/node-at-position.js +382 -0
- package/dist/ast/node-at-position.js.map +1 -0
- package/dist/ast/visitor.js +232 -0
- package/dist/ast/visitor.js.map +1 -0
- package/dist/checker/check.d.ts +53 -0
- package/dist/checker/check.d.ts.map +1 -0
- package/dist/checker/check.js +105 -0
- package/dist/checker/check.js.map +1 -0
- package/dist/checker/rules/actualize-missing-updated.js +34 -0
- package/dist/checker/rules/actualize-missing-updated.js.map +1 -0
- package/dist/checker/rules/actualize-unresolved-target.js +42 -0
- package/dist/checker/rules/actualize-unresolved-target.js.map +1 -0
- package/dist/checker/rules/alter-before-define.js +53 -0
- package/dist/checker/rules/alter-before-define.js.map +1 -0
- package/dist/checker/rules/alter-undefined-entity.js +32 -0
- package/dist/checker/rules/alter-undefined-entity.js.map +1 -0
- package/dist/checker/rules/create-requires-section.js +34 -0
- package/dist/checker/rules/create-requires-section.js.map +1 -0
- package/dist/checker/rules/define-entity-requires-section.js +31 -0
- package/dist/checker/rules/define-entity-requires-section.js.map +1 -0
- package/dist/checker/rules/duplicate-entity-definition.js +37 -0
- package/dist/checker/rules/duplicate-entity-definition.js.map +1 -0
- package/dist/checker/rules/duplicate-field-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-field-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-link-id.js +52 -0
- package/dist/checker/rules/duplicate-link-id.js.map +1 -0
- package/dist/checker/rules/duplicate-metadata-key.js +21 -0
- package/dist/checker/rules/duplicate-metadata-key.js.map +1 -0
- package/dist/checker/rules/duplicate-section-heading.js +41 -0
- package/dist/checker/rules/duplicate-section-heading.js.map +1 -0
- package/dist/checker/rules/duplicate-section-in-schema.js +38 -0
- package/dist/checker/rules/duplicate-section-in-schema.js.map +1 -0
- package/dist/checker/rules/duplicate-timestamp.js +104 -0
- package/dist/checker/rules/duplicate-timestamp.js.map +1 -0
- package/dist/checker/rules/empty-required-value.js +45 -0
- package/dist/checker/rules/empty-required-value.js.map +1 -0
- package/dist/checker/rules/empty-section.js +21 -0
- package/dist/checker/rules/empty-section.js.map +1 -0
- package/dist/checker/rules/invalid-date-range-value.js +56 -0
- package/dist/checker/rules/invalid-date-range-value.js.map +1 -0
- package/dist/checker/rules/invalid-default-value.js +86 -0
- package/dist/checker/rules/invalid-default-value.js.map +1 -0
- package/dist/checker/rules/invalid-field-type.js +45 -0
- package/dist/checker/rules/invalid-field-type.js.map +1 -0
- package/dist/checker/rules/missing-required-field.js +48 -0
- package/dist/checker/rules/missing-required-field.js.map +1 -0
- package/dist/checker/rules/missing-required-section.js +51 -0
- package/dist/checker/rules/missing-required-section.js.map +1 -0
- package/dist/checker/rules/missing-title.js +56 -0
- package/dist/checker/rules/missing-title.js.map +1 -0
- package/dist/checker/rules/remove-undefined-field.js +42 -0
- package/dist/checker/rules/remove-undefined-field.js.map +1 -0
- package/dist/checker/rules/remove-undefined-section.js +42 -0
- package/dist/checker/rules/remove-undefined-section.js.map +1 -0
- package/dist/checker/rules/rules.d.ts +71 -0
- package/dist/checker/rules/rules.d.ts.map +1 -0
- package/dist/checker/rules/rules.js +102 -0
- package/dist/checker/rules/rules.js.map +1 -0
- package/dist/checker/rules/synthesis-empty-query.js +35 -0
- package/dist/checker/rules/synthesis-empty-query.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-prompt.js +42 -0
- package/dist/checker/rules/synthesis-missing-prompt.js.map +1 -0
- package/dist/checker/rules/synthesis-missing-sources.js +32 -0
- package/dist/checker/rules/synthesis-missing-sources.js.map +1 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js +39 -0
- package/dist/checker/rules/synthesis-unknown-query-entity.js.map +1 -0
- package/dist/checker/rules/timestamp-out-of-order.js +55 -0
- package/dist/checker/rules/timestamp-out-of-order.js.map +1 -0
- package/dist/checker/rules/unknown-entity.js +32 -0
- package/dist/checker/rules/unknown-entity.js.map +1 -0
- package/dist/checker/rules/unknown-field.js +40 -0
- package/dist/checker/rules/unknown-field.js.map +1 -0
- package/dist/checker/rules/unknown-section.js +47 -0
- package/dist/checker/rules/unknown-section.js.map +1 -0
- package/dist/checker/rules/unresolved-link.js +34 -0
- package/dist/checker/rules/unresolved-link.js.map +1 -0
- package/dist/checker/rules/update-without-create.js +65 -0
- package/dist/checker/rules/update-without-create.js.map +1 -0
- package/dist/checker/visitor.d.ts +69 -0
- package/dist/checker/visitor.d.ts.map +1 -0
- package/dist/checker/visitor.js +67 -0
- package/dist/checker/visitor.js.map +1 -0
- package/dist/checker/workspace-index.d.ts +50 -0
- package/dist/checker/workspace-index.d.ts.map +1 -0
- package/dist/checker/workspace-index.js +108 -0
- package/dist/checker/workspace-index.js.map +1 -0
- package/dist/commands/actualize.d.ts +113 -0
- package/dist/commands/actualize.d.ts.map +1 -0
- package/dist/commands/actualize.js +111 -0
- package/dist/commands/actualize.js.map +1 -0
- package/dist/commands/check.d.ts +65 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +61 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/format.d.ts +90 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +80 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/query.d.ts +152 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +151 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/constants.d.ts +31 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +51 -0
- package/dist/constants.js.map +1 -0
- package/dist/files.d.ts +58 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +103 -0
- package/dist/files.js.map +1 -0
- package/dist/formatters.d.ts +39 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +200 -0
- package/dist/formatters.js.map +1 -0
- package/dist/fragment.d.ts +22 -0
- package/dist/fragment.d.ts.map +1 -0
- package/dist/git/git.js +240 -0
- package/dist/git/git.js.map +1 -0
- package/dist/merge/conflict-detector.d.ts +89 -0
- package/dist/merge/conflict-detector.d.ts.map +1 -0
- package/dist/merge/conflict-detector.js +352 -0
- package/dist/merge/conflict-detector.js.map +1 -0
- package/dist/merge/conflict-formatter.js +143 -0
- package/dist/merge/conflict-formatter.js.map +1 -0
- package/dist/merge/driver.d.ts +54 -0
- package/dist/merge/driver.d.ts.map +1 -0
- package/dist/merge/driver.js +112 -0
- package/dist/merge/driver.js.map +1 -0
- package/dist/merge/entry-matcher.d.ts +50 -0
- package/dist/merge/entry-matcher.d.ts.map +1 -0
- package/dist/merge/entry-matcher.js +141 -0
- package/dist/merge/entry-matcher.js.map +1 -0
- package/dist/merge/entry-merger.js +194 -0
- package/dist/merge/entry-merger.js.map +1 -0
- package/dist/merge/merge-result-builder.d.ts +62 -0
- package/dist/merge/merge-result-builder.d.ts.map +1 -0
- package/dist/merge/merge-result-builder.js +89 -0
- package/dist/merge/merge-result-builder.js.map +1 -0
- package/dist/mod.d.ts +31 -0
- package/dist/mod.js +23 -0
- package/dist/model/document.d.ts +134 -0
- package/dist/model/document.d.ts.map +1 -0
- package/dist/model/document.js +275 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/line-index.d.ts +85 -0
- package/dist/model/line-index.d.ts.map +1 -0
- package/dist/model/line-index.js +159 -0
- package/dist/model/line-index.js.map +1 -0
- package/dist/model/workspace.d.ts +296 -0
- package/dist/model/workspace.d.ts.map +1 -0
- package/dist/model/workspace.js +562 -0
- package/dist/model/workspace.js.map +1 -0
- package/dist/parser.js +27 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.native.d.ts +51 -0
- package/dist/parser.native.d.ts.map +1 -0
- package/dist/parser.native.js +62 -0
- package/dist/parser.native.js.map +1 -0
- package/dist/parser.shared.d.ts +99 -0
- package/dist/parser.shared.d.ts.map +1 -0
- package/dist/parser.shared.js +124 -0
- package/dist/parser.shared.js.map +1 -0
- package/dist/parser.web.d.ts +67 -0
- package/dist/parser.web.d.ts.map +1 -0
- package/dist/parser.web.js +49 -0
- package/dist/parser.web.js.map +1 -0
- package/dist/schema/registry.d.ts +108 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +281 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/semantic/analyzer.d.ts +107 -0
- package/dist/semantic/analyzer.d.ts.map +1 -0
- package/dist/semantic/analyzer.js +261 -0
- package/dist/semantic/analyzer.js.map +1 -0
- package/dist/services/change-tracker/change-tracker.d.ts +111 -0
- package/dist/services/change-tracker/change-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/change-tracker.js +62 -0
- package/dist/services/change-tracker/change-tracker.js.map +1 -0
- package/dist/services/change-tracker/create-tracker.d.ts +42 -0
- package/dist/services/change-tracker/create-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/create-tracker.js +53 -0
- package/dist/services/change-tracker/create-tracker.js.map +1 -0
- package/dist/services/change-tracker/git-tracker.d.ts +59 -0
- package/dist/services/change-tracker/git-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/git-tracker.js +218 -0
- package/dist/services/change-tracker/git-tracker.js.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts +22 -0
- package/dist/services/change-tracker/timestamp-tracker.d.ts.map +1 -0
- package/dist/services/change-tracker/timestamp-tracker.js +74 -0
- package/dist/services/change-tracker/timestamp-tracker.js.map +1 -0
- package/dist/services/definition.d.ts +37 -0
- package/dist/services/definition.d.ts.map +1 -0
- package/dist/services/definition.js +43 -0
- package/dist/services/definition.js.map +1 -0
- package/dist/services/entity-navigation.d.ts +200 -0
- package/dist/services/entity-navigation.d.ts.map +1 -0
- package/dist/services/entity-navigation.js +211 -0
- package/dist/services/entity-navigation.js.map +1 -0
- package/dist/services/hover.d.ts +81 -0
- package/dist/services/hover.d.ts.map +1 -0
- package/dist/services/hover.js +669 -0
- package/dist/services/hover.js.map +1 -0
- package/dist/services/query.d.ts +116 -0
- package/dist/services/query.d.ts.map +1 -0
- package/dist/services/query.js +225 -0
- package/dist/services/query.js.map +1 -0
- package/dist/services/references.d.ts +52 -0
- package/dist/services/references.d.ts.map +1 -0
- package/dist/services/references.js +66 -0
- package/dist/services/references.js.map +1 -0
- package/dist/services/semantic-tokens.d.ts +54 -0
- package/dist/services/semantic-tokens.d.ts.map +1 -0
- package/dist/services/semantic-tokens.js +213 -0
- package/dist/services/semantic-tokens.js.map +1 -0
- package/dist/services/synthesis.d.ts +90 -0
- package/dist/services/synthesis.d.ts.map +1 -0
- package/dist/services/synthesis.js +113 -0
- package/dist/services/synthesis.js.map +1 -0
- package/dist/source-map.d.ts +42 -0
- package/dist/source-map.d.ts.map +1 -0
- package/dist/source-map.js +170 -0
- package/dist/source-map.js.map +1 -0
- package/package.json +128 -0
- package/tree-sitter-thalo.wasm +0 -0
- 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
|