roll-parser 3.0.0-alpha.0 → 3.0.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/CHANGELOG.md +189 -0
- package/MIGRATION.md +147 -0
- package/README.md +985 -43
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +81 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/format.d.ts +16 -4
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +17 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/main.d.ts +36 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +83 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/errors.d.ts +332 -14
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +141 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator/die.d.ts +26 -0
- package/dist/evaluator/die.d.ts.map +1 -0
- package/dist/evaluator/die.js +19 -0
- package/dist/evaluator/die.js.map +1 -0
- package/dist/evaluator/env.d.ts +58 -0
- package/dist/evaluator/env.d.ts.map +1 -0
- package/dist/evaluator/env.js +11 -0
- package/dist/evaluator/env.js.map +1 -0
- package/dist/evaluator/evaluator.d.ts +62 -40
- package/dist/evaluator/evaluator.d.ts.map +1 -1
- package/dist/evaluator/evaluator.js +906 -0
- package/dist/evaluator/evaluator.js.map +1 -0
- package/dist/evaluator/modifiers/compare.d.ts +1 -1
- package/dist/evaluator/modifiers/compare.d.ts.map +1 -1
- package/dist/evaluator/modifiers/compare.js +15 -0
- package/dist/evaluator/modifiers/compare.js.map +1 -0
- package/dist/evaluator/modifiers/crit-threshold.d.ts +27 -0
- package/dist/evaluator/modifiers/crit-threshold.d.ts.map +1 -0
- package/dist/evaluator/modifiers/crit-threshold.js +23 -0
- package/dist/evaluator/modifiers/crit-threshold.js.map +1 -0
- package/dist/evaluator/modifiers/die-bound.d.ts +26 -0
- package/dist/evaluator/modifiers/die-bound.d.ts.map +1 -0
- package/dist/evaluator/modifiers/die-bound.js +14 -0
- package/dist/evaluator/modifiers/die-bound.js.map +1 -0
- package/dist/evaluator/modifiers/explode.d.ts +18 -6
- package/dist/evaluator/modifiers/explode.d.ts.map +1 -1
- package/dist/evaluator/modifiers/explode.js +103 -0
- package/dist/evaluator/modifiers/explode.js.map +1 -0
- package/dist/evaluator/modifiers/flags.d.ts +37 -0
- package/dist/evaluator/modifiers/flags.d.ts.map +1 -0
- package/dist/evaluator/modifiers/flags.js +18 -0
- package/dist/evaluator/modifiers/flags.js.map +1 -0
- package/dist/evaluator/modifiers/keep-drop.d.ts +12 -28
- package/dist/evaluator/modifiers/keep-drop.d.ts.map +1 -1
- package/dist/evaluator/modifiers/keep-drop.js +82 -0
- package/dist/evaluator/modifiers/keep-drop.js.map +1 -0
- package/dist/evaluator/modifiers/reroll.d.ts +14 -6
- package/dist/evaluator/modifiers/reroll.d.ts.map +1 -1
- package/dist/evaluator/modifiers/reroll.js +62 -0
- package/dist/evaluator/modifiers/reroll.js.map +1 -0
- package/dist/evaluator/modifiers/sort.d.ts +27 -0
- package/dist/evaluator/modifiers/sort.d.ts.map +1 -0
- package/dist/evaluator/modifiers/sort.js +13 -0
- package/dist/evaluator/modifiers/sort.js.map +1 -0
- package/dist/evaluator/modifiers/success-count.d.ts +2 -6
- package/dist/evaluator/modifiers/success-count.d.ts.map +1 -1
- package/dist/evaluator/modifiers/success-count.js +24 -0
- package/dist/evaluator/modifiers/success-count.js.map +1 -0
- package/dist/index.d.ts +35 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1723
- package/dist/index.js.map +1 -0
- package/dist/lexer/lexer.d.ts +68 -8
- package/dist/lexer/lexer.d.ts.map +1 -1
- package/dist/lexer/lexer.js +260 -0
- package/dist/lexer/lexer.js.map +1 -0
- package/dist/lexer/tokens.d.ts +52 -7
- package/dist/lexer/tokens.d.ts.map +1 -1
- package/dist/lexer/tokens.js +42 -0
- package/dist/lexer/tokens.js.map +1 -0
- package/dist/parser/ast.d.ts +419 -80
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/ast.js +52 -0
- package/dist/parser/ast.js.map +1 -0
- package/dist/parser/guards.d.ts +106 -0
- package/dist/parser/guards.d.ts.map +1 -0
- package/dist/parser/guards.js +121 -0
- package/dist/parser/guards.js.map +1 -0
- package/dist/parser/parser.d.ts +162 -15
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +751 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/rng/mock.d.ts +74 -13
- package/dist/rng/mock.d.ts.map +1 -1
- package/dist/rng/mock.js +30 -0
- package/dist/rng/mock.js.map +1 -0
- package/dist/rng/seeded.d.ts +149 -10
- package/dist/rng/seeded.d.ts.map +1 -1
- package/dist/rng/seeded.js +138 -0
- package/dist/rng/seeded.js.map +1 -0
- package/dist/rng/types.d.ts +57 -0
- package/dist/rng/types.d.ts.map +1 -1
- package/dist/rng/types.js +2 -0
- package/dist/rng/types.js.map +1 -0
- package/dist/roll.d.ts +59 -25
- package/dist/roll.d.ts.map +1 -1
- package/dist/roll.js +8 -0
- package/dist/roll.js.map +1 -0
- package/dist/testing.d.ts +5 -4
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -38
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +427 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +93 -40
- package/src/cli/args.ts +66 -9
- package/src/cli/format.ts +30 -7
- package/src/cli/index.ts +27 -67
- package/src/cli/main.ts +129 -0
- package/src/errors.ts +488 -23
- package/src/evaluator/die.ts +50 -0
- package/src/evaluator/env.ts +73 -0
- package/src/evaluator/evaluator.ts +1296 -349
- package/src/evaluator/modifiers/compare.ts +1 -1
- package/src/evaluator/modifiers/crit-threshold.ts +56 -0
- package/src/evaluator/modifiers/die-bound.ts +39 -0
- package/src/evaluator/modifiers/explode.ts +82 -76
- package/src/evaluator/modifiers/flags.ts +61 -0
- package/src/evaluator/modifiers/keep-drop.ts +124 -126
- package/src/evaluator/modifiers/reroll.ts +36 -64
- package/src/evaluator/modifiers/sort.ts +43 -0
- package/src/evaluator/modifiers/success-count.ts +6 -9
- package/src/index.ts +73 -34
- package/src/lexer/lexer.ts +201 -35
- package/src/lexer/tokens.ts +72 -7
- package/src/parser/ast.ts +453 -104
- package/src/parser/guards.ts +248 -0
- package/src/parser/parser.ts +835 -135
- package/src/rng/mock.ts +75 -14
- package/src/rng/seeded.ts +323 -58
- package/src/rng/types.ts +57 -0
- package/src/roll.ts +66 -41
- package/src/testing.ts +5 -9
- package/src/types.ts +416 -24
- package/src/version.ts +2 -0
- package/dist/cli.js +0 -1775
- package/dist/evaluator/index.d.ts +0 -8
- package/dist/evaluator/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -1724
- package/dist/rng/index.d.ts +0 -8
- package/dist/rng/index.d.ts.map +0 -1
- package/dist/testing.mjs +0 -39
- package/src/evaluator/index.ts +0 -14
- package/src/rng/index.ts +0 -8
package/dist/roll.d.ts
CHANGED
|
@@ -3,45 +3,79 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module roll
|
|
5
5
|
*/
|
|
6
|
-
import type { RNG } from './rng/types';
|
|
7
|
-
import type { RollResult } from './types';
|
|
6
|
+
import type { RNG } from './rng/types.js';
|
|
7
|
+
import type { EvaluationOptions, RollResult } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* Everything {@link roll} accepts on top of the shared {@link EvaluationOptions}:
|
|
10
|
+
* a randomness source, given either as a ready-made {@link RNG} or as a seed.
|
|
11
|
+
*
|
|
12
|
+
* @category Core
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { roll, SeededRNG } from 'roll-parser';
|
|
17
|
+
*
|
|
18
|
+
* roll('4d6', { seed: 'character-1' }); // reproducible
|
|
19
|
+
* roll('4d6', { rng: new SeededRNG(42) }); // rng wins over seed
|
|
20
|
+
* roll('1d20+@str', { context: { str: 4 } });
|
|
21
|
+
* ```
|
|
10
22
|
*/
|
|
11
|
-
export type RollOptions = {
|
|
12
|
-
/**
|
|
23
|
+
export type RollOptions = EvaluationOptions & {
|
|
24
|
+
/**
|
|
25
|
+
* Randomness source. Takes precedence over `seed` — when both are given,
|
|
26
|
+
* `seed` is ignored.
|
|
27
|
+
*/
|
|
13
28
|
rng?: RNG;
|
|
14
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Seed for a fresh `SeededRNG`. Equal seeds replay the same die sequence for
|
|
31
|
+
* the same notation. Ignored when `rng` is set.
|
|
32
|
+
*/
|
|
15
33
|
seed?: string | number;
|
|
16
|
-
/** Maximum total dice allowed per evaluation (default: 10,000) */
|
|
17
|
-
maxDice?: number;
|
|
18
|
-
/** Maximum explosion iterations allowed per die (default: 1,000) */
|
|
19
|
-
maxExplodeIterations?: number;
|
|
20
|
-
/** Maximum reroll iterations allowed per die (default: 1,000) */
|
|
21
|
-
maxRerollIterations?: number;
|
|
22
34
|
};
|
|
23
35
|
/**
|
|
24
|
-
* Parses and evaluates a dice notation string
|
|
36
|
+
* Parses and evaluates a dice notation string in one call — the main entry
|
|
37
|
+
* point of the library.
|
|
25
38
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* @
|
|
39
|
+
* Equivalent to `evaluate(parse(notation), rng, { notation })`. Each call
|
|
40
|
+
* builds a fresh `SeededRNG` unless `options.rng` is supplied, so reuse
|
|
41
|
+
* {@link parse} + {@link evaluate} directly when rolling the same notation in
|
|
42
|
+
* a loop.
|
|
43
|
+
*
|
|
44
|
+
* @param notation - Dice notation, e.g. `'2d6+3'` or `'4d6kh3'`
|
|
45
|
+
* @param options - RNG or seed, plus the shared {@link EvaluationOptions}
|
|
46
|
+
* @returns Complete {@link RollResult} with total, per-die results and the
|
|
47
|
+
* structured `parts` tree
|
|
48
|
+
* @throws {LexerError} On an invalid character
|
|
49
|
+
* @throws {ParseError} On invalid syntax
|
|
50
|
+
* @throws {EvaluatorError} On a limit breach or an impossible expression
|
|
51
|
+
* @throws {RollParserError} `INVALID_EVALUATION_LIMIT` when a supplied limit is
|
|
52
|
+
* not an integer in range — raised before any die is rolled
|
|
53
|
+
* @throws {RollParserError} `INVALID_NOTATION_TYPE` when `notation` is not a
|
|
54
|
+
* string, so `isRollParserError` still filters untrusted input completely
|
|
29
55
|
*
|
|
30
56
|
* @example
|
|
31
57
|
* ```typescript
|
|
58
|
+
* import { roll } from 'roll-parser';
|
|
59
|
+
*
|
|
32
60
|
* // Random roll
|
|
33
|
-
*
|
|
34
|
-
*
|
|
61
|
+
* roll('2d6+3').total; // 5..15
|
|
62
|
+
*
|
|
63
|
+
* // Seeded — same seed, same sequence
|
|
64
|
+
* roll('2d6+3', { seed: 'demo' }).rendered; // '2d6[1, 6] + 3 = 10'
|
|
65
|
+
* roll('2d6+3', { seed: 'demo' }).total; // 10
|
|
66
|
+
* ```
|
|
35
67
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
68
|
+
* @example Deterministic tests with the testing mock
|
|
69
|
+
* ```typescript
|
|
70
|
+
* import { roll } from 'roll-parser';
|
|
71
|
+
* import { createMockRng } from 'roll-parser/testing';
|
|
40
72
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* result.
|
|
73
|
+
* const result = roll('4d6kh3', { rng: createMockRng([3, 6, 2, 5]) });
|
|
74
|
+
* result.total; // 14
|
|
75
|
+
* result.rendered; // '4d6[3, 6, ~~2~~, 5] = 14'
|
|
44
76
|
* ```
|
|
77
|
+
*
|
|
78
|
+
* @category Core
|
|
45
79
|
*/
|
|
46
80
|
export declare function roll(notation: string, options?: RollOptions): RollResult;
|
|
47
81
|
//# sourceMappingURL=roll.d.ts.map
|
package/dist/roll.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../src/roll.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"roll.d.ts","sourceRoot":"","sources":["../src/roll.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG;IAC5C;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC;IACV;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,CAK5E"}
|
package/dist/roll.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { evaluate } from './evaluator/evaluator.js';
|
|
2
|
+
import { parse } from './parser/parser.js';
|
|
3
|
+
import { SeededRNG } from './rng/seeded.js';
|
|
4
|
+
export function roll(notation, options = {}) {
|
|
5
|
+
const { rng, seed, ...limits } = options;
|
|
6
|
+
return evaluate(parse(notation), rng ?? new SeededRNG(seed), { ...limits, notation });
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=roll.js.map
|
package/dist/roll.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roll.js","sourceRoot":"","sources":["../src/roll.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA6E5C,MAAM,UAAU,IAAI,CAAC,QAAgB,EAAE,OAAO,GAAgB,EAAE;IAE9D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IAEzC,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxF,CAAC"}
|
package/dist/testing.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Test utilities for roll-parser consumers.
|
|
3
3
|
*
|
|
4
|
-
* Import from `roll-parser/testing` for deterministic dice testing.
|
|
4
|
+
* Import from `roll-parser/testing` for deterministic dice testing. The full
|
|
5
|
+
* TSDoc lives on the implementations in `./rng/mock.ts`; this entry point is
|
|
6
|
+
* a plain re-export barrel.
|
|
5
7
|
*
|
|
6
8
|
* @module testing
|
|
7
9
|
*/
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
export declare const MockRNGExhaustedError: typeof _MockRNGExhaustedError;
|
|
10
|
+
export { createMockRng, MockRNGExhaustedError } from './rng/mock.js';
|
|
11
|
+
export type { RNG } from './rng/types.js';
|
|
11
12
|
//# sourceMappingURL=testing.d.ts.map
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/testing.js
CHANGED
|
@@ -1,38 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
consumed;
|
|
4
|
-
constructor(consumed) {
|
|
5
|
-
super(`MockRNG exhausted: consumed ${consumed} values, no more available`);
|
|
6
|
-
this.name = "MockRNGExhaustedError";
|
|
7
|
-
this.consumed = consumed;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
function createMockRng(values) {
|
|
11
|
-
let index = 0;
|
|
12
|
-
const getNext = () => {
|
|
13
|
-
const value = values[index];
|
|
14
|
-
if (value === undefined) {
|
|
15
|
-
throw new MockRNGExhaustedError(index);
|
|
16
|
-
}
|
|
17
|
-
index++;
|
|
18
|
-
return value;
|
|
19
|
-
};
|
|
20
|
-
return {
|
|
21
|
-
next: getNext,
|
|
22
|
-
nextInt: (min, max) => {
|
|
23
|
-
const value = getNext();
|
|
24
|
-
if (value < min || value > max) {
|
|
25
|
-
throw new RangeError(`MockRNG value ${value} is out of bounds [${min}, ${max}]`);
|
|
26
|
-
}
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// src/testing.ts
|
|
33
|
-
var createMockRng2 = createMockRng;
|
|
34
|
-
var MockRNGExhaustedError2 = MockRNGExhaustedError;
|
|
35
|
-
export {
|
|
36
|
-
createMockRng2 as createMockRng,
|
|
37
|
-
MockRNGExhaustedError2 as MockRNGExhaustedError
|
|
38
|
-
};
|
|
1
|
+
export { createMockRng, MockRNGExhaustedError } from './rng/mock.js';
|
|
2
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|