@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 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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast.js.map
@@ -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":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAStC;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,WAAW,GAAiB,EAAE,CAAA;IAEpC,mCAAmC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,EAAE;YAClC,WAAW,CAAC,IAAI,CAAC;gBACf,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;oBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;iBAC/D;gBACD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,yBAAyB,GAAG,CAAC,KAAK,GAAG;gBAC9C,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAA;SACH;QAED,iCAAiC;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,EAAE;YACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpD,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;wBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;qBAC/D;oBACD,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,6BAA6B;oBACtC,IAAI,EAAE,6BAA6B;iBACpC,CAAC,CAAA;aACH;SACF;KACF;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAqD,EAAE,CAAA;IACzE,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IACxE,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAExE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;QACxB,IACE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,QAAQ,EAC/B;YACA,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;SAC3E;aAAM,IACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;YAC7B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,QAAQ,EAC/B;YACA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,WAAW,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE;wBACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;wBAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;qBAChD;oBACD,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,sBAAsB,GAAG,CAAC,KAAK,GAAG;oBAC3C,IAAI,EAAE,2BAA2B;iBAClC,CAAC,CAAA;aACH;iBAAM;gBACL,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;gBAClD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,WAAW,CAAC,IAAI,CAAC;wBACf,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;4BAC7C,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;yBAChD;wBACD,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,iCAAiC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,GAAG;wBACrF,IAAI,EAAE,4BAA4B;qBACnC,CAAC,CAAA;iBACH;gBACD,YAAY,CAAC,GAAG,EAAE,CAAA;aACnB;SACF;KACF;IAED,2BAA2B;IAC3B,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE;QACnC,WAAW,CAAC,IAAI,CAAC;YACf,KAAK,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;gBACvD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;aAC1D;YACD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,aAAa,QAAQ,CAAC,IAAI,GAAG;YACtC,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAA;KACH;IAED,8BAA8B;IAC9B,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IACjD,WAAW,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;IAE/B,OAAO,WAAW,CAAA;AACpB,CAAC"}
@@ -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"}