@mirascript/typed 0.1.62 → 0.1.64

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 CHANGED
@@ -2,10 +2,13 @@
2
2
 
3
3
  `@mirascript/typed` 提供解析 MiraScript 类型定义的能力。
4
4
 
5
+ 注意,MiraScript 不支持编译/运行时类型检查,也不能直接在 MiraScript 中使用类型标注。类型定义仅用于文档、代码提示、JSON Schema 生成等场景。
6
+
5
7
  ## MiraScript 类型定义概览
6
8
 
7
9
  - 内置类型:`nil` `string` `number` `boolean` `record` `array`
8
- - 其中 `record` `array` 支持泛型:`record<fieldType>` `array<elementType>`
10
+ - `array` 支持泛型:`array<elementType>`
11
+ - `record` 支持 `record<valueType>` 与 `record<keyType, valueType>`
9
12
  - 联合类型:`typeA | typeB`
10
13
  - 可选前缀 `|`
11
14
  - 数组类型:`type[]`(同 `array<type>`)
@@ -16,6 +19,18 @@
16
19
  - 匿名字段:`(typeA, typeB)` (只包含一个匿名字段时尾随 `,` 不能省略 `(type,)`)
17
20
  - 可选属性:`(field?: type)`
18
21
  - 支持使用字符串做字段名以包含特殊字符:`("field-name": type)`
22
+ - 函数类型:`fn(arg: type, ..rest: type) -> returnType`
23
+ - 无返回值:`fn(arg: type)`
24
+ - 无参数:`fn() -> returnType`
25
+ - 参数类型可省略,默认为 `any`:`fn(a, b: number, ..rest)`
26
+ - rest 参数名可省略:`fn(..) -> string`
27
+ - rest 参数必须是最后一个参数
28
+ - 支持嵌套,例如函数作为参数:`fn(arg: number, callback: fn(result: string, error: any) -> any)`
29
+ - 支持泛型:`fn<T, U>(arg: T) -> U`,同名泛型参数在不同作用域中为不同 symbol
30
+ - 顶层函数可携带函数名:`fn fnName<T>(arg: T) -> any`
31
+ - 字符串插值类型:三种引号均支持 `$()` 插值
32
+ - 示例:`` `hello $(type)` ``、`"value: $(string | number)"`
33
+ - `$` 必须紧接 `(`,否则报错;`\$` 可表示字面量 `$`
19
34
 
20
35
  ## 安装
21
36
 
@@ -31,13 +46,17 @@ import { parse, toJSONSchema } from '@mirascript/typed';
31
46
  const type = parse('record<number>');
32
47
  console.log(toJSONSchema(type));
33
48
  // { type: 'object', additionalProperties: { type: 'number' } }
49
+ console.log(toJSONSchema(parse('(a: number)'), { loose: false }));
50
+ // { type: 'object', properties: { a: { type: 'number' } }, required: ['a'], additionalProperties: false }
51
+ console.log(toJSONSchema(parse('(a: number)'), { loose: true }));
52
+ // { type: 'object', properties: { a: { type: 'number' } }, additionalProperties: true }
34
53
  ```
35
54
 
36
55
  ## 常用导出
37
56
 
38
57
  - `parse()`:将类型字符串解析为 `Type` 对象
39
58
  - `toJSONSchema()`:将 `Type` 对象转换为 JSON Schema
40
- - `Type`、`KnownType`、`RecordType` 等类型定义
59
+ - `Type`、`KnownType`、`RecordType`、`FunctionType`、`TemplateType`、`GenericType` 等类型定义
41
60
 
42
61
  ## 开发
43
62
 
package/dist/json.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import type { JSONSchema7 } from 'json-schema';
2
2
  import type { Type } from './parser.js';
3
+ /** Options for toJSONSchema */
4
+ export interface ToJSONSchemaOptions {
5
+ /** When true, object schemas allow arbitrary additional properties */
6
+ loose?: boolean;
7
+ }
3
8
  /** Converts a Type object into JSON Schema */
4
- export declare function toJSONSchema(type: Type): JSONSchema7;
9
+ export declare function toJSONSchema(type: Type, options?: ToJSONSchemaOptions): JSONSchema7;
5
10
  //# sourceMappingURL=json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAqC,IAAI,EAAE,MAAM,aAAa,CAAC;AA8B3E,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAgDpD"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAmD,IAAI,EAAE,MAAM,aAAa,CAAC;AA+HzF,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IAChC,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,WAAW,CAuGnF"}
package/dist/json.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { REG_NUMBER } from '@mirascript/constants';
1
2
  /** Converts a KnownType or NamedType into JSON Schema */
2
3
  function string(type) {
3
4
  switch (type) {
@@ -25,55 +26,82 @@ function string(type) {
25
26
  return {};
26
27
  }
27
28
  }
28
- /** Converts a Type object into JSON Schema */
29
- export function toJSONSchema(type) {
30
- if (typeof type === 'string') {
31
- return string(type);
29
+ /** Escapes a literal string for use in a regular expression */
30
+ function escapeRegex(value) {
31
+ return value.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
32
+ }
33
+ const RE_ANY = '.*?';
34
+ const RE_NUMBER = REG_NUMBER.source;
35
+ const RE_BOOLEAN = 'true|false';
36
+ /** Converts a template interpolation part into a regex pattern fragment */
37
+ function templatePartPattern(part, grouping) {
38
+ let result;
39
+ if (typeof part === 'symbol') {
40
+ result = RE_ANY;
32
41
  }
33
- if (type.kind === 'array') {
34
- return {
35
- type: 'array',
36
- items: toJSONSchema(type.element),
37
- };
42
+ else if (typeof part === 'string') {
43
+ switch (part) {
44
+ case 'number':
45
+ result = RE_NUMBER;
46
+ break;
47
+ case 'boolean':
48
+ result = RE_BOOLEAN;
49
+ break;
50
+ case 'nil':
51
+ case 'never':
52
+ result = '';
53
+ break;
54
+ case 'array':
55
+ case 'record':
56
+ case 'extern':
57
+ case 'any':
58
+ case 'unknown':
59
+ case 'string':
60
+ default:
61
+ result = RE_ANY;
62
+ break;
63
+ }
38
64
  }
39
- if (type.kind === 'union') {
40
- const literals = type.types.filter(isLiteralType);
41
- if (literals.length === type.types.length) {
42
- return literalEnum(literals);
65
+ else if (part.kind === 'literal') {
66
+ if (typeof part.value === 'boolean') {
67
+ result = String(part.value);
68
+ }
69
+ else {
70
+ result = escapeRegex(part.value);
43
71
  }
44
- return {
45
- anyOf: type.types.map(toJSONSchema),
46
- };
47
72
  }
48
- if (type.kind === 'record') {
49
- if (type.value !== undefined) {
50
- return {
51
- type: 'object',
52
- additionalProperties: toJSONSchema(type.value),
53
- };
73
+ else if (part.kind === 'union') {
74
+ const patterns = new Set(part.types.map((p) => templatePartPattern(p, false)));
75
+ if (patterns.has(RE_ANY)) {
76
+ result = RE_ANY;
54
77
  }
55
- const properties = {};
56
- const required = [];
57
- for (const field of type.fields) {
58
- properties[field.name] = toJSONSchema(field.type);
59
- if (!field.optional) {
60
- required.push(field.name);
78
+ else {
79
+ const hasEmpty = patterns.delete('');
80
+ result = Array.from(patterns).join('|');
81
+ if (hasEmpty) {
82
+ result = `(${result})?`;
61
83
  }
62
84
  }
63
- const schema = {
64
- type: 'object',
65
- properties,
66
- };
67
- if (required.length > 0) {
68
- schema.required = required;
69
- }
70
- return schema;
71
85
  }
72
- if (type.kind === 'literal') {
73
- return literal(type);
86
+ else {
87
+ result = RE_ANY;
74
88
  }
75
- (type);
76
- return {};
89
+ if (!grouping)
90
+ return result;
91
+ if (result.startsWith('('))
92
+ return result;
93
+ return `(${result})`;
94
+ }
95
+ /** Converts a TemplateType into a JSON Schema pattern */
96
+ function templatePattern(type) {
97
+ return `^${type.parts
98
+ .map((p) => {
99
+ if (typeof p == 'object' && p.kind === 'literal' && typeof p.value === 'string') {
100
+ return templatePartPattern(p, false);
101
+ }
102
+ return templatePartPattern(p, true);
103
+ })
104
+ .join('')}$`;
77
105
  }
78
106
  /** Converts a LiteralType into JSON Schema */
79
107
  function literal(type) {
@@ -96,4 +124,110 @@ function literalEnum(types) {
96
124
  function isLiteralType(type) {
97
125
  return typeof type === 'object' && type.kind === 'literal';
98
126
  }
127
+ /** Converts a Type object into JSON Schema */
128
+ export function toJSONSchema(type, options) {
129
+ const loose = options?.loose ?? false;
130
+ if (typeof type === 'symbol') {
131
+ return {};
132
+ }
133
+ if (typeof type === 'string') {
134
+ return string(type);
135
+ }
136
+ if (type.kind === 'array') {
137
+ return {
138
+ type: 'array',
139
+ items: toJSONSchema(type.element, options),
140
+ };
141
+ }
142
+ if (type.kind === 'union') {
143
+ const anyOf = [];
144
+ const literals = [];
145
+ for (const t of type.types) {
146
+ if (isLiteralType(t)) {
147
+ literals.push(t);
148
+ }
149
+ else {
150
+ anyOf.push(toJSONSchema(t, options));
151
+ }
152
+ }
153
+ if (literals.length > 0) {
154
+ anyOf.push(literalEnum(literals));
155
+ }
156
+ if (anyOf.length === 1) {
157
+ return anyOf[0];
158
+ }
159
+ return { anyOf };
160
+ }
161
+ if (type.kind === 'record') {
162
+ if ('fields' in type) {
163
+ const properties = {};
164
+ const required = [];
165
+ for (const field of type.fields) {
166
+ properties[field.name] = toJSONSchema(field.type, options);
167
+ if (!field.optional && !loose) {
168
+ required.push(field.name);
169
+ }
170
+ }
171
+ const schema = {
172
+ type: 'object',
173
+ properties,
174
+ additionalProperties: loose,
175
+ };
176
+ if (required.length > 0) {
177
+ schema.required = required;
178
+ }
179
+ return schema;
180
+ }
181
+ const valueSchema = toJSONSchema(type.value, options);
182
+ if (type.key == null) {
183
+ return {
184
+ type: 'object',
185
+ additionalProperties: valueSchema,
186
+ };
187
+ }
188
+ if (typeof type.key == 'object') {
189
+ if (isLiteralType(type.key)) {
190
+ const schema = {
191
+ type: 'object',
192
+ properties: { [String(type.key.value)]: valueSchema },
193
+ additionalProperties: loose,
194
+ };
195
+ return schema;
196
+ }
197
+ else if (type.key.kind === 'union' && type.key.types.every(isLiteralType)) {
198
+ const schema = {
199
+ type: 'object',
200
+ properties: Object.fromEntries(type.key.types.map((t) => [String(t.value), valueSchema])),
201
+ additionalProperties: loose,
202
+ };
203
+ return schema;
204
+ }
205
+ }
206
+ const pattern = templatePartPattern(type.key, false);
207
+ if (pattern === RE_ANY) {
208
+ return {
209
+ type: 'object',
210
+ additionalProperties: valueSchema,
211
+ };
212
+ }
213
+ const schema = {
214
+ type: 'object',
215
+ patternProperties: { [`^${pattern}$`]: valueSchema },
216
+ additionalProperties: loose,
217
+ };
218
+ return schema;
219
+ }
220
+ if (type.kind === 'literal') {
221
+ return literal(type);
222
+ }
223
+ if (type.kind === 'function') {
224
+ return {};
225
+ }
226
+ if (type.kind === 'template') {
227
+ return { type: 'string', pattern: templatePattern(type) };
228
+ }
229
+ /* c8 ignore next 3 */
230
+ (type);
231
+ return {};
232
+ }
99
233
  //# sourceMappingURL=json.js.map
package/dist/json.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAGA,yDAAyD;AACzD,SAAS,MAAM,CAAC,IAA2B;IACvC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,SAAS;YACV,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/B,KAAK,KAAK;YACN,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5B,KAAK,OAAO;YACR,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACT,OAAO,EAAE,CAAC;QACd,KAAK,KAAK;YACN,OAAO,EAAE,CAAC;QACd,KAAK,SAAS;YACV,OAAO,EAAE,CAAC;QACd,KAAK,OAAO;YACR,OAAO,EAAE,CAAC;QACd;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,IAAU;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO;YACH,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;SACpC,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;SACtC,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACH,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;aACjD,CAAC;QACN,CAAC;QACD,MAAM,UAAU,GAAgC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,MAAM,MAAM,GAAgB;YACxB,IAAI,EAAE,QAAQ;YACd,UAAU;SACb,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,CAAC,IAAI,CAAiB,CAAC;IACvB,OAAO,EAAE,CAAC;AACd,CAAC;AAED,8CAA8C;AAC9C,SAAS,OAAO,CAAC,IAAiB;IAC9B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,SAAS,WAAW,CAAC,KAAoB;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC7C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,iCAAiC;AACjC,SAAS,aAAa,CAAC,IAAU;IAC7B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,yDAAyD;AACzD,SAAS,MAAM,CAAC,IAA2B;IACvC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,SAAS;YACV,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/B,KAAK,KAAK;YACN,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC5B,KAAK,OAAO;YACR,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACT,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACT,OAAO,EAAE,CAAC;QACd,KAAK,KAAK;YACN,OAAO,EAAE,CAAC;QACd,KAAK,SAAS;YACV,OAAO,EAAE,CAAC;QACd,KAAK,OAAO;YACR,OAAO,EAAE,CAAC;QACd;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC;AAED,+DAA+D;AAC/D,SAAS,WAAW,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAA,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,MAAM,GAAG,KAAK,CAAC;AACrB,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;AACpC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,2EAA2E;AAC3E,SAAS,mBAAmB,CAAC,IAAU,EAAE,QAAiB;IACtD,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,MAAM,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,QAAQ;gBACT,MAAM,GAAG,SAAS,CAAC;gBACnB,MAAM;YACV,KAAK,SAAS;gBACV,MAAM,GAAG,UAAU,CAAC;gBACpB,MAAM;YACV,KAAK,KAAK,CAAC;YACX,KAAK,OAAO;gBACR,MAAM,GAAG,EAAE,CAAC;gBACZ,MAAM;YACV,KAAK,OAAO,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ,CAAC;YACd;gBACI,MAAM,GAAG,MAAM,CAAC;gBAChB,MAAM;QACd,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC;aAAM,CAAC;YACJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,GAAG,IAAI,MAAM,IAAI,CAAC;YAC5B,CAAC;QACL,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,MAAM,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,OAAO,IAAI,MAAM,GAAG,CAAC;AACzB,CAAC;AAED,yDAAyD;AACzD,SAAS,eAAe,CAAC,IAAkB;IACvC,OAAO,IAAI,IAAI,CAAC,KAAK;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACP,IAAI,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9E,OAAO,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;AACrB,CAAC;AAED,8CAA8C;AAC9C,SAAS,OAAO,CAAC,IAAiB;IAC9B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,SAAS,WAAW,CAAC,KAAoB;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC7C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,iCAAiC;AACjC,SAAS,aAAa,CAAC,IAAU;IAC7B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;AAC/D,CAAC;AAQD,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,OAA6B;IAClE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO;YACH,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;SAC7C,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC;QACrB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,UAAU,GAAgC,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAgB;gBACxB,IAAI,EAAE,QAAQ;gBACd,UAAU;gBACV,oBAAoB,EAAE,KAAK;aAC9B,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,CAAC;YACD,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO;gBACH,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,WAAW;aACpC,CAAC;QACN,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAgB;oBACxB,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE;oBACrD,oBAAoB,EAAE,KAAK;iBAC9B,CAAC;gBACF,OAAO,MAAM,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1E,MAAM,MAAM,GAAgB;oBACxB,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;oBACzF,oBAAoB,EAAE,KAAK;iBAC9B,CAAC;gBACF,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACrB,OAAO;gBACH,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,WAAW;aACpC,CAAC;QACN,CAAC;QACD,MAAM,MAAM,GAAgB;YACxB,IAAI,EAAE,QAAQ;YACd,iBAAiB,EAAE,EAAE,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,WAAW,EAAE;YACpD,oBAAoB,EAAE,KAAK;SAC9B,CAAC;QACF,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,sBAAsB;IACtB,CAAC,IAAI,CAAiB,CAAC;IACvB,OAAO,EAAE,CAAC;AACd,CAAC"}
package/dist/parser.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  /** MiraScript type */
2
- export type Type = KnownType | NamedType | LiteralType | ArrayType | UnionType | RecordType;
2
+ export type Type = KnownType | NamedType | GenericType | LiteralType | TemplateType | ArrayType | UnionType | RecordType | FunctionType;
3
+ /** Generic type parameter reference in MiraScript */
4
+ export type GenericType = symbol;
3
5
  /** Literal type in MiraScript */
4
6
  export interface LiteralType {
5
7
  /** Tag */
@@ -7,6 +9,13 @@ export interface LiteralType {
7
9
  /** Literal value */
8
10
  value: string | boolean;
9
11
  }
12
+ /** Template literal type in MiraScript */
13
+ export interface TemplateType {
14
+ /** Tag */
15
+ kind: 'template';
16
+ /** Interpolated parts, strings are represented as {@link LiteralType} objects, other parts are nested {@link Type} objects. */
17
+ parts: Type[];
18
+ }
10
19
  /** Known type names in MiraScript */
11
20
  export type KnownType = 'string' | 'number' | 'boolean' | 'nil' | 'array' | 'record' | 'extern' | 'any' | 'unknown' | 'never';
12
21
  /** Named type in MiraScript */
@@ -26,14 +35,19 @@ export interface ArrayType {
26
35
  element: Type;
27
36
  }
28
37
  /** Record type in MiraScript */
29
- export interface RecordType {
38
+ export type RecordType = {
30
39
  /** Tag */
31
40
  kind: 'record';
32
41
  /** Fields in the record */
33
42
  fields: RecordField[];
34
- /** Value type for record<T> */
35
- value?: Type;
36
- }
43
+ } | {
44
+ /** Tag */
45
+ kind: 'record';
46
+ /** Key type for record<K, V> */
47
+ key?: Type;
48
+ /** Value type for record<T> or record<K, V> */
49
+ value: Type;
50
+ };
37
51
  /** Record field in MiraScript */
38
52
  export interface RecordField {
39
53
  /** Field name */
@@ -43,6 +57,28 @@ export interface RecordField {
43
57
  /** Field type */
44
58
  type: Type;
45
59
  }
60
+ /** Function type in MiraScript */
61
+ export interface FunctionType {
62
+ /** Tag */
63
+ kind: 'function';
64
+ /** Function name (only allowed at the top level) */
65
+ name?: string;
66
+ /** Generic type parameters */
67
+ typeParams?: GenericType[];
68
+ /** Function parameters */
69
+ params: FunctionParameter[];
70
+ /** Return type */
71
+ returns?: Type;
72
+ }
73
+ /** Function parameter in MiraScript */
74
+ export interface FunctionParameter {
75
+ /** Parameter name */
76
+ name: string;
77
+ /** Parameter type */
78
+ type: Type;
79
+ /** Whether the parameter is a rest parameter */
80
+ spread?: boolean;
81
+ }
46
82
  /**
47
83
  * Parses a type string into a Type object.
48
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,sBAAsB;AACtB,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5F,iCAAiC;AACjC,MAAM,WAAW,WAAW;IACxB,UAAU;IACV,IAAI,EAAE,SAAS,CAAC;IAChB,oBAAoB;IACpB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,qCAAqC;AACrC,MAAM,MAAM,SAAS,GACf,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,KAAK,GACL,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,SAAS,GACT,OAAO,CAAC;AAEd,+BAA+B;AAC/B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEtD,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACtB,UAAU;IACV,IAAI,EAAE,OAAO,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACtB,UAAU;IACV,IAAI,EAAE,OAAO,CAAC;IACd,mBAAmB;IACnB,OAAO,EAAE,IAAI,CAAC;CACjB;AAED,gCAAgC;AAChC,MAAM,WAAW,UAAU;IACvB,UAAU;IACV,IAAI,EAAE,QAAQ,CAAC;IACf,2BAA2B;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,sBAAsB;AACtB,MAAM,MAAM,IAAI,GACV,SAAS,GACT,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,SAAS,GACT,SAAS,GACT,UAAU,GACV,YAAY,CAAC;AAEnB,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC,iCAAiC;AACjC,MAAM,WAAW,WAAW;IACxB,UAAU;IACV,IAAI,EAAE,SAAS,CAAC;IAChB,oBAAoB;IACpB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAED,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IACzB,UAAU;IACV,IAAI,EAAE,UAAU,CAAC;IACjB,+HAA+H;IAC/H,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,MAAM,SAAS,GACjB,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1G,+BAA+B;AAC/B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEtD,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACtB,UAAU;IACV,IAAI,EAAE,OAAO,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACtB,UAAU;IACV,IAAI,EAAE,OAAO,CAAC;IACd,mBAAmB;IACnB,OAAO,EAAE,IAAI,CAAC;CACjB;AAED,gCAAgC;AAChC,MAAM,MAAM,UAAU,GAChB;IACI,UAAU;IACV,IAAI,EAAE,QAAQ,CAAC;IACf,2BAA2B;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB,GACD;IACI,UAAU;IACV,IAAI,EAAE,QAAQ,CAAC;IACf,gCAAgC;IAChC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,+CAA+C;IAC/C,KAAK,EAAE,IAAI,CAAC;CACf,CAAC;AAER,iCAAiC;AACjC,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAC;CACd;AAED,kCAAkC;AAClC,MAAM,WAAW,YAAY;IACzB,UAAU;IACV,IAAI,EAAE,UAAU,CAAC;IACjB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,0BAA0B;IAC1B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,kBAAkB;IAClB,OAAO,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAC9B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAwDD;;GAEG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC"}
package/dist/parser.js CHANGED
@@ -1,8 +1,65 @@
1
1
  import { parse as _parse } from '../dist/type.js';
2
+ /**
3
+ * Replaces generic type parameter names in the AST with unique symbols,
4
+ * scoped per function declaration.
5
+ */
6
+ function resolveGenerics(type, scope = new Map()) {
7
+ /* c8 ignore next 3 */
8
+ if (typeof type == 'symbol') {
9
+ return type;
10
+ }
11
+ if (typeof type == 'string') {
12
+ return scope.get(type) ?? type;
13
+ }
14
+ if (type.kind === 'function') {
15
+ const newScope = new Map(scope);
16
+ for (const sym of type.typeParams ?? []) {
17
+ newScope.set(sym.description, sym);
18
+ }
19
+ for (const param of type.params) {
20
+ param.type = resolveGenerics(param.type, newScope);
21
+ }
22
+ if (type.returns != null)
23
+ type.returns = resolveGenerics(type.returns, newScope);
24
+ return type;
25
+ }
26
+ if (type.kind === 'array') {
27
+ type.element = resolveGenerics(type.element, scope);
28
+ return type;
29
+ }
30
+ if (type.kind === 'union') {
31
+ type.types = type.types.map((t) => resolveGenerics(t, scope));
32
+ return type;
33
+ }
34
+ if (type.kind === 'record') {
35
+ if ('fields' in type) {
36
+ for (const field of type.fields) {
37
+ field.type = resolveGenerics(field.type, scope);
38
+ }
39
+ }
40
+ else {
41
+ if (type.key != null)
42
+ type.key = resolveGenerics(type.key, scope);
43
+ if (type.value != null)
44
+ type.value = resolveGenerics(type.value, scope);
45
+ }
46
+ return type;
47
+ }
48
+ if (type.kind === 'literal') {
49
+ return type;
50
+ }
51
+ if (type.kind === 'template') {
52
+ type.parts = type.parts.map((part) => resolveGenerics(part, scope));
53
+ return type;
54
+ }
55
+ /* c8 ignore next 3 */
56
+ (type);
57
+ return type;
58
+ }
2
59
  /**
3
60
  * Parses a type string into a Type object.
4
61
  */
5
62
  export function parse(type) {
6
- return _parse(type);
63
+ return resolveGenerics(_parse(type));
7
64
  }
8
65
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiElD;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAS,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}