diff --git a/src/core/facets.js b/src/core/facets.js index 3d511ee..fb8bb8e 100644 --- a/src/core/facets.js +++ b/src/core/facets.js @@ -1,7 +1,8 @@ import { Facet } from '@codemirror/state'; /** - * @typedef { 'expression' | 'unaryTests' } Dialect + * @typedef { import('../language').Dialect } Dialect + * @typedef { import('../language').ParserDialect } ParserDialect * @typedef { import('..').Variable } Variable */ @@ -16,6 +17,12 @@ export const builtinsFacet = Facet.define(); export const variablesFacet = Facet.define(); /** - * @type {Facet} + * @type {Facet} */ -export const dialectFacet = Facet.define(); \ No newline at end of file +export const dialectFacet = Facet.define(); + +/** + * @type {Facet} + */ +export const parserDialectFacet = Facet.define(); + diff --git a/src/core/index.js b/src/core/index.js index 8c3f60b..da0360d 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -5,6 +5,7 @@ import { createContext, language } from '../language'; import { variablesFacet, builtinsFacet, + parserDialectFacet, dialectFacet } from './facets'; @@ -23,6 +24,7 @@ import { /** * @typedef { { * dialect?: import('../language').Dialect, + * parserDialect?: import('../language').ParserDialect, * variables?: Variable[], * builtins?: Variable[] * } } CoreConfig @@ -38,6 +40,7 @@ import { */ export function configure({ dialect = 'expression', + parserDialect, variables = [], builtins = [], completions = feelCompletions({ builtins, variables }) @@ -49,8 +52,10 @@ export function configure({ dialectFacet.of(dialect), builtinsFacet.of(builtins), variablesFacet.of(variables), + parserDialectFacet.of(parserDialect), language({ dialect, + parserDialect, context, completions }) @@ -67,10 +72,12 @@ export function get(state) { const builtins = state.facet(builtinsFacet)[0]; const variables = state.facet(variablesFacet)[0]; const dialect = state.facet(dialectFacet)[0]; + const parserDialect = state.facet(parserDialectFacet)[0]; return { builtins, variables, - dialect + dialect, + parserDialect }; } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 1e96ab5..32b0914 100644 --- a/src/index.js +++ b/src/index.js @@ -16,6 +16,11 @@ import { camunda as camundaBuiltins } from './builtins'; * @typedef { import('./core').Variable } Variable */ +/** + * @typedef { import('./language').Dialect } Dialect + * @typedef { import('./language').ParserDialect } ParserDialect + */ + /** * @typedef {object} Builtin * @property {string} name @@ -33,6 +38,7 @@ const placeholderConf = new Compartment(); * @param {DOMNode} config.container * @param {Extension[]} [config.extensions] * @param {Dialect} [config.dialect='expression'] + * @param {ParserDialect} [config.parserDialect] * @param {DOMNode|String} [config.tooltipContainer] * @param {Function} [config.onChange] * @param {Function} [config.onKeyDown] @@ -41,12 +47,11 @@ const placeholderConf = new Compartment(); * @param {String} [config.value] * @param {Variable[]} [config.variables] * @param {Variable[]} [config.builtins] - * - * @returns {Object} editor */ export default function FeelEditor({ extensions: editorExtensions = [], dialect = 'expression', + parserDialect, container, contentAttributes = {}, tooltipContainer, @@ -101,7 +106,8 @@ export default function FeelEditor({ coreConf.of(Core.configure({ dialect, builtins, - variables + variables, + parserDialect })), bracketMatching(), indentOnInput(), @@ -185,16 +191,12 @@ FeelEditor.prototype.getSelection = function() { */ FeelEditor.prototype.setVariables = function(variables) { - const { - dialect, - builtins - } = Core.get(this._cmEditor.state); + const config = Core.get(this._cmEditor.state); this._cmEditor.dispatch({ effects: [ coreConf.reconfigure(Core.configure({ - dialect, - builtins, + ...config, variables })) ] diff --git a/src/language/index.js b/src/language/index.js index 7b60a98..1b8ecab 100644 --- a/src/language/index.js +++ b/src/language/index.js @@ -4,9 +4,14 @@ import { feel } from 'lang-feel'; * @typedef { 'expression' | 'unaryTests' } Dialect */ +/** + * @typedef { 'camunda' | undefined } ParserDialect + */ + /** * @param { { * dialect?: Dialect, + * parserDialect?: ParserDialect, * context?: Record, * completions?: import('@codemirror/autocomplete').CompletionSource[] * } } options diff --git a/test/spec/CodeEditor.spec.js b/test/spec/CodeEditor.spec.js index 8e4bed4..278fc81 100644 --- a/test/spec/CodeEditor.spec.js +++ b/test/spec/CodeEditor.spec.js @@ -481,8 +481,9 @@ return [ { dialect: 'expression', value: 'Mike < 10' }, - { dialect: 'unaryTests', value: '12, now(), "STRING"' } - ].forEach(({ dialect, value }) => { + { dialect: 'unaryTests', value: '12, now(), "STRING"' }, + { dialect: 'expression', value: '`a + 1`', parserDialect: 'camunda' } + ].forEach(({ dialect, parserDialect, value }) => { it(`<${dialect}>`, async function() { @@ -490,7 +491,8 @@ return const editor = new FeelEditor({ container, value, - dialect + dialect, + parserDialect }); // when