diff --git a/packages/kbn-monaco/src/ace_migration/setup_worker.ts b/packages/kbn-monaco/src/ace_migration/setup_worker.ts new file mode 100644 index 0000000000000..86c815398b08f --- /dev/null +++ b/packages/kbn-monaco/src/ace_migration/setup_worker.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ParserWorker } from './types'; +import { monaco } from '../monaco_imports'; +import { WorkerProxyService } from './worker_proxy'; + +export const setupWorker = ( + langId: string, + owner: string, + worker: WorkerProxyService +) => { + worker.setup(langId); + + const updateAnnotations = async (model: monaco.editor.IModel): Promise => { + if (model.isDisposed()) { + return; + } + const parseResult = await worker.getAnnos(model.uri); + if (!parseResult) { + return; + } + const { annotations } = parseResult; + monaco.editor.setModelMarkers( + model, + owner, + annotations.map(({ at, text, type }) => { + const { column, lineNumber } = model.getPositionAt(at); + return { + startLineNumber: lineNumber, + startColumn: column, + endLineNumber: lineNumber, + endColumn: column, + message: text, + severity: type === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning, + }; + }) + ); + }; + + const onModelAdd = (model: monaco.editor.IModel) => { + if (model.getLanguageId() !== langId) { + return; + } + + const { dispose } = model.onDidChangeContent(async () => { + updateAnnotations(model); + }); + + model.onWillDispose(() => { + dispose(); + }); + + updateAnnotations(model); + }; + + monaco.editor.onDidCreateModel(onModelAdd); +}; diff --git a/packages/kbn-monaco/src/ace_migration/types.ts b/packages/kbn-monaco/src/ace_migration/types.ts new file mode 100644 index 0000000000000..b2db0c5828f2c --- /dev/null +++ b/packages/kbn-monaco/src/ace_migration/types.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export enum AnnoTypes { + error = 'error', + warning = 'warning', +} + +export interface Annotation { + name?: string; + type: AnnoTypes; + text: string; + at: number; +} + +export interface ParseResult { + annotations: Annotation[]; +} + +export type Parser = (source: string) => ParseResult; + +export interface ParserWorker { + parse: (model: string) => Promise; +} diff --git a/packages/kbn-monaco/src/xjson/worker_proxy_service.ts b/packages/kbn-monaco/src/ace_migration/worker_proxy.ts similarity index 71% rename from packages/kbn-monaco/src/xjson/worker_proxy_service.ts rename to packages/kbn-monaco/src/ace_migration/worker_proxy.ts index 4f95b3803fd6e..5ba790f5f97f2 100644 --- a/packages/kbn-monaco/src/xjson/worker_proxy_service.ts +++ b/packages/kbn-monaco/src/ace_migration/worker_proxy.ts @@ -6,13 +6,11 @@ * Side Public License, v 1. */ -import { ParseResult } from './grammar'; import { monaco } from '../monaco_imports'; -import { XJsonWorker } from './worker'; -import { ID } from './constants'; +import { ParserWorker, ParseResult } from './types'; -export class WorkerProxyService { - private worker: monaco.editor.MonacoWebWorker | undefined; +export class WorkerProxyService { + private worker: monaco.editor.MonacoWebWorker | undefined; public async getAnnos(modelUri: monaco.Uri): Promise { if (!this.worker) { @@ -23,8 +21,8 @@ export class WorkerProxyService { return proxy.parse(modelUri.toString()); } - public setup() { - this.worker = monaco.editor.createWebWorker({ label: ID, moduleId: '' }); + public setup(langId: string) { + this.worker = monaco.editor.createWebWorker({ label: langId, moduleId: '' }); } public stop() { diff --git a/packages/kbn-monaco/src/console/index.ts b/packages/kbn-monaco/src/console/index.ts index ba35b66f2156f..b7f22299d62ee 100644 --- a/packages/kbn-monaco/src/console/index.ts +++ b/packages/kbn-monaco/src/console/index.ts @@ -6,5 +6,19 @@ * Side Public License, v 1. */ +/** + * This import registers the Console monaco language contribution + */ +import './language'; + +import type { LangModuleType } from '../types'; +import { CONSOLE_LANG_ID } from './constants'; +import { lexerRules, languageConfiguration } from './lexer_rules'; + export { CONSOLE_LANG_ID } from './constants'; -export { ConsoleLang } from './language'; + +export const ConsoleLang: LangModuleType = { + ID: CONSOLE_LANG_ID, + lexerRules, + languageConfiguration, +}; diff --git a/packages/kbn-monaco/src/console/language.ts b/packages/kbn-monaco/src/console/language.ts index 77c795d76d9ea..64a9dee1996b7 100644 --- a/packages/kbn-monaco/src/console/language.ts +++ b/packages/kbn-monaco/src/console/language.ts @@ -6,55 +6,14 @@ * Side Public License, v 1. */ -import { LangModuleType } from '../types'; -import { CONSOLE_LANG_ID } from './constants'; +import { ConsoleWorker } from './worker'; +import { WorkerProxyService } from '../ace_migration/worker_proxy'; import { monaco } from '../monaco_imports'; +import { CONSOLE_LANG_ID } from './constants'; +import { setupWorker } from '../ace_migration/setup_worker'; -export const languageConfiguration: monaco.languages.LanguageConfiguration = {}; - -export const lexerRules: monaco.languages.IMonarchLanguage = { - defaultToken: 'invalid', - regex_method: /get|post|put|patch|delete/, - regex_url: /.*$/, - // C# style strings - escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, - ignoreCase: true, - tokenizer: { - root: [ - // whitespace - { include: '@rule_whitespace' }, - // start a multi-line comment - { include: '@rule_start_multi_comment' }, - // a one-line comment - [/\/\/.*$/, 'comment'], - // method - [/@regex_method/, 'keyword'], - // url - [/@regex_url/, 'identifier'], - ], - rule_whitespace: [[/[ \t\r\n]+/, 'WHITESPACE']], - rule_start_multi_comment: [[/\/\*/, 'comment', '@rule_multi_comment']], - rule_multi_comment: [ - // match everything on a single line inside the comment except for chars / and * - [/[^\/*]+/, 'comment'], - // start a nested comment by going 1 level down - [/\/\*/, 'comment', '@push'], - // match the closing of the comment and return 1 level up - ['\\*/', 'comment', '@pop'], - // match individual chars inside a multi-line comment - [/[\/*]/, 'comment'], - ], - string: [ - [/[^\\"]+/, 'string'], - [/@escapes/, 'string.escape'], - [/\\./, 'string.escape.invalid'], - [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }], - ], - }, -}; - -export const ConsoleLang: LangModuleType = { - ID: CONSOLE_LANG_ID, - lexerRules, - languageConfiguration, -}; +const OWNER = 'CONSOLE_GRAMMAR_CHECKER'; +const wps = new WorkerProxyService(); +monaco.languages.onLanguage(CONSOLE_LANG_ID, async () => { + setupWorker(CONSOLE_LANG_ID, OWNER, wps); +}); diff --git a/packages/kbn-monaco/src/console/lexer_rules/index.ts b/packages/kbn-monaco/src/console/lexer_rules/index.ts new file mode 100644 index 0000000000000..fcde238930d57 --- /dev/null +++ b/packages/kbn-monaco/src/console/lexer_rules/index.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { monaco } from '../../monaco_imports'; + +export const languageConfiguration: monaco.languages.LanguageConfiguration = {}; + +export const lexerRules: monaco.languages.IMonarchLanguage = { + defaultToken: 'invalid', + regex_method: /get|post|put|patch|delete/, + regex_url: /.*$/, + // C# style strings + escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, + ignoreCase: true, + tokenizer: { + root: [ + // whitespace + { include: '@rule_whitespace' }, + // start a multi-line comment + { include: '@rule_start_multi_comment' }, + // a one-line comment + [/\/\/.*$/, 'comment'], + // method + [/@regex_method/, 'keyword'], + // url + [/@regex_url/, 'identifier'], + ], + rule_whitespace: [[/[ \t\r\n]+/, 'WHITESPACE']], + rule_start_multi_comment: [[/\/\*/, 'comment', '@rule_multi_comment']], + rule_multi_comment: [ + // match everything on a single line inside the comment except for chars / and * + [/[^\/*]+/, 'comment'], + // start a nested comment by going 1 level down + [/\/\*/, 'comment', '@push'], + // match the closing of the comment and return 1 level up + ['\\*/', 'comment', '@pop'], + // match individual chars inside a multi-line comment + [/[\/*]/, 'comment'], + ], + string: [ + [/[^\\"]+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/"/, { token: 'string.quote', bracket: '@close', next: '@pop' }], + ], + }, +}; diff --git a/packages/kbn-monaco/src/console/parser.js b/packages/kbn-monaco/src/console/parser.js new file mode 100644 index 0000000000000..20884180b4260 --- /dev/null +++ b/packages/kbn-monaco/src/console/parser.js @@ -0,0 +1,466 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable prettier/prettier,prefer-const,no-throw-literal,camelcase,@typescript-eslint/no-shadow,one-var,object-shorthand,eqeqeq */ + +export const createParser = () => { + + let at, // The index of the current character + ch, // The current character + annos, // annotations + escapee = { + '"': '"', + '\\': '\\', + '/': '/', + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + }, + text, + annotate = function (type, text) { + annos.push({ type: type, text: text, at: at }); + }, + error = function (m) { + throw { + name: 'SyntaxError', + message: m, + at: at, + text: text, + }; + }, + reset = function (newAt) { + ch = text.charAt(newAt); + at = newAt + 1; + }, + next = function (c) { + if (c && c !== ch) { + error('Expected \'' + c + '\' instead of \'' + ch + '\''); + } + + ch = text.charAt(at); + at += 1; + return ch; + }, + nextUpTo = function (upTo, errorMessage) { + let currentAt = at, + i = text.indexOf(upTo, currentAt); + if (i < 0) { + error(errorMessage || 'Expected \'' + upTo + '\''); + } + reset(i + upTo.length); + return text.substring(currentAt, i); + }, + peek = function (offset) { + return text.charAt(at + offset); + }, + number = function () { + let number, + string = ''; + + if (ch === '-') { + string = '-'; + next('-'); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (isNaN(number)) { + error('Bad number'); + } else { + return number; + } + }, + string = function () { + let hex, + i, + string = '', + uffff; + + if (ch === '"') { + // If the current and the next characters are equal to "", empty string or start of triple quoted strings + if (peek(0) === '"' && peek(1) === '"') { + // literal + next('"'); + next('"'); + return nextUpTo('"""', 'failed to find closing \'"""\''); + } else { + while (next()) { + if (ch === '"') { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else { + string += ch; + } + } + } + } + error('Bad string'); + }, + white = function () { + while (ch) { + // Skip whitespace. + while (ch && ch <= ' ') { + next(); + } + // if the current char in iteration is '#' or the char and the next char is equal to '//' + // we are on the single line comment + if (ch === '#' || ch === '/' && peek(0) === '/') { + // Until we are on the new line, skip to the next char + while (ch && ch !== '\n') { + next(); + } + } else if (ch === '/' && peek(0) === '*') { + // If the chars starts with '/*', we are on the multiline comment + next(); + next(); + while (ch && !(ch === '*' && peek(0) === '/')) { + // Until we have closing tags '*/', skip to the next char + next(); + } + if (ch) { + next(); + next(); + } + } else break; + } + }, + strictWhite = function () { + while (ch && (ch == ' ' || ch == '\t')) { + next(); + } + }, + newLine = function () { + if (ch == '\n') next(); + }, + word = function () { + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error('Unexpected \'' + ch + '\''); + }, + // parses and returns the method + method = function () { + switch (ch) { + case 'g': + next('g'); + next('e'); + next('t'); + return 'get'; + case 'G': + next('G'); + next('E'); + next('T'); + return 'GET'; + case 'h': + next('h'); + next('e'); + next('a'); + next('d'); + return 'head'; + case 'H': + next('H'); + next('E'); + next('A'); + next('D'); + return 'HEAD'; + case 'd': + next('d'); + next('e'); + next('l'); + next('e'); + next('t'); + next('e'); + return 'delete'; + case 'D': + next('D'); + next('E'); + next('L'); + next('E'); + next('T'); + next('E'); + return 'DELETE'; + case 'p': + next('p'); + switch (ch) { + case 'a': + next('a'); + next('t'); + next('c'); + next('h'); + return 'patch'; + case 'u': + next('u'); + next('t'); + return 'put'; + case 'o': + next('o'); + next('s'); + next('t'); + return 'post'; + default: + error('Unexpected \'' + ch + '\''); + } + break; + case 'P': + next('P'); + switch (ch) { + case 'A': + next('A'); + next('T'); + next('C'); + next('H'); + return 'PATCH'; + case 'U': + next('U'); + next('T'); + return 'PUT'; + case 'O': + next('O'); + next('S'); + next('T'); + return 'POST'; + default: + error('Unexpected \'' + ch + '\''); + } + break; + default: + error('Expected one of GET/POST/PUT/DELETE/HEAD/PATCH'); + } + }, + value, // Place holder for the value function. + array = function () { + const array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error('Bad array'); + }, + object = function () { + let key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if (Object.hasOwnProperty.call(object, key)) { + error('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error('Bad object'); + }; + + value = function () { + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + + let url = function () { + let url = ''; + while (ch && ch != '\n') { + url += ch; + next(); + } + if (url == '') { + error('Missing url'); + } + return url; + }, + request = function () { + white(); + method(); + strictWhite(); + url(); + strictWhite(); // advance to one new line + newLine(); + strictWhite(); + if (ch == '{') { + object(); + } + // multi doc request + strictWhite(); // advance to one new line + newLine(); + strictWhite(); + while (ch == '{') { + // another object + object(); + strictWhite(); + newLine(); + strictWhite(); + } + }, + comment = function () { + while (ch == '#') { + while (ch && ch !== '\n') { + next(); + } + white(); + } + }, + multi_request = function () { + while (ch && ch != '') { + white(); + if (!ch) { + continue; + } + try { + comment(); + white(); + if (!ch) { + continue; + } + request(); + white(); + } catch (e) { + annotate('error', e.message); + // snap + const substring = text.substr(at); + const nextMatch = substring.search(/^POST|HEAD|GET|PUT|DELETE|PATCH/m); + if (nextMatch < 1) return; + reset(at + nextMatch); + } + } + }; + + return function (source, reviver) { + let result; + + text = source; + at = 0; + annos = []; + next(); + multi_request(); + white(); + if (ch) { + annotate('error', 'Syntax error'); + } + + result = { annotations: annos }; + + return typeof reviver === 'function' + ? (function walk(holder, key) { + let k, + v, + value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({ '': result }, '')) + : result; + }; +} diff --git a/packages/kbn-monaco/src/console/worker/console.worker.ts b/packages/kbn-monaco/src/console/worker/console.worker.ts new file mode 100644 index 0000000000000..e178fe76a0b60 --- /dev/null +++ b/packages/kbn-monaco/src/console/worker/console.worker.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// Please note: this module is intended to be run inside of a webworker. +/* eslint-disable @kbn/eslint/module_migration */ + +import '@babel/runtime/regenerator'; +// @ts-ignore +import * as worker from 'monaco-editor/esm/vs/editor/editor.worker'; +import { ConsoleWorker } from './console_worker'; + +self.onmessage = () => { + worker.initialize((ctx: any, createData: any) => { + return new ConsoleWorker(ctx); + }); +}; diff --git a/packages/kbn-monaco/src/console/worker/console_worker.ts b/packages/kbn-monaco/src/console/worker/console_worker.ts new file mode 100644 index 0000000000000..0e62994ad86f0 --- /dev/null +++ b/packages/kbn-monaco/src/console/worker/console_worker.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable-next-line @kbn/eslint/module_migration */ +import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; +import { Parser, ParseResult } from '../../ace_migration/types'; +import { createParser } from '../parser'; + +export class ConsoleWorker { + constructor(private ctx: monaco.worker.IWorkerContext) {} + private parser: Parser | undefined; + + async parse(modelUri: string): Promise { + if (!this.parser) { + this.parser = createParser(); + } + const model = this.ctx.getMirrorModels().find((m) => m.uri.toString() === modelUri); + if (model) { + return this.parser(model.getValue()); + } + } +} diff --git a/packages/kbn-monaco/src/console/worker/index.ts b/packages/kbn-monaco/src/console/worker/index.ts new file mode 100644 index 0000000000000..020386da091cb --- /dev/null +++ b/packages/kbn-monaco/src/console/worker/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { ConsoleWorker } from './console_worker'; diff --git a/packages/kbn-monaco/src/register_globals.ts b/packages/kbn-monaco/src/register_globals.ts index 5483c5d377194..8b12b34866a98 100644 --- a/packages/kbn-monaco/src/register_globals.ts +++ b/packages/kbn-monaco/src/register_globals.ts @@ -22,6 +22,7 @@ const langSpecificWorkerIds = [ ESQLLang.ID, monaco.languages.json.jsonDefaults.languageId, YAML_LANG_ID, + ConsoleLang.ID, ]; /** diff --git a/packages/kbn-monaco/src/xjson/grammar.ts b/packages/kbn-monaco/src/xjson/grammar.ts index 6b2f3db0edcef..63a3ea89ee381 100644 --- a/packages/kbn-monaco/src/xjson/grammar.ts +++ b/packages/kbn-monaco/src/xjson/grammar.ts @@ -6,23 +6,7 @@ * Side Public License, v 1. */ -export enum AnnoTypes { - error = 'error', - warning = 'warning', -} - -export type Parser = ReturnType; - -export interface Annotation { - name?: string; - type: AnnoTypes; - text: string; - at: number; -} - -export interface ParseResult { - annotations: Annotation[]; -} +import { AnnoTypes } from '../ace_migration/types'; /* eslint-disable prettier/prettier,no-var,prefer-const,no-throw-literal,@typescript-eslint/no-shadow,one-var,@typescript-eslint/no-unused-expressions,object-shorthand,eqeqeq */ diff --git a/packages/kbn-monaco/src/xjson/language.ts b/packages/kbn-monaco/src/xjson/language.ts index 0f5a556585114..20afa732f424d 100644 --- a/packages/kbn-monaco/src/xjson/language.ts +++ b/packages/kbn-monaco/src/xjson/language.ts @@ -9,57 +9,13 @@ // This file contains a lot of single setup logic for registering a language globally import { monaco } from '../monaco_imports'; -import { WorkerProxyService } from './worker_proxy_service'; +import { WorkerProxyService } from '../ace_migration/worker_proxy'; +import { setupWorker } from '../ace_migration/setup_worker'; +import { XJsonWorker } from './worker'; import { ID } from './constants'; const OWNER = 'XJSON_GRAMMAR_CHECKER'; - +const wps = new WorkerProxyService(); monaco.languages.onLanguage(ID, async () => { - const wps = new WorkerProxyService(); - - wps.setup(); - - const updateAnnotations = async (model: monaco.editor.IModel): Promise => { - if (model.isDisposed()) { - return; - } - const parseResult = await wps.getAnnos(model.uri); - if (!parseResult) { - return; - } - const { annotations } = parseResult; - monaco.editor.setModelMarkers( - model, - OWNER, - annotations.map(({ at, text, type }) => { - const { column, lineNumber } = model.getPositionAt(at); - return { - startLineNumber: lineNumber, - startColumn: column, - endLineNumber: lineNumber, - endColumn: column, - message: text, - severity: type === 'error' ? monaco.MarkerSeverity.Error : monaco.MarkerSeverity.Warning, - }; - }) - ); - }; - - const onModelAdd = (model: monaco.editor.IModel) => { - if (model.getLanguageId() !== ID) { - return; - } - - const { dispose } = model.onDidChangeContent(async () => { - updateAnnotations(model); - }); - - model.onWillDispose(() => { - dispose(); - }); - - updateAnnotations(model); - }; - - monaco.editor.onDidCreateModel(onModelAdd); + setupWorker(ID, OWNER, wps); }); diff --git a/packages/kbn-monaco/src/xjson/worker/xjson_worker.ts b/packages/kbn-monaco/src/xjson/worker/xjson_worker.ts index b8358d568a7f7..2a15acd96ebf0 100644 --- a/packages/kbn-monaco/src/xjson/worker/xjson_worker.ts +++ b/packages/kbn-monaco/src/xjson/worker/xjson_worker.ts @@ -8,7 +8,8 @@ /* eslint-disable-next-line @kbn/eslint/module_migration */ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; -import { createParser, Parser, ParseResult } from '../grammar'; +import { createParser } from '../grammar'; +import { Parser, ParseResult } from '../../ace_migration/types'; export class XJsonWorker { constructor(private ctx: monaco.worker.IWorkerContext) {} diff --git a/packages/kbn-monaco/webpack.config.js b/packages/kbn-monaco/webpack.config.js index 8e3ce95eb2bd2..b0e2bbd2cd680 100644 --- a/packages/kbn-monaco/webpack.config.js +++ b/packages/kbn-monaco/webpack.config.js @@ -87,4 +87,4 @@ const workerConfig = (languages) => ({ }, }); -module.exports = workerConfig(['default', 'json', 'painless', 'xjson', 'esql', 'yaml']); +module.exports = workerConfig(['default', 'json', 'painless', 'xjson', 'esql', 'yaml', 'console']);