2025-04-01 10:38:02 +09:00

597 lines
11 KiB
TypeScript

import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
interface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {
keywords: string[];
operators: string[];
builtinFunctions: string[];
}
/* KEYWORDS */
export const ALL = 'ALL';
export const AND = 'AND';
export const ANY = 'ANY';
export const AS = 'AS';
export const ASC = 'ASC';
export const BETWEEN = 'BETWEEN';
export const BY = 'BY';
export const CASE = 'CASE';
export const CUBE = 'CUBE';
export const DESC = 'DESC';
export const DISTINCT = 'DISTINCT';
export const ELSE = 'ELSE';
export const END = 'END';
export const ESCAPE = 'ESCAPE';
export const EXISTS = 'EXISTS';
export const FALSE = 'FALSE';
export const FILTER = 'FILTER';
export const FIRST = 'FIRST';
export const FROM = 'FROM';
export const GROUP = 'GROUP';
export const GROUPING = 'GROUPING';
export const HAVING = 'HAVING';
export const ILIKE = 'ILIKE';
export const IN = 'IN';
export const INNER = 'INNER';
export const IS = 'IS';
export const JOIN = 'JOIN';
export const LAST = 'LAST';
export const LEFT = 'LEFT';
export const LIKE = 'LIKE';
export const LIMIT = 'LIMIT';
export const NOT = 'NOT';
export const NULL = 'NULL';
export const ON = 'ON';
export const OR = 'OR';
export const ORDER = 'ORDER';
export const OUTER = 'OUTER';
export const ROLLUP = 'ROLLUP';
export const SELECT = 'SELECT';
export const SETS = 'SETS';
export const SOME = 'SOME';
export const THEN = 'THEN';
export const TRUE = 'TRUE';
export const USING = 'USING';
export const WHEN = 'WHEN';
export const WHERE = 'WHERE';
export const WITH = 'WITH';
export const KEYWORDS = [
ALL,
AND,
ANY,
AS,
ASC,
BETWEEN,
BY,
CASE,
CUBE,
DESC,
DISTINCT,
ELSE,
END,
ESCAPE,
EXISTS,
FALSE,
FILTER,
FIRST,
FROM,
GROUP,
GROUPING,
HAVING,
ILIKE,
IN,
INNER,
IS,
JOIN,
LAST,
LEFT,
LIKE,
LIMIT,
NOT,
NULL,
ON,
OR,
ORDER,
OUTER,
ROLLUP,
SELECT,
SETS,
SOME,
THEN,
TRUE,
USING,
WHEN,
WHERE,
WITH,
];
export const AFTER_SELECT_KEYWORDS = [ALL, DISTINCT];
export const ALL_KEYWORDS = [...KEYWORDS, ...AFTER_SELECT_KEYWORDS];
/* FUNCTIONS */
export const AGGREGATE_FUNCTIONS = [
'any',
'any_value',
'approx_count_distinct',
'approx_percentile',
'array_agg',
'avg',
'bit_and',
'bit_or',
'bit_xor',
'bitmap_construct_agg',
'bitmap_or_agg',
'bool_and',
'bool_or',
'collect_list',
'collect_set',
'count',
'count_if',
'count_min_sketch',
'covar_pop',
'covar_samp',
'every',
'first',
'first_value',
'grouping',
'grouping_id',
'histogram_numeric',
'hll_sketch_agg',
'hll_union_agg',
'kurtosis',
'last',
'last_value',
'max',
'max_by',
'mean',
'median',
'min',
'min_by',
'mode',
'percentile',
'percentile_approx',
'regr_avgx',
'regr_avgy',
'regr_count',
'regr_intercept',
'regr_r2',
'regr_slope',
'regr_sxx',
'regr_sxy',
'regr_syy',
'skewness',
'some',
'std',
'stddev',
'stddev_pop',
'stddev_samp',
'sum',
'try_avg',
'try_sum',
'var_pop',
'var_samp',
'variance',
];
export const ARRAY_FUNCTIONS = [
'array',
'array_append',
'array_compact',
'array_contains',
'array_distinct',
'array_except',
'array_insert',
'array_intersect',
'array_join',
'array_max',
'array_min',
'array_position',
'array_prepend',
'array_remove',
'array_repeat',
'array_union',
'arrays_overlap',
'arrays_zip',
'flatten',
'get',
'sequence',
'shuffle',
'slice',
'sort_array',
];
export const CONDITIONAL_FUNCTIONS = ['coalesce', 'if', 'ifnull', 'nanvl', 'nullif', 'nvl', 'nvl2'];
export const CONVERSION_FUNCTIONS = [
'bigint',
'binary',
'boolean',
'cast',
'date',
'decimal',
'double',
'float',
'int',
'smallint',
'string',
'timestamp',
'tinyint',
];
export const DATE_AND_TIMESTAMP_FUNCTIONS = [
'add_months',
'convert_timezone',
'curdate',
'current_date',
'current_timestamp',
'current_timezone',
'date_add',
'date_diff',
'date_format',
'date_from_unix_date',
'date_part',
'date_sub',
'date_trunc',
'dateadd',
'datediff',
'datepart',
'day',
'dayofmonth',
'dayofweek',
'dayofyear',
'extract',
'from_unixtime',
'from_utc_timestamp',
'hour',
'last_day',
'localtimestamp',
'localtimestamp',
'make_date',
'make_dt_interval',
'make_interval',
'make_timestamp',
'make_timestamp_ltz',
'make_timestamp_ntz',
'make_ym_interval',
'minute',
'month',
'months_between',
'next_day',
'now',
'quarter',
'second',
'session_window',
'timestamp_micros',
'timestamp_millis',
'timestamp_seconds',
'to_date',
'to_timestamp',
'to_timestamp_ltz',
'to_timestamp_ntz',
'to_unix_timestamp',
'to_utc_timestamp',
'trunc',
'try_to_timestamp',
'unix_date',
'unix_micros',
'unix_millis',
'unix_seconds',
'unix_timestamp',
'weekday',
'weekofyear',
'window',
'window_time',
'year',
];
export const JSON_FUNCTIONS = [
'from_json',
'get_json_object',
'json_array_length',
'json_object_keys',
'json_tuple',
'schema_of_json',
'to_json',
];
export const MATHEMATICAL_FUNCTIONS = [
'abs',
'acos',
'acosh',
'asin',
'asinh',
'atan',
'atan2',
'atanh',
'bin',
'bround',
'cbrt',
'ceil',
'ceiling',
'conv',
'cos',
'cosh',
'cot',
'csc',
'degrees',
'e',
'exp',
'expm1',
'factorial',
'floor',
'greatest',
'hex',
'hypot',
'least',
'ln',
'log',
'log10',
'log1p',
'log2',
'negative',
'pi',
'pmod',
'positive',
'pow',
'power',
'radians',
'rand',
'randn',
'random',
'rint',
'round',
'sec',
'shiftleft',
'sign',
'signum',
'sin',
'sinh',
'sqrt',
'tan',
'tanh',
'try_add',
'try_divide',
'try_multiply',
'try_subtract',
'unhex',
'width_bucket',
];
export const PREDICATE_FUNCTIONS = ['isnan', 'isnotnull', 'isnull', 'regexp', 'regexp_like', 'rlike'];
export const STRING_FUNCTIONS = [
'ascii',
'base64',
'bit_length',
'btrim',
'char',
'char_length',
'character_length',
'chr',
'concat_ws',
'contains',
'decode',
'elt',
'encode',
'endswith',
'find_in_set',
'format_number',
'format_string',
'initcap',
'instr',
'lcase',
'left',
'len',
'length',
'levenshtein',
'locate',
'lower',
'lpad',
'ltrim',
'luhn_check',
'mask',
'octet_length',
'overlay',
'position',
'printf',
'regexp_count',
'regexp_extract',
'regexp_extract_all',
'regexp_instr',
'regexp_replace',
'regexp_substr',
'repeat',
'replace',
'right',
'rpad',
'rtrim',
'sentences',
'soundex',
'space',
'split',
'split_part',
'startswith',
'substr',
'substring',
'substring_index',
'to_binary',
'to_char',
'to_number',
'to_varchar',
'translate',
'trim',
'try_to_binary',
'try_to_number',
'ucase',
'unbase64',
'upper',
];
export const WINDOW_FUNCTIONS = [
'cume_dist',
'dense_rank',
'lag',
'lead',
'nth_value',
'ntile',
'percent_rank',
'rank',
'row_number',
];
export const ALL_FUNCTIONS = [
...AGGREGATE_FUNCTIONS,
...ARRAY_FUNCTIONS,
...CONDITIONAL_FUNCTIONS,
...CONVERSION_FUNCTIONS,
...DATE_AND_TIMESTAMP_FUNCTIONS,
...JSON_FUNCTIONS,
...MATHEMATICAL_FUNCTIONS,
...PREDICATE_FUNCTIONS,
...STRING_FUNCTIONS,
...WINDOW_FUNCTIONS,
];
/* OPERATORS */
export const EQUAL = '=';
export const DOUBLE_EQUALS = '==';
export const NULL_SAFE_EQUAL = '<=>';
export const NOT_EQUAL = '!=';
export const GREATER_THAN = '>';
export const GREATER_THAN_EQUAL = '>=';
export const LESS_THAN = '<';
export const LESS_THAN_EQUAL = '<=';
export const LOGICAL_OPERATORS = [OR, AND];
export const MATH_OPERATORS = ['*', '/', '+', '-', '%', 'div', 'mod'];
export const PREDICATE_OPERATORS = [
NOT,
IS,
EQUAL,
DOUBLE_EQUALS,
NULL_SAFE_EQUAL,
NOT_EQUAL,
GREATER_THAN,
GREATER_THAN_EQUAL,
LESS_THAN,
LESS_THAN_EQUAL,
LIKE,
ILIKE,
IN,
];
export const ALL_OPERATORS = [...MATH_OPERATORS, ...LOGICAL_OPERATORS, ...PREDICATE_OPERATORS];
export const language: CloudWatchLanguage = {
defaultToken: '',
ignoreCase: true,
brackets: [
{ open: '[', close: ']', token: 'delimiter.square' },
{ open: '(', close: ')', token: 'delimiter.parenthesis' },
{ open: '{', close: '}', token: 'delimiter.curly' },
],
keywords: ALL_KEYWORDS,
operators: ALL_OPERATORS,
builtinFunctions: ALL_FUNCTIONS,
tokenizer: {
root: [
{ include: '@comments' },
{ include: '@whitespace' },
{ include: '@customParams' },
{ include: '@numbers' },
{ include: '@binaries' },
{ include: '@strings' },
{ include: '@strings' },
{ include: '@complexIdentifiers' },
[/[;,.]/, 'delimiter'],
[/[\(\)\[\]\{\}]/, '@brackets'],
[
/[\w@#$]+/,
{
cases: {
'@operators': 'operator',
'@builtinFunctions': 'predefined',
'@keywords': 'keyword',
'@default': 'identifier',
},
},
],
[/[<>=!%&+\-*/|~^]/, 'operator'],
],
whitespace: [[/[\s\t\r\n]+/, 'white']],
comments: [
[/--+.*/, 'comment'],
[/\/\*/, { token: 'comment.quote', next: '@comment' }],
],
comment: [
[/[^*/]+/, 'comment'],
[/\*\//, { token: 'comment.quote', next: '@pop' }],
[/./, 'comment'],
],
customParams: [
[/\${[A-Za-z0-9._-]*}/, 'variable'],
[/\@\@{[A-Za-z0-9._-]*}/, 'variable'],
],
numbers: [
[/0[xX][0-9a-fA-F]*/, 'number'],
[/[$][+-]*\d*(\.\d*)?/, 'number'],
[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, 'number'],
],
binaries: [
[/X'/i, { token: 'binary', next: '@binarySingle' }],
[/X"/i, { token: 'binary', next: '@binaryDouble' }],
],
binarySingle: [
[/\d+/, 'binary.escape'],
[/''/, 'binary'],
[/'/, { token: 'binary', next: '@pop' }],
],
binaryDouble: [
[/\d+/, 'binary.escape'],
[/""/, 'binary'],
[/"/, { token: 'binary', next: '@pop' }],
],
strings: [
[/'/, { token: 'string', next: '@stringSingle' }],
[/R'/i, { token: 'string', next: '@stringSingle' }],
[/"/, { token: 'string', next: '@stringDouble' }],
[/R"/i, { token: 'string', next: '@stringDouble' }],
],
stringSingle: [
[/[^']+/, 'string.escape'],
[/''/, 'string'],
[/'/, { token: 'string', next: '@pop' }],
],
stringDouble: [
[/[^"]+/, 'string.escape'],
[/""/, 'string'],
[/"/, { token: 'string', next: '@pop' }],
],
complexIdentifiers: [[/`/, { token: 'identifier', next: '@quotedIdentifier' }]],
quotedIdentifier: [
[/[^`]+/, 'identifier'],
[/``/, 'identifier'],
[/`/, { token: 'identifier', next: '@pop' }],
],
},
};
export const conf: monacoType.languages.LanguageConfiguration = {
comments: {
lineComment: '--',
blockComment: ['/*', '*/'],
},
brackets: [
['{', '}'],
['[', ']'],
['(', ')'],
],
autoClosingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" },
{ open: '`', close: '`' },
],
surroundingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
{ open: "'", close: "'" },
{ open: '`', close: '`' },
],
};