@finos/legend-lego 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/application/DocumentationLink.d.ts +27 -0
- package/lib/application/DocumentationLink.d.ts.map +1 -0
- package/lib/application/DocumentationLink.js +45 -0
- package/lib/application/DocumentationLink.js.map +1 -0
- package/lib/application/FuzzySearchAdvancedConfigMenu.d.ts +23 -0
- package/lib/application/FuzzySearchAdvancedConfigMenu.d.ts.map +1 -0
- package/lib/application/FuzzySearchAdvancedConfigMenu.js +35 -0
- package/lib/application/FuzzySearchAdvancedConfigMenu.js.map +1 -0
- package/lib/application/TabManager.d.ts +24 -0
- package/lib/application/TabManager.d.ts.map +1 -0
- package/lib/application/TabManager.js +117 -0
- package/lib/application/TabManager.js.map +1 -0
- package/lib/application/TabManagerState.d.ts +40 -0
- package/lib/application/TabManagerState.d.ts.map +1 -0
- package/lib/application/TabManagerState.js +93 -0
- package/lib/application/TabManagerState.js.map +1 -0
- package/lib/application/index.d.ts +20 -0
- package/lib/application/index.d.ts.map +1 -0
- package/lib/application/index.js +20 -0
- package/lib/application/index.js.map +1 -0
- package/lib/code-editor/CodeDiffView.d.ts +35 -0
- package/lib/code-editor/CodeDiffView.d.ts.map +1 -0
- package/lib/code-editor/CodeDiffView.js +78 -0
- package/lib/code-editor/CodeDiffView.js.map +1 -0
- package/lib/code-editor/CodeEditor.d.ts +1 -1
- package/lib/code-editor/CodeEditor.d.ts.map +1 -1
- package/lib/code-editor/CodeEditor.js +5 -3
- package/lib/code-editor/CodeEditor.js.map +1 -1
- package/lib/code-editor/CodeEditorConfig.d.ts +31 -0
- package/lib/code-editor/CodeEditorConfig.d.ts.map +1 -0
- package/lib/code-editor/CodeEditorConfig.js +33 -0
- package/lib/code-editor/CodeEditorConfig.js.map +1 -0
- package/lib/code-editor/CodeEditorUtils.d.ts +2 -0
- package/lib/code-editor/CodeEditorUtils.d.ts.map +1 -1
- package/lib/code-editor/CodeEditorUtils.js +46 -1
- package/lib/code-editor/CodeEditorUtils.js.map +1 -1
- package/lib/code-editor/PureLanguageCodeEditorSupport.d.ts +70 -0
- package/lib/code-editor/PureLanguageCodeEditorSupport.d.ts.map +1 -0
- package/lib/code-editor/PureLanguageCodeEditorSupport.js +237 -0
- package/lib/code-editor/PureLanguageCodeEditorSupport.js.map +1 -0
- package/lib/code-editor/PureLanguageService.d.ts +42 -0
- package/lib/code-editor/PureLanguageService.d.ts.map +1 -0
- package/lib/code-editor/PureLanguageService.js +437 -0
- package/lib/code-editor/PureLanguageService.js.map +1 -0
- package/lib/code-editor/__test-utils__/MockedMonacoEditor.d.ts.map +1 -0
- package/lib/code-editor/__test-utils__/MockedMonacoEditor.js.map +1 -0
- package/lib/code-editor/__test-utils__/MonacoEditorMockUtils.d.ts.map +1 -0
- package/lib/code-editor/{testing → __test-utils__}/MonacoEditorMockUtils.js +1 -1
- package/lib/code-editor/__test-utils__/MonacoEditorMockUtils.js.map +1 -0
- package/lib/code-editor/__test__.d.ts +17 -0
- package/lib/code-editor/__test__.d.ts.map +1 -0
- package/lib/code-editor/{testing/index.js → __test__.js} +2 -2
- package/lib/code-editor/__test__.js.map +1 -0
- package/lib/code-editor/index.d.ts +4 -0
- package/lib/code-editor/index.d.ts.map +1 -1
- package/lib/code-editor/index.js +4 -0
- package/lib/code-editor/index.js.map +1 -1
- package/lib/graph-editor/ElementIconUtils.d.ts +18 -0
- package/lib/graph-editor/ElementIconUtils.d.ts.map +1 -0
- package/lib/graph-editor/ElementIconUtils.js +37 -0
- package/lib/graph-editor/ElementIconUtils.js.map +1 -0
- package/lib/graph-editor/PackageableElementOption.d.ts +25 -0
- package/lib/graph-editor/PackageableElementOption.d.ts.map +1 -0
- package/lib/graph-editor/PackageableElementOption.js +46 -0
- package/lib/graph-editor/PackageableElementOption.js.map +1 -0
- package/lib/graph-editor/index.d.ts +18 -0
- package/lib/graph-editor/index.d.ts.map +1 -0
- package/lib/graph-editor/index.js +18 -0
- package/lib/graph-editor/index.js.map +1 -0
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/package.json +14 -9
- package/src/application/DocumentationLink.tsx +82 -0
- package/src/application/FuzzySearchAdvancedConfigMenu.tsx +66 -0
- package/src/application/TabManager.tsx +285 -0
- package/src/application/TabManagerState.ts +124 -0
- package/src/application/index.ts +22 -0
- package/src/code-editor/CodeDiffView.tsx +128 -0
- package/src/code-editor/CodeEditor.tsx +8 -5
- package/src/code-editor/CodeEditorConfig.ts +32 -0
- package/src/code-editor/CodeEditorUtils.ts +76 -1
- package/src/code-editor/PureLanguageCodeEditorSupport.ts +338 -0
- package/src/code-editor/PureLanguageService.ts +501 -0
- package/src/code-editor/{testing → __test-utils__}/MonacoEditorMockUtils.tsx +1 -1
- package/src/code-editor/{testing/index.ts → __test__.ts} +1 -1
- package/src/code-editor/index.ts +8 -0
- package/src/graph-editor/ElementIconUtils.tsx +47 -0
- package/src/graph-editor/PackageableElementOption.tsx +86 -0
- package/{lib/code-editor/testing/index.d.ts → src/graph-editor/index.ts} +3 -2
- package/tsconfig.json +16 -4
- package/lib/code-editor/testing/MockedMonacoEditor.d.ts.map +0 -1
- package/lib/code-editor/testing/MockedMonacoEditor.js.map +0 -1
- package/lib/code-editor/testing/MonacoEditorMockUtils.d.ts.map +0 -1
- package/lib/code-editor/testing/MonacoEditorMockUtils.js.map +0 -1
- package/lib/code-editor/testing/index.d.ts.map +0 -1
- package/lib/code-editor/testing/index.js.map +0 -1
- /package/lib/code-editor/{testing → __test-utils__}/MockedMonacoEditor.d.ts +0 -0
- /package/lib/code-editor/{testing → __test-utils__}/MockedMonacoEditor.js +0 -0
- /package/lib/code-editor/{testing → __test-utils__}/MonacoEditorMockUtils.d.ts +0 -0
- /package/src/code-editor/{testing → __test-utils__}/MockedMonacoEditor.ts +0 -0
@@ -0,0 +1,501 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
/* eslint-disable prefer-named-capture-group */
|
18
|
+
import {
|
19
|
+
PARSER_SECTION_MARKER,
|
20
|
+
PURE_ELEMENT_NAME,
|
21
|
+
PURE_CONNECTION_NAME,
|
22
|
+
PURE_PARSER,
|
23
|
+
} from '@finos/legend-graph';
|
24
|
+
import {
|
25
|
+
editor as monacoEditorAPI,
|
26
|
+
languages as monacoLanguagesAPI,
|
27
|
+
} from 'monaco-editor';
|
28
|
+
import { CODE_EDITOR_LANGUAGE, CODE_EDITOR_THEME } from './CodeEditorConfig.js';
|
29
|
+
|
30
|
+
/**
|
31
|
+
* The postfix to be added to all token types, i.e. identifier.pure, number.pure, etc.
|
32
|
+
*/
|
33
|
+
const PURE_GRAMMAR_TOKEN_POSTFIX = '.pure';
|
34
|
+
|
35
|
+
export enum PURE_GRAMMAR_TOKEN {
|
36
|
+
WHITESPACE = '',
|
37
|
+
|
38
|
+
KEYWORD = 'keyword',
|
39
|
+
IDENTIFIER = 'identifier',
|
40
|
+
OPERATOR = 'operator',
|
41
|
+
DELIMITER = 'delimiter',
|
42
|
+
|
43
|
+
PARSER = 'parser',
|
44
|
+
NUMBER = 'number',
|
45
|
+
DATE = 'date',
|
46
|
+
COLOR = 'color',
|
47
|
+
PACKAGE = 'package',
|
48
|
+
STRING = 'string',
|
49
|
+
COMMENT = 'comment',
|
50
|
+
|
51
|
+
LANGUAGE_STRUCT = 'language-struct',
|
52
|
+
MULTIPLICITY = 'multiplicity',
|
53
|
+
GENERICS = 'generics',
|
54
|
+
PROPERTY = 'property',
|
55
|
+
PARAMETER = 'property',
|
56
|
+
VARIABLE = 'variable',
|
57
|
+
TYPE = 'type',
|
58
|
+
|
59
|
+
INVALID = 'invalid',
|
60
|
+
}
|
61
|
+
|
62
|
+
const theme: monacoEditorAPI.IStandaloneThemeData = {
|
63
|
+
base: 'vs-dark', // can also be vs-dark or hc-black
|
64
|
+
inherit: true, // can also be false to completely replace the builtin rules
|
65
|
+
colors: {},
|
66
|
+
rules: [
|
67
|
+
// NOTE: unfortunately, `monaco-editor` only accepts HEX values, not CSS variables
|
68
|
+
{ token: PURE_GRAMMAR_TOKEN.IDENTIFIER, foreground: 'dcdcaa' },
|
69
|
+
{ token: PURE_GRAMMAR_TOKEN.NUMBER, foreground: 'b5cea8' },
|
70
|
+
{ token: PURE_GRAMMAR_TOKEN.DATE, foreground: 'b5cea8' },
|
71
|
+
{ token: PURE_GRAMMAR_TOKEN.COLOR, foreground: 'b5cea8' },
|
72
|
+
{ token: PURE_GRAMMAR_TOKEN.PACKAGE, foreground: '808080' },
|
73
|
+
{ token: PURE_GRAMMAR_TOKEN.PARSER, foreground: 'c586c0' },
|
74
|
+
{ token: PURE_GRAMMAR_TOKEN.LANGUAGE_STRUCT, foreground: 'c586c0' },
|
75
|
+
{ token: PURE_GRAMMAR_TOKEN.MULTIPLICITY, foreground: '2d796b' },
|
76
|
+
{ token: PURE_GRAMMAR_TOKEN.GENERICS, foreground: '2d796b' },
|
77
|
+
{ token: PURE_GRAMMAR_TOKEN.PROPERTY, foreground: '9cdcfe' },
|
78
|
+
{ token: PURE_GRAMMAR_TOKEN.PARAMETER, foreground: '9cdcfe' },
|
79
|
+
{ token: PURE_GRAMMAR_TOKEN.VARIABLE, foreground: '4fc1ff' },
|
80
|
+
{ token: PURE_GRAMMAR_TOKEN.TYPE, foreground: '3dc9b0' },
|
81
|
+
{ token: `${PURE_GRAMMAR_TOKEN.STRING}.escape`, foreground: 'd7ba7d' },
|
82
|
+
],
|
83
|
+
};
|
84
|
+
|
85
|
+
// Taken from `monaco-languages` configuration for Java in order to do propert brace matching
|
86
|
+
// See https://github.com/microsoft/monaco-languages/blob/master/src/java/java.ts
|
87
|
+
const configuration: monacoLanguagesAPI.LanguageConfiguration = {
|
88
|
+
// NOTE: Pure identifier includes $ but not in the first position (as that is parsed as a variable)
|
89
|
+
wordPattern:
|
90
|
+
/(-?\d*\.\d\w*)|([^`~!@#%^$&*()\-=+[{\]}\\|;:'",.<>/?\s][^`~!@#%^&*()\-=+[{\]}\\|;:'",.<>/?\s]*)/,
|
91
|
+
comments: {
|
92
|
+
lineComment: '//',
|
93
|
+
blockComment: ['/*', '*/'],
|
94
|
+
},
|
95
|
+
brackets: [
|
96
|
+
['{', '}'],
|
97
|
+
['[', ']'],
|
98
|
+
['(', ')'],
|
99
|
+
],
|
100
|
+
autoClosingPairs: [
|
101
|
+
{ open: '{', close: '}' },
|
102
|
+
{ open: '[', close: ']' },
|
103
|
+
{ open: '(', close: ')' },
|
104
|
+
{ open: '"', close: '"' },
|
105
|
+
{ open: "'", close: "'" },
|
106
|
+
],
|
107
|
+
surroundingPairs: [
|
108
|
+
{ open: '{', close: '}' },
|
109
|
+
{ open: '[', close: ']' },
|
110
|
+
{ open: '(', close: ')' },
|
111
|
+
{ open: '"', close: '"' },
|
112
|
+
{ open: "'", close: "'" },
|
113
|
+
{ open: '<', close: '>' },
|
114
|
+
{ open: '<<', close: '>>' },
|
115
|
+
],
|
116
|
+
folding: {
|
117
|
+
markers: {
|
118
|
+
start: new RegExp('^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))'),
|
119
|
+
end: new RegExp('^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))'),
|
120
|
+
},
|
121
|
+
},
|
122
|
+
};
|
123
|
+
|
124
|
+
/**
|
125
|
+
* Create new monarch definition to support syntax-highlighting
|
126
|
+
* See https://microsoft.github.io/monaco-editor/monarch.html
|
127
|
+
*
|
128
|
+
* The way SQL monarch definition is organized is good and worth learning from
|
129
|
+
* See https://github.com/microsoft/monaco-languages/blob/master/src/sql/sql.ts
|
130
|
+
*
|
131
|
+
* NOTE: using `monarch` only allows fairly very basic syntax-highlighting
|
132
|
+
* to actually do full AST analysis, we might need something more serious like
|
133
|
+
* using TextMate grammar which is used by VSCode itself
|
134
|
+
* See https://github.com/microsoft/monaco-editor#faq
|
135
|
+
* See https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide
|
136
|
+
*/
|
137
|
+
const generateLanguageMonarch = (
|
138
|
+
extraKeywords: string[],
|
139
|
+
extraParsers: string[],
|
140
|
+
): monacoLanguagesAPI.IMonarchLanguage =>
|
141
|
+
// TODO: complete syntax-highlighter for core features like constraint, derived properties, etc.
|
142
|
+
// TODO: add syntax highlighting for modules/plugins (come up with a plugin mechanism to do this).
|
143
|
+
({
|
144
|
+
defaultToken: 'invalid',
|
145
|
+
tokenPostfix: PURE_GRAMMAR_TOKEN_POSTFIX,
|
146
|
+
|
147
|
+
keywords: [
|
148
|
+
...extraKeywords,
|
149
|
+
// relational
|
150
|
+
'Schema',
|
151
|
+
'Table',
|
152
|
+
'Join',
|
153
|
+
'View',
|
154
|
+
'primaryKey',
|
155
|
+
'groupBy',
|
156
|
+
'mainTable',
|
157
|
+
// native
|
158
|
+
'let',
|
159
|
+
'extends',
|
160
|
+
'true',
|
161
|
+
'false',
|
162
|
+
'projects',
|
163
|
+
// elements
|
164
|
+
PURE_ELEMENT_NAME.CLASS,
|
165
|
+
PURE_ELEMENT_NAME.ASSOCIATION,
|
166
|
+
PURE_ELEMENT_NAME.ENUMERATION,
|
167
|
+
PURE_ELEMENT_NAME.MEASURE,
|
168
|
+
PURE_ELEMENT_NAME.PROFILE,
|
169
|
+
PURE_ELEMENT_NAME.FUNCTION,
|
170
|
+
PURE_ELEMENT_NAME.MAPPING,
|
171
|
+
PURE_ELEMENT_NAME.RUNTIME,
|
172
|
+
PURE_ELEMENT_NAME.CONNECTION,
|
173
|
+
PURE_ELEMENT_NAME.FILE_GENERATION,
|
174
|
+
PURE_ELEMENT_NAME.GENERATION_SPECIFICATION,
|
175
|
+
PURE_ELEMENT_NAME.DATA_ELEMENT,
|
176
|
+
// connections
|
177
|
+
PURE_CONNECTION_NAME.JSON_MODEL_CONNECTION,
|
178
|
+
PURE_CONNECTION_NAME.MODEL_CHAIN_CONNECTION,
|
179
|
+
PURE_CONNECTION_NAME.XML_MODEL_CONNECTION,
|
180
|
+
// mapping
|
181
|
+
'include',
|
182
|
+
'EnumerationMapping',
|
183
|
+
'Pure',
|
184
|
+
'AssociationMapping',
|
185
|
+
'XStore',
|
186
|
+
'AggregationAware',
|
187
|
+
/**
|
188
|
+
* @modularize
|
189
|
+
* See https://github.com/finos/legend-studio/issues/65
|
190
|
+
*/
|
191
|
+
PURE_ELEMENT_NAME.SERVICE,
|
192
|
+
PURE_ELEMENT_NAME.FLAT_DATA,
|
193
|
+
PURE_ELEMENT_NAME.DATABASE,
|
194
|
+
PURE_CONNECTION_NAME.FLAT_DATA_CONNECTION,
|
195
|
+
PURE_CONNECTION_NAME.RELATIONAL_DATABASE_CONNECTION,
|
196
|
+
'Relational',
|
197
|
+
],
|
198
|
+
|
199
|
+
operators: [
|
200
|
+
'=',
|
201
|
+
'>',
|
202
|
+
'<',
|
203
|
+
'!',
|
204
|
+
'~',
|
205
|
+
'?',
|
206
|
+
':',
|
207
|
+
'==',
|
208
|
+
'<=',
|
209
|
+
'>=',
|
210
|
+
'&&',
|
211
|
+
'||',
|
212
|
+
'++',
|
213
|
+
'--',
|
214
|
+
'+',
|
215
|
+
'-',
|
216
|
+
'*',
|
217
|
+
'/',
|
218
|
+
'&',
|
219
|
+
'|',
|
220
|
+
'^',
|
221
|
+
'%',
|
222
|
+
'->',
|
223
|
+
'#{',
|
224
|
+
'}#',
|
225
|
+
'@',
|
226
|
+
'<<',
|
227
|
+
'>>',
|
228
|
+
],
|
229
|
+
|
230
|
+
languageStructs: ['import', 'native'],
|
231
|
+
|
232
|
+
parsers: (
|
233
|
+
[
|
234
|
+
PURE_PARSER.PURE,
|
235
|
+
PURE_PARSER.CONNECTION,
|
236
|
+
PURE_PARSER.RUNTIME,
|
237
|
+
PURE_PARSER.MAPPING,
|
238
|
+
PURE_PARSER.SERVICE,
|
239
|
+
PURE_PARSER.FLATDATA,
|
240
|
+
PURE_PARSER.RELATIONAL,
|
241
|
+
PURE_PARSER.GENERATION_SPECIFICATION,
|
242
|
+
PURE_PARSER.FILE_GENERATION_SPECIFICATION,
|
243
|
+
PURE_PARSER.DATA,
|
244
|
+
] as string[]
|
245
|
+
)
|
246
|
+
.concat(extraParsers)
|
247
|
+
.map((parser) => `${PARSER_SECTION_MARKER}${parser}`),
|
248
|
+
|
249
|
+
// common regular expressions to be used in tokenizer
|
250
|
+
identifier: /[a-zA-Z_$][\w$]*/,
|
251
|
+
symbols: /[=><!~?:&|+\-*/^%#@]+/,
|
252
|
+
escapes:
|
253
|
+
/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
|
254
|
+
digits: /\d+(_+\d+)*/,
|
255
|
+
octaldigits: /[0-7]+(_+[0-7]+)*/,
|
256
|
+
binarydigits: /[0-1]+(_+[0-1]+)*/,
|
257
|
+
hexdigits: /[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,
|
258
|
+
multiplicity: /\[(?:[a-zA-Z0-9]+(?:\.\.(?:[a-zA-Z0-9]+|\*|))?|\*)\]/,
|
259
|
+
package: /(?:[\w_]+::)+/,
|
260
|
+
// NOTE: generics is a little tricky because in order to do it right, we have to
|
261
|
+
// do some sort of bracket matching, but we just can use a simple tokenizer here
|
262
|
+
// so to account for cases like `<Nil,Any|*>)->` `Function<{T[1]->Boolean[1]}>[1]`
|
263
|
+
// we have to make sure the content does not contain any `:` or `.` characters
|
264
|
+
// in order to avoid the accidental greedy match with inputs like
|
265
|
+
// `function doSomething<T>(a: Function<T[1]->Boolean[1]>)`
|
266
|
+
// nor we want to make sure the last character of the content is not `-` to avoid
|
267
|
+
// accidentally matching `->` as the end of the generics
|
268
|
+
generics: /(?:(?:<\w+>)|(?:<[^:.@^()]+[^-]>))/,
|
269
|
+
date: /%-?\d+(?:-\d+(?:-\d+(?:T(?:\d+(?::\d+(?::\d+(?:.\d+)?)?)?)(?:[+-][0-9]{4})?)))/,
|
270
|
+
time: /%\d+(?::\d+(?::\d+(?:.\d+)?)?)?/,
|
271
|
+
|
272
|
+
tokenizer: {
|
273
|
+
root: [
|
274
|
+
// NOTE: since `monaco-editor` Monarch is only meant for tokenizing
|
275
|
+
// and the need to highlight Pure syntax is more than just token-based,
|
276
|
+
// but semantic/syntax-based we have to create these complex rules.
|
277
|
+
// the things to note here is these are not meant to match multilines
|
278
|
+
// and they must be placed before identifier rules since token matching
|
279
|
+
// is run in order
|
280
|
+
// See https://github.com/microsoft/monaco-editor/issues/316#issuecomment-273555698
|
281
|
+
// See https://github.com/microsoft/monaco-editor/issues/571#issuecomment-342555050
|
282
|
+
// See https://microsoft.github.io/monaco-editor/monarch.html
|
283
|
+
{ include: '@pure' },
|
284
|
+
|
285
|
+
{ include: '@date' },
|
286
|
+
{ include: '@color' },
|
287
|
+
|
288
|
+
// parser markers
|
289
|
+
[
|
290
|
+
// NOTE: any leading whitespace to the section header is considered invalid syntax
|
291
|
+
/^\s*###[\w]+/,
|
292
|
+
{
|
293
|
+
cases: {
|
294
|
+
'@parsers': PURE_GRAMMAR_TOKEN.PARSER,
|
295
|
+
'@default': PURE_GRAMMAR_TOKEN.INVALID,
|
296
|
+
},
|
297
|
+
},
|
298
|
+
],
|
299
|
+
|
300
|
+
// identifiers and keywords
|
301
|
+
[
|
302
|
+
/(@identifier)/,
|
303
|
+
{
|
304
|
+
cases: {
|
305
|
+
'@languageStructs': PURE_GRAMMAR_TOKEN.LANGUAGE_STRUCT,
|
306
|
+
'@keywords': `${PURE_GRAMMAR_TOKEN.KEYWORD}.$0`,
|
307
|
+
// function descriptor
|
308
|
+
'([a-zA-Z_$][\\w$]*)_((\\w+_(([a-zA-Z0-9]+)|(\\$[a-zA-Z0-9]+_[a-zA-Z0-9]+\\$)))__)*(\\w+_(([a-zA-Z0-9]+)|(\\$[a-zA-Z0-9]+_[a-zA-Z0-9]+\\$)))_':
|
309
|
+
PURE_GRAMMAR_TOKEN.TYPE,
|
310
|
+
'@default': PURE_GRAMMAR_TOKEN.IDENTIFIER,
|
311
|
+
},
|
312
|
+
},
|
313
|
+
],
|
314
|
+
|
315
|
+
// whitespace
|
316
|
+
{ include: '@whitespace' },
|
317
|
+
|
318
|
+
// delimiters and operators
|
319
|
+
[/[{}()[\]]/, '@brackets'],
|
320
|
+
[/[<>](?!@symbols)/, '@brackets'],
|
321
|
+
[
|
322
|
+
/@symbols/,
|
323
|
+
{
|
324
|
+
cases: {
|
325
|
+
'@operators': PURE_GRAMMAR_TOKEN.OPERATOR,
|
326
|
+
'@default': PURE_GRAMMAR_TOKEN.IDENTIFIER,
|
327
|
+
},
|
328
|
+
},
|
329
|
+
],
|
330
|
+
|
331
|
+
{ include: '@number' },
|
332
|
+
|
333
|
+
// delimiter: after number because of .\d floats
|
334
|
+
[/[;,.]/, PURE_GRAMMAR_TOKEN.DELIMITER],
|
335
|
+
|
336
|
+
// strings
|
337
|
+
// NOTE: including non-teminated string so as people type ', we can start showing them that they're working on a string
|
338
|
+
[/'([^'\\]|\\.)*$/, `${PURE_GRAMMAR_TOKEN.STRING}.invalid`],
|
339
|
+
[/'/, PURE_GRAMMAR_TOKEN.STRING, '@string'],
|
340
|
+
|
341
|
+
{ include: '@characters' },
|
342
|
+
],
|
343
|
+
|
344
|
+
pure: [
|
345
|
+
// type
|
346
|
+
[/(@package\*)/, [PURE_GRAMMAR_TOKEN.PACKAGE]], // import path
|
347
|
+
[
|
348
|
+
/(@package?)(@identifier)(@generics?)(\s*)(@multiplicity)/,
|
349
|
+
[
|
350
|
+
PURE_GRAMMAR_TOKEN.PACKAGE,
|
351
|
+
PURE_GRAMMAR_TOKEN.TYPE,
|
352
|
+
PURE_GRAMMAR_TOKEN.GENERICS,
|
353
|
+
PURE_GRAMMAR_TOKEN.WHITESPACE,
|
354
|
+
PURE_GRAMMAR_TOKEN.MULTIPLICITY,
|
355
|
+
],
|
356
|
+
],
|
357
|
+
[
|
358
|
+
/(@package)(@identifier)(@generics?)/,
|
359
|
+
[
|
360
|
+
PURE_GRAMMAR_TOKEN.PACKAGE,
|
361
|
+
PURE_GRAMMAR_TOKEN.TYPE,
|
362
|
+
PURE_GRAMMAR_TOKEN.GENERICS,
|
363
|
+
],
|
364
|
+
],
|
365
|
+
|
366
|
+
// special operators that uses type (e.g. constructor, cast)
|
367
|
+
[
|
368
|
+
/([@^])(\s*)(@package?)(@identifier)(@generics?)(@multiplicity?)/,
|
369
|
+
[
|
370
|
+
`${PURE_GRAMMAR_TOKEN.TYPE}.operator`,
|
371
|
+
PURE_GRAMMAR_TOKEN.WHITESPACE,
|
372
|
+
PURE_GRAMMAR_TOKEN.PACKAGE,
|
373
|
+
PURE_GRAMMAR_TOKEN.TYPE,
|
374
|
+
PURE_GRAMMAR_TOKEN.GENERICS,
|
375
|
+
PURE_GRAMMAR_TOKEN.MULTIPLICITY,
|
376
|
+
],
|
377
|
+
],
|
378
|
+
|
379
|
+
// property / parameter
|
380
|
+
[
|
381
|
+
/(\.\s*)(@identifier)/,
|
382
|
+
[PURE_GRAMMAR_TOKEN.DELIMITER, PURE_GRAMMAR_TOKEN.PROPERTY],
|
383
|
+
],
|
384
|
+
[
|
385
|
+
/(@identifier)(\s*=)/,
|
386
|
+
[PURE_GRAMMAR_TOKEN.PROPERTY, PURE_GRAMMAR_TOKEN.OPERATOR],
|
387
|
+
],
|
388
|
+
[
|
389
|
+
/(@identifier)(\.)(@identifier)/,
|
390
|
+
[
|
391
|
+
PURE_GRAMMAR_TOKEN.TYPE,
|
392
|
+
PURE_GRAMMAR_TOKEN.OPERATOR,
|
393
|
+
PURE_GRAMMAR_TOKEN.PROPERTY,
|
394
|
+
],
|
395
|
+
], // could be: property chain, profile tag, and stereotype
|
396
|
+
[
|
397
|
+
/(@identifier)(\s*:)/,
|
398
|
+
[PURE_GRAMMAR_TOKEN.PARAMETER, PURE_GRAMMAR_TOKEN.OPERATOR],
|
399
|
+
],
|
400
|
+
|
401
|
+
// variables
|
402
|
+
[
|
403
|
+
/(let)(\s+)(@identifier)(\s*=)/,
|
404
|
+
[
|
405
|
+
PURE_GRAMMAR_TOKEN.KEYWORD,
|
406
|
+
PURE_GRAMMAR_TOKEN.WHITESPACE,
|
407
|
+
PURE_GRAMMAR_TOKEN.VARIABLE,
|
408
|
+
PURE_GRAMMAR_TOKEN.OPERATOR,
|
409
|
+
],
|
410
|
+
],
|
411
|
+
[/(\$@identifier)/, [`${PURE_GRAMMAR_TOKEN.VARIABLE}.reference`]],
|
412
|
+
],
|
413
|
+
|
414
|
+
date: [
|
415
|
+
[/(%latest)/, [`${PURE_GRAMMAR_TOKEN.DATE}.latest`]],
|
416
|
+
[/(@date)/, [PURE_GRAMMAR_TOKEN.DATE]],
|
417
|
+
[/(@time)/, [`${PURE_GRAMMAR_TOKEN.DATE}.time`]],
|
418
|
+
],
|
419
|
+
|
420
|
+
color: [[/(#[0-9a-fA-F]{6})/, [PURE_GRAMMAR_TOKEN.COLOR]]],
|
421
|
+
|
422
|
+
number: [
|
423
|
+
[
|
424
|
+
/(@digits)[eE]([-+]?(@digits))?[fFdD]?/,
|
425
|
+
`${PURE_GRAMMAR_TOKEN.NUMBER}.float`,
|
426
|
+
],
|
427
|
+
[
|
428
|
+
/(@digits)\.(@digits)([eE][-+]?(@digits))?[fFdD]?/,
|
429
|
+
`${PURE_GRAMMAR_TOKEN.NUMBER}.float`,
|
430
|
+
],
|
431
|
+
[/0[xX](@hexdigits)[Ll]?/, `${PURE_GRAMMAR_TOKEN.NUMBER}.hex`],
|
432
|
+
[/0(@octaldigits)[Ll]?/, `${PURE_GRAMMAR_TOKEN.NUMBER}.octal`],
|
433
|
+
[/0[bB](@binarydigits)[Ll]?/, `${PURE_GRAMMAR_TOKEN.NUMBER}.binary`],
|
434
|
+
[/(@digits)[fFdD]/, `${PURE_GRAMMAR_TOKEN.NUMBER}.float`],
|
435
|
+
[/(@digits)[lL]?/, PURE_GRAMMAR_TOKEN.NUMBER],
|
436
|
+
],
|
437
|
+
|
438
|
+
whitespace: [
|
439
|
+
[/[ \t\r\n]+/, PURE_GRAMMAR_TOKEN.WHITESPACE],
|
440
|
+
[/\/\*\*(?!\/)/, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc`, '@doc'],
|
441
|
+
[/\/\*/, PURE_GRAMMAR_TOKEN.COMMENT, '@comment'],
|
442
|
+
[/\/\/.*$/, PURE_GRAMMAR_TOKEN.COMMENT],
|
443
|
+
],
|
444
|
+
|
445
|
+
comment: [
|
446
|
+
[/[^/*]+/, PURE_GRAMMAR_TOKEN.COMMENT],
|
447
|
+
// [/\/\*/, PURE_GRAMMAR_TOKEN.COMMENT, '@push' ], // nested comment not allowed :-(
|
448
|
+
// [/\/\*/, ${PURE_GRAMMAR_TOKEN.COMMENT}.invalid` ], // this breaks block comments in the shape of /* //*/
|
449
|
+
[/\*\//, PURE_GRAMMAR_TOKEN.COMMENT, '@pop'],
|
450
|
+
[/[/*]/, PURE_GRAMMAR_TOKEN.COMMENT],
|
451
|
+
],
|
452
|
+
|
453
|
+
// Identical copy of comment above, except for the addition of .doc
|
454
|
+
doc: [
|
455
|
+
[/[^/*]+/, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc`],
|
456
|
+
// [/\/\*/, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc`, '@push' ], // nested comment not allowed :-(
|
457
|
+
[/\/\*/, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc.invalid`],
|
458
|
+
[/\*\//, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc`, '@pop'],
|
459
|
+
[/[/*]/, `${PURE_GRAMMAR_TOKEN.COMMENT}.doc`],
|
460
|
+
],
|
461
|
+
|
462
|
+
string: [
|
463
|
+
[/[^\\']+/, PURE_GRAMMAR_TOKEN.STRING],
|
464
|
+
[/@escapes/, `${PURE_GRAMMAR_TOKEN.STRING}.escape`],
|
465
|
+
[/\\./, `${PURE_GRAMMAR_TOKEN.STRING}.escape.invalid`],
|
466
|
+
[/'/, PURE_GRAMMAR_TOKEN.STRING, '@pop'],
|
467
|
+
],
|
468
|
+
|
469
|
+
characters: [
|
470
|
+
[/'[^\\']'/, PURE_GRAMMAR_TOKEN.STRING],
|
471
|
+
[
|
472
|
+
/(')(@escapes)(')/,
|
473
|
+
[
|
474
|
+
PURE_GRAMMAR_TOKEN.STRING,
|
475
|
+
`${PURE_GRAMMAR_TOKEN.STRING}.escape`,
|
476
|
+
PURE_GRAMMAR_TOKEN.STRING,
|
477
|
+
],
|
478
|
+
],
|
479
|
+
[/'/, `${PURE_GRAMMAR_TOKEN.STRING}.invalid`],
|
480
|
+
],
|
481
|
+
},
|
482
|
+
} as monacoLanguagesAPI.IMonarchLanguage);
|
483
|
+
|
484
|
+
export function setupPureLanguageService(options?: {
|
485
|
+
extraKeywords?: string[] | undefined;
|
486
|
+
extraParserKeywords?: string[] | undefined;
|
487
|
+
}): void {
|
488
|
+
monacoEditorAPI.defineTheme(CODE_EDITOR_THEME.LEGEND, theme);
|
489
|
+
monacoLanguagesAPI.register({ id: CODE_EDITOR_LANGUAGE.PURE });
|
490
|
+
monacoLanguagesAPI.setLanguageConfiguration(
|
491
|
+
CODE_EDITOR_LANGUAGE.PURE,
|
492
|
+
configuration,
|
493
|
+
);
|
494
|
+
monacoLanguagesAPI.setMonarchTokensProvider(
|
495
|
+
CODE_EDITOR_LANGUAGE.PURE,
|
496
|
+
generateLanguageMonarch(
|
497
|
+
options?.extraKeywords ?? [],
|
498
|
+
options?.extraParserKeywords ?? [],
|
499
|
+
),
|
500
|
+
);
|
501
|
+
}
|
@@ -14,7 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
-
import { createMock } from '@finos/legend-shared';
|
17
|
+
import { createMock } from '@finos/legend-shared/test';
|
18
18
|
|
19
19
|
/**
|
20
20
|
* NOTE: we have tried different ways to mock `monaco-editor`. But those ways often involve
|
package/src/code-editor/index.ts
CHANGED
@@ -14,5 +14,13 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
+
export {
|
18
|
+
PURE_GRAMMAR_TOKEN,
|
19
|
+
setupPureLanguageService,
|
20
|
+
} from './PureLanguageService.js';
|
21
|
+
export * from './PureLanguageCodeEditorSupport.js';
|
22
|
+
|
23
|
+
export * from './CodeEditorConfig.js';
|
17
24
|
export * from './CodeEditor.js';
|
18
25
|
export * from './CodeEditorUtils.js';
|
26
|
+
export * from './CodeDiffView.js';
|
@@ -0,0 +1,47 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
import {
|
18
|
+
type Type,
|
19
|
+
Class,
|
20
|
+
Enumeration,
|
21
|
+
Measure,
|
22
|
+
Unit,
|
23
|
+
PrimitiveType,
|
24
|
+
} from '@finos/legend-graph';
|
25
|
+
import {
|
26
|
+
PURE_ClassIcon,
|
27
|
+
PURE_PrimitiveTypeIcon,
|
28
|
+
PURE_EnumerationIcon,
|
29
|
+
PURE_MeasureIcon,
|
30
|
+
PURE_UnknownElementTypeIcon,
|
31
|
+
PURE_UnitIcon,
|
32
|
+
} from '@finos/legend-art';
|
33
|
+
|
34
|
+
export const getClassPropertyIcon = (type: Type): React.ReactNode => {
|
35
|
+
if (type instanceof PrimitiveType) {
|
36
|
+
return <PURE_PrimitiveTypeIcon />;
|
37
|
+
} else if (type instanceof Class) {
|
38
|
+
return <PURE_ClassIcon />;
|
39
|
+
} else if (type instanceof Enumeration) {
|
40
|
+
return <PURE_EnumerationIcon />;
|
41
|
+
} else if (type instanceof Measure) {
|
42
|
+
return <PURE_MeasureIcon />;
|
43
|
+
} else if (type instanceof Unit) {
|
44
|
+
return <PURE_UnitIcon />;
|
45
|
+
}
|
46
|
+
return <PURE_UnknownElementTypeIcon />;
|
47
|
+
};
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
|
17
|
+
import {
|
18
|
+
type PackageableElement,
|
19
|
+
isSystemElement,
|
20
|
+
isGeneratedElement,
|
21
|
+
isDependencyElement,
|
22
|
+
} from '@finos/legend-graph';
|
23
|
+
|
24
|
+
export interface PackageableElementOption<T extends PackageableElement> {
|
25
|
+
label: string;
|
26
|
+
value: T;
|
27
|
+
}
|
28
|
+
|
29
|
+
export const buildElementOption = <T extends PackageableElement>(
|
30
|
+
element: T,
|
31
|
+
): PackageableElementOption<T> => ({
|
32
|
+
label: element.name,
|
33
|
+
value: element,
|
34
|
+
});
|
35
|
+
|
36
|
+
const getElementColorCode = (element: PackageableElement): string =>
|
37
|
+
isSystemElement(element)
|
38
|
+
? 'system'
|
39
|
+
: isGeneratedElement(element)
|
40
|
+
? 'generated'
|
41
|
+
: isDependencyElement(element)
|
42
|
+
? 'dependency'
|
43
|
+
: '';
|
44
|
+
|
45
|
+
const generateOptionTooltipText = (
|
46
|
+
element: PackageableElement,
|
47
|
+
): string | undefined =>
|
48
|
+
isSystemElement(element)
|
49
|
+
? 'system element'
|
50
|
+
: isGeneratedElement(element)
|
51
|
+
? 'generated element'
|
52
|
+
: isDependencyElement(element)
|
53
|
+
? 'dependency element'
|
54
|
+
: undefined;
|
55
|
+
|
56
|
+
export const getPackageableElementOptionFormatter = (props: {
|
57
|
+
darkMode?: boolean | undefined;
|
58
|
+
}): ((
|
59
|
+
option: PackageableElementOption<PackageableElement>,
|
60
|
+
) => React.ReactNode) =>
|
61
|
+
function PackageableElementOptionLabel(
|
62
|
+
option: PackageableElementOption<PackageableElement>,
|
63
|
+
): React.ReactNode {
|
64
|
+
const { darkMode } = props;
|
65
|
+
const className = darkMode
|
66
|
+
? 'packageable-element-option-label--dark'
|
67
|
+
: 'packageable-element-option-label';
|
68
|
+
const colorCode = getElementColorCode(option.value);
|
69
|
+
|
70
|
+
return (
|
71
|
+
<div className={className}>
|
72
|
+
<div
|
73
|
+
title={generateOptionTooltipText(option.value)}
|
74
|
+
className={`packageable-element-option-label__type ${
|
75
|
+
colorCode
|
76
|
+
? `packageable-element-option-label__type--${colorCode}`
|
77
|
+
: ''
|
78
|
+
} `}
|
79
|
+
></div>
|
80
|
+
<div className={`${className}__name`}>{option.label}</div>
|
81
|
+
{option.value.package && (
|
82
|
+
<div className={`${className}__tag`}>{option.value.path}</div>
|
83
|
+
)}
|
84
|
+
</div>
|
85
|
+
);
|
86
|
+
};
|
@@ -13,5 +13,6 @@
|
|
13
13
|
* See the License for the specific language governing permissions and
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
export * from './PackageableElementOption.js';
|
18
|
+
export * from './ElementIconUtils.js';
|