@bpmn-io/feel-editor 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -391,9 +391,14 @@ function completions({ variables = [], builtins = [] }) {
391
391
  * @typedef { 'expression' | 'unaryTests' } Dialect
392
392
  */
393
393
 
394
+ /**
395
+ * @typedef { 'camunda' | undefined } ParserDialect
396
+ */
397
+
394
398
  /**
395
399
  * @param { {
396
400
  * dialect?: Dialect,
401
+ * parserDialect?: ParserDialect,
397
402
  * context?: Record<string, any>,
398
403
  * completions?: import('@codemirror/autocomplete').CompletionSource[]
399
404
  * } } options
@@ -409,7 +414,7 @@ function language(options) {
409
414
  *
410
415
  * @return {Record<string, any>}
411
416
  */
412
- function createContext(variables, builtins) {
417
+ function createContext(variables) {
413
418
  return variables.slice().reverse().reduce((context, builtin) => {
414
419
  context[builtin.name] = () => {};
415
420
 
@@ -418,7 +423,8 @@ function createContext(variables, builtins) {
418
423
  }
419
424
 
420
425
  /**
421
- * @typedef { 'expression' | 'unaryTests' } Dialect
426
+ * @typedef { import('../language').Dialect } Dialect
427
+ * @typedef { import('../language').ParserDialect } ParserDialect
422
428
  * @typedef { import('..').Variable } Variable
423
429
  */
424
430
 
@@ -433,10 +439,15 @@ const builtinsFacet = Facet.define();
433
439
  const variablesFacet = Facet.define();
434
440
 
435
441
  /**
436
- * @type {Facet<dialect>}
442
+ * @type {Facet<Dialect>}
437
443
  */
438
444
  const dialectFacet = Facet.define();
439
445
 
446
+ /**
447
+ * @type {Facet<ParserDialect>}
448
+ */
449
+ const parserDialectFacet = Facet.define();
450
+
440
451
  /**
441
452
  * @typedef {object} Variable
442
453
  * @property {string} name name or key of the variable
@@ -451,6 +462,7 @@ const dialectFacet = Facet.define();
451
462
  /**
452
463
  * @typedef { {
453
464
  * dialect?: import('../language').Dialect,
465
+ * parserDialect?: import('../language').ParserDialect,
454
466
  * variables?: Variable[],
455
467
  * builtins?: Variable[]
456
468
  * } } CoreConfig
@@ -466,6 +478,7 @@ const dialectFacet = Facet.define();
466
478
  */
467
479
  function configure({
468
480
  dialect = 'expression',
481
+ parserDialect,
469
482
  variables = [],
470
483
  builtins = [],
471
484
  completions: completions$1 = completions({ builtins, variables })
@@ -477,8 +490,10 @@ function configure({
477
490
  dialectFacet.of(dialect),
478
491
  builtinsFacet.of(builtins),
479
492
  variablesFacet.of(variables),
493
+ parserDialectFacet.of(parserDialect),
480
494
  language({
481
495
  dialect,
496
+ parserDialect,
482
497
  context,
483
498
  completions: completions$1
484
499
  })
@@ -495,11 +510,13 @@ function get(state) {
495
510
  const builtins = state.facet(builtinsFacet)[0];
496
511
  const variables = state.facet(variablesFacet)[0];
497
512
  const dialect = state.facet(dialectFacet)[0];
513
+ const parserDialect = state.facet(parserDialectFacet)[0];
498
514
 
499
515
  return {
500
516
  builtins,
501
517
  variables,
502
- dialect
518
+ dialect,
519
+ parserDialect
503
520
  };
504
521
  }
505
522
 
@@ -554,7 +571,7 @@ var camundaTags = [
554
571
  },
555
572
  {
556
573
  name: "number(from)",
557
- description: "<p>Parses the given string to a number.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">number(from: string): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">number(&quot;1500.5&quot;)\n// 1500.5\n</code></pre>\n"
574
+ description: "<p>Parses the given string to a number.</p>\n<p>Returns <code>null</code> if the string is not a number.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">number(from: string): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">number(&quot;1500.5&quot;)\n// 1500.5\n</code></pre>\n"
558
575
  },
559
576
  {
560
577
  name: "context(entries)",
@@ -562,11 +579,11 @@ var camundaTags = [
562
579
  },
563
580
  {
564
581
  name: "date(from)",
565
- description: "<p>Returns a date from the given value.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(from: string): date\n</code></pre>\n<p>Parses the given string into a date.</p>\n<pre><code class=\"language-feel\">date(from: date and time): date\n</code></pre>\n<p>Extracts the date component from the given date and time.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(&quot;2018-04-29&quot;)\n// date(&quot;2018-04-29&quot;)\n\ndate(date and time(&quot;2012-12-25T11:00:00&quot;))\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
582
+ description: "<p>Returns a date from the given value.</p>\n<p>Returns <code>null</code> if the string is not a valid calendar date. For example, <code>&quot;2024-06-31&quot;</code> is invalid because June has\nonly 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(from: string): date\n</code></pre>\n<p>Parses the given string into a date.</p>\n<pre><code class=\"language-feel\">date(from: date and time): date\n</code></pre>\n<p>Extracts the date component from the given date and time.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(&quot;2018-04-29&quot;)\n// date(&quot;2018-04-29&quot;)\n\ndate(date and time(&quot;2012-12-25T11:00:00&quot;))\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
566
583
  },
567
584
  {
568
585
  name: "date(year, month, day)",
569
- description: "<p>Returns a date from the given components.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(year: number, month: number, day: number): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(2012, 12, 25)\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
586
+ description: "<p>Returns a date from the given components.</p>\n<p>Returns <code>null</code> if the components don&#39;t represent a valid calendar date. For example, <code>2024,6,31</code> is invalid because\nJune has only 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(year: number, month: number, day: number): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(2012, 12, 25)\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
570
587
  },
571
588
  {
572
589
  name: "time(from)",
@@ -582,7 +599,7 @@ var camundaTags = [
582
599
  },
583
600
  {
584
601
  name: "date and time(from)",
585
- description: "<p>Parses the given string into a date and time.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date and time(from: string): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date and time(&quot;2018-04-29T09:30:00&quot;)\n// date and time(&quot;2018-04-29T09:30:00&quot;)\n</code></pre>\n"
602
+ description: "<p>Parses the given string into a date and time.</p>\n<p>Returns <code>null</code> if the string is not a valid calendar date. For example, <code>&quot;2024-06-31T10:00:00&quot;</code> is invalid because\nJune has only 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date and time(from: string): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date and time(&quot;2018-04-29T09:30:00&quot;)\n// date and time(&quot;2018-04-29T09:30:00&quot;)\n</code></pre>\n"
586
603
  },
587
604
  {
588
605
  name: "date and time(date, time)",
@@ -712,6 +729,14 @@ var camundaTags = [
712
729
  name: "string join(list, delimiter, prefix, suffix)",
713
730
  description: "<p><em>Camunda Extension</em></p>\n<p>Joins a list of strings into a single string. This is similar to\nJava&#39;s <a href=\"https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Collectors.html#joining(java.lang.CharSequence,java.lang.CharSequence,java.lang.CharSequence)\">joining</a>\nfunction.</p>\n<p>If an item of the list is <code>null</code>, the item is ignored for the result string. If an item is\nneither a string nor <code>null</code>, the function returns <code>null</code> instead of a string.</p>\n<p>The resulting string starts with <code>prefix</code>, contains a <code>delimiter</code> between each element, and ends\nwith <code>suffix</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">string join(list: list&lt;string&gt;, delimiter: string, prefix: string, suffix: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">string join([&quot;a&quot;,&quot;b&quot;,&quot;c&quot;], &quot;, &quot;, &quot;[&quot;, &quot;]&quot;)\n// &quot;[a, b, c]&quot;\n</code></pre>\n"
714
731
  },
732
+ {
733
+ name: "is empty(list)",
734
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns <code>true</code> if the given list is empty. Otherwise, returns <code>false</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is empty(list: list): boolean\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is empty([])\n// true\n\nis empty([1,2,3])\n// false\n</code></pre>\n"
735
+ },
736
+ {
737
+ name: "partition(list, size)",
738
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns consecutive sublists of a list, each of the same size (the final list may be smaller).</p>\n<p>If <code>size</code> is less than <code>0</code>, it returns <code>null</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">partition(list: list, size: number): list\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">partition([1,2,3,4,5], 2)\n// [[1,2], [3,4], [5]]\n\npartition([], 2)\n// []\n\npartition([1,2], 0)\n// null\n</code></pre>\n"
739
+ },
715
740
  {
716
741
  name: "decimal(n, scale)",
717
742
  description: "<p>Rounds the given value at the given scale.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">decimal(n: number, scale: number): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">decimal(1/3, 2)\n// .33\n\ndecimal(1.5, 0)\n// 2\n</code></pre>\n"
@@ -890,11 +915,11 @@ var camundaTags = [
890
915
  },
891
916
  {
892
917
  name: "substring(string, start position)",
893
- description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3)\n// &quot;obar&quot;\n</code></pre>\n"
918
+ description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3)\n// &quot;obar&quot;\n\nsubstring(&quot;foobar&quot;, -2)\n// &quot;ar&quot;\n</code></pre>\n"
894
919
  },
895
920
  {
896
921
  name: "substring(string, start position, length)",
897
- description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number, length: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3, 3)\n// &quot;oba&quot;\n</code></pre>\n"
922
+ description: "<p>Returns a substring of the given value, starting at <code>start position</code> with the given <code>length</code>. If <code>length</code> is greater than\nthe remaining characters of the value, it returns all characters from <code>start position</code> until the end.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number, length: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3, 3)\n// &quot;oba&quot;\n\nsubstring(&quot;foobar&quot;, -3, 2)\n// &quot;ba&quot;\n\nsubstring(&quot;foobar&quot;, 3, 10)\n// &quot;obar&quot;\n</code></pre>\n"
898
923
  },
899
924
  {
900
925
  name: "string length(string)",
@@ -952,6 +977,22 @@ var camundaTags = [
952
977
  name: "extract(string, pattern)",
953
978
  description: "<p><em>Camunda Extension</em></p>\n<p>Returns all matches of the pattern in the given string. Returns an empty list if the pattern doesn&#39;t\nmatch.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">extract(string: string, pattern: string): list&lt;string&gt;\n</code></pre>\n<p>The <code>pattern</code> is a string that contains a regular expression.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">extract(&quot;references are 1234, 1256, 1378&quot;, &quot;12[0-9]*&quot;)\n// [&quot;1234&quot;,&quot;1256&quot;]\n</code></pre>\n"
954
979
  },
980
+ {
981
+ name: "trim(string)",
982
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string without leading and trailing spaces.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">trim(string: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">trim(&quot; hello world &quot;)\n// &quot;hello world&quot;\n\ntrim(&quot;hello world &quot;)\n// &quot;hello world&quot;\n</code></pre>\n"
983
+ },
984
+ {
985
+ name: "uuid()",
986
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns a UUID (Universally Unique Identifier) with 36 characters.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">uuid(): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">uuid()\n// &quot;7793aab1-d761-4d38-916b-b7270e309894&quot;\n</code></pre>\n"
987
+ },
988
+ {
989
+ name: "to base64(value)",
990
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string encoded in Base64 format.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">to base64(value: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">to base64(&quot;FEEL&quot;)\n// &quot;RkVFTA==&quot;\n</code></pre>\n"
991
+ },
992
+ {
993
+ name: "is blank(string)",
994
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns <code>true</code> if the given string is blank (empty or contains only whitespaces).</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is blank(string: string): boolean\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is blank(&quot;&quot;)\n// true\n\nis blank(&quot; &quot;)\n// true\n\nis blank(&quot;hello world&quot;)\n// false\n</code></pre>\n"
995
+ },
955
996
  {
956
997
  name: "now()",
957
998
  description: "<p>Returns the current date and time including the timezone.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">now(): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">now()\n// date and time(&quot;2020-07-31T14:27:30@Europe/Berlin&quot;)\n</code></pre>\n"
@@ -983,22 +1024,6 @@ var camundaTags = [
983
1024
  {
984
1025
  name: "last day of month(date)",
985
1026
  description: "<p><em>Camunda Extension</em></p>\n<p>Takes the month of the given date or date-time value and returns the last day of this month.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">last day of month(date: date): date\n</code></pre>\n<pre><code class=\"language-feel\">last day of month(date: date and time): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">last day of month(date(&quot;2022-10-01&quot;))\n// date(&quot;2022-10-31&quot;))\n\nlast day of month(date and time(&quot;2022-10-16T12:00:00&quot;))\n// date(&quot;2022-10-31&quot;))\n</code></pre>\n"
986
- },
987
- {
988
- name: "is empty(list)",
989
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns true if the given list is empty. Otherwise, returns false.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is empty(list: list): boolean</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is empty([])\n// true\n\nis empty([1,2,3])\n// false\n</code></pre>"
990
- },
991
- {
992
- name: "trim(string)",
993
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string without leading and trailing spaces.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">trim(string: string): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">trim(\" hello world \")\n// \"hello world\"\n\ntrim(\"hello world \")\n// \"hello world\"\n</code></pre>"
994
- },
995
- {
996
- name: "uuid()",
997
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns a UUID (Universally Unique Identifier) with 36 characters.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">uuid(): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">uuid()\n// \"7793aab1-d761-4d38-916b-b7270e309894\"\n</code></pre>"
998
- },
999
- {
1000
- name: "to base64(string)",
1001
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string encoded in Base64 format.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">to base64(value: string): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">to base64(\"FEEL\")\n// \"RkVFTA==\"\n</code></pre>"
1002
1027
  }
1003
1028
  ];
1004
1029
 
@@ -1027,7 +1052,8 @@ function parseBuiltin(builtin) {
1027
1052
  const functionName = match[1];
1028
1053
  const functionArguments = match[2];
1029
1054
 
1030
- const params = functionArguments.split(', ').map(name => ({ name }));
1055
+ // parameterless function matches as empty string
1056
+ const params = functionArguments ? functionArguments.split(', ').map(name => ({ name })) : [];
1031
1057
 
1032
1058
  return {
1033
1059
  name: functionName,
@@ -1046,6 +1072,11 @@ const camunda = parseBuiltins(camundaTags);
1046
1072
  * @typedef { import('./core').Variable } Variable
1047
1073
  */
1048
1074
 
1075
+ /**
1076
+ * @typedef { import('./language').Dialect } Dialect
1077
+ * @typedef { import('./language').ParserDialect } ParserDialect
1078
+ */
1079
+
1049
1080
  /**
1050
1081
  * @typedef {object} Builtin
1051
1082
  * @property {string} name
@@ -1063,6 +1094,7 @@ const placeholderConf = new Compartment();
1063
1094
  * @param {DOMNode} config.container
1064
1095
  * @param {Extension[]} [config.extensions]
1065
1096
  * @param {Dialect} [config.dialect='expression']
1097
+ * @param {ParserDialect} [config.parserDialect]
1066
1098
  * @param {DOMNode|String} [config.tooltipContainer]
1067
1099
  * @param {Function} [config.onChange]
1068
1100
  * @param {Function} [config.onKeyDown]
@@ -1071,12 +1103,11 @@ const placeholderConf = new Compartment();
1071
1103
  * @param {String} [config.value]
1072
1104
  * @param {Variable[]} [config.variables]
1073
1105
  * @param {Variable[]} [config.builtins]
1074
- *
1075
- * @returns {Object} editor
1076
1106
  */
1077
1107
  function FeelEditor({
1078
1108
  extensions: editorExtensions = [],
1079
1109
  dialect = 'expression',
1110
+ parserDialect,
1080
1111
  container,
1081
1112
  contentAttributes = {},
1082
1113
  tooltipContainer,
@@ -1131,7 +1162,8 @@ function FeelEditor({
1131
1162
  coreConf.of(configure({
1132
1163
  dialect,
1133
1164
  builtins,
1134
- variables
1165
+ variables,
1166
+ parserDialect
1135
1167
  })),
1136
1168
  bracketMatching(),
1137
1169
  indentOnInput(),
@@ -1215,16 +1247,12 @@ FeelEditor.prototype.getSelection = function() {
1215
1247
  */
1216
1248
  FeelEditor.prototype.setVariables = function(variables) {
1217
1249
 
1218
- const {
1219
- dialect,
1220
- builtins
1221
- } = get(this._cmEditor.state);
1250
+ const config = get(this._cmEditor.state);
1222
1251
 
1223
1252
  this._cmEditor.dispatch({
1224
1253
  effects: [
1225
1254
  coreConf.reconfigure(configure({
1226
- dialect,
1227
- builtins,
1255
+ ...config,
1228
1256
  variables
1229
1257
  }))
1230
1258
  ]
package/dist/index.js CHANGED
@@ -393,9 +393,14 @@ function completions({ variables = [], builtins = [] }) {
393
393
  * @typedef { 'expression' | 'unaryTests' } Dialect
394
394
  */
395
395
 
396
+ /**
397
+ * @typedef { 'camunda' | undefined } ParserDialect
398
+ */
399
+
396
400
  /**
397
401
  * @param { {
398
402
  * dialect?: Dialect,
403
+ * parserDialect?: ParserDialect,
399
404
  * context?: Record<string, any>,
400
405
  * completions?: import('@codemirror/autocomplete').CompletionSource[]
401
406
  * } } options
@@ -411,7 +416,7 @@ function language(options) {
411
416
  *
412
417
  * @return {Record<string, any>}
413
418
  */
414
- function createContext(variables, builtins) {
419
+ function createContext(variables) {
415
420
  return variables.slice().reverse().reduce((context, builtin) => {
416
421
  context[builtin.name] = () => {};
417
422
 
@@ -420,7 +425,8 @@ function createContext(variables, builtins) {
420
425
  }
421
426
 
422
427
  /**
423
- * @typedef { 'expression' | 'unaryTests' } Dialect
428
+ * @typedef { import('../language').Dialect } Dialect
429
+ * @typedef { import('../language').ParserDialect } ParserDialect
424
430
  * @typedef { import('..').Variable } Variable
425
431
  */
426
432
 
@@ -435,10 +441,15 @@ const builtinsFacet = state.Facet.define();
435
441
  const variablesFacet = state.Facet.define();
436
442
 
437
443
  /**
438
- * @type {Facet<dialect>}
444
+ * @type {Facet<Dialect>}
439
445
  */
440
446
  const dialectFacet = state.Facet.define();
441
447
 
448
+ /**
449
+ * @type {Facet<ParserDialect>}
450
+ */
451
+ const parserDialectFacet = state.Facet.define();
452
+
442
453
  /**
443
454
  * @typedef {object} Variable
444
455
  * @property {string} name name or key of the variable
@@ -453,6 +464,7 @@ const dialectFacet = state.Facet.define();
453
464
  /**
454
465
  * @typedef { {
455
466
  * dialect?: import('../language').Dialect,
467
+ * parserDialect?: import('../language').ParserDialect,
456
468
  * variables?: Variable[],
457
469
  * builtins?: Variable[]
458
470
  * } } CoreConfig
@@ -468,6 +480,7 @@ const dialectFacet = state.Facet.define();
468
480
  */
469
481
  function configure({
470
482
  dialect = 'expression',
483
+ parserDialect,
471
484
  variables = [],
472
485
  builtins = [],
473
486
  completions: completions$1 = completions({ builtins, variables })
@@ -479,8 +492,10 @@ function configure({
479
492
  dialectFacet.of(dialect),
480
493
  builtinsFacet.of(builtins),
481
494
  variablesFacet.of(variables),
495
+ parserDialectFacet.of(parserDialect),
482
496
  language({
483
497
  dialect,
498
+ parserDialect,
484
499
  context,
485
500
  completions: completions$1
486
501
  })
@@ -497,11 +512,13 @@ function get(state) {
497
512
  const builtins = state.facet(builtinsFacet)[0];
498
513
  const variables = state.facet(variablesFacet)[0];
499
514
  const dialect = state.facet(dialectFacet)[0];
515
+ const parserDialect = state.facet(parserDialectFacet)[0];
500
516
 
501
517
  return {
502
518
  builtins,
503
519
  variables,
504
- dialect
520
+ dialect,
521
+ parserDialect
505
522
  };
506
523
  }
507
524
 
@@ -556,7 +573,7 @@ var camundaTags = [
556
573
  },
557
574
  {
558
575
  name: "number(from)",
559
- description: "<p>Parses the given string to a number.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">number(from: string): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">number(&quot;1500.5&quot;)\n// 1500.5\n</code></pre>\n"
576
+ description: "<p>Parses the given string to a number.</p>\n<p>Returns <code>null</code> if the string is not a number.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">number(from: string): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">number(&quot;1500.5&quot;)\n// 1500.5\n</code></pre>\n"
560
577
  },
561
578
  {
562
579
  name: "context(entries)",
@@ -564,11 +581,11 @@ var camundaTags = [
564
581
  },
565
582
  {
566
583
  name: "date(from)",
567
- description: "<p>Returns a date from the given value.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(from: string): date\n</code></pre>\n<p>Parses the given string into a date.</p>\n<pre><code class=\"language-feel\">date(from: date and time): date\n</code></pre>\n<p>Extracts the date component from the given date and time.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(&quot;2018-04-29&quot;)\n// date(&quot;2018-04-29&quot;)\n\ndate(date and time(&quot;2012-12-25T11:00:00&quot;))\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
584
+ description: "<p>Returns a date from the given value.</p>\n<p>Returns <code>null</code> if the string is not a valid calendar date. For example, <code>&quot;2024-06-31&quot;</code> is invalid because June has\nonly 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(from: string): date\n</code></pre>\n<p>Parses the given string into a date.</p>\n<pre><code class=\"language-feel\">date(from: date and time): date\n</code></pre>\n<p>Extracts the date component from the given date and time.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(&quot;2018-04-29&quot;)\n// date(&quot;2018-04-29&quot;)\n\ndate(date and time(&quot;2012-12-25T11:00:00&quot;))\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
568
585
  },
569
586
  {
570
587
  name: "date(year, month, day)",
571
- description: "<p>Returns a date from the given components.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(year: number, month: number, day: number): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(2012, 12, 25)\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
588
+ description: "<p>Returns a date from the given components.</p>\n<p>Returns <code>null</code> if the components don&#39;t represent a valid calendar date. For example, <code>2024,6,31</code> is invalid because\nJune has only 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date(year: number, month: number, day: number): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date(2012, 12, 25)\n// date(&quot;2012-12-25&quot;)\n</code></pre>\n"
572
589
  },
573
590
  {
574
591
  name: "time(from)",
@@ -584,7 +601,7 @@ var camundaTags = [
584
601
  },
585
602
  {
586
603
  name: "date and time(from)",
587
- description: "<p>Parses the given string into a date and time.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date and time(from: string): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date and time(&quot;2018-04-29T09:30:00&quot;)\n// date and time(&quot;2018-04-29T09:30:00&quot;)\n</code></pre>\n"
604
+ description: "<p>Parses the given string into a date and time.</p>\n<p>Returns <code>null</code> if the string is not a valid calendar date. For example, <code>&quot;2024-06-31T10:00:00&quot;</code> is invalid because\nJune has only 30 days.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">date and time(from: string): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">date and time(&quot;2018-04-29T09:30:00&quot;)\n// date and time(&quot;2018-04-29T09:30:00&quot;)\n</code></pre>\n"
588
605
  },
589
606
  {
590
607
  name: "date and time(date, time)",
@@ -714,6 +731,14 @@ var camundaTags = [
714
731
  name: "string join(list, delimiter, prefix, suffix)",
715
732
  description: "<p><em>Camunda Extension</em></p>\n<p>Joins a list of strings into a single string. This is similar to\nJava&#39;s <a href=\"https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Collectors.html#joining(java.lang.CharSequence,java.lang.CharSequence,java.lang.CharSequence)\">joining</a>\nfunction.</p>\n<p>If an item of the list is <code>null</code>, the item is ignored for the result string. If an item is\nneither a string nor <code>null</code>, the function returns <code>null</code> instead of a string.</p>\n<p>The resulting string starts with <code>prefix</code>, contains a <code>delimiter</code> between each element, and ends\nwith <code>suffix</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">string join(list: list&lt;string&gt;, delimiter: string, prefix: string, suffix: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">string join([&quot;a&quot;,&quot;b&quot;,&quot;c&quot;], &quot;, &quot;, &quot;[&quot;, &quot;]&quot;)\n// &quot;[a, b, c]&quot;\n</code></pre>\n"
716
733
  },
734
+ {
735
+ name: "is empty(list)",
736
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns <code>true</code> if the given list is empty. Otherwise, returns <code>false</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is empty(list: list): boolean\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is empty([])\n// true\n\nis empty([1,2,3])\n// false\n</code></pre>\n"
737
+ },
738
+ {
739
+ name: "partition(list, size)",
740
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns consecutive sublists of a list, each of the same size (the final list may be smaller).</p>\n<p>If <code>size</code> is less than <code>0</code>, it returns <code>null</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">partition(list: list, size: number): list\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">partition([1,2,3,4,5], 2)\n// [[1,2], [3,4], [5]]\n\npartition([], 2)\n// []\n\npartition([1,2], 0)\n// null\n</code></pre>\n"
741
+ },
717
742
  {
718
743
  name: "decimal(n, scale)",
719
744
  description: "<p>Rounds the given value at the given scale.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">decimal(n: number, scale: number): number\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">decimal(1/3, 2)\n// .33\n\ndecimal(1.5, 0)\n// 2\n</code></pre>\n"
@@ -892,11 +917,11 @@ var camundaTags = [
892
917
  },
893
918
  {
894
919
  name: "substring(string, start position)",
895
- description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3)\n// &quot;obar&quot;\n</code></pre>\n"
920
+ description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3)\n// &quot;obar&quot;\n\nsubstring(&quot;foobar&quot;, -2)\n// &quot;ar&quot;\n</code></pre>\n"
896
921
  },
897
922
  {
898
923
  name: "substring(string, start position, length)",
899
- description: "<p>Returns a substring of the given value starting at <code>start position</code>.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number, length: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3, 3)\n// &quot;oba&quot;\n</code></pre>\n"
924
+ description: "<p>Returns a substring of the given value, starting at <code>start position</code> with the given <code>length</code>. If <code>length</code> is greater than\nthe remaining characters of the value, it returns all characters from <code>start position</code> until the end.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">substring(string: string, start position: number, length: number): string\n</code></pre>\n<p>The <code>start position</code> starts at the index <code>1</code>. The last position is <code>-1</code>.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">substring(&quot;foobar&quot;, 3, 3)\n// &quot;oba&quot;\n\nsubstring(&quot;foobar&quot;, -3, 2)\n// &quot;ba&quot;\n\nsubstring(&quot;foobar&quot;, 3, 10)\n// &quot;obar&quot;\n</code></pre>\n"
900
925
  },
901
926
  {
902
927
  name: "string length(string)",
@@ -954,6 +979,22 @@ var camundaTags = [
954
979
  name: "extract(string, pattern)",
955
980
  description: "<p><em>Camunda Extension</em></p>\n<p>Returns all matches of the pattern in the given string. Returns an empty list if the pattern doesn&#39;t\nmatch.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">extract(string: string, pattern: string): list&lt;string&gt;\n</code></pre>\n<p>The <code>pattern</code> is a string that contains a regular expression.</p>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">extract(&quot;references are 1234, 1256, 1378&quot;, &quot;12[0-9]*&quot;)\n// [&quot;1234&quot;,&quot;1256&quot;]\n</code></pre>\n"
956
981
  },
982
+ {
983
+ name: "trim(string)",
984
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string without leading and trailing spaces.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">trim(string: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">trim(&quot; hello world &quot;)\n// &quot;hello world&quot;\n\ntrim(&quot;hello world &quot;)\n// &quot;hello world&quot;\n</code></pre>\n"
985
+ },
986
+ {
987
+ name: "uuid()",
988
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns a UUID (Universally Unique Identifier) with 36 characters.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">uuid(): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">uuid()\n// &quot;7793aab1-d761-4d38-916b-b7270e309894&quot;\n</code></pre>\n"
989
+ },
990
+ {
991
+ name: "to base64(value)",
992
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string encoded in Base64 format.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">to base64(value: string): string\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">to base64(&quot;FEEL&quot;)\n// &quot;RkVFTA==&quot;\n</code></pre>\n"
993
+ },
994
+ {
995
+ name: "is blank(string)",
996
+ description: "<p><em>Camunda Extension</em></p>\n<p>Returns <code>true</code> if the given string is blank (empty or contains only whitespaces).</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is blank(string: string): boolean\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is blank(&quot;&quot;)\n// true\n\nis blank(&quot; &quot;)\n// true\n\nis blank(&quot;hello world&quot;)\n// false\n</code></pre>\n"
997
+ },
957
998
  {
958
999
  name: "now()",
959
1000
  description: "<p>Returns the current date and time including the timezone.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">now(): date and time\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">now()\n// date and time(&quot;2020-07-31T14:27:30@Europe/Berlin&quot;)\n</code></pre>\n"
@@ -985,22 +1026,6 @@ var camundaTags = [
985
1026
  {
986
1027
  name: "last day of month(date)",
987
1028
  description: "<p><em>Camunda Extension</em></p>\n<p>Takes the month of the given date or date-time value and returns the last day of this month.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">last day of month(date: date): date\n</code></pre>\n<pre><code class=\"language-feel\">last day of month(date: date and time): date\n</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">last day of month(date(&quot;2022-10-01&quot;))\n// date(&quot;2022-10-31&quot;))\n\nlast day of month(date and time(&quot;2022-10-16T12:00:00&quot;))\n// date(&quot;2022-10-31&quot;))\n</code></pre>\n"
988
- },
989
- {
990
- name: "is empty(list)",
991
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns true if the given list is empty. Otherwise, returns false.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">is empty(list: list): boolean</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">is empty([])\n// true\n\nis empty([1,2,3])\n// false\n</code></pre>"
992
- },
993
- {
994
- name: "trim(string)",
995
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string without leading and trailing spaces.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">trim(string: string): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">trim(\" hello world \")\n// \"hello world\"\n\ntrim(\"hello world \")\n// \"hello world\"\n</code></pre>"
996
- },
997
- {
998
- name: "uuid()",
999
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns a UUID (Universally Unique Identifier) with 36 characters.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">uuid(): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">uuid()\n// \"7793aab1-d761-4d38-916b-b7270e309894\"\n</code></pre>"
1000
- },
1001
- {
1002
- name: "to base64(string)",
1003
- description: "<p><em>Camunda Extension</em></p>\n<p>Returns the given string encoded in Base64 format.</p>\n<p><strong>Function signature</strong></p>\n<pre><code class=\"language-feel\">to base64(value: string): string</code></pre>\n<p><strong>Examples</strong></p>\n<pre><code class=\"language-feel\">to base64(\"FEEL\")\n// \"RkVFTA==\"\n</code></pre>"
1004
1029
  }
1005
1030
  ];
1006
1031
 
@@ -1029,7 +1054,8 @@ function parseBuiltin(builtin) {
1029
1054
  const functionName = match[1];
1030
1055
  const functionArguments = match[2];
1031
1056
 
1032
- const params = functionArguments.split(', ').map(name => ({ name }));
1057
+ // parameterless function matches as empty string
1058
+ const params = functionArguments ? functionArguments.split(', ').map(name => ({ name })) : [];
1033
1059
 
1034
1060
  return {
1035
1061
  name: functionName,
@@ -1048,6 +1074,11 @@ const camunda = parseBuiltins(camundaTags);
1048
1074
  * @typedef { import('./core').Variable } Variable
1049
1075
  */
1050
1076
 
1077
+ /**
1078
+ * @typedef { import('./language').Dialect } Dialect
1079
+ * @typedef { import('./language').ParserDialect } ParserDialect
1080
+ */
1081
+
1051
1082
  /**
1052
1083
  * @typedef {object} Builtin
1053
1084
  * @property {string} name
@@ -1065,6 +1096,7 @@ const placeholderConf = new state.Compartment();
1065
1096
  * @param {DOMNode} config.container
1066
1097
  * @param {Extension[]} [config.extensions]
1067
1098
  * @param {Dialect} [config.dialect='expression']
1099
+ * @param {ParserDialect} [config.parserDialect]
1068
1100
  * @param {DOMNode|String} [config.tooltipContainer]
1069
1101
  * @param {Function} [config.onChange]
1070
1102
  * @param {Function} [config.onKeyDown]
@@ -1073,12 +1105,11 @@ const placeholderConf = new state.Compartment();
1073
1105
  * @param {String} [config.value]
1074
1106
  * @param {Variable[]} [config.variables]
1075
1107
  * @param {Variable[]} [config.builtins]
1076
- *
1077
- * @returns {Object} editor
1078
1108
  */
1079
1109
  function FeelEditor({
1080
1110
  extensions: editorExtensions = [],
1081
1111
  dialect = 'expression',
1112
+ parserDialect,
1082
1113
  container,
1083
1114
  contentAttributes = {},
1084
1115
  tooltipContainer,
@@ -1133,7 +1164,8 @@ function FeelEditor({
1133
1164
  coreConf.of(configure({
1134
1165
  dialect,
1135
1166
  builtins,
1136
- variables
1167
+ variables,
1168
+ parserDialect
1137
1169
  })),
1138
1170
  language$1.bracketMatching(),
1139
1171
  language$1.indentOnInput(),
@@ -1217,16 +1249,12 @@ FeelEditor.prototype.getSelection = function() {
1217
1249
  */
1218
1250
  FeelEditor.prototype.setVariables = function(variables) {
1219
1251
 
1220
- const {
1221
- dialect,
1222
- builtins
1223
- } = get(this._cmEditor.state);
1252
+ const config = get(this._cmEditor.state);
1224
1253
 
1225
1254
  this._cmEditor.dispatch({
1226
1255
  effects: [
1227
1256
  coreConf.reconfigure(configure({
1228
- dialect,
1229
- builtins,
1257
+ ...config,
1230
1258
  variables
1231
1259
  }))
1232
1260
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bpmn-io/feel-editor",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "description": "Editor for FEEL expressions.",
5
5
  "files": [
6
6
  "dist"
@@ -17,6 +17,7 @@
17
17
  "lint": "eslint .",
18
18
  "pull:platform-docs": "git -C camunda-platform-docs pull || git clone git@github.com:camunda/camunda-platform-docs.git camunda-platform-docs",
19
19
  "start": "cross-env SINGLE_START=true npm run dev",
20
+ "start:camunda": "cross-env SINGLE_START=camunda npm run dev",
20
21
  "dev": "npm test -- --auto-watch --no-single-run",
21
22
  "prepare": "run-s build"
22
23
  },
@@ -47,31 +48,31 @@
47
48
  ],
48
49
  "license": "MIT",
49
50
  "dependencies": {
50
- "@bpmn-io/feel-lint": "^1.3.0",
51
+ "@bpmn-io/feel-lint": "^1.4.0",
51
52
  "@codemirror/autocomplete": "^6.16.2",
52
- "@codemirror/commands": "^6.6.0",
53
+ "@codemirror/commands": "^6.8.0",
53
54
  "@codemirror/language": "^6.10.2",
54
- "@codemirror/lint": "^6.8.0",
55
- "@codemirror/state": "^6.4.1",
56
- "@codemirror/view": "^6.28.1",
57
- "@lezer/highlight": "^1.2.0",
58
- "lang-feel": "^2.1.1",
55
+ "@codemirror/lint": "^6.8.4",
56
+ "@codemirror/state": "^6.5.1",
57
+ "@codemirror/view": "^6.36.2",
58
+ "@lezer/highlight": "^1.2.1",
59
+ "lang-feel": "^2.3.0",
59
60
  "min-dom": "^4.2.1"
60
61
  },
61
62
  "devDependencies": {
62
- "@babel/core": "^7.24.6",
63
- "@rollup/plugin-commonjs": "^25.0.8",
63
+ "@babel/core": "^7.26.0",
64
+ "@rollup/plugin-commonjs": "^28.0.2",
64
65
  "@rollup/plugin-json": "^6.1.0",
65
- "@testing-library/dom": "^9.3.4",
66
- "@testing-library/user-event": "^14.5.2",
67
- "babel-loader": "^9.1.3",
68
- "babel-plugin-istanbul": "^6.1.1",
69
- "chai": "^4.4.1",
66
+ "@testing-library/dom": "^10.4.0",
67
+ "@testing-library/user-event": "^14.6.1",
68
+ "babel-loader": "^9.2.1",
69
+ "babel-plugin-istanbul": "^7.0.0",
70
+ "chai": "^4.5.0",
70
71
  "cross-env": "^7.0.3",
71
72
  "eslint": "^8.57.0",
72
73
  "eslint-plugin-bpmn-io": "^1.0.0",
73
- "glob": "^10.4.1",
74
- "karma": "^6.4.3",
74
+ "glob": "^11.0.1",
75
+ "karma": "^6.4.4",
75
76
  "karma-chrome-launcher": "^3.2.0",
76
77
  "karma-coverage": "^2.2.1",
77
78
  "karma-debug-launcher": "^0.0.5",
@@ -80,14 +81,14 @@
80
81
  "karma-mocha": "^2.0.1",
81
82
  "karma-sinon-chai": "^2.0.2",
82
83
  "karma-webpack": "^5.0.1",
83
- "marked": "^9.1.2",
84
- "mocha": "^10.4.0",
84
+ "marked": "^9.1.6",
85
+ "mocha": "^10.8.2",
85
86
  "mocha-test-container-support": "^0.2.0",
86
87
  "npm-run-all": "^4.1.5",
87
88
  "puppeteer": "^23.1.1",
88
- "rollup": "^4.18.0",
89
+ "rollup": "^4.31.0",
89
90
  "sinon": "^17.0.1",
90
91
  "sinon-chai": "^3.7.0",
91
- "webpack": "^5.91.0"
92
+ "webpack": "^5.97.1"
92
93
  }
93
94
  }