@aidc-toolkit/utility 0.9.15-beta → 0.9.17-beta

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.
@@ -0,0 +1,559 @@
1
+ import { i18nextUtility } from "./locale/i18n.js";
2
+ import { RegExpValidator } from "./reg-exp.js";
3
+ import { Transformer } from "./transformer.js";
4
+ /**
5
+ * Exclusion options for validating and creating strings based on character sets.
6
+ */
7
+ export var Exclusion;
8
+ (function (Exclusion) {
9
+ /**
10
+ * No strings excluded.
11
+ */
12
+ Exclusion[Exclusion["None"] = 0] = "None";
13
+ /**
14
+ * Strings that start with zero ('0') excluded.
15
+ */
16
+ Exclusion[Exclusion["FirstZero"] = 1] = "FirstZero";
17
+ /**
18
+ * Strings that are all-numeric (e.g., "123456") excluded.
19
+ */
20
+ Exclusion[Exclusion["AllNumeric"] = 2] = "AllNumeric";
21
+ })(Exclusion || (Exclusion = {}));
22
+ /**
23
+ * Character set validator. Validates a string against a specified character set.
24
+ */
25
+ export class CharacterSetValidator {
26
+ static NOT_ALL_NUMERIC_VALIDATOR = new class extends RegExpValidator {
27
+ /**
28
+ * Create an error message for an all-numeric string.
29
+ *
30
+ * @param _s
31
+ * String.
32
+ *
33
+ * @returns
34
+ * Error message.
35
+ */
36
+ createErrorMessage(_s) {
37
+ return i18nextUtility.t("CharacterSetValidator.stringMustNotBeAllNumeric");
38
+ }
39
+ }(/\D/);
40
+ /**
41
+ * Character set.
42
+ */
43
+ _characterSet;
44
+ /**
45
+ * Character set map, mapping each character in the character set to its index such that
46
+ * `_characterSetMap.get(_characterSet[index]) === index`.
47
+ */
48
+ _characterSetMap;
49
+ /**
50
+ * Exclusions supported by the character set.
51
+ */
52
+ _exclusionSupport;
53
+ /**
54
+ * Constructor.
55
+ *
56
+ * @param characterSet
57
+ * Character set. Each element is a single-character string, unique within the array, that defines the character
58
+ * set.
59
+ *
60
+ * @param exclusionSupport
61
+ * Exclusions supported by the character set. All character sets implicitly support {@link Exclusion.None}.
62
+ */
63
+ constructor(characterSet, ...exclusionSupport) {
64
+ this._characterSet = characterSet;
65
+ const characterSetMap = new Map();
66
+ characterSet.forEach((c, index) => {
67
+ characterSetMap.set(c, index);
68
+ });
69
+ this._characterSetMap = characterSetMap;
70
+ this._exclusionSupport = exclusionSupport;
71
+ }
72
+ /**
73
+ * Get the character set.
74
+ */
75
+ get characterSet() {
76
+ return this._characterSet;
77
+ }
78
+ /**
79
+ * Get the character set size.
80
+ */
81
+ get characterSetSize() {
82
+ return this._characterSet.length;
83
+ }
84
+ /**
85
+ * Get the exclusions supported by the character set.
86
+ */
87
+ get exclusionSupport() {
88
+ return this._exclusionSupport;
89
+ }
90
+ /**
91
+ * Get the character at an index.
92
+ *
93
+ * @param index
94
+ * Index into the character set.
95
+ *
96
+ * @returns
97
+ * Character at the index.
98
+ */
99
+ character(index) {
100
+ return this._characterSet[index];
101
+ }
102
+ /**
103
+ * Get the index for a character.
104
+ *
105
+ * @param c
106
+ * Character.
107
+ *
108
+ * @returns
109
+ * Index for the character or undefined if the character is not in the character set.
110
+ */
111
+ characterIndex(c) {
112
+ return this._characterSetMap.get(c);
113
+ }
114
+ /**
115
+ * Get the indexes for all characters in a string.
116
+ *
117
+ * @param s
118
+ * String.
119
+ *
120
+ * @returns
121
+ * Array of indexes for each character or undefined if the character is not in the character set.
122
+ */
123
+ characterIndexes(s) {
124
+ return Array.from(s).map(c => this._characterSetMap.get(c));
125
+ }
126
+ /**
127
+ * Convert a component definition to a string or undefined. Checks the type of the component and makes the callback
128
+ * if required.
129
+ *
130
+ * @param component
131
+ * Component definition as a string, callback, or undefined.
132
+ *
133
+ * @returns
134
+ * Component as a string or undefined.
135
+ */
136
+ static componentToString(component) {
137
+ return typeof component === "function" ? component() : component;
138
+ }
139
+ /**
140
+ * Validate that an exclusion is supported. If not, an error is thrown.
141
+ *
142
+ * @param exclusion
143
+ * Exclusion.
144
+ */
145
+ validateExclusion(exclusion) {
146
+ if (exclusion !== Exclusion.None && !this._exclusionSupport.includes(exclusion)) {
147
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.exclusionNotSupported", {
148
+ exclusion
149
+ }));
150
+ }
151
+ }
152
+ /**
153
+ * Validate a string. If the string violates the character set or any of the character set validation parameters, an
154
+ * error is thrown.
155
+ *
156
+ * @param s
157
+ * String.
158
+ *
159
+ * @param validation
160
+ * Character set validation parameters.
161
+ */
162
+ validate(s, validation) {
163
+ const length = s.length;
164
+ const minimumLength = validation?.minimumLength;
165
+ const maximumLength = validation?.maximumLength;
166
+ if (minimumLength !== undefined && length < minimumLength) {
167
+ let errorMessage;
168
+ if (maximumLength !== undefined && maximumLength === minimumLength) {
169
+ errorMessage = i18nextUtility.t(validation?.component === undefined ? "CharacterSetValidator.lengthMustBeEqualTo" : "CharacterSetValidator.lengthOfComponentMustBeEqualTo", {
170
+ component: CharacterSetValidator.componentToString(validation?.component),
171
+ length,
172
+ exactLength: minimumLength
173
+ });
174
+ }
175
+ else {
176
+ errorMessage = i18nextUtility.t(validation?.component === undefined ? "CharacterSetValidator.lengthMustBeGreaterThanOrEqualTo" : "CharacterSetValidator.lengthOfComponentMustBeGreaterThanOrEqualTo", {
177
+ component: CharacterSetValidator.componentToString(validation?.component),
178
+ length,
179
+ minimumLength
180
+ });
181
+ }
182
+ throw new RangeError(errorMessage);
183
+ }
184
+ if (maximumLength !== undefined && length > maximumLength) {
185
+ throw new RangeError(i18nextUtility.t(validation?.component === undefined ? "CharacterSetValidator.lengthMustBeLessThanOrEqualTo" : "CharacterSetValidator.lengthOfComponentMustBeLessThanOrEqualTo", {
186
+ component: CharacterSetValidator.componentToString(validation?.component),
187
+ length,
188
+ maximumLength
189
+ }));
190
+ }
191
+ // Find the index of the first character that is not in the character set.
192
+ const index = this.characterIndexes(s).findIndex(characterIndex => characterIndex === undefined);
193
+ if (index !== -1) {
194
+ throw new RangeError(i18nextUtility.t(validation?.component === undefined ? "CharacterSetValidator.invalidCharacterAtPosition" : "CharacterSetValidator.invalidCharacterAtPositionOfComponent", {
195
+ component: CharacterSetValidator.componentToString(validation?.component),
196
+ c: s.charAt(index),
197
+ position: index + (validation?.positionOffset ?? 0) + 1
198
+ }));
199
+ }
200
+ if (validation?.exclusion !== undefined) {
201
+ this.validateExclusion(validation.exclusion);
202
+ switch (validation.exclusion) {
203
+ case Exclusion.None:
204
+ break;
205
+ case Exclusion.FirstZero:
206
+ if (s.startsWith("0")) {
207
+ throw new RangeError(i18nextUtility.t(validation.component === undefined ? "CharacterSetValidator.invalidCharacterAtPosition" : "CharacterSetValidator.invalidCharacterAtPositionOfComponent", {
208
+ component: CharacterSetValidator.componentToString(validation.component),
209
+ c: "0",
210
+ position: (validation.positionOffset ?? 0) + 1
211
+ }));
212
+ }
213
+ break;
214
+ case Exclusion.AllNumeric:
215
+ CharacterSetValidator.NOT_ALL_NUMERIC_VALIDATOR.validate(s);
216
+ break;
217
+ }
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Character set creator. Maps numeric values to strings using the character set as digits.
223
+ */
224
+ export class CharacterSetCreator extends CharacterSetValidator {
225
+ /**
226
+ * Maximum string length supported.
227
+ */
228
+ static MAXIMUM_STRING_LENGTH = 40;
229
+ /**
230
+ * Powers of 10 from 1 (`10**0`) to `10**MAXIMUM_STRING_LENGTH`.
231
+ */
232
+ static _powersOf10 = CharacterSetCreator.createPowersOf(10);
233
+ /**
234
+ * Create powers of a given base from 1 (`base**0`) to `base**MAXIMUM_STRING_LENGTH`.
235
+ *
236
+ * @param base
237
+ * Number base.
238
+ *
239
+ * @returns
240
+ * Array of powers of base.
241
+ */
242
+ static createPowersOf(base) {
243
+ const powersOf = new Array(this.MAXIMUM_STRING_LENGTH + 1);
244
+ const baseN = BigInt(base);
245
+ for (let index = 0, powerOf = 1n; index <= this.MAXIMUM_STRING_LENGTH; index++, powerOf *= baseN) {
246
+ powersOf[index] = powerOf;
247
+ }
248
+ return powersOf;
249
+ }
250
+ /**
251
+ * Get a power of 10.
252
+ *
253
+ * @param power
254
+ * Power.
255
+ *
256
+ * @returns
257
+ * `10**power`.
258
+ */
259
+ static powerOf10(power) {
260
+ return this._powersOf10[power];
261
+ }
262
+ /**
263
+ * Character set size as big integer, cached for performance purposes.
264
+ */
265
+ _characterSetSizeN;
266
+ /**
267
+ * Character set size minus 1 as big integer, cached for performance purposes.
268
+ */
269
+ _characterSetSizeMinusOneN;
270
+ /**
271
+ * Domains for every length for every supported {@link Exclusion}.
272
+ */
273
+ _exclusionDomains;
274
+ /**
275
+ * Values that would generate all zeros in the created string.
276
+ */
277
+ _allZerosValues;
278
+ /**
279
+ * Constructor.
280
+ *
281
+ * @param characterSet
282
+ * Character set. Each element is a single-character string, unique within the array, that defines the character
283
+ * set.
284
+ *
285
+ * @param exclusionSupport
286
+ * Exclusions supported by the character set. All character sets implicitly support {@link Exclusion.None}.
287
+ */
288
+ constructor(characterSet, ...exclusionSupport) {
289
+ super(characterSet, ...exclusionSupport);
290
+ this._characterSetSizeN = BigInt(this.characterSetSize);
291
+ this._characterSetSizeMinusOneN = BigInt(this.characterSetSize - 1);
292
+ const exclusionDomains = [];
293
+ const exclusionNoneDomains = CharacterSetCreator.createPowersOf(this.characterSetSize);
294
+ exclusionDomains[Exclusion.None] = exclusionNoneDomains;
295
+ if (exclusionSupport.includes(Exclusion.FirstZero)) {
296
+ if (characterSet[0] !== "0") {
297
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.firstZeroFirstCharacter"));
298
+ }
299
+ const exclusionFirstZeroDomains = new Array(CharacterSetCreator.MAXIMUM_STRING_LENGTH + 1);
300
+ // Exclusion of first zero mathematically prohibits length of 0.
301
+ exclusionFirstZeroDomains[0] = 0n;
302
+ for (let index = 1; index <= CharacterSetCreator.MAXIMUM_STRING_LENGTH; index++) {
303
+ // Domain excludes zero as the first character and so works with previous exclusion none domain.
304
+ exclusionFirstZeroDomains[index] = this._characterSetSizeMinusOneN * exclusionNoneDomains[index - 1];
305
+ }
306
+ exclusionDomains[Exclusion.FirstZero] = exclusionFirstZeroDomains;
307
+ }
308
+ if (exclusionSupport.includes(Exclusion.AllNumeric)) {
309
+ const exclusionAllNumericDomains = new Array(CharacterSetCreator.MAXIMUM_STRING_LENGTH + 1);
310
+ /**
311
+ * Validate that number indexes are defined and sequential.
312
+ *
313
+ * @param numberIndexes
314
+ * Number indexes.
315
+ */
316
+ function validateNumberIndexes(numberIndexes) {
317
+ let expectedNumberIndex = numberIndexes[0];
318
+ // Make sure that all numeric characters are present and in sequence.
319
+ for (const numberIndex of numberIndexes) {
320
+ if (numberIndex === undefined || numberIndex !== expectedNumberIndex) {
321
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.allNumericAllNumericCharacters"));
322
+ }
323
+ expectedNumberIndex = numberIndex + 1;
324
+ }
325
+ }
326
+ const numberIndexes = this.characterIndexes("0123456789");
327
+ validateNumberIndexes(numberIndexes);
328
+ // Zero index is the all-zero value for a single-character string.
329
+ const zeroIndex = BigInt(numberIndexes[0]);
330
+ const allZerosValues = new Array(CharacterSetCreator.MAXIMUM_STRING_LENGTH + 1);
331
+ let allZerosValue = 0n;
332
+ // Each all-zero value is the previous all-zero value multiplied by the character set size plus the zero index.
333
+ for (let index = 0; index <= CharacterSetCreator.MAXIMUM_STRING_LENGTH; index++) {
334
+ // Domain excludes the number of permutations that would result in an all-numeric string.
335
+ exclusionAllNumericDomains[index] = exclusionNoneDomains[index] - CharacterSetCreator.powerOf10(index);
336
+ allZerosValues[index] = allZerosValue;
337
+ allZerosValue = allZerosValue * this._characterSetSizeN + zeroIndex;
338
+ }
339
+ this._allZerosValues = allZerosValues;
340
+ exclusionDomains[Exclusion.AllNumeric] = exclusionAllNumericDomains;
341
+ }
342
+ else {
343
+ // Empty array obviates need for non-null assertion while still forcing error if indexed due to a bug.
344
+ this._allZerosValues = [];
345
+ }
346
+ this._exclusionDomains = exclusionDomains;
347
+ }
348
+ /**
349
+ * Get a power of character set size.
350
+ *
351
+ * @param power
352
+ * Power.
353
+ *
354
+ * @returns
355
+ * `characterSetSize**power`.
356
+ */
357
+ powerOfSize(power) {
358
+ return this._exclusionDomains[Exclusion.None][power];
359
+ }
360
+ /**
361
+ * Determine the shift required to skip all all-numeric strings up to the value.
362
+ *
363
+ * @param shiftForward
364
+ * True to shift forward (value to string), false to shift backward (string to value).
365
+ *
366
+ * @param length
367
+ * Length of string for which to get the all-numeric shift.
368
+ *
369
+ * @param value
370
+ * Value for which to get the all-numeric shift.
371
+ *
372
+ * @returns
373
+ * Shift required to skip all all-numeric strings.
374
+ */
375
+ allNumericShift(shiftForward, length, value) {
376
+ let shift;
377
+ if (length === 0) {
378
+ if (!shiftForward && value < 10n) {
379
+ // If calculation gets this far, string is all-numeric.
380
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.stringMustNotBeAllNumeric"));
381
+ }
382
+ // Now dealing with individual characters; shift by 10 to skip numeric characters.
383
+ shift = 10n;
384
+ }
385
+ else {
386
+ const powerOfSize = this.powerOfSize(length);
387
+ const powerOf10 = CharacterSetCreator.powerOf10(length);
388
+ // Calculate the gap to the next numeric string of equal length with incremental first character.
389
+ const gap = shiftForward ? powerOfSize - powerOf10 : powerOfSize;
390
+ // Determine the number of gaps remaining in the value.
391
+ const gaps = value / gap;
392
+ if (gaps >= 10n) {
393
+ // Shift is the next power of 10.
394
+ shift = CharacterSetCreator.powerOf10(length + 1);
395
+ }
396
+ else {
397
+ // Shift is the number of gaps times the current power of 10 plus the shift for the next length down with value adjusted by the number of gaps times the gap.
398
+ shift = gaps * powerOf10 + this.allNumericShift(shiftForward, length - 1, value - gaps * gap);
399
+ }
400
+ }
401
+ return shift;
402
+ }
403
+ /**
404
+ * Validate that a length is less than or equal to {@link MAXIMUM_STRING_LENGTH}. If not, an error is thrown.
405
+ *
406
+ * @param length
407
+ * Length.
408
+ */
409
+ validateLength(length) {
410
+ if (length < 0) {
411
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.lengthMustBeGreaterThanOrEqualTo", {
412
+ length,
413
+ minimumLength: 0
414
+ }));
415
+ }
416
+ if (length > CharacterSetCreator.MAXIMUM_STRING_LENGTH) {
417
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.lengthMustBeLessThanOrEqualTo", {
418
+ length,
419
+ maximumLength: CharacterSetCreator.MAXIMUM_STRING_LENGTH
420
+ }));
421
+ }
422
+ }
423
+ /**
424
+ * Create string(s) by mapping value(s) to the equivalent characters in the character set across the length of the
425
+ * string.
426
+ *
427
+ * @param length
428
+ * Required string length.
429
+ *
430
+ * @param valueOrValues
431
+ * Numeric value(s) of the string(s).
432
+ *
433
+ * @param exclusion
434
+ * String(s) to be excluded from the range of outputs. See {@link Exclusion} for possible values and their meaning.
435
+ *
436
+ * @param tweak
437
+ * If provided, the numerical value of the string(s) is/are "tweaked" using an {@link EncryptionTransformer |
438
+ * encryption transformer}.
439
+ *
440
+ * @param creatorCallback
441
+ * If provided, called after each string is constructed to create the final value.
442
+ *
443
+ * @returns
444
+ * String(s) created from the value(s).
445
+ */
446
+ create(length, valueOrValues, exclusion = Exclusion.None, tweak, creatorCallback) {
447
+ this.validateLength(length);
448
+ this.validateExclusion(exclusion);
449
+ // Zero value in ternary else obviates need for non-null assertion.
450
+ const allZerosValue = exclusion === Exclusion.AllNumeric ? this._allZerosValues[length] : 0n;
451
+ const transformer = Transformer.get(this._exclusionDomains[exclusion][length], tweak);
452
+ return transformer.forward(valueOrValues, (transformedValue, index) => {
453
+ let s = "";
454
+ // Empty string is valid.
455
+ if (length !== 0) {
456
+ let convertValue = transformedValue;
457
+ if (exclusion === Exclusion.AllNumeric && convertValue >= allZerosValue) {
458
+ // Value to convert is shifted by the number of all-numeric strings that occur at or prior to it.
459
+ convertValue = convertValue + this.allNumericShift(true, length, convertValue - allZerosValue);
460
+ }
461
+ // Build string from right to left excluding the first character.
462
+ for (let position = length - 1; position > 0; position--) {
463
+ const nextConvertValue = convertValue / this._characterSetSizeN;
464
+ // First step is effectively a modulus calculation.
465
+ s = this.character(Number(convertValue - nextConvertValue * this._characterSetSizeN)) + s;
466
+ convertValue = nextConvertValue;
467
+ }
468
+ // Zero is first in the character set for those that support excluding first zero.
469
+ s = this.character(exclusion === Exclusion.FirstZero ? Number(convertValue % this._characterSetSizeMinusOneN) + 1 : Number(convertValue % this._characterSetSizeN)) + s;
470
+ }
471
+ return creatorCallback === undefined ? s : creatorCallback(s, index);
472
+ });
473
+ }
474
+ /**
475
+ * Determine the value for a string.
476
+ *
477
+ * @param s
478
+ * String.
479
+ *
480
+ * @param exclusion
481
+ * Strings excluded from the range of inputs. See {@link Exclusion} for possible values and their meaning.
482
+ *
483
+ * @param tweak
484
+ * If provided, the numerical value of the string was "tweaked" using an {@link EncryptionTransformer | encryption
485
+ * transformer}.
486
+ *
487
+ * @returns
488
+ * Numeric value of the string.
489
+ */
490
+ valueFor(s, exclusion = Exclusion.None, tweak) {
491
+ const length = s.length;
492
+ this.validateLength(length);
493
+ this.validateExclusion(exclusion);
494
+ const characterSetSizeN = BigInt(this.characterSetSize);
495
+ // Convert string to its value character by character.
496
+ let value = this.characterIndexes(s).reduce((accumulator, characterIndex, index) => {
497
+ if (characterIndex === undefined) {
498
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.invalidCharacterAtPosition", {
499
+ c: s.charAt(index),
500
+ position: index + 1
501
+ }));
502
+ }
503
+ let value;
504
+ if (index === 0 && exclusion === Exclusion.FirstZero) {
505
+ if (characterIndex === 0) {
506
+ throw new RangeError(i18nextUtility.t("CharacterSetValidator.invalidCharacterAtPosition", {
507
+ c: "0",
508
+ position: 1
509
+ }));
510
+ }
511
+ // Accumulator is known to be zero at this point.
512
+ value = BigInt(characterIndex - 1);
513
+ }
514
+ else {
515
+ value = accumulator * characterSetSizeN + BigInt(characterIndex);
516
+ }
517
+ return value;
518
+ }, 0n);
519
+ if (exclusion === Exclusion.AllNumeric) {
520
+ const allZerosValue = this._allZerosValues[length];
521
+ if (value >= allZerosValue) {
522
+ // Call will ensure that string is not all-numeric.
523
+ value -= this.allNumericShift(false, length, value - allZerosValue);
524
+ }
525
+ }
526
+ return Transformer.get(this._exclusionDomains[exclusion][length], tweak).reverse(value);
527
+ }
528
+ }
529
+ /**
530
+ * Numeric creator. Character set is 0-9. Supports {@link Exclusion.FirstZero}.
531
+ */
532
+ export const NUMERIC_CREATOR = new CharacterSetCreator([
533
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
534
+ ], Exclusion.FirstZero);
535
+ /**
536
+ * Hexadecimal creator. Character set is 0-9, A-F. Supports {@link Exclusion.FirstZero} and {@link
537
+ * Exclusion.AllNumeric}.
538
+ */
539
+ export const HEXADECIMAL_CREATOR = new CharacterSetCreator([
540
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
541
+ "A", "B", "C", "D", "E", "F"
542
+ ], Exclusion.FirstZero, Exclusion.AllNumeric);
543
+ /**
544
+ * Alphabetic creator. Character set is A-Z.
545
+ */
546
+ export const ALPHABETIC_CREATOR = new CharacterSetCreator([
547
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
548
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
549
+ ]);
550
+ /**
551
+ * Alphanumeric creator. Character set is 0-9, A-Z. Supports {@link Exclusion.FirstZero} and {@link
552
+ * Exclusion.AllNumeric}.
553
+ */
554
+ export const ALPHANUMERIC_CREATOR = new CharacterSetCreator([
555
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
556
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
557
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
558
+ ], Exclusion.FirstZero, Exclusion.AllNumeric);
559
+ //# sourceMappingURL=character-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character-set.js","sourceRoot":"","sources":["../src/character-set.ts"],"names":[],"mappings":"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"}