bufferbase 2.0.0 → 3.0.0

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.
Files changed (115) hide show
  1. package/README.md +151 -63
  2. package/dist/cjs/bases.d.ts +152 -45
  3. package/dist/cjs/bases.d.ts.map +1 -1
  4. package/dist/cjs/bases.js +90 -77
  5. package/dist/cjs/bases.js.map +1 -1
  6. package/dist/cjs/bufferbase.d.ts +21 -27
  7. package/dist/cjs/bufferbase.d.ts.map +1 -1
  8. package/dist/cjs/bufferbase.js +21 -31
  9. package/dist/cjs/bufferbase.js.map +1 -1
  10. package/dist/cjs/codec-base.d.ts +56 -0
  11. package/dist/cjs/codec-base.d.ts.map +1 -0
  12. package/dist/cjs/codec-base.js +132 -0
  13. package/dist/cjs/codec-base.js.map +1 -0
  14. package/dist/cjs/codec-block.d.ts +47 -0
  15. package/dist/cjs/codec-block.d.ts.map +1 -0
  16. package/dist/cjs/codec-block.js +213 -0
  17. package/dist/cjs/codec-block.js.map +1 -0
  18. package/dist/cjs/codec-block85.d.ts +56 -0
  19. package/dist/cjs/codec-block85.d.ts.map +1 -0
  20. package/dist/cjs/codec-block85.js +271 -0
  21. package/dist/cjs/codec-block85.js.map +1 -0
  22. package/dist/cjs/codec-radix.d.ts +46 -0
  23. package/dist/cjs/codec-radix.d.ts.map +1 -0
  24. package/dist/cjs/codec-radix.js +181 -0
  25. package/dist/cjs/codec-radix.js.map +1 -0
  26. package/dist/cjs/codec.d.ts +25 -111
  27. package/dist/cjs/codec.d.ts.map +1 -1
  28. package/dist/cjs/codec.js +50 -228
  29. package/dist/cjs/codec.js.map +1 -1
  30. package/dist/cjs/codecs.d.ts +8 -59
  31. package/dist/cjs/codecs.d.ts.map +1 -1
  32. package/dist/cjs/codecs.js +6 -79
  33. package/dist/cjs/codecs.js.map +1 -1
  34. package/dist/cjs/errors.d.ts +65 -48
  35. package/dist/cjs/errors.d.ts.map +1 -1
  36. package/dist/cjs/errors.js +89 -51
  37. package/dist/cjs/errors.js.map +1 -1
  38. package/dist/cjs/example.js +44 -21
  39. package/dist/cjs/example.js.map +1 -1
  40. package/dist/cjs/functions.d.ts +27 -31
  41. package/dist/cjs/functions.d.ts.map +1 -1
  42. package/dist/cjs/functions.js +25 -47
  43. package/dist/cjs/functions.js.map +1 -1
  44. package/dist/cjs/index.d.ts +7 -5
  45. package/dist/cjs/index.d.ts.map +1 -1
  46. package/dist/cjs/index.js +17 -7
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/package.json +13 -7
  49. package/dist/cjs/types.d.ts +108 -71
  50. package/dist/cjs/types.d.ts.map +1 -1
  51. package/dist/esm/bases.d.ts +152 -45
  52. package/dist/esm/bases.d.ts.map +1 -1
  53. package/dist/esm/bases.js +88 -75
  54. package/dist/esm/bases.js.map +1 -1
  55. package/dist/esm/bufferbase.d.ts +21 -27
  56. package/dist/esm/bufferbase.d.ts.map +1 -1
  57. package/dist/esm/bufferbase.js +18 -30
  58. package/dist/esm/bufferbase.js.map +1 -1
  59. package/dist/esm/codec-base.d.ts +56 -0
  60. package/dist/esm/codec-base.d.ts.map +1 -0
  61. package/dist/esm/codec-base.js +127 -0
  62. package/dist/esm/codec-base.js.map +1 -0
  63. package/dist/esm/codec-block.d.ts +47 -0
  64. package/dist/esm/codec-block.d.ts.map +1 -0
  65. package/dist/esm/codec-block.js +209 -0
  66. package/dist/esm/codec-block.js.map +1 -0
  67. package/dist/esm/codec-block85.d.ts +56 -0
  68. package/dist/esm/codec-block85.d.ts.map +1 -0
  69. package/dist/esm/codec-block85.js +267 -0
  70. package/dist/esm/codec-block85.js.map +1 -0
  71. package/dist/esm/codec-radix.d.ts +46 -0
  72. package/dist/esm/codec-radix.d.ts.map +1 -0
  73. package/dist/esm/codec-radix.js +177 -0
  74. package/dist/esm/codec-radix.js.map +1 -0
  75. package/dist/esm/codec.d.ts +25 -111
  76. package/dist/esm/codec.d.ts.map +1 -1
  77. package/dist/esm/codec.js +44 -226
  78. package/dist/esm/codec.js.map +1 -1
  79. package/dist/esm/codecs.d.ts +8 -59
  80. package/dist/esm/codecs.d.ts.map +1 -1
  81. package/dist/esm/codecs.js +7 -80
  82. package/dist/esm/codecs.js.map +1 -1
  83. package/dist/esm/errors.d.ts +65 -48
  84. package/dist/esm/errors.d.ts.map +1 -1
  85. package/dist/esm/errors.js +83 -50
  86. package/dist/esm/errors.js.map +1 -1
  87. package/dist/esm/example.js +45 -22
  88. package/dist/esm/example.js.map +1 -1
  89. package/dist/esm/functions.d.ts +27 -31
  90. package/dist/esm/functions.d.ts.map +1 -1
  91. package/dist/esm/functions.js +26 -48
  92. package/dist/esm/functions.js.map +1 -1
  93. package/dist/esm/index.d.ts +7 -5
  94. package/dist/esm/index.d.ts.map +1 -1
  95. package/dist/esm/index.js +6 -6
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/package.json +13 -7
  98. package/dist/esm/types.d.ts +108 -71
  99. package/dist/esm/types.d.ts.map +1 -1
  100. package/package.json +13 -7
  101. package/src/algorithms.test.ts +442 -0
  102. package/src/bases.ts +98 -76
  103. package/src/bufferbase.ts +26 -36
  104. package/src/codec-base.ts +181 -0
  105. package/src/codec-block.ts +258 -0
  106. package/src/codec-block85.ts +315 -0
  107. package/src/codec-radix.ts +206 -0
  108. package/src/codec.test.ts +17 -9
  109. package/src/codec.ts +48 -247
  110. package/src/codecs.ts +11 -105
  111. package/src/errors.ts +90 -50
  112. package/src/example.ts +47 -22
  113. package/src/functions.ts +34 -54
  114. package/src/index.ts +27 -7
  115. package/src/types.ts +113 -86
package/dist/cjs/bases.js CHANGED
@@ -1,30 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Chars = void 0;
4
- exports.resolveChars = resolveChars;
3
+ exports.Bases = exports.Chars = void 0;
4
+ exports.resolveSpec = resolveSpec;
5
5
  exports.isBaseName = isBaseName;
6
6
  const errors_js_1 = require("./errors.js");
7
7
  /**
8
- * Character sets for common base encodings.
8
+ * Character sets, ordered by value.
9
9
  *
10
- * Use these with `createCodec()` or the deprecated `BufferEncoder` class
11
- * when you need direct access to character sets.
12
- *
13
- * @example
14
- * ```typescript
15
- * import { Chars, createCodec } from 'bufferbase';
16
- *
17
- * const codec = createCodec(Chars.Base58);
18
- * const encoded = codec.encode(Buffer.from('Hello'));
19
- * ```
10
+ * A character set does not by itself describe an encoding — see `Bases` for
11
+ * the alphabet/algorithm pairs that do.
20
12
  */
21
13
  exports.Chars = {
22
14
  /** Base 10: 0-9 */
23
15
  Decimal: '0123456789',
24
- /** Hexadecimal: 0-9A-F */
16
+ /** RFC 4648 Table 5 — Base16: 0-9A-F */
25
17
  Base16: '0123456789ABCDEF',
26
- /** RFC 4648 Base32: A-Z2-7 */
18
+ /** RFC 4648 Table 3 — Base32: A-Z2-7 */
27
19
  Base32: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
20
+ /** RFC 4648 Table 4 — Base32 with extended hex alphabet: 0-9A-V */
21
+ Base32Hex: '0123456789ABCDEFGHIJKLMNOPQRSTUV',
28
22
  /** Crockford's Base32: 0-9A-HJKMNP-TV-Z (no I, L, O, U) */
29
23
  Base32Crockford: '0123456789ABCDEFGHJKMNPQRSTVWXYZ',
30
24
  /** Alphanumeric: 0-9A-Z */
@@ -33,89 +27,108 @@ exports.Chars = {
33
27
  Base52: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
34
28
  /** Bitcoin alphabet: 1-9A-HJ-NP-Za-km-z (no 0, O, I, l) */
35
29
  Base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
36
- /** Standard Base64: A-Za-z0-9+/ */
30
+ /** RFC 4648 Table 1 — Base64: A-Za-z0-9+/ */
37
31
  Base64: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
38
- /** URL-safe Base64: A-Za-z0-9-_ */
32
+ /** RFC 4648 Table 2 — URL-safe Base64: A-Za-z0-9-_ */
39
33
  Base64Url: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
40
34
  /** XML token Base64: A-Za-z0-9._ */
41
35
  Base64Xml: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._',
42
36
  /** XML name Base64: A-Za-z0-9_: */
43
37
  Base64XmlName: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_:',
44
- /** ASCII85 encoding */
45
- Ascii85: '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstu',
46
- /** Base85 encoding */
47
- Base85: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+-;<=>?@^_`{|}~',
48
- /** ZeroMQ Z85 encoding */
38
+ /** Ascii85: the 85 printable characters from `!` (0x21) to `u` (0x75) */
39
+ Ascii85: '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstu',
40
+ /** ZeroMQ Z85 (RFC 32): avoids the quote and backslash characters */
49
41
  Z85: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#',
42
+ /** The five symbols Crockford's Base32 adds for its check symbol, giving a modulus of 37 */
43
+ CrockfordCheck: '*~$=U',
50
44
  };
45
+ /** The characters Crockford's Base32 reads as the digit they resemble. */
46
+ const CROCKFORD_ALIASES = { I: '1', L: '1', O: '0' };
51
47
  /**
52
- * Internal mapping from base names to character sets.
53
- * @internal
54
- */
55
- const baseNameToChars = {
56
- decimal: exports.Chars.Decimal,
57
- base16: exports.Chars.Base16,
58
- hex: exports.Chars.Base16,
59
- base32: exports.Chars.Base32,
60
- base32crockford: exports.Chars.Base32Crockford,
61
- base36: exports.Chars.Base36,
62
- base52: exports.Chars.Base52,
63
- base58: exports.Chars.Base58,
64
- base64: exports.Chars.Base64,
65
- base64url: exports.Chars.Base64Url,
66
- base64xml: exports.Chars.Base64Xml,
67
- base64xmlname: exports.Chars.Base64XmlName,
68
- ascii85: exports.Chars.Ascii85,
69
- base85: exports.Chars.Base85,
70
- z85: exports.Chars.Z85,
71
- };
72
- /**
73
- * Resolves a base name or character set string to a character set.
74
- *
75
- * This function is used internally by the function API to convert
76
- * base names (like `'base58'`) to their character sets.
48
+ * The encodings this package knows by name.
77
49
  *
78
- * @param base - Base name (e.g., `'base58'`) or custom character set string
79
- * @returns The character set string
80
- * @throws {UnknownBaseError} If base name is not recognized and string length <= 15
50
+ * Each entry pairs an alphabet with the algorithm that reads it, because the
51
+ * alphabet alone is ambiguous: `base64` and `radix64` share Table 1 but
52
+ * produce different strings for the same bytes.
81
53
  *
82
54
  * @example
83
55
  * ```typescript
84
- * import { resolveChars } from 'bufferbase';
56
+ * import { encode, Bases } from 'bufferbase';
85
57
  *
86
- * resolveChars('base58'); // Returns Bitcoin alphabet
87
- * resolveChars('0123456789ABCDEF'); // Returns the string as-is (custom charset)
88
- * resolveChars('invalid'); // Throws UnknownBaseError
58
+ * encode(Buffer.from('fo'), 'base64'); // 'Zm8=' — RFC 4648
59
+ * encode(Buffer.from('fo'), 'radix64'); // 'GZv' — radix conversion
89
60
  * ```
90
61
  */
91
- function resolveChars(base) {
92
- const normalized = base.toLowerCase();
93
- if (normalized in baseNameToChars) {
94
- return baseNameToChars[normalized];
95
- }
96
- // If not a known base name, treat as custom character set
97
- // (must be longer than 15 chars to distinguish from typos)
98
- if (base.length > 15) {
62
+ exports.Bases = {
63
+ // Radix conversion. No external standard fixes these, so nothing here can
64
+ // disagree with one.
65
+ decimal: { alphabet: exports.Chars.Decimal, algorithm: 'radix' },
66
+ base36: { alphabet: exports.Chars.Base36, algorithm: 'radix', caseInsensitive: true },
67
+ base52: { alphabet: exports.Chars.Base52, algorithm: 'radix' },
68
+ base58: { alphabet: exports.Chars.Base58, algorithm: 'radix' },
69
+ /**
70
+ * Crockford's Base32, which specifies a notation for numbers rather than for
71
+ * byte streams, so a radix conversion is the right reading of it.
72
+ *
73
+ * Decoding accepts either case, reads `I` and `L` as `1` and `O` as `0`, and
74
+ * ignores hyphens.
75
+ */
76
+ base32crockford: {
77
+ alphabet: exports.Chars.Base32Crockford,
78
+ algorithm: 'radix',
79
+ caseInsensitive: true,
80
+ aliases: CROCKFORD_ALIASES,
81
+ ignore: '-',
82
+ },
83
+ /** Crockford's Base32 carrying its trailing check symbol. */
84
+ base32crockfordcheck: {
85
+ alphabet: exports.Chars.Base32Crockford,
86
+ algorithm: 'radix',
87
+ caseInsensitive: true,
88
+ aliases: CROCKFORD_ALIASES,
89
+ ignore: '-',
90
+ checkSymbols: exports.Chars.CrockfordCheck,
91
+ },
92
+ // Bit-block encoding, RFC 4648.
93
+ base16: { alphabet: exports.Chars.Base16, algorithm: 'block', pad: false, caseInsensitive: true },
94
+ hex: { alphabet: exports.Chars.Base16, algorithm: 'block', pad: false, caseInsensitive: true },
95
+ base32: { alphabet: exports.Chars.Base32, algorithm: 'block', caseInsensitive: true },
96
+ base32hex: { alphabet: exports.Chars.Base32Hex, algorithm: 'block', caseInsensitive: true },
97
+ base64: { alphabet: exports.Chars.Base64, algorithm: 'block' },
98
+ /** Unpadded, as used by JWT and other URL-facing formats. */
99
+ base64url: { alphabet: exports.Chars.Base64Url, algorithm: 'block', pad: false },
100
+ base64xml: { alphabet: exports.Chars.Base64Xml, algorithm: 'block', pad: false },
101
+ base64xmlname: { alphabet: exports.Chars.Base64XmlName, algorithm: 'block', pad: false },
102
+ // Four bytes to five characters.
103
+ /** Ascii85 with the zero-block shortcut, matching Python's `a85encode`. */
104
+ ascii85: { alphabet: exports.Chars.Ascii85, algorithm: 'block85', zeroShortcut: true },
105
+ /** ZeroMQ Z85, which has no padding and so encodes whole blocks only. */
106
+ z85: { alphabet: exports.Chars.Z85, algorithm: 'block85', requireFullBlocks: true },
107
+ // Radix conversion over the RFC alphabets.
108
+ radix16: { alphabet: exports.Chars.Base16, algorithm: 'radix' },
109
+ radix32: { alphabet: exports.Chars.Base32, algorithm: 'radix' },
110
+ radix64: { alphabet: exports.Chars.Base64, algorithm: 'radix' },
111
+ radix64url: { alphabet: exports.Chars.Base64Url, algorithm: 'radix' },
112
+ };
113
+ /**
114
+ * Resolves a base name to its codec spec, and passes a spec through unchanged.
115
+ *
116
+ * @throws {UnknownBaseError} If the name is not one of `Bases`
117
+ */
118
+ function resolveSpec(base) {
119
+ if (typeof base !== 'string') {
99
120
  return base;
100
121
  }
101
- throw new errors_js_1.UnknownBaseError(base);
122
+ const spec = exports.Bases[base.toLowerCase()];
123
+ if (spec === undefined) {
124
+ throw new errors_js_1.UnknownBaseError(base);
125
+ }
126
+ return spec;
102
127
  }
103
128
  /**
104
- * Checks if a string is a valid base name.
105
- *
106
- * @param value - The string to check
107
- * @returns `true` if the value is a valid `BaseName`, `false` otherwise
108
- *
109
- * @example
110
- * ```typescript
111
- * import { isBaseName } from 'bufferbase';
112
- *
113
- * isBaseName('base58'); // true
114
- * isBaseName('BASE58'); // true (case-insensitive)
115
- * isBaseName('unknown'); // false
116
- * ```
129
+ * Checks whether a string names one of the encodings in `Bases`.
117
130
  */
118
131
  function isBaseName(value) {
119
- return value.toLowerCase() in baseNameToChars;
132
+ return value.toLowerCase() in exports.Bases;
120
133
  }
121
134
  //# sourceMappingURL=bases.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bases.js","sourceRoot":"","sources":["../../src/bases.ts"],"names":[],"mappings":";;;AAyFA,oCAWC;AAiBD,gCAEC;AAtHD,2CAA+C;AAE/C;;;;;;;;;;;;;GAaG;AACU,QAAA,KAAK,GAAG;IACnB,mBAAmB;IACnB,OAAO,EAAE,YAAY;IACrB,0BAA0B;IAC1B,MAAM,EAAE,kBAAkB;IAC1B,8BAA8B;IAC9B,MAAM,EAAE,kCAAkC;IAC1C,2DAA2D;IAC3D,eAAe,EAAE,kCAAkC;IACnD,2BAA2B;IAC3B,MAAM,EAAE,sCAAsC;IAC9C,2BAA2B;IAC3B,MAAM,EAAE,sDAAsD;IAC9D,2DAA2D;IAC3D,MAAM,EAAE,4DAA4D;IACpE,mCAAmC;IACnC,MAAM,EAAE,kEAAkE;IAC1E,mCAAmC;IACnC,SAAS,EAAE,kEAAkE;IAC7E,oCAAoC;IACpC,SAAS,EAAE,kEAAkE;IAC7E,mCAAmC;IACnC,aAAa,EAAE,kEAAkE;IACjF,uBAAuB;IACvB,OAAO,EAAE,uFAAuF;IAChG,sBAAsB;IACtB,MAAM,EAAE,uFAAuF;IAC/F,0BAA0B;IAC1B,GAAG,EAAE,uFAAuF;CACpF,CAAC;AAEX;;;GAGG;AACH,MAAM,eAAe,GAA6B;IAChD,OAAO,EAAE,aAAK,CAAC,OAAO;IACtB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,GAAG,EAAE,aAAK,CAAC,MAAM;IACjB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,eAAe,EAAE,aAAK,CAAC,eAAe;IACtC,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,SAAS,EAAE,aAAK,CAAC,SAAS;IAC1B,SAAS,EAAE,aAAK,CAAC,SAAS;IAC1B,aAAa,EAAE,aAAK,CAAC,aAAa;IAClC,OAAO,EAAE,aAAK,CAAC,OAAO;IACtB,MAAM,EAAE,aAAK,CAAC,MAAM;IACpB,GAAG,EAAE,aAAK,CAAC,GAAG;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,YAAY,CAAC,IAAuB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAc,CAAC;IAClD,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;QAClC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,0DAA0D;IAC1D,2DAA2D;IAC3D,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,4BAAgB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"bases.js","sourceRoot":"","sources":["../../src/bases.ts"],"names":[],"mappings":"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"}
@@ -1,43 +1,37 @@
1
1
  /**
2
- * @deprecated Use the new API instead:
3
- * - `encode(buffer, 'base58')` or `base58.encode(buffer)`
4
- * - `decode(encoded, 'base58')` or `base58.decode(encoded)`
5
- * - `convert(input, 'base58', 'base64')` or `base58.convertTo(base64, input)`
6
- * - `validate(input, 'base58')` or `base58.validate(input)`
2
+ * @deprecated Use the current API instead:
3
+ * - `encode(buffer, 'base58')` or `Codecs.base58.encode(buffer)`
4
+ * - `decode(encoded, 'base58')` or `Codecs.base58.decode(encoded)`
5
+ * - `convert(input, 'base58', 'base64')` or `Codecs.base58.convertTo(...)`
6
+ * - `validate(input, 'base58')` or `Codecs.base58.validate(input)`
7
+ *
8
+ * These classes take a bare alphabet, which always meant a radix conversion,
9
+ * so they keep behaving exactly as they did.
7
10
  */
8
- import { Buffer } from 'node:buffer';
9
- import { InvalidCharacterError, BufferSizeError } from './errors.js';
11
+ import type { Buffer } from 'node:buffer';
12
+ import type { BufferLike } from './types.js';
13
+ /** @deprecated Import `Chars` from the package root. */
10
14
  export { Chars } from './bases.js';
11
- export { InvalidCharacterError, BufferSizeError };
12
- /**
13
- * @deprecated Use `Codec` or `createCodec()` instead.
14
- */
15
+ /** @deprecated Import these from the package root. */
16
+ export { BufferSizeError, InvalidCharacterError } from './errors.js';
17
+ /** @deprecated Use `createCodec(alphabet)`. */
15
18
  export declare class BufferEncoder {
16
- private baseChars;
17
- private codec;
19
+ private readonly codec;
18
20
  constructor(baseChars: string);
19
- encode(buffer: Buffer): string;
21
+ encode(buffer: BufferLike): string;
20
22
  decode(encoded: string, bufferSize?: number): Buffer;
21
23
  }
22
- /**
23
- * @deprecated Use `convert()` function or `codec.convertTo()` instead.
24
- */
24
+ /** @deprecated Use `convert()` or `codec.convertTo()`. */
25
25
  export declare class Converter {
26
- decoder: BufferEncoder;
27
- encoder: BufferEncoder;
26
+ readonly decoder: BufferEncoder;
27
+ readonly encoder: BufferEncoder;
28
28
  constructor(inputBase: string, outputBase: string);
29
29
  convert(input: string): string;
30
30
  }
31
- /**
32
- * @deprecated Use `validate()` function or `codec.validate()` instead.
33
- */
31
+ /** @deprecated Use `validate()` or `codec.validate()`. */
34
32
  export declare class Validator {
35
- private codec;
33
+ private readonly codec;
36
34
  constructor(inputBase: string);
37
35
  validate(input: string): boolean;
38
36
  }
39
- /**
40
- * @deprecated Use `validate()` from the main module instead.
41
- */
42
- export declare const validate: (input: string, base: string) => boolean;
43
37
  //# sourceMappingURL=bufferbase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bufferbase.d.ts","sourceRoot":"","sources":["../../src/bufferbase.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC;AAElD;;GAEG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,SAAS;IAF7B,OAAO,CAAC,KAAK,CAAQ;gBAED,SAAS,EAAE,MAAM;IAIrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI9B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;CAGrD;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;gBAEX,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAKjD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG/B;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAQ;gBAET,SAAS,EAAE,MAAM;IAI7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGjC;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,KAAG,OAEtD,CAAC"}
1
+ {"version":3,"file":"bufferbase.d.ts","sourceRoot":"","sources":["../../src/bufferbase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wDAAwD;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,sDAAsD;AACtD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAErE,+CAA+C;AAC/C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAEvB,SAAS,EAAE,MAAM;IAI7B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAIlC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;CAGrD;AAED,0DAA0D;AAC1D,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;gBAEpB,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAKjD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG/B;AAED,0DAA0D;AAC1D,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAEvB,SAAS,EAAE,MAAM;IAI7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGjC"}
@@ -1,39 +1,38 @@
1
1
  "use strict";
2
2
  /**
3
- * @deprecated Use the new API instead:
4
- * - `encode(buffer, 'base58')` or `base58.encode(buffer)`
5
- * - `decode(encoded, 'base58')` or `base58.decode(encoded)`
6
- * - `convert(input, 'base58', 'base64')` or `base58.convertTo(base64, input)`
7
- * - `validate(input, 'base58')` or `base58.validate(input)`
3
+ * @deprecated Use the current API instead:
4
+ * - `encode(buffer, 'base58')` or `Codecs.base58.encode(buffer)`
5
+ * - `decode(encoded, 'base58')` or `Codecs.base58.decode(encoded)`
6
+ * - `convert(input, 'base58', 'base64')` or `Codecs.base58.convertTo(...)`
7
+ * - `validate(input, 'base58')` or `Codecs.base58.validate(input)`
8
+ *
9
+ * These classes take a bare alphabet, which always meant a radix conversion,
10
+ * so they keep behaving exactly as they did.
8
11
  */
9
12
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.validate = exports.Validator = exports.Converter = exports.BufferEncoder = exports.BufferSizeError = exports.InvalidCharacterError = exports.Chars = void 0;
11
- const codec_js_1 = require("./codec.js");
12
- const errors_js_1 = require("./errors.js");
13
- Object.defineProperty(exports, "InvalidCharacterError", { enumerable: true, get: function () { return errors_js_1.InvalidCharacterError; } });
14
- Object.defineProperty(exports, "BufferSizeError", { enumerable: true, get: function () { return errors_js_1.BufferSizeError; } });
15
- // Re-export Chars for backward compatibility
13
+ exports.Validator = exports.Converter = exports.BufferEncoder = exports.InvalidCharacterError = exports.BufferSizeError = exports.Chars = void 0;
14
+ const codec_radix_js_1 = require("./codec-radix.js");
15
+ /** @deprecated Import `Chars` from the package root. */
16
16
  var bases_js_1 = require("./bases.js");
17
17
  Object.defineProperty(exports, "Chars", { enumerable: true, get: function () { return bases_js_1.Chars; } });
18
- /**
19
- * @deprecated Use `Codec` or `createCodec()` instead.
20
- */
18
+ /** @deprecated Import these from the package root. */
19
+ var errors_js_1 = require("./errors.js");
20
+ Object.defineProperty(exports, "BufferSizeError", { enumerable: true, get: function () { return errors_js_1.BufferSizeError; } });
21
+ Object.defineProperty(exports, "InvalidCharacterError", { enumerable: true, get: function () { return errors_js_1.InvalidCharacterError; } });
22
+ /** @deprecated Use `createCodec(alphabet)`. */
21
23
  class BufferEncoder {
22
24
  constructor(baseChars) {
23
- this.baseChars = baseChars;
24
- this.codec = new codec_js_1.Codec(baseChars);
25
+ this.codec = new codec_radix_js_1.RadixCodec({ alphabet: baseChars, algorithm: 'radix' });
25
26
  }
26
27
  encode(buffer) {
27
28
  return this.codec.encode(buffer);
28
29
  }
29
30
  decode(encoded, bufferSize) {
30
- return this.codec.decode(encoded, bufferSize !== undefined ? { size: bufferSize } : undefined);
31
+ return this.codec.decode(encoded, bufferSize === undefined ? undefined : { size: bufferSize });
31
32
  }
32
33
  }
33
34
  exports.BufferEncoder = BufferEncoder;
34
- /**
35
- * @deprecated Use `convert()` function or `codec.convertTo()` instead.
36
- */
35
+ /** @deprecated Use `convert()` or `codec.convertTo()`. */
37
36
  class Converter {
38
37
  constructor(inputBase, outputBase) {
39
38
  this.decoder = new BufferEncoder(inputBase);
@@ -44,23 +43,14 @@ class Converter {
44
43
  }
45
44
  }
46
45
  exports.Converter = Converter;
47
- /**
48
- * @deprecated Use `validate()` function or `codec.validate()` instead.
49
- */
46
+ /** @deprecated Use `validate()` or `codec.validate()`. */
50
47
  class Validator {
51
48
  constructor(inputBase) {
52
- this.codec = new codec_js_1.Codec(inputBase);
49
+ this.codec = new codec_radix_js_1.RadixCodec({ alphabet: inputBase, algorithm: 'radix' });
53
50
  }
54
51
  validate(input) {
55
52
  return this.codec.validate(input);
56
53
  }
57
54
  }
58
55
  exports.Validator = Validator;
59
- /**
60
- * @deprecated Use `validate()` from the main module instead.
61
- */
62
- const validate = (input, base) => {
63
- return new Validator(base).validate(input);
64
- };
65
- exports.validate = validate;
66
56
  //# sourceMappingURL=bufferbase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bufferbase.js","sourceRoot":"","sources":["../../src/bufferbase.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAGH,yCAAmC;AACnC,2CAAqE;AAM5D,sGANA,iCAAqB,OAMA;AAAE,gGANA,2BAAe,OAMA;AAJ/C,6CAA6C;AAC7C,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AAKd;;GAEG;AACH,MAAa,aAAa;IAGxB,YAAoB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAK,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,UAAmB;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjG,CAAC;CACF;AAdD,sCAcC;AAED;;GAEG;AACH,MAAa,SAAS;IAIpB,YAAY,SAAiB,EAAE,UAAkB;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAZD,8BAYC;AAED;;GAEG;AACH,MAAa,SAAS;IAGpB,YAAY,SAAiB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAK,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF;AAVD,8BAUC;AAED;;GAEG;AACI,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAAY,EAAW,EAAE;IAC/D,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC,CAAC;AAFW,QAAA,QAAQ,YAEnB"}
1
+ {"version":3,"file":"bufferbase.js","sourceRoot":"","sources":["../../src/bufferbase.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAIH,qDAA8C;AAE9C,wDAAwD;AACxD,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AAEd,sDAAsD;AACtD,yCAAqE;AAA5D,4GAAA,eAAe,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAE/C,+CAA+C;AAC/C,MAAa,aAAa;IAGxB,YAAY,SAAiB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,2BAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,MAAkB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,UAAmB;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACjG,CAAC;CACF;AAdD,sCAcC;AAED,0DAA0D;AAC1D,MAAa,SAAS;IAIpB,YAAY,SAAiB,EAAE,UAAkB;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AAZD,8BAYC;AAED,0DAA0D;AAC1D,MAAa,SAAS;IAGpB,YAAY,SAAiB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,2BAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF;AAVD,8BAUC"}
@@ -0,0 +1,56 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import type { Algorithm, BufferLike, CodecSpec, DecodeOptions, ICodec } from './types.js';
3
+ /** Converts a `BufferLike` to a `Buffer` without copying when possible. */
4
+ export declare function toBuffer(input: BufferLike): Buffer;
5
+ /**
6
+ * Shared alphabet handling for the three codec implementations.
7
+ *
8
+ * Subclasses provide the mapping between bytes and characters; this class owns
9
+ * the alphabet, the character lookup, optional case folding, and `convertTo`.
10
+ */
11
+ export declare abstract class BaseCodec implements ICodec {
12
+ /** Character set used for encoding. */
13
+ readonly chars: string;
14
+ /** The algorithm this codec applies to `chars`. */
15
+ abstract readonly algorithm: Algorithm;
16
+ /** Whether non-canonical input is rejected. */
17
+ protected readonly strict: boolean;
18
+ private readonly charToIndex;
19
+ /** Characters dropped from the input before decoding. */
20
+ private readonly ignored;
21
+ /**
22
+ * The alphabet as one byte per character, or `null` when some character does
23
+ * not fit in a byte.
24
+ *
25
+ * Assembling output as bytes and decoding it once is several times faster
26
+ * than concatenating characters, and every alphabet in practical use is
27
+ * single-byte.
28
+ */
29
+ protected readonly codes: Uint8Array | null;
30
+ /**
31
+ * The value of every decodable character, indexed by code unit, or `-1`.
32
+ * `null` when some character does not fit in a byte.
33
+ *
34
+ * Reading a character by index and looking it up here avoids allocating a
35
+ * string and hashing it for every character of the input.
36
+ */
37
+ private readonly valueByCode;
38
+ protected constructor(spec: CodecSpec);
39
+ /** Reads the first `length` bytes of `written` back as text. */
40
+ protected textFrom(written: Uint8Array, length: number): string;
41
+ /** Drops the characters this codec ignores, such as readability hyphens. */
42
+ protected strip(input: string): string;
43
+ /** Returns the value of a character, or `undefined` if it is not in the alphabet. */
44
+ protected valueOf(char: string): number | undefined;
45
+ /**
46
+ * Returns the value of the character at `index`, or `-1` if it is not
47
+ * decodable. This is the hot path of every decoder.
48
+ */
49
+ protected valueAt(input: string, index: number): number;
50
+ abstract encode(buffer: BufferLike): string;
51
+ abstract decode(encoded: string, options?: DecodeOptions): Buffer;
52
+ abstract validate(input: string): boolean;
53
+ /** Decodes with this codec, then re-encodes with `target`. */
54
+ convertTo(target: ICodec, input: string): string;
55
+ }
56
+ //# sourceMappingURL=codec-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-base.d.ts","sourceRoot":"","sources":["../../src/codec-base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA6B1F,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElD;AAED;;;;;GAKG;AACH,8BAAsB,SAAU,YAAW,MAAM;IAC/C,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAEvC,+CAA+C;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAElD,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAE5C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAEhD,SAAS,aAAa,IAAI,EAAE,SAAS;IA0DrC,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAI/D,4EAA4E;IAC5E,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IActC,qFAAqF;IACrF,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD;;;OAGG;IACH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAUvD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAC3C,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IACjE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAEzC,8DAA8D;IAC9D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAGjD"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseCodec = void 0;
4
+ exports.toBuffer = toBuffer;
5
+ const node_buffer_1 = require("node:buffer");
6
+ const errors_js_1 = require("./errors.js");
7
+ /** Returns one byte per character, or `null` if the alphabet needs more. */
8
+ function singleByteCodes(alphabet) {
9
+ const codes = new Uint8Array(alphabet.length);
10
+ for (let i = 0; i < alphabet.length; i++) {
11
+ const code = alphabet.charCodeAt(i);
12
+ if (code > 0xff) {
13
+ return null;
14
+ }
15
+ codes[i] = code;
16
+ }
17
+ return codes;
18
+ }
19
+ /** Indexes the decodable characters by code unit, or `null` if any needs more than a byte. */
20
+ function codeTable(charToIndex) {
21
+ const table = new Int16Array(256).fill(-1);
22
+ for (const [char, value] of charToIndex) {
23
+ const code = char.charCodeAt(0);
24
+ if (char.length !== 1 || code > 0xff) {
25
+ return null;
26
+ }
27
+ table[code] = value;
28
+ }
29
+ return table;
30
+ }
31
+ /** Converts a `BufferLike` to a `Buffer` without copying when possible. */
32
+ function toBuffer(input) {
33
+ return node_buffer_1.Buffer.isBuffer(input) ? input : node_buffer_1.Buffer.from(input.buffer, input.byteOffset, input.length);
34
+ }
35
+ /**
36
+ * Shared alphabet handling for the three codec implementations.
37
+ *
38
+ * Subclasses provide the mapping between bytes and characters; this class owns
39
+ * the alphabet, the character lookup, optional case folding, and `convertTo`.
40
+ */
41
+ class BaseCodec {
42
+ constructor(spec) {
43
+ const { alphabet, strict = true, caseInsensitive = false, aliases, ignore } = spec;
44
+ if (alphabet.length < 2) {
45
+ throw new errors_js_1.InvalidCodecError(`alphabet needs at least 2 characters, got ${alphabet.length}`);
46
+ }
47
+ if (new Set(alphabet).size !== alphabet.length) {
48
+ throw new errors_js_1.InvalidCodecError('alphabet contains duplicate characters');
49
+ }
50
+ if ([...alphabet].some((char) => char.length !== 1)) {
51
+ throw new errors_js_1.InvalidCodecError('every alphabet character must be a single code unit');
52
+ }
53
+ if (caseInsensitive && new Set(alphabet.toLowerCase()).size !== alphabet.length) {
54
+ throw new errors_js_1.InvalidCodecError('caseInsensitive needs an alphabet that does not contain both cases of a letter');
55
+ }
56
+ this.chars = alphabet;
57
+ this.strict = strict;
58
+ this.charToIndex = new Map();
59
+ const accept = (char, value) => {
60
+ this.charToIndex.set(char, value);
61
+ if (caseInsensitive) {
62
+ this.charToIndex.set(char.toLowerCase(), value);
63
+ this.charToIndex.set(char.toUpperCase(), value);
64
+ }
65
+ };
66
+ for (let i = 0; i < alphabet.length; i++) {
67
+ accept(alphabet[i], i);
68
+ }
69
+ for (const [from, to] of Object.entries(aliases ?? {})) {
70
+ if (from.length !== 1) {
71
+ throw new errors_js_1.InvalidCodecError(`alias '${from}' must be a single character`);
72
+ }
73
+ const value = this.charToIndex.get(to);
74
+ if (value === undefined) {
75
+ throw new errors_js_1.InvalidCodecError(`alias '${from}' points at '${to}', which is not in the alphabet`);
76
+ }
77
+ if (alphabet.includes(from)) {
78
+ throw new errors_js_1.InvalidCodecError(`alias '${from}' is already in the alphabet`);
79
+ }
80
+ accept(from, value);
81
+ }
82
+ this.codes = singleByteCodes(alphabet);
83
+ this.valueByCode = codeTable(this.charToIndex);
84
+ this.ignored = new Set(ignore ?? '');
85
+ for (const char of this.ignored) {
86
+ if (this.charToIndex.has(char)) {
87
+ throw new errors_js_1.InvalidCodecError(`ignored character '${char}' is also decodable`);
88
+ }
89
+ }
90
+ }
91
+ /** Reads the first `length` bytes of `written` back as text. */
92
+ textFrom(written, length) {
93
+ return node_buffer_1.Buffer.from(written.buffer, written.byteOffset, length).toString('latin1');
94
+ }
95
+ /** Drops the characters this codec ignores, such as readability hyphens. */
96
+ strip(input) {
97
+ if (this.ignored.size === 0) {
98
+ return input;
99
+ }
100
+ let out = '';
101
+ for (let i = 0; i < input.length; i++) {
102
+ const char = input[i];
103
+ if (!this.ignored.has(char)) {
104
+ out += char;
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /** Returns the value of a character, or `undefined` if it is not in the alphabet. */
110
+ valueOf(char) {
111
+ return this.charToIndex.get(char);
112
+ }
113
+ /**
114
+ * Returns the value of the character at `index`, or `-1` if it is not
115
+ * decodable. This is the hot path of every decoder.
116
+ */
117
+ valueAt(input, index) {
118
+ const table = this.valueByCode;
119
+ if (table === null) {
120
+ const value = this.charToIndex.get(input[index]);
121
+ return value === undefined ? -1 : value;
122
+ }
123
+ const code = input.charCodeAt(index);
124
+ return code > 0xff ? -1 : table[code];
125
+ }
126
+ /** Decodes with this codec, then re-encodes with `target`. */
127
+ convertTo(target, input) {
128
+ return target.encode(this.decode(input));
129
+ }
130
+ }
131
+ exports.BaseCodec = BaseCodec;
132
+ //# sourceMappingURL=codec-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-base.js","sourceRoot":"","sources":["../../src/codec-base.ts"],"names":[],"mappings":"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"}