@dicelette/core 1.4.5 → 1.4.6
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.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +40 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -72
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.d.mts
CHANGED
@@ -156,9 +156,9 @@ declare function cleanedDice(dice: string): string;
|
|
156
156
|
/**
|
157
157
|
* Verify if the provided dice work with random value
|
158
158
|
* @param testDice {string}
|
159
|
-
* @param
|
159
|
+
* @param allStats {[name: string]: number}
|
160
160
|
*/
|
161
|
-
declare function evalStatsDice(testDice: string,
|
161
|
+
declare function evalStatsDice(testDice: string, allStats?: {
|
162
162
|
[name: string]: number;
|
163
163
|
}): string;
|
164
164
|
/**
|
package/dist/index.d.ts
CHANGED
@@ -156,9 +156,9 @@ declare function cleanedDice(dice: string): string;
|
|
156
156
|
/**
|
157
157
|
* Verify if the provided dice work with random value
|
158
158
|
* @param testDice {string}
|
159
|
-
* @param
|
159
|
+
* @param allStats {[name: string]: number}
|
160
160
|
*/
|
161
|
-
declare function evalStatsDice(testDice: string,
|
161
|
+
declare function evalStatsDice(testDice: string, allStats?: {
|
162
162
|
[name: string]: number;
|
163
163
|
}): string;
|
164
164
|
/**
|
package/dist/index.js
CHANGED
@@ -153,8 +153,7 @@ function getModifier(dice) {
|
|
153
153
|
if (modificator) {
|
154
154
|
const sign = modificator.sign;
|
155
155
|
let value = modificator.value;
|
156
|
-
if (sign)
|
157
|
-
value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
156
|
+
if (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
158
157
|
modificator = {
|
159
158
|
sign: mod[1],
|
160
159
|
value
|
@@ -169,12 +168,10 @@ function getModifier(dice) {
|
|
169
168
|
return modificator;
|
170
169
|
}
|
171
170
|
function roll(dice) {
|
172
|
-
if (!dice.includes("d"))
|
173
|
-
return void 0;
|
171
|
+
if (!dice.includes("d")) return void 0;
|
174
172
|
const compareRegex = dice.match(SIGN_REGEX_SPACE);
|
175
173
|
let compare;
|
176
|
-
if (dice.includes(";") && dice.includes("&"))
|
177
|
-
return sharedRolls(dice);
|
174
|
+
if (dice.includes(";") && dice.includes("&")) return sharedRolls(dice);
|
178
175
|
if (compareRegex) {
|
179
176
|
const compareResult = getCompare(dice, compareRegex);
|
180
177
|
dice = compareResult.dice;
|
@@ -223,8 +220,7 @@ function roll(dice) {
|
|
223
220
|
};
|
224
221
|
}
|
225
222
|
function calculator(sign, value, total) {
|
226
|
-
if (sign === "^")
|
227
|
-
sign = "**";
|
223
|
+
if (sign === "^") sign = "**";
|
228
224
|
return (0, import_mathjs.evaluate)(`${total} ${sign} ${value}`);
|
229
225
|
}
|
230
226
|
function inverseSign(sign) {
|
@@ -306,26 +302,22 @@ function sharedRolls(dice) {
|
|
306
302
|
const results = [];
|
307
303
|
const split = dice.split(";");
|
308
304
|
const diceResult = roll(split[0]);
|
309
|
-
if (!diceResult || !diceResult.total)
|
310
|
-
return void 0;
|
305
|
+
if (!diceResult || !diceResult.total) return void 0;
|
311
306
|
results.push(`${diceResult.result}`);
|
312
307
|
let total = diceResult.total;
|
313
308
|
let comments = diceResult.comment ?? "";
|
314
|
-
if (!total)
|
315
|
-
return diceResult;
|
309
|
+
if (!total) return diceResult;
|
316
310
|
for (let element of split.slice(1)) {
|
317
311
|
if (!element.includes(SYMBOL_DICE)) {
|
318
312
|
const result = roll(element);
|
319
|
-
if (!result)
|
320
|
-
continue;
|
313
|
+
if (!result) continue;
|
321
314
|
results.push(result.result);
|
322
315
|
continue;
|
323
316
|
}
|
324
317
|
const commentMatch = element.match(COMMENT_REGEX);
|
325
318
|
element = element.replace(COMMENT_REGEX, "");
|
326
319
|
const comment = commentMatch ? commentMatch[2] : void 0;
|
327
|
-
if (comment)
|
328
|
-
comments += ` ${comment}`;
|
320
|
+
if (comment) comments += ` ${comment}`;
|
329
321
|
let toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);
|
330
322
|
const compareRegex = toRoll.match(SIGN_REGEX_SPACE);
|
331
323
|
if (compareRegex) {
|
@@ -346,8 +338,7 @@ function sharedRolls(dice) {
|
|
346
338
|
const evaluated = roll(toRoll);
|
347
339
|
if (evaluated)
|
348
340
|
results.push(`\u25C8 ${diceAll}: ${evaluated.result.split(":").slice(1).join(":")}`);
|
349
|
-
else
|
350
|
-
results.push(`\u25C8 ${diceAll}: ${formule} = ${evaluated}`);
|
341
|
+
else results.push(`\u25C8 ${diceAll}: ${formule} = ${evaluated}`);
|
351
342
|
total += evaluated?.total ?? 0;
|
352
343
|
}
|
353
344
|
}
|
@@ -404,15 +395,15 @@ function cleanedDice(dice) {
|
|
404
395
|
var import_mathjs3 = require("mathjs");
|
405
396
|
var import_random_js = require("random-js");
|
406
397
|
var import_uniformize2 = require("uniformize");
|
407
|
-
function evalStatsDice(testDice,
|
398
|
+
function evalStatsDice(testDice, allStats) {
|
408
399
|
let dice = testDice.trimEnd();
|
409
|
-
if (
|
410
|
-
const
|
411
|
-
for (const
|
412
|
-
const regex = new RegExp(escapeRegex(
|
413
|
-
if (
|
414
|
-
const statValue =
|
415
|
-
dice =
|
400
|
+
if (allStats && Object.keys(allStats).length > 0) {
|
401
|
+
const names = Object.keys(allStats);
|
402
|
+
for (const name of names) {
|
403
|
+
const regex = new RegExp(escapeRegex(name.standardize()), "gi");
|
404
|
+
if (dice.standardize().match(regex)) {
|
405
|
+
const statValue = allStats[name];
|
406
|
+
dice = dice.standardize().replace(regex, statValue.toString()).trimEnd();
|
416
407
|
}
|
417
408
|
}
|
418
409
|
}
|
@@ -425,8 +416,7 @@ function evalStatsDice(testDice, stats) {
|
|
425
416
|
}
|
426
417
|
}
|
427
418
|
function diceRandomParse(value, template) {
|
428
|
-
if (!template.statistics)
|
429
|
-
return value;
|
419
|
+
if (!template.statistics) return value;
|
430
420
|
value = value.standardize();
|
431
421
|
const statNames = Object.keys(template.statistics);
|
432
422
|
let newDice = value;
|
@@ -448,13 +438,11 @@ function diceRandomParse(value, template) {
|
|
448
438
|
return replaceFormulaInDice(newDice);
|
449
439
|
}
|
450
440
|
function diceTypeRandomParse(dice, template) {
|
451
|
-
if (!template.statistics)
|
452
|
-
return dice;
|
441
|
+
if (!template.statistics) return dice;
|
453
442
|
const firstStatNotcombinaison = Object.keys(template.statistics).find(
|
454
443
|
(stat) => !template.statistics?.[stat].combinaison
|
455
444
|
);
|
456
|
-
if (!firstStatNotcombinaison)
|
457
|
-
return dice;
|
445
|
+
if (!firstStatNotcombinaison) return dice;
|
458
446
|
const stats = template.statistics[firstStatNotcombinaison];
|
459
447
|
const { min, max } = stats;
|
460
448
|
const total = template.total || 100;
|
@@ -494,19 +482,15 @@ function verifyTemplateValue(template) {
|
|
494
482
|
diceType: "",
|
495
483
|
statistics: {}
|
496
484
|
};
|
497
|
-
if (!template.statistics)
|
498
|
-
statistiqueTemplate.statistics = void 0;
|
485
|
+
if (!template.statistics) statistiqueTemplate.statistics = void 0;
|
499
486
|
else if (template.statistics && Object.keys(template.statistics).length > 0) {
|
500
|
-
if (Object.keys(template.statistics).length > 25)
|
501
|
-
throw new TooManyStats();
|
487
|
+
if (Object.keys(template.statistics).length > 25) throw new TooManyStats();
|
502
488
|
for (const [key, value] of Object.entries(template.statistics)) {
|
503
489
|
const dataValue = value;
|
504
490
|
if (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)
|
505
491
|
throw new MaxGreater(dataValue.min, dataValue.max);
|
506
|
-
if (dataValue.max && dataValue.max <= 0)
|
507
|
-
|
508
|
-
if (dataValue.min && dataValue.min <= 0)
|
509
|
-
dataValue.min = void 0;
|
492
|
+
if (dataValue.max && dataValue.max <= 0) dataValue.max = void 0;
|
493
|
+
if (dataValue.min && dataValue.min <= 0) dataValue.min = void 0;
|
510
494
|
let formula = dataValue.combinaison ? dataValue.combinaison.standardize() : void 0;
|
511
495
|
formula = formula && formula.trim().length > 0 ? formula : void 0;
|
512
496
|
if (!statistiqueTemplate.statistics) {
|
@@ -533,41 +517,32 @@ function verifyTemplateValue(template) {
|
|
533
517
|
};
|
534
518
|
}
|
535
519
|
if (template.total) {
|
536
|
-
if (template.total <= 0)
|
537
|
-
template.total = void 0;
|
520
|
+
if (template.total <= 0) template.total = void 0;
|
538
521
|
statistiqueTemplate.total = template.total;
|
539
522
|
}
|
540
|
-
if (template.charName)
|
541
|
-
|
542
|
-
if (template.damage)
|
543
|
-
statistiqueTemplate.damage = template.damage;
|
523
|
+
if (template.charName) statistiqueTemplate.charName = template.charName;
|
524
|
+
if (template.damage) statistiqueTemplate.damage = template.damage;
|
544
525
|
testDiceRegistered(statistiqueTemplate);
|
545
526
|
testStatCombinaison(statistiqueTemplate);
|
546
527
|
return statistiqueTemplate;
|
547
528
|
}
|
548
529
|
function testDiceRegistered(template) {
|
549
|
-
if (!template.damage)
|
550
|
-
|
551
|
-
if (Object.keys(template.damage).length
|
552
|
-
throw new EmptyObjectError();
|
553
|
-
if (Object.keys(template.damage).length > 25)
|
554
|
-
throw new TooManyDice();
|
530
|
+
if (!template.damage) return;
|
531
|
+
if (Object.keys(template.damage).length === 0) throw new EmptyObjectError();
|
532
|
+
if (Object.keys(template.damage).length > 25) throw new TooManyDice();
|
555
533
|
for (const [name, dice] of Object.entries(template.damage)) {
|
556
|
-
if (!dice)
|
557
|
-
continue;
|
534
|
+
if (!dice) continue;
|
558
535
|
const randomDiceParsed = diceRandomParse(dice, template);
|
559
536
|
try {
|
560
537
|
const rolled = roll(randomDiceParsed);
|
561
|
-
if (!rolled)
|
562
|
-
throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
538
|
+
if (!rolled) throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
563
539
|
} catch (error) {
|
564
540
|
throw new DiceTypeError(name, "testDiceRegistered", error);
|
565
541
|
}
|
566
542
|
}
|
567
543
|
}
|
568
544
|
function testStatCombinaison(template) {
|
569
|
-
if (!template.statistics)
|
570
|
-
return;
|
545
|
+
if (!template.statistics) return;
|
571
546
|
const onlycombinaisonStats = Object.fromEntries(
|
572
547
|
Object.entries(template.statistics).filter(
|
573
548
|
([_, value]) => value.combinaison !== void 0
|
@@ -576,13 +551,11 @@ function testStatCombinaison(template) {
|
|
576
551
|
const allOtherStats = Object.fromEntries(
|
577
552
|
Object.entries(template.statistics).filter(([_, value]) => !value.combinaison)
|
578
553
|
);
|
579
|
-
if (Object.keys(onlycombinaisonStats).length === 0)
|
580
|
-
return;
|
554
|
+
if (Object.keys(onlycombinaisonStats).length === 0) return;
|
581
555
|
const allStats = Object.keys(template.statistics).filter(
|
582
556
|
(stat) => !template.statistics[stat].combinaison
|
583
557
|
);
|
584
|
-
if (allStats.length === 0)
|
585
|
-
throw new NoStatisticsError();
|
558
|
+
if (allStats.length === 0) throw new NoStatisticsError();
|
586
559
|
const error = [];
|
587
560
|
for (const [stat, value] of Object.entries(onlycombinaisonStats)) {
|
588
561
|
let formula = value.combinaison;
|
@@ -599,22 +572,17 @@ function testStatCombinaison(template) {
|
|
599
572
|
error.push(stat);
|
600
573
|
}
|
601
574
|
}
|
602
|
-
if (error.length > 0)
|
603
|
-
throw new FormulaError(error.join(", "), "testStatCombinaison");
|
575
|
+
if (error.length > 0) throw new FormulaError(error.join(", "), "testStatCombinaison");
|
604
576
|
return;
|
605
577
|
}
|
606
578
|
function generateRandomStat(total = 100, max, min) {
|
607
579
|
let randomStatValue = total + 1;
|
608
580
|
while (randomStatValue >= total && randomStatValue <= 0) {
|
609
581
|
const random = new import_random_js.Random();
|
610
|
-
if (max && min)
|
611
|
-
|
612
|
-
else if (
|
613
|
-
|
614
|
-
else if (min)
|
615
|
-
randomStatValue = random.integer(min, total);
|
616
|
-
else
|
617
|
-
randomStatValue = random.integer(1, total);
|
582
|
+
if (max && min) randomStatValue = random.integer(min, max);
|
583
|
+
else if (max) randomStatValue = random.integer(1, max);
|
584
|
+
else if (min) randomStatValue = random.integer(min, total);
|
585
|
+
else randomStatValue = random.integer(1, total);
|
618
586
|
}
|
619
587
|
return randomStatValue;
|
620
588
|
}
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/dice.ts","../src/errors.ts","../src/interfaces/constant.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["export * from \"./dice\";\nexport * from \"./interfaces\";\nexport * from \"./utils\";\nexport * from \"./verify_template\";\nexport * from \"./errors\";\nexport * from \"./interfaces/constant\";\n","/* eslint-disable no-useless-escape */\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\nimport { evaluate } from \"mathjs\";\n\nimport type { Compare, Modifier, Resultat, Sign } from \".\";\nimport { DiceTypeError } from \"./errors\";\nimport {\n\tCOMMENT_REGEX,\n\tSIGN_REGEX,\n\tSIGN_REGEX_SPACE,\n\tSYMBOL_DICE,\n} from \"./interfaces/constant\";\n\nfunction getCompare(\n\tdice: string,\n\tcompareRegex: RegExpMatchArray\n): { dice: string; compare: Compare | undefined } {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\n\tlet compare: Compare;\n\tconst calc = compareRegex[1];\n\tconst sign = calc.match(/[+-\\/*^]/)?.[0];\n\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\tif (sign) {\n\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\").replace(/;(.*)/, \"\");\n\t\tconst total = evaluate(toCalc);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: total,\n\t\t};\n\t} else\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t};\n\treturn { dice, compare };\n}\n\nfunction getModifier(dice: string) {\n\tconst modifier = dice.matchAll(/(\\+|-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\n\tlet modificator: Modifier | undefined;\n\tfor (const mod of modifier) {\n\t\t//calculate the modifier if multiple\n\t\tif (modificator) {\n\t\t\tconst sign = modificator.sign;\n\t\t\tlet value = modificator.value;\n\t\t\tif (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t} else {\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue: Number.parseInt(mod[2], 10),\n\t\t\t};\n\t\t}\n\t}\n\treturn modificator;\n}\n\n/**\n * Parse the string provided and turn it as a readable dice for dice parser\n * @param dice {string}\n */\nexport function roll(dice: string): Resultat | undefined {\n\t//parse dice string\n\tif (!dice.includes(\"d\")) return undefined;\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\n\tlet compare: Compare | undefined;\n\tif (dice.includes(\";\") && dice.includes(\"&\")) return sharedRolls(dice);\n\tif (compareRegex) {\n\t\tconst compareResult = getCompare(dice, compareRegex);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = compareResult.dice;\n\t\tcompare = compareResult.compare;\n\t}\n\tconst modificator = getModifier(dice);\n\n\tif (dice.match(/\\d+?#(.*)/)) {\n\t\tconst diceArray = dice.split(\"#\");\n\t\tconst numberOfDice = Number.parseInt(diceArray[0], 10);\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\n\t\tconst roller = new DiceRoller();\n\t\t//remove comments if any\n\t\tfor (let i = 0; i < numberOfDice; i++) {\n\t\t\ttry {\n\t\t\t\troller.roll(diceToRoll);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new DiceTypeError(diceToRoll, \"roll\", error);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdice: diceToRoll,\n\t\t\tresult: roller.output,\n\t\t\tcomment: comments,\n\t\t\tcompare: compare ? compare : undefined,\n\t\t\tmodifier: modificator,\n\t\t\ttotal: roller.total,\n\t\t};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\").trimEnd();\n\ttry {\n\t\troller.roll(diceWithoutComment);\n\t} catch (error) {\n\t\tthrow new DiceTypeError(diceWithoutComment, \"roll\", error);\n\t}\n\tconst commentMatch = dice.match(COMMENT_REGEX);\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\treturn {\n\t\tdice,\n\t\tresult: roller.output,\n\t\tcomment,\n\t\tcompare: compare ? compare : undefined,\n\t\tmodifier: modificator,\n\t\ttotal: roller.total,\n\t};\n}\n/**\n * Evaluate a formula and replace \"^\" by \"**\" if any\n * @param {Sign} sign\n * @param {number} value\n * @param {number} total\n * @returns\n */\nexport function calculator(sign: Sign, value: number, total: number): number {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tif (sign === \"^\") sign = \"**\";\n\treturn evaluate(`${total} ${sign} ${value}`);\n}\n\nfunction inverseSign(\n\tsign: \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\"\n): \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\" {\n\tswitch (sign) {\n\t\tcase \"<\":\n\t\t\treturn \">\";\n\t\tcase \">\":\n\t\t\treturn \"<\";\n\t\tcase \"<=\":\n\t\t\treturn \">=\";\n\t\tcase \">=\":\n\t\t\treturn \"<=\";\n\t\tcase \"=\":\n\t\t\treturn \"!=\";\n\t\tcase \"==\":\n\t\t\treturn \"!=\";\n\t\tcase \"!=\":\n\t\t\treturn \"==\";\n\t}\n}\n\nfunction replaceInFormula(\n\telement: string,\n\tdiceResult: Resultat,\n\tcompareResult: { dice: string; compare: Compare | undefined },\n\tres: boolean\n) {\n\tconst { formule, diceAll } = replaceText(\n\t\telement,\n\t\tdiceResult.total ?? 0,\n\t\tdiceResult.dice\n\t);\n\tconst validSign = res ? \"✓\" : \"✕\";\n\tconst invertedSign = res\n\t\t? compareResult.compare!.sign\n\t\t: inverseSign(compareResult.compare!.sign);\n\tlet evaluateRoll: unknown;\n\ttry {\n\t\tevaluateRoll = evaluate(compareResult.dice);\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t} catch (error) {\n\t\tconst evaluateRoll = roll(compareResult.dice) as Resultat | undefined;\n\t\tif (evaluateRoll)\n\t\t\treturn `${validSign} ${diceAll}: ${evaluateRoll.result.split(\":\").splice(1).join(\":\")}`;\n\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t}\n}\n\nfunction compareSignFormule(\n\ttoRoll: string,\n\tcompareRegex: RegExpMatchArray,\n\telement: string,\n\tdiceResult: Resultat\n) {\n\tlet results = \"\";\n\tconst compareResult = getCompare(toRoll, compareRegex);\n\tconst toCompare = `${compareResult.dice}${compareResult.compare?.sign}${compareResult.compare?.value}`;\n\tlet res: unknown;\n\ttry {\n\t\tres = evaluate(toCompare);\n\t} catch (error) {\n\t\tres = roll(toCompare);\n\t}\n\tif (typeof res === \"boolean\") {\n\t\tresults = replaceInFormula(element, diceResult, compareResult, res);\n\t} else if (res instanceof Object) {\n\t\tconst diceResult = res as Resultat;\n\t\tif (diceResult.compare) {\n\t\t\tconst toEvaluate = evaluate(\n\t\t\t\t`${diceResult.total}${diceResult.compare.sign}${diceResult.compare.value}`\n\t\t\t);\n\t\t\tconst sign = toEvaluate ? \"✓\" : \"✕\";\n\t\t\tconst invertedSign = toEvaluate\n\t\t\t\t? diceResult.compare.sign\n\t\t\t\t: inverseSign(diceResult.compare.sign);\n\t\t\tconst dice = replaceText(element, 0, diceResult.dice).diceAll;\n\n\t\t\tresults = `${sign} ${dice}: ${diceResult.result.split(\":\").splice(1).join(\":\").trim()}${invertedSign}${diceResult.compare.value}`;\n\t\t}\n\t}\n\treturn { dice: compareResult.dice, results };\n}\n\nfunction replaceText(element: string, total: number, dice: string) {\n\treturn {\n\t\tformule: element.replace(SYMBOL_DICE, `[${total}]`).trim(),\n\t\tdiceAll: element.replace(SYMBOL_DICE, `[${dice.replace(COMMENT_REGEX, \"\")}]`).trim(),\n\t};\n}\n\nfunction sharedRolls(dice: string): Resultat | undefined {\n\t/* bulk roll are not allowed in shared rolls */\n\tif (dice.includes(\"#\"))\n\t\tthrow new DiceTypeError(\n\t\t\tdice,\n\t\t\t\"noBulkRoll\",\n\t\t\t\"bulk roll are not allowed in shared rolls\"\n\t\t);\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\tif (!element.includes(SYMBOL_DICE)) {\n\t\t\tconst result = roll(element);\n\t\t\tif (!result) continue;\n\t\t\tresults.push(result.result);\n\t\t\tcontinue;\n\t\t}\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tlet toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);\n\t\tconst compareRegex = toRoll.match(SIGN_REGEX_SPACE);\n\t\tif (compareRegex) {\n\t\t\tconst compareResult = compareSignFormule(toRoll, compareRegex, element, diceResult);\n\t\t\ttoRoll = compareResult.dice;\n\t\t\tresults.push(compareResult.results);\n\t\t} else {\n\t\t\tconst { formule, diceAll } = replaceText(\n\t\t\t\telement,\n\t\t\t\tdiceResult.total,\n\t\t\t\tdiceResult.dice\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst evaluated = evaluate(toRoll);\n\t\t\t\tresults.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += Number.parseInt(evaluated, 10);\n\t\t\t} catch (error) {\n\t\t\t\tconst evaluated = roll(toRoll);\n\t\t\t\tif (evaluated)\n\t\t\t\t\tresults.push(`◈ ${diceAll}: ${evaluated.result.split(\":\").slice(1).join(\":\")}`);\n\t\t\t\telse results.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += evaluated?.total ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tdice: split[0],\n\t\tresult: results.join(\";\"),\n\t\tcomment: comments,\n\t\tcompare: diceResult.compare,\n\t\tmodifier: diceResult.modifier,\n\t\ttotal,\n\t};\n}\n","export class DiceTypeError extends Error {\n\tpublic readonly dice: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(dice: string, cause?: string, method?: unknown) {\n\t\tsuper(dice);\n\t\tthis.name = \"Invalid_Dice_Type\";\n\t\tthis.dice = dice;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class FormulaError extends Error {\n\tpublic readonly formula: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(formula: string, cause?: string, method?: unknown) {\n\t\tsuper(formula);\n\t\tthis.name = \"Invalid_Formula\";\n\t\tthis.formula = formula;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class MaxGreater extends Error {\n\tpublic readonly name: string;\n\tpublic readonly value: number;\n\tpublic readonly max: number;\n\n\tconstructor(value: number, max: number) {\n\t\tsuper(value.toString());\n\t\tthis.name = \"Max_Greater\";\n\t\tthis.value = value;\n\t\tthis.max = max;\n\t}\n}\n\nexport class EmptyObjectError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Empty_Object\";\n\t}\n}\n\nexport class TooManyDice extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Dice\";\n\t}\n}\n\nexport class TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\n\t}\n}\n\nexport class NoStatisticsError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"No_Statistics\";\n\t}\n}\n","export const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nexport const SIGN_REGEX = /[><=!]+/;\nexport const SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\n\nexport const SYMBOL_DICE = \"&\";\n","import { evaluate } from \"mathjs\";\nimport \"uniformize\";\nimport { FormulaError } from \"./errors\";\n\n/**\n * Escape regex string\n * @param string {string}\n */\nexport function escapeRegex(string: string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\n * @param originalDice {dice}\n * @param stats {[name: string]: number}\n */\nexport function generateStatsDice(\n\toriginalDice: string,\n\tstats?: { [name: string]: number }\n) {\n\tlet dice = originalDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\t//damage field support adding statistic, like : 1d6 + strength\n\t\t//check if the value contains a statistic & calculate if it's okay\n\t\t//the dice will be converted before roll\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (dice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\treturn replaceFormulaInDice(dice);\n}\n\n/**\n * Replace the {{}} in the dice string and evaluate the interior if any\n * @param dice {string}\n */\nexport function replaceFormulaInDice(dice: string) {\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gim;\n\tconst formulaMatch = formula.exec(dice);\n\tif (formulaMatch?.groups?.formula) {\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(formulaMatch.groups.formula, \"replaceFormulaInDice\", error);\n\t\t}\n\t}\n\treturn cleanedDice(dice);\n}\n\n/**\n * Replace the ++ +- -- by their proper value:\n * - `++` = `+`\n * - `+-` = `-`\n * - `--` = `+`\n * @param dice {string}\n */\nexport function cleanedDice(dice: string) {\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\").trimEnd();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport \"uniformize\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n\tTooManyStats,\n} from \"./errors\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\n\n/**\n * Verify if the provided dice work with random value\n * @param testDice {string}\n * @param stats {[name: string]: number}\n */\nexport function evalStatsDice(testDice: string, stats?: { [name: string]: number }) {\n\tlet dice = testDice.trimEnd();\n\tif (stats && Object.keys(stats).length > 0) {\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (testDice.standardize().match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = testDice.standardize().replace(regex, statValue.toString()).trimEnd();\n\t\t\t}\n\t\t}\n\t}\n\ttry {\n\t\tif (!roll(replaceFormulaInDice(dice)))\n\t\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", \"no roll result\");\n\t\treturn testDice;\n\t} catch (error) {\n\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", error);\n\t}\n}\n\n/**\n * Generate a random dice and remove the formula (+ evaluate it)\n * Used for diceDamage only\n * @param value {string}\n * @param template {StatisticalTemplate}\n * @returns\n */\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return value;\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tvalue = value.standardize();\n\tconst statNames = Object.keys(template.statistics);\n\tlet newDice = value;\n\tfor (const name of statNames) {\n\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\tif (value.match(regex)) {\n\t\t\tlet max: undefined | number = undefined;\n\t\t\tlet min: undefined | number = undefined;\n\t\t\tconst foundStat = template.statistics?.[name];\n\t\t\tif (foundStat) {\n\t\t\t\tmax = foundStat.max;\n\t\t\t\tmin = foundStat.min;\n\t\t\t}\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\n\t\t}\n\t}\n\treturn replaceFormulaInDice(newDice);\n}\n\n/**\n * Same as damageDice but for DiceType\n * @param dice {string}\n * @param template {StatisticalTemplate}\n */\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return dice;\n\tconst firstStatNotcombinaison = Object.keys(template.statistics).find(\n\t\t(stat) => !template.statistics?.[stat].combinaison\n\t);\n\tif (!firstStatNotcombinaison) return dice;\n\tconst stats = template.statistics[firstStatNotcombinaison];\n\tconst { min, max } = stats;\n\tconst total = template.total || 100;\n\tconst randomStatValue = generateRandomStat(total, max, min);\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\n}\n\n/**\n * Random the combinaison and evaluate it to check if everything is valid\n * @param combinaison {[name: string]: string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalCombinaison(\n\tcombinaison: { [name: string]: string },\n\tstats: { [name: string]: string | number }\n) {\n\tconst newStats: { [name: string]: number } = {};\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\n\t\t//replace the stats in formula\n\t\tlet formula = combin.standardize();\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tnewStats[stat] = evaluate(formula);\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(stat, \"evalCombinaison\", error);\n\t\t}\n\t}\n\treturn newStats;\n}\n\n/**\n * Evaluate one selected combinaison\n * @param combinaison {string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalOneCombinaison(\n\tcombinaison: string,\n\tstats: { [name: string]: string | number }\n) {\n\tlet formula = combinaison.standardize();\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\tformula = formula.replace(regex, value.toString());\n\t}\n\ttry {\n\t\treturn evaluate(formula);\n\t} catch (error) {\n\t\tthrow new FormulaError(combinaison, \"evalOneCombinaison\", error);\n\t}\n}\n\n/**\n * Parse the provided JSON and verify each field to check if everything could work when rolling\n * @param {any} template\n * @returns {StatisticalTemplate}\n */\n//biome-ignore lint/suspicious/noExplicitAny: I need to use any to allow any type\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\n\tconst statistiqueTemplate: StatisticalTemplate = {\n\t\tdiceType: \"\",\n\t\tstatistics: {} as Statistic,\n\t};\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\n\t\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\n\t\t\tconst dataValue = value as { max?: number; min?: number; combinaison?: string };\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\n\t\t\t\tthrow new MaxGreater(dataValue.min, dataValue.max);\n\t\t\tif (dataValue.max && dataValue.max <= 0) dataValue.max = undefined;\n\t\t\tif (dataValue.min && dataValue.min <= 0) dataValue.min = undefined;\n\t\t\tlet formula = dataValue.combinaison\n\t\t\t\t? dataValue.combinaison.standardize()\n\t\t\t\t: undefined;\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\n\t\t\tif (!statistiqueTemplate.statistics) {\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\n\t\t\t}\n\t\t\tstatistiqueTemplate.statistics[key] = {\n\t\t\t\tmax: dataValue.max,\n\t\t\t\tmin: dataValue.min,\n\t\t\t\tcombinaison: formula || undefined,\n\t\t\t};\n\t\t}\n\t}\n\tif (template.diceType) {\n\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\tconst rolled = roll(cleanedDice);\n\t\tif (!rolled)\n\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t}\n\n\tif (template.critical && Object.keys(template.critical).length > 0) {\n\t\tstatistiqueTemplate.critical = {\n\t\t\tfailure: template.critical.failure ?? undefined,\n\t\t\tsuccess: template.critical.success ?? undefined,\n\t\t};\n\t}\n\tif (template.total) {\n\t\tif (template.total <= 0) template.total = undefined;\n\t\tstatistiqueTemplate.total = template.total;\n\t}\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\n\ttestDiceRegistered(statistiqueTemplate);\n\ttestStatCombinaison(statistiqueTemplate);\n\treturn statistiqueTemplate;\n}\n\n/**\n * Test each damage roll from the template.damage\n * @param {StatisticalTemplate} template\n */\nexport function testDiceRegistered(template: StatisticalTemplate) {\n\tif (!template.damage) return;\n\tif (Object.keys(template.damage).length === 0) throw new EmptyObjectError();\n\tif (Object.keys(template.damage).length > 25) throw new TooManyDice();\n\tfor (const [name, dice] of Object.entries(template.damage)) {\n\t\tif (!dice) continue;\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\n\t\ttry {\n\t\t\tconst rolled = roll(randomDiceParsed);\n\t\t\tif (!rolled) throw new DiceTypeError(name, \"testDiceRegistered\", \"no roll result\");\n\t\t} catch (error) {\n\t\t\tthrow new DiceTypeError(name, \"testDiceRegistered\", error);\n\t\t}\n\t}\n}\n\n/**\n * Test all combinaison with generated random value\n * @param {StatisticalTemplate} template\n */\nexport function testStatCombinaison(template: StatisticalTemplate) {\n\tif (!template.statistics) return;\n\tconst onlycombinaisonStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(\n\t\t\t([_, value]) => value.combinaison !== undefined\n\t\t)\n\t);\n\tconst allOtherStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(([_, value]) => !value.combinaison)\n\t);\n\tif (Object.keys(onlycombinaisonStats).length === 0) return;\n\tconst allStats = Object.keys(template.statistics).filter(\n\t\t(stat) => !template.statistics![stat].combinaison\n\t);\n\tif (allStats.length === 0) throw new NoStatisticsError();\n\tconst error = [];\n\tfor (const [stat, value] of Object.entries(onlycombinaisonStats)) {\n\t\tlet formula = value.combinaison as string;\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\n\t\t\tconst { max, min } = data;\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tconst regex = new RegExp(other, \"gi\");\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\n\t\t}\n\t\ttry {\n\t\t\tevaluate(formula);\n\t\t} catch (e) {\n\t\t\terror.push(stat);\n\t\t}\n\t}\n\tif (error.length > 0) throw new FormulaError(error.join(\", \"), \"testStatCombinaison\");\n\treturn;\n}\n\n/**\n * Generate a random stat based on the template and the statistical min and max\n * @param {number|undefined} total\n * @param {number | undefined} max\n * @param {number | undefined} min\n * @returns\n */\nexport function generateRandomStat(\n\ttotal: number | undefined = 100,\n\tmax?: number,\n\tmin?: number\n) {\n\tlet randomStatValue = total + 1;\n\twhile (randomStatValue >= total && randomStatValue <= 0) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(1, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(1, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","evaluateRoll","diceResult","import_mathjs","formula","import_mathjs","import_uniformize","cleanedDice"]}
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/dice.ts","../src/errors.ts","../src/interfaces/constant.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["export * from \"./dice\";\nexport * from \"./interfaces\";\nexport * from \"./utils\";\nexport * from \"./verify_template\";\nexport * from \"./errors\";\nexport * from \"./interfaces/constant\";\n","/* eslint-disable no-useless-escape */\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\nimport { evaluate } from \"mathjs\";\n\nimport type { Compare, Modifier, Resultat, Sign } from \".\";\nimport { DiceTypeError } from \"./errors\";\nimport {\n\tCOMMENT_REGEX,\n\tSIGN_REGEX,\n\tSIGN_REGEX_SPACE,\n\tSYMBOL_DICE,\n} from \"./interfaces/constant\";\n\nfunction getCompare(\n\tdice: string,\n\tcompareRegex: RegExpMatchArray\n): { dice: string; compare: Compare | undefined } {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\n\tlet compare: Compare;\n\tconst calc = compareRegex[1];\n\tconst sign = calc.match(/[+-\\/*^]/)?.[0];\n\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\tif (sign) {\n\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\").replace(/;(.*)/, \"\");\n\t\tconst total = evaluate(toCalc);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: total,\n\t\t};\n\t} else\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t};\n\treturn { dice, compare };\n}\n\nfunction getModifier(dice: string) {\n\tconst modifier = dice.matchAll(/(\\+|-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\n\tlet modificator: Modifier | undefined;\n\tfor (const mod of modifier) {\n\t\t//calculate the modifier if multiple\n\t\tif (modificator) {\n\t\t\tconst sign = modificator.sign;\n\t\t\tlet value = modificator.value;\n\t\t\tif (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t} else {\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue: Number.parseInt(mod[2], 10),\n\t\t\t};\n\t\t}\n\t}\n\treturn modificator;\n}\n\n/**\n * Parse the string provided and turn it as a readable dice for dice parser\n * @param dice {string}\n */\nexport function roll(dice: string): Resultat | undefined {\n\t//parse dice string\n\tif (!dice.includes(\"d\")) return undefined;\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\n\tlet compare: Compare | undefined;\n\tif (dice.includes(\";\") && dice.includes(\"&\")) return sharedRolls(dice);\n\tif (compareRegex) {\n\t\tconst compareResult = getCompare(dice, compareRegex);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = compareResult.dice;\n\t\tcompare = compareResult.compare;\n\t}\n\tconst modificator = getModifier(dice);\n\n\tif (dice.match(/\\d+?#(.*)/)) {\n\t\tconst diceArray = dice.split(\"#\");\n\t\tconst numberOfDice = Number.parseInt(diceArray[0], 10);\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\n\t\tconst roller = new DiceRoller();\n\t\t//remove comments if any\n\t\tfor (let i = 0; i < numberOfDice; i++) {\n\t\t\ttry {\n\t\t\t\troller.roll(diceToRoll);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new DiceTypeError(diceToRoll, \"roll\", error);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdice: diceToRoll,\n\t\t\tresult: roller.output,\n\t\t\tcomment: comments,\n\t\t\tcompare: compare ? compare : undefined,\n\t\t\tmodifier: modificator,\n\t\t\ttotal: roller.total,\n\t\t};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\").trimEnd();\n\ttry {\n\t\troller.roll(diceWithoutComment);\n\t} catch (error) {\n\t\tthrow new DiceTypeError(diceWithoutComment, \"roll\", error);\n\t}\n\tconst commentMatch = dice.match(COMMENT_REGEX);\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\treturn {\n\t\tdice,\n\t\tresult: roller.output,\n\t\tcomment,\n\t\tcompare: compare ? compare : undefined,\n\t\tmodifier: modificator,\n\t\ttotal: roller.total,\n\t};\n}\n/**\n * Evaluate a formula and replace \"^\" by \"**\" if any\n * @param {Sign} sign\n * @param {number} value\n * @param {number} total\n * @returns\n */\nexport function calculator(sign: Sign, value: number, total: number): number {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tif (sign === \"^\") sign = \"**\";\n\treturn evaluate(`${total} ${sign} ${value}`);\n}\n\nfunction inverseSign(\n\tsign: \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\"\n): \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\" {\n\tswitch (sign) {\n\t\tcase \"<\":\n\t\t\treturn \">\";\n\t\tcase \">\":\n\t\t\treturn \"<\";\n\t\tcase \"<=\":\n\t\t\treturn \">=\";\n\t\tcase \">=\":\n\t\t\treturn \"<=\";\n\t\tcase \"=\":\n\t\t\treturn \"!=\";\n\t\tcase \"==\":\n\t\t\treturn \"!=\";\n\t\tcase \"!=\":\n\t\t\treturn \"==\";\n\t}\n}\n\nfunction replaceInFormula(\n\telement: string,\n\tdiceResult: Resultat,\n\tcompareResult: { dice: string; compare: Compare | undefined },\n\tres: boolean\n) {\n\tconst { formule, diceAll } = replaceText(\n\t\telement,\n\t\tdiceResult.total ?? 0,\n\t\tdiceResult.dice\n\t);\n\tconst validSign = res ? \"✓\" : \"✕\";\n\tconst invertedSign = res\n\t\t? compareResult.compare!.sign\n\t\t: inverseSign(compareResult.compare!.sign);\n\tlet evaluateRoll: unknown;\n\ttry {\n\t\tevaluateRoll = evaluate(compareResult.dice);\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t} catch (error) {\n\t\tconst evaluateRoll = roll(compareResult.dice) as Resultat | undefined;\n\t\tif (evaluateRoll)\n\t\t\treturn `${validSign} ${diceAll}: ${evaluateRoll.result.split(\":\").splice(1).join(\":\")}`;\n\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t}\n}\n\nfunction compareSignFormule(\n\ttoRoll: string,\n\tcompareRegex: RegExpMatchArray,\n\telement: string,\n\tdiceResult: Resultat\n) {\n\tlet results = \"\";\n\tconst compareResult = getCompare(toRoll, compareRegex);\n\tconst toCompare = `${compareResult.dice}${compareResult.compare?.sign}${compareResult.compare?.value}`;\n\tlet res: unknown;\n\ttry {\n\t\tres = evaluate(toCompare);\n\t} catch (error) {\n\t\tres = roll(toCompare);\n\t}\n\tif (typeof res === \"boolean\") {\n\t\tresults = replaceInFormula(element, diceResult, compareResult, res);\n\t} else if (res instanceof Object) {\n\t\tconst diceResult = res as Resultat;\n\t\tif (diceResult.compare) {\n\t\t\tconst toEvaluate = evaluate(\n\t\t\t\t`${diceResult.total}${diceResult.compare.sign}${diceResult.compare.value}`\n\t\t\t);\n\t\t\tconst sign = toEvaluate ? \"✓\" : \"✕\";\n\t\t\tconst invertedSign = toEvaluate\n\t\t\t\t? diceResult.compare.sign\n\t\t\t\t: inverseSign(diceResult.compare.sign);\n\t\t\tconst dice = replaceText(element, 0, diceResult.dice).diceAll;\n\n\t\t\tresults = `${sign} ${dice}: ${diceResult.result.split(\":\").splice(1).join(\":\").trim()}${invertedSign}${diceResult.compare.value}`;\n\t\t}\n\t}\n\treturn { dice: compareResult.dice, results };\n}\n\nfunction replaceText(element: string, total: number, dice: string) {\n\treturn {\n\t\tformule: element.replace(SYMBOL_DICE, `[${total}]`).trim(),\n\t\tdiceAll: element.replace(SYMBOL_DICE, `[${dice.replace(COMMENT_REGEX, \"\")}]`).trim(),\n\t};\n}\n\nfunction sharedRolls(dice: string): Resultat | undefined {\n\t/* bulk roll are not allowed in shared rolls */\n\tif (dice.includes(\"#\"))\n\t\tthrow new DiceTypeError(\n\t\t\tdice,\n\t\t\t\"noBulkRoll\",\n\t\t\t\"bulk roll are not allowed in shared rolls\"\n\t\t);\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\tif (!element.includes(SYMBOL_DICE)) {\n\t\t\tconst result = roll(element);\n\t\t\tif (!result) continue;\n\t\t\tresults.push(result.result);\n\t\t\tcontinue;\n\t\t}\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tlet toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);\n\t\tconst compareRegex = toRoll.match(SIGN_REGEX_SPACE);\n\t\tif (compareRegex) {\n\t\t\tconst compareResult = compareSignFormule(toRoll, compareRegex, element, diceResult);\n\t\t\ttoRoll = compareResult.dice;\n\t\t\tresults.push(compareResult.results);\n\t\t} else {\n\t\t\tconst { formule, diceAll } = replaceText(\n\t\t\t\telement,\n\t\t\t\tdiceResult.total,\n\t\t\t\tdiceResult.dice\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst evaluated = evaluate(toRoll);\n\t\t\t\tresults.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += Number.parseInt(evaluated, 10);\n\t\t\t} catch (error) {\n\t\t\t\tconst evaluated = roll(toRoll);\n\t\t\t\tif (evaluated)\n\t\t\t\t\tresults.push(`◈ ${diceAll}: ${evaluated.result.split(\":\").slice(1).join(\":\")}`);\n\t\t\t\telse results.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += evaluated?.total ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tdice: split[0],\n\t\tresult: results.join(\";\"),\n\t\tcomment: comments,\n\t\tcompare: diceResult.compare,\n\t\tmodifier: diceResult.modifier,\n\t\ttotal,\n\t};\n}\n","export class DiceTypeError extends Error {\n\tpublic readonly dice: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(dice: string, cause?: string, method?: unknown) {\n\t\tsuper(dice);\n\t\tthis.name = \"Invalid_Dice_Type\";\n\t\tthis.dice = dice;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class FormulaError extends Error {\n\tpublic readonly formula: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(formula: string, cause?: string, method?: unknown) {\n\t\tsuper(formula);\n\t\tthis.name = \"Invalid_Formula\";\n\t\tthis.formula = formula;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class MaxGreater extends Error {\n\tpublic readonly name: string;\n\tpublic readonly value: number;\n\tpublic readonly max: number;\n\n\tconstructor(value: number, max: number) {\n\t\tsuper(value.toString());\n\t\tthis.name = \"Max_Greater\";\n\t\tthis.value = value;\n\t\tthis.max = max;\n\t}\n}\n\nexport class EmptyObjectError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Empty_Object\";\n\t}\n}\n\nexport class TooManyDice extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Dice\";\n\t}\n}\n\nexport class TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\n\t}\n}\n\nexport class NoStatisticsError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"No_Statistics\";\n\t}\n}\n","export const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nexport const SIGN_REGEX = /[><=!]+/;\nexport const SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\n\nexport const SYMBOL_DICE = \"&\";\n","import { evaluate } from \"mathjs\";\nimport \"uniformize\";\nimport { FormulaError } from \"./errors\";\n\n/**\n * Escape regex string\n * @param string {string}\n */\nexport function escapeRegex(string: string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\n * @param originalDice {dice}\n * @param stats {[name: string]: number}\n */\nexport function generateStatsDice(\n\toriginalDice: string,\n\tstats?: { [name: string]: number }\n) {\n\tlet dice = originalDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\t//damage field support adding statistic, like : 1d6 + strength\n\t\t//check if the value contains a statistic & calculate if it's okay\n\t\t//the dice will be converted before roll\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (dice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\treturn replaceFormulaInDice(dice);\n}\n\n/**\n * Replace the {{}} in the dice string and evaluate the interior if any\n * @param dice {string}\n */\nexport function replaceFormulaInDice(dice: string) {\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gim;\n\tconst formulaMatch = formula.exec(dice);\n\tif (formulaMatch?.groups?.formula) {\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(formulaMatch.groups.formula, \"replaceFormulaInDice\", error);\n\t\t}\n\t}\n\treturn cleanedDice(dice);\n}\n\n/**\n * Replace the ++ +- -- by their proper value:\n * - `++` = `+`\n * - `+-` = `-`\n * - `--` = `+`\n * @param dice {string}\n */\nexport function cleanedDice(dice: string) {\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\").trimEnd();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport \"uniformize\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n\tTooManyStats,\n} from \"./errors\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\n\n/**\n * Verify if the provided dice work with random value\n * @param testDice {string}\n * @param allStats {[name: string]: number}\n */\nexport function evalStatsDice(testDice: string, allStats?: { [name: string]: number }) {\n\tlet dice = testDice.trimEnd();\n\tif (allStats && Object.keys(allStats).length > 0) {\n\t\tconst names = Object.keys(allStats);\n\t\tfor (const name of names) {\n\t\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\t\tif (dice.standardize().match(regex)) {\n\t\t\t\tconst statValue = allStats[name];\n\t\t\t\tdice = dice.standardize().replace(regex, statValue.toString()).trimEnd();\n\t\t\t}\n\t\t}\n\t}\n\ttry {\n\t\tif (!roll(replaceFormulaInDice(dice)))\n\t\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", \"no roll result\");\n\t\treturn testDice;\n\t} catch (error) {\n\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", error);\n\t}\n}\n\n/**\n * Generate a random dice and remove the formula (+ evaluate it)\n * Used for diceDamage only\n * @param value {string}\n * @param template {StatisticalTemplate}\n * @returns\n */\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return value;\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tvalue = value.standardize();\n\tconst statNames = Object.keys(template.statistics);\n\tlet newDice = value;\n\tfor (const name of statNames) {\n\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\tif (value.match(regex)) {\n\t\t\tlet max: undefined | number = undefined;\n\t\t\tlet min: undefined | number = undefined;\n\t\t\tconst foundStat = template.statistics?.[name];\n\t\t\tif (foundStat) {\n\t\t\t\tmax = foundStat.max;\n\t\t\t\tmin = foundStat.min;\n\t\t\t}\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\n\t\t}\n\t}\n\treturn replaceFormulaInDice(newDice);\n}\n\n/**\n * Same as damageDice but for DiceType\n * @param dice {string}\n * @param template {StatisticalTemplate}\n */\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return dice;\n\tconst firstStatNotcombinaison = Object.keys(template.statistics).find(\n\t\t(stat) => !template.statistics?.[stat].combinaison\n\t);\n\tif (!firstStatNotcombinaison) return dice;\n\tconst stats = template.statistics[firstStatNotcombinaison];\n\tconst { min, max } = stats;\n\tconst total = template.total || 100;\n\tconst randomStatValue = generateRandomStat(total, max, min);\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\n}\n\n/**\n * Random the combinaison and evaluate it to check if everything is valid\n * @param combinaison {[name: string]: string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalCombinaison(\n\tcombinaison: { [name: string]: string },\n\tstats: { [name: string]: string | number }\n) {\n\tconst newStats: { [name: string]: number } = {};\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\n\t\t//replace the stats in formula\n\t\tlet formula = combin.standardize();\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tnewStats[stat] = evaluate(formula);\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(stat, \"evalCombinaison\", error);\n\t\t}\n\t}\n\treturn newStats;\n}\n\n/**\n * Evaluate one selected combinaison\n * @param combinaison {string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalOneCombinaison(\n\tcombinaison: string,\n\tstats: { [name: string]: string | number }\n) {\n\tlet formula = combinaison.standardize();\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\tformula = formula.replace(regex, value.toString());\n\t}\n\ttry {\n\t\treturn evaluate(formula);\n\t} catch (error) {\n\t\tthrow new FormulaError(combinaison, \"evalOneCombinaison\", error);\n\t}\n}\n\n/**\n * Parse the provided JSON and verify each field to check if everything could work when rolling\n * @param {any} template\n * @returns {StatisticalTemplate}\n */\n//biome-ignore lint/suspicious/noExplicitAny: I need to use any to allow any type\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\n\tconst statistiqueTemplate: StatisticalTemplate = {\n\t\tdiceType: \"\",\n\t\tstatistics: {} as Statistic,\n\t};\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\n\t\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\n\t\t\tconst dataValue = value as { max?: number; min?: number; combinaison?: string };\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\n\t\t\t\tthrow new MaxGreater(dataValue.min, dataValue.max);\n\t\t\tif (dataValue.max && dataValue.max <= 0) dataValue.max = undefined;\n\t\t\tif (dataValue.min && dataValue.min <= 0) dataValue.min = undefined;\n\t\t\tlet formula = dataValue.combinaison\n\t\t\t\t? dataValue.combinaison.standardize()\n\t\t\t\t: undefined;\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\n\t\t\tif (!statistiqueTemplate.statistics) {\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\n\t\t\t}\n\t\t\tstatistiqueTemplate.statistics[key] = {\n\t\t\t\tmax: dataValue.max,\n\t\t\t\tmin: dataValue.min,\n\t\t\t\tcombinaison: formula || undefined,\n\t\t\t};\n\t\t}\n\t}\n\tif (template.diceType) {\n\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\tconst rolled = roll(cleanedDice);\n\t\tif (!rolled)\n\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t}\n\n\tif (template.critical && Object.keys(template.critical).length > 0) {\n\t\tstatistiqueTemplate.critical = {\n\t\t\tfailure: template.critical.failure ?? undefined,\n\t\t\tsuccess: template.critical.success ?? undefined,\n\t\t};\n\t}\n\tif (template.total) {\n\t\tif (template.total <= 0) template.total = undefined;\n\t\tstatistiqueTemplate.total = template.total;\n\t}\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\n\ttestDiceRegistered(statistiqueTemplate);\n\ttestStatCombinaison(statistiqueTemplate);\n\treturn statistiqueTemplate;\n}\n\n/**\n * Test each damage roll from the template.damage\n * @param {StatisticalTemplate} template\n */\nexport function testDiceRegistered(template: StatisticalTemplate) {\n\tif (!template.damage) return;\n\tif (Object.keys(template.damage).length === 0) throw new EmptyObjectError();\n\tif (Object.keys(template.damage).length > 25) throw new TooManyDice();\n\tfor (const [name, dice] of Object.entries(template.damage)) {\n\t\tif (!dice) continue;\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\n\t\ttry {\n\t\t\tconst rolled = roll(randomDiceParsed);\n\t\t\tif (!rolled) throw new DiceTypeError(name, \"testDiceRegistered\", \"no roll result\");\n\t\t} catch (error) {\n\t\t\tthrow new DiceTypeError(name, \"testDiceRegistered\", error);\n\t\t}\n\t}\n}\n\n/**\n * Test all combinaison with generated random value\n * @param {StatisticalTemplate} template\n */\nexport function testStatCombinaison(template: StatisticalTemplate) {\n\tif (!template.statistics) return;\n\tconst onlycombinaisonStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(\n\t\t\t([_, value]) => value.combinaison !== undefined\n\t\t)\n\t);\n\tconst allOtherStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(([_, value]) => !value.combinaison)\n\t);\n\tif (Object.keys(onlycombinaisonStats).length === 0) return;\n\tconst allStats = Object.keys(template.statistics).filter(\n\t\t(stat) => !template.statistics![stat].combinaison\n\t);\n\tif (allStats.length === 0) throw new NoStatisticsError();\n\tconst error = [];\n\tfor (const [stat, value] of Object.entries(onlycombinaisonStats)) {\n\t\tlet formula = value.combinaison as string;\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\n\t\t\tconst { max, min } = data;\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tconst regex = new RegExp(other, \"gi\");\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\n\t\t}\n\t\ttry {\n\t\t\tevaluate(formula);\n\t\t} catch (e) {\n\t\t\terror.push(stat);\n\t\t}\n\t}\n\tif (error.length > 0) throw new FormulaError(error.join(\", \"), \"testStatCombinaison\");\n\treturn;\n}\n\n/**\n * Generate a random stat based on the template and the statistical min and max\n * @param {number|undefined} total\n * @param {number | undefined} max\n * @param {number | undefined} min\n * @returns\n */\nexport function generateRandomStat(\n\ttotal: number | undefined = 100,\n\tmax?: number,\n\tmin?: number\n) {\n\tlet randomStatValue = total + 1;\n\twhile (randomStatValue >= total && randomStatValue <= 0) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(1, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(1, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","evaluateRoll","diceResult","import_mathjs","formula","import_mathjs","import_uniformize","cleanedDice"]}
|
package/dist/index.mjs
CHANGED
@@ -102,8 +102,7 @@ function getModifier(dice) {
|
|
102
102
|
if (modificator) {
|
103
103
|
const sign = modificator.sign;
|
104
104
|
let value = modificator.value;
|
105
|
-
if (sign)
|
106
|
-
value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
105
|
+
if (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
107
106
|
modificator = {
|
108
107
|
sign: mod[1],
|
109
108
|
value
|
@@ -118,12 +117,10 @@ function getModifier(dice) {
|
|
118
117
|
return modificator;
|
119
118
|
}
|
120
119
|
function roll(dice) {
|
121
|
-
if (!dice.includes("d"))
|
122
|
-
return void 0;
|
120
|
+
if (!dice.includes("d")) return void 0;
|
123
121
|
const compareRegex = dice.match(SIGN_REGEX_SPACE);
|
124
122
|
let compare;
|
125
|
-
if (dice.includes(";") && dice.includes("&"))
|
126
|
-
return sharedRolls(dice);
|
123
|
+
if (dice.includes(";") && dice.includes("&")) return sharedRolls(dice);
|
127
124
|
if (compareRegex) {
|
128
125
|
const compareResult = getCompare(dice, compareRegex);
|
129
126
|
dice = compareResult.dice;
|
@@ -172,8 +169,7 @@ function roll(dice) {
|
|
172
169
|
};
|
173
170
|
}
|
174
171
|
function calculator(sign, value, total) {
|
175
|
-
if (sign === "^")
|
176
|
-
sign = "**";
|
172
|
+
if (sign === "^") sign = "**";
|
177
173
|
return evaluate(`${total} ${sign} ${value}`);
|
178
174
|
}
|
179
175
|
function inverseSign(sign) {
|
@@ -255,26 +251,22 @@ function sharedRolls(dice) {
|
|
255
251
|
const results = [];
|
256
252
|
const split = dice.split(";");
|
257
253
|
const diceResult = roll(split[0]);
|
258
|
-
if (!diceResult || !diceResult.total)
|
259
|
-
return void 0;
|
254
|
+
if (!diceResult || !diceResult.total) return void 0;
|
260
255
|
results.push(`${diceResult.result}`);
|
261
256
|
let total = diceResult.total;
|
262
257
|
let comments = diceResult.comment ?? "";
|
263
|
-
if (!total)
|
264
|
-
return diceResult;
|
258
|
+
if (!total) return diceResult;
|
265
259
|
for (let element of split.slice(1)) {
|
266
260
|
if (!element.includes(SYMBOL_DICE)) {
|
267
261
|
const result = roll(element);
|
268
|
-
if (!result)
|
269
|
-
continue;
|
262
|
+
if (!result) continue;
|
270
263
|
results.push(result.result);
|
271
264
|
continue;
|
272
265
|
}
|
273
266
|
const commentMatch = element.match(COMMENT_REGEX);
|
274
267
|
element = element.replace(COMMENT_REGEX, "");
|
275
268
|
const comment = commentMatch ? commentMatch[2] : void 0;
|
276
|
-
if (comment)
|
277
|
-
comments += ` ${comment}`;
|
269
|
+
if (comment) comments += ` ${comment}`;
|
278
270
|
let toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);
|
279
271
|
const compareRegex = toRoll.match(SIGN_REGEX_SPACE);
|
280
272
|
if (compareRegex) {
|
@@ -295,8 +287,7 @@ function sharedRolls(dice) {
|
|
295
287
|
const evaluated = roll(toRoll);
|
296
288
|
if (evaluated)
|
297
289
|
results.push(`\u25C8 ${diceAll}: ${evaluated.result.split(":").slice(1).join(":")}`);
|
298
|
-
else
|
299
|
-
results.push(`\u25C8 ${diceAll}: ${formule} = ${evaluated}`);
|
290
|
+
else results.push(`\u25C8 ${diceAll}: ${formule} = ${evaluated}`);
|
300
291
|
total += evaluated?.total ?? 0;
|
301
292
|
}
|
302
293
|
}
|
@@ -353,15 +344,15 @@ function cleanedDice(dice) {
|
|
353
344
|
import { evaluate as evaluate3 } from "mathjs";
|
354
345
|
import { Random } from "random-js";
|
355
346
|
import "uniformize";
|
356
|
-
function evalStatsDice(testDice,
|
347
|
+
function evalStatsDice(testDice, allStats) {
|
357
348
|
let dice = testDice.trimEnd();
|
358
|
-
if (
|
359
|
-
const
|
360
|
-
for (const
|
361
|
-
const regex = new RegExp(escapeRegex(
|
362
|
-
if (
|
363
|
-
const statValue =
|
364
|
-
dice =
|
349
|
+
if (allStats && Object.keys(allStats).length > 0) {
|
350
|
+
const names = Object.keys(allStats);
|
351
|
+
for (const name of names) {
|
352
|
+
const regex = new RegExp(escapeRegex(name.standardize()), "gi");
|
353
|
+
if (dice.standardize().match(regex)) {
|
354
|
+
const statValue = allStats[name];
|
355
|
+
dice = dice.standardize().replace(regex, statValue.toString()).trimEnd();
|
365
356
|
}
|
366
357
|
}
|
367
358
|
}
|
@@ -374,8 +365,7 @@ function evalStatsDice(testDice, stats) {
|
|
374
365
|
}
|
375
366
|
}
|
376
367
|
function diceRandomParse(value, template) {
|
377
|
-
if (!template.statistics)
|
378
|
-
return value;
|
368
|
+
if (!template.statistics) return value;
|
379
369
|
value = value.standardize();
|
380
370
|
const statNames = Object.keys(template.statistics);
|
381
371
|
let newDice = value;
|
@@ -397,13 +387,11 @@ function diceRandomParse(value, template) {
|
|
397
387
|
return replaceFormulaInDice(newDice);
|
398
388
|
}
|
399
389
|
function diceTypeRandomParse(dice, template) {
|
400
|
-
if (!template.statistics)
|
401
|
-
return dice;
|
390
|
+
if (!template.statistics) return dice;
|
402
391
|
const firstStatNotcombinaison = Object.keys(template.statistics).find(
|
403
392
|
(stat) => !template.statistics?.[stat].combinaison
|
404
393
|
);
|
405
|
-
if (!firstStatNotcombinaison)
|
406
|
-
return dice;
|
394
|
+
if (!firstStatNotcombinaison) return dice;
|
407
395
|
const stats = template.statistics[firstStatNotcombinaison];
|
408
396
|
const { min, max } = stats;
|
409
397
|
const total = template.total || 100;
|
@@ -443,19 +431,15 @@ function verifyTemplateValue(template) {
|
|
443
431
|
diceType: "",
|
444
432
|
statistics: {}
|
445
433
|
};
|
446
|
-
if (!template.statistics)
|
447
|
-
statistiqueTemplate.statistics = void 0;
|
434
|
+
if (!template.statistics) statistiqueTemplate.statistics = void 0;
|
448
435
|
else if (template.statistics && Object.keys(template.statistics).length > 0) {
|
449
|
-
if (Object.keys(template.statistics).length > 25)
|
450
|
-
throw new TooManyStats();
|
436
|
+
if (Object.keys(template.statistics).length > 25) throw new TooManyStats();
|
451
437
|
for (const [key, value] of Object.entries(template.statistics)) {
|
452
438
|
const dataValue = value;
|
453
439
|
if (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)
|
454
440
|
throw new MaxGreater(dataValue.min, dataValue.max);
|
455
|
-
if (dataValue.max && dataValue.max <= 0)
|
456
|
-
|
457
|
-
if (dataValue.min && dataValue.min <= 0)
|
458
|
-
dataValue.min = void 0;
|
441
|
+
if (dataValue.max && dataValue.max <= 0) dataValue.max = void 0;
|
442
|
+
if (dataValue.min && dataValue.min <= 0) dataValue.min = void 0;
|
459
443
|
let formula = dataValue.combinaison ? dataValue.combinaison.standardize() : void 0;
|
460
444
|
formula = formula && formula.trim().length > 0 ? formula : void 0;
|
461
445
|
if (!statistiqueTemplate.statistics) {
|
@@ -482,41 +466,32 @@ function verifyTemplateValue(template) {
|
|
482
466
|
};
|
483
467
|
}
|
484
468
|
if (template.total) {
|
485
|
-
if (template.total <= 0)
|
486
|
-
template.total = void 0;
|
469
|
+
if (template.total <= 0) template.total = void 0;
|
487
470
|
statistiqueTemplate.total = template.total;
|
488
471
|
}
|
489
|
-
if (template.charName)
|
490
|
-
|
491
|
-
if (template.damage)
|
492
|
-
statistiqueTemplate.damage = template.damage;
|
472
|
+
if (template.charName) statistiqueTemplate.charName = template.charName;
|
473
|
+
if (template.damage) statistiqueTemplate.damage = template.damage;
|
493
474
|
testDiceRegistered(statistiqueTemplate);
|
494
475
|
testStatCombinaison(statistiqueTemplate);
|
495
476
|
return statistiqueTemplate;
|
496
477
|
}
|
497
478
|
function testDiceRegistered(template) {
|
498
|
-
if (!template.damage)
|
499
|
-
|
500
|
-
if (Object.keys(template.damage).length
|
501
|
-
throw new EmptyObjectError();
|
502
|
-
if (Object.keys(template.damage).length > 25)
|
503
|
-
throw new TooManyDice();
|
479
|
+
if (!template.damage) return;
|
480
|
+
if (Object.keys(template.damage).length === 0) throw new EmptyObjectError();
|
481
|
+
if (Object.keys(template.damage).length > 25) throw new TooManyDice();
|
504
482
|
for (const [name, dice] of Object.entries(template.damage)) {
|
505
|
-
if (!dice)
|
506
|
-
continue;
|
483
|
+
if (!dice) continue;
|
507
484
|
const randomDiceParsed = diceRandomParse(dice, template);
|
508
485
|
try {
|
509
486
|
const rolled = roll(randomDiceParsed);
|
510
|
-
if (!rolled)
|
511
|
-
throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
487
|
+
if (!rolled) throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
512
488
|
} catch (error) {
|
513
489
|
throw new DiceTypeError(name, "testDiceRegistered", error);
|
514
490
|
}
|
515
491
|
}
|
516
492
|
}
|
517
493
|
function testStatCombinaison(template) {
|
518
|
-
if (!template.statistics)
|
519
|
-
return;
|
494
|
+
if (!template.statistics) return;
|
520
495
|
const onlycombinaisonStats = Object.fromEntries(
|
521
496
|
Object.entries(template.statistics).filter(
|
522
497
|
([_, value]) => value.combinaison !== void 0
|
@@ -525,13 +500,11 @@ function testStatCombinaison(template) {
|
|
525
500
|
const allOtherStats = Object.fromEntries(
|
526
501
|
Object.entries(template.statistics).filter(([_, value]) => !value.combinaison)
|
527
502
|
);
|
528
|
-
if (Object.keys(onlycombinaisonStats).length === 0)
|
529
|
-
return;
|
503
|
+
if (Object.keys(onlycombinaisonStats).length === 0) return;
|
530
504
|
const allStats = Object.keys(template.statistics).filter(
|
531
505
|
(stat) => !template.statistics[stat].combinaison
|
532
506
|
);
|
533
|
-
if (allStats.length === 0)
|
534
|
-
throw new NoStatisticsError();
|
507
|
+
if (allStats.length === 0) throw new NoStatisticsError();
|
535
508
|
const error = [];
|
536
509
|
for (const [stat, value] of Object.entries(onlycombinaisonStats)) {
|
537
510
|
let formula = value.combinaison;
|
@@ -548,22 +521,17 @@ function testStatCombinaison(template) {
|
|
548
521
|
error.push(stat);
|
549
522
|
}
|
550
523
|
}
|
551
|
-
if (error.length > 0)
|
552
|
-
throw new FormulaError(error.join(", "), "testStatCombinaison");
|
524
|
+
if (error.length > 0) throw new FormulaError(error.join(", "), "testStatCombinaison");
|
553
525
|
return;
|
554
526
|
}
|
555
527
|
function generateRandomStat(total = 100, max, min) {
|
556
528
|
let randomStatValue = total + 1;
|
557
529
|
while (randomStatValue >= total && randomStatValue <= 0) {
|
558
530
|
const random = new Random();
|
559
|
-
if (max && min)
|
560
|
-
|
561
|
-
else if (
|
562
|
-
|
563
|
-
else if (min)
|
564
|
-
randomStatValue = random.integer(min, total);
|
565
|
-
else
|
566
|
-
randomStatValue = random.integer(1, total);
|
531
|
+
if (max && min) randomStatValue = random.integer(min, max);
|
532
|
+
else if (max) randomStatValue = random.integer(1, max);
|
533
|
+
else if (min) randomStatValue = random.integer(min, total);
|
534
|
+
else randomStatValue = random.integer(1, total);
|
567
535
|
}
|
568
536
|
return randomStatValue;
|
569
537
|
}
|
package/dist/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/dice.ts","../src/errors.ts","../src/interfaces/constant.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\nimport { evaluate } from \"mathjs\";\n\nimport type { Compare, Modifier, Resultat, Sign } from \".\";\nimport { DiceTypeError } from \"./errors\";\nimport {\n\tCOMMENT_REGEX,\n\tSIGN_REGEX,\n\tSIGN_REGEX_SPACE,\n\tSYMBOL_DICE,\n} from \"./interfaces/constant\";\n\nfunction getCompare(\n\tdice: string,\n\tcompareRegex: RegExpMatchArray\n): { dice: string; compare: Compare | undefined } {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\n\tlet compare: Compare;\n\tconst calc = compareRegex[1];\n\tconst sign = calc.match(/[+-\\/*^]/)?.[0];\n\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\tif (sign) {\n\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\").replace(/;(.*)/, \"\");\n\t\tconst total = evaluate(toCalc);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: total,\n\t\t};\n\t} else\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t};\n\treturn { dice, compare };\n}\n\nfunction getModifier(dice: string) {\n\tconst modifier = dice.matchAll(/(\\+|-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\n\tlet modificator: Modifier | undefined;\n\tfor (const mod of modifier) {\n\t\t//calculate the modifier if multiple\n\t\tif (modificator) {\n\t\t\tconst sign = modificator.sign;\n\t\t\tlet value = modificator.value;\n\t\t\tif (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t} else {\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue: Number.parseInt(mod[2], 10),\n\t\t\t};\n\t\t}\n\t}\n\treturn modificator;\n}\n\n/**\n * Parse the string provided and turn it as a readable dice for dice parser\n * @param dice {string}\n */\nexport function roll(dice: string): Resultat | undefined {\n\t//parse dice string\n\tif (!dice.includes(\"d\")) return undefined;\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\n\tlet compare: Compare | undefined;\n\tif (dice.includes(\";\") && dice.includes(\"&\")) return sharedRolls(dice);\n\tif (compareRegex) {\n\t\tconst compareResult = getCompare(dice, compareRegex);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = compareResult.dice;\n\t\tcompare = compareResult.compare;\n\t}\n\tconst modificator = getModifier(dice);\n\n\tif (dice.match(/\\d+?#(.*)/)) {\n\t\tconst diceArray = dice.split(\"#\");\n\t\tconst numberOfDice = Number.parseInt(diceArray[0], 10);\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\n\t\tconst roller = new DiceRoller();\n\t\t//remove comments if any\n\t\tfor (let i = 0; i < numberOfDice; i++) {\n\t\t\ttry {\n\t\t\t\troller.roll(diceToRoll);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new DiceTypeError(diceToRoll, \"roll\", error);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdice: diceToRoll,\n\t\t\tresult: roller.output,\n\t\t\tcomment: comments,\n\t\t\tcompare: compare ? compare : undefined,\n\t\t\tmodifier: modificator,\n\t\t\ttotal: roller.total,\n\t\t};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\").trimEnd();\n\ttry {\n\t\troller.roll(diceWithoutComment);\n\t} catch (error) {\n\t\tthrow new DiceTypeError(diceWithoutComment, \"roll\", error);\n\t}\n\tconst commentMatch = dice.match(COMMENT_REGEX);\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\treturn {\n\t\tdice,\n\t\tresult: roller.output,\n\t\tcomment,\n\t\tcompare: compare ? compare : undefined,\n\t\tmodifier: modificator,\n\t\ttotal: roller.total,\n\t};\n}\n/**\n * Evaluate a formula and replace \"^\" by \"**\" if any\n * @param {Sign} sign\n * @param {number} value\n * @param {number} total\n * @returns\n */\nexport function calculator(sign: Sign, value: number, total: number): number {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tif (sign === \"^\") sign = \"**\";\n\treturn evaluate(`${total} ${sign} ${value}`);\n}\n\nfunction inverseSign(\n\tsign: \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\"\n): \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\" {\n\tswitch (sign) {\n\t\tcase \"<\":\n\t\t\treturn \">\";\n\t\tcase \">\":\n\t\t\treturn \"<\";\n\t\tcase \"<=\":\n\t\t\treturn \">=\";\n\t\tcase \">=\":\n\t\t\treturn \"<=\";\n\t\tcase \"=\":\n\t\t\treturn \"!=\";\n\t\tcase \"==\":\n\t\t\treturn \"!=\";\n\t\tcase \"!=\":\n\t\t\treturn \"==\";\n\t}\n}\n\nfunction replaceInFormula(\n\telement: string,\n\tdiceResult: Resultat,\n\tcompareResult: { dice: string; compare: Compare | undefined },\n\tres: boolean\n) {\n\tconst { formule, diceAll } = replaceText(\n\t\telement,\n\t\tdiceResult.total ?? 0,\n\t\tdiceResult.dice\n\t);\n\tconst validSign = res ? \"✓\" : \"✕\";\n\tconst invertedSign = res\n\t\t? compareResult.compare!.sign\n\t\t: inverseSign(compareResult.compare!.sign);\n\tlet evaluateRoll: unknown;\n\ttry {\n\t\tevaluateRoll = evaluate(compareResult.dice);\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t} catch (error) {\n\t\tconst evaluateRoll = roll(compareResult.dice) as Resultat | undefined;\n\t\tif (evaluateRoll)\n\t\t\treturn `${validSign} ${diceAll}: ${evaluateRoll.result.split(\":\").splice(1).join(\":\")}`;\n\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t}\n}\n\nfunction compareSignFormule(\n\ttoRoll: string,\n\tcompareRegex: RegExpMatchArray,\n\telement: string,\n\tdiceResult: Resultat\n) {\n\tlet results = \"\";\n\tconst compareResult = getCompare(toRoll, compareRegex);\n\tconst toCompare = `${compareResult.dice}${compareResult.compare?.sign}${compareResult.compare?.value}`;\n\tlet res: unknown;\n\ttry {\n\t\tres = evaluate(toCompare);\n\t} catch (error) {\n\t\tres = roll(toCompare);\n\t}\n\tif (typeof res === \"boolean\") {\n\t\tresults = replaceInFormula(element, diceResult, compareResult, res);\n\t} else if (res instanceof Object) {\n\t\tconst diceResult = res as Resultat;\n\t\tif (diceResult.compare) {\n\t\t\tconst toEvaluate = evaluate(\n\t\t\t\t`${diceResult.total}${diceResult.compare.sign}${diceResult.compare.value}`\n\t\t\t);\n\t\t\tconst sign = toEvaluate ? \"✓\" : \"✕\";\n\t\t\tconst invertedSign = toEvaluate\n\t\t\t\t? diceResult.compare.sign\n\t\t\t\t: inverseSign(diceResult.compare.sign);\n\t\t\tconst dice = replaceText(element, 0, diceResult.dice).diceAll;\n\n\t\t\tresults = `${sign} ${dice}: ${diceResult.result.split(\":\").splice(1).join(\":\").trim()}${invertedSign}${diceResult.compare.value}`;\n\t\t}\n\t}\n\treturn { dice: compareResult.dice, results };\n}\n\nfunction replaceText(element: string, total: number, dice: string) {\n\treturn {\n\t\tformule: element.replace(SYMBOL_DICE, `[${total}]`).trim(),\n\t\tdiceAll: element.replace(SYMBOL_DICE, `[${dice.replace(COMMENT_REGEX, \"\")}]`).trim(),\n\t};\n}\n\nfunction sharedRolls(dice: string): Resultat | undefined {\n\t/* bulk roll are not allowed in shared rolls */\n\tif (dice.includes(\"#\"))\n\t\tthrow new DiceTypeError(\n\t\t\tdice,\n\t\t\t\"noBulkRoll\",\n\t\t\t\"bulk roll are not allowed in shared rolls\"\n\t\t);\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\tif (!element.includes(SYMBOL_DICE)) {\n\t\t\tconst result = roll(element);\n\t\t\tif (!result) continue;\n\t\t\tresults.push(result.result);\n\t\t\tcontinue;\n\t\t}\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tlet toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);\n\t\tconst compareRegex = toRoll.match(SIGN_REGEX_SPACE);\n\t\tif (compareRegex) {\n\t\t\tconst compareResult = compareSignFormule(toRoll, compareRegex, element, diceResult);\n\t\t\ttoRoll = compareResult.dice;\n\t\t\tresults.push(compareResult.results);\n\t\t} else {\n\t\t\tconst { formule, diceAll } = replaceText(\n\t\t\t\telement,\n\t\t\t\tdiceResult.total,\n\t\t\t\tdiceResult.dice\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst evaluated = evaluate(toRoll);\n\t\t\t\tresults.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += Number.parseInt(evaluated, 10);\n\t\t\t} catch (error) {\n\t\t\t\tconst evaluated = roll(toRoll);\n\t\t\t\tif (evaluated)\n\t\t\t\t\tresults.push(`◈ ${diceAll}: ${evaluated.result.split(\":\").slice(1).join(\":\")}`);\n\t\t\t\telse results.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += evaluated?.total ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tdice: split[0],\n\t\tresult: results.join(\";\"),\n\t\tcomment: comments,\n\t\tcompare: diceResult.compare,\n\t\tmodifier: diceResult.modifier,\n\t\ttotal,\n\t};\n}\n","export class DiceTypeError extends Error {\n\tpublic readonly dice: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(dice: string, cause?: string, method?: unknown) {\n\t\tsuper(dice);\n\t\tthis.name = \"Invalid_Dice_Type\";\n\t\tthis.dice = dice;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class FormulaError extends Error {\n\tpublic readonly formula: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(formula: string, cause?: string, method?: unknown) {\n\t\tsuper(formula);\n\t\tthis.name = \"Invalid_Formula\";\n\t\tthis.formula = formula;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class MaxGreater extends Error {\n\tpublic readonly name: string;\n\tpublic readonly value: number;\n\tpublic readonly max: number;\n\n\tconstructor(value: number, max: number) {\n\t\tsuper(value.toString());\n\t\tthis.name = \"Max_Greater\";\n\t\tthis.value = value;\n\t\tthis.max = max;\n\t}\n}\n\nexport class EmptyObjectError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Empty_Object\";\n\t}\n}\n\nexport class TooManyDice extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Dice\";\n\t}\n}\n\nexport class TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\n\t}\n}\n\nexport class NoStatisticsError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"No_Statistics\";\n\t}\n}\n","export const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nexport const SIGN_REGEX = /[><=!]+/;\nexport const SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\n\nexport const SYMBOL_DICE = \"&\";\n","import { evaluate } from \"mathjs\";\nimport \"uniformize\";\nimport { FormulaError } from \"./errors\";\n\n/**\n * Escape regex string\n * @param string {string}\n */\nexport function escapeRegex(string: string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\n * @param originalDice {dice}\n * @param stats {[name: string]: number}\n */\nexport function generateStatsDice(\n\toriginalDice: string,\n\tstats?: { [name: string]: number }\n) {\n\tlet dice = originalDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\t//damage field support adding statistic, like : 1d6 + strength\n\t\t//check if the value contains a statistic & calculate if it's okay\n\t\t//the dice will be converted before roll\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (dice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\treturn replaceFormulaInDice(dice);\n}\n\n/**\n * Replace the {{}} in the dice string and evaluate the interior if any\n * @param dice {string}\n */\nexport function replaceFormulaInDice(dice: string) {\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gim;\n\tconst formulaMatch = formula.exec(dice);\n\tif (formulaMatch?.groups?.formula) {\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(formulaMatch.groups.formula, \"replaceFormulaInDice\", error);\n\t\t}\n\t}\n\treturn cleanedDice(dice);\n}\n\n/**\n * Replace the ++ +- -- by their proper value:\n * - `++` = `+`\n * - `+-` = `-`\n * - `--` = `+`\n * @param dice {string}\n */\nexport function cleanedDice(dice: string) {\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\").trimEnd();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport \"uniformize\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n\tTooManyStats,\n} from \"./errors\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\n\n/**\n * Verify if the provided dice work with random value\n * @param testDice {string}\n * @param stats {[name: string]: number}\n */\nexport function evalStatsDice(testDice: string, stats?: { [name: string]: number }) {\n\tlet dice = testDice.trimEnd();\n\tif (stats && Object.keys(stats).length > 0) {\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (testDice.standardize().match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = testDice.standardize().replace(regex, statValue.toString()).trimEnd();\n\t\t\t}\n\t\t}\n\t}\n\ttry {\n\t\tif (!roll(replaceFormulaInDice(dice)))\n\t\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", \"no roll result\");\n\t\treturn testDice;\n\t} catch (error) {\n\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", error);\n\t}\n}\n\n/**\n * Generate a random dice and remove the formula (+ evaluate it)\n * Used for diceDamage only\n * @param value {string}\n * @param template {StatisticalTemplate}\n * @returns\n */\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return value;\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tvalue = value.standardize();\n\tconst statNames = Object.keys(template.statistics);\n\tlet newDice = value;\n\tfor (const name of statNames) {\n\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\tif (value.match(regex)) {\n\t\t\tlet max: undefined | number = undefined;\n\t\t\tlet min: undefined | number = undefined;\n\t\t\tconst foundStat = template.statistics?.[name];\n\t\t\tif (foundStat) {\n\t\t\t\tmax = foundStat.max;\n\t\t\t\tmin = foundStat.min;\n\t\t\t}\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\n\t\t}\n\t}\n\treturn replaceFormulaInDice(newDice);\n}\n\n/**\n * Same as damageDice but for DiceType\n * @param dice {string}\n * @param template {StatisticalTemplate}\n */\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return dice;\n\tconst firstStatNotcombinaison = Object.keys(template.statistics).find(\n\t\t(stat) => !template.statistics?.[stat].combinaison\n\t);\n\tif (!firstStatNotcombinaison) return dice;\n\tconst stats = template.statistics[firstStatNotcombinaison];\n\tconst { min, max } = stats;\n\tconst total = template.total || 100;\n\tconst randomStatValue = generateRandomStat(total, max, min);\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\n}\n\n/**\n * Random the combinaison and evaluate it to check if everything is valid\n * @param combinaison {[name: string]: string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalCombinaison(\n\tcombinaison: { [name: string]: string },\n\tstats: { [name: string]: string | number }\n) {\n\tconst newStats: { [name: string]: number } = {};\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\n\t\t//replace the stats in formula\n\t\tlet formula = combin.standardize();\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tnewStats[stat] = evaluate(formula);\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(stat, \"evalCombinaison\", error);\n\t\t}\n\t}\n\treturn newStats;\n}\n\n/**\n * Evaluate one selected combinaison\n * @param combinaison {string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalOneCombinaison(\n\tcombinaison: string,\n\tstats: { [name: string]: string | number }\n) {\n\tlet formula = combinaison.standardize();\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\tformula = formula.replace(regex, value.toString());\n\t}\n\ttry {\n\t\treturn evaluate(formula);\n\t} catch (error) {\n\t\tthrow new FormulaError(combinaison, \"evalOneCombinaison\", error);\n\t}\n}\n\n/**\n * Parse the provided JSON and verify each field to check if everything could work when rolling\n * @param {any} template\n * @returns {StatisticalTemplate}\n */\n//biome-ignore lint/suspicious/noExplicitAny: I need to use any to allow any type\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\n\tconst statistiqueTemplate: StatisticalTemplate = {\n\t\tdiceType: \"\",\n\t\tstatistics: {} as Statistic,\n\t};\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\n\t\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\n\t\t\tconst dataValue = value as { max?: number; min?: number; combinaison?: string };\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\n\t\t\t\tthrow new MaxGreater(dataValue.min, dataValue.max);\n\t\t\tif (dataValue.max && dataValue.max <= 0) dataValue.max = undefined;\n\t\t\tif (dataValue.min && dataValue.min <= 0) dataValue.min = undefined;\n\t\t\tlet formula = dataValue.combinaison\n\t\t\t\t? dataValue.combinaison.standardize()\n\t\t\t\t: undefined;\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\n\t\t\tif (!statistiqueTemplate.statistics) {\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\n\t\t\t}\n\t\t\tstatistiqueTemplate.statistics[key] = {\n\t\t\t\tmax: dataValue.max,\n\t\t\t\tmin: dataValue.min,\n\t\t\t\tcombinaison: formula || undefined,\n\t\t\t};\n\t\t}\n\t}\n\tif (template.diceType) {\n\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\tconst rolled = roll(cleanedDice);\n\t\tif (!rolled)\n\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t}\n\n\tif (template.critical && Object.keys(template.critical).length > 0) {\n\t\tstatistiqueTemplate.critical = {\n\t\t\tfailure: template.critical.failure ?? undefined,\n\t\t\tsuccess: template.critical.success ?? undefined,\n\t\t};\n\t}\n\tif (template.total) {\n\t\tif (template.total <= 0) template.total = undefined;\n\t\tstatistiqueTemplate.total = template.total;\n\t}\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\n\ttestDiceRegistered(statistiqueTemplate);\n\ttestStatCombinaison(statistiqueTemplate);\n\treturn statistiqueTemplate;\n}\n\n/**\n * Test each damage roll from the template.damage\n * @param {StatisticalTemplate} template\n */\nexport function testDiceRegistered(template: StatisticalTemplate) {\n\tif (!template.damage) return;\n\tif (Object.keys(template.damage).length === 0) throw new EmptyObjectError();\n\tif (Object.keys(template.damage).length > 25) throw new TooManyDice();\n\tfor (const [name, dice] of Object.entries(template.damage)) {\n\t\tif (!dice) continue;\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\n\t\ttry {\n\t\t\tconst rolled = roll(randomDiceParsed);\n\t\t\tif (!rolled) throw new DiceTypeError(name, \"testDiceRegistered\", \"no roll result\");\n\t\t} catch (error) {\n\t\t\tthrow new DiceTypeError(name, \"testDiceRegistered\", error);\n\t\t}\n\t}\n}\n\n/**\n * Test all combinaison with generated random value\n * @param {StatisticalTemplate} template\n */\nexport function testStatCombinaison(template: StatisticalTemplate) {\n\tif (!template.statistics) return;\n\tconst onlycombinaisonStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(\n\t\t\t([_, value]) => value.combinaison !== undefined\n\t\t)\n\t);\n\tconst allOtherStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(([_, value]) => !value.combinaison)\n\t);\n\tif (Object.keys(onlycombinaisonStats).length === 0) return;\n\tconst allStats = Object.keys(template.statistics).filter(\n\t\t(stat) => !template.statistics![stat].combinaison\n\t);\n\tif (allStats.length === 0) throw new NoStatisticsError();\n\tconst error = [];\n\tfor (const [stat, value] of Object.entries(onlycombinaisonStats)) {\n\t\tlet formula = value.combinaison as string;\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\n\t\t\tconst { max, min } = data;\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tconst regex = new RegExp(other, \"gi\");\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\n\t\t}\n\t\ttry {\n\t\t\tevaluate(formula);\n\t\t} catch (e) {\n\t\t\terror.push(stat);\n\t\t}\n\t}\n\tif (error.length > 0) throw new FormulaError(error.join(\", \"), \"testStatCombinaison\");\n\treturn;\n}\n\n/**\n * Generate a random stat based on the template and the statistical min and max\n * @param {number|undefined} total\n * @param {number | undefined} max\n * @param {number | undefined} min\n * @returns\n */\nexport function generateRandomStat(\n\ttotal: number | undefined = 100,\n\tmax?: number,\n\tmin?: number\n) {\n\tlet randomStatValue = total + 1;\n\twhile (randomStatValue >= total && randomStatValue <= 0) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(1, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(1, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","evaluateRoll","diceResult","evaluate","formula","evaluate","evaluate","evaluate","cleanedDice"]}
|
1
|
+
{"version":3,"sources":["../src/dice.ts","../src/errors.ts","../src/interfaces/constant.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\nimport { evaluate } from \"mathjs\";\n\nimport type { Compare, Modifier, Resultat, Sign } from \".\";\nimport { DiceTypeError } from \"./errors\";\nimport {\n\tCOMMENT_REGEX,\n\tSIGN_REGEX,\n\tSIGN_REGEX_SPACE,\n\tSYMBOL_DICE,\n} from \"./interfaces/constant\";\n\nfunction getCompare(\n\tdice: string,\n\tcompareRegex: RegExpMatchArray\n): { dice: string; compare: Compare | undefined } {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\n\tlet compare: Compare;\n\tconst calc = compareRegex[1];\n\tconst sign = calc.match(/[+-\\/*^]/)?.[0];\n\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\tif (sign) {\n\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\").replace(/;(.*)/, \"\");\n\t\tconst total = evaluate(toCalc);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: total,\n\t\t};\n\t} else\n\t\tcompare = {\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t};\n\treturn { dice, compare };\n}\n\nfunction getModifier(dice: string) {\n\tconst modifier = dice.matchAll(/(\\+|-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\n\tlet modificator: Modifier | undefined;\n\tfor (const mod of modifier) {\n\t\t//calculate the modifier if multiple\n\t\tif (modificator) {\n\t\t\tconst sign = modificator.sign;\n\t\t\tlet value = modificator.value;\n\t\t\tif (sign) value = calculator(sign, value, Number.parseInt(mod[2], 10));\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t} else {\n\t\t\tmodificator = {\n\t\t\t\tsign: mod[1] as Sign,\n\t\t\t\tvalue: Number.parseInt(mod[2], 10),\n\t\t\t};\n\t\t}\n\t}\n\treturn modificator;\n}\n\n/**\n * Parse the string provided and turn it as a readable dice for dice parser\n * @param dice {string}\n */\nexport function roll(dice: string): Resultat | undefined {\n\t//parse dice string\n\tif (!dice.includes(\"d\")) return undefined;\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\n\tlet compare: Compare | undefined;\n\tif (dice.includes(\";\") && dice.includes(\"&\")) return sharedRolls(dice);\n\tif (compareRegex) {\n\t\tconst compareResult = getCompare(dice, compareRegex);\n\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\tdice = compareResult.dice;\n\t\tcompare = compareResult.compare;\n\t}\n\tconst modificator = getModifier(dice);\n\n\tif (dice.match(/\\d+?#(.*)/)) {\n\t\tconst diceArray = dice.split(\"#\");\n\t\tconst numberOfDice = Number.parseInt(diceArray[0], 10);\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\n\t\tconst roller = new DiceRoller();\n\t\t//remove comments if any\n\t\tfor (let i = 0; i < numberOfDice; i++) {\n\t\t\ttry {\n\t\t\t\troller.roll(diceToRoll);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new DiceTypeError(diceToRoll, \"roll\", error);\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdice: diceToRoll,\n\t\t\tresult: roller.output,\n\t\t\tcomment: comments,\n\t\t\tcompare: compare ? compare : undefined,\n\t\t\tmodifier: modificator,\n\t\t\ttotal: roller.total,\n\t\t};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\").trimEnd();\n\ttry {\n\t\troller.roll(diceWithoutComment);\n\t} catch (error) {\n\t\tthrow new DiceTypeError(diceWithoutComment, \"roll\", error);\n\t}\n\tconst commentMatch = dice.match(COMMENT_REGEX);\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\treturn {\n\t\tdice,\n\t\tresult: roller.output,\n\t\tcomment,\n\t\tcompare: compare ? compare : undefined,\n\t\tmodifier: modificator,\n\t\ttotal: roller.total,\n\t};\n}\n/**\n * Evaluate a formula and replace \"^\" by \"**\" if any\n * @param {Sign} sign\n * @param {number} value\n * @param {number} total\n * @returns\n */\nexport function calculator(sign: Sign, value: number, total: number): number {\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tif (sign === \"^\") sign = \"**\";\n\treturn evaluate(`${total} ${sign} ${value}`);\n}\n\nfunction inverseSign(\n\tsign: \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\"\n): \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\" {\n\tswitch (sign) {\n\t\tcase \"<\":\n\t\t\treturn \">\";\n\t\tcase \">\":\n\t\t\treturn \"<\";\n\t\tcase \"<=\":\n\t\t\treturn \">=\";\n\t\tcase \">=\":\n\t\t\treturn \"<=\";\n\t\tcase \"=\":\n\t\t\treturn \"!=\";\n\t\tcase \"==\":\n\t\t\treturn \"!=\";\n\t\tcase \"!=\":\n\t\t\treturn \"==\";\n\t}\n}\n\nfunction replaceInFormula(\n\telement: string,\n\tdiceResult: Resultat,\n\tcompareResult: { dice: string; compare: Compare | undefined },\n\tres: boolean\n) {\n\tconst { formule, diceAll } = replaceText(\n\t\telement,\n\t\tdiceResult.total ?? 0,\n\t\tdiceResult.dice\n\t);\n\tconst validSign = res ? \"✓\" : \"✕\";\n\tconst invertedSign = res\n\t\t? compareResult.compare!.sign\n\t\t: inverseSign(compareResult.compare!.sign);\n\tlet evaluateRoll: unknown;\n\ttry {\n\t\tevaluateRoll = evaluate(compareResult.dice);\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t} catch (error) {\n\t\tconst evaluateRoll = roll(compareResult.dice) as Resultat | undefined;\n\t\tif (evaluateRoll)\n\t\t\treturn `${validSign} ${diceAll}: ${evaluateRoll.result.split(\":\").splice(1).join(\":\")}`;\n\n\t\treturn `${validSign} ${diceAll}: ${formule} = ${evaluateRoll}${invertedSign}${compareResult.compare?.value}`;\n\t}\n}\n\nfunction compareSignFormule(\n\ttoRoll: string,\n\tcompareRegex: RegExpMatchArray,\n\telement: string,\n\tdiceResult: Resultat\n) {\n\tlet results = \"\";\n\tconst compareResult = getCompare(toRoll, compareRegex);\n\tconst toCompare = `${compareResult.dice}${compareResult.compare?.sign}${compareResult.compare?.value}`;\n\tlet res: unknown;\n\ttry {\n\t\tres = evaluate(toCompare);\n\t} catch (error) {\n\t\tres = roll(toCompare);\n\t}\n\tif (typeof res === \"boolean\") {\n\t\tresults = replaceInFormula(element, diceResult, compareResult, res);\n\t} else if (res instanceof Object) {\n\t\tconst diceResult = res as Resultat;\n\t\tif (diceResult.compare) {\n\t\t\tconst toEvaluate = evaluate(\n\t\t\t\t`${diceResult.total}${diceResult.compare.sign}${diceResult.compare.value}`\n\t\t\t);\n\t\t\tconst sign = toEvaluate ? \"✓\" : \"✕\";\n\t\t\tconst invertedSign = toEvaluate\n\t\t\t\t? diceResult.compare.sign\n\t\t\t\t: inverseSign(diceResult.compare.sign);\n\t\t\tconst dice = replaceText(element, 0, diceResult.dice).diceAll;\n\n\t\t\tresults = `${sign} ${dice}: ${diceResult.result.split(\":\").splice(1).join(\":\").trim()}${invertedSign}${diceResult.compare.value}`;\n\t\t}\n\t}\n\treturn { dice: compareResult.dice, results };\n}\n\nfunction replaceText(element: string, total: number, dice: string) {\n\treturn {\n\t\tformule: element.replace(SYMBOL_DICE, `[${total}]`).trim(),\n\t\tdiceAll: element.replace(SYMBOL_DICE, `[${dice.replace(COMMENT_REGEX, \"\")}]`).trim(),\n\t};\n}\n\nfunction sharedRolls(dice: string): Resultat | undefined {\n\t/* bulk roll are not allowed in shared rolls */\n\tif (dice.includes(\"#\"))\n\t\tthrow new DiceTypeError(\n\t\t\tdice,\n\t\t\t\"noBulkRoll\",\n\t\t\t\"bulk roll are not allowed in shared rolls\"\n\t\t);\n\tconst results = [];\n\tconst split = dice.split(\";\");\n\tconst diceResult = roll(split[0]);\n\tif (!diceResult || !diceResult.total) return undefined;\n\tresults.push(`${diceResult.result}`);\n\n\tlet total = diceResult.total;\n\tlet comments = diceResult.comment ?? \"\";\n\tif (!total) return diceResult;\n\tfor (let element of split.slice(1)) {\n\t\tif (!element.includes(SYMBOL_DICE)) {\n\t\t\tconst result = roll(element);\n\t\t\tif (!result) continue;\n\t\t\tresults.push(result.result);\n\t\t\tcontinue;\n\t\t}\n\t\t//remove comments & keep it\n\t\tconst commentMatch = element.match(COMMENT_REGEX);\n\t\telement = element.replace(COMMENT_REGEX, \"\");\n\t\tconst comment = commentMatch ? commentMatch[2] : undefined;\n\t\tif (comment) comments += ` ${comment}`;\n\t\tlet toRoll = element.replace(SYMBOL_DICE, `${diceResult.total}`);\n\t\tconst compareRegex = toRoll.match(SIGN_REGEX_SPACE);\n\t\tif (compareRegex) {\n\t\t\tconst compareResult = compareSignFormule(toRoll, compareRegex, element, diceResult);\n\t\t\ttoRoll = compareResult.dice;\n\t\t\tresults.push(compareResult.results);\n\t\t} else {\n\t\t\tconst { formule, diceAll } = replaceText(\n\t\t\t\telement,\n\t\t\t\tdiceResult.total,\n\t\t\t\tdiceResult.dice\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst evaluated = evaluate(toRoll);\n\t\t\t\tresults.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += Number.parseInt(evaluated, 10);\n\t\t\t} catch (error) {\n\t\t\t\tconst evaluated = roll(toRoll);\n\t\t\t\tif (evaluated)\n\t\t\t\t\tresults.push(`◈ ${diceAll}: ${evaluated.result.split(\":\").slice(1).join(\":\")}`);\n\t\t\t\telse results.push(`◈ ${diceAll}: ${formule} = ${evaluated}`);\n\t\t\t\ttotal += evaluated?.total ?? 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tdice: split[0],\n\t\tresult: results.join(\";\"),\n\t\tcomment: comments,\n\t\tcompare: diceResult.compare,\n\t\tmodifier: diceResult.modifier,\n\t\ttotal,\n\t};\n}\n","export class DiceTypeError extends Error {\n\tpublic readonly dice: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(dice: string, cause?: string, method?: unknown) {\n\t\tsuper(dice);\n\t\tthis.name = \"Invalid_Dice_Type\";\n\t\tthis.dice = dice;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class FormulaError extends Error {\n\tpublic readonly formula: string;\n\tpublic readonly cause: string | undefined;\n\tpublic readonly method: unknown;\n\n\tconstructor(formula: string, cause?: string, method?: unknown) {\n\t\tsuper(formula);\n\t\tthis.name = \"Invalid_Formula\";\n\t\tthis.formula = formula;\n\t\tthis.cause = cause;\n\t\tthis.method = method;\n\t}\n}\n\nexport class MaxGreater extends Error {\n\tpublic readonly name: string;\n\tpublic readonly value: number;\n\tpublic readonly max: number;\n\n\tconstructor(value: number, max: number) {\n\t\tsuper(value.toString());\n\t\tthis.name = \"Max_Greater\";\n\t\tthis.value = value;\n\t\tthis.max = max;\n\t}\n}\n\nexport class EmptyObjectError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Empty_Object\";\n\t}\n}\n\nexport class TooManyDice extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Dice\";\n\t}\n}\n\nexport class TooManyStats extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"Too_Many_Stats\";\n\t}\n}\n\nexport class NoStatisticsError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = \"No_Statistics\";\n\t}\n}\n","export const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nexport const SIGN_REGEX = /[><=!]+/;\nexport const SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\n\nexport const SYMBOL_DICE = \"&\";\n","import { evaluate } from \"mathjs\";\nimport \"uniformize\";\nimport { FormulaError } from \"./errors\";\n\n/**\n * Escape regex string\n * @param string {string}\n */\nexport function escapeRegex(string: string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\n * @param originalDice {dice}\n * @param stats {[name: string]: number}\n */\nexport function generateStatsDice(\n\toriginalDice: string,\n\tstats?: { [name: string]: number }\n) {\n\tlet dice = originalDice;\n\tif (stats && Object.keys(stats).length > 0) {\n\t\t//damage field support adding statistic, like : 1d6 + strength\n\t\t//check if the value contains a statistic & calculate if it's okay\n\t\t//the dice will be converted before roll\n\t\tconst allStats = Object.keys(stats);\n\t\tfor (const stat of allStats) {\n\t\t\tconst regex = new RegExp(escapeRegex(stat.standardize()), \"gi\");\n\t\t\tif (dice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\n\t\t\t}\n\t\t}\n\t}\n\treturn replaceFormulaInDice(dice);\n}\n\n/**\n * Replace the {{}} in the dice string and evaluate the interior if any\n * @param dice {string}\n */\nexport function replaceFormulaInDice(dice: string) {\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gim;\n\tconst formulaMatch = formula.exec(dice);\n\tif (formulaMatch?.groups?.formula) {\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(formulaMatch.groups.formula, \"replaceFormulaInDice\", error);\n\t\t}\n\t}\n\treturn cleanedDice(dice);\n}\n\n/**\n * Replace the ++ +- -- by their proper value:\n * - `++` = `+`\n * - `+-` = `-`\n * - `--` = `+`\n * @param dice {string}\n */\nexport function cleanedDice(dice: string) {\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\").trimEnd();\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport \"uniformize\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n\tTooManyStats,\n} from \"./errors\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\n\n/**\n * Verify if the provided dice work with random value\n * @param testDice {string}\n * @param allStats {[name: string]: number}\n */\nexport function evalStatsDice(testDice: string, allStats?: { [name: string]: number }) {\n\tlet dice = testDice.trimEnd();\n\tif (allStats && Object.keys(allStats).length > 0) {\n\t\tconst names = Object.keys(allStats);\n\t\tfor (const name of names) {\n\t\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\t\tif (dice.standardize().match(regex)) {\n\t\t\t\tconst statValue = allStats[name];\n\t\t\t\tdice = dice.standardize().replace(regex, statValue.toString()).trimEnd();\n\t\t\t}\n\t\t}\n\t}\n\ttry {\n\t\tif (!roll(replaceFormulaInDice(dice)))\n\t\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", \"no roll result\");\n\t\treturn testDice;\n\t} catch (error) {\n\t\tthrow new DiceTypeError(dice, \"evalStatsDice\", error);\n\t}\n}\n\n/**\n * Generate a random dice and remove the formula (+ evaluate it)\n * Used for diceDamage only\n * @param value {string}\n * @param template {StatisticalTemplate}\n * @returns\n */\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return value;\n\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\tvalue = value.standardize();\n\tconst statNames = Object.keys(template.statistics);\n\tlet newDice = value;\n\tfor (const name of statNames) {\n\t\tconst regex = new RegExp(escapeRegex(name.standardize()), \"gi\");\n\t\tif (value.match(regex)) {\n\t\t\tlet max: undefined | number = undefined;\n\t\t\tlet min: undefined | number = undefined;\n\t\t\tconst foundStat = template.statistics?.[name];\n\t\t\tif (foundStat) {\n\t\t\t\tmax = foundStat.max;\n\t\t\t\tmin = foundStat.min;\n\t\t\t}\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\n\t\t}\n\t}\n\treturn replaceFormulaInDice(newDice);\n}\n\n/**\n * Same as damageDice but for DiceType\n * @param dice {string}\n * @param template {StatisticalTemplate}\n */\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\n\tif (!template.statistics) return dice;\n\tconst firstStatNotcombinaison = Object.keys(template.statistics).find(\n\t\t(stat) => !template.statistics?.[stat].combinaison\n\t);\n\tif (!firstStatNotcombinaison) return dice;\n\tconst stats = template.statistics[firstStatNotcombinaison];\n\tconst { min, max } = stats;\n\tconst total = template.total || 100;\n\tconst randomStatValue = generateRandomStat(total, max, min);\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\n}\n\n/**\n * Random the combinaison and evaluate it to check if everything is valid\n * @param combinaison {[name: string]: string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalCombinaison(\n\tcombinaison: { [name: string]: string },\n\tstats: { [name: string]: string | number }\n) {\n\tconst newStats: { [name: string]: number } = {};\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\n\t\t//replace the stats in formula\n\t\tlet formula = combin.standardize();\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tnewStats[stat] = evaluate(formula);\n\t\t} catch (error) {\n\t\t\tthrow new FormulaError(stat, \"evalCombinaison\", error);\n\t\t}\n\t}\n\treturn newStats;\n}\n\n/**\n * Evaluate one selected combinaison\n * @param combinaison {string}\n * @param stats {[name: string]: string|number}\n */\nexport function evalOneCombinaison(\n\tcombinaison: string,\n\tstats: { [name: string]: string | number }\n) {\n\tlet formula = combinaison.standardize();\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(statName.standardize(), \"gi\");\n\t\tformula = formula.replace(regex, value.toString());\n\t}\n\ttry {\n\t\treturn evaluate(formula);\n\t} catch (error) {\n\t\tthrow new FormulaError(combinaison, \"evalOneCombinaison\", error);\n\t}\n}\n\n/**\n * Parse the provided JSON and verify each field to check if everything could work when rolling\n * @param {any} template\n * @returns {StatisticalTemplate}\n */\n//biome-ignore lint/suspicious/noExplicitAny: I need to use any to allow any type\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\n\tconst statistiqueTemplate: StatisticalTemplate = {\n\t\tdiceType: \"\",\n\t\tstatistics: {} as Statistic,\n\t};\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\n\t\tif (Object.keys(template.statistics).length > 25) throw new TooManyStats();\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\n\t\t\tconst dataValue = value as { max?: number; min?: number; combinaison?: string };\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\n\t\t\t\tthrow new MaxGreater(dataValue.min, dataValue.max);\n\t\t\tif (dataValue.max && dataValue.max <= 0) dataValue.max = undefined;\n\t\t\tif (dataValue.min && dataValue.min <= 0) dataValue.min = undefined;\n\t\t\tlet formula = dataValue.combinaison\n\t\t\t\t? dataValue.combinaison.standardize()\n\t\t\t\t: undefined;\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\n\t\t\tif (!statistiqueTemplate.statistics) {\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\n\t\t\t}\n\t\t\tstatistiqueTemplate.statistics[key] = {\n\t\t\t\tmax: dataValue.max,\n\t\t\t\tmin: dataValue.min,\n\t\t\t\tcombinaison: formula || undefined,\n\t\t\t};\n\t\t}\n\t}\n\tif (template.diceType) {\n\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\tconst rolled = roll(cleanedDice);\n\t\tif (!rolled)\n\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t}\n\n\tif (template.critical && Object.keys(template.critical).length > 0) {\n\t\tstatistiqueTemplate.critical = {\n\t\t\tfailure: template.critical.failure ?? undefined,\n\t\t\tsuccess: template.critical.success ?? undefined,\n\t\t};\n\t}\n\tif (template.total) {\n\t\tif (template.total <= 0) template.total = undefined;\n\t\tstatistiqueTemplate.total = template.total;\n\t}\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\n\ttestDiceRegistered(statistiqueTemplate);\n\ttestStatCombinaison(statistiqueTemplate);\n\treturn statistiqueTemplate;\n}\n\n/**\n * Test each damage roll from the template.damage\n * @param {StatisticalTemplate} template\n */\nexport function testDiceRegistered(template: StatisticalTemplate) {\n\tif (!template.damage) return;\n\tif (Object.keys(template.damage).length === 0) throw new EmptyObjectError();\n\tif (Object.keys(template.damage).length > 25) throw new TooManyDice();\n\tfor (const [name, dice] of Object.entries(template.damage)) {\n\t\tif (!dice) continue;\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\n\t\ttry {\n\t\t\tconst rolled = roll(randomDiceParsed);\n\t\t\tif (!rolled) throw new DiceTypeError(name, \"testDiceRegistered\", \"no roll result\");\n\t\t} catch (error) {\n\t\t\tthrow new DiceTypeError(name, \"testDiceRegistered\", error);\n\t\t}\n\t}\n}\n\n/**\n * Test all combinaison with generated random value\n * @param {StatisticalTemplate} template\n */\nexport function testStatCombinaison(template: StatisticalTemplate) {\n\tif (!template.statistics) return;\n\tconst onlycombinaisonStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(\n\t\t\t([_, value]) => value.combinaison !== undefined\n\t\t)\n\t);\n\tconst allOtherStats = Object.fromEntries(\n\t\tObject.entries(template.statistics).filter(([_, value]) => !value.combinaison)\n\t);\n\tif (Object.keys(onlycombinaisonStats).length === 0) return;\n\tconst allStats = Object.keys(template.statistics).filter(\n\t\t(stat) => !template.statistics![stat].combinaison\n\t);\n\tif (allStats.length === 0) throw new NoStatisticsError();\n\tconst error = [];\n\tfor (const [stat, value] of Object.entries(onlycombinaisonStats)) {\n\t\tlet formula = value.combinaison as string;\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\n\t\t\tconst { max, min } = data;\n\t\t\tconst total = template.total || 100;\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\n\t\t\tconst regex = new RegExp(other, \"gi\");\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\n\t\t}\n\t\ttry {\n\t\t\tevaluate(formula);\n\t\t} catch (e) {\n\t\t\terror.push(stat);\n\t\t}\n\t}\n\tif (error.length > 0) throw new FormulaError(error.join(\", \"), \"testStatCombinaison\");\n\treturn;\n}\n\n/**\n * Generate a random stat based on the template and the statistical min and max\n * @param {number|undefined} total\n * @param {number | undefined} max\n * @param {number | undefined} min\n * @returns\n */\nexport function generateRandomStat(\n\ttotal: number | undefined = 100,\n\tmax?: number,\n\tmin?: number\n) {\n\tlet randomStatValue = total + 1;\n\twhile (randomStatValue >= total && randomStatValue <= 0) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(1, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(1, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","evaluateRoll","diceResult","evaluate","formula","evaluate","evaluate","evaluate","cleanedDice"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dicelette/core",
|
3
|
-
"version": "1.4.
|
3
|
+
"version": "1.4.6",
|
4
4
|
"description": "Core library for the Dicelette Discord bot",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -24,20 +24,20 @@
|
|
24
24
|
"license": "GPL-3.0-only",
|
25
25
|
"dependencies": {
|
26
26
|
"@dice-roller/rpg-dice-roller": "^5.5.0",
|
27
|
-
"mathjs": "^
|
27
|
+
"mathjs": "^14.0.0",
|
28
28
|
"moment": "^2.30.1",
|
29
29
|
"random-js": "^2.1.0",
|
30
30
|
"remove-accents": "^0.5.0",
|
31
31
|
"ts-dedent": "^2.2.0",
|
32
32
|
"uniformize": "^2.1.0",
|
33
|
-
"vite-tsconfig-paths": "^
|
34
|
-
"vitest": "^1.6
|
33
|
+
"vite-tsconfig-paths": "^5.1.3",
|
34
|
+
"vitest": "^2.1.6"
|
35
35
|
},
|
36
36
|
"devDependencies": {
|
37
|
-
"@biomejs/biome": "1.
|
37
|
+
"@biomejs/biome": "1.9.4",
|
38
38
|
"commit-and-tag-version": "^12.5.0",
|
39
|
-
"tslib": "^2.
|
40
|
-
"tsup": "^8.
|
39
|
+
"tslib": "^2.8.1",
|
40
|
+
"tsup": "^8.3.5",
|
41
41
|
"typescript": "^5.7.2"
|
42
42
|
},
|
43
43
|
"scripts": {
|