@randsum/dice
Version:
A flexible, type-safe dice roller
62 lines • 2.36 kB
JavaScript
import { CapModifier, DropModifier, ExplodeModifier, MinusModifier, PlusModifier, ReplaceModifier, RerollModifier, UniqueModifier, optionsConverter } from '@randsum/core';
import { coreNotationPattern, isDiceNotation } from '@randsum/notation';
import { D } from '../D';
import { isD } from '../guards/isD';
export function normalizeArgument(argument) {
const options = optionsFromArgument(argument);
return {
argument,
options,
die: dieForArgument(argument),
notation: optionsConverter.toNotation(options),
description: optionsConverter.toDescription(options)
};
}
function optionsFromArgument(argument) {
if (argument instanceof D) {
return argument.toOptions;
}
if (isDiceNotation(argument)) {
const coreNotationMatch = argument.match(coreNotationPattern) ?? '';
const coreMatch = coreNotationMatch[0];
const modifiersString = argument.replace(coreMatch, '');
const [quantity, sides = ''] = coreMatch.split(/[Dd]/);
if (sides.includes('{')) {
return {
quantity: Number(quantity),
sides: [...sides.replaceAll(/{|}/g, '')]
};
}
return {
quantity: Number(quantity),
sides: Number(sides),
...{
modifiers: {
...DropModifier.parse(modifiersString),
...ExplodeModifier.parse(modifiersString),
...UniqueModifier.parse(modifiersString),
...ReplaceModifier.parse(modifiersString),
...RerollModifier.parse(modifiersString),
...CapModifier.parse(modifiersString),
...PlusModifier.parse(modifiersString),
...MinusModifier.parse(modifiersString)
}
}
};
}
if (Array.isArray(argument)) {
return { quantity: 1, sides: argument.map(String) };
}
if (typeof argument === 'string' || typeof argument === 'number') {
return { quantity: 1, sides: Number(argument) };
}
return argument;
}
function dieForArgument(argument) {
if (isD(argument)) {
return argument;
}
const options = optionsFromArgument(argument);
return new D(options.sides);
}
//# sourceMappingURL=normalizeArgument.js.map