bufferbase 1.3.0 → 2.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 (107) hide show
  1. package/README.md +99 -18
  2. package/dist/cjs/bases.d.ts +82 -0
  3. package/dist/cjs/bases.d.ts.map +1 -0
  4. package/dist/cjs/bases.js +121 -0
  5. package/dist/cjs/bases.js.map +1 -0
  6. package/dist/cjs/bufferbase.d.ts +19 -36
  7. package/dist/cjs/bufferbase.d.ts.map +1 -1
  8. package/dist/cjs/bufferbase.js +27 -111
  9. package/dist/cjs/bufferbase.js.map +1 -1
  10. package/dist/cjs/codec.d.ts +124 -0
  11. package/dist/cjs/codec.d.ts.map +1 -0
  12. package/dist/cjs/codec.js +247 -0
  13. package/dist/cjs/codec.js.map +1 -0
  14. package/dist/cjs/codecs.d.ts +71 -0
  15. package/dist/cjs/codecs.d.ts.map +1 -0
  16. package/dist/cjs/codecs.js +92 -0
  17. package/dist/cjs/codecs.js.map +1 -0
  18. package/dist/cjs/errors.d.ts +76 -0
  19. package/dist/cjs/errors.d.ts.map +1 -0
  20. package/dist/cjs/errors.js +92 -0
  21. package/dist/cjs/errors.js.map +1 -0
  22. package/dist/cjs/example.js +20 -27
  23. package/dist/cjs/example.js.map +1 -1
  24. package/dist/cjs/functions.d.ts +62 -0
  25. package/dist/cjs/functions.d.ts.map +1 -0
  26. package/dist/cjs/functions.js +93 -0
  27. package/dist/cjs/functions.js.map +1 -0
  28. package/dist/cjs/index.d.ts +8 -1
  29. package/dist/cjs/index.d.ts.map +1 -1
  30. package/dist/cjs/index.js +25 -4
  31. package/dist/cjs/index.js.map +1 -1
  32. package/dist/cjs/package.json +6 -7
  33. package/dist/cjs/types.d.ts +107 -0
  34. package/dist/cjs/types.d.ts.map +1 -0
  35. package/dist/cjs/types.js +3 -0
  36. package/dist/cjs/types.js.map +1 -0
  37. package/dist/esm/bases.d.ts +82 -0
  38. package/dist/esm/bases.d.ts.map +1 -0
  39. package/dist/esm/bases.js +116 -0
  40. package/dist/esm/bases.js.map +1 -0
  41. package/dist/esm/bufferbase.d.ts +19 -36
  42. package/dist/esm/bufferbase.d.ts.map +1 -1
  43. package/dist/esm/bufferbase.js +25 -107
  44. package/dist/esm/bufferbase.js.map +1 -1
  45. package/dist/esm/codec.d.ts +124 -0
  46. package/dist/esm/codec.d.ts.map +1 -0
  47. package/dist/esm/codec.js +242 -0
  48. package/dist/esm/codec.js.map +1 -0
  49. package/dist/esm/codecs.d.ts +71 -0
  50. package/dist/esm/codecs.d.ts.map +1 -0
  51. package/dist/esm/codecs.js +89 -0
  52. package/dist/esm/codecs.js.map +1 -0
  53. package/dist/esm/errors.d.ts +76 -0
  54. package/dist/esm/errors.d.ts.map +1 -0
  55. package/dist/esm/errors.js +86 -0
  56. package/dist/esm/errors.js.map +1 -0
  57. package/dist/esm/example.js +19 -26
  58. package/dist/esm/example.js.map +1 -1
  59. package/dist/esm/functions.d.ts +62 -0
  60. package/dist/esm/functions.d.ts.map +1 -0
  61. package/dist/esm/functions.js +87 -0
  62. package/dist/esm/functions.js.map +1 -0
  63. package/dist/esm/index.d.ts +8 -1
  64. package/dist/esm/index.d.ts.map +1 -1
  65. package/dist/esm/index.js +12 -1
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/package.json +6 -7
  68. package/dist/esm/types.d.ts +107 -0
  69. package/dist/esm/types.d.ts.map +1 -0
  70. package/dist/esm/types.js +2 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/package.json +8 -9
  73. package/src/bases.ts +120 -0
  74. package/src/bufferbase.test.ts +44 -27
  75. package/src/bufferbase.ts +31 -106
  76. package/src/codec.test.ts +320 -0
  77. package/src/codec.ts +266 -0
  78. package/src/codecs.ts +118 -0
  79. package/src/errors.ts +87 -0
  80. package/src/example.ts +20 -30
  81. package/src/functions.ts +93 -0
  82. package/src/index.ts +21 -8
  83. package/src/types.ts +129 -0
  84. package/dist/cjs/bufferbase.d.mts +0 -60
  85. package/dist/cjs/bufferbase.d.mts.map +0 -1
  86. package/dist/cjs/bufferbase.mjs +0 -150
  87. package/dist/cjs/bufferbase.mjs.map +0 -1
  88. package/dist/cjs/example.d.mts +0 -2
  89. package/dist/cjs/example.d.mts.map +0 -1
  90. package/dist/cjs/example.mjs +0 -39
  91. package/dist/cjs/example.mjs.map +0 -1
  92. package/dist/cjs/index.d.mts +0 -2
  93. package/dist/cjs/index.d.mts.map +0 -1
  94. package/dist/cjs/index.mjs +0 -11
  95. package/dist/cjs/index.mjs.map +0 -1
  96. package/dist/esm/bufferbase.d.mts +0 -60
  97. package/dist/esm/bufferbase.d.mts.map +0 -1
  98. package/dist/esm/bufferbase.mjs +0 -141
  99. package/dist/esm/bufferbase.mjs.map +0 -1
  100. package/dist/esm/example.d.mts +0 -2
  101. package/dist/esm/example.d.mts.map +0 -1
  102. package/dist/esm/example.mjs +0 -37
  103. package/dist/esm/example.mjs.map +0 -1
  104. package/dist/esm/index.d.mts +0 -2
  105. package/dist/esm/index.d.mts.map +0 -1
  106. package/dist/esm/index.mjs +0 -2
  107. package/dist/esm/index.mjs.map +0 -1
package/src/bufferbase.ts CHANGED
@@ -1,112 +1,42 @@
1
1
  /**
2
- * A collection of common bases.
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)`
3
7
  */
4
- export const Chars = {
5
- Decimal: '0123456789',
6
- Base16: '0123456789ABCDEF',
7
- Base32: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
8
- Base32Crockford: '0123456789ABCDEFGHJKMNPQRSTVWXYZ',
9
- Base36: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
10
- Base52: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
11
- Base58: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',
12
- Base64_STD:
13
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
14
- Base64_URL_SAFE:
15
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
16
- Base64_XML_NMTOKEN:
17
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._',
18
- Base64_XML_NAME:
19
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_:',
20
- Ascii85:
21
- '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstu',
22
- Base85:
23
- '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+-;<=>?@^_`{|}~',
24
- Z85: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#',
25
- };
26
8
 
27
- export class InvalidCharacterError extends Error {
28
- message = 'Invalid character found';
29
- }
9
+ import { Buffer } from 'node:buffer';
10
+ import { Codec } from './codec.js';
11
+ import { InvalidCharacterError, BufferSizeError } from './errors.js';
30
12
 
31
- export class BufferSizeError extends Error {
32
- message = 'Buffer size exceeds specified size';
33
- }
13
+ // Re-export Chars for backward compatibility
14
+ export { Chars } from './bases.js';
15
+
16
+ // Re-export errors
17
+ export { InvalidCharacterError, BufferSizeError };
34
18
 
35
19
  /**
36
- * Encodes and decodes buffers to and from a base.
20
+ * @deprecated Use `Codec` or `createCodec()` instead.
37
21
  */
38
22
  export class BufferEncoder {
39
- constructor(private baseChars: string) {}
23
+ private codec: Codec;
24
+
25
+ constructor(private baseChars: string) {
26
+ this.codec = new Codec(baseChars);
27
+ }
40
28
 
41
- /**
42
- * Encodes a buffer to a string.
43
- */
44
29
  encode(buffer: Buffer): string {
45
- let result = [];
46
- for (const byte of buffer) {
47
- let carry = byte;
48
- for (let j = 0; j < result.length; j++) {
49
- carry += result[j] * 256;
50
- result[j] = carry % this.baseChars.length;
51
- carry = Math.floor(carry / this.baseChars.length);
52
- }
53
- while (carry > 0) {
54
- result.push(carry % this.baseChars.length);
55
- carry = Math.floor(carry / this.baseChars.length);
56
- }
57
- }
58
- for (const byte of buffer) {
59
- if (byte === 0) {
60
- result.push(0);
61
- } else {
62
- break;
63
- }
64
- }
65
- return result
66
- .reverse()
67
- .map((index) => this.baseChars[index])
68
- .join('');
30
+ return this.codec.encode(buffer);
69
31
  }
70
32
 
71
- /**
72
- * Decodes a string to a buffer.
73
- */
74
33
  decode(encoded: string, bufferSize?: number): Buffer {
75
- let result = Buffer.alloc(0);
76
- for (const char of encoded) {
77
- const value = this.baseChars.indexOf(char);
78
- if (value === -1) throw new InvalidCharacterError();
79
- let carry = value;
80
- let tempResult = Buffer.alloc(result.length);
81
- let i;
82
- for (i = 0; i < result.length; i++) {
83
- carry += result[i] * this.baseChars.length;
84
- tempResult[i] = carry % 256;
85
- carry = Math.floor(carry / 256);
86
- }
87
- while (carry > 0) {
88
- tempResult = Buffer.concat([tempResult, Buffer.from([carry % 256])]);
89
- carry = Math.floor(carry / 256);
90
- }
91
- result = tempResult;
92
- }
93
- // buffer size
94
- if (bufferSize && result.length < bufferSize) {
95
- result = Buffer.concat([
96
- result,
97
- Buffer.from(Array(bufferSize - result.length).fill(0)),
98
- ]);
99
- }
100
- if (bufferSize && result.length > bufferSize) {
101
- throw new BufferSizeError();
102
- }
103
- result.reverse();
104
- return result;
34
+ return this.codec.decode(encoded, bufferSize !== undefined ? { size: bufferSize } : undefined);
105
35
  }
106
36
  }
107
37
 
108
38
  /**
109
- * Creates a converter function that can convert between two bases.
39
+ * @deprecated Use `convert()` function or `codec.convertTo()` instead.
110
40
  */
111
41
  export class Converter {
112
42
  decoder: BufferEncoder;
@@ -117,34 +47,29 @@ export class Converter {
117
47
  this.encoder = new BufferEncoder(outputBase);
118
48
  }
119
49
 
120
- /**
121
- * Converts a string from the input base to the output base.
122
- */
123
50
  convert(input: string): string {
124
51
  return this.encoder.encode(this.decoder.decode(input));
125
52
  }
126
53
  }
127
54
 
55
+ /**
56
+ * @deprecated Use `validate()` function or `codec.validate()` instead.
57
+ */
128
58
  export class Validator {
129
- decorder: BufferEncoder;
59
+ private codec: Codec;
130
60
 
131
61
  constructor(inputBase: string) {
132
- this.decorder = new BufferEncoder(inputBase);
62
+ this.codec = new Codec(inputBase);
133
63
  }
134
64
 
135
65
  validate(input: string): boolean {
136
- try {
137
- this.decorder.decode(input);
138
- return true;
139
- } catch (e) {
140
- if (e instanceof InvalidCharacterError) {
141
- return false;
142
- }
143
- throw e;
144
- }
66
+ return this.codec.validate(input);
145
67
  }
146
68
  }
147
69
 
70
+ /**
71
+ * @deprecated Use `validate()` from the main module instead.
72
+ */
148
73
  export const validate = (input: string, base: string): boolean => {
149
74
  return new Validator(base).validate(input);
150
75
  };
@@ -0,0 +1,320 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { describe, test, expect } from 'bun:test';
3
+
4
+ import {
5
+ encode,
6
+ decode,
7
+ convert,
8
+ validate,
9
+ createCodec,
10
+ Codecs,
11
+ Chars,
12
+ InvalidCharacterError,
13
+ BufferSizeError,
14
+ UnknownBaseError,
15
+ } from './index.js';
16
+
17
+ describe('Function API', () => {
18
+ test('encode/decode round-trip with base name', () => {
19
+ const buffer = Buffer.from('Hello, World!', 'utf8');
20
+ const encoded = encode(buffer, 'base58');
21
+ const decoded = decode(encoded, 'base58');
22
+ expect(decoded.toString('utf8')).toBe('Hello, World!');
23
+ });
24
+
25
+ test('encode/decode with custom character set', () => {
26
+ const buffer = Buffer.from('Test', 'utf8');
27
+ const encoded = encode(buffer, Chars.Base58);
28
+ const decoded = decode(encoded, Chars.Base58);
29
+ expect(decoded.toString('utf8')).toBe('Test');
30
+ });
31
+
32
+ test('convert between bases', () => {
33
+ const buffer = Buffer.from('Hello', 'utf8');
34
+ const base58Encoded = encode(buffer, 'base58');
35
+ const converted = convert(base58Encoded, 'base58', 'base64url');
36
+ const expected = encode(buffer, 'base64url');
37
+ expect(converted).toBe(expected);
38
+ });
39
+
40
+ test('validate returns true for valid input', () => {
41
+ expect(validate('9Ajdvz', 'base58')).toBe(true);
42
+ });
43
+
44
+ test('validate returns false for invalid input', () => {
45
+ expect(validate('0Ajdvz', 'base58')).toBe(false);
46
+ });
47
+
48
+ test('decode with size option pads buffer', () => {
49
+ const buffer = Buffer.from([1, 2, 3]);
50
+ const encoded = encode(buffer, 'base58');
51
+ const decoded = decode(encoded, 'base58', { size: 8 });
52
+ expect(decoded.length).toBe(8);
53
+ expect(decoded).toEqual(Buffer.from([0, 0, 0, 0, 0, 1, 2, 3]));
54
+ });
55
+
56
+ test('decode with size option throws on overflow', () => {
57
+ const buffer = Buffer.from([1, 2, 3, 4, 5]);
58
+ const encoded = encode(buffer, 'base58');
59
+ expect(() => {
60
+ decode(encoded, 'base58', { size: 3 });
61
+ }).toThrow(BufferSizeError);
62
+ });
63
+
64
+ test('throws UnknownBaseError for invalid base name', () => {
65
+ expect(() => {
66
+ encode(Buffer.from('test'), 'invalid');
67
+ }).toThrow(UnknownBaseError);
68
+ });
69
+ });
70
+
71
+ describe('Codecs object', () => {
72
+ test('Codecs.base58.encode/decode round-trip', () => {
73
+ const buffer = Buffer.from('Hello, World!', 'utf8');
74
+ const encoded = Codecs.base58.encode(buffer);
75
+ const decoded = Codecs.base58.decode(encoded);
76
+ expect(decoded.toString('utf8')).toBe('Hello, World!');
77
+ });
78
+
79
+ test('Codecs.base64url.encode/decode round-trip', () => {
80
+ const buffer = Buffer.from('Hello, World!', 'utf8');
81
+ const encoded = Codecs.base64url.encode(buffer);
82
+ const decoded = Codecs.base64url.decode(encoded);
83
+ expect(decoded.toString('utf8')).toBe('Hello, World!');
84
+ });
85
+
86
+ test('Codecs.base58.convertTo', () => {
87
+ const buffer = Buffer.from('Test', 'utf8');
88
+ const base58Encoded = Codecs.base58.encode(buffer);
89
+ const converted = Codecs.base58.convertTo(Codecs.base64url, base58Encoded);
90
+ expect(converted).toBe(Codecs.base64url.encode(buffer));
91
+ });
92
+
93
+ test('Codecs.base58.validate', () => {
94
+ expect(Codecs.base58.validate('123abc')).toBe(true);
95
+ expect(Codecs.base58.validate('0abc')).toBe(false);
96
+ });
97
+ });
98
+
99
+ describe('createCodec', () => {
100
+ test('creates custom codec', () => {
101
+ const binary = createCodec('01');
102
+ const buffer = Buffer.from([5]);
103
+ const encoded = binary.encode(buffer);
104
+ expect(encoded).toBe('101');
105
+ const decoded = binary.decode(encoded);
106
+ expect(decoded).toEqual(Buffer.from([5]));
107
+ });
108
+ });
109
+
110
+ describe('Edge cases', () => {
111
+ test('empty buffer', () => {
112
+ const buffer = Buffer.alloc(0);
113
+ const encoded = encode(buffer, 'base58');
114
+ expect(encoded).toBe('');
115
+ const decoded = decode(encoded, 'base58');
116
+ expect(decoded.length).toBe(0);
117
+ });
118
+
119
+ test('empty string with size option', () => {
120
+ const decoded = decode('', 'base58', { size: 4 });
121
+ expect(decoded).toEqual(Buffer.from([0, 0, 0, 0]));
122
+ });
123
+
124
+ test('leading zero bytes preserved', () => {
125
+ const buffer = Buffer.from([0, 0, 1, 2, 3]);
126
+ const encoded = encode(buffer, 'base58');
127
+ const decoded = decode(encoded, 'base58');
128
+ expect(decoded).toEqual(buffer);
129
+ });
130
+
131
+ test('multiple leading zeros', () => {
132
+ const buffer = Buffer.from([0, 0, 0, 0, 255]);
133
+ const encoded = encode(buffer, 'base58');
134
+ const decoded = decode(encoded, 'base58');
135
+ expect(decoded).toEqual(buffer);
136
+ });
137
+
138
+ test('all zeros', () => {
139
+ const buffer = Buffer.from([0, 0, 0]);
140
+ const encoded = encode(buffer, 'base58');
141
+ const decoded = decode(encoded, 'base58');
142
+ expect(decoded).toEqual(buffer);
143
+ });
144
+
145
+ test('single byte values', () => {
146
+ for (let i = 0; i < 256; i++) {
147
+ const buffer = Buffer.from([i]);
148
+ const encoded = encode(buffer, 'base58');
149
+ const decoded = decode(encoded, 'base58');
150
+ expect(decoded).toEqual(buffer);
151
+ }
152
+ });
153
+
154
+ test('long buffer', () => {
155
+ const buffer = Buffer.from('Hello, World!'.repeat(100), 'utf8');
156
+ const encoded = encode(buffer, 'base58');
157
+ const decoded = decode(encoded, 'base58');
158
+ expect(decoded.toString('utf8')).toBe('Hello, World!'.repeat(100));
159
+ });
160
+
161
+ test('binary powers from 0 to 63', () => {
162
+ for (let i = 0; i < 64; i++) {
163
+ const buffer = Buffer.alloc(8);
164
+ const num = BigInt(2) ** BigInt(i) - BigInt(1);
165
+ buffer.writeBigInt64BE(num);
166
+ const encoded = encode(buffer, 'base58');
167
+ const decoded = decode(encoded, 'base58', { size: 8 });
168
+ const result = decoded.readBigInt64BE();
169
+ expect(result).toBe(num);
170
+ }
171
+ });
172
+ });
173
+
174
+ describe('All character sets', () => {
175
+ const baseNames = [
176
+ 'decimal',
177
+ 'base16',
178
+ 'hex',
179
+ 'base32',
180
+ 'base32crockford',
181
+ 'base36',
182
+ 'base52',
183
+ 'base58',
184
+ 'base64',
185
+ 'base64url',
186
+ 'ascii85',
187
+ 'base85',
188
+ 'z85',
189
+ ] as const;
190
+
191
+ for (const base of baseNames) {
192
+ test(`${base} encode/decode round-trip`, () => {
193
+ const buffer = Buffer.from('Hello, World!', 'utf8');
194
+ const encoded = encode(buffer, base);
195
+ const decoded = decode(encoded, base);
196
+ expect(decoded.toString('utf8')).toBe('Hello, World!');
197
+ });
198
+ }
199
+ });
200
+
201
+ describe('Error handling', () => {
202
+ test('InvalidCharacterError on decode', () => {
203
+ expect(() => {
204
+ decode('Invalid!String', 'base58');
205
+ }).toThrow(InvalidCharacterError);
206
+ });
207
+
208
+ test('InvalidCharacterError includes character', () => {
209
+ try {
210
+ decode('abc!def', 'base58');
211
+ expect(true).toBe(false);
212
+ } catch (e) {
213
+ expect(e).toBeInstanceOf(InvalidCharacterError);
214
+ expect((e as Error).message).toContain('!');
215
+ }
216
+ });
217
+ });
218
+
219
+ describe('Uint8Array support', () => {
220
+ test('encode Uint8Array with function API', () => {
221
+ const uint8Array = new Uint8Array([72, 101, 108, 108, 111]); // 'Hello'
222
+ const buffer = Buffer.from('Hello', 'utf8');
223
+
224
+ const encodedFromUint8 = encode(uint8Array, 'base58');
225
+ const encodedFromBuffer = encode(buffer, 'base58');
226
+
227
+ expect(encodedFromUint8).toBe(encodedFromBuffer);
228
+ });
229
+
230
+ test('encode Uint8Array with Codecs object', () => {
231
+ const uint8Array = new Uint8Array([72, 101, 108, 108, 111]); // 'Hello'
232
+ const buffer = Buffer.from('Hello', 'utf8');
233
+
234
+ const encodedFromUint8 = Codecs.base58.encode(uint8Array);
235
+ const encodedFromBuffer = Codecs.base58.encode(buffer);
236
+
237
+ expect(encodedFromUint8).toBe(encodedFromBuffer);
238
+ });
239
+
240
+ test('encode empty Uint8Array', () => {
241
+ const uint8Array = new Uint8Array(0);
242
+ const encoded = encode(uint8Array, 'base58');
243
+ expect(encoded).toBe('');
244
+ });
245
+
246
+ test('encode Uint8Array with leading zeros', () => {
247
+ const uint8Array = new Uint8Array([0, 0, 1, 2, 3]);
248
+ const encoded = encode(uint8Array, 'base58');
249
+ const decoded = decode(encoded, 'base58');
250
+ expect(Array.from(decoded)).toEqual([0, 0, 1, 2, 3]);
251
+ });
252
+
253
+ test('encode Uint8Array all zeros', () => {
254
+ const uint8Array = new Uint8Array([0, 0, 0]);
255
+ const encoded = encode(uint8Array, 'base58');
256
+ const decoded = decode(encoded, 'base58');
257
+ expect(Array.from(decoded)).toEqual([0, 0, 0]);
258
+ });
259
+
260
+ test('encode Uint8Array across all base encodings', () => {
261
+ const uint8Array = new Uint8Array([1, 2, 3, 4, 5]);
262
+ const buffer = Buffer.from([1, 2, 3, 4, 5]);
263
+
264
+ const baseNames = [
265
+ 'decimal', 'base16', 'hex', 'base32', 'base32crockford',
266
+ 'base36', 'base52', 'base58', 'base64', 'base64url',
267
+ 'ascii85', 'base85', 'z85',
268
+ ] as const;
269
+
270
+ for (const base of baseNames) {
271
+ const encodedFromUint8 = encode(uint8Array, base);
272
+ const encodedFromBuffer = encode(buffer, base);
273
+ expect(encodedFromUint8).toBe(encodedFromBuffer);
274
+ }
275
+ });
276
+
277
+ test('custom codec with Uint8Array', () => {
278
+ const binary = createCodec('01');
279
+ const uint8Array = new Uint8Array([5]);
280
+ const encoded = binary.encode(uint8Array);
281
+ expect(encoded).toBe('101');
282
+ });
283
+ });
284
+
285
+ describe('Backward compatibility', () => {
286
+ test('BufferEncoder works', async () => {
287
+ const { BufferEncoder, Chars } = await import('./bufferbase.js');
288
+ const encoder = new BufferEncoder(Chars.Base58);
289
+ const buffer = Buffer.from('Hello', 'utf8');
290
+ const encoded = encoder.encode(buffer);
291
+ const decoded = encoder.decode(encoded);
292
+ expect(decoded.toString('utf8')).toBe('Hello');
293
+ });
294
+
295
+ test('BufferEncoder with bufferSize', async () => {
296
+ const { BufferEncoder, Chars } = await import('./bufferbase.js');
297
+ const encoder = new BufferEncoder(Chars.Base58);
298
+ const buffer = Buffer.alloc(0);
299
+ const encoded = encoder.encode(buffer);
300
+ const decoded = encoder.decode(encoded, 4);
301
+ expect(decoded.toString('hex')).toBe('00000000');
302
+ });
303
+
304
+ test('Converter works', async () => {
305
+ const { BufferEncoder, Converter, Chars } = await import('./bufferbase.js');
306
+ const converter = new Converter(Chars.Base58, Chars.Base64);
307
+ const buffer = Buffer.from('Test', 'utf8');
308
+ const base58Encoded = new BufferEncoder(Chars.Base58).encode(buffer);
309
+ const converted = converter.convert(base58Encoded);
310
+ const expected = new BufferEncoder(Chars.Base64).encode(buffer);
311
+ expect(converted).toBe(expected);
312
+ });
313
+
314
+ test('Validator works', async () => {
315
+ const { Validator, Chars } = await import('./bufferbase.js');
316
+ const validator = new Validator(Chars.Base58);
317
+ expect(validator.validate('123abc')).toBe(true);
318
+ expect(validator.validate('0abc')).toBe(false);
319
+ });
320
+ });