export function numericString(rules?: RulesForNumericString): NumericStringSchema;
type RulesForNumericString = {
ifUndefined?: string | null;
ifEmptyString?: string | null;
ifNull?: string | null;
fullWidthToHalf?: boolean;
joinsArray?: boolean;
minLength?: number;
maxLength?: number | {length: number, trims: boolean};
separatedBy?: string | RegExp;
pattern?: RegExp;
checksum?: NUMERIC_STRING.CHECKSUM_ALGORITHM;
transform?: (value: string, fail: () => never) => string;
}
type ErrorHandler = (err: ValueSchemaError) => string | null | never;
interface NumericStringSchema {
applyTo(value: unknown, onError?: ErrorHandler): string | null
}
Applies schema to value
.
If an error occurs, this method calls onError
(if specified) or throw ValueSchemaError
(otherwise).
// should be OK
assert.strictEqual(
vs.numericString().applyTo("123"),
"123");
// should be adjusted
assert.strictEqual(
vs.numericString().applyTo(123),
"123");
// should cause error
assert.throws(
() => vs.numericString().applyTo("abc"),
{name: "ValueSchemaError", rule: vs.RULE.PATTERN});
Specifies return value when input value is undefined
.
NOTE: {ifUndefined: undefined}
is NOT equivalent to {}
. The former accepts undefined
input value (and keeps it as-is), the latter doesn't.
// should be adjusted
assert.strictEqual(
vs.numericString({ifUndefined: "123"}).applyTo(undefined),
"123");
// should cause error
assert.throws(
() => vs.numericString().applyTo(undefined),
{name: "ValueSchemaError", rule: vs.RULE.UNDEFINED});
// should accept `undefined` value
assert.strictEqual(
vs.numericString({ifUndefined: undefined}).applyTo(undefined),
undefined);
Specifies return value when input value is null
.
// should be adjusted
assert.strictEqual(
vs.numericString({ifNull: "456"}).applyTo(null),
"456");
// should cause error
assert.throws(
() => vs.numericString().applyTo(null),
{name: "ValueSchemaError", rule: vs.RULE.NULL});
Specifies return value when input value is ""
.
// should be adjusted
assert.strictEqual(
vs.numericString({ifEmptyString: "456"}).applyTo(""),
"456");
// should cause error
assert.throws(
() => vs.numericString().applyTo(""),
{name: "ValueSchemaError", rule: vs.RULE.EMPTY_STRING});
Assumes an input value is separated by delimiter, and ignore them.
// should be adjusted
assert.strictEqual(
vs.numericString({separatedBy: "-"}).applyTo("4111-1111-1111-1111"),
"4111111111111111");
// should cause error
assert.throws(
() => vs.numericString().applyTo("4111-1111-1111-1111"),
{name: "ValueSchemaError", rule: vs.RULE.PATTERN});
Transforms full-width string to half-width; e.g., "1234"
.
defaults: false
// should be adjusted
assert.strictEqual(
vs.numericString({fullWidthToHalf: true}).applyTo("1234"),
"1234");
// should cause error
assert.throws(
() => vs.numericString().applyTo("1234"),
{name: "ValueSchemaError", rule: vs.RULE.PATTERN});
Assumes an input value is array, and join them. defaults: false
This method is useful for the following form.
<!-- "cc_number" will be passed in array -->
<form>
Input credit card number:
<input name="cc_number" required />
-
<input name="cc_number" required />
-
<input name="cc_number" required />
-
<input name="cc_number" required />
</form>
// should be adjusted
assert.strictEqual(
vs.numericString({joinsArray: true}).applyTo(["1234", "5678"]),
"12345678");
// should cause error
assert.throws(
() => vs.numericString().applyTo(["1234", "5678"]),
{name: "ValueSchemaError", rule: vs.RULE.TYPE});
Limits minimum length of input string.
// should be OK
assert.strictEqual(
vs.numericString({minLength: 4}).applyTo("1234"),
"1234");
// should cause error
assert.throws(
() => vs.numericString({minLength: 5}).applyTo("1234"),
{name: "ValueSchemaError", rule: vs.RULE.MIN_LENGTH});
Limits maximum length of an input string.
// should be OK
assert.strictEqual(
vs.numericString({maxLength: {length: 4, trims: false}}).applyTo("1234"),
"1234");
// should be adjusted
assert.strictEqual(
vs.numericString({maxLength: {length: 5, trims: true}, separatedBy: "-"}).applyTo("1234-5678"),
"12345");
// should cause error
assert.throws(
() => vs.numericString({maxLength: {length: 5, trims: false}}).applyTo("123456"),
{name: "ValueSchemaError", rule: vs.RULE.MAX_LENGTH});
assert.throws(
() => vs.numericString({maxLength: 5}).applyTo("123456"), // shorthand of {length: 5, trims: false}
{name: "ValueSchemaError", rule: vs.RULE.MAX_LENGTH});
Checks input value by specified algorithm.
algorithm name | explanation | used by | constant | aliases |
---|---|---|---|---|
"luhn" |
Luhn algorithm | credit card | NUMERIC_STRING.CHECKSUM_ALGORITHM.LUHN |
NUMERIC_STRING.CHECKSUM_ALGORITHM.CREDIT_CARD |
"modulus10/weight3:1" |
Modulus 10 / Weight 3:1 | ISBN-13, EAN, JAN | NUMERIC_STRING.CHECKSUM_ALGORITHM.MODULUS10_WEIGHT3_1 |
NUMERIC_STRING.CHECKSUM_ALGORITHM.ISBN13 / NUMERIC_STRING.CHECKSUM_ALGORITHM.EAN / NUMERIC_STRING.CHECKSUM_ALGORITHM.JAN |
// should be OK
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.LUHN}).applyTo("4111111111111111"),
"4111111111111111");
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.CREDIT_CARD}).applyTo("4111111111111111"), // alias of LUHN
"4111111111111111");
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.MODULUS10_WEIGHT3_1}).applyTo("9784101092058"),
"9784101092058");
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.ISBN13}).applyTo("9784101092058"), // alias of MODULUS10_WEIGHT3_1
"9784101092058");
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.EAN}).applyTo("9784101092058"), // alias of MODULUS10_WEIGHT3_1
"9784101092058");
assert.strictEqual(
vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.JAN}).applyTo("9784101092058"), // alias of MODULUS10_WEIGHT3_1
"9784101092058");
// should cause error
assert.throws(
() => vs.numericString({checksum: vs.NUMERIC_STRING.CHECKSUM_ALGORITHM.LUHN}).applyTo("4111111111111112"),
{name: "ValueSchemaError", rule: vs.RULE.CHECKSUM});
Transforms input value to another.
fail()
causes ValueSchemaError
.
// should be adjusted
assert.strictEqual(
vs.numericString({transform: value => value.padStart(8, "0")}).applyTo("1234"),
"00001234");
// should cause errors
assert.throws(
() => vs.numericString({transform: (value, fail) => fail()}).applyTo("1234"),
{name: "ValueSchemaError", rule: vs.RULE.TRANSFORM});