{"version":3,"sources":["jsdelivr-header.js","/npm/@bpmn-io/feel-editor@2.1.0/src/lint/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/theme/theme.js","/npm/@bpmn-io/feel-editor@2.1.0/src/theme/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/autocompletion/util.js","/npm/@bpmn-io/feel-editor@2.1.0/src/autocompletion/pathExpression.js","/npm/@bpmn-io/feel-editor@2.1.0/src/autocompletion/variable.js","/npm/@bpmn-io/feel-editor@2.1.0/src/autocompletion/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/language/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/core/facets.js","/npm/@bpmn-io/feel-editor@2.1.0/src/core/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/builtins/index.js","/npm/@bpmn-io/feel-editor@2.1.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/@bpmn-io/feel-editor@2.1.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@bpmn-io/feel-editor@2.1.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { cmFeelLinter } from '@bpmn-io/feel-lint';\nimport { linter } from '@codemirror/lint';\n\nexport default [ linter(cmFeelLinter()) ];","import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\n\nexport const baseTheme = EditorView.theme({\n  '& .cm-content': {\n    padding: '0px',\n  },\n  '& .cm-line': {\n    padding: '0px',\n  },\n  '&.cm-editor.cm-focused': {\n    outline: 'none',\n  },\n  '& .cm-completionInfo': {\n    whiteSpace: 'pre-wrap',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis'\n  },\n  '&.cm-editor': {\n    height: '100%',\n  },\n\n  // Don't wrap whitespace for custom HTML\n  '& .cm-completionInfo > *': {\n    whiteSpace: 'normal'\n  },\n  '& .cm-completionInfo ul': {\n    margin: 0,\n    paddingLeft: '15px'\n  },\n  '& .cm-completionInfo pre': {\n    marginBottom: 0,\n    whiteSpace: 'pre-wrap'\n  },\n  '& .cm-completionInfo p': {\n    marginTop: 0,\n  },\n  '& .cm-completionInfo p:not(:last-of-type)': {\n    marginBottom: 0,\n  }\n});\n\nexport const highlightTheme = EditorView.baseTheme({\n  '& .variableName': {\n    color: '#10f'\n  },\n  '& .number': {\n    color: '#164'\n  },\n  '& .string': {\n    color: '#a11'\n  },\n  '& .bool': {\n    color: '#219'\n  },\n  '& .function': {\n    color: '#aa3731',\n    fontWeight: 'bold'\n  },\n  '& .control': {\n    color: '#708'\n  }\n});\n\nexport const syntaxClasses = syntaxHighlighting(\n  HighlightStyle.define([\n    { tag: t.variableName, class: 'variableName' },\n    { tag: t.name, class: 'variableName' },\n    { tag: t.number, class: 'number' },\n    { tag: t.string, class: 'string' },\n    { tag: t.bool, class: 'bool' },\n    { tag: t.function(t.variableName), class: 'function' },\n    { tag: t.function(t.special(t.variableName)), class: 'function' },\n    { tag: t.controlKeyword, class: 'control' },\n    { tag: t.operatorKeyword, class: 'control' }\n  ])\n);","import { baseTheme, highlightTheme, syntaxClasses } from './theme.js';\n\nexport default [ baseTheme, highlightTheme, syntaxClasses ];","// helpers ///////////////////////////////\n\nfunction _isEmpty(node) {\n  return node && node.from === node.to;\n}\n\n/**\n * @param {any} node\n * @param {number} pos\n *\n * @return {boolean}\n */\nexport function isEmpty(node, pos) {\n\n  // For the special case of empty nodes, we need to check the current node\n  // as well. The previous node could be part of another token, e.g.\n  // when typing functions \"abs(\".\n  const nextNode = node.nextSibling;\n\n  return _isEmpty(node) || (\n    nextNode && nextNode.from === pos && _isEmpty(nextNode)\n  );\n}\n\nexport function isVariableName(node) {\n  return node && node.parent && node.parent.name === 'VariableName';\n}\n\nexport function isPathExpression(node) {\n  if (!node) {\n    return false;\n  }\n\n  if (node.name === 'PathExpression') {\n    return true;\n  }\n\n  return isPathExpression(node.parent);\n}\n","import { syntaxTree } from '@codemirror/language';\nimport { isPathExpression } from './util.js';\n\n/**\n * @typedef { import('../core').Variable } Variable\n * @typedef { import('@codemirror/autocomplete').CompletionSource } CompletionSource\n */\n\n/**\n * @param { {\n *   variables?: Variable[],\n * } } options\n *\n * @return { CompletionSource }\n */\nexport function pathExpressionCompletion({ variables }) {\n\n  return (context) => {\n\n    const nodeBefore = syntaxTree(context.state).resolve(context.pos, -1);\n\n    if (!isPathExpression(nodeBefore)) {\n      return null;\n    }\n\n    const expression = findPathExpression(nodeBefore);\n\n    // if the cursor is directly after the `.`, variable starts at the cursor position\n    const from = nodeBefore === expression ? context.pos : nodeBefore.from;\n\n    const path = getPath(expression, context);\n\n    let options = variables;\n    for (var i = 0; i < path.length - 1; i++) {\n      var childVar = options.find(val => val.name === path[i].name);\n\n      if (!childVar) {\n        return null;\n      }\n\n      // only suggest if variable type matches\n      if (\n        childVar.isList !== 'optional' &&\n         !!childVar.isList !== path[i].isList\n      ) {\n        return null;\n      }\n\n      options = childVar.entries;\n    }\n\n    if (!options) return null;\n\n    const completionOptions = options.map(option => (\n      {\n        label: option.name,\n        type: 'variable',\n        info: option.info,\n        detail: option.detail\n      }));\n\n    const result = {\n      from: from,\n      options: completionOptions\n    };\n\n    return result;\n  };\n}\n\n\nfunction findPathExpression(node) {\n  while (node) {\n    if (node.name === 'PathExpression') {\n      return node;\n    }\n    node = node.parent;\n  }\n}\n\n// parses the path expression into a list of variable names with type information\n// e.g. foo[0].bar => [ { name: 'foo', isList: true }, { name: 'bar', isList: false } ]\nfunction getPath(node, context) {\n  let path = [];\n\n  for (let child = node.firstChild; child; child = child.nextSibling) {\n    if (child.name === 'PathExpression') {\n      path.push(...getPath(child, context));\n    } else if (child.name === 'FilterExpression') {\n      path.push(...getFilter(child, context));\n    }\n    else {\n      path.push({\n        name: getNodeContent(child, context),\n        isList: false\n      });\n    }\n  }\n  return path;\n}\n\nfunction getFilter(node, context) {\n  const list = node.firstChild;\n\n  if (list.name === 'PathExpression') {\n    const path = getPath(list, context);\n    const last = path[path.length - 1];\n    last.isList = true;\n\n    return path;\n  }\n\n  return [ {\n    name: getNodeContent(list, context),\n    isList: true\n  } ];\n}\n\nfunction getNodeContent(node, context) {\n  return context.state.sliceDoc(node.from, node.to);\n}","import { syntaxTree } from '@codemirror/language';\nimport { snippetCompletion } from '@codemirror/autocomplete';\nimport { isEmpty, isPathExpression, isVariableName } from './util.js';\n\n/**\n * @typedef { import('../core').Variable } Variable\n * @typedef { import('@codemirror/autocomplete').CompletionSource } CompletionSource\n */\n\n/**\n * @param { {\n *   variables?: Variable[],\n *   builtins?: Variable[]\n * } } options\n *\n * @return { CompletionSource }\n */\nexport function variableCompletion({ variables = [], builtins = [] }) {\n\n  const options = getVariableSuggestions(variables, builtins);\n\n  if (!options.length) {\n    return (context) => null;\n  }\n\n  return (context) => {\n\n    const {\n      pos,\n      state\n    } = context;\n\n    // in most cases, use what is typed before the cursor\n    const nodeBefore = syntaxTree(state).resolve(pos, -1);\n\n    if (isEmpty(nodeBefore, pos)) {\n      return context.explicit ? {\n        from: pos,\n        options\n      } : null;\n    }\n\n    // only auto-complete variables\n    if (!isVariableName(nodeBefore) || isPathExpression(nodeBefore)) {\n      return null;\n    }\n\n    return {\n      from: nodeBefore.from,\n      options\n    };\n  };\n}\n\n/**\n * @param { Variable[] } variables\n * @param { Variable[] } builtins\n *\n * @returns {import('@codemirror/autocomplete').Completion[]}\n */\nfunction getVariableSuggestions(variables, builtins) {\n  return [].concat(\n    variables.map(v => createVariableSuggestion(v)),\n    builtins.map(b => createVariableSuggestion(b))\n  );\n}\n\n/**\n * @param {import('..').Variable} variable\n * @param {number} [boost]\n *\n * @returns {import('@codemirror/autocomplete').Completion}\n */\nfunction createVariableSuggestion(variable, boost) {\n  if (variable.type === 'function') {\n    return createFunctionVariable(variable, boost);\n  }\n\n  return {\n    label: variable.name,\n    type: 'variable',\n    info: variable.info,\n    detail: variable.detail,\n    boost\n  };\n}\n\n/**\n * @param {import('..').Variable} variable\n * @param {number} boost\n *\n * @returns {import('@codemirror/autocomplete').Completion}\n */\nfunction createFunctionVariable(variable, boost) {\n  const {\n    name,\n    info,\n    detail,\n    params = []\n  } = variable;\n\n  const paramsWithNames = params.map(({ name, type }, index) => ({\n    name: name || `param ${index + 1}`,\n    type\n  }));\n\n  const template = `${name}(${paramsWithNames.map(p => '${' + p.name + '}').join(', ')})`;\n\n  const paramsSignature = paramsWithNames.map(({ name, type }) => (\n    type ? `${name}: ${type}` : name\n  )).join(', ');\n  const label = `${name}(${paramsSignature})`;\n\n  return snippetCompletion(template, {\n    label,\n    type: 'function',\n    info,\n    detail,\n    boost\n  });\n}\n","import { snippets, keywordCompletions } from '@bpmn-io/lang-feel';\nimport { completeFromList } from '@codemirror/autocomplete';\n\nimport { pathExpressionCompletion } from './pathExpression.js';\nimport { variableCompletion } from './variable.js';\n\n/**\n * @typedef { import('../core').Variable } Variable\n * @typedef { import('@codemirror/autocomplete').CompletionSource } CompletionSource\n */\n\n/**\n * @param { {\n *   variables?: Variable[],\n *   builtins?: Variable[]\n * } } options\n *\n * @return { CompletionSource[] }\n */\nexport function completions({ variables = [], builtins = [] }) {\n\n  return [\n    pathExpressionCompletion({ variables }),\n    variableCompletion({ variables, builtins }),\n    completeFromList(snippets),\n    ...keywordCompletions\n  ];\n}","import { feel } from '@bpmn-io/lang-feel';\n\n/**\n * @typedef { 'expression' | 'unaryTests' } Dialect\n */\n\n/**\n * @typedef { 'camunda' | undefined } ParserDialect\n */\n\n/**\n * @param { {\n *   dialect?: Dialect,\n *   parserDialect?: ParserDialect,\n *   context?: Record<string, any>,\n *   completions?: import('@codemirror/autocomplete').CompletionSource[]\n * } } options\n *\n * @return { import('@codemirror/language').LanguageSupport }\n */\nexport function language(options) {\n  return feel(options);\n}\n\n/**\n * @param { import('../core').Variable[] } variables\n *\n * @return {Record<string, any>}\n */\nexport function createContext(variables) {\n  return variables.slice().reverse().reduce((context, builtin) => {\n    context[builtin.name] = () => {};\n\n    return context;\n  }, {});\n}","import { Facet } from '@codemirror/state';\n\n/**\n * @typedef { import('../language').Dialect } Dialect\n * @typedef { import('../language').ParserDialect } ParserDialect\n * @typedef { import('..').Variable } Variable\n */\n\n/**\n * @type {Facet<Variable[]>}\n */\nexport const builtinsFacet = Facet.define();\n\n/**\n * @type {Facet<Variable[]>}\n */\nexport const variablesFacet = Facet.define();\n\n/**\n * @type {Facet<Dialect>}\n */\nexport const dialectFacet = Facet.define();\n\n/**\n * @type {Facet<ParserDialect>}\n */\nexport const parserDialectFacet = Facet.define();\n\n","import { completions as feelCompletions } from '../autocompletion/index.js';\n\nimport { createContext, language } from '../language/index.js';\n\nimport {\n  variablesFacet,\n  builtinsFacet,\n  parserDialectFacet,\n  dialectFacet\n} from './facets.js';\n\n\n/**\n * @typedef {object} Variable\n * @property {string} name name or key of the variable\n * @property {string | (() => HTMLElement)} [info] short information about the variable, e.g. type\n * @property {string} [detail] longer description of the variable content\n * @property {boolean|'optional'} [isList] whether the variable is a list\n * @property {Array<Variable>} [entries] array of child variables if the variable is a context or list\n * @property {'function'|'variable'} [type] type of the variable\n * @property {Array<{name: string, type?: string}>} [params] function parameters\n */\n\n/**\n * @typedef { {\n *   dialect?: import('../language').Dialect,\n *   parserDialect?: import('../language').ParserDialect,\n *   variables?: Variable[],\n *   builtins?: Variable[]\n * } } CoreConfig\n *\n * @typedef { import('@codemirror/autocomplete').CompletionSource } CompletionSource\n * @typedef { import('@codemirror/state').Extension } Extension\n */\n\n/**\n * @param { CoreConfig & { completions?: CompletionSource[] } } config\n *\n * @return { Extension  }\n */\nexport function configure({\n  dialect = 'expression',\n  parserDialect,\n  variables = [],\n  builtins = [],\n  completions = feelCompletions({ builtins, variables })\n}) {\n\n  const context = createContext([ ...variables, ...builtins ]);\n\n  return [\n    dialectFacet.of(dialect),\n    builtinsFacet.of(builtins),\n    variablesFacet.of(variables),\n    parserDialectFacet.of(parserDialect),\n    language({\n      dialect,\n      parserDialect,\n      context,\n      completions\n    })\n  ];\n}\n\n/**\n * @param {import('@codemirror/state').EditorState } state\n *\n * @return { CoreConfig }\n */\nexport function get(state) {\n\n  const builtins = state.facet(builtinsFacet)[0];\n  const variables = state.facet(variablesFacet)[0];\n  const dialect = state.facet(dialectFacet)[0];\n  const parserDialect = state.facet(parserDialectFacet)[0];\n\n  return {\n    builtins,\n    variables,\n    dialect,\n    parserDialect\n  };\n}","import { domify } from 'min-dom';\nimport { camundaBuiltins } from '@camunda/feel-builtins';\n\nexport const domifiedBuiltins = camundaBuiltins.map(builtin => ({\n  ...builtin,\n  info: () => domify(builtin.info),\n}));","import { autocompletion, closeBrackets } from '@codemirror/autocomplete';\nimport { defaultKeymap } from '@codemirror/commands';\nimport { bracketMatching, indentOnInput } from '@codemirror/language';\nimport { setDiagnosticsEffect } from '@codemirror/lint';\nimport { Compartment, EditorState } from '@codemirror/state';\nimport { EditorView, keymap, placeholder as placeholderExt, tooltips } from '@codemirror/view';\n\nimport linter from './lint/index.js';\nimport theme from './theme/index.js';\n\nimport * as Core from './core/index.js';\n\nimport { domifiedBuiltins } from './builtins/index.js';\n\n/**\n * @typedef { import('./core').Variable } Variable\n */\n\n/**\n * @typedef { import('./language').Dialect } Dialect\n * @typedef { import('./language').ParserDialect } ParserDialect\n */\n\nconst coreConf = new Compartment();\nconst placeholderConf = new Compartment();\n\n\n/**\n * Creates a FEEL editor in the supplied container\n *\n * @param {Object} config\n * @param {DOMNode} config.container\n * @param {Extension[]} [config.extensions]\n * @param {Dialect} [config.dialect='expression']\n * @param {ParserDialect} [config.parserDialect]\n * @param {DOMNode|String} [config.tooltipContainer]\n * @param {Function} [config.onChange]\n * @param {(event: KeyboardEvent, view: import('@codemirror/view').EditorView) => boolean | void} [config.onKeyDown]\n * @param {Function} [config.onLint]\n * @param {Boolean} [config.readOnly]\n * @param {String} [config.value]\n * @param {Variable[]} [config.variables]\n * @param {Variable[]} [config.builtins]\n * @param {Object} [config.contentAttributes]\n * @param {String} [config.placeholder]\n */\nexport default function FeelEditor({\n  extensions: editorExtensions = [],\n  dialect = 'expression',\n  parserDialect,\n  container,\n  contentAttributes = {},\n  tooltipContainer,\n  onChange = () => {},\n  onKeyDown = () => {},\n  onLint = () => {},\n  placeholder = '',\n  readOnly = false,\n  value = '',\n  builtins = domifiedBuiltins,\n  variables = []\n}) {\n\n  const changeHandler = EditorView.updateListener.of((update) => {\n    if (update.docChanged) {\n      onChange(update.state.doc.toString());\n    }\n  });\n\n  const lintHandler = EditorView.updateListener.of((update) => {\n    const diagnosticEffects = update.transactions\n      .flatMap(t => t.effects)\n      .filter(effect => effect.is(setDiagnosticsEffect));\n\n    if (!diagnosticEffects.length) {\n      return;\n    }\n\n    const messages = diagnosticEffects.flatMap(effect => effect.value);\n\n    onLint(messages);\n  });\n\n  const keyHandler = EditorView.domEventHandlers(\n    {\n      keydown: onKeyDown\n    }\n  );\n\n  if (typeof tooltipContainer === 'string') {\n    tooltipContainer = /** @type {HTMLElement} */ (document.querySelector(tooltipContainer));\n  }\n\n  const tooltipLayout = tooltipContainer ? tooltips({\n    tooltipSpace: function() {\n      return /** @type {HTMLElement} */ (tooltipContainer).getBoundingClientRect();\n    }\n  }) : [];\n\n  const extensions = [\n    autocompletion(),\n    coreConf.of(Core.configure({\n      dialect,\n      builtins,\n      variables,\n      parserDialect\n    })),\n    bracketMatching(),\n    indentOnInput(),\n    closeBrackets(),\n    EditorView.contentAttributes.of(contentAttributes),\n    changeHandler,\n    keyHandler,\n    keymap.of([\n      ...defaultKeymap,\n    ]),\n    linter,\n    lintHandler,\n    tooltipLayout,\n    placeholderConf.of(placeholderExt(placeholder)),\n    theme,\n    ...editorExtensions\n  ];\n\n  if (readOnly) {\n    extensions.push(EditorView.editable.of(false));\n  }\n\n  this._cmEditor = new EditorView({\n    state: EditorState.create({\n      doc: value,\n      extensions\n    }),\n    parent: container\n  });\n\n  return this;\n}\n\n/**\n * Replaces the content of the Editor\n *\n * @param {String} value\n */\nFeelEditor.prototype.setValue = function(value) {\n  this._cmEditor.dispatch({\n    changes: {\n      from: 0,\n      to: this._cmEditor.state.doc.length,\n      insert: value,\n    }\n  });\n};\n\n/**\n * Sets the focus in the editor.\n */\nFeelEditor.prototype.focus = function(position) {\n  const cmEditor = this._cmEditor;\n\n  // the Codemirror `focus` method always calls `focus` with `preventScroll`,\n  // so we have to focus + scroll manually\n  cmEditor.contentDOM.focus();\n  cmEditor.focus();\n\n  if (typeof position === 'number') {\n    const end = cmEditor.state.doc.length;\n    cmEditor.dispatch({ selection: { anchor: position <= end ? position : end } });\n  }\n};\n\n/**\n * Returns the current selection ranges. If no text is selected, a single\n * range with the start and end index at the cursor position will be returned.\n *\n * @returns {import('@codemirror/state').EditorSelection} selection - Selection object with ranges array\n */\nFeelEditor.prototype.getSelection = function() {\n  return this._cmEditor.state.selection;\n};\n\n/**\n * Set variables to be used for autocompletion.\n *\n * @param {Variable[]} variables\n */\nFeelEditor.prototype.setVariables = function(variables) {\n\n  const config = Core.get(this._cmEditor.state);\n\n  this._cmEditor.dispatch({\n    effects: [\n      coreConf.reconfigure(Core.configure({\n        ...config,\n        variables\n      }))\n    ]\n  });\n};\n\n/**\n * Update placeholder text.\n *\n * @param {string} placeholder\n */\nFeelEditor.prototype.setPlaceholder = function(placeholder) {\n  this._cmEditor.dispatch({\n    effects: placeholderConf.reconfigure(placeholderExt(placeholder))\n  });\n};"]}