@danielsimonjr/mathts-expression 0.10.3 → 0.11.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.
Files changed (48) hide show
  1. package/README.md +18 -2
  2. package/dist/compiler/compile.d.ts.map +1 -1
  3. package/dist/evaluator/evaluate.d.ts.map +1 -1
  4. package/dist/index.d.ts +7 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +819 -256
  7. package/dist/limits.d.ts +18 -0
  8. package/dist/limits.d.ts.map +1 -0
  9. package/dist/node/ArrayNode.d.ts.map +1 -1
  10. package/dist/node/AssignmentNode.d.ts.map +1 -1
  11. package/dist/node/ConditionalNode.d.ts +124 -124
  12. package/dist/node/ConditionalNode.d.ts.map +1 -1
  13. package/dist/node/FunctionNode.d.ts.map +1 -1
  14. package/dist/node/IndexNode.d.ts.map +1 -1
  15. package/dist/node/Node.d.ts +15 -0
  16. package/dist/node/Node.d.ts.map +1 -1
  17. package/dist/node/ObjectNode.d.ts.map +1 -1
  18. package/dist/node/OperatorNode.d.ts +2 -2
  19. package/dist/node/OperatorNode.d.ts.map +1 -1
  20. package/dist/node/RangeNode.d.ts +70 -70
  21. package/dist/node/RangeNode.d.ts.map +1 -1
  22. package/dist/node/RelationalNode.d.ts +120 -120
  23. package/dist/node/RelationalNode.d.ts.map +1 -1
  24. package/dist/node/utils/stringSubset.d.ts +9 -2
  25. package/dist/node/utils/stringSubset.d.ts.map +1 -1
  26. package/dist/parse.d.ts.map +1 -1
  27. package/dist/scalar-builder.d.ts +4 -4
  28. package/dist/scalar-enumerate.d.ts +48 -0
  29. package/dist/scalar-enumerate.d.ts.map +1 -0
  30. package/dist/scalar-structure.d.ts +167 -0
  31. package/dist/scalar-structure.d.ts.map +1 -0
  32. package/dist/transform/and.transform.d.ts.map +1 -1
  33. package/dist/transform/bitAnd.transform.d.ts.map +1 -1
  34. package/dist/transform/bitOr.transform.d.ts.map +1 -1
  35. package/dist/transform/cumsum.transform.d.ts.map +1 -1
  36. package/dist/transform/filter.transform.d.ts +4 -4
  37. package/dist/transform/filter.transform.d.ts.map +1 -1
  38. package/dist/transform/forEach.transform.d.ts.map +1 -1
  39. package/dist/transform/mapSlices.transform.d.ts +1 -1
  40. package/dist/transform/mapSlices.transform.d.ts.map +1 -1
  41. package/dist/transform/or.transform.d.ts.map +1 -1
  42. package/dist/transform/utils/dimToZeroBase.d.ts +4 -1
  43. package/dist/transform/utils/dimToZeroBase.d.ts.map +1 -1
  44. package/dist/transform/utils/prepareTransformArgs.d.ts +23 -0
  45. package/dist/transform/utils/prepareTransformArgs.d.ts.map +1 -0
  46. package/dist/transform/utils/shortCircuitBinary.d.ts +21 -0
  47. package/dist/transform/utils/shortCircuitBinary.d.ts.map +1 -0
  48. package/package.json +3 -3
package/README.md CHANGED
@@ -1,9 +1,11 @@
1
1
  # @danielsimonjr/mathts-expression
2
2
 
3
- Expression parser & evaluator for [MathTS](https://github.com/danielsimonjr/mathts).
3
+ Expression parser & evaluator for [MathTS](https://github.com/danielsimonjr/mathts). The package root also re-exports the `MathNode` and `StringOptions` types used by `scalarToNode` / `scalarToTex` in `@danielsimonjr/mathts-functions`.
4
4
 
5
5
  The expression engine for MathTS: a parser (string → AST), an AST node set, a compiler, and an evaluator. Includes a sandbox (`getSafeProperty` / `getSafeMethod`) for safe property access.
6
6
 
7
+ **Limits on untrusted strings:** max length **1,000,000** characters, max parenthesis nesting **125** (and **500** nested unary, power, assignment or conditional rules), max compile depth **512**, which `evaluate` also applies before validation (see `expression/tests/security/limits.test.ts` and `docs/api/expression.md`).
8
+
7
9
  ## Install
8
10
 
9
11
  ```sh
@@ -16,6 +18,20 @@ npm install @danielsimonjr/mathts-expression
16
18
  - 16 AST node constructors (`createConstantNode`, `createOperatorNode`, …).
17
19
  - `compile` / `createEvaluate` / `compileExpression` — evaluate expressions.
18
20
  - `createScalarBuilder` — build a scalar node tree (`number`, `symbol`, `op`, `call`, `from`). `ln` lowers to natural `log` and `log` lowers to `log10`. A formula string is rejected. Evaluate with `evaluateScalar` from `@danielsimonjr/mathts-functions`.
21
+ - `scalarCanonical` / `scalarCanonicalKey` / `scalarSize` / `scalarDepth` / `scalarComplexity` / `scalarSymbols` — structural toolkit for an existing `ScalarNode`. The canonical key flattens `+` and `*`, rewrites `-` and `/`, and does not fold `2^3` to `8`.
22
+ - `enumerateScalars` / `scalarGrammarAccepts` — deterministic size-ordered enumeration of scalar trees from a grammar, with deduplication by `scalarCanonicalKey`. It is a generator that returns an `EnumerationStop` reason (`exhausted-space`, `candidate-limit`, `time-limit`, `cancelled`). `budget.maxCandidates`, `budget.maxWallClockMs`, and an `AbortSignal` end it; the wall clock and the signal are checked every 128 candidates considered, so a grammar that yields few trees still stops promptly.
23
+
24
+ ```ts
25
+ import { createScalarBuilder, scalarEquals } from '@danielsimonjr/mathts-expression';
26
+
27
+ const b = createScalarBuilder();
28
+ const aa = b.op('*', [b.symbol('a'), b.symbol('a')]);
29
+ const aSquared = b.op('^', [b.symbol('a'), b.number(2)]);
30
+ console.log(scalarEquals(aa, aSquared)); // true
31
+ ```
32
+
33
+ - `getStringSubset` / `setStringSubset` — string indexing used by accessor/assign
34
+ and by functions `subset` (the barrel is the only public entry).
19
35
  - AST serializers on every node: `toString()`, `toTex()` (LaTeX), `toHTML()`, and `toMathML()` (MathML).
20
36
  - Focused re-exports are also published: `@danielsimonjr/mathts-{parser,ast,evaluator}`.
21
37
 
@@ -31,7 +47,7 @@ import { mathMLDocument, mathMLError } from '@danielsimonjr/mathts-expression';
31
47
 
32
48
  const node = parse('c = 1 / sqrt(eps0 * mu0)'); // parse from the functions package
33
49
  node.toString(); // 'c = 1 / sqrt(eps0 * mu0)'
34
- node.toTex(); // 'c=\\frac{1}{\\sqrt{ eps0\\cdot mu0}}'
50
+ node.toTex(); // ' c=\\frac{1}{\\sqrt{ eps0\\cdot mu0}}'
35
51
  node.toMathML(); // '<mrow><mi>c</mi><mo>=</mo><mfrac>…</mfrac></mrow>'
36
52
  mathMLDocument(node); // '<math xmlns="…" display="block">…</math>' (renderable)
37
53
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;CAC5D;AAsCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAiB9F"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;CAC5D;AAsCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAiB9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwGD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,EACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;WAW1B,MAAM,UACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,YAC7B,eAAe,GACxB,OAAO;YAUD,MAAM,EAAE,UACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,YAC7B,eAAe,GACxB,OAAO,EAAE;EA0Bb;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,EACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,kBAAkB,CAMpB"}
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuHD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,EACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;WAW1B,MAAM,UACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,YAC7B,eAAe,GACxB,OAAO;YAUD,MAAM,EAAE,UACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,YAC7B,eAAe,GACxB,OAAO,EAAE;EA0Bb;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,EACnC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,kBAAkB,CAMpB"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  * @packageDocumentation
7
7
  */
8
8
  export * from './types.js';
9
+ export type { MathNode, StringOptions } from './node/Node.js';
9
10
  export * from './keywords.js';
10
11
  export * from './operators.js';
11
12
  export * from './parse.js';
@@ -32,7 +33,13 @@ export { createParenthesisNode } from './node/ParenthesisNode.js';
32
33
  export { createRangeNode } from './node/RangeNode.js';
33
34
  export { createRelationalNode } from './node/RelationalNode.js';
34
35
  export { createSymbolNode } from './node/SymbolNode.js';
36
+ export { getStringSubset, setStringSubset } from './node/utils/stringSubset.js';
37
+ export type { IndexLike } from './node/utils/stringSubset.js';
35
38
  export { createScalarBuilder, SCALAR_FUNCTIONS, SCALAR_FUNCTION_LOWERING, ScalarBuildError, } from './scalar-builder.js';
36
39
  export type { LoweredScalarFn, ScalarBuilder, ScalarFunctionName, ScalarNode, ScalarOperator, } from './scalar-builder.js';
40
+ export { forEachScalar, mapScalar, scalarSize, scalarDepth, scalarComplexity, scalarSymbols, scalarCanonical, scalarCanonicalKey, scalarEquals, } from './scalar-structure.js';
41
+ export type { ScalarComplexityWeights } from './scalar-structure.js';
42
+ export { enumerateScalars, scalarGrammarAccepts } from './scalar-enumerate.js';
43
+ export type { EnumerationBudget, EnumerationStop, ScalarGrammar } from './scalar-enumerate.js';
37
44
  export * from './transform/index.js';
38
45
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAMrC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG9F,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,MAAM,qBAAqB,CAAC;AAK7B,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAMrC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG9F,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAChF,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAG9D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,SAAS,EACT,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK/F,cAAc,sBAAsB,CAAC"}