@ldclabs/kip-lang 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.
- package/README.md +111 -0
- package/dist/ast.d.ts +216 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +2 -0
- package/dist/ast.js.map +1 -0
- package/dist/diagnostics.d.ts +14 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +99 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/formatter.d.ts +14 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +678 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +3 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +347 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +8 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +1359 -0
- package/dist/parser.js.map +1 -0
- package/dist/token.d.ts +104 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +163 -0
- package/dist/token.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# @ldclabs/kip-lang
|
|
2
|
+
|
|
3
|
+
TypeScript toolkit for **KIP** (Knowledge Interaction Protocol) — a structured query language for knowledge graphs.
|
|
4
|
+
|
|
5
|
+
Provides a full-featured **lexer → parser → AST → formatter / diagnostics** pipeline for `.kip` files.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @ldclabs/kip-lang
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### Tokenize
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { tokenize } from '@ldclabs/kip-lang'
|
|
19
|
+
|
|
20
|
+
const tokens = tokenize('FIND(?x.name) WHERE { ?x {type: "Person"} }')
|
|
21
|
+
// Token[] with type, value, line, column, offset
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Parse
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { parse } from '@ldclabs/kip-lang'
|
|
28
|
+
|
|
29
|
+
const { ast, diagnostics } = parse(`
|
|
30
|
+
FIND(?drug.name)
|
|
31
|
+
WHERE {
|
|
32
|
+
?drug {type: "Drug"}
|
|
33
|
+
(?drug, "treats", {name: "Headache"})
|
|
34
|
+
}
|
|
35
|
+
LIMIT 10
|
|
36
|
+
`)
|
|
37
|
+
|
|
38
|
+
console.log(ast.statements[0].kind) // "FindStatement"
|
|
39
|
+
console.log(diagnostics) // [] (no errors)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Format
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import { format } from '@ldclabs/kip-lang'
|
|
46
|
+
|
|
47
|
+
const source = `UPSERT { CONCEPT ?x { {type: "Drug", name: "Aspirin"} SET ATTRIBUTES { risk_level: 2 } } }`
|
|
48
|
+
|
|
49
|
+
const formatted = format(source, {
|
|
50
|
+
indentSize: 4, // default: 4
|
|
51
|
+
sortAttributes: true // default: true
|
|
52
|
+
})
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Output:
|
|
56
|
+
|
|
57
|
+
```kip
|
|
58
|
+
UPSERT {
|
|
59
|
+
CONCEPT ?x {
|
|
60
|
+
{type: "Drug", name: "Aspirin"}
|
|
61
|
+
SET ATTRIBUTES { risk_level: 2 }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The formatter preserves comments and quoted/unquoted key styles from the original source.
|
|
67
|
+
|
|
68
|
+
A lighter alternative `formatPreservingComments()` is also available — it normalizes indentation at the line level without AST reconstruction.
|
|
69
|
+
|
|
70
|
+
### Diagnose
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { diagnose } from '@ldclabs/kip-lang'
|
|
74
|
+
|
|
75
|
+
const diagnostics = diagnose('UPSERT { CONCEPT ?x { {type: "Drug"} }')
|
|
76
|
+
// [{ severity: "error", message: "Unclosed '{'", ... }]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Diagnostics cover:
|
|
80
|
+
- Lexer errors (unknown characters, unterminated strings)
|
|
81
|
+
- Bracket matching (unclosed / mismatched braces, brackets, parentheses)
|
|
82
|
+
- Parser errors (unexpected tokens, missing clauses)
|
|
83
|
+
|
|
84
|
+
## API Reference
|
|
85
|
+
|
|
86
|
+
| Export | Description |
|
|
87
|
+
| -------------------------------------------- | -------------------------------------------------------- |
|
|
88
|
+
| `tokenize(source)` | Tokenize KIP source into `Token[]` |
|
|
89
|
+
| `parse(source)` | Parse into `{ ast: Program, diagnostics: Diagnostic[] }` |
|
|
90
|
+
| `format(source, options?)` | AST-based formatting with comment preservation |
|
|
91
|
+
| `formatPreservingComments(source, options?)` | Line-level indent normalization |
|
|
92
|
+
| `diagnose(source)` | Return `Diagnostic[]` (lexer + bracket + parser errors) |
|
|
93
|
+
| `TokenType` | Enum of all token types |
|
|
94
|
+
| `KEYWORDS` / `FUNCTIONS` | Maps of KIP keywords and built-in functions |
|
|
95
|
+
|
|
96
|
+
### AST Node Types
|
|
97
|
+
|
|
98
|
+
All AST types are exported for downstream consumption:
|
|
99
|
+
|
|
100
|
+
- **Statements**: `FindStatement`, `UpsertStatement`, `DeleteStatement`, `DescribeStatement`, `SearchStatement`
|
|
101
|
+
- **Blocks**: `ConceptBlock`, `PropositionBlock`, `SetAttributes`, `SetPropositions`, `WithMetadata`
|
|
102
|
+
- **Patterns**: `ConceptPattern`, `PropositionPattern`, `FilterClause`, `NotClause`, `OptionalClause`, `UnionClause`
|
|
103
|
+
- **Expressions**: `ObjectLiteral`, `ArrayLiteral`, `ObjectEntry`, `Expression`
|
|
104
|
+
|
|
105
|
+
## KIP Language
|
|
106
|
+
|
|
107
|
+
KIP is a structured query and mutation language for knowledge graphs. See the [KIP Specification](../../SPECIFICATION.md) for full syntax details.
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
|
|
111
|
+
MIT
|
package/dist/ast.d.ts
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { Range } from './token.js';
|
|
2
|
+
export interface BaseNode {
|
|
3
|
+
kind: string;
|
|
4
|
+
range: Range;
|
|
5
|
+
leadingComments?: string[];
|
|
6
|
+
trailingComment?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Program extends BaseNode {
|
|
9
|
+
kind: 'Program';
|
|
10
|
+
statements: Statement[];
|
|
11
|
+
}
|
|
12
|
+
export type Statement = FindStatement | UpsertStatement | DeleteStatement | DescribeStatement | SearchStatement;
|
|
13
|
+
export interface FindStatement extends BaseNode {
|
|
14
|
+
kind: 'FindStatement';
|
|
15
|
+
projections: Expression[];
|
|
16
|
+
where?: WhereClause;
|
|
17
|
+
orderBy?: OrderByClause;
|
|
18
|
+
limit?: LimitClause;
|
|
19
|
+
cursor?: CursorClause;
|
|
20
|
+
}
|
|
21
|
+
export interface OrderByClause extends BaseNode {
|
|
22
|
+
kind: 'OrderByClause';
|
|
23
|
+
expression: Expression;
|
|
24
|
+
direction: 'ASC' | 'DESC';
|
|
25
|
+
}
|
|
26
|
+
export interface LimitClause extends BaseNode {
|
|
27
|
+
kind: 'LimitClause';
|
|
28
|
+
value: NumberLiteral | ParameterRef;
|
|
29
|
+
}
|
|
30
|
+
export interface CursorClause extends BaseNode {
|
|
31
|
+
kind: 'CursorClause';
|
|
32
|
+
value: StringLiteral | ParameterRef;
|
|
33
|
+
}
|
|
34
|
+
export interface WhereClause extends BaseNode {
|
|
35
|
+
kind: 'WhereClause';
|
|
36
|
+
patterns: WherePattern[];
|
|
37
|
+
}
|
|
38
|
+
export type WherePattern = ConceptPattern | PropositionPattern | FilterClause | NotClause | OptionalClause | UnionClause;
|
|
39
|
+
export interface ConceptPattern extends BaseNode {
|
|
40
|
+
kind: 'ConceptPattern';
|
|
41
|
+
variable?: string;
|
|
42
|
+
matcher: ConceptMatcher;
|
|
43
|
+
}
|
|
44
|
+
export interface ConceptMatcher extends BaseNode {
|
|
45
|
+
kind: 'ConceptMatcher';
|
|
46
|
+
entries: ObjectEntry[];
|
|
47
|
+
}
|
|
48
|
+
export interface PropositionPattern extends BaseNode {
|
|
49
|
+
kind: 'PropositionPattern';
|
|
50
|
+
variable?: string;
|
|
51
|
+
subject: PropositionEndpoint;
|
|
52
|
+
predicate: PredicateExpr;
|
|
53
|
+
object: PropositionEndpoint;
|
|
54
|
+
}
|
|
55
|
+
export type PropositionEndpoint = VariableRef | ConceptPattern | PropositionPattern;
|
|
56
|
+
export type PredicateExpr = PredicateLiteral | PredicateAlternation;
|
|
57
|
+
export interface PredicateLiteral extends BaseNode {
|
|
58
|
+
kind: 'PredicateLiteral';
|
|
59
|
+
value: string;
|
|
60
|
+
hopRange?: HopRange;
|
|
61
|
+
}
|
|
62
|
+
export interface PredicateAlternation extends BaseNode {
|
|
63
|
+
kind: 'PredicateAlternation';
|
|
64
|
+
predicates: PredicateLiteral[];
|
|
65
|
+
}
|
|
66
|
+
export interface HopRange extends BaseNode {
|
|
67
|
+
kind: 'HopRange';
|
|
68
|
+
min: number;
|
|
69
|
+
max?: number;
|
|
70
|
+
}
|
|
71
|
+
export interface FilterClause extends BaseNode {
|
|
72
|
+
kind: 'FilterClause';
|
|
73
|
+
expression: Expression;
|
|
74
|
+
}
|
|
75
|
+
export interface NotClause extends BaseNode {
|
|
76
|
+
kind: 'NotClause';
|
|
77
|
+
patterns: WherePattern[];
|
|
78
|
+
}
|
|
79
|
+
export interface OptionalClause extends BaseNode {
|
|
80
|
+
kind: 'OptionalClause';
|
|
81
|
+
patterns: WherePattern[];
|
|
82
|
+
}
|
|
83
|
+
export interface UnionClause extends BaseNode {
|
|
84
|
+
kind: 'UnionClause';
|
|
85
|
+
patterns: WherePattern[];
|
|
86
|
+
}
|
|
87
|
+
export interface UpsertStatement extends BaseNode {
|
|
88
|
+
kind: 'UpsertStatement';
|
|
89
|
+
blocks: UpsertBlock[];
|
|
90
|
+
metadata?: WithMetadata;
|
|
91
|
+
}
|
|
92
|
+
export type UpsertBlock = ConceptBlock | PropositionBlock;
|
|
93
|
+
export interface ConceptBlock extends BaseNode {
|
|
94
|
+
kind: 'ConceptBlock';
|
|
95
|
+
handle: string;
|
|
96
|
+
matcher: ConceptMatcher;
|
|
97
|
+
setAttributes?: SetAttributes;
|
|
98
|
+
setPropositions?: SetPropositions;
|
|
99
|
+
metadata?: WithMetadata;
|
|
100
|
+
}
|
|
101
|
+
export interface PropositionBlock extends BaseNode {
|
|
102
|
+
kind: 'PropositionBlock';
|
|
103
|
+
handle?: string;
|
|
104
|
+
subject: PropositionEndpoint;
|
|
105
|
+
predicate: PredicateExpr;
|
|
106
|
+
object: PropositionEndpoint;
|
|
107
|
+
setAttributes?: SetAttributes;
|
|
108
|
+
metadata?: WithMetadata;
|
|
109
|
+
}
|
|
110
|
+
export interface SetAttributes extends BaseNode {
|
|
111
|
+
kind: 'SetAttributes';
|
|
112
|
+
entries: ObjectEntry[];
|
|
113
|
+
}
|
|
114
|
+
export interface SetPropositions extends BaseNode {
|
|
115
|
+
kind: 'SetPropositions';
|
|
116
|
+
items: PropositionItem[];
|
|
117
|
+
}
|
|
118
|
+
export interface PropositionItem extends BaseNode {
|
|
119
|
+
kind: 'PropositionItem';
|
|
120
|
+
predicate: string;
|
|
121
|
+
target: PropositionEndpoint;
|
|
122
|
+
metadata?: WithMetadata;
|
|
123
|
+
}
|
|
124
|
+
export interface WithMetadata extends BaseNode {
|
|
125
|
+
kind: 'WithMetadata';
|
|
126
|
+
entries: ObjectEntry[];
|
|
127
|
+
}
|
|
128
|
+
export interface DeleteStatement extends BaseNode {
|
|
129
|
+
kind: 'DeleteStatement';
|
|
130
|
+
deleteType: 'ATTRIBUTES' | 'METADATA' | 'PROPOSITIONS' | 'CONCEPT';
|
|
131
|
+
/** For ATTRIBUTES/METADATA: the set of keys to delete */
|
|
132
|
+
keys?: string[];
|
|
133
|
+
/** The target variable */
|
|
134
|
+
target: string;
|
|
135
|
+
/** DETACH flag for CONCEPT deletion */
|
|
136
|
+
detach?: boolean;
|
|
137
|
+
where: WhereClause;
|
|
138
|
+
}
|
|
139
|
+
export interface DescribeStatement extends BaseNode {
|
|
140
|
+
kind: 'DescribeStatement';
|
|
141
|
+
describeType: 'PRIMER' | 'DOMAINS' | 'CONCEPT_TYPES' | 'CONCEPT_TYPE' | 'PROPOSITION_TYPES' | 'PROPOSITION_TYPE';
|
|
142
|
+
/** The type/predicate name for specific describe */
|
|
143
|
+
typeName?: string;
|
|
144
|
+
limit?: LimitClause;
|
|
145
|
+
cursor?: CursorClause;
|
|
146
|
+
}
|
|
147
|
+
export interface SearchStatement extends BaseNode {
|
|
148
|
+
kind: 'SearchStatement';
|
|
149
|
+
searchTarget: 'CONCEPT' | 'PROPOSITION';
|
|
150
|
+
term: string;
|
|
151
|
+
withType?: string;
|
|
152
|
+
limit?: LimitClause;
|
|
153
|
+
}
|
|
154
|
+
export type Expression = BinaryExpression | UnaryExpression | FunctionCallExpr | DotExpression | VariableRef | ParameterRef | StringLiteral | NumberLiteral | BooleanLiteral | NullLiteral | ArrayLiteral | ObjectLiteral;
|
|
155
|
+
export interface BinaryExpression extends BaseNode {
|
|
156
|
+
kind: 'BinaryExpression';
|
|
157
|
+
operator: string;
|
|
158
|
+
left: Expression;
|
|
159
|
+
right: Expression;
|
|
160
|
+
}
|
|
161
|
+
export interface UnaryExpression extends BaseNode {
|
|
162
|
+
kind: 'UnaryExpression';
|
|
163
|
+
operator: '!';
|
|
164
|
+
operand: Expression;
|
|
165
|
+
}
|
|
166
|
+
export interface FunctionCallExpr extends BaseNode {
|
|
167
|
+
kind: 'FunctionCallExpr';
|
|
168
|
+
name: string;
|
|
169
|
+
args: Expression[];
|
|
170
|
+
}
|
|
171
|
+
export interface DotExpression extends BaseNode {
|
|
172
|
+
kind: 'DotExpression';
|
|
173
|
+
object: Expression;
|
|
174
|
+
property: string;
|
|
175
|
+
}
|
|
176
|
+
export interface VariableRef extends BaseNode {
|
|
177
|
+
kind: 'VariableRef';
|
|
178
|
+
name: string;
|
|
179
|
+
}
|
|
180
|
+
export interface ParameterRef extends BaseNode {
|
|
181
|
+
kind: 'ParameterRef';
|
|
182
|
+
name: string;
|
|
183
|
+
}
|
|
184
|
+
export interface StringLiteral extends BaseNode {
|
|
185
|
+
kind: 'StringLiteral';
|
|
186
|
+
value: string;
|
|
187
|
+
parsed: string;
|
|
188
|
+
}
|
|
189
|
+
export interface NumberLiteral extends BaseNode {
|
|
190
|
+
kind: 'NumberLiteral';
|
|
191
|
+
value: number;
|
|
192
|
+
raw: string;
|
|
193
|
+
}
|
|
194
|
+
export interface BooleanLiteral extends BaseNode {
|
|
195
|
+
kind: 'BooleanLiteral';
|
|
196
|
+
value: boolean;
|
|
197
|
+
}
|
|
198
|
+
export interface NullLiteral extends BaseNode {
|
|
199
|
+
kind: 'NullLiteral';
|
|
200
|
+
}
|
|
201
|
+
export interface ArrayLiteral extends BaseNode {
|
|
202
|
+
kind: 'ArrayLiteral';
|
|
203
|
+
elements: Expression[];
|
|
204
|
+
}
|
|
205
|
+
export interface ObjectLiteral extends BaseNode {
|
|
206
|
+
kind: 'ObjectLiteral';
|
|
207
|
+
entries: ObjectEntry[];
|
|
208
|
+
}
|
|
209
|
+
export interface ObjectEntry extends BaseNode {
|
|
210
|
+
kind: 'ObjectEntry';
|
|
211
|
+
key: string;
|
|
212
|
+
/** Whether the key was originally quoted (e.g. `"description"` vs `description`) */
|
|
213
|
+
isQuoted: boolean;
|
|
214
|
+
value: Expression;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/ast.js
ADDED
package/dist/ast.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Range } from './token.js';
|
|
2
|
+
export interface Diagnostic {
|
|
3
|
+
range: Range;
|
|
4
|
+
severity: 'error' | 'warning' | 'info';
|
|
5
|
+
message: string;
|
|
6
|
+
code: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Runs diagnostics on KIP source code.
|
|
10
|
+
* Combines lexer-level issues (unterminated strings, unknown tokens)
|
|
11
|
+
* with parser-level syntax errors.
|
|
12
|
+
*/
|
|
13
|
+
export declare function diagnose(source: string): Diagnostic[];
|
|
14
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAKvC,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAkGrD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { tokenize } from './lexer.js';
|
|
2
|
+
import { parse } from './parser.js';
|
|
3
|
+
import { TokenType } from './token.js';
|
|
4
|
+
/**
|
|
5
|
+
* Runs diagnostics on KIP source code.
|
|
6
|
+
* Combines lexer-level issues (unterminated strings, unknown tokens)
|
|
7
|
+
* with parser-level syntax errors.
|
|
8
|
+
*/
|
|
9
|
+
export function diagnose(source) {
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
// Phase 1: Lexer-level diagnostics
|
|
12
|
+
const tokens = tokenize(source);
|
|
13
|
+
for (const tok of tokens) {
|
|
14
|
+
if (tok.type === TokenType.Unknown) {
|
|
15
|
+
diagnostics.push({
|
|
16
|
+
range: {
|
|
17
|
+
start: { line: tok.line, column: tok.column },
|
|
18
|
+
end: { line: tok.line, column: tok.column + tok.value.length }
|
|
19
|
+
},
|
|
20
|
+
severity: 'error',
|
|
21
|
+
message: `Unexpected character '${tok.value}'`,
|
|
22
|
+
code: 'KIP_LEX_UNKNOWN'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// Check for unterminated strings
|
|
26
|
+
if (tok.type === TokenType.String) {
|
|
27
|
+
if (!tok.value.endsWith('"') || tok.value.length < 2) {
|
|
28
|
+
diagnostics.push({
|
|
29
|
+
range: {
|
|
30
|
+
start: { line: tok.line, column: tok.column },
|
|
31
|
+
end: { line: tok.line, column: tok.column + tok.value.length }
|
|
32
|
+
},
|
|
33
|
+
severity: 'error',
|
|
34
|
+
message: 'Unterminated string literal',
|
|
35
|
+
code: 'KIP_LEX_UNTERMINATED_STRING'
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Phase 2: Bracket/paren matching
|
|
41
|
+
const bracketStack = [];
|
|
42
|
+
const openers = { '{': '}', '(': ')', '[': ']' };
|
|
43
|
+
const closers = { '}': '{', ')': '(', ']': '[' };
|
|
44
|
+
for (const tok of tokens) {
|
|
45
|
+
if (tok.type === TokenType.LBrace ||
|
|
46
|
+
tok.type === TokenType.LParen ||
|
|
47
|
+
tok.type === TokenType.LBracket) {
|
|
48
|
+
bracketStack.push({ type: tok.value, line: tok.line, column: tok.column });
|
|
49
|
+
}
|
|
50
|
+
else if (tok.type === TokenType.RBrace ||
|
|
51
|
+
tok.type === TokenType.RParen ||
|
|
52
|
+
tok.type === TokenType.RBracket) {
|
|
53
|
+
const expected = closers[tok.value];
|
|
54
|
+
if (bracketStack.length === 0) {
|
|
55
|
+
diagnostics.push({
|
|
56
|
+
range: {
|
|
57
|
+
start: { line: tok.line, column: tok.column },
|
|
58
|
+
end: { line: tok.line, column: tok.column + 1 }
|
|
59
|
+
},
|
|
60
|
+
severity: 'error',
|
|
61
|
+
message: `Unmatched closing '${tok.value}'`,
|
|
62
|
+
code: 'KIP_LEX_UNMATCHED_BRACKET'
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const top = bracketStack[bracketStack.length - 1];
|
|
67
|
+
if (top.type !== expected) {
|
|
68
|
+
diagnostics.push({
|
|
69
|
+
range: {
|
|
70
|
+
start: { line: tok.line, column: tok.column },
|
|
71
|
+
end: { line: tok.line, column: tok.column + 1 }
|
|
72
|
+
},
|
|
73
|
+
severity: 'error',
|
|
74
|
+
message: `Mismatched bracket: expected '${openers[top.type]}' but got '${tok.value}'`,
|
|
75
|
+
code: 'KIP_LEX_MISMATCHED_BRACKET'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
bracketStack.pop();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Report unclosed brackets
|
|
83
|
+
for (const unclosed of bracketStack) {
|
|
84
|
+
diagnostics.push({
|
|
85
|
+
range: {
|
|
86
|
+
start: { line: unclosed.line, column: unclosed.column },
|
|
87
|
+
end: { line: unclosed.line, column: unclosed.column + 1 }
|
|
88
|
+
},
|
|
89
|
+
severity: 'error',
|
|
90
|
+
message: `Unclosed '${unclosed.type}'`,
|
|
91
|
+
code: 'KIP_LEX_UNCLOSED_BRACKET'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Phase 3: Parser diagnostics
|
|
95
|
+
const { diagnostics: parseDiags } = parse(source);
|
|
96
|
+
diagnostics.push(...parseDiags);
|
|
97
|
+
return diagnostics;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface FormatOptions {
|
|
2
|
+
/** Number of spaces per indentation level (default: 4) */
|
|
3
|
+
indentSize?: number;
|
|
4
|
+
/** Sort keys inside SET ATTRIBUTES (default: true) */
|
|
5
|
+
sortAttributes?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function format(source: string, options?: FormatOptions): string;
|
|
8
|
+
/**
|
|
9
|
+
* A simpler comment-preserving formatter that works at the token level.
|
|
10
|
+
* It re-parses the source and reconstructs it line by line, preserving
|
|
11
|
+
* all comments in their relative positions while normalizing indentation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatPreservingComments(source: string, options?: FormatOptions): string;
|
|
14
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAWtE;AAwuBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CA0CR"}
|