@wildwinter/expr-editor 0.14.1 → 0.15.1

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.d.cts CHANGED
@@ -56,6 +56,12 @@ declare const findEnumPeer: typeof findChoicePeer;
56
56
  /** A name-form ref in ONE form, so two spellings of the same property compare equal: the default
57
57
  * scope may be written or left off (`@patter.debt` and `@debt`), and refs are case-insensitive. */
58
58
  declare const normaliseRef: (ref: string, defaultScope: string) => string;
59
+ /** The set/clear-a-flag value: `set_flags(@scope.name, +flag)` - adjust one
60
+ * flag, keep the rest, which is what outcomes on a flags property
61
+ * overwhelmingly do (and the form a whole-value change cannot express).
62
+ * Lives here with the other pure ref helpers so the value wizard can build
63
+ * it without importing the effects mount (which imports the wizard). */
64
+ declare const flagChangeSrc: (targetRef: string, sign: "+" | "-", flag: string) => string;
59
65
  /** The name-form ref a call ADVANCES, when the call is the plain `advance(@x)` shape: one scopedvar
60
66
  * argument and nothing else. Null for any other call, and for an argument that is not a property
61
67
  * (`advance(f(@x))` keeps its explicit form, since collapsing it would hide the middle).
@@ -183,11 +189,21 @@ interface Filter {
183
189
  acceptTypes?: PropertyType[];
184
190
  acceptScopes?: string[];
185
191
  }
186
- /** The reference string for an entry: `@name` for the default scope, else `@scope.name`. */
192
+ /** The reference string for an entry: `@name` for the default scope, else `@scope.name`.
193
+ * CONDITION-side sugar only: a change TARGET must use {@link targetRefOf} - the storylets
194
+ * compiler requires `@scope.name` there, and emitting this shorthand for a default-scope
195
+ * target made every picker-authored change invalid (the Storyletter antagonist audit's
196
+ * find, 2026-08-29). Patter's grammar takes both forms, so the split costs it nothing. */
187
197
  declare const refOf: (e: {
188
198
  scope: string;
189
199
  name: string;
190
200
  }, defaultScope: string) => string;
201
+ /** The reference a change TARGET is written as: always fully qualified. A target is a
202
+ * reference, not an expression, and the shorthand is condition-side sugar (see refOf). */
203
+ declare const targetRefOf: (e: {
204
+ scope: string;
205
+ name: string;
206
+ }) => string;
191
207
  /** The label shown in the picker / on a property pill. */
192
208
  declare const displayName: (e: {
193
209
  scope: string;
@@ -529,6 +545,13 @@ interface ValueWizardOptions {
529
545
  expectedChoices?: string[];
530
546
  /** @deprecated Use `expectedChoices`. Kept so a 0.11.x caller keeps working. */
531
547
  expectedEnumValues?: string[];
548
+ /** A FLAGS target's qualified ref and declared flags: together they unlock the
549
+ * set/clear-a-flag step, which is what outcomes on a flags property
550
+ * overwhelmingly want and which a whole-value change cannot express (the
551
+ * Storyletter antagonist audit's find, 2026-08-29). Absent, the generic
552
+ * kinds stand alone as before. */
553
+ expectedRef?: string;
554
+ expectedFlags?: string[];
532
555
  /** Receives the chosen value as name-form source. */
533
556
  onCommit: (src: string) => void;
534
557
  /** Optional cancel (the ✕ on the step). */
@@ -537,4 +560,4 @@ interface ValueWizardOptions {
537
560
  /** Build the wizard UI into a fresh element (drive it via the host's popover). */
538
561
  declare function valueWizard(opts: ValueWizardOptions): HTMLElement;
539
562
 
540
- export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, type CatalogueEntry, EQUALITY_OPS, type EditCtx, type EditorEffect, type EffectsEditorHandle, type EffectsEditorOptions, type ExpressionEditorHandle, type ExpressionEditorOptions, type Filter, type FunctionTemplateSpec, OP_WORD, type PreviewOptions, type TreeRow, UNARY_LABEL, type Validation, type ValueWizardOptions, type WizardSpec, type WizardStepSpec, type WizardValue, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
563
+ export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, type CatalogueEntry, EQUALITY_OPS, type EditCtx, type EditorEffect, type EffectsEditorHandle, type EffectsEditorOptions, type ExpressionEditorHandle, type ExpressionEditorOptions, type Filter, type FunctionTemplateSpec, OP_WORD, type PreviewOptions, type TreeRow, UNARY_LABEL, type Validation, type ValueWizardOptions, type WizardSpec, type WizardStepSpec, type WizardValue, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagChangeSrc, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, targetRefOf, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
package/dist/index.d.ts CHANGED
@@ -56,6 +56,12 @@ declare const findEnumPeer: typeof findChoicePeer;
56
56
  /** A name-form ref in ONE form, so two spellings of the same property compare equal: the default
57
57
  * scope may be written or left off (`@patter.debt` and `@debt`), and refs are case-insensitive. */
58
58
  declare const normaliseRef: (ref: string, defaultScope: string) => string;
59
+ /** The set/clear-a-flag value: `set_flags(@scope.name, +flag)` - adjust one
60
+ * flag, keep the rest, which is what outcomes on a flags property
61
+ * overwhelmingly do (and the form a whole-value change cannot express).
62
+ * Lives here with the other pure ref helpers so the value wizard can build
63
+ * it without importing the effects mount (which imports the wizard). */
64
+ declare const flagChangeSrc: (targetRef: string, sign: "+" | "-", flag: string) => string;
59
65
  /** The name-form ref a call ADVANCES, when the call is the plain `advance(@x)` shape: one scopedvar
60
66
  * argument and nothing else. Null for any other call, and for an argument that is not a property
61
67
  * (`advance(f(@x))` keeps its explicit form, since collapsing it would hide the middle).
@@ -183,11 +189,21 @@ interface Filter {
183
189
  acceptTypes?: PropertyType[];
184
190
  acceptScopes?: string[];
185
191
  }
186
- /** The reference string for an entry: `@name` for the default scope, else `@scope.name`. */
192
+ /** The reference string for an entry: `@name` for the default scope, else `@scope.name`.
193
+ * CONDITION-side sugar only: a change TARGET must use {@link targetRefOf} - the storylets
194
+ * compiler requires `@scope.name` there, and emitting this shorthand for a default-scope
195
+ * target made every picker-authored change invalid (the Storyletter antagonist audit's
196
+ * find, 2026-08-29). Patter's grammar takes both forms, so the split costs it nothing. */
187
197
  declare const refOf: (e: {
188
198
  scope: string;
189
199
  name: string;
190
200
  }, defaultScope: string) => string;
201
+ /** The reference a change TARGET is written as: always fully qualified. A target is a
202
+ * reference, not an expression, and the shorthand is condition-side sugar (see refOf). */
203
+ declare const targetRefOf: (e: {
204
+ scope: string;
205
+ name: string;
206
+ }) => string;
191
207
  /** The label shown in the picker / on a property pill. */
192
208
  declare const displayName: (e: {
193
209
  scope: string;
@@ -529,6 +545,13 @@ interface ValueWizardOptions {
529
545
  expectedChoices?: string[];
530
546
  /** @deprecated Use `expectedChoices`. Kept so a 0.11.x caller keeps working. */
531
547
  expectedEnumValues?: string[];
548
+ /** A FLAGS target's qualified ref and declared flags: together they unlock the
549
+ * set/clear-a-flag step, which is what outcomes on a flags property
550
+ * overwhelmingly want and which a whole-value change cannot express (the
551
+ * Storyletter antagonist audit's find, 2026-08-29). Absent, the generic
552
+ * kinds stand alone as before. */
553
+ expectedRef?: string;
554
+ expectedFlags?: string[];
532
555
  /** Receives the chosen value as name-form source. */
533
556
  onCommit: (src: string) => void;
534
557
  /** Optional cancel (the ✕ on the step). */
@@ -537,4 +560,4 @@ interface ValueWizardOptions {
537
560
  /** Build the wizard UI into a fresh element (drive it via the host's popover). */
538
561
  declare function valueWizard(opts: ValueWizardOptions): HTMLElement;
539
562
 
540
- export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, type CatalogueEntry, EQUALITY_OPS, type EditCtx, type EditorEffect, type EffectsEditorHandle, type EffectsEditorOptions, type ExpressionEditorHandle, type ExpressionEditorOptions, type Filter, type FunctionTemplateSpec, OP_WORD, type PreviewOptions, type TreeRow, UNARY_LABEL, type Validation, type ValueWizardOptions, type WizardSpec, type WizardStepSpec, type WizardValue, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
563
+ export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, type CatalogueEntry, EQUALITY_OPS, type EditCtx, type EditorEffect, type EffectsEditorHandle, type EffectsEditorOptions, type ExpressionEditorHandle, type ExpressionEditorOptions, type Filter, type FunctionTemplateSpec, OP_WORD, type PreviewOptions, type TreeRow, UNARY_LABEL, type Validation, type ValueWizardOptions, type WizardSpec, type WizardStepSpec, type WizardValue, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagChangeSrc, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, targetRefOf, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
package/dist/index.js CHANGED
@@ -96,6 +96,7 @@ var normaliseRef = (ref, defaultScope) => {
96
96
  const prefix = `@${defaultScope.toLowerCase()}.`;
97
97
  return low.startsWith(prefix) ? `@${low.slice(prefix.length)}` : low;
98
98
  };
99
+ var flagChangeSrc = (targetRef, sign, flag) => `set_flags(${targetRef}, ${sign}${flag})`;
99
100
  function advancedRef(node, defaultScope) {
100
101
  if (node.kind !== "call" || node.name !== "advance" || node.args.length !== 1) return null;
101
102
  const arg = node.args[0];
@@ -294,6 +295,7 @@ var propertyTip = (e) => {
294
295
  return lines.length ? lines.join("\n") : void 0;
295
296
  };
296
297
  var refOf = (e, defaultScope) => e.scope === defaultScope ? `@${e.name}` : `@${e.scope}.${e.name}`;
298
+ var targetRefOf = (e) => `@${e.scope}.${e.name}`;
297
299
  var displayName = (e, defaultScope) => e.scope === defaultScope ? e.name : `${e.scope}.${e.name}`;
298
300
  function filterCatalogue(entries, filter = {}) {
299
301
  return entries.filter(
@@ -381,8 +383,14 @@ function openPopover(anchor, render, opts = {}) {
381
383
  container.append(pop);
382
384
  const a = anchor.getBoundingClientRect();
383
385
  const ph = pop.getBoundingClientRect();
384
- let top = a.bottom + 4;
385
- if (top + ph.height > window.innerHeight - 8 && a.top - ph.height - 4 > 8) top = a.top - ph.height - 4;
386
+ const GAP = 4;
387
+ const EDGE = 8;
388
+ const below = window.innerHeight - EDGE - (a.bottom + GAP);
389
+ const above = a.top - GAP - EDGE;
390
+ const flip = ph.height > below && above > below;
391
+ const room = flip ? above : below;
392
+ const top = flip ? a.top - Math.min(ph.height, above) - GAP : a.bottom + GAP;
393
+ if (ph.height > room) pop.style.maxHeight = `${Math.max(96, Math.round(room))}px`;
386
394
  let left = a.left;
387
395
  if (left + ph.width > window.innerWidth - 8) left = Math.max(8, window.innerWidth - 8 - ph.width);
388
396
  if (container === document.body) {
@@ -1082,7 +1090,7 @@ function seedClause(ctx) {
1082
1090
  function clauseMenu(ctx, anchor, onPick) {
1083
1091
  ctx.openPopover(anchor, (close) => {
1084
1092
  const wrap = el("div", "exed-menu");
1085
- wrap.append(el("div", "exed-menu-head", ["Add a clause"]));
1093
+ wrap.append(el("div", "exed-menu-head", ["Add a condition"]));
1086
1094
  const add = (label, hint, make, disabled = false) => {
1087
1095
  const b = button(`exed-opt${disabled ? " disabled" : ""}`, "", () => {
1088
1096
  if (disabled) return;
@@ -1381,7 +1389,9 @@ function valueWizard(opts) {
1381
1389
  host.append(body);
1382
1390
  const choices = opts.expectedChoices?.length ? opts.expectedChoices : opts.expectedEnumValues;
1383
1391
  const isStage = opts.expectedType === "quality";
1384
- let kind = opts.expectedType === "number" ? "number" : opts.expectedType === "string" ? "text" : opts.expectedType === "boolean" ? "bool" : (opts.expectedType === "enum" || opts.expectedType === "quality") && choices?.length ? "enum" : "menu";
1392
+ const flagsReady = opts.expectedType === "flags" && opts.expectedRef !== void 0;
1393
+ let kind = opts.expectedType === "number" ? "number" : opts.expectedType === "string" ? "text" : opts.expectedType === "boolean" ? "bool" : (opts.expectedType === "enum" || opts.expectedType === "quality") && choices?.length ? "enum" : flagsReady ? "flags" : "menu";
1394
+ let flagSign = "+";
1385
1395
  const draw = () => {
1386
1396
  body.replaceChildren();
1387
1397
  const other = () => button("exed-vwiz-other", "\u21A9 a different kind", () => {
@@ -1390,6 +1400,10 @@ function valueWizard(opts) {
1390
1400
  });
1391
1401
  switch (kind) {
1392
1402
  case "menu":
1403
+ if (flagsReady) body.append(optBtn("Set or clear a flag\u2026", () => {
1404
+ kind = "flags";
1405
+ draw();
1406
+ }));
1393
1407
  body.append(optBtn("A property\u2026", () => {
1394
1408
  kind = "property";
1395
1409
  draw();
@@ -1411,6 +1425,33 @@ function valueWizard(opts) {
1411
1425
  draw();
1412
1426
  }));
1413
1427
  break;
1428
+ case "flags": {
1429
+ const flags = opts.expectedFlags ?? [];
1430
+ if (!flags.length) body.append(el("div", "exed-hint", ["This property declares no flag values yet."]));
1431
+ else {
1432
+ const signRow = el("div", "exed-field-row");
1433
+ signRow.append(
1434
+ button(`exed-opt${flagSign === "+" ? " sel" : ""}`, "\uFF0B set", () => {
1435
+ flagSign = "+";
1436
+ draw();
1437
+ }),
1438
+ button(`exed-opt${flagSign === "-" ? " sel" : ""}`, "\uFF0D clear", () => {
1439
+ flagSign = "-";
1440
+ draw();
1441
+ })
1442
+ );
1443
+ body.append(signRow);
1444
+ body.append(el("div", "exed-vwiz-note", [flagSign === "+" ? "Set a flag:" : "Clear a flag:"]));
1445
+ const list = el("div", "exed-picker-list");
1446
+ for (const f of flags) list.append(optBtn(`${flagSign} ${f}`, () => opts.onCommit(flagChangeSrc(opts.expectedRef, flagSign, f))));
1447
+ body.append(list);
1448
+ }
1449
+ body.append(button("exed-vwiz-other", "\u21A9 a different kind (replaces every flag)", () => {
1450
+ kind = "menu";
1451
+ draw();
1452
+ }));
1453
+ break;
1454
+ }
1414
1455
  case "property":
1415
1456
  body.append(propertyPicker(pickCtx, { onPick: (e) => opts.onCommit(refOf(e, opts.defaultScope)) }));
1416
1457
  body.append(other());
@@ -1449,6 +1490,10 @@ function isSelfAdvance(eff, defaultScope, dialect) {
1449
1490
  return false;
1450
1491
  }
1451
1492
  }
1493
+ function entryForTarget(catalogue, target, defaultScope) {
1494
+ const want = normaliseRef(target, defaultScope);
1495
+ return catalogue.find((e) => normaliseRef(`@${e.scope}.${e.name}`, defaultScope) === want);
1496
+ }
1452
1497
  var clone = (list) => list.map((e) => e.kind === "set" ? { ...e } : { ...e, args: [...e.args] });
1453
1498
  var addSet = (list, target, value) => [...clone(list), { kind: "set", target, value }];
1454
1499
  var addEmit = (list, event) => [...clone(list), { kind: "emit", event, args: [] }];
@@ -1537,6 +1582,11 @@ function mountEffectsEditor(host, opts) {
1537
1582
  // choicesOf, never a raw field: a quality's ladder lives in `stages`, and reading `enumValues`
1538
1583
  // here told the wizard the type and withheld the values.
1539
1584
  ...choicesOf(expected) ? { expectedChoices: choicesOf(expected) } : {},
1585
+ // The flags step needs the target itself: its declared flags, and the
1586
+ // qualified ref its set_flags(...) is written against. choicesOf stays
1587
+ // out of it deliberately - flags are not a pick-one list, and a pinned
1588
+ // test holds it to that.
1589
+ ...expected?.type === "flags" ? { expectedRef: targetRefOf(expected), expectedFlags: expected.enumValues ?? [] } : {},
1540
1590
  onCommit: (src) => {
1541
1591
  onCommit(src);
1542
1592
  close();
@@ -1544,7 +1594,7 @@ function mountEffectsEditor(host, opts) {
1544
1594
  onCancel: close
1545
1595
  }), { container: opts.popoverContainer });
1546
1596
  };
1547
- const targetType = (target) => opts.catalogue.find((e) => refOf(e, defaultScope) === target)?.type;
1597
+ const targetType = (target) => entryForTarget(opts.catalogue, target, defaultScope)?.type;
1548
1598
  const valueDisplay = (value, onChange, type, selfAdvanceRef) => {
1549
1599
  const sub = el("div", "exed-effect-value");
1550
1600
  const addTerm = type === "number" ? "arithmetic" : type === "boolean" ? "boolean" : void 0;
@@ -1611,10 +1661,10 @@ function mountEffectsEditor(host, opts) {
1611
1661
  const row = el("div", "exed-effect exed-effect-set");
1612
1662
  const targetBtn = button("exed-pill exed-pill-prop", eff.target || "(pick property)", (e) => {
1613
1663
  pickTarget(e.currentTarget, void 0, (entry) => {
1614
- commit(updateAt(effects, i, { target: refOf(entry, defaultScope), value: initialValueFor(entry, defaultScope).src }));
1664
+ commit(updateAt(effects, i, { target: targetRefOf(entry), value: initialValueFor(entry, defaultScope).src }));
1615
1665
  });
1616
1666
  }, "change the target property");
1617
- const targetEntry = opts.catalogue.find((e) => refOf(e, defaultScope) === eff.target);
1667
+ const targetEntry = entryForTarget(opts.catalogue, eff.target, defaultScope);
1618
1668
  const tip = propertyTip(targetEntry);
1619
1669
  if (tip) targetBtn.title = tip;
1620
1670
  if (targetEntry && opts.propertyActions) {
@@ -1718,10 +1768,10 @@ function mountEffectsEditor(host, opts) {
1718
1768
  pickTarget(anchor, void 0, (entry) => {
1719
1769
  const { src, ask } = initialValueFor(entry, defaultScope);
1720
1770
  if (!ask) {
1721
- commit(addSet(effects, refOf(entry, defaultScope), src));
1771
+ commit(addSet(effects, targetRefOf(entry), src));
1722
1772
  return;
1723
1773
  }
1724
- openValueWizard(anchor, entry, (chosen) => commit(addSet(effects, refOf(entry, defaultScope), chosen)));
1774
+ openValueWizard(anchor, entry, (chosen) => commit(addSet(effects, targetRefOf(entry), chosen)));
1725
1775
  });
1726
1776
  }));
1727
1777
  if (opts.allowEmit !== false) {
@@ -1825,6 +1875,6 @@ function renderEffectsPreview(effects, o) {
1825
1875
  return wrap;
1826
1876
  }
1827
1877
 
1828
- export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, EQUALITY_OPS, OP_WORD, UNARY_LABEL, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
1878
+ export { ARITHMETIC_OPS, BINARY_LABEL, COMPARABLE_TYPES, COMPARISON_OPS, EQUALITY_OPS, OP_WORD, UNARY_LABEL, addArg, addChildToContainer, addEmit, addSet, advancedRef, astToTree, binary, boolLit, buildSubGroupClause, callNode, choicesOf, comparisonOpsFor, deleteAt, displayName, filterCatalogue, findChoicePeer, findEnumPeer, firstEmptyLeafPath, flagChangeSrc, flagDelta, flipContainerOp, formatNumber, getNodeAt, groupByScope, initialValueFor, insertSiblingClauseAt, isComparisonOp, isPlaceholderForOp, isWrappedInNot, issuesAt, lookup, mountEffectsEditor, mountExpressionEditor, moveAt, moveChildInContainer, needsParens, normaliseRef, notNode, numLit, opSwapGroup, pathKey, placeholderForOp, propertyTip, redirectDeleteForPlaceholderSibling, refOf, removeArgAt, removeAt, renderConditionPreview, renderEffectsPreview, rhsTypesFor, scopedVar, searchCatalogue, seedValueSrc, setArgAt, setNodeAt, strLit, targetRefOf, toggleContainerNot, toggleNotAt, updateAt, validateSource, valueWizard, wrapInNotAt };
1829
1879
  //# sourceMappingURL=index.js.map
1830
1880
  //# sourceMappingURL=index.js.map