@meltemi/diagrams-language 0.0.0-stage → 1.9.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 +48 -2
- package/dist/cst.d.ts +200 -0
- package/dist/cst.d.ts.map +1 -0
- package/dist/cst.js +130 -0
- package/dist/cst.js.map +1 -0
- package/dist/diagnostics.d.ts +57 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +48 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/diff.d.ts +9 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +126 -0
- package/dist/diff.js.map +1 -0
- package/dist/format.d.ts +22 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +226 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +13 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +376 -0
- package/dist/lexer.js.map +1 -0
- package/dist/messages/en.d.ts +107 -0
- package/dist/messages/en.d.ts.map +1 -0
- package/dist/messages/en.js +109 -0
- package/dist/messages/en.js.map +1 -0
- package/dist/messages/es.d.ts +3 -0
- package/dist/messages/es.d.ts.map +1 -0
- package/dist/messages/es.js +85 -0
- package/dist/messages/es.js.map +1 -0
- package/dist/messages/index.d.ts +83 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +10 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/parser.d.ts +21 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +847 -0
- package/dist/parser.js.map +1 -0
- package/dist/positions.d.ts +36 -0
- package/dist/positions.d.ts.map +1 -0
- package/dist/positions.js +58 -0
- package/dist/positions.js.map +1 -0
- package/dist/text-edits.d.ts +20 -0
- package/dist/text-edits.d.ts.map +1 -0
- package/dist/text-edits.js +65 -0
- package/dist/text-edits.js.map +1 -0
- package/dist/tokens.d.ts +33 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +43 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +35 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Architecture Studio contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,49 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @meltemi/diagrams-language
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The language layer: a lexer, a lossless parser that keeps every byte (comments and spacing
|
|
4
|
+
included), diagnostics with stable codes, text edits and the source formatter. It knows the
|
|
5
|
+
grammar only; meaning lives in `@meltemi/diagrams-model`.
|
|
6
|
+
|
|
7
|
+
It is part of [Meltemi Diagrams](https://github.com/askenaz-dev/meltemi-diagrams#readme), diagrams as code with a canvas, motion and
|
|
8
|
+
exports. Every package of the product has the same version.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @meltemi/diagrams-language
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Node 22.12.0 or later. The package is an ES module with type declarations.
|
|
17
|
+
|
|
18
|
+
## Use
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { formatSource, parse, toText } from "@meltemi/diagrams-language";
|
|
22
|
+
|
|
23
|
+
const text = `language "0.2"
|
|
24
|
+
|
|
25
|
+
diagram shop: flow {
|
|
26
|
+
web["Web shop"]
|
|
27
|
+
api["Orders API"]
|
|
28
|
+
db[("Orders")]
|
|
29
|
+
web -> api: "HTTPS" as call
|
|
30
|
+
api -> db: "SQL" as store
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
|
|
34
|
+
const parsed = parse(text);
|
|
35
|
+
console.log(parsed.diagnostics.length); // 0: no syntax error
|
|
36
|
+
console.log(toText(parsed.root) === text); // true: the tree keeps every byte
|
|
37
|
+
console.log(formatSource(text).text);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Documentation
|
|
41
|
+
|
|
42
|
+
- [Grammar](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/language/grammar-0.2.md)
|
|
43
|
+
- [Diagnostics](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/language/diagnostics.md)
|
|
44
|
+
- [Formatting](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/language/formatting.md)
|
|
45
|
+
- [All documentation](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/README.md)
|
|
46
|
+
|
|
47
|
+
## Licence
|
|
48
|
+
|
|
49
|
+
MIT. Third-party components and their licences are listed in [THIRD_PARTY_LICENSES.md](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/THIRD_PARTY_LICENSES.md).
|
package/dist/cst.d.ts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import type { Token } from "./tokens.js";
|
|
2
|
+
export type NodeKind = "SourceFile" | "Header" | "ImportStatement" | "ImportMember" | "ModelBlock" | "DiagramBlock" | "StoryBlock" | "ExportBlock" | "ThemeBlock" | "Block" | "RelationStatement" | "ShorthandDeclaration" | "KeywordStatement" | "BlockChain" | "ChainClause" | "QualifiedRef" | "StringLiteral" | "NumberLiteral" | "Tuple" | "List" | "Missing" | "Error";
|
|
3
|
+
export type CstElement = CstNode | Token;
|
|
4
|
+
/**
|
|
5
|
+
* Common shape of every syntax node. `children` hold every token and node in source order, so
|
|
6
|
+
* the tree is lossless. Typed fields on each node kind point into `children` for convenience.
|
|
7
|
+
*/
|
|
8
|
+
export interface NodeBase {
|
|
9
|
+
readonly kind: NodeKind;
|
|
10
|
+
readonly children: readonly CstElement[];
|
|
11
|
+
/** Offset of the first token text (excluding leading trivia). */
|
|
12
|
+
readonly start: number;
|
|
13
|
+
/** Offset after the last token. */
|
|
14
|
+
readonly end: number;
|
|
15
|
+
/** Offset where the leading trivia of the first token starts. */
|
|
16
|
+
readonly fullStart: number;
|
|
17
|
+
/** True when the node contains a syntax error (missing or skipped tokens, bad tokens). */
|
|
18
|
+
readonly hasError: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Zero-width placeholder inserted by error recovery where a token or node was expected. */
|
|
21
|
+
export interface Missing extends NodeBase {
|
|
22
|
+
readonly kind: "Missing";
|
|
23
|
+
readonly expected: string;
|
|
24
|
+
}
|
|
25
|
+
/** Tokens skipped by error recovery. */
|
|
26
|
+
export interface ErrorNode extends NodeBase {
|
|
27
|
+
readonly kind: "Error";
|
|
28
|
+
}
|
|
29
|
+
export interface SourceFile extends NodeBase {
|
|
30
|
+
readonly kind: "SourceFile";
|
|
31
|
+
readonly items: readonly TopLevelItem[];
|
|
32
|
+
readonly eof: Token;
|
|
33
|
+
}
|
|
34
|
+
export type TopLevelItem = Header | ImportStatement | ModelBlock | DiagramBlock | StoryBlock | ExportBlock | ThemeBlock | ErrorNode;
|
|
35
|
+
export interface Header extends NodeBase {
|
|
36
|
+
readonly kind: "Header";
|
|
37
|
+
readonly keyword: Token;
|
|
38
|
+
readonly version: Token | Missing;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `import "<path>" as <namespace>` (form `namespace`) or
|
|
42
|
+
* `import <id> [as <alias>], ... from "<path>"` (form `members`).
|
|
43
|
+
*/
|
|
44
|
+
export interface ImportStatement extends NodeBase {
|
|
45
|
+
readonly kind: "ImportStatement";
|
|
46
|
+
readonly keyword: Token;
|
|
47
|
+
readonly form: "namespace" | "members";
|
|
48
|
+
/** The path string, or a placeholder when it is missing. */
|
|
49
|
+
readonly path: Token | Missing;
|
|
50
|
+
/** Namespace form: `as` and the namespace id. */
|
|
51
|
+
readonly asKeyword: Token | Missing | undefined;
|
|
52
|
+
readonly namespace: Token | Missing | undefined;
|
|
53
|
+
/** Members form: the imported ids and `from`. */
|
|
54
|
+
readonly members: readonly ImportMember[];
|
|
55
|
+
readonly fromKeyword: Token | Missing | undefined;
|
|
56
|
+
}
|
|
57
|
+
/** One imported id with its optional alias: `corporate as corp`. */
|
|
58
|
+
export interface ImportMember extends NodeBase {
|
|
59
|
+
readonly kind: "ImportMember";
|
|
60
|
+
readonly id: Token;
|
|
61
|
+
readonly asKeyword: Token | undefined;
|
|
62
|
+
readonly alias: Token | Missing | undefined;
|
|
63
|
+
}
|
|
64
|
+
export interface DiagramBlock extends NodeBase {
|
|
65
|
+
readonly kind: "DiagramBlock";
|
|
66
|
+
readonly keyword: Token;
|
|
67
|
+
readonly id: Token | Missing;
|
|
68
|
+
readonly colon: Token | Missing | undefined;
|
|
69
|
+
readonly type: Token | Missing | undefined;
|
|
70
|
+
readonly usingKeyword: Token | undefined;
|
|
71
|
+
readonly usingRef: QualifiedRef | Missing | undefined;
|
|
72
|
+
readonly block: Block | Missing;
|
|
73
|
+
}
|
|
74
|
+
/** `model <id> { }` and `theme <id> { }`. */
|
|
75
|
+
export interface ModelBlock extends NodeBase {
|
|
76
|
+
readonly kind: "ModelBlock";
|
|
77
|
+
readonly keyword: Token;
|
|
78
|
+
readonly id: Token | Missing;
|
|
79
|
+
readonly block: Block | Missing;
|
|
80
|
+
}
|
|
81
|
+
export interface ThemeBlock extends NodeBase {
|
|
82
|
+
readonly kind: "ThemeBlock";
|
|
83
|
+
readonly keyword: Token;
|
|
84
|
+
readonly id: Token | Missing;
|
|
85
|
+
readonly block: Block | Missing;
|
|
86
|
+
}
|
|
87
|
+
/** `story <id> for <ref> { }`. */
|
|
88
|
+
export interface StoryBlock extends NodeBase {
|
|
89
|
+
readonly kind: "StoryBlock";
|
|
90
|
+
readonly keyword: Token;
|
|
91
|
+
readonly id: Token | Missing;
|
|
92
|
+
readonly forKeyword: Token | Missing | undefined;
|
|
93
|
+
readonly target: QualifiedRef | Missing | undefined;
|
|
94
|
+
readonly block: Block | Missing;
|
|
95
|
+
}
|
|
96
|
+
/** `export <id> for <ref> { }`. */
|
|
97
|
+
export interface ExportBlock extends NodeBase {
|
|
98
|
+
readonly kind: "ExportBlock";
|
|
99
|
+
readonly keyword: Token;
|
|
100
|
+
readonly id: Token | Missing;
|
|
101
|
+
readonly forKeyword: Token | Missing | undefined;
|
|
102
|
+
readonly target: QualifiedRef | Missing | undefined;
|
|
103
|
+
readonly block: Block | Missing;
|
|
104
|
+
}
|
|
105
|
+
export interface Block extends NodeBase {
|
|
106
|
+
readonly kind: "Block";
|
|
107
|
+
readonly open: Token;
|
|
108
|
+
readonly statements: readonly Statement[];
|
|
109
|
+
readonly close: Token | Missing;
|
|
110
|
+
}
|
|
111
|
+
export type Statement = RelationStatement | ShorthandDeclaration | KeywordStatement | ErrorNode;
|
|
112
|
+
/** `<ref> -> <ref> [: "label"] [as <id>] [{ ... }]` */
|
|
113
|
+
export interface RelationStatement extends NodeBase {
|
|
114
|
+
readonly kind: "RelationStatement";
|
|
115
|
+
readonly source: QualifiedRef;
|
|
116
|
+
readonly arrow: Token;
|
|
117
|
+
readonly target: QualifiedRef | Missing;
|
|
118
|
+
readonly colon: Token | undefined;
|
|
119
|
+
readonly label: Token | Missing | undefined;
|
|
120
|
+
readonly asKeyword: Token | undefined;
|
|
121
|
+
readonly id: Token | Missing | undefined;
|
|
122
|
+
readonly block: Block | undefined;
|
|
123
|
+
}
|
|
124
|
+
/** `<id>["Label"]` (shape `box`) or `<id>[("Label")]` (shape `data`), with an optional block. */
|
|
125
|
+
export interface ShorthandDeclaration extends NodeBase {
|
|
126
|
+
readonly kind: "ShorthandDeclaration";
|
|
127
|
+
readonly id: Token;
|
|
128
|
+
readonly shape: "box" | "data";
|
|
129
|
+
readonly label: Token | Missing;
|
|
130
|
+
readonly block: Block | undefined;
|
|
131
|
+
}
|
|
132
|
+
/** `<word> <arg>* [{ ... }]`, optionally followed on the same line by more `<word> <arg>* { ... }`. */
|
|
133
|
+
export interface KeywordStatement extends NodeBase {
|
|
134
|
+
readonly kind: "KeywordStatement";
|
|
135
|
+
readonly keyword: Token;
|
|
136
|
+
readonly args: readonly Arg[];
|
|
137
|
+
readonly block: Block | undefined;
|
|
138
|
+
/** Present when more than one clause is chained, e.g. `alt "A" { } else "B" { }`. */
|
|
139
|
+
readonly chain: BlockChain | undefined;
|
|
140
|
+
}
|
|
141
|
+
export interface BlockChain extends NodeBase {
|
|
142
|
+
readonly kind: "BlockChain";
|
|
143
|
+
readonly clauses: readonly ChainClause[];
|
|
144
|
+
}
|
|
145
|
+
export interface ChainClause extends NodeBase {
|
|
146
|
+
readonly kind: "ChainClause";
|
|
147
|
+
readonly keyword: Token;
|
|
148
|
+
readonly args: readonly Arg[];
|
|
149
|
+
readonly block: Block | Missing;
|
|
150
|
+
}
|
|
151
|
+
export type Arg = QualifiedRef | StringLiteral | NumberLiteral | Tuple | List;
|
|
152
|
+
/** One identifier or several joined by dots: `api`, `shop.api`, `api.east`. */
|
|
153
|
+
export interface QualifiedRef extends NodeBase {
|
|
154
|
+
readonly kind: "QualifiedRef";
|
|
155
|
+
readonly parts: readonly Token[];
|
|
156
|
+
readonly text: string;
|
|
157
|
+
}
|
|
158
|
+
export interface StringLiteral extends NodeBase {
|
|
159
|
+
readonly kind: "StringLiteral";
|
|
160
|
+
readonly token: Token;
|
|
161
|
+
readonly value: string;
|
|
162
|
+
}
|
|
163
|
+
export interface NumberLiteral extends NodeBase {
|
|
164
|
+
readonly kind: "NumberLiteral";
|
|
165
|
+
readonly token: Token;
|
|
166
|
+
readonly value: number;
|
|
167
|
+
readonly unit: string | null;
|
|
168
|
+
}
|
|
169
|
+
export interface Tuple extends NodeBase {
|
|
170
|
+
readonly kind: "Tuple";
|
|
171
|
+
readonly open: Token;
|
|
172
|
+
readonly items: readonly Arg[];
|
|
173
|
+
readonly close: Token | Missing;
|
|
174
|
+
}
|
|
175
|
+
export interface List extends NodeBase {
|
|
176
|
+
readonly kind: "List";
|
|
177
|
+
readonly open: Token;
|
|
178
|
+
readonly items: readonly Arg[];
|
|
179
|
+
readonly close: Token | Missing;
|
|
180
|
+
}
|
|
181
|
+
export type CstNode = SourceFile | Header | ImportStatement | ImportMember | ModelBlock | DiagramBlock | StoryBlock | ExportBlock | ThemeBlock | Block | RelationStatement | ShorthandDeclaration | KeywordStatement | BlockChain | ChainClause | QualifiedRef | StringLiteral | NumberLiteral | Tuple | List | Missing | ErrorNode;
|
|
182
|
+
export declare function isToken(element: CstElement | undefined): element is Token;
|
|
183
|
+
export declare function isNode(element: CstElement | undefined): element is CstNode;
|
|
184
|
+
export declare function isMissing(element: CstElement | undefined): element is Missing;
|
|
185
|
+
/** All tokens under an element, in source order. */
|
|
186
|
+
export declare function tokensOf(element: CstElement): Generator<Token>;
|
|
187
|
+
/** Source text of an element, including the leading trivia of its first token. */
|
|
188
|
+
export declare function toText(element: CstElement): string;
|
|
189
|
+
export declare function firstToken(element: CstElement): Token | undefined;
|
|
190
|
+
export declare function lastToken(element: CstElement): Token | undefined;
|
|
191
|
+
/** Depth-first walk over nodes. Return `false` from the visitor to skip a node's children. */
|
|
192
|
+
export declare function walk(node: CstNode, visit: (node: CstNode, parent: CstNode | undefined) => boolean | void): void;
|
|
193
|
+
/** Map from every node to its parent node. */
|
|
194
|
+
export declare function buildParentMap(root: CstNode): Map<CstNode, CstNode>;
|
|
195
|
+
/** Builds a node and computes its spans and error flag from its children. */
|
|
196
|
+
export declare function makeNode<T extends CstNode>(kind: T["kind"], children: CstElement[], fields: Omit<T, keyof NodeBase>, position?: number): T;
|
|
197
|
+
export declare function makeMissing(expected: string, position: number): Missing;
|
|
198
|
+
/** Appends a child to an already built node (used to attach skipped tokens) and updates spans. */
|
|
199
|
+
export declare function appendChild(node: CstNode, child: CstElement): void;
|
|
200
|
+
//# sourceMappingURL=cst.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cst.d.ts","sourceRoot":"","sources":["../src/cst.ts"],"names":[],"mappings":"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"}
|
package/dist/cst.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
export function isToken(element) {
|
|
2
|
+
return element !== undefined && "leadingTrivia" in element;
|
|
3
|
+
}
|
|
4
|
+
export function isNode(element) {
|
|
5
|
+
return element !== undefined && !("leadingTrivia" in element);
|
|
6
|
+
}
|
|
7
|
+
export function isMissing(element) {
|
|
8
|
+
return isNode(element) && element.kind === "Missing";
|
|
9
|
+
}
|
|
10
|
+
/** All tokens under an element, in source order. */
|
|
11
|
+
export function* tokensOf(element) {
|
|
12
|
+
if (isToken(element)) {
|
|
13
|
+
yield element;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
for (const child of element.children)
|
|
17
|
+
yield* tokensOf(child);
|
|
18
|
+
}
|
|
19
|
+
/** Source text of an element, including the leading trivia of its first token. */
|
|
20
|
+
export function toText(element) {
|
|
21
|
+
let out = "";
|
|
22
|
+
for (const token of tokensOf(element)) {
|
|
23
|
+
for (const trivia of token.leadingTrivia)
|
|
24
|
+
out += trivia.text;
|
|
25
|
+
out += token.text;
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
export function firstToken(element) {
|
|
30
|
+
for (const token of tokensOf(element))
|
|
31
|
+
return token;
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
export function lastToken(element) {
|
|
35
|
+
if (isToken(element))
|
|
36
|
+
return element;
|
|
37
|
+
for (let i = element.children.length - 1; i >= 0; i--) {
|
|
38
|
+
const found = lastToken(element.children[i]);
|
|
39
|
+
if (found)
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
/** Depth-first walk over nodes. Return `false` from the visitor to skip a node's children. */
|
|
45
|
+
export function walk(node, visit) {
|
|
46
|
+
const stack = [{ node, parent: undefined }];
|
|
47
|
+
while (stack.length > 0) {
|
|
48
|
+
const { node: current, parent } = stack.pop();
|
|
49
|
+
if (visit(current, parent) === false)
|
|
50
|
+
continue;
|
|
51
|
+
for (let i = current.children.length - 1; i >= 0; i--) {
|
|
52
|
+
const child = current.children[i];
|
|
53
|
+
if (isNode(child))
|
|
54
|
+
stack.push({ node: child, parent: current });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Map from every node to its parent node. */
|
|
59
|
+
export function buildParentMap(root) {
|
|
60
|
+
const parents = new Map();
|
|
61
|
+
walk(root, (node, parent) => {
|
|
62
|
+
if (parent)
|
|
63
|
+
parents.set(node, parent);
|
|
64
|
+
});
|
|
65
|
+
return parents;
|
|
66
|
+
}
|
|
67
|
+
/** Builds a node and computes its spans and error flag from its children. */
|
|
68
|
+
export function makeNode(kind, children, fields, position) {
|
|
69
|
+
const node = { kind, children, start: 0, end: 0, fullStart: 0, hasError: false, ...fields };
|
|
70
|
+
computeSpans(node, position);
|
|
71
|
+
return node;
|
|
72
|
+
}
|
|
73
|
+
export function makeMissing(expected, position) {
|
|
74
|
+
return {
|
|
75
|
+
kind: "Missing",
|
|
76
|
+
expected,
|
|
77
|
+
children: [],
|
|
78
|
+
start: position,
|
|
79
|
+
end: position,
|
|
80
|
+
fullStart: position,
|
|
81
|
+
hasError: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Appends a child to an already built node (used to attach skipped tokens) and updates spans. */
|
|
85
|
+
export function appendChild(node, child) {
|
|
86
|
+
node.children.push(child);
|
|
87
|
+
computeSpans(node, node.start);
|
|
88
|
+
}
|
|
89
|
+
function computeSpans(node, position) {
|
|
90
|
+
let start = -1;
|
|
91
|
+
let end = -1;
|
|
92
|
+
let fullStart = -1;
|
|
93
|
+
let hasError = node.kind === "Missing" || node.kind === "Error";
|
|
94
|
+
let missingPosition;
|
|
95
|
+
for (const child of node.children) {
|
|
96
|
+
if (isToken(child)) {
|
|
97
|
+
if (start < 0) {
|
|
98
|
+
start = child.start;
|
|
99
|
+
fullStart = child.fullStart;
|
|
100
|
+
}
|
|
101
|
+
end = child.end;
|
|
102
|
+
if (child.kind === "Unknown" || child.malformed)
|
|
103
|
+
hasError = true;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (child.hasError)
|
|
107
|
+
hasError = true;
|
|
108
|
+
if (child.kind === "Missing") {
|
|
109
|
+
if (missingPosition === undefined)
|
|
110
|
+
missingPosition = child.start;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (child.end > child.start || child.children.length > 0) {
|
|
114
|
+
if (start < 0) {
|
|
115
|
+
start = child.start;
|
|
116
|
+
fullStart = child.fullStart;
|
|
117
|
+
}
|
|
118
|
+
end = child.end;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (start < 0) {
|
|
122
|
+
const p = missingPosition ?? position ?? 0;
|
|
123
|
+
start = end = fullStart = p;
|
|
124
|
+
}
|
|
125
|
+
node.start = start;
|
|
126
|
+
node.end = end;
|
|
127
|
+
node.fullStart = fullStart;
|
|
128
|
+
node.hasError = hasError;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=cst.js.map
|
package/dist/cst.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cst.js","sourceRoot":"","sources":["../src/cst.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { LineIndex, Range, Span } from "./positions.js";
|
|
2
|
+
export type Severity = "error" | "warning" | "info";
|
|
3
|
+
export interface RelatedInformation {
|
|
4
|
+
readonly message: string;
|
|
5
|
+
readonly range: Range;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* What tools need from a diagnostic without reading its words, which follow the interface language:
|
|
9
|
+
* quick fixes and checks read this, never the message or the hints.
|
|
10
|
+
*/
|
|
11
|
+
export interface DiagnosticData {
|
|
12
|
+
/** The ids the message names, in its order: an unknown element, a layer, an element and port. */
|
|
13
|
+
readonly ids?: readonly string[];
|
|
14
|
+
/** Values a fix may write in place of the diagnostic's text: the accepted alternatives. */
|
|
15
|
+
readonly candidates?: readonly string[];
|
|
16
|
+
/** `layout.text-overflow`: the element and the size that fits its text. */
|
|
17
|
+
readonly size?: {
|
|
18
|
+
readonly element: string;
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** A problem found in a source text. Codes are stable and documented in docs/language/diagnostics.md. */
|
|
24
|
+
export interface Diagnostic {
|
|
25
|
+
readonly code: string;
|
|
26
|
+
readonly severity: Severity;
|
|
27
|
+
readonly message: string;
|
|
28
|
+
readonly range: Range;
|
|
29
|
+
readonly hints?: readonly string[];
|
|
30
|
+
readonly related?: readonly RelatedInformation[];
|
|
31
|
+
readonly data?: DiagnosticData;
|
|
32
|
+
}
|
|
33
|
+
export interface DiagnosticInput {
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly severity?: Severity;
|
|
36
|
+
readonly message: string;
|
|
37
|
+
readonly span: Span;
|
|
38
|
+
readonly hints?: readonly string[];
|
|
39
|
+
readonly related?: readonly {
|
|
40
|
+
readonly message: string;
|
|
41
|
+
readonly span: Span;
|
|
42
|
+
}[];
|
|
43
|
+
readonly data?: DiagnosticData;
|
|
44
|
+
}
|
|
45
|
+
/** Collects diagnostics and resolves their spans to ranges. */
|
|
46
|
+
export declare class DiagnosticBag {
|
|
47
|
+
private readonly lines;
|
|
48
|
+
readonly items: Diagnostic[];
|
|
49
|
+
constructor(lines: LineIndex);
|
|
50
|
+
add(input: DiagnosticInput): Diagnostic;
|
|
51
|
+
get errorCount(): number;
|
|
52
|
+
}
|
|
53
|
+
export declare function createDiagnostic(lines: LineIndex, input: DiagnosticInput): Diagnostic;
|
|
54
|
+
/** Orders diagnostics by position, keeping the original order for ties. */
|
|
55
|
+
export declare function sortDiagnostics(diagnostics: readonly Diagnostic[]): Diagnostic[];
|
|
56
|
+
export declare function hasErrors(diagnostics: readonly Diagnostic[]): boolean;
|
|
57
|
+
//# 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,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/F;AAED,yGAAyG;AACzG,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;KAAE,EAAE,CAAC;IAChF,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,+DAA+D;AAC/D,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAM;gBAEL,KAAK,EAAE,SAAS;IAE7C,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU;IAMvC,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,UAAU,CAwBrF;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAUhF;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAErE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Collects diagnostics and resolves their spans to ranges. */
|
|
2
|
+
export class DiagnosticBag {
|
|
3
|
+
lines;
|
|
4
|
+
items = [];
|
|
5
|
+
constructor(lines) {
|
|
6
|
+
this.lines = lines;
|
|
7
|
+
}
|
|
8
|
+
add(input) {
|
|
9
|
+
const diagnostic = createDiagnostic(this.lines, input);
|
|
10
|
+
this.items.push(diagnostic);
|
|
11
|
+
return diagnostic;
|
|
12
|
+
}
|
|
13
|
+
get errorCount() {
|
|
14
|
+
return this.items.filter((d) => d.severity === "error").length;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function createDiagnostic(lines, input) {
|
|
18
|
+
const diagnostic = {
|
|
19
|
+
code: input.code,
|
|
20
|
+
severity: input.severity ?? "error",
|
|
21
|
+
message: input.message,
|
|
22
|
+
range: lines.range(input.span),
|
|
23
|
+
};
|
|
24
|
+
if (input.hints && input.hints.length > 0)
|
|
25
|
+
diagnostic.hints = [...input.hints];
|
|
26
|
+
if (input.related && input.related.length > 0) {
|
|
27
|
+
diagnostic.related = input.related.map((r) => ({
|
|
28
|
+
message: r.message,
|
|
29
|
+
range: lines.range(r.span),
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
if (input.data)
|
|
33
|
+
diagnostic.data = input.data;
|
|
34
|
+
return diagnostic;
|
|
35
|
+
}
|
|
36
|
+
/** Orders diagnostics by position, keeping the original order for ties. */
|
|
37
|
+
export function sortDiagnostics(diagnostics) {
|
|
38
|
+
return diagnostics
|
|
39
|
+
.map((d, i) => ({ d, i }))
|
|
40
|
+
.sort((a, b) => a.d.range.start.offset - b.d.range.start.offset ||
|
|
41
|
+
a.d.range.end.offset - b.d.range.end.offset ||
|
|
42
|
+
a.i - b.i)
|
|
43
|
+
.map((x) => x.d);
|
|
44
|
+
}
|
|
45
|
+
export function hasErrors(diagnostics) {
|
|
46
|
+
return diagnostics.some((d) => d.severity === "error");
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AA2CA,+DAA+D;AAC/D,MAAM,OAAO,aAAa;IAGK;IAFpB,KAAK,GAAiB,EAAE,CAAC;IAElC,YAA6B,KAAgB;QAAhB,UAAK,GAAL,KAAK,CAAW;IAAG,CAAC;IAEjD,GAAG,CAAC,KAAsB;QACxB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACjE,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAgB,EAAE,KAAsB;IACvE,MAAM,UAAU,GAQZ;QACF,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO;QACnC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;KAC/B,CAAC;IACF,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IACD,IAAI,KAAK,CAAC,IAAI;QAAE,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,WAAkC;IAChE,OAAO,WAAW;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzB,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;QAC/C,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;QAC3C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACZ;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAkC;IAC1D,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/diff.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TextEdit } from "./text-edits.js";
|
|
2
|
+
/** Splits a text into lines that keep their line terminators, so joining them gives the text. */
|
|
3
|
+
export declare function splitLinesKeepingEnds(text: string): string[];
|
|
4
|
+
/**
|
|
5
|
+
* Line-based edits that turn `before` into `after`, from Myers' O(ND) diff. Each edit replaces a
|
|
6
|
+
* run of changed lines; unchanged lines are never touched, so editors keep cursors and folding.
|
|
7
|
+
*/
|
|
8
|
+
export declare function diffLines(before: string, after: string): TextEdit[];
|
|
9
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,iGAAiG;AACjG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CA8CnE"}
|