astn 0.110.5 → 0.110.7
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 +17 -0
- package/README.md +414 -0
- package/dist/bin/validate_astn.d.ts +2 -0
- package/dist/bin/validate_astn.js +48 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/lib/create_error_message.d.ts +3 -3
- package/dist/lib/create_error_message.js +1 -1
- package/dist/lib/format.d.ts +18 -38
- package/dist/lib/format.js +1 -1
- package/dist/lib/parse.d.ts +16 -42
- package/dist/lib/parse.js +19 -19
- package/dist/lib/transformations/create_error_message.d.ts +5 -0
- package/dist/lib/transformations/create_error_message.js +75 -0
- package/dist/lib/transformations/format.d.ts +42 -0
- package/dist/lib/transformations/format.js +172 -0
- package/dist/lib/transformations/parse.d.ts +55 -0
- package/dist/lib/transformations/parse.js +865 -0
- package/dist/lib/types/ast.d.ts +123 -0
- package/dist/lib/types/ast.js +3 -0
- package/dist/lib/types/ide.d.ts +21 -0
- package/dist/lib/types/ide.js +3 -0
- package/dist/lib/types/parse_result.d.ts +30 -0
- package/dist/lib/types/parse_result.js +3 -0
- package/dist/lib/types/tokenize_result.d.ts +14 -0
- package/dist/lib/types/tokenize_result.js +3 -0
- package/documentation/railroad_diagram/diagram/apostrophed_string.png +0 -0
- package/documentation/railroad_diagram/diagram/astn_document.png +0 -0
- package/documentation/railroad_diagram/diagram/backticked_string.png +0 -0
- package/documentation/railroad_diagram/diagram/comment.png +0 -0
- package/documentation/railroad_diagram/diagram/concise_group.png +0 -0
- package/documentation/railroad_diagram/diagram/content.png +0 -0
- package/documentation/railroad_diagram/diagram/dictionary.png +0 -0
- package/documentation/railroad_diagram/diagram/elements.png +0 -0
- package/documentation/railroad_diagram/diagram/escaped_character.png +0 -0
- package/documentation/railroad_diagram/diagram/four_hexadecimal_digits.png +0 -0
- package/documentation/railroad_diagram/diagram/header.png +0 -0
- package/documentation/railroad_diagram/diagram/hexadecimal_digit.png +0 -0
- package/documentation/railroad_diagram/diagram/ignorable.png +0 -0
- package/documentation/railroad_diagram/diagram/include.png +0 -0
- package/documentation/railroad_diagram/diagram/key_value_pairs.png +0 -0
- package/documentation/railroad_diagram/diagram/line_comment.png +0 -0
- package/documentation/railroad_diagram/diagram/list.png +0 -0
- package/documentation/railroad_diagram/diagram/newline_character.png +0 -0
- package/documentation/railroad_diagram/diagram/normal_character.png +0 -0
- package/documentation/railroad_diagram/diagram/normal_or_newline_character.png +0 -0
- package/documentation/railroad_diagram/diagram/quoted_string.png +0 -0
- package/documentation/railroad_diagram/diagram/rr-2.5.png +0 -0
- package/documentation/railroad_diagram/diagram/set_optional_value.png +0 -0
- package/documentation/railroad_diagram/diagram/string.png +0 -0
- package/documentation/railroad_diagram/diagram/string_content_character.png +0 -0
- package/documentation/railroad_diagram/diagram/tagged_value.png +0 -0
- package/documentation/railroad_diagram/diagram/traditional_comment.png +0 -0
- package/documentation/railroad_diagram/diagram/undelimited_string.png +0 -0
- package/documentation/railroad_diagram/diagram/value.png +0 -0
- package/documentation/railroad_diagram/diagram/verbose_group.png +0 -0
- package/documentation/railroad_diagram/diagram/whitespace.png +0 -0
- package/documentation/railroad_diagram/index.md +425 -0
- package/package.json +59 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2025 Corno
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
# ASTN (Abstract Syntax Tree Notation)
|
|
2
|
+
|
|
3
|
+
A TypeScript library for parsing and formatting ASTN documents (Abstract Syntax Tree Notation) - a human-editable data format designed for structured content.
|
|
4
|
+
|
|
5
|
+
**ASTN is a superset of JSON** - any valid JSON document is also valid ASTN, but ASTN provides a number additional features for enhanced readability and functionality.
|
|
6
|
+
|
|
7
|
+
## Features of the ASTN specification
|
|
8
|
+
|
|
9
|
+
- 📋 **Multiple string types** - Support for quoted, backticked, apostrophed, and undelimited strings
|
|
10
|
+
- 💬 **Comments** - Line and block comment support
|
|
11
|
+
- 🏗️ **Rich data structures** - dictionaries, lists, groups, tagged values, include, set, not set
|
|
12
|
+
- 📄 **Document headers** - Optional header metadata for documents
|
|
13
|
+
- 🔗 **File inclusion** - Import other ASTN files with `@` syntax
|
|
14
|
+
- ✨ **Flexible punctuation** - Commas are optional, trailing commas are allowed
|
|
15
|
+
|
|
16
|
+
## Features of this tool
|
|
17
|
+
|
|
18
|
+
- 🚀 **Fast parsing** - Efficient lexer and parser implementation
|
|
19
|
+
- 📝 **Format validation** - Comprehensive error reporting with location information
|
|
20
|
+
- 🎨 **Code formatting** - Built-in formatter for consistent code style
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install astn
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### Parsing ASTN
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { Parser } from 'astn';
|
|
34
|
+
|
|
35
|
+
const source = `
|
|
36
|
+
! header "example"
|
|
37
|
+
{
|
|
38
|
+
\`name\`: "John Doe"
|
|
39
|
+
\`age\`: | 'number' "30"
|
|
40
|
+
\`hobbies\`: [
|
|
41
|
+
"reading"
|
|
42
|
+
"coding"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
const result = Parser.parse(source, { 'tab size': 4 });
|
|
48
|
+
|
|
49
|
+
if (result[0] === 'success') {
|
|
50
|
+
console.log('Parsed successfully:', result[1]);
|
|
51
|
+
} else {
|
|
52
|
+
console.error('Parse error:', result[1]);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Formatting ASTN
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import * as format from 'astn/format';
|
|
60
|
+
import * as types from 'astn';
|
|
61
|
+
|
|
62
|
+
// Format a parsed document
|
|
63
|
+
const edits = format.Document(document, {
|
|
64
|
+
'remove commas': false,
|
|
65
|
+
'indentation string': ' ',
|
|
66
|
+
'current indentation': ''
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Error Handling
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import * as create_error_message from 'astn/create_error_message';
|
|
74
|
+
|
|
75
|
+
const result = Parser.parse(invalidSource, { 'tab size': 4 });
|
|
76
|
+
|
|
77
|
+
if (result[0] === 'failure') {
|
|
78
|
+
const errorMessage = create_error_message.Parse_Error(result[1], {
|
|
79
|
+
'position info': ['one based', null]
|
|
80
|
+
});
|
|
81
|
+
console.error('Parse Error:', errorMessage);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## ASTN Syntax Overview
|
|
86
|
+
|
|
87
|
+
ASTN supports various data types and structures:
|
|
88
|
+
|
|
89
|
+
### JSON Compatibility
|
|
90
|
+
|
|
91
|
+
Since ASTN is a superset of JSON, any valid JSON works as-is:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"name": "John Doe",
|
|
96
|
+
"age": 30,
|
|
97
|
+
"hobbies": ["reading", "coding"],
|
|
98
|
+
"active": true,
|
|
99
|
+
"metadata": null
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
But ASTN extends JSON with additional features for better readability and functionality.
|
|
104
|
+
|
|
105
|
+
### JSON vs ASTN Comparison
|
|
106
|
+
|
|
107
|
+
Here's the same data structure in JSON vs ASTN, showing ASTN's enhanced features:
|
|
108
|
+
|
|
109
|
+
<table>
|
|
110
|
+
<tr>
|
|
111
|
+
<th>JSON</th>
|
|
112
|
+
<th>ASTN</th>
|
|
113
|
+
</tr>
|
|
114
|
+
<tr>
|
|
115
|
+
<td>
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"config": {
|
|
120
|
+
"name": "MyApp",
|
|
121
|
+
"version": "1.2.3",
|
|
122
|
+
"enabled": true,
|
|
123
|
+
"created": "2025-07-21T10:30:00Z",
|
|
124
|
+
"tags": ["web", "typescript"],
|
|
125
|
+
"databases": {
|
|
126
|
+
"local": {
|
|
127
|
+
"host": "localhost",
|
|
128
|
+
"port": 5432,
|
|
129
|
+
"ssl": null
|
|
130
|
+
},
|
|
131
|
+
"remote": {
|
|
132
|
+
"host": "localhost",
|
|
133
|
+
"port": 1234,
|
|
134
|
+
"ssl": null
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
</td>
|
|
142
|
+
<td>
|
|
143
|
+
|
|
144
|
+
```astn
|
|
145
|
+
! "Application Configuration"
|
|
146
|
+
(
|
|
147
|
+
'config': {
|
|
148
|
+
'name': "MyApp"
|
|
149
|
+
'version': "1.2.3"
|
|
150
|
+
'enabled': true
|
|
151
|
+
'created': 2025-07-21 // undelimited date
|
|
152
|
+
'tags': ["web", "typescript"]
|
|
153
|
+
'databases': (
|
|
154
|
+
`local`: {
|
|
155
|
+
'host': "localhost"
|
|
156
|
+
'port': | 'number' "5432" // tagged value
|
|
157
|
+
'ssl': ~ // not set
|
|
158
|
+
},
|
|
159
|
+
`remote": <"localhost" 'number' 1234 ~>
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
</td>
|
|
166
|
+
</tr>
|
|
167
|
+
</table>
|
|
168
|
+
|
|
169
|
+
**ASTN advantages shown above:**
|
|
170
|
+
- 📄 **Headers** - `! header "..."` for document metadata
|
|
171
|
+
- 💬 **Comments** - `//` and `/* */` supported throughout
|
|
172
|
+
- 🏷️ **Tagged values** - `| 'number' "5432"` for type information
|
|
173
|
+
- ✨ **Flexible literals** - `2025-07-21` without quotes
|
|
174
|
+
- 🚫 **Explicit "not set"** - `~` instead of `null`
|
|
175
|
+
- **Instance keys** - `` `key` `` for data identifiers
|
|
176
|
+
- ✨ **Optional commas** - cleaner syntax without mandatory commas
|
|
177
|
+
|
|
178
|
+
### Schema vs Instance Data Distinction
|
|
179
|
+
|
|
180
|
+
One of ASTN's key improvements over JSON is the clear distinction between **schema keys** (fixed structure) and **instance keys** (dynamic data):
|
|
181
|
+
|
|
182
|
+
**JSON Problem:** In JSON, it's difficult to distinguish between:
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"config": { // Is this a schema key or instance data?
|
|
186
|
+
"host": "localhost" // Are these fixed fields or dynamic entries?
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**ASTN Solution:** Uses different structures for different purposes:
|
|
192
|
+
|
|
193
|
+
```astn
|
|
194
|
+
// Verbose Group - for schema/structure ( () and apostrophe keys)
|
|
195
|
+
('config': (
|
|
196
|
+
'host': "localhost" // Fixed schema fields
|
|
197
|
+
'port': 5432
|
|
198
|
+
))
|
|
199
|
+
|
|
200
|
+
// Dictionary - for instance/dynamic data ( {} and backtick keys)
|
|
201
|
+
{
|
|
202
|
+
`user_123`: "John" // Dynamic user IDs
|
|
203
|
+
`user_456`: "Jane" // Runtime-determined keys
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
This makes the data's intent much clearer to both humans and tools!
|
|
208
|
+
|
|
209
|
+
### Lists vs Concise Groups Distinction
|
|
210
|
+
|
|
211
|
+
ASTN also distinguishes between **lists** (ordered instance data) and **groups** (ordered schema data):
|
|
212
|
+
|
|
213
|
+
**JSON Problem:** Arrays in JSON are ambiguous about their purpose:
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"coordinates": [10, 20, 30], // Is this a list or structured data?
|
|
217
|
+
"users": ["John", "Jane"] // Dynamic list or fixed schema fields?
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**ASTN Solution:** Four different structures for different purposes:
|
|
222
|
+
|
|
223
|
+
```astn
|
|
224
|
+
// 1. List - for dynamic/instance data (square brackets)
|
|
225
|
+
{
|
|
226
|
+
`users`: [ // Dynamic list of users
|
|
227
|
+
"John"
|
|
228
|
+
"Jane"
|
|
229
|
+
"Bob" // Can add/remove items
|
|
230
|
+
]
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// 2. Dictionary - for key-value instance data (curly braces + backticks)
|
|
234
|
+
{
|
|
235
|
+
`user_data`: {
|
|
236
|
+
`user_123`: "John" // Dynamic user IDs as keys
|
|
237
|
+
`user_456`: "Jane" // Runtime-determined keys
|
|
238
|
+
`user_789`: "Bob"
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// 3. Concise Group - for schema/structure (angle brackets)
|
|
243
|
+
{
|
|
244
|
+
`coordinates`: <10 20 30> // Fixed x, y, z coordinates
|
|
245
|
+
`rgb_color`: <255 128 0> // Fixed red, green, blue values
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// 4. Verbose Group - explicit schema names (parentheses)
|
|
249
|
+
{
|
|
250
|
+
`coordinates`: (
|
|
251
|
+
'x': 10
|
|
252
|
+
'y': 20
|
|
253
|
+
'z': 30
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Example: Same data in concise vs verbose groups:**
|
|
259
|
+
```astn
|
|
260
|
+
// Concise - implicit positional names
|
|
261
|
+
`person`: <"John" 30 "Engineer">
|
|
262
|
+
|
|
263
|
+
// Verbose - explicit schema names (equivalent to above)
|
|
264
|
+
`person`: (
|
|
265
|
+
'name': "John"
|
|
266
|
+
'age': 30
|
|
267
|
+
'job': "Engineer"
|
|
268
|
+
)
|
|
269
|
+
```
|
|
270
|
+
schema-aware tooling can create support to toggle between these 2 representations
|
|
271
|
+
|
|
272
|
+
**Concise vs Verbose Groups:** These are interchangeable - concise groups are just verbose groups with implicit position-based schema names (first, second, third, etc.).
|
|
273
|
+
|
|
274
|
+
### Document Structure
|
|
275
|
+
```astn
|
|
276
|
+
// Optional header
|
|
277
|
+
! header "Document metadata or title"
|
|
278
|
+
|
|
279
|
+
// Main document content
|
|
280
|
+
{
|
|
281
|
+
"content": "value"
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Basic Values
|
|
286
|
+
```astn
|
|
287
|
+
"quoted string" // Can contain newlines and escape sequences
|
|
288
|
+
'apostrophed string' // Used for schema/meta names (keys, state names)
|
|
289
|
+
`backticked string` // Used for identifiers
|
|
290
|
+
undelimited_string // Flexible literals (dates, numbers, booleans, etc.)
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**String Type Usage:**
|
|
294
|
+
- **Quoted strings** (`"..."`) - General purpose strings that support newlines and escape sequences like `\n`, `\t`, `\"`, etc.
|
|
295
|
+
- **Apostrophed strings** (`'...'`) - Specifically for schema and metadata names such as verbose group keys and tagged value state names
|
|
296
|
+
- **Backticked strings** (`` `...` ``) - Used for identifiers and instance data such as dictionary keys
|
|
297
|
+
- **Undelimited strings** - More flexible than JSON primitives; can represent:
|
|
298
|
+
- Booleans: `true`, `false`
|
|
299
|
+
- Numbers: `42`, `3.14`, `-123`
|
|
300
|
+
- Dates: `2025-07-21`, `2025-07-21T10:30:00Z`
|
|
301
|
+
- Custom literals: `null`, `undefined`, or domain-specific values
|
|
302
|
+
|
|
303
|
+
### Collections
|
|
304
|
+
```astn
|
|
305
|
+
// Dictionary (commas optional, trailing commas allowed)
|
|
306
|
+
{
|
|
307
|
+
`key`: "value" // backtick for instance data key
|
|
308
|
+
`number`: | 'number' "42" // backtick for key, apostrophe for state name
|
|
309
|
+
`description`: "Multi-line
|
|
310
|
+
strings are supported
|
|
311
|
+
in quoted strings"
|
|
312
|
+
`date`: 2025-07-21 // undelimited date
|
|
313
|
+
`enabled`: true // undelimited boolean
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// List with flexible comma usage
|
|
317
|
+
[
|
|
318
|
+
"item1"
|
|
319
|
+
'schema_name' // apostrophe for schema identifier
|
|
320
|
+
`instance_id` // backtick for instance identifier
|
|
321
|
+
2025-07-21 // undelimited date
|
|
322
|
+
42 // undelimited number
|
|
323
|
+
]
|
|
324
|
+
|
|
325
|
+
// Concise Group
|
|
326
|
+
<"item1" 'meta_name' `instance_id`>
|
|
327
|
+
|
|
328
|
+
// Verbose Group (apostrophes for schema keys)
|
|
329
|
+
('schema_key': "value1" 'another_key': "value2")
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Special Values
|
|
333
|
+
```astn
|
|
334
|
+
// Tagged values (apostrophe for state names)
|
|
335
|
+
| 'number' "42"
|
|
336
|
+
| 'date' 2025-07-21
|
|
337
|
+
| 'boolean' true
|
|
338
|
+
| 'custom_type' "some value"
|
|
339
|
+
|
|
340
|
+
// Optional values
|
|
341
|
+
* "optional value"
|
|
342
|
+
* 2025-12-31 // undelimited date as optional
|
|
343
|
+
|
|
344
|
+
// Not set
|
|
345
|
+
~
|
|
346
|
+
|
|
347
|
+
// File inclusion
|
|
348
|
+
@ "path/to/config.astn"
|
|
349
|
+
@ "../shared/constants.astn"
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Comments
|
|
353
|
+
```astn
|
|
354
|
+
// Line comment
|
|
355
|
+
/* Block comment */
|
|
356
|
+
{
|
|
357
|
+
"key": "value" // Trailing comment
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## VS Code Extension
|
|
362
|
+
|
|
363
|
+
For the best development experience with ASTN files, install the **ASTN** VS Code extension:
|
|
364
|
+
|
|
365
|
+
- **Extension ID**: `astn`
|
|
366
|
+
- **Features**: Syntax highlighting, error detection, and formatting support
|
|
367
|
+
- **Installation**: Search for "astn" in the VS Code Extensions marketplace
|
|
368
|
+
|
|
369
|
+
The extension provides:
|
|
370
|
+
- 🎨 Syntax highlighting for `.astn` files
|
|
371
|
+
- 🔍 Real-time error detection and validation
|
|
372
|
+
- 📝 IntelliSense and autocompletion
|
|
373
|
+
- 🔧 Integrated formatting support
|
|
374
|
+
|
|
375
|
+
## CLI Usage
|
|
376
|
+
|
|
377
|
+
Validate ASTN files:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
npx astn-validate < input.astn
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## API Reference
|
|
384
|
+
|
|
385
|
+
### Types
|
|
386
|
+
|
|
387
|
+
- `Document` - Root document structure
|
|
388
|
+
- `Value` - Any ASTN value
|
|
389
|
+
- `StringX` - String with type information
|
|
390
|
+
- `Parse_Error` - Detailed error information
|
|
391
|
+
- `Location` - Position information in source
|
|
392
|
+
|
|
393
|
+
### Functions
|
|
394
|
+
|
|
395
|
+
- `Parser.parse(source, options)` - Parse ASTN source
|
|
396
|
+
- `format.Document(doc, options)` - Format a document
|
|
397
|
+
- `create_error_message.Parse_Error(error, options)` - Create human-readable error messages
|
|
398
|
+
|
|
399
|
+
## Documentation
|
|
400
|
+
|
|
401
|
+
- [Railroad Diagrams](./documentation/railroad_diagram/index.md)
|
|
402
|
+
- [EBNF Grammar](./extra/astn.ebnf)
|
|
403
|
+
|
|
404
|
+
## Contributing
|
|
405
|
+
|
|
406
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
407
|
+
|
|
408
|
+
## License
|
|
409
|
+
|
|
410
|
+
Apache 2.0 License - see LICENSE file for details.
|
|
411
|
+
|
|
412
|
+
## Version
|
|
413
|
+
|
|
414
|
+
Current version: 0.110.5
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
+
if (mod && mod.__esModule) return mod;
|
|
21
|
+
var result = {};
|
|
22
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
+
__setModuleDefault(result, mod);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
const _er = __importStar(require("exupery-core-resources"));
|
|
28
|
+
const _ea = __importStar(require("exupery-core-alg"));
|
|
29
|
+
const parse = __importStar(require("../lib/transformations/parse"));
|
|
30
|
+
const create_error_message = __importStar(require("../lib/transformations/create_error_message"));
|
|
31
|
+
_er.temp_resources.process["get instream data"](($) => {
|
|
32
|
+
_ea.cc(parse.Parser.parse($, {
|
|
33
|
+
'tab size': 4,
|
|
34
|
+
}), ($) => {
|
|
35
|
+
switch ($[0]) {
|
|
36
|
+
case 'failure': return _ea.ss($, ($) => {
|
|
37
|
+
_er.temp_resources.console.error(`Parse Error: ${create_error_message.Parse_Error($, { 'position info': ['one based', null] })}`);
|
|
38
|
+
// process.exit(1)
|
|
39
|
+
});
|
|
40
|
+
case 'success': return _ea.ss($, ($) => {
|
|
41
|
+
_er.temp_resources.console.log(`document is valid ASTN`);
|
|
42
|
+
// process.exit(0)
|
|
43
|
+
});
|
|
44
|
+
default: return _ea.au($[0]);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVfYXN0bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vdmFsaWRhdGVfYXN0bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLDREQUE2QztBQUM3QyxzREFBdUM7QUFFdkMsb0VBQXFEO0FBQ3JELGtHQUFtRjtBQUduRixHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDbEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDckIsQ0FBQyxFQUNEO1FBQ0ksVUFBVSxFQUFFLENBQUM7S0FDaEIsQ0FDSixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDTCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ25DLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0Isb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUNqSSxrQkFBa0I7WUFDdEIsQ0FBQyxDQUFDLENBQUE7WUFDRixLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUE7Z0JBQ3hELGtCQUFrQjtZQUN0QixDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from "./lib/types";
|
|
2
|
-
export * from "./lib/parse";
|
|
3
|
-
export * as format from "./lib/format";
|
|
4
|
-
export * as create_error_message from "./lib/create_error_message";
|
|
1
|
+
export * from "./lib/types/ast";
|
|
2
|
+
export * from "./lib/transformations/parse";
|
|
3
|
+
export * as format from "./lib/transformations/format";
|
|
4
|
+
export * as create_error_message from "./lib/transformations/create_error_message";
|
package/dist/index.js
CHANGED
|
@@ -27,8 +27,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.create_error_message = exports.format = void 0;
|
|
30
|
-
__exportStar(require("./lib/types"), exports);
|
|
31
|
-
__exportStar(require("./lib/parse"), exports);
|
|
32
|
-
exports.format = __importStar(require("./lib/format"));
|
|
33
|
-
exports.create_error_message = __importStar(require("./lib/create_error_message"));
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
__exportStar(require("./lib/types/ast"), exports);
|
|
31
|
+
__exportStar(require("./lib/transformations/parse"), exports);
|
|
32
|
+
exports.format = __importStar(require("./lib/transformations/format"));
|
|
33
|
+
exports.create_error_message = __importStar(require("./lib/transformations/create_error_message"));
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBK0I7QUFDL0IsOERBQTJDO0FBQzNDLHVFQUFzRDtBQUN0RCxtR0FBa0YifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
export declare const Parse_Error_Type: ($:
|
|
3
|
-
export declare const Parse_Error: ($:
|
|
1
|
+
import * as parse_result from "./types/parse_result";
|
|
2
|
+
export declare const Parse_Error_Type: ($: parse_result.Parse_Error_Type) => string;
|
|
3
|
+
export declare const Parse_Error: ($: parse_result.Parse_Error, $p: {
|
|
4
4
|
"position info": ["zero based", null] | ["one based", null];
|
|
5
5
|
}) => string;
|
|
@@ -72,4 +72,4 @@ const Parse_Error = ($, $p) => {
|
|
|
72
72
|
return `failed to parse ASTN, ${(0, exports.Parse_Error_Type)($.type)} @ ${$.range.start.relative.line + extra}:${$.range.start.relative.column + extra}`;
|
|
73
73
|
};
|
|
74
74
|
exports.Parse_Error = Parse_Error;
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlX2Vycm9yX21lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NyZWF0ZV9lcnJvcl9tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXVDO0FBSXZDLGdFQUFpRDtBQUUxQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBZ0MsRUFBVSxFQUFFO0lBQ3pFLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNuQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsS0FBSyxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNYLEtBQUssOEJBQThCLENBQUMsQ0FBQyxPQUFPLG9DQUFvQyxDQUFBO29CQUNoRixLQUFLLDRDQUE0QyxDQUFDLENBQUMsT0FBTyxrREFBa0QsQ0FBQTtvQkFDNUcsS0FBSyxnQ0FBZ0MsQ0FBQyxDQUFDLE9BQU8sc0NBQXNDLENBQUE7b0JBQ3BGLEtBQUssc0JBQXNCLENBQUMsQ0FBQyxPQUFPLDRCQUE0QixDQUFBO29CQUNoRSxLQUFLLHFCQUFxQixDQUFDLENBQUMsT0FBTywyQkFBMkIsQ0FBQTtvQkFDOUQsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDLE9BQU8sa0NBQWtDLENBQUE7b0JBQzVFLEtBQUssc0NBQXNDLENBQUMsQ0FBQyxPQUFPLDRDQUE0QyxDQUFBO29CQUNoRyxLQUFLLGlDQUFpQyxDQUFDLENBQUMsT0FBTyx1Q0FBdUMsQ0FBQTtvQkFDdEYsS0FBSywwQkFBMEIsQ0FB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
|
package/dist/lib/format.d.ts
CHANGED
|
@@ -1,62 +1,42 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as
|
|
3
|
-
export
|
|
4
|
-
export type Text_Edit = [
|
|
5
|
-
'insert',
|
|
6
|
-
{
|
|
7
|
-
'location': types.Relative_Location;
|
|
8
|
-
'text': string;
|
|
9
|
-
}
|
|
10
|
-
] | [
|
|
11
|
-
'replace',
|
|
12
|
-
{
|
|
13
|
-
'range': Range;
|
|
14
|
-
'text': string;
|
|
15
|
-
}
|
|
16
|
-
] | [
|
|
17
|
-
'delete',
|
|
18
|
-
{
|
|
19
|
-
'range': Range;
|
|
20
|
-
}
|
|
21
|
-
];
|
|
22
|
-
export type Text_Edits = _et.Array<Text_Edit>;
|
|
23
|
-
export declare const Whitespace: ($: types.Whitespace, $p: {
|
|
1
|
+
import * as ast from "./types/ast";
|
|
2
|
+
import * as ide from "./types/ide";
|
|
3
|
+
export declare const Whitespace: ($: ast.Whitespace, $p: {
|
|
24
4
|
"remove commas": boolean;
|
|
25
5
|
"indentation string": string;
|
|
26
6
|
"current indentation": string;
|
|
27
|
-
}) => Text_Edits;
|
|
28
|
-
export declare const Trivia: ($:
|
|
7
|
+
}) => ide.Text_Edits;
|
|
8
|
+
export declare const Trivia: ($: ast.Trivia, $p: {
|
|
29
9
|
"remove commas": boolean;
|
|
30
10
|
"indentation string": string;
|
|
31
11
|
"current indentation": string;
|
|
32
|
-
}) => Text_Edits;
|
|
33
|
-
export declare const Structural_Token: ($:
|
|
12
|
+
}) => ide.Text_Edits;
|
|
13
|
+
export declare const Structural_Token: ($: ast.Structural_Token, $p: {
|
|
34
14
|
"remove commas": boolean;
|
|
35
15
|
"indentation string": string;
|
|
36
16
|
"current indentation": string;
|
|
37
|
-
}) => Text_Edits;
|
|
38
|
-
export declare const String: ($:
|
|
17
|
+
}) => ide.Text_Edits;
|
|
18
|
+
export declare const String: ($: ast.StringX, $p: {
|
|
39
19
|
"remove commas": boolean;
|
|
40
20
|
"indentation string": string;
|
|
41
21
|
"current indentation": string;
|
|
42
|
-
}) => Text_Edits;
|
|
43
|
-
export declare const Key_Value_Pairs: ($:
|
|
22
|
+
}) => ide.Text_Edits;
|
|
23
|
+
export declare const Key_Value_Pairs: ($: ast.Key_Value_Pairs, $p: {
|
|
44
24
|
"remove commas": boolean;
|
|
45
25
|
"indentation string": string;
|
|
46
26
|
"current indentation": string;
|
|
47
|
-
}) => Text_Edits;
|
|
48
|
-
export declare const Elements: ($:
|
|
27
|
+
}) => ide.Text_Edits;
|
|
28
|
+
export declare const Elements: ($: ast.Elements, $p: {
|
|
49
29
|
"remove commas": boolean;
|
|
50
30
|
"indentation string": string;
|
|
51
31
|
"current indentation": string;
|
|
52
|
-
}) => Text_Edits;
|
|
53
|
-
export declare const Value: ($:
|
|
32
|
+
}) => ide.Text_Edits;
|
|
33
|
+
export declare const Value: ($: ast.Value, $p: {
|
|
54
34
|
"remove commas": boolean;
|
|
55
35
|
"indentation string": string;
|
|
56
36
|
"current indentation": string;
|
|
57
|
-
}) => Text_Edits;
|
|
58
|
-
export declare const Document: ($:
|
|
37
|
+
}) => ide.Text_Edits;
|
|
38
|
+
export declare const Document: ($: ast.Document, $p: {
|
|
59
39
|
"remove commas": boolean;
|
|
60
40
|
"indentation string": string;
|
|
61
41
|
"current indentation": string;
|
|
62
|
-
}) => Text_Edits;
|
|
42
|
+
}) => ide.Text_Edits;
|
package/dist/lib/format.js
CHANGED
|
@@ -169,4 +169,4 @@ const Document = ($, $p) => {
|
|
|
169
169
|
]));
|
|
170
170
|
};
|
|
171
171
|
exports.Document = Document;
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxzREFBdUM7QUFFdkMsZ0VBQWlEO0FBS2pELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxRQUErQixFQUFFLFNBQWlCLEVBQXlCLEVBQUU7SUFDckcsT0FBTztRQUNILFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVM7UUFDckMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO0tBQ3hCLENBQUE7QUFDTCxDQUFDLENBQUE7QUFHRCxNQUFNLEVBQUUsR0FBRztJQUNQLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO0NBQ25DLENBQUE7QUFFTSxNQUFNLFVBQVUsR0FBRyxDQUN0QixDQUFpQixFQUNqQixFQUlDLEVBQ2EsRUFBRTtJQUNoQixPQUFPLEdBQUcsQ0FBQyxhQUFhLENBQUM7SUFDckIsT0FBTztLQUNWLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQVhZLFFBQUEsVUFBVSxjQVd0QjtBQUVNLE1BQU0sTUFBTSxHQUFHLENBQ2xCLENBQWEsRUFDYixFQUlDLEVBQ2EsRUFBRTtJQUNoQixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFBLGtCQUFVLEVBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9CLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO2dCQUNoQyxPQUFPO2dCQUNQLDZCQUE2QjtnQkFDN0Isc0JBQXNCO2dCQUN0QixzRUFBc0U7Z0JB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
|