@cratis/screenplay-language 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +52 -0
  2. package/completion-items.ts +128 -0
  3. package/completion-planner.ts +111 -0
  4. package/completions.ts +112 -0
  5. package/diagnostics.ts +52 -0
  6. package/dist/completion-items.d.ts +23 -0
  7. package/dist/completion-items.d.ts.map +1 -0
  8. package/dist/completion-items.js +105 -0
  9. package/dist/completion-items.js.map +1 -0
  10. package/dist/completion-planner.d.ts +25 -0
  11. package/dist/completion-planner.d.ts.map +1 -0
  12. package/dist/completion-planner.js +90 -0
  13. package/dist/completion-planner.js.map +1 -0
  14. package/dist/completions.d.ts +4 -0
  15. package/dist/completions.d.ts.map +1 -0
  16. package/dist/completions.js +78 -0
  17. package/dist/completions.js.map +1 -0
  18. package/dist/diagnostics.d.ts +5 -0
  19. package/dist/diagnostics.d.ts.map +1 -0
  20. package/dist/diagnostics.js +47 -0
  21. package/dist/diagnostics.js.map +1 -0
  22. package/dist/document-context.d.ts +5 -0
  23. package/dist/document-context.d.ts.map +1 -0
  24. package/dist/document-context.js +45 -0
  25. package/dist/document-context.js.map +1 -0
  26. package/dist/hover-content.d.ts +2 -0
  27. package/dist/hover-content.d.ts.map +1 -0
  28. package/dist/hover-content.js +64 -0
  29. package/dist/hover-content.js.map +1 -0
  30. package/dist/hover.d.ts +3 -0
  31. package/dist/hover.d.ts.map +1 -0
  32. package/dist/hover.js +15 -0
  33. package/dist/hover.js.map +1 -0
  34. package/dist/index.d.ts +23 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +54 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/keyword-docs.d.ts +4 -0
  39. package/dist/keyword-docs.d.ts.map +1 -0
  40. package/dist/keyword-docs.js +100 -0
  41. package/dist/keyword-docs.js.map +1 -0
  42. package/dist/language.d.ts +12 -0
  43. package/dist/language.d.ts.map +1 -0
  44. package/dist/language.js +117 -0
  45. package/dist/language.js.map +1 -0
  46. package/dist/sub-language-registry.d.ts +20 -0
  47. package/dist/sub-language-registry.d.ts.map +1 -0
  48. package/dist/sub-language-registry.js +18 -0
  49. package/dist/sub-language-registry.js.map +1 -0
  50. package/dist/sub-languages/capture/CompletionProvider.d.ts +32 -0
  51. package/dist/sub-languages/capture/CompletionProvider.d.ts.map +1 -0
  52. package/dist/sub-languages/capture/CompletionProvider.js +332 -0
  53. package/dist/sub-languages/capture/CompletionProvider.js.map +1 -0
  54. package/dist/sub-languages/capture/HoverProvider.d.ts +8 -0
  55. package/dist/sub-languages/capture/HoverProvider.d.ts.map +1 -0
  56. package/dist/sub-languages/capture/HoverProvider.js +87 -0
  57. package/dist/sub-languages/capture/HoverProvider.js.map +1 -0
  58. package/dist/sub-languages/capture/Validator.d.ts +6 -0
  59. package/dist/sub-languages/capture/Validator.d.ts.map +1 -0
  60. package/dist/sub-languages/capture/Validator.js +72 -0
  61. package/dist/sub-languages/capture/Validator.js.map +1 -0
  62. package/dist/sub-languages/capture/index.d.ts +6 -0
  63. package/dist/sub-languages/capture/index.d.ts.map +1 -0
  64. package/dist/sub-languages/capture/index.js +58 -0
  65. package/dist/sub-languages/capture/index.js.map +1 -0
  66. package/dist/sub-languages/capture/language.d.ts +6 -0
  67. package/dist/sub-languages/capture/language.d.ts.map +1 -0
  68. package/dist/sub-languages/capture/language.js +160 -0
  69. package/dist/sub-languages/capture/language.js.map +1 -0
  70. package/dist/sub-languages/cdl.d.ts +3 -0
  71. package/dist/sub-languages/cdl.d.ts.map +1 -0
  72. package/dist/sub-languages/cdl.js +74 -0
  73. package/dist/sub-languages/cdl.js.map +1 -0
  74. package/dist/sub-languages/pdl.d.ts +3 -0
  75. package/dist/sub-languages/pdl.d.ts.map +1 -0
  76. package/dist/sub-languages/pdl.js +67 -0
  77. package/dist/sub-languages/pdl.js.map +1 -0
  78. package/dist/sub-languages/projection/CodeActionProvider.d.ts +18 -0
  79. package/dist/sub-languages/projection/CodeActionProvider.d.ts.map +1 -0
  80. package/dist/sub-languages/projection/CodeActionProvider.js +93 -0
  81. package/dist/sub-languages/projection/CodeActionProvider.js.map +1 -0
  82. package/dist/sub-languages/projection/CompletionProvider.d.ts +41 -0
  83. package/dist/sub-languages/projection/CompletionProvider.d.ts.map +1 -0
  84. package/dist/sub-languages/projection/CompletionProvider.js +591 -0
  85. package/dist/sub-languages/projection/CompletionProvider.js.map +1 -0
  86. package/dist/sub-languages/projection/HoverProvider.d.ts +24 -0
  87. package/dist/sub-languages/projection/HoverProvider.d.ts.map +1 -0
  88. package/dist/sub-languages/projection/HoverProvider.js +298 -0
  89. package/dist/sub-languages/projection/HoverProvider.js.map +1 -0
  90. package/dist/sub-languages/projection/Validator.d.ts +22 -0
  91. package/dist/sub-languages/projection/Validator.d.ts.map +1 -0
  92. package/dist/sub-languages/projection/Validator.js +339 -0
  93. package/dist/sub-languages/projection/Validator.js.map +1 -0
  94. package/dist/sub-languages/projection/index.d.ts +49 -0
  95. package/dist/sub-languages/projection/index.d.ts.map +1 -0
  96. package/dist/sub-languages/projection/index.js +160 -0
  97. package/dist/sub-languages/projection/index.js.map +1 -0
  98. package/dist/sub-languages/projection/language.d.ts +5 -0
  99. package/dist/sub-languages/projection/language.d.ts.map +1 -0
  100. package/dist/sub-languages/projection/language.js +171 -0
  101. package/dist/sub-languages/projection/language.js.map +1 -0
  102. package/dist/symbols.d.ts +45 -0
  103. package/dist/symbols.d.ts.map +1 -0
  104. package/dist/symbols.js +100 -0
  105. package/dist/symbols.js.map +1 -0
  106. package/dist/themes/screenplay-dark.d.ts +4 -0
  107. package/dist/themes/screenplay-dark.d.ts.map +1 -0
  108. package/dist/themes/screenplay-dark.js +29 -0
  109. package/dist/themes/screenplay-dark.js.map +1 -0
  110. package/dist/themes/screenplay-light.d.ts +4 -0
  111. package/dist/themes/screenplay-light.d.ts.map +1 -0
  112. package/dist/themes/screenplay-light.js +29 -0
  113. package/dist/themes/screenplay-light.js.map +1 -0
  114. package/dist/tokens.d.ts +5 -0
  115. package/dist/tokens.d.ts.map +1 -0
  116. package/dist/tokens.js +121 -0
  117. package/dist/tokens.js.map +1 -0
  118. package/dist/validation.d.ts +10 -0
  119. package/dist/validation.d.ts.map +1 -0
  120. package/dist/validation.js +101 -0
  121. package/dist/validation.js.map +1 -0
  122. package/document-context.ts +51 -0
  123. package/hover-content.ts +76 -0
  124. package/hover.ts +23 -0
  125. package/index.ts +98 -0
  126. package/keyword-docs.ts +102 -0
  127. package/language.ts +130 -0
  128. package/package.json +44 -0
  129. package/sub-language-registry.ts +42 -0
  130. package/sub-languages/capture/CompletionProvider.ts +365 -0
  131. package/sub-languages/capture/HoverProvider.ts +99 -0
  132. package/sub-languages/capture/Validator.ts +97 -0
  133. package/sub-languages/capture/index.ts +72 -0
  134. package/sub-languages/capture/language.ts +176 -0
  135. package/sub-languages/cdl.ts +76 -0
  136. package/sub-languages/pdl.ts +69 -0
  137. package/sub-languages/projection/CodeActionProvider.ts +123 -0
  138. package/sub-languages/projection/CompletionProvider.ts +653 -0
  139. package/sub-languages/projection/HoverProvider.ts +338 -0
  140. package/sub-languages/projection/Validator.ts +387 -0
  141. package/sub-languages/projection/index.ts +223 -0
  142. package/sub-languages/projection/language.ts +193 -0
  143. package/symbols.ts +161 -0
  144. package/themes/screenplay-dark.ts +32 -0
  145. package/themes/screenplay-light.ts +32 -0
  146. package/tokens.ts +145 -0
  147. package/validation.ts +145 -0
@@ -0,0 +1,298 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ export class HoverProvider {
4
+ readModels = [];
5
+ eventSchemas = {};
6
+ draftReadModel = null;
7
+ setReadModels(readModels) {
8
+ this.readModels = readModels || [];
9
+ }
10
+ // Keep for backwards compatibility
11
+ setReadModelSchemas(schemas) {
12
+ this.readModels = schemas.map(schema => ({
13
+ identifier: this.getSchemaName(schema) || '',
14
+ displayName: this.getSchemaName(schema) || '',
15
+ schema
16
+ }));
17
+ }
18
+ setEventSchemas(schemas) {
19
+ if (!schemas) {
20
+ this.eventSchemas = {};
21
+ return;
22
+ }
23
+ if (Array.isArray(schemas)) {
24
+ const map = {};
25
+ schemas.forEach((s, i) => {
26
+ if (!s)
27
+ return;
28
+ const name = this.getSchemaName(s) || `Event${i + 1}`;
29
+ map[name] = s;
30
+ });
31
+ this.eventSchemas = map;
32
+ return;
33
+ }
34
+ this.eventSchemas = schemas;
35
+ }
36
+ setDraftReadModel(draft) {
37
+ this.draftReadModel = draft;
38
+ }
39
+ provideHover(model, position) {
40
+ const word = model.getWordAtPosition(position);
41
+ if (!word)
42
+ return null;
43
+ const wordText = word.word;
44
+ // Check if we're on the projection name (before '=>')
45
+ const lineContent = model.getLineContent(position.lineNumber);
46
+ const projectionNameMatch = this.getProjectionNameAtPosition(lineContent, position.column);
47
+ if (projectionNameMatch) {
48
+ return {
49
+ contents: [{ value: 'The name of the projection' }],
50
+ range: {
51
+ startLineNumber: position.lineNumber,
52
+ startColumn: word.startColumn,
53
+ endLineNumber: position.lineNumber,
54
+ endColumn: word.endColumn,
55
+ },
56
+ };
57
+ }
58
+ // Check if it's a keyword
59
+ const keywordInfo = this.getKeywordInfo(wordText);
60
+ if (keywordInfo) {
61
+ return {
62
+ contents: [{ value: keywordInfo }],
63
+ range: {
64
+ startLineNumber: position.lineNumber,
65
+ startColumn: word.startColumn,
66
+ endLineNumber: position.lineNumber,
67
+ endColumn: word.endColumn,
68
+ },
69
+ };
70
+ }
71
+ // Check if it's a built-in expression
72
+ const expressionInfo = this.getExpressionInfo(wordText);
73
+ if (expressionInfo) {
74
+ return {
75
+ contents: [{ value: expressionInfo }],
76
+ range: {
77
+ startLineNumber: position.lineNumber,
78
+ startColumn: word.startColumn,
79
+ endLineNumber: position.lineNumber,
80
+ endColumn: word.endColumn,
81
+ },
82
+ };
83
+ }
84
+ // Check if it's an event type
85
+ if (this.eventSchemas[wordText]) {
86
+ const schema = this.eventSchemas[wordText];
87
+ const description = this.getSchemaDescription(schema);
88
+ const properties = this.getSchemaProperties(schema);
89
+ let content = `**Event Type:** \`${wordText}\`\n\n`;
90
+ if (description) {
91
+ content += `${description}\n\n`;
92
+ }
93
+ if (properties.length > 0) {
94
+ content += `**Properties:**\n\n${properties.map(p => `- \`${p.name}\`: ${p.type}`).join('\n')}`;
95
+ }
96
+ return {
97
+ contents: [{ value: content }],
98
+ range: {
99
+ startLineNumber: position.lineNumber,
100
+ startColumn: word.startColumn,
101
+ endLineNumber: position.lineNumber,
102
+ endColumn: word.endColumn,
103
+ },
104
+ };
105
+ }
106
+ // Check if it's a draft read model
107
+ if (this.isDraftReadModel(wordText)) {
108
+ const description = this.getSchemaDescription(this.draftReadModel.schema);
109
+ const properties = this.getSchemaProperties(this.draftReadModel.schema);
110
+ const identifier = this.draftReadModel.identifier;
111
+ const displayName = this.draftReadModel.displayName;
112
+ let content = `**Read Model (Draft):** \`${displayName}\`\n\n**Identifier:** \`${identifier}\`\n\n`;
113
+ if (description) {
114
+ content += `${description}\n\n`;
115
+ }
116
+ if (properties.length > 0) {
117
+ content += `**Properties:**\n\n${properties.map(p => `- \`${p.name}\`: ${p.type}`).join('\n')}`;
118
+ }
119
+ return {
120
+ contents: [{ value: content }],
121
+ range: {
122
+ startLineNumber: position.lineNumber,
123
+ startColumn: word.startColumn,
124
+ endLineNumber: position.lineNumber,
125
+ endColumn: word.endColumn,
126
+ },
127
+ };
128
+ }
129
+ // Check if it's a read model
130
+ const readModel = this.resolveReadModelInfo(wordText);
131
+ if (readModel) {
132
+ const description = this.getSchemaDescription(readModel.schema);
133
+ const properties = this.getSchemaProperties(readModel.schema);
134
+ let content = `**Read Model:** \`${readModel.displayName}\`\n\n**Identifier:** \`${readModel.identifier}\`\n\n`;
135
+ if (description) {
136
+ content += `${description}\n\n`;
137
+ }
138
+ if (properties.length > 0) {
139
+ content += `**Properties:**\n\n${properties.map(p => `- \`${p.name}\`: ${p.type}`).join('\n')}`;
140
+ }
141
+ return {
142
+ contents: [{ value: content }],
143
+ range: {
144
+ startLineNumber: position.lineNumber,
145
+ startColumn: word.startColumn,
146
+ endLineNumber: position.lineNumber,
147
+ endColumn: word.endColumn,
148
+ },
149
+ };
150
+ }
151
+ // Check if it's a property in the current context
152
+ const propertyInfo = this.getPropertyInfo(model, position, wordText);
153
+ if (propertyInfo) {
154
+ return {
155
+ contents: [{ value: propertyInfo }],
156
+ range: {
157
+ startLineNumber: position.lineNumber,
158
+ startColumn: word.startColumn,
159
+ endLineNumber: position.lineNumber,
160
+ endColumn: word.endColumn,
161
+ },
162
+ };
163
+ }
164
+ return null;
165
+ }
166
+ getKeywordInfo(word) {
167
+ const keywords = {
168
+ 'projection': '**projection** - Defines a projection that transforms events into a read model',
169
+ 'from': '**from** *<EventType>*\n\nHandles specific event types and maps their properties to the read model.',
170
+ 'all': '**all**\n\nSubscribes to **all event types in the system**, regardless of explicit `from` blocks. Mappings inside `all` run for every event that arrives system-wide.',
171
+ 'every': '**every**\n\nHandles all events the projection **explicitly subscribes to** through `from` blocks, with automatic property mapping.',
172
+ 'key': '**key** *<expression>*\n\nDefines the projection key or composite key type.',
173
+ 'parent': '**parent** *<expression>*\n\nDefines a parent relationship for hierarchical projections.',
174
+ 'join': '**join** *<collection>* **on** *<property>*\n\nJoins with a child collection based on a property.',
175
+ 'children': '**children** *<collection>* **id** *<expression>*\n\nDefines operations on child collections.',
176
+ 'remove': '**remove with** *<EventType>* or **remove via join on** *<EventType>*\n\nRemoves items from the read model based on events.',
177
+ 'automap': '**automap** or **no automap**\n\nControls automatic property mapping from events to the read model.',
178
+ 'increment': '**increment** *<property>*\n\nIncrements a numeric property by 1.',
179
+ 'decrement': '**decrement** *<property>*\n\nDecrements a numeric property by 1.',
180
+ 'count': '**count** *<property>*\n\nCounts occurrences and stores in a property.',
181
+ 'add': '**add** *<property>* **by** *<expression>*\n\nAdds a value to a property.',
182
+ 'subtract': '**subtract** *<property>* **by** *<expression>*\n\nSubtracts a value from a property.',
183
+ 'exclude': '**exclude children**\n\nExcludes child collections from automatic mapping.',
184
+ 'events': '**events** *<EventType>*, ...\n\nSpecifies which event types to include in a join.',
185
+ 'via': 'Used with **remove via join on** to remove items via a join relationship.',
186
+ 'with': 'Used with **remove with** to specify which event type triggers removal.',
187
+ 'on': 'Used with **join** to specify the join property.',
188
+ 'by': 'Used with **add** or **subtract** to specify the value.',
189
+ 'id': 'Used with **children** to specify the child identifier expression.',
190
+ 'no': 'Used with **no automap** to disable automatic property mapping.',
191
+ };
192
+ return keywords[word] || null;
193
+ }
194
+ getExpressionInfo(word) {
195
+ const expressions = {
196
+ '$eventSourceId': '**$eventSourceId**\n\nThe identifier of the event source (aggregate/entity) that generated the event.',
197
+ '$causedBy': '**$causedBy**\n\nInformation about who/what caused the event.\n\n**Properties:**\n- `subject` - The subject identifier\n- `name` - The display name\n- `userName` - The username',
198
+ '$eventContext': '**$eventContext**\n\nAccess to event context properties.\n\n**Properties:**\n- `sequenceNumber` - The event sequence number\n- `occurred` - When the event occurred\n- `eventSourceId` - The event source identifier\n- `namespace` - The event namespace',
199
+ '$occurred': '**$occurred**\n\nThe timestamp when the event occurred.',
200
+ '$namespace': '**$namespace**\n\nThe namespace of the event.',
201
+ };
202
+ return expressions[word] || null;
203
+ }
204
+ getPropertyInfo(model, position, propertyName) {
205
+ // Try to find the active read model
206
+ const firstLine = model.getLineContent(1).trim();
207
+ const match = firstLine.match(/^projection\s+[\w.]+\s*=>\s*([\w.]+)/);
208
+ if (!match)
209
+ return null;
210
+ const readModelName = match[1];
211
+ const draftMatch = this.isDraftReadModel(readModelName) ? this.draftReadModel : null;
212
+ const resolvedReadModel = draftMatch ? null : this.resolveReadModelInfo(readModelName);
213
+ const activeSchema = draftMatch?.schema || resolvedReadModel?.schema;
214
+ if (activeSchema?.properties && activeSchema.properties[propertyName]) {
215
+ const prop = activeSchema.properties[propertyName];
216
+ const type = this.getPropertyTypeDescription(prop);
217
+ const description = prop.description;
218
+ let content = `**Property:** \`${propertyName}\`\n\n**Type:** \`${type}\``;
219
+ if (description) {
220
+ content += `\n\n${description}`;
221
+ }
222
+ return content;
223
+ }
224
+ // Check if it's an event property
225
+ const eventType = this.getCurrentEventType(model, position.lineNumber);
226
+ if (eventType && this.eventSchemas[eventType]) {
227
+ const eventSchema = this.eventSchemas[eventType];
228
+ if (eventSchema.properties && eventSchema.properties[propertyName]) {
229
+ const prop = eventSchema.properties[propertyName];
230
+ const type = this.getPropertyTypeDescription(prop);
231
+ const description = prop.description;
232
+ let content = `**Event Property:** \`${propertyName}\`\n\n**Type:** \`${type}\``;
233
+ if (description) {
234
+ content += `\n\n${description}`;
235
+ }
236
+ return content;
237
+ }
238
+ }
239
+ return null;
240
+ }
241
+ resolveReadModelInfo(readModelToken) {
242
+ return this.readModels.find(rm => rm.identifier === readModelToken || rm.displayName === readModelToken) || null;
243
+ }
244
+ isDraftReadModel(readModelToken) {
245
+ return !!this.draftReadModel && (this.draftReadModel.identifier === readModelToken || this.draftReadModel.displayName === readModelToken);
246
+ }
247
+ getCurrentEventType(model, lineNumber) {
248
+ for (let i = lineNumber; i >= 1; i--) {
249
+ const line = model.getLineContent(i).trim();
250
+ const fromMatch = line.match(/^from\s+([\w-]+)/);
251
+ if (fromMatch) {
252
+ return fromMatch[1];
253
+ }
254
+ }
255
+ return null;
256
+ }
257
+ getProjectionNameAtPosition(lineContent, column) {
258
+ // Check if we're on line 1 (projection declaration line)
259
+ const projectionMatch = lineContent.match(/^\s*projection\s+(\S+)\s*=>/);
260
+ if (!projectionMatch)
261
+ return false;
262
+ const projectionKeywordEnd = lineContent.indexOf('projection') + 'projection'.length;
263
+ const arrowStart = lineContent.indexOf('=>');
264
+ // Check if cursor is between 'projection' keyword and '=>'
265
+ // and is on the projection name itself
266
+ return column > projectionKeywordEnd && column <= arrowStart;
267
+ }
268
+ getSchemaName(schema) {
269
+ if (schema.name)
270
+ return schema.name;
271
+ if (schema.title)
272
+ return schema.title;
273
+ if (typeof schema.$id === 'string') {
274
+ const parts = schema.$id.split('/');
275
+ return parts[parts.length - 1] || schema.$id;
276
+ }
277
+ return undefined;
278
+ }
279
+ getSchemaDescription(schema) {
280
+ return schema.description || undefined;
281
+ }
282
+ getSchemaProperties(schema) {
283
+ if (!schema.properties)
284
+ return [];
285
+ return Object.entries(schema.properties).map(([name, prop]) => ({
286
+ name,
287
+ type: this.getPropertyTypeDescription(prop),
288
+ }));
289
+ }
290
+ getPropertyTypeDescription(propSchema) {
291
+ if (propSchema.type === 'array' && propSchema.items) {
292
+ const itemType = propSchema.items.type || propSchema.items.$ref?.split('/').pop() || 'unknown';
293
+ return `${itemType}[]`;
294
+ }
295
+ return propSchema.type || propSchema.$ref?.split('/').pop() || 'unknown';
296
+ }
297
+ }
298
+ //# sourceMappingURL=HoverProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HoverProvider.js","sourceRoot":"","sources":["../../../sub-languages/projection/HoverProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { editor } from 'monaco-editor';
2
+ import type { JsonSchema, ReadModelInfo, DraftReadModelInfo } from './index';
3
+ export declare class Validator {
4
+ private readModels;
5
+ private eventSchemas;
6
+ private draftReadModel;
7
+ setReadModels(readModels: ReadModelInfo[]): void;
8
+ setDraftReadModel(draft: DraftReadModelInfo | null): void;
9
+ setReadModelSchemas(schemas: JsonSchema[]): void;
10
+ setEventSchemas(schemas: Record<string, JsonSchema> | JsonSchema[]): void;
11
+ validate(model: editor.ITextModel): editor.IMarkerData[];
12
+ private resolveReadModelInfo;
13
+ private getReadModelStartColumn;
14
+ private resolveReadModelIdentifier;
15
+ private isDraftReadModel;
16
+ private isBuiltInExpression;
17
+ private createError;
18
+ private createWarning;
19
+ private createInfo;
20
+ private getSchemaName;
21
+ }
22
+ //# sourceMappingURL=Validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Validator.d.ts","sourceRoot":"","sources":["../../../sub-languages/projection/Validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7E,qBAAa,SAAS;IAClB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,cAAc,CAAmC;IAEzD,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI;IAIhD,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;IAKzD,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAQhD,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,EAAE,GAAG,IAAI;IAoBzE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE;IA2QxD,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;CASxB"}