@dicelette/core 1.1.4 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +186 -1
- package/dist/index.d.ts +186 -1
- package/dist/index.js +120 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +113 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -9
package/dist/index.mjs
CHANGED
@@ -1,6 +1,73 @@
|
|
1
1
|
// src/dice.ts
|
2
2
|
import { DiceRoller } from "@dice-roller/rpg-dice-roller";
|
3
3
|
import { evaluate } from "mathjs";
|
4
|
+
|
5
|
+
// src/errors.ts
|
6
|
+
var DiceTypeError = class extends Error {
|
7
|
+
dice;
|
8
|
+
cause;
|
9
|
+
method;
|
10
|
+
constructor(dice, cause, method) {
|
11
|
+
super(dice);
|
12
|
+
this.name = "Invalid_Dice_Type";
|
13
|
+
this.dice = dice;
|
14
|
+
this.cause = cause;
|
15
|
+
this.method = method;
|
16
|
+
}
|
17
|
+
};
|
18
|
+
var FormulaError = class extends Error {
|
19
|
+
formula;
|
20
|
+
cause;
|
21
|
+
method;
|
22
|
+
constructor(formula, cause, method) {
|
23
|
+
super(formula);
|
24
|
+
this.name = "Invalid_Formula";
|
25
|
+
this.formula = formula;
|
26
|
+
this.cause = cause;
|
27
|
+
this.method = method;
|
28
|
+
}
|
29
|
+
};
|
30
|
+
var MaxGreater = class extends Error {
|
31
|
+
name;
|
32
|
+
value;
|
33
|
+
max;
|
34
|
+
constructor(value, max) {
|
35
|
+
super(value.toString());
|
36
|
+
this.name = "Max_Greater";
|
37
|
+
this.value = value;
|
38
|
+
this.max = max;
|
39
|
+
}
|
40
|
+
};
|
41
|
+
var EmptyObjectError = class extends Error {
|
42
|
+
name;
|
43
|
+
constructor() {
|
44
|
+
super();
|
45
|
+
this.name = "Empty_Object";
|
46
|
+
}
|
47
|
+
};
|
48
|
+
var TooManyDice = class extends Error {
|
49
|
+
name;
|
50
|
+
constructor() {
|
51
|
+
super();
|
52
|
+
this.name = "Too_Many_Dice";
|
53
|
+
}
|
54
|
+
};
|
55
|
+
var TooManyStats = class extends Error {
|
56
|
+
name;
|
57
|
+
constructor() {
|
58
|
+
super();
|
59
|
+
this.name = "Too_Many_Stats";
|
60
|
+
}
|
61
|
+
};
|
62
|
+
var NoStatisticsError = class extends Error {
|
63
|
+
name;
|
64
|
+
constructor() {
|
65
|
+
super();
|
66
|
+
this.name = "No_Statistics";
|
67
|
+
}
|
68
|
+
};
|
69
|
+
|
70
|
+
// src/dice.ts
|
4
71
|
var COMMENT_REGEX = /\s+(#|\/{2}|\[|\/\*)(.*)/;
|
5
72
|
var SIGN_REGEX = /[><=!]+/;
|
6
73
|
var SIGN_REGEX_SPACE = /[><=!]+(\S+)/;
|
@@ -25,7 +92,7 @@ function roll(dice) {
|
|
25
92
|
} else
|
26
93
|
compare = {
|
27
94
|
sign: compareSign,
|
28
|
-
value: parseInt(calc, 10)
|
95
|
+
value: Number.parseInt(calc, 10)
|
29
96
|
};
|
30
97
|
}
|
31
98
|
const modifier = dice.matchAll(/(\+|\-|%|\/|\^|\*|\*{2})(\d+)/gi);
|
@@ -35,7 +102,7 @@ function roll(dice) {
|
|
35
102
|
const sign = modificator.sign;
|
36
103
|
let value = modificator.value;
|
37
104
|
if (sign)
|
38
|
-
value = calculator(sign, value, parseInt(mod[2], 10));
|
105
|
+
value = calculator(sign, value, Number.parseInt(mod[2], 10));
|
39
106
|
modificator = {
|
40
107
|
sign: mod[1],
|
41
108
|
value
|
@@ -43,13 +110,13 @@ function roll(dice) {
|
|
43
110
|
} else {
|
44
111
|
modificator = {
|
45
112
|
sign: mod[1],
|
46
|
-
value: parseInt(mod[2], 10)
|
113
|
+
value: Number.parseInt(mod[2], 10)
|
47
114
|
};
|
48
115
|
}
|
49
116
|
}
|
50
117
|
if (dice.match(/\d+?#(.*)/)) {
|
51
118
|
const diceArray = dice.split("#");
|
52
|
-
const numberOfDice = parseInt(diceArray[0], 10);
|
119
|
+
const numberOfDice = Number.parseInt(diceArray[0], 10);
|
53
120
|
const diceToRoll = diceArray[1].replace(COMMENT_REGEX, "");
|
54
121
|
const commentsMatch = diceArray[1].match(COMMENT_REGEX);
|
55
122
|
const comments = commentsMatch ? commentsMatch[2] : void 0;
|
@@ -58,7 +125,7 @@ function roll(dice) {
|
|
58
125
|
try {
|
59
126
|
roller2.roll(diceToRoll);
|
60
127
|
} catch (error) {
|
61
|
-
throw new
|
128
|
+
throw new DiceTypeError(diceToRoll, "roll", error);
|
62
129
|
}
|
63
130
|
}
|
64
131
|
return {
|
@@ -74,7 +141,7 @@ function roll(dice) {
|
|
74
141
|
try {
|
75
142
|
roller.roll(diceWithoutComment);
|
76
143
|
} catch (error) {
|
77
|
-
throw new
|
144
|
+
throw new DiceTypeError(diceWithoutComment, "roll", error);
|
78
145
|
}
|
79
146
|
const commentMatch = dice.match(COMMENT_REGEX);
|
80
147
|
const comment = commentMatch ? commentMatch[2] : void 0;
|
@@ -113,7 +180,7 @@ function generateStatsDice(originalDice, stats) {
|
|
113
180
|
return replaceFormulaInDice(dice);
|
114
181
|
}
|
115
182
|
function replaceFormulaInDice(dice) {
|
116
|
-
const formula = /(?<formula>\{{2}(.+?)\}{2})/
|
183
|
+
const formula = /(?<formula>\{{2}(.+?)\}{2})/gim;
|
117
184
|
const formulaMatch = formula.exec(dice);
|
118
185
|
if (formulaMatch?.groups?.formula) {
|
119
186
|
const formula2 = formulaMatch.groups.formula.replaceAll("{{", "").replaceAll("}}", "");
|
@@ -121,7 +188,7 @@ function replaceFormulaInDice(dice) {
|
|
121
188
|
const result = evaluate2(formula2);
|
122
189
|
return cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));
|
123
190
|
} catch (error) {
|
124
|
-
throw new
|
191
|
+
throw new FormulaError(formulaMatch.groups.formula, "replaceFormulaInDice", error);
|
125
192
|
}
|
126
193
|
}
|
127
194
|
return cleanedDice(dice);
|
@@ -148,18 +215,19 @@ function evalStatsDice(testDice, stats) {
|
|
148
215
|
}
|
149
216
|
try {
|
150
217
|
if (!roll(replaceFormulaInDice(dice)))
|
151
|
-
throw new
|
218
|
+
throw new DiceTypeError(dice, "evalStatsDice", "no roll result");
|
152
219
|
return testDice;
|
153
220
|
} catch (error) {
|
154
|
-
throw new
|
155
|
-
${error.message}`);
|
221
|
+
throw new DiceTypeError(dice, "evalStatsDice", error);
|
156
222
|
}
|
157
223
|
}
|
158
224
|
function diceRandomParse(value, template) {
|
159
225
|
if (!template.statistics)
|
160
226
|
return value;
|
161
227
|
value = removeAccents2(value);
|
162
|
-
const allStats = Object.keys(template.statistics).map(
|
228
|
+
const allStats = Object.keys(template.statistics).map(
|
229
|
+
(stat) => removeAccents2(stat).toLowerCase()
|
230
|
+
);
|
163
231
|
let newDice = value;
|
164
232
|
for (const stat of allStats) {
|
165
233
|
const regex = new RegExp(escapeRegex(stat), "gi");
|
@@ -181,7 +249,9 @@ function diceRandomParse(value, template) {
|
|
181
249
|
function diceTypeRandomParse(dice, template) {
|
182
250
|
if (!template.statistics)
|
183
251
|
return dice;
|
184
|
-
const firstStatNotCombinaison = Object.keys(template.statistics).find(
|
252
|
+
const firstStatNotCombinaison = Object.keys(template.statistics).find(
|
253
|
+
(stat) => !template.statistics?.[stat].combinaison
|
254
|
+
);
|
185
255
|
if (!firstStatNotCombinaison)
|
186
256
|
return dice;
|
187
257
|
const stats = template.statistics[firstStatNotCombinaison];
|
@@ -202,7 +272,7 @@ function evalCombinaison(combinaison, stats) {
|
|
202
272
|
const result = evaluate3(formula);
|
203
273
|
newStats[stat] = result;
|
204
274
|
} catch (error) {
|
205
|
-
throw new
|
275
|
+
throw new FormulaError(stat, "evalCombinaison", error);
|
206
276
|
}
|
207
277
|
}
|
208
278
|
return newStats;
|
@@ -216,7 +286,7 @@ function evalOneCombinaison(combinaison, stats) {
|
|
216
286
|
try {
|
217
287
|
return evaluate3(formula);
|
218
288
|
} catch (error) {
|
219
|
-
throw new
|
289
|
+
throw new FormulaError(combinaison, "evalOneCombinaison", error);
|
220
290
|
}
|
221
291
|
}
|
222
292
|
function verifyTemplateValue(template) {
|
@@ -227,10 +297,12 @@ function verifyTemplateValue(template) {
|
|
227
297
|
if (!template.statistics)
|
228
298
|
statistiqueTemplate.statistics = void 0;
|
229
299
|
else if (template.statistics && Object.keys(template.statistics).length > 0) {
|
300
|
+
if (Object.keys(template.statistics).length > 25)
|
301
|
+
throw new TooManyStats();
|
230
302
|
for (const [key, value] of Object.entries(template.statistics)) {
|
231
303
|
const dataValue = value;
|
232
304
|
if (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)
|
233
|
-
throw new
|
305
|
+
throw new MaxGreater(dataValue.min, dataValue.max);
|
234
306
|
if (dataValue.max && dataValue.max <= 0)
|
235
307
|
dataValue.max = void 0;
|
236
308
|
if (dataValue.min && dataValue.min <= 0)
|
@@ -253,7 +325,7 @@ function verifyTemplateValue(template) {
|
|
253
325
|
const cleanedDice2 = diceTypeRandomParse(template.diceType, statistiqueTemplate);
|
254
326
|
const rolled = roll(cleanedDice2);
|
255
327
|
if (!rolled)
|
256
|
-
throw new
|
328
|
+
throw new DiceTypeError(cleanedDice2, "verifyTemplateValue", "no roll result");
|
257
329
|
} catch (e) {
|
258
330
|
throw new Error(e.message);
|
259
331
|
}
|
@@ -285,9 +357,9 @@ function testDiceRegistered(template) {
|
|
285
357
|
if (!template.damage)
|
286
358
|
return;
|
287
359
|
if (Object.keys(template.damage).length === 0)
|
288
|
-
throw new
|
360
|
+
throw new EmptyObjectError();
|
289
361
|
if (Object.keys(template.damage).length > 25)
|
290
|
-
throw new
|
362
|
+
throw new TooManyDice();
|
291
363
|
for (const [name, dice] of Object.entries(template.damage)) {
|
292
364
|
if (!dice)
|
293
365
|
continue;
|
@@ -295,22 +367,30 @@ function testDiceRegistered(template) {
|
|
295
367
|
try {
|
296
368
|
const rolled = roll(randomDiceParsed);
|
297
369
|
if (!rolled)
|
298
|
-
throw new
|
370
|
+
throw new DiceTypeError(name, "testDiceRegistered", "no roll result");
|
299
371
|
} catch (error) {
|
300
|
-
throw new
|
372
|
+
throw new DiceTypeError(name, "testDiceRegistered", error);
|
301
373
|
}
|
302
374
|
}
|
303
375
|
}
|
304
376
|
function testStatCombinaison(template) {
|
305
377
|
if (!template.statistics)
|
306
378
|
return;
|
307
|
-
const onlyCombinaisonStats = Object.fromEntries(
|
308
|
-
|
379
|
+
const onlyCombinaisonStats = Object.fromEntries(
|
380
|
+
Object.entries(template.statistics).filter(
|
381
|
+
([_, value]) => value.combinaison !== void 0
|
382
|
+
)
|
383
|
+
);
|
384
|
+
const allOtherStats = Object.fromEntries(
|
385
|
+
Object.entries(template.statistics).filter(([_, value]) => !value.combinaison)
|
386
|
+
);
|
309
387
|
if (Object.keys(onlyCombinaisonStats).length === 0)
|
310
388
|
return;
|
311
|
-
const allStats = Object.keys(template.statistics).filter(
|
389
|
+
const allStats = Object.keys(template.statistics).filter(
|
390
|
+
(stat) => !template.statistics[stat].combinaison
|
391
|
+
);
|
312
392
|
if (allStats.length === 0)
|
313
|
-
throw new
|
393
|
+
throw new NoStatisticsError();
|
314
394
|
const error = [];
|
315
395
|
for (const [stat, value] of Object.entries(onlyCombinaisonStats)) {
|
316
396
|
let formula = value.combinaison;
|
@@ -328,7 +408,7 @@ function testStatCombinaison(template) {
|
|
328
408
|
}
|
329
409
|
}
|
330
410
|
if (error.length > 0)
|
331
|
-
throw new
|
411
|
+
throw new FormulaError(error.join(", "), "testStatCombinaison");
|
332
412
|
return;
|
333
413
|
}
|
334
414
|
function generateRandomStat(total = 100, max, min) {
|
@@ -348,6 +428,13 @@ function generateRandomStat(total = 100, max, min) {
|
|
348
428
|
}
|
349
429
|
export {
|
350
430
|
COMMENT_REGEX,
|
431
|
+
DiceTypeError,
|
432
|
+
EmptyObjectError,
|
433
|
+
FormulaError,
|
434
|
+
MaxGreater,
|
435
|
+
NoStatisticsError,
|
436
|
+
TooManyDice,
|
437
|
+
TooManyStats,
|
351
438
|
calculator,
|
352
439
|
cleanedDice,
|
353
440
|
diceRandomParse,
|
package/dist/index.mjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/dice.ts","../src/utils.ts","../src/verify_template.ts"],"sourcesContent":["/* eslint-disable no-useless-escape */\r\nimport { DiceRoller } from \"@dice-roller/rpg-dice-roller\";\r\nimport { evaluate } from \"mathjs\";\r\n\r\nimport { Compare, Modifier, Resultat, Sign } from \".\";\r\n\r\nexport const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\r\nconst SIGN_REGEX =/[><=!]+/;\r\nconst SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\r\n\r\n/**\r\n * Parse the string provided and turn it as a readable dice for dice parser\r\n * @param dice {string}\r\n */\r\nexport function roll(dice: string): Resultat | undefined{\r\n\t//parse dice string\r\n\tif (!dice.includes(\"d\")) return undefined;\r\n\tconst compareRegex = dice.match(SIGN_REGEX_SPACE);\r\n\tlet compare : Compare | undefined;\r\n\tif (compareRegex) {\r\n\t\tdice = dice.replace(SIGN_REGEX_SPACE, \"\");\r\n\t\tconst calc = compareRegex[1];\r\n\t\tconst sign = calc.match(/[+-\\/\\*\\^]/)?.[0];\r\n\t\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\r\n\t\tif (sign) {\r\n\t\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\");\r\n\t\t\tconst total = evaluate(toCalc);\r\n\t\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\r\n\t\t\tcompare = {\r\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\r\n\t\t\t\tvalue: total,\r\n\t\t\t};\r\n\t\t} else compare = {\r\n\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\r\n\t\t\tvalue: parseInt(calc, 10),\r\n\t\t};\r\n\t}\r\n\tconst modifier = dice.matchAll(/(\\+|\\-|%|\\/|\\^|\\*|\\*{2})(\\d+)/gi);\r\n\tlet modificator : Modifier | undefined;\r\n\tfor (const mod of modifier) {\r\n\t\t//calculate the modifier if multiple\r\n\t\tif (modificator) {\r\n\t\t\tconst sign = modificator.sign;\r\n\t\t\tlet value = modificator.value;\r\n\t\t\tif (sign)\r\n\t\t\t\tvalue = calculator(sign, value, parseInt(mod[2], 10));\r\n\t\t\tmodificator = {\r\n\t\t\t\tsign: mod[1] as Sign,\r\n\t\t\t\tvalue,\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tmodificator = {\r\n\t\t\t\tsign: mod[1] as Sign,\r\n\t\t\t\tvalue: parseInt(mod[2], 10),\r\n\t\t\t};\r\n\t\t}\r\n\t} \r\n\t\r\n\tif (dice.match(/\\d+?#(.*)/)) {\r\n\t\tconst diceArray = dice.split(\"#\");\r\n\t\tconst numberOfDice = parseInt(diceArray[0], 10);\r\n\t\tconst diceToRoll = diceArray[1].replace(COMMENT_REGEX, \"\");\r\n\t\tconst commentsMatch = diceArray[1].match(COMMENT_REGEX);\r\n\t\tconst comments = commentsMatch ? commentsMatch[2] : undefined;\r\n\t\tconst roller = new DiceRoller();\r\n\t\t//remove comments if any\r\n\t\tfor (let i = 0; i < numberOfDice; i++) {\r\n\t\t\ttry {\r\n\t\t\t\troller.roll(diceToRoll);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${diceToRoll}`);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tdice: diceToRoll,\r\n\t\t\tresult: roller.output,\r\n\t\t\tcomment: comments,\r\n\t\t\tcompare: compare ? compare : undefined,\r\n\t\t\tmodifier: modificator,\r\n\t\t};\r\n\t}\r\n\tconst roller = new DiceRoller();\r\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\");\r\n\ttry {\t\r\n\t\troller.roll(diceWithoutComment);\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${diceWithoutComment}`);\r\n\t}\r\n\tconst commentMatch = dice.match(COMMENT_REGEX);\r\n\tconst comment = commentMatch ? commentMatch[2] : undefined;\r\n\treturn {\r\n\t\tdice,\r\n\t\tresult: roller.output,\r\n\t\tcomment,\r\n\t\tcompare: compare ? compare : undefined,\r\n\t\tmodifier: modificator,\r\n\t};\r\n}\r\n/**\r\n * Evaluate a formula and replace \"^\" by \"**\" if any\r\n * @param {Sign} sign\r\n * @param {number} value \r\n * @param {number} total \r\n * @returns \r\n */\r\nexport function calculator(sign: Sign, value: number, total: number): number {\r\n\tif (sign === \"^\") sign = \"**\";\r\n\treturn evaluate(`${total} ${sign} ${value}`);\r\n}\r\n\r\n\r\n\r\n","import { evaluate } from \"mathjs\";\r\nimport removeAccents from \"remove-accents\";\r\n\r\n/**\r\n * Escape regex string\r\n * @param string {string}\r\n */\r\nexport function escapeRegex(string: string) {\r\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\n\r\n/**\r\n * Replace the stat name by their value using stat and after evaluate any formula using `replaceFormulaInDice`\r\n * @param originalDice {dice}\r\n * @param stats {[name: string]: number}\r\n */\r\nexport function generateStatsDice(originalDice: string, stats?: {[name: string]: number}) {\r\n\tlet dice = originalDice;\r\n\tif (stats && Object.keys(stats).length > 0) {\r\n\t\t//damage field support adding statistic, like : 1d6 + strength\r\n\t\t//check if the value contains a statistic & calculate if it's okay\r\n\t\t//the dice will be converted before roll \r\n\t\tconst allStats = Object.keys(stats);\r\n\t\tfor (const stat of allStats) {\r\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\r\n\t\t\tif (dice.match(regex)) {\r\n\t\t\t\tconst statValue = stats[stat];\r\n\t\t\t\tdice = dice.replace(regex, statValue.toString());\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn replaceFormulaInDice(dice);\r\n\t\r\n}\r\n\r\n/**\r\n * Replace the {{}} in the dice string and evaluate the interior if any\r\n * @param dice {string}\r\n */\r\nexport function replaceFormulaInDice(dice: string) {\r\n\tconst formula = /(?<formula>\\{{2}(.+?)\\}{2})/gmi;\r\n\tconst formulaMatch = formula.exec(dice);\r\n\tif (formulaMatch?.groups?.formula) {\r\n\t\tconst formula = formulaMatch.groups.formula.replaceAll(\"{{\", \"\").replaceAll(\"}}\", \"\");\r\n\t\ttry {\r\n\t\t\tconst result = evaluate(formula);\r\n\t\t\treturn cleanedDice(dice.replace(formulaMatch.groups.formula, result.toString()));\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidFormula, common.space]: ${formulaMatch.groups.formula}`);\r\n\t\t}\r\n\t}\r\n\treturn cleanedDice(dice);\r\n}\r\n\r\n/**\r\n * Replace the ++ +- -- by their proper value:\r\n * - `++` = `+`\r\n * - `+-` = `-`\r\n * - `--` = `+`\r\n * @param dice {string}\r\n */\r\nexport function cleanedDice(dice: string) {\r\n\treturn dice.replaceAll(\"+-\", \"-\").replaceAll(\"--\", \"+\").replaceAll(\"++\", \"+\");\r\n}","/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { evaluate } from \"mathjs\";\r\nimport {Random } from \"random-js\";\r\nimport removeAccents from \"remove-accents\";\r\n\r\nimport { Statistic, StatisticalTemplate } from \".\";\r\nimport { roll } from \"./dice\";\r\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\r\n\r\n/**\r\n * Verify if the provided dice work with random value\r\n * @param testDice {string}\r\n * @param stats {[name: string]: number}\r\n */\r\nexport function evalStatsDice(testDice: string, stats?: {[name: string]: number}) {\r\n\tlet dice = testDice;\r\n\tif (stats && Object.keys(stats).length > 0) {\r\n\t\tconst allStats = Object.keys(stats);\r\n\t\tfor (const stat of allStats) {\r\n\t\t\tconst regex = new RegExp(escapeRegex(removeAccents(stat)), \"gi\");\r\n\t\t\tif (testDice.match(regex)) {\r\n\t\t\t\tconst statValue = stats[stat];\r\n\t\t\t\tdice = testDice.replace(regex, statValue.toString());\r\n\t\t\t}\r\n\t\t}\r\n\t}\t\r\n\ttry {\r\n\t\tif (!roll(replaceFormulaInDice(dice))) throw new Error(`[error.invalidDice.withoutDice, common.space] ${dice}`);\r\n\t\treturn testDice;\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidDice.withoutDice, common.space]: ${testDice}\\n${(error as Error).message}`);\r\n\t}\r\n}\r\n\r\n/**\r\n * Generate a random dice and remove the formula (+ evaluate it)\r\n * Used for diceDamage only\r\n * @param value {string}\r\n * @param template {StatisticalTemplate}\r\n * @returns \r\n */\r\nexport function diceRandomParse(value: string, template: StatisticalTemplate) {\r\n\tif (!template.statistics) return value;\r\n\tvalue = removeAccents(value);\r\n\tconst allStats = Object.keys(template.statistics).map(stat => removeAccents(stat).toLowerCase());\r\n\tlet newDice = value;\r\n\tfor (const stat of allStats) {\r\n\t\tconst regex = new RegExp(escapeRegex(stat), \"gi\");\r\n\t\tif (value.match(regex)) {\r\n\t\t\tlet max: undefined | number = undefined;\r\n\t\t\tlet min: undefined | number = undefined;\r\n\t\t\tconst stats = template.statistics?.[stat];\r\n\t\t\tif (stats) {\r\n\t\t\t\tmax = template.statistics[removeAccents(stat).toLowerCase()].max;\r\n\t\t\t\tmin = template.statistics[removeAccents(stat).toLowerCase()].min;\r\n\t\t\t}\r\n\t\t\tconst total = template.total || 100;\r\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\t\t\tnewDice = value.replace(regex, randomStatValue.toString());\r\n\t\t}\r\n\t}\r\n\treturn replaceFormulaInDice(newDice);\r\n}\r\n\r\n/**\r\n * Same as damageDice but for DiceType\r\n * @param dice {string}\r\n * @param template {StatisticalTemplate}\r\n */\r\nexport function diceTypeRandomParse(dice: string, template: StatisticalTemplate) {\r\n\tif (!template.statistics) return dice;\r\n\tconst firstStatNotCombinaison = Object.keys(template.statistics).find(stat => !template.statistics?.[stat].combinaison);\r\n\tif (!firstStatNotCombinaison) return dice;\r\n\tconst stats = template.statistics[firstStatNotCombinaison];\r\n\tconst {min, max} = stats;\r\n\tconst total = template.total || 100;\r\n\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\treturn replaceFormulaInDice(dice.replace(\"$\", randomStatValue.toString()));\r\n}\r\n\r\n/**\r\n * Random the combinaison and evaluate it to check if everything is valid\r\n * @param combinaison {[name: string]: string}\r\n * @param stats {[name: string]: string|number}\r\n */\r\nexport function evalCombinaison(combinaison: {[name: string]: string}, stats: {[name: string]: string | number}) {\r\n\tconst newStats: {[name: string]: number} = {};\r\n\tfor (const [stat, combin] of Object.entries(combinaison)) {\r\n\t\t//replace the stats in formula\r\n\t\tlet formula = removeAccents(combin);\r\n\t\tfor (const [statName, value] of Object.entries(stats)) {\r\n\t\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\r\n\t\t\tformula = formula.replace(regex, value.toString());\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst result = evaluate(formula);\r\n\t\t\tnewStats[stat] = result;\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidFormula, common.space]: ${stat}`);\r\n\t\t}\r\n\t}\r\n\treturn newStats;\r\n}\r\n\r\n/**\r\n * Evaluate one selected combinaison\r\n * @param combinaison {string}\r\n * @param stats {[name: string]: string|number}\r\n */\r\nexport function evalOneCombinaison(combinaison: string, stats: {[name: string]: string | number}) {\r\n\tlet formula = removeAccents(combinaison);\r\n\tfor (const [statName, value] of Object.entries(stats)) {\r\n\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\r\n\t\tformula = formula.replace(regex, value.toString());\r\n\t}\r\n\ttry {\r\n\t\treturn evaluate(formula);\r\n\t} catch (error) {\r\n\t\tthrow new Error(`[error.invalidFormula, common.space]: ${combinaison}`);\r\n\t}\r\n}\r\n\r\n/**\r\n * Parse the provided JSON and verify each field to check if everything could work when rolling\r\n * @param {any} template \r\n * @returns {StatisticalTemplate}\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function verifyTemplateValue(template: any): StatisticalTemplate {\r\n\tconst statistiqueTemplate: StatisticalTemplate = {\r\n\t\tdiceType: \"\",\r\n\t\tstatistics: {} as Statistic\r\n\t};\r\n\tif (!template.statistics) statistiqueTemplate.statistics = undefined;\r\n\telse if (template.statistics && Object.keys(template.statistics).length > 0) {\r\n\t\tfor (const [key, value] of Object.entries(template.statistics)) {\r\n\t\t\tconst dataValue = value as { max?: number, min?: number, combinaison?: string };\r\n\t\t\tif (dataValue.max && dataValue.min && dataValue.max <= dataValue.min)\r\n\t\t\t\tthrow new Error(\"[error.maxGreater]\");\t\t\t\t\r\n\t\t\tif (dataValue.max && dataValue.max <= 0 ) dataValue.max = undefined;\r\n\t\t\tif (dataValue.min && dataValue.min <= 0 ) dataValue.min = undefined;\r\n\t\t\tlet formula = dataValue.combinaison ? removeAccents(dataValue.combinaison).toLowerCase() : undefined;\r\n\t\t\tformula = formula && formula.trim().length > 0 ? formula : undefined;\r\n\t\t\tif (!statistiqueTemplate.statistics) {\r\n\t\t\t\tstatistiqueTemplate.statistics = {} as Statistic;\r\n\t\t\t}\r\n\t\t\tstatistiqueTemplate.statistics[key] = {\r\n\t\t\t\tmax: dataValue.max,\r\n\t\t\t\tmin: dataValue.min,\r\n\t\t\t\tcombinaison: formula || undefined,\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\tif (template.diceType) {\r\n\t\ttry {\r\n\t\t\tstatistiqueTemplate.diceType = template.diceType;\r\n\t\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\r\n\t\t\tconst rolled = roll(cleanedDice);\r\n\t\t\tif (!rolled) throw new Error(\"[error.invalidDice.withoutDice]\");\r\n\t\t} catch (e) {\r\n\t\t\tthrow new Error((e as Error).message);\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n\tif (template.critical && Object.keys(template.critical).length > 0){\r\n\t\tstatistiqueTemplate.critical = {\r\n\t\t\tfailure: template.critical.failure ?? undefined,\r\n\t\t\tsuccess: template.critical.success ?? undefined\r\n\t\t};\r\n\r\n\t}\r\n\tif (template.total) {\r\n\t\tif (template.total <= 0)\r\n\t\t\ttemplate.total = undefined;\r\n\t\tstatistiqueTemplate.total = template.total;\r\n\t}\r\n\tif (template.charName) statistiqueTemplate.charName = template.charName;\r\n\tif (template.damage) statistiqueTemplate.damage = template.damage;\r\n\ttry {\r\n\t\ttestDiceRegistered(statistiqueTemplate);\r\n\t\ttestStatCombinaison(statistiqueTemplate);\r\n\t} catch (error) {\r\n\t\tthrow new Error((error as Error).message);\r\n\t}\r\n\treturn statistiqueTemplate;\r\n}\r\n\r\n/**\r\n * Test each damage roll from the template.damage\r\n * @param {StatisticalTemplate} template \r\n */\r\nexport function testDiceRegistered(template: StatisticalTemplate) {\r\n\tif (!template.damage) return;\r\n\tif (Object.keys(template.damage).length === 0) throw new Error(\"[error.emptyObject]\");\r\n\tif (Object.keys(template.damage).length > 25) throw new Error(\"[error.tooManyDice]\");\r\n\tfor (const [name, dice] of Object.entries(template.damage)) {\r\n\t\tif (!dice) continue;\r\n\t\tconst randomDiceParsed = diceRandomParse(dice, template);\r\n\t\ttry {\r\n\t\t\tconst rolled = roll(randomDiceParsed);\r\n\t\t\tif (!rolled) throw new Error(`[error.invalidDice, common.space] ${name}`);\r\n\t\t} catch (error) {\r\n\t\t\tthrow new Error(`[error.invalidDice, common.space] ${name}`);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n/**\r\n * Test all combinaison with generated random value\r\n * @param {StatisticalTemplate} template \r\n */\r\nexport function testStatCombinaison(template: StatisticalTemplate) {\r\n\tif (!template.statistics) return;\r\n\tconst onlyCombinaisonStats = Object.fromEntries(Object.entries(template.statistics).filter(([_, value]) => value.combinaison !== undefined));\r\n\tconst allOtherStats = Object.fromEntries(Object.entries(template.statistics).filter(([_, value]) => !value.combinaison));\t\r\n\tif (Object.keys(onlyCombinaisonStats).length===0) return;\r\n\tconst allStats = Object.keys(template.statistics).filter(stat => !template.statistics![stat].combinaison);\r\n\tif (allStats.length === 0) \r\n\t\tthrow new Error(\"[error.noStat]\");\r\n\tconst error= [];\r\n\tfor (const [stat, value] of Object.entries(onlyCombinaisonStats)) {\r\n\t\tlet formula = value.combinaison as string;\r\n\t\tfor (const [other, data] of Object.entries(allOtherStats)) {\r\n\t\t\tconst {max, min} = data;\r\n\t\t\tconst total = template.total || 100;\r\n\t\t\tconst randomStatValue = generateRandomStat(total, max, min);\r\n\t\t\tconst regex = new RegExp(other, \"gi\");\r\n\t\t\tformula = formula.replace(regex, randomStatValue.toString());\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tevaluate(formula);\r\n\t\t} catch (e) {\r\n\t\t\terror.push(stat);\r\n\t\t}\r\n\t}\r\n\tif (error.length > 0) \r\n\t\tthrow new Error(`[error.invalidFormula, common.space] ${error.join(\", \")}`);\r\n\treturn;\r\n}\r\n\r\n/**\r\n * Generate a random stat based on the template and the statistical min and max\r\n * @param {number|undefined} total\r\n * @param {number | undefined} max \r\n * @param {number | undefined} min \r\n * @returns \r\n */\r\nexport function generateRandomStat(total: number | undefined = 100, max?: number, min?: number) {\r\n\tlet randomStatValue = total + 1;\r\n\twhile (randomStatValue >= total) {\r\n\t\tconst random = new Random();\r\n\t\tif (max && min)\r\n\t\t\trandomStatValue = random.integer(min, max);\r\n\t\telse if (max)\r\n\t\t\trandomStatValue = random.integer(0, max);\r\n\t\telse if (min)\r\n\t\t\trandomStatValue = random.integer(min, total);\r\n\t\telse\r\n\t\t\trandomStatValue = random.integer(0, total);\r\n\t}\r\n\treturn randomStatValue;\r\n}\r\n\r\n"],"mappings":"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","names":["roller","evaluate","formula","evaluate","removeAccents","removeAccents","evaluate","cleanedDice"]}
|
1
|
+
{"version":3,"sources":["../src/dice.ts","../src/errors.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\";\n\nexport const COMMENT_REGEX = /\\s+(#|\\/{2}|\\[|\\/\\*)(.*)/;\nconst SIGN_REGEX = /[><=!]+/;\nconst SIGN_REGEX_SPACE = /[><=!]+(\\S+)/;\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 (compareRegex) {\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, \"\");\n\t\tconst calc = compareRegex[1];\n\t\tconst sign = calc.match(/[+-\\/\\*\\^]/)?.[0];\n\t\tconst compareSign = compareRegex[0].match(SIGN_REGEX)?.[0];\n\t\tif (sign) {\n\t\t\tconst toCalc = calc.replace(SIGN_REGEX, \"\").replace(/\\s/g, \"\");\n\t\t\tconst total = evaluate(toCalc);\n\t\t\t//biome-ignore lint/style/noParameterAssign: I need to assign the value to the variable\n\t\t\tdice = dice.replace(SIGN_REGEX_SPACE, `${compareSign}${total}`);\n\t\t\tcompare = {\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\t\tvalue: total,\n\t\t\t};\n\t\t} else\n\t\t\tcompare = {\n\t\t\t\tsign: compareSign as \"<\" | \">\" | \">=\" | \"<=\" | \"=\" | \"!=\" | \"==\",\n\t\t\t\tvalue: Number.parseInt(calc, 10),\n\t\t\t};\n\t}\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\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};\n\t}\n\tconst roller = new DiceRoller();\n\tconst diceWithoutComment = dice.replace(COMMENT_REGEX, \"\");\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};\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","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","import { evaluate } from \"mathjs\";\nimport removeAccents from \"remove-accents\";\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(removeAccents(stat)), \"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(\"++\", \"+\");\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { evaluate } from \"mathjs\";\nimport { Random } from \"random-js\";\nimport removeAccents from \"remove-accents\";\n\nimport type { Statistic, StatisticalTemplate } from \".\";\nimport { roll } from \"./dice\";\nimport { escapeRegex, replaceFormulaInDice } from \"./utils\";\nimport {\n\tDiceTypeError,\n\tEmptyObjectError,\n\tFormulaError,\n\tMaxGreater,\n\tNoStatisticsError,\n\tTooManyDice,\n\tTooManyStats,\n} from \"./errors\";\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;\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(removeAccents(stat)), \"gi\");\n\t\t\tif (testDice.match(regex)) {\n\t\t\t\tconst statValue = stats[stat];\n\t\t\t\tdice = testDice.replace(regex, statValue.toString());\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 = removeAccents(value);\n\tconst allStats = Object.keys(template.statistics).map((stat) =>\n\t\tremoveAccents(stat).toLowerCase()\n\t);\n\tlet newDice = value;\n\tfor (const stat of allStats) {\n\t\tconst regex = new RegExp(escapeRegex(stat), \"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 stats = template.statistics?.[stat];\n\t\t\tif (stats) {\n\t\t\t\tmax = template.statistics[removeAccents(stat).toLowerCase()].max;\n\t\t\t\tmin = template.statistics[removeAccents(stat).toLowerCase()].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 = removeAccents(combin);\n\t\tfor (const [statName, value] of Object.entries(stats)) {\n\t\t\tconst regex = new RegExp(removeAccents(statName), \"gi\");\n\t\t\tformula = formula.replace(regex, value.toString());\n\t\t}\n\t\ttry {\n\t\t\tconst result = evaluate(formula);\n\t\t\tnewStats[stat] = result;\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 = removeAccents(combinaison);\n\tfor (const [statName, value] of Object.entries(stats)) {\n\t\tconst regex = new RegExp(removeAccents(statName), \"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? removeAccents(dataValue.combinaison).toLowerCase()\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\ttry {\n\t\t\tstatistiqueTemplate.diceType = template.diceType;\n\t\t\tconst cleanedDice = diceTypeRandomParse(template.diceType, statistiqueTemplate);\n\t\t\tconst rolled = roll(cleanedDice);\n\t\t\tif (!rolled)\n\t\t\t\tthrow new DiceTypeError(cleanedDice, \"verifyTemplateValue\", \"no roll result\");\n\t\t} catch (e) {\n\t\t\tthrow new Error((e as Error).message);\n\t\t}\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\ttry {\n\t\ttestDiceRegistered(statistiqueTemplate);\n\t\ttestStatCombinaison(statistiqueTemplate);\n\t} catch (error) {\n\t\tthrow new Error((error as Error).message);\n\t}\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) {\n\t\tconst random = new Random();\n\t\tif (max && min) randomStatValue = random.integer(min, max);\n\t\telse if (max) randomStatValue = random.integer(0, max);\n\t\telse if (min) randomStatValue = random.integer(min, total);\n\t\telse randomStatValue = random.integer(0, total);\n\t}\n\treturn randomStatValue;\n}\n"],"mappings":"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","names":["roller","evaluate","formula","evaluate","evaluate","removeAccents","removeAccents","evaluate","cleanedDice"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dicelette/core",
|
3
|
-
"version": "1.1
|
3
|
+
"version": "1.2.1",
|
4
4
|
"description": "Core library for the Dicelette Discord bot",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -24,25 +24,26 @@
|
|
24
24
|
"license": "GPL-3.0-only",
|
25
25
|
"dependencies": {
|
26
26
|
"@dice-roller/rpg-dice-roller": "^5.5.0",
|
27
|
-
"
|
28
|
-
"eslint": "^8.57.0",
|
27
|
+
"commit-and-tag-version": "^12.4.1",
|
29
28
|
"mathjs": "^12.4.1",
|
30
29
|
"moment": "^2.30.1",
|
31
30
|
"random-js": "^2.1.0",
|
32
31
|
"remove-accents": "^0.5.0",
|
33
|
-
"ts-dedent": "^2.2.0"
|
32
|
+
"ts-dedent": "^2.2.0",
|
33
|
+
"vite-tsconfig-paths": "^4.3.2",
|
34
|
+
"vitest": "^1.6.0"
|
34
35
|
},
|
35
36
|
"devDependencies": {
|
36
|
-
"@
|
37
|
-
"jest": "^29.7.0",
|
38
|
-
"ts-jest": "^29.1.2",
|
37
|
+
"@biomejs/biome": "1.8.1",
|
39
38
|
"tslib": "^2.6.2",
|
40
39
|
"tsup": "^8.0.2",
|
41
40
|
"typescript": "^5.4.3"
|
42
41
|
},
|
43
42
|
"scripts": {
|
44
|
-
"test": "
|
43
|
+
"test": "vitest",
|
45
44
|
"build": "tsup",
|
46
|
-
"prepublish": "npm run build"
|
45
|
+
"prepublish": "npm run build",
|
46
|
+
"lint": "biome format --write src",
|
47
|
+
"tsc": "tsc --noEmit --skipLibCheck"
|
47
48
|
}
|
48
49
|
}
|