ormbridge 0.7.0 → 0.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.
Files changed (93) hide show
  1. package/README.md +2 -0
  2. package/dist/cliRunner.js +9 -7
  3. package/dist/cliRunner.js.map +1 -1
  4. package/dist/config.d.ts +8 -4
  5. package/dist/config.js +3 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/emitters/efcore.d.ts +40 -0
  8. package/dist/emitters/efcore.js +686 -0
  9. package/dist/emitters/efcore.js.map +1 -0
  10. package/dist/emitters/efcoreColumns.d.ts +75 -0
  11. package/dist/emitters/efcoreColumns.js +492 -0
  12. package/dist/emitters/efcoreColumns.js.map +1 -0
  13. package/dist/emitters/efcoreNames.d.ts +30 -0
  14. package/dist/emitters/efcoreNames.js +268 -0
  15. package/dist/emitters/efcoreNames.js.map +1 -0
  16. package/dist/emitters/efcoreRender.d.ts +2 -0
  17. package/dist/emitters/efcoreRender.js +570 -0
  18. package/dist/emitters/efcoreRender.js.map +1 -0
  19. package/dist/emitters/efcoreTypes.d.ts +114 -0
  20. package/dist/emitters/efcoreTypes.js +2 -0
  21. package/dist/emitters/efcoreTypes.js.map +1 -0
  22. package/dist/emitters/sequelize.d.ts +35 -0
  23. package/dist/emitters/sequelize.js +1276 -0
  24. package/dist/emitters/sequelize.js.map +1 -0
  25. package/dist/formats.d.ts +12 -8
  26. package/dist/formats.js +72 -4
  27. package/dist/formats.js.map +1 -1
  28. package/dist/index.d.ts +10 -0
  29. package/dist/index.js +5 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/io.js +53 -1
  32. package/dist/io.js.map +1 -1
  33. package/dist/parsers/csharpChains.d.ts +36 -0
  34. package/dist/parsers/csharpChains.js +157 -0
  35. package/dist/parsers/csharpChains.js.map +1 -0
  36. package/dist/parsers/csharpDeclarations.d.ts +3 -0
  37. package/dist/parsers/csharpDeclarations.js +293 -0
  38. package/dist/parsers/csharpDeclarations.js.map +1 -0
  39. package/dist/parsers/csharpSyntax.d.ts +130 -0
  40. package/dist/parsers/csharpSyntax.js +339 -0
  41. package/dist/parsers/csharpSyntax.js.map +1 -0
  42. package/dist/parsers/efcore.d.ts +17 -0
  43. package/dist/parsers/efcore.js +265 -0
  44. package/dist/parsers/efcore.js.map +1 -0
  45. package/dist/parsers/efcoreAnnotations.d.ts +19 -0
  46. package/dist/parsers/efcoreAnnotations.js +293 -0
  47. package/dist/parsers/efcoreAnnotations.js.map +1 -0
  48. package/dist/parsers/efcoreBuild.d.ts +13 -0
  49. package/dist/parsers/efcoreBuild.js +523 -0
  50. package/dist/parsers/efcoreBuild.js.map +1 -0
  51. package/dist/parsers/efcoreEntities.d.ts +13 -0
  52. package/dist/parsers/efcoreEntities.js +468 -0
  53. package/dist/parsers/efcoreEntities.js.map +1 -0
  54. package/dist/parsers/efcoreFields.d.ts +22 -0
  55. package/dist/parsers/efcoreFields.js +285 -0
  56. package/dist/parsers/efcoreFields.js.map +1 -0
  57. package/dist/parsers/efcoreFluent.d.ts +47 -0
  58. package/dist/parsers/efcoreFluent.js +375 -0
  59. package/dist/parsers/efcoreFluent.js.map +1 -0
  60. package/dist/parsers/efcoreModel.d.ts +209 -0
  61. package/dist/parsers/efcoreModel.js +2 -0
  62. package/dist/parsers/efcoreModel.js.map +1 -0
  63. package/dist/parsers/efcoreRelations.d.ts +46 -0
  64. package/dist/parsers/efcoreRelations.js +317 -0
  65. package/dist/parsers/efcoreRelations.js.map +1 -0
  66. package/dist/parsers/efcoreSteps.d.ts +89 -0
  67. package/dist/parsers/efcoreSteps.js +793 -0
  68. package/dist/parsers/efcoreSteps.js.map +1 -0
  69. package/dist/parsers/efcoreTypes.d.ts +35 -0
  70. package/dist/parsers/efcoreTypes.js +404 -0
  71. package/dist/parsers/efcoreTypes.js.map +1 -0
  72. package/dist/parsers/sequelize.d.ts +15 -0
  73. package/dist/parsers/sequelize.js +906 -0
  74. package/dist/parsers/sequelize.js.map +1 -0
  75. package/dist/parsers/sequelizeAssociations.d.ts +45 -0
  76. package/dist/parsers/sequelizeAssociations.js +449 -0
  77. package/dist/parsers/sequelizeAssociations.js.map +1 -0
  78. package/dist/parsers/sequelizeCollect.d.ts +33 -0
  79. package/dist/parsers/sequelizeCollect.js +1298 -0
  80. package/dist/parsers/sequelizeCollect.js.map +1 -0
  81. package/dist/parsers/sequelizeInflection.d.ts +14 -0
  82. package/dist/parsers/sequelizeInflection.js +451 -0
  83. package/dist/parsers/sequelizeInflection.js.map +1 -0
  84. package/dist/parsers/sequelizeModel.d.ts +185 -0
  85. package/dist/parsers/sequelizeModel.js +2 -0
  86. package/dist/parsers/sequelizeModel.js.map +1 -0
  87. package/dist/parsers/sequelizeTypes.d.ts +24 -0
  88. package/dist/parsers/sequelizeTypes.js +248 -0
  89. package/dist/parsers/sequelizeTypes.js.map +1 -0
  90. package/dist/styles.d.ts +18 -0
  91. package/dist/styles.js +43 -0
  92. package/dist/styles.js.map +1 -0
  93. package/package.json +4 -1
@@ -0,0 +1,157 @@
1
+ import { evaluate, memberPath, parseTypeText, } from './csharpSyntax.js';
2
+ /** Splits a lambda (`x => ...`, `(x) => ...`, `delegate (x) { }`) into its first parameter and body. */
3
+ export function readLambda(node) {
4
+ if (node.type === 'parenthesized_expression') {
5
+ const inner = node.namedChild(0);
6
+ return inner === null ? undefined : readLambda(inner);
7
+ }
8
+ if (node.type !== 'lambda_expression' &&
9
+ node.type !== 'anonymous_method_expression') {
10
+ return undefined;
11
+ }
12
+ const body = node.childForFieldName('body');
13
+ if (body === null) {
14
+ return undefined;
15
+ }
16
+ const list = node.namedChildren.find((child) => child.type === 'parameter_list' ||
17
+ child.type === 'implicit_parameter_list');
18
+ if (list !== undefined) {
19
+ const first = list.namedChildren[0];
20
+ const nameNode = first?.childForFieldName('name');
21
+ return { parameter: nameNode?.text ?? first?.text, body };
22
+ }
23
+ const identifier = node.namedChildren.find((child) => child.type === 'identifier');
24
+ return { parameter: identifier?.text, body };
25
+ }
26
+ /** The statements of a lambda body or method body; an expression body counts as one statement. */
27
+ export function bodyStatements(body) {
28
+ if (body.type === 'block') {
29
+ return body.namedChildren.filter((child) => child.type !== 'comment');
30
+ }
31
+ if (body.type === 'arrow_expression_clause') {
32
+ const inner = body.namedChild(0);
33
+ return inner === null ? [] : [inner];
34
+ }
35
+ return [body];
36
+ }
37
+ /** The expressions of an `argument_list`. */
38
+ export function argumentExpressions(list) {
39
+ if (list === null) {
40
+ return [];
41
+ }
42
+ const expressions = [];
43
+ for (const argument of list.namedChildren) {
44
+ if (argument.type !== 'argument') {
45
+ continue;
46
+ }
47
+ const inner = [...argument.namedChildren]
48
+ .reverse()
49
+ .find((child) => child.type !== 'name_colon');
50
+ if (inner !== undefined) {
51
+ expressions.push(inner);
52
+ }
53
+ }
54
+ return expressions;
55
+ }
56
+ /**
57
+ * Flattens `a.B(x).C<T>(y)` into the root `a` and the calls [B(x), C<T>(y)]. Returns undefined
58
+ * for an expression that is not a call.
59
+ */
60
+ export function flattenChain(expression) {
61
+ const calls = [];
62
+ let current = expression;
63
+ let finished = false;
64
+ for (let guard = 0; guard < 4096; guard += 1) {
65
+ if (current.type === 'parenthesized_expression') {
66
+ const inner = current.namedChild(0);
67
+ if (inner === null) {
68
+ return undefined;
69
+ }
70
+ current = inner;
71
+ continue;
72
+ }
73
+ if (current.type !== 'invocation_expression') {
74
+ finished = true;
75
+ break;
76
+ }
77
+ const fn = current.childForFieldName('function');
78
+ if (fn === null) {
79
+ return undefined;
80
+ }
81
+ const args = argumentExpressions(current.childForFieldName('arguments'));
82
+ let nameNode = fn;
83
+ let receiver = null;
84
+ if (fn.type === 'member_access_expression') {
85
+ nameNode = fn.childForFieldName('name');
86
+ receiver = fn.childForFieldName('expression');
87
+ }
88
+ if (nameNode === null) {
89
+ return undefined;
90
+ }
91
+ const typeArgs = nameNode.type === 'generic_name'
92
+ ? (nameNode.namedChildren
93
+ .find((child) => child.type === 'type_argument_list')
94
+ ?.namedChildren.map((child) => parseTypeText(child.text)) ?? [])
95
+ : [];
96
+ const name = nameNode.type === 'generic_name'
97
+ ? (nameNode.namedChild(0)?.text ?? nameNode.text)
98
+ : nameNode.text;
99
+ calls.unshift({ name, typeArgs, args, node: current });
100
+ if (receiver === null) {
101
+ return calls.length === 0 ? undefined : { root: fn, calls };
102
+ }
103
+ current = receiver;
104
+ }
105
+ // A chain longer than any real configuration is not read.
106
+ return finished && calls.length > 0 ? { root: current, calls } : undefined;
107
+ }
108
+ /**
109
+ * The property names a lambda or string selects, relative to the lambda parameter: `e => e.A` is ['A'],
110
+ * `e => new { e.A, e.B }` is ['A', 'B'], `"A"` is ['A'], `nameof(Post.Title)` is ['Title']. Nested access
111
+ * (`e => e.Address.Street`) gives the dotted path 'Address.Street'.
112
+ */
113
+ export function selectedMembers(node, consts) {
114
+ const lambda = readLambda(node);
115
+ if (lambda !== undefined) {
116
+ const body = lambda.body;
117
+ const parts = body.type === 'anonymous_object_creation_expression' ||
118
+ body.type === 'tuple_expression'
119
+ ? body.namedChildren.map((child) => child.type === 'argument' ? (child.namedChild(0) ?? child) : child)
120
+ : [body];
121
+ const names = [];
122
+ for (const part of parts) {
123
+ const inner = part.type === 'name_equals' || part.type === 'assignment_expression'
124
+ ? (part.namedChildren[part.namedChildren.length - 1] ?? part)
125
+ : part;
126
+ const path = memberPath(inner);
127
+ if (path === undefined || path.length < 2) {
128
+ return undefined;
129
+ }
130
+ names.push(path.slice(1).join('.'));
131
+ }
132
+ return names;
133
+ }
134
+ const value = evaluate(node, consts);
135
+ const flatten = (item) => {
136
+ if (item.kind === 'string') {
137
+ return [item.value];
138
+ }
139
+ if (item.kind === 'nameof') {
140
+ return [item.name];
141
+ }
142
+ if (item.kind === 'array') {
143
+ const all = [];
144
+ for (const inner of item.items) {
145
+ const names = flatten(inner);
146
+ if (names === undefined) {
147
+ return undefined;
148
+ }
149
+ all.push(...names);
150
+ }
151
+ return all;
152
+ }
153
+ return undefined;
154
+ };
155
+ return flatten(value);
156
+ }
157
+ //# sourceMappingURL=csharpChains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharpChains.js","sourceRoot":"","sources":["../../src/parsers/csharpChains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ConstLookup, type CsFile, type SyntaxNode } from './csharpSyntax.js';
2
+ /** Reads the types of one parsed file. Constants are looked up through `consts` (from other files). */
3
+ export declare function readCSharpFile(root: SyntaxNode, path: string, consts: ConstLookup): CsFile;
@@ -0,0 +1,293 @@
1
+ import { evaluate, parseTypeText, readAttributes, splitTopLevel, } from './csharpSyntax.js';
2
+ // ---------------------------------------------------------------------------
3
+ // Declarations
4
+ // ---------------------------------------------------------------------------
5
+ const CLASS_LIKE = new Map([
6
+ ['class_declaration', 'class'],
7
+ ['record_declaration', 'record'],
8
+ ['record_struct_declaration', 'record'],
9
+ ['struct_declaration', 'struct'],
10
+ ['interface_declaration', 'interface'],
11
+ ]);
12
+ function modifiersOf(node) {
13
+ return node.namedChildren
14
+ .filter((child) => child.type === 'modifier')
15
+ .map((child) => child.text);
16
+ }
17
+ function readBases(node) {
18
+ const list = node.namedChildren.find((child) => child.type === 'base_list');
19
+ if (list === undefined) {
20
+ return [];
21
+ }
22
+ // The text is split instead of walking the children: a record with primary constructor and generic base
23
+ // produces error nodes in the grammar.
24
+ const text = list.text.replace(/^\s*:/, '');
25
+ return splitTopLevel(text)
26
+ .filter((part) => part !== '')
27
+ .map((part) => parseTypeText(part.replace(/\(.*$/s, '')));
28
+ }
29
+ function readTypeParameters(node) {
30
+ const list = node.namedChildren.find((child) => child.type === 'type_parameter_list');
31
+ return (list?.namedChildren.map((child) => child.namedChild(0)?.text ?? child.text) ?? []);
32
+ }
33
+ function readAccessors(node) {
34
+ const list = node.childForFieldName('accessors');
35
+ let hasGetter = false;
36
+ let hasSetter = false;
37
+ let isAuto = true;
38
+ for (const accessor of list?.namedChildren ?? []) {
39
+ if (accessor.type !== 'accessor_declaration') {
40
+ continue;
41
+ }
42
+ const keyword = accessor.children.find((child) => ['get', 'set', 'init'].includes(child.type))?.type ?? '';
43
+ if (keyword === 'get') {
44
+ hasGetter = true;
45
+ }
46
+ else if (keyword === 'set' || keyword === 'init') {
47
+ hasSetter = true;
48
+ }
49
+ if (accessor.childForFieldName('body') !== null) {
50
+ isAuto = false;
51
+ }
52
+ }
53
+ return { hasGetter, hasSetter, isAuto };
54
+ }
55
+ function readProperty(node) {
56
+ const nameNode = node.childForFieldName('name');
57
+ const typeNode = node.childForFieldName('type');
58
+ if (nameNode === null || typeNode === null) {
59
+ return undefined;
60
+ }
61
+ const value = node.childForFieldName('value');
62
+ const isArrow = value?.type === 'arrow_expression_clause';
63
+ const accessors = readAccessors(node);
64
+ const initializer = value === null || isArrow
65
+ ? null
66
+ : value.type === 'equals_value_clause'
67
+ ? value.namedChild(0)
68
+ : value;
69
+ return {
70
+ name: nameNode.text,
71
+ type: parseTypeText(typeNode.text),
72
+ modifiers: modifiersOf(node),
73
+ attributes: readAttributes(node),
74
+ hasGetter: accessors.hasGetter || isArrow,
75
+ hasSetter: accessors.hasSetter,
76
+ isComputed: isArrow || (accessors.hasGetter && !accessors.hasSetter),
77
+ isField: false,
78
+ ...(initializer === null ? {} : { initializer }),
79
+ node,
80
+ };
81
+ }
82
+ function readFieldProperties(node, cls, consts) {
83
+ const declaration = node.namedChildren.find((child) => child.type === 'variable_declaration');
84
+ const typeNode = declaration?.childForFieldName('type') ?? null;
85
+ if (declaration === undefined || typeNode === null) {
86
+ return;
87
+ }
88
+ const modifiers = modifiersOf(node);
89
+ for (const declarator of declaration.namedChildren) {
90
+ if (declarator.type !== 'variable_declarator') {
91
+ continue;
92
+ }
93
+ const nameNode = declarator.childForFieldName('name') ?? declarator.namedChild(0);
94
+ const clause = declarator.namedChildren.find((child) => child.type === 'equals_value_clause');
95
+ const initializer = clause?.namedChild(0) ?? null;
96
+ if (nameNode === null) {
97
+ continue;
98
+ }
99
+ if (modifiers.includes('const') && initializer !== null) {
100
+ cls.consts.set(nameNode.text, evaluate(initializer, consts));
101
+ continue;
102
+ }
103
+ if (modifiers.includes('static') &&
104
+ modifiers.includes('readonly') &&
105
+ initializer !== null) {
106
+ const value = evaluate(initializer, consts);
107
+ if (value.kind === 'string' || value.kind === 'number') {
108
+ cls.consts.set(nameNode.text, value);
109
+ }
110
+ }
111
+ cls.properties.push({
112
+ name: nameNode.text,
113
+ type: parseTypeText(typeNode.text),
114
+ modifiers,
115
+ attributes: readAttributes(node),
116
+ hasGetter: true,
117
+ hasSetter: !modifiers.includes('readonly'),
118
+ isComputed: false,
119
+ isField: true,
120
+ ...(initializer === null ? {} : { initializer }),
121
+ node,
122
+ });
123
+ }
124
+ }
125
+ function readMethod(node) {
126
+ const nameNode = node.childForFieldName('name');
127
+ if (nameNode === null) {
128
+ return undefined;
129
+ }
130
+ const parameters = [];
131
+ const list = node.childForFieldName('parameters');
132
+ for (const parameter of list?.namedChildren ?? []) {
133
+ const parameterName = parameter.childForFieldName('name');
134
+ const parameterType = parameter.childForFieldName('type');
135
+ if (parameterName !== null && parameterType !== null) {
136
+ parameters.push({
137
+ name: parameterName.text,
138
+ type: parseTypeText(parameterType.text),
139
+ });
140
+ }
141
+ }
142
+ const body = node.childForFieldName('body');
143
+ return {
144
+ name: nameNode.text,
145
+ parameters,
146
+ ...(body === null ? {} : { body }),
147
+ node,
148
+ };
149
+ }
150
+ function readClassLike(node, kind, path, outer, file, consts, depth) {
151
+ const nameNode = node.childForFieldName('name');
152
+ if (nameNode === null) {
153
+ return;
154
+ }
155
+ const cls = {
156
+ name: nameNode.text,
157
+ kind,
158
+ modifiers: modifiersOf(node),
159
+ typeParameters: readTypeParameters(node),
160
+ bases: readBases(node),
161
+ attributes: readAttributes(node),
162
+ properties: [],
163
+ methods: [],
164
+ consts: new Map(),
165
+ ...(outer === undefined ? {} : { outer }),
166
+ path,
167
+ };
168
+ file.classes.push(cls);
169
+ // Positional records: `record Person(int Id, string Name)` declares the properties Id and Name.
170
+ const parameters = node.childForFieldName('parameters');
171
+ if (kind === 'record') {
172
+ for (const parameter of parameters?.namedChildren ?? []) {
173
+ const parameterName = parameter.childForFieldName('name');
174
+ const parameterType = parameter.childForFieldName('type');
175
+ if (parameterName !== null && parameterType !== null) {
176
+ cls.properties.push({
177
+ name: parameterName.text,
178
+ type: parseTypeText(parameterType.text),
179
+ modifiers: ['public'],
180
+ attributes: readAttributes(parameter),
181
+ hasGetter: true,
182
+ hasSetter: true,
183
+ isComputed: false,
184
+ isField: false,
185
+ node: parameter,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ const body = node.childForFieldName('body');
191
+ for (const member of body?.namedChildren ?? []) {
192
+ if (member.type === 'property_declaration') {
193
+ const property = readProperty(member);
194
+ if (property !== undefined) {
195
+ cls.properties.push(property);
196
+ }
197
+ }
198
+ else if (member.type === 'field_declaration') {
199
+ readFieldProperties(member, cls, (names) => cls.consts.get(names.join('.')) ?? consts(names));
200
+ }
201
+ else if (member.type === 'method_declaration') {
202
+ const method = readMethod(member);
203
+ if (method !== undefined) {
204
+ cls.methods.push(method);
205
+ }
206
+ }
207
+ else if (depth < 8) {
208
+ readDeclaration(member, path, cls.name, file, consts, depth + 1);
209
+ }
210
+ }
211
+ }
212
+ function readEnum(node, path) {
213
+ const nameNode = node.childForFieldName('name');
214
+ if (nameNode === null) {
215
+ return undefined;
216
+ }
217
+ const members = [];
218
+ let next = 0;
219
+ const values = new Map();
220
+ const lookup = (names) => {
221
+ const known = values.get(names[names.length - 1] ?? '');
222
+ return known === undefined
223
+ ? undefined
224
+ : { kind: 'number', value: known, text: String(known) };
225
+ };
226
+ const body = node.childForFieldName('body');
227
+ for (const member of body?.namedChildren ?? []) {
228
+ if (member.type !== 'enum_member_declaration') {
229
+ continue;
230
+ }
231
+ const memberName = member.childForFieldName('name');
232
+ if (memberName === null) {
233
+ continue;
234
+ }
235
+ const valueNode = member.childForFieldName('value');
236
+ let value = next;
237
+ if (valueNode !== null) {
238
+ const evaluated = evaluate(valueNode, lookup);
239
+ value = evaluated.kind === 'number' ? evaluated.value : undefined;
240
+ }
241
+ members.push({ name: memberName.text, value });
242
+ if (value !== undefined) {
243
+ values.set(memberName.text, value);
244
+ }
245
+ next = value === undefined ? undefined : value + 1;
246
+ }
247
+ return { name: nameNode.text, members, path };
248
+ }
249
+ function readDeclaration(node, path, outer, file, consts, depth) {
250
+ const kind = CLASS_LIKE.get(node.type);
251
+ if (kind !== undefined) {
252
+ readClassLike(node, kind, path, outer, file, consts, depth);
253
+ return;
254
+ }
255
+ if (node.type === 'enum_declaration') {
256
+ const declared = readEnum(node, path);
257
+ if (declared !== undefined) {
258
+ file.enums.push(declared);
259
+ }
260
+ return;
261
+ }
262
+ if ((node.type === 'namespace_declaration' ||
263
+ node.type === 'file_scoped_namespace_declaration') &&
264
+ depth < 16) {
265
+ const container = node.childForFieldName('body') ?? node;
266
+ for (const child of container.namedChildren) {
267
+ readDeclaration(child, path, outer, file, consts, depth + 1);
268
+ }
269
+ }
270
+ }
271
+ /** Reads the types of one parsed file. Constants are looked up through `consts` (from other files). */
272
+ export function readCSharpFile(root, path, consts) {
273
+ const file = {
274
+ path,
275
+ classes: [],
276
+ enums: [],
277
+ hasErrors: root.hasError,
278
+ nullableDirective: undefined,
279
+ };
280
+ for (const directive of root.descendantsOfType('nullable_directive')) {
281
+ if (/\bdisable\b/.test(directive.text)) {
282
+ file.nullableDirective = file.nullableDirective ?? 'disable';
283
+ }
284
+ else if (/\benable\b/.test(directive.text)) {
285
+ file.nullableDirective = file.nullableDirective ?? 'enable';
286
+ }
287
+ }
288
+ for (const child of root.namedChildren) {
289
+ readDeclaration(child, path, undefined, file, consts, 0);
290
+ }
291
+ return file;
292
+ }
293
+ //# sourceMappingURL=csharpDeclarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csharpDeclarations.js","sourceRoot":"","sources":["../../src/parsers/csharpDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,GAad,MAAM,mBAAmB,CAAC;AAE3B,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,GAAqC,IAAI,GAAG,CAAC;IAC3D,CAAC,mBAAmB,EAAE,OAAO,CAAC;IAC9B,CAAC,oBAAoB,EAAE,QAAQ,CAAC;IAChC,CAAC,2BAA2B,EAAE,QAAQ,CAAC;IACvC,CAAC,oBAAoB,EAAE,QAAQ,CAAC;IAChC,CAAC,uBAAuB,EAAE,WAAW,CAAC;CACvC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,IAAgB;IACnC,OAAO,IAAI,CAAC,aAAa;SACtB,MAAM,CAAC,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;SACxD,GAAG,CAAC,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IACjC,MAAM,IAAI,GAA2B,IAAI,CAAC,aAAa,CAAC,IAAI,CAC1D,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAClD,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,wGAAwG;IACxG,uCAAuC;IACvC,MAAM,IAAI,GAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,aAAa,CAAC,IAAI,CAAC;SACvB,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SACrC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,IAAI,GAA2B,IAAI,CAAC,aAAa,CAAC,IAAI,CAC1D,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAC5D,CAAC;IACF,OAAO,CACL,IAAI,EAAE,aAAa,CAAC,GAAG,CACrB,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAC/D,IAAI,EAAE,CACR,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IAKrC,MAAM,IAAI,GAAsB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,SAAS,GAAY,KAAK,CAAC;IAC/B,IAAI,SAAS,GAAY,KAAK,CAAC;IAC/B,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GACX,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAiB,EAAE,EAAE,CAC3C,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAC5C,EAAE,IAAI,IAAI,EAAE,CAAC;QAChB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACnD,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,QAAQ,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAsB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,OAAO,GAAY,KAAK,EAAE,IAAI,KAAK,yBAAyB,CAAC;IACnE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GACf,KAAK,KAAK,IAAI,IAAI,OAAO;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,qBAAqB;YACpC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACrB,CAAC,CAAC,KAAK,CAAC;IACd,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;QAC5B,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC;QAChC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO;QACzC,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QACpE,OAAO,EAAE,KAAK;QACd,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QAChD,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAAgB,EAChB,GAAY,EACZ,MAAmB;IAEnB,MAAM,WAAW,GAA2B,IAAI,CAAC,aAAa,CAAC,IAAI,CACjE,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAC7D,CAAC;IACF,MAAM,QAAQ,GACZ,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACjD,IAAI,WAAW,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAa,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QACnD,IAAI,UAAU,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GACZ,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,MAAM,GAA2B,UAAU,CAAC,aAAa,CAAC,IAAI,CAClE,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAC5D,CAAC;QACF,MAAM,WAAW,GAAsB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QACrE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACxD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IACE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5B,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC9B,WAAW,KAAK,IAAI,EACpB,CAAC;YACD,MAAM,KAAK,GAAY,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,SAAS;YACT,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC;YAChC,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC1C,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,IAAI;YACb,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;YAChD,IAAI;SACL,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB;IAClC,MAAM,QAAQ,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAsB,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACrE,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,aAAa,GACjB,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,aAAa,GACjB,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YACrD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,aAAa,CAAC,IAAI;gBACxB,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,UAAU;QACV,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAClC,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,IAAgB,EAChB,IAAiB,EACjB,IAAY,EACZ,KAAyB,EACzB,IAAY,EACZ,MAAmB,EACnB,KAAa;IAEb,MAAM,QAAQ,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAY;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI;QACJ,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;QAC5B,cAAc,EAAE,kBAAkB,CAAC,IAAI,CAAC;QACxC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;QACtB,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC;QAChC,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,IAAI;KACL,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,gGAAgG;IAChG,MAAM,UAAU,GAAsB,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3E,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;YACxD,MAAM,aAAa,GACjB,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,aAAa,GACjB,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACrD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;oBAClB,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC;oBACvC,SAAS,EAAE,CAAC,QAAQ,CAAC;oBACrB,UAAU,EAAE,cAAc,CAAC,SAAS,CAAC;oBACrC,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,IAAI;oBACf,UAAU,EAAE,KAAK;oBACjB,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/D,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAA2B,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC/C,mBAAmB,CACjB,MAAM,EACN,GAAG,EACH,CAAC,KAAe,EAAuB,EAAE,CACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CACnD,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAChD,MAAM,MAAM,GAAyB,UAAU,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACrB,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB,EAAE,IAAY;IAC9C,MAAM,QAAQ,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,IAAI,GAAuB,CAAC,CAAC;IACjC,MAAM,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAgB,CAAC,KAAe,EAAuB,EAAE;QACnE,MAAM,KAAK,GAAuB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,KAAK,KAAK,SAAS;YACxB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5D,CAAC,CAAC;IACF,MAAM,IAAI,GAAsB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/D,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAsB,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAsB,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,KAAK,GAAuB,IAAI,CAAC;QACrC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,SAAS,GAAY,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACvD,KAAK,GAAG,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CACtB,IAAgB,EAChB,IAAY,EACZ,KAAyB,EACzB,IAAY,EACZ,MAAmB,EACnB,KAAa;IAEb,MAAM,IAAI,GAA4B,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAuB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO;IACT,CAAC;IACD,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QACpC,IAAI,CAAC,IAAI,KAAK,mCAAmC,CAAC;QACpD,KAAK,GAAG,EAAE,EACV,CAAC;QACD,MAAM,SAAS,GAAe,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC5C,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,cAAc,CAC5B,IAAgB,EAChB,IAAY,EACZ,MAAmB;IAEnB,MAAM,IAAI,GAAW;QACnB,IAAI;QACJ,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,iBAAiB,EAAE,SAAS;KAC7B,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrE,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC;QAC/D,CAAC;aAAM,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,130 @@
1
+ import Parser from 'web-tree-sitter';
2
+ import { type Result } from '../result.js';
3
+ export type SyntaxNode = Parser.SyntaxNode;
4
+ /** A C# type expression reduced to what mapping needs: a name, generic arguments and `?` / `[]` markers. */
5
+ export interface CsType {
6
+ /** The last identifier, without qualifiers or arguments: `ICollection`, `Post`, `int`. */
7
+ name: string;
8
+ /** The type as written, without nullable and array markers. */
9
+ text: string;
10
+ args: CsType[];
11
+ /** True for `T?` and `Nullable<T>` (the wrapper is removed from `name` and `args`). */
12
+ nullable: boolean;
13
+ /** Number of array dimensions: `byte[]` is 1 and `int[][]` is 2. */
14
+ arrayDepth: number;
15
+ }
16
+ /** A statically evaluated expression. Anything that cannot be evaluated is `other` with its source text. */
17
+ export type CsValue = {
18
+ kind: 'string';
19
+ value: string;
20
+ } | {
21
+ kind: 'number';
22
+ value: number;
23
+ text: string;
24
+ } | {
25
+ kind: 'bool';
26
+ value: boolean;
27
+ } | {
28
+ kind: 'null';
29
+ }
30
+ /** `DeleteBehavior.Cascade`, or a bare identifier that is not a known constant. */
31
+ | {
32
+ kind: 'member';
33
+ path: string[];
34
+ } | {
35
+ kind: 'nameof';
36
+ name: string;
37
+ } | {
38
+ kind: 'typeof';
39
+ type: string;
40
+ } | {
41
+ kind: 'array';
42
+ items: CsValue[];
43
+ } | {
44
+ kind: 'other';
45
+ text: string;
46
+ };
47
+ /** Looks a constant up by simple or `Class.Name` form; used while evaluating expressions. */
48
+ export type ConstLookup = (path: string[]) => CsValue | undefined;
49
+ export interface CsAttribute {
50
+ /** The attribute name without the `Attribute` suffix and any qualifier: `Key`, `Table`. */
51
+ name: string;
52
+ /** Positional argument expressions. */
53
+ args: SyntaxNode[];
54
+ /** Named arguments (`Schema = "x"`, `name: "x"`) by name. */
55
+ named: Map<string, SyntaxNode>;
56
+ node: SyntaxNode;
57
+ }
58
+ export interface CsProperty {
59
+ name: string;
60
+ type: CsType;
61
+ modifiers: string[];
62
+ attributes: CsAttribute[];
63
+ hasGetter: boolean;
64
+ hasSetter: boolean;
65
+ /** True for `=> expression` properties and for properties with a getter body only. */
66
+ isComputed: boolean;
67
+ /** True for fields (`public int X;`), which EF Core does not map by convention. */
68
+ isField: boolean;
69
+ initializer?: SyntaxNode;
70
+ node: SyntaxNode;
71
+ }
72
+ export interface CsParameter {
73
+ name: string;
74
+ type: CsType;
75
+ }
76
+ export interface CsMethod {
77
+ name: string;
78
+ parameters: CsParameter[];
79
+ /** The body block, or the expression of an expression-bodied method. */
80
+ body?: SyntaxNode;
81
+ node: SyntaxNode;
82
+ }
83
+ export type CsClassKind = 'class' | 'record' | 'struct' | 'interface';
84
+ export interface CsClass {
85
+ name: string;
86
+ kind: CsClassKind;
87
+ modifiers: string[];
88
+ typeParameters: string[];
89
+ bases: CsType[];
90
+ attributes: CsAttribute[];
91
+ properties: CsProperty[];
92
+ methods: CsMethod[];
93
+ consts: Map<string, CsValue>;
94
+ /** Name of the enclosing type for nested types. */
95
+ outer?: string;
96
+ path: string;
97
+ }
98
+ export interface CsEnumMember {
99
+ name: string;
100
+ /** The numeric value, or undefined when it could not be evaluated. */
101
+ value: number | undefined;
102
+ }
103
+ export interface CsEnum {
104
+ name: string;
105
+ members: CsEnumMember[];
106
+ path: string;
107
+ }
108
+ export interface CsFile {
109
+ path: string;
110
+ classes: CsClass[];
111
+ enums: CsEnum[];
112
+ /** True when the grammar reported syntax errors. */
113
+ hasErrors: boolean;
114
+ /** True when the file switches nullable reference types on or off with a `#nullable` directive. */
115
+ nullableDirective: 'enable' | 'disable' | undefined;
116
+ }
117
+ /** Lazily loads the tree-sitter C# grammar (WebAssembly, no native build step). */
118
+ export declare function getCSharpParser(): Promise<Result<Parser>>;
119
+ /** Splits at commas that are not inside `<...>`, `(...)` or `[...]`. */
120
+ export declare function splitTopLevel(text: string): string[];
121
+ /** Reads a type from its source text. Never fails: unreadable text becomes a type named after the text. */
122
+ export declare function parseTypeText(text: string, depth?: number): CsType;
123
+ /** Decodes the text of a regular, verbatim (`@"..."`) or raw (`"""..."""`) string literal. */
124
+ export declare function unquoteCSharpString(literal: string): string;
125
+ /** Evaluates literals, constants, `nameof`, `typeof`, enum-like member paths, unary minus and `+`. */
126
+ export declare function evaluate(node: SyntaxNode, consts: ConstLookup, depth?: number): CsValue;
127
+ /** `A.B.C` as ['A', 'B', 'C'], or undefined when a part is not a plain name. */
128
+ export declare function memberPath(node: SyntaxNode): string[] | undefined;
129
+ /** The attributes of a declaration, skipping those aimed at the field, return value or parameters. */
130
+ export declare function readAttributes(declaration: SyntaxNode): CsAttribute[];