iconv-tiny 1.3.0 → 1.4.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.
@@ -1,16 +1,71 @@
1
1
  /**
2
- * iconv-tiny v1.3.0
2
+ * iconv-tiny v1.4.0
3
3
  * (c) 2025-present vip.delete <vip.delete@gmail.com>
4
4
  * @license MIT
5
5
  **/
6
6
 
7
7
 
8
+ // src/types.mjs
9
+ var createDecoderOperations = (createDecodeStateFn, decodeFn, decodeEndFn) => ({
10
+ createDecodeStateFn,
11
+ decodeFn,
12
+ decodeEndFn
13
+ });
14
+ var createEncoderOperations = (createEncodeStateFn, encodeIntoFn, flushIntoFn, byteLengthMaxFn, byteLengthFn) => ({
15
+ createEncodeStateFn,
16
+ encodeIntoFn,
17
+ flushIntoFn,
18
+ byteLengthMaxFn,
19
+ byteLengthFn
20
+ });
21
+
22
+ // src/native.mjs
23
+ var createDecodeStateNative = (charsetCtx, options) => {
24
+ const ignoreBOM = !(options?.stripBOM ?? STRIP_BOM_DEFAULT);
25
+ const state = {
26
+ decoder: new TextDecoder(charsetCtx.charsetName, { ignoreBOM })
27
+ };
28
+ return state;
29
+ };
30
+ var nativeDecode = (decodeState, input) => (
31
+ /** @type {!DecodeStateNative} */
32
+ decodeState.decoder.decode(input, { stream: true })
33
+ );
34
+ var nativeDecodeEnd = (decodeState) => (
35
+ /** @type {!DecodeStateNative} */
36
+ decodeState.decoder.decode()
37
+ );
38
+ var nativeDecoderOp = createDecoderOperations(
39
+ //
40
+ createDecodeStateNative,
41
+ nativeDecode,
42
+ nativeDecodeEnd
43
+ );
44
+ var isNativeDecoderSupported = (charsetName) => {
45
+ try {
46
+ new TextDecoder(charsetName);
47
+ return true;
48
+ } catch {
49
+ return false;
50
+ }
51
+ };
52
+
8
53
  // src/commons.mjs
54
+ var TEXT_ENCODER = new TextEncoder();
9
55
  var REPLACEMENT_CHARACTER_CODE = 65533;
10
56
  var DEFAULT_CHAR_BYTE = 63;
57
+ var MAX_BPM = 65535;
58
+ var MAX_CODE_POINT = 1114111;
59
+ var BOM_CHAR_CODE = 65279;
60
+ var STRIP_BOM_DEFAULT = true;
61
+ var ADD_BOM_DEFAULT = false;
62
+ var HIGH_SURROGATE_FROM = 55296;
63
+ var LOW_SURROGATE_FROM = 56320;
11
64
  var STRING_SMALLSIZE = 192;
12
65
  var STRING_CHUNKSIZE = 1024;
13
- var UTF16LE = new TextDecoder("utf-16le", { fatal: true });
66
+ var UTF16LE = new TextDecoder("utf-16le", { fatal: true, ignoreBOM: true });
67
+ var MAX_PREPEND_BYTES = 4;
68
+ var MAX_LEFTOVER_BYTES = 4;
14
69
  var getStringFallback = (u16) => {
15
70
  const len = u16.length;
16
71
  const result = [];
@@ -31,95 +86,164 @@ var getString = (u16) => {
31
86
  }
32
87
  };
33
88
  var isMapped = (num) => num !== REPLACEMENT_CHARACTER_CODE;
34
- var byteLengthDefault = (state, op, text) => {
35
- let total = 0;
36
- const buf = new Uint8Array(4096);
89
+ var decodeEndDummy = () => "";
90
+ var flushIntoDummy = () => {
91
+ };
92
+ var byteLengthMax1X = (str) => str.length;
93
+ var byteLengthMax2X = (str) => 2 * str.length;
94
+ var byteLengthMax4X = (str) => 4 * str.length;
95
+ var put16LE = (cp, buf, i) => {
96
+ buf[i] = cp;
97
+ buf[i + 1] = cp >> 8;
98
+ };
99
+ var put16BE = (cp, buf, i) => {
100
+ buf[i] = cp >> 8;
101
+ buf[i + 1] = cp;
102
+ };
103
+ var put32LE = (cp, buf, i) => {
104
+ buf[i] = cp;
105
+ buf[i + 1] = cp >> 8;
106
+ buf[i + 2] = cp >> 16;
107
+ buf[i + 3] = cp >> 24;
108
+ };
109
+ var put32BE = (cp, buf, i) => {
110
+ buf[i] = cp >> 24;
111
+ buf[i + 1] = cp >> 16;
112
+ buf[i + 2] = cp >> 8;
113
+ buf[i + 3] = cp;
114
+ };
115
+ var get32LE = (buf, i) => (buf[i] | buf[i + 1] << 8 | buf[i + 2] << 16 | buf[i + 3] << 24) >>> 0;
116
+ var get32BE = (buf, i) => (buf[i] << 24 | buf[i + 1] << 16 | buf[i + 2] << 8 | buf[i + 3]) >>> 0;
117
+ var appendCodePoint = (cp, buf, i) => {
118
+ if (cp <= MAX_BPM) {
119
+ buf[i] = cp;
120
+ return 1;
121
+ }
122
+ if (cp > MAX_CODE_POINT) {
123
+ buf[i] = REPLACEMENT_CHARACTER_CODE;
124
+ return 1;
125
+ }
126
+ cp -= 65536;
127
+ buf[i] = HIGH_SURROGATE_FROM | cp >> 10;
128
+ buf[i + 1] = LOW_SURROGATE_FROM | cp & 1023;
129
+ return 2;
130
+ };
131
+ var TEMP_BUFFER = new Uint8Array(4096);
132
+ var byteLengthDefault = (str, ctx2, op) => {
133
+ const state = op.createEncodeStateFn(ctx2, {});
37
134
  do {
38
- const { read, written } = op.encodeIntoFn(state, text, buf);
39
- text = text.slice(read);
40
- total += written;
41
- } while (text.length);
42
- return total;
135
+ const read = state.r;
136
+ op.encodeIntoFn(state, str, TEMP_BUFFER);
137
+ str = str.slice(state.r - read);
138
+ } while (str.length);
139
+ op.flushIntoFn(state, TEMP_BUFFER);
140
+ return state.w;
43
141
  };
44
- var CharsetDecoder = class {
142
+ var DecoderStream = class {
45
143
  /**
46
- * @param {!CharsetContext} ctx
144
+ * @param {!DecodeState} state
47
145
  * @param {!DecoderOperations} op
48
- * @param {!ns.DecoderOptions} [options]
49
146
  */
50
- constructor(ctx, op, options) {
51
- this.state = op.createDecodeStateFn(ctx, options ?? {});
147
+ constructor(state, op) {
148
+ this.state = state;
52
149
  this.op = op;
53
150
  }
54
151
  /**
55
152
  * @override
56
- * @param {!Uint8Array} [src]
153
+ * @param {!Uint8Array} buf
154
+ * @return {string}
155
+ */
156
+ // @ts-expect-error
157
+ write(buf) {
158
+ return this.op.decodeFn(this.state, buf);
159
+ }
160
+ /**
161
+ * @override
57
162
  * @return {string}
58
163
  */
59
164
  // @ts-expect-error
60
- decode(src) {
61
- return this.op.decodeFn(this.state, src);
165
+ end() {
166
+ return this.op.decodeEndFn(this.state);
62
167
  }
63
168
  };
64
- var CharsetEncoder = class {
169
+ var EncoderStream = class {
65
170
  /**
66
- * @param {!CharsetContext} ctx
171
+ * @param {!EncodeState} state
67
172
  * @param {!EncoderOperations} op
68
- * @param {!ns.EncoderOptions} [options]
69
173
  */
70
- constructor(ctx, op, options) {
71
- this.ctx = ctx;
174
+ constructor(state, op) {
175
+ this.state = state;
72
176
  this.op = op;
73
- this.options = options ?? {};
74
- this.state = op.createEncodeStateFn(ctx, this.options);
75
177
  }
76
178
  /**
77
179
  * @override
78
- * @param {string} [text]
180
+ * @param {string} str
79
181
  * @return {!Uint8Array}
80
182
  */
81
183
  // @ts-expect-error
82
- encode(text) {
83
- if (!text) {
84
- return new Uint8Array(0);
85
- }
86
- const { ctx, op, options } = this;
87
- const maxLen = op.byteLengthMaxFn(op.createEncodeStateFn(ctx, options), op, text);
88
- const buf = new Uint8Array(maxLen);
89
- const { written } = op.encodeIntoFn(this.state, text, buf);
90
- return buf.subarray(0, written);
184
+ write(str) {
185
+ const { state, op } = this;
186
+ const buf = new Uint8Array(op.byteLengthMaxFn(str) + MAX_PREPEND_BYTES);
187
+ const writtenBefore = state.w;
188
+ op.encodeIntoFn(state, str, buf);
189
+ return buf.subarray(0, state.w - writtenBefore);
190
+ }
191
+ /**
192
+ * @override
193
+ * @return {!Uint8Array}
194
+ */
195
+ // @ts-expect-error
196
+ end() {
197
+ const { state, op } = this;
198
+ const buf = new Uint8Array(MAX_LEFTOVER_BYTES);
199
+ const writtenBefore = state.w;
200
+ op.flushIntoFn(state, buf);
201
+ return buf.subarray(0, state.w - writtenBefore);
91
202
  }
203
+ // --- Low-Level Encoding APIs ---
92
204
  /**
93
205
  * @override
94
- * @param {string} text
95
- * @param {!Uint8Array} dst
206
+ * @param {string} str
207
+ * @param {!Uint8Array} buf
96
208
  * @return {!ns.TextEncoderEncodeIntoResult}
97
209
  */
98
210
  // @ts-expect-error
99
- encodeInto(text, dst) {
100
- return this.op.encodeIntoFn(this.state, text, dst);
211
+ encodeInto(str, buf) {
212
+ const { state, op } = this;
213
+ const readBefore = state.r;
214
+ const writtenBefore = state.w;
215
+ op.encodeIntoFn(state, str, buf);
216
+ return { read: state.r - readBefore, written: state.w - writtenBefore };
101
217
  }
102
218
  /**
103
219
  * @override
104
- * @param {string} text
105
- * @return {number}
220
+ * @param {!Uint8Array} buf
221
+ * @return {!ns.TextEncoderEncodeIntoResult}
106
222
  */
107
223
  // @ts-expect-error
108
- byteLength(text) {
109
- const { ctx, op, options } = this;
110
- return op.byteLengthFn(op.createEncodeStateFn(ctx, options), op, text);
224
+ flushInto(buf) {
225
+ const { state, op } = this;
226
+ const readBefore = state.r;
227
+ const writtenBefore = state.w;
228
+ op.flushIntoFn(state, buf);
229
+ return { read: state.r - readBefore, written: state.w - writtenBefore };
111
230
  }
112
231
  };
113
232
  var Encoding = class {
114
233
  /**
115
234
  * @param {!CharsetContext} ctx
116
235
  * @param {!DecoderOperations} decoderOp
236
+ * @param {?DecoderOperations} decoderOpFast
117
237
  * @param {!EncoderOperations} encoderOp
238
+ * @param {?EncoderOperations} encoderOpFast
118
239
  */
119
- constructor(ctx, decoderOp, encoderOp3) {
120
- this.ctx = ctx;
240
+ constructor(ctx2, decoderOp, decoderOpFast, encoderOp, encoderOpFast) {
241
+ this.ctx = ctx2;
121
242
  this.decoderOp = decoderOp;
122
- this.encoderOp = encoderOp3;
243
+ this.decoderOpFast = decoderOpFast;
244
+ this.encoderOp = encoderOp;
245
+ this.encoderOpFast = encoderOpFast;
246
+ this.nativeDecoderSupported = isNativeDecoderSupported(ctx2.charsetName);
123
247
  }
124
248
  /**
125
249
  * @override
@@ -131,164 +255,241 @@ var Encoding = class {
131
255
  }
132
256
  /**
133
257
  * @override
134
- * @param {!Uint8Array} array
135
- * @param {!ns.DecoderOptions} [options]
258
+ * @param {!Uint8Array} buf
259
+ * @param {!ns.DecodeOptions} [options]
136
260
  * @return {string}
137
261
  */
138
262
  // @ts-expect-error
139
- decode(array, options) {
140
- const decoder = this.newDecoder(options);
141
- return decoder.decode(array) + decoder.decode();
263
+ decode(buf, options) {
264
+ const decoder = this.getDecoder(options);
265
+ const body = decoder.write(buf);
266
+ const tail = decoder.end();
267
+ return tail ? body + tail : body;
142
268
  }
143
269
  /**
144
270
  * @override
145
- * @param {string} text
146
- * @param {!ns.EncoderOptions} [options]
271
+ * @param {string} str
272
+ * @param {!ns.EncodeOptions} [options]
147
273
  * @return {!Uint8Array}
148
274
  */
149
275
  // @ts-expect-error
150
- encode(text, options) {
151
- const encoder = this.newEncoder(options);
152
- return encoder.encode(text);
276
+ encode(str, options) {
277
+ options ??= {};
278
+ const op = this.getEncoderOp(options);
279
+ const state = op.createEncodeStateFn(this.ctx, options);
280
+ const buf = new Uint8Array(op.byteLengthMaxFn(str) + MAX_PREPEND_BYTES);
281
+ op.encodeIntoFn(state, str, buf);
282
+ op.flushIntoFn(state, buf);
283
+ return buf.subarray(0, state.w);
153
284
  }
154
285
  /**
155
286
  * @override
156
- * @param {!ns.DecoderOptions} [options]
157
- * @return {!ns.CharsetDecoder}
287
+ * @param {string} str
288
+ * @return {number}
158
289
  */
159
290
  // @ts-expect-error
160
- newDecoder(options) {
161
- return new CharsetDecoder(this.ctx, this.decoderOp, options);
291
+ byteLength(str) {
292
+ const { ctx: ctx2, encoderOp } = this;
293
+ return encoderOp.byteLengthFn(str, ctx2, encoderOp);
162
294
  }
295
+ // --- Low-level Stream APIs ---
163
296
  /**
164
297
  * @override
165
- * @param {!ns.EncoderOptions} [options]
166
- * @return {!ns.CharsetEncoder}
298
+ * @param {!ns.DecodeOptions} [options]
299
+ * @return {!DecoderStream}
167
300
  */
168
301
  // @ts-expect-error
169
- newEncoder(options) {
170
- return new CharsetEncoder(this.ctx, this.encoderOp, options);
302
+ getDecoder(options) {
303
+ options ??= {};
304
+ const op = this.getDecoderOp(options);
305
+ const state = op.createDecodeStateFn(this.ctx, options);
306
+ return new DecoderStream(state, op);
307
+ }
308
+ /**
309
+ * @override
310
+ * @param {!ns.EncodeOptions} [options]
311
+ * @return {!EncoderStream}
312
+ */
313
+ // @ts-expect-error
314
+ getEncoder(options) {
315
+ options ??= {};
316
+ const op = this.getEncoderOp(options);
317
+ const state = op.createEncodeStateFn(this.ctx, options);
318
+ return new EncoderStream(state, op);
319
+ }
320
+ // Private
321
+ /**
322
+ * @private
323
+ * @param {!ns.DecodeOptions} options
324
+ * @return {!DecoderOperations}
325
+ */
326
+ getDecoderOp(options) {
327
+ if (this.nativeDecoderSupported && options.native) {
328
+ return nativeDecoderOp;
329
+ }
330
+ return this.decoderOpFast && typeof options.defaultCharUnicode !== "function" ? this.decoderOpFast : this.decoderOp;
331
+ }
332
+ /**
333
+ * @private
334
+ * @param {!ns.EncodeOptions} options
335
+ * @return {!EncoderOperations}
336
+ */
337
+ getEncoderOp(options) {
338
+ return this.encoderOpFast && typeof options.defaultCharByte !== "function" ? this.encoderOpFast : this.encoderOp;
339
+ }
340
+ };
341
+ var createEncodingFast = (ctx2, decoderOp, decoderOpFast, encoderOp, encoderOpFast) => new Encoding(
342
+ //
343
+ ctx2,
344
+ decoderOp,
345
+ decoderOpFast,
346
+ encoderOp,
347
+ encoderOpFast
348
+ );
349
+ var createEncoding = (ctx2, decoderOp, encoderOp) => createEncodingFast(
350
+ //
351
+ ctx2,
352
+ decoderOp,
353
+ decoderOp,
354
+ encoderOp,
355
+ encoderOp
356
+ );
357
+ var Singleton = class {
358
+ /**
359
+ * @param {!ns.Encoding} encoding
360
+ */
361
+ constructor(encoding) {
362
+ this.encoding = encoding;
363
+ }
364
+ /**
365
+ * @override
366
+ * @return {!ns.Encoding}
367
+ */
368
+ // @ts-expect-error
369
+ create() {
370
+ return this.encoding;
171
371
  }
172
372
  };
173
- var createEncoding = (ctx, decoderOp, encoderOp3) => new Encoding(ctx, decoderOp, encoderOp3);
174
373
 
175
374
  // src/mapped.mjs
176
375
  var NO_LEFTOVER = -1;
177
- var DEFAULT_NATIVE_DECODE = false;
178
- var isNativeDecoderSupported = (charsetName) => {
179
- try {
180
- new TextDecoder(charsetName);
181
- return true;
182
- } catch {
183
- return false;
184
- }
185
- };
186
- var nativeDecodeMapped = (decodeState, input) => {
187
- const state = (
188
- /** @type {!DecodeStateMapped} */
189
- decodeState
190
- );
191
- const decoder = (
192
- /** @type {!TextDecoder} */
193
- state.decoder
194
- );
195
- return decoder.decode(input, { stream: Boolean(input) });
196
- };
376
+ var getDefaultChar = (defaultChar, defaultNumber) => typeof defaultChar === "string" && defaultChar.length > 0 ? defaultChar.charCodeAt(0) : defaultNumber;
197
377
  var createDecodeStateMapped = (charsetCtx, options) => {
198
- const { charsetName, b2c, nativeDecoderSupported, softwareDecodeMapped } = (
378
+ const ctx2 = (
199
379
  /** @type {!MappedCharsetContext} */
200
380
  charsetCtx
201
381
  );
202
382
  const defaultCharUnicode = options.defaultCharUnicode;
203
- let defaultChar = REPLACEMENT_CHARACTER_CODE;
204
- let handler = null;
205
- let decoder = null;
206
- const useNativeDecode = nativeDecoderSupported && (options?.native ?? DEFAULT_NATIVE_DECODE);
207
- if (useNativeDecode) {
208
- decoder = new TextDecoder(charsetName);
209
- } else if (typeof defaultCharUnicode === "string") {
210
- if (defaultCharUnicode.length) {
211
- defaultChar = defaultCharUnicode.charCodeAt(0);
212
- }
213
- } else if (typeof defaultCharUnicode === "function") {
214
- handler = defaultCharUnicode;
215
- }
383
+ const defaultChar = getDefaultChar(defaultCharUnicode, REPLACEMENT_CHARACTER_CODE);
384
+ const handler = typeof defaultCharUnicode === "function" ? defaultCharUnicode : null;
216
385
  const state = {
217
- b2c,
386
+ b2c: ctx2.b2c,
387
+ leftover: NO_LEFTOVER,
218
388
  defaultChar,
219
- handler,
220
- decodeFunction: useNativeDecode ? nativeDecodeMapped : softwareDecodeMapped,
221
- decoder,
222
- leftover: NO_LEFTOVER
389
+ handler
223
390
  };
224
391
  return state;
225
392
  };
226
- var createC2B = (b2c) => {
227
- const c2b = new Uint16Array(65536).fill(REPLACEMENT_CHARACTER_CODE);
228
- for (let i = 0; i < b2c.length; i++) {
229
- const ch = b2c[i];
230
- if (isMapped(ch)) {
231
- c2b[ch] = i;
393
+ var createCachedForDefaultChar = (arr, defaultChar) => {
394
+ const cached = arr.slice();
395
+ for (let i = 0; i < arr.length; i++) {
396
+ const val = arr[i];
397
+ if (!isMapped(val)) {
398
+ cached[i] = defaultChar;
232
399
  }
233
400
  }
234
- return c2b;
401
+ return cached;
235
402
  };
236
- var createEncodeStateMapped = (charsetCtx, options) => {
237
- const ctx = (
403
+ var createDecodeStateMappedFast = (charsetCtx, options) => {
404
+ const ctx2 = (
238
405
  /** @type {!MappedCharsetContext} */
239
406
  charsetCtx
240
407
  );
241
- const b2c = ctx.b2c;
242
- if (!ctx.c2b) {
243
- ctx.c2b = createC2B(b2c);
408
+ const defaultCharUnicode = options.defaultCharUnicode;
409
+ const defaultChar = getDefaultChar(defaultCharUnicode, REPLACEMENT_CHARACTER_CODE);
410
+ if (!ctx2.b2cCached || ctx2.b2cCachedForDefaultChar !== defaultChar) {
411
+ ctx2.b2cCached = createCachedForDefaultChar(ctx2.b2c, defaultChar);
412
+ ctx2.b2cCachedForDefaultChar = defaultChar;
244
413
  }
245
- const c2b = ctx.c2b;
414
+ const state = {
415
+ b2c: ctx2.b2cCached
416
+ };
417
+ return state;
418
+ };
419
+ var createEncodeStateMapped = (charsetCtx, options) => {
420
+ const ctx2 = (
421
+ /** @type {!MappedCharsetContext} */
422
+ charsetCtx
423
+ );
246
424
  const defaultCharByte = options.defaultCharByte;
247
- let defaultChar = DEFAULT_CHAR_BYTE;
248
- let handler = null;
249
- if (typeof defaultCharByte === "string") {
250
- if (defaultCharByte.length) {
251
- defaultChar = defaultCharByte.charCodeAt(0);
252
- }
253
- } else if (typeof defaultCharByte === "function") {
254
- handler = defaultCharByte;
255
- }
425
+ const defaultChar = getDefaultChar(defaultCharByte, DEFAULT_CHAR_BYTE);
426
+ const handler = typeof defaultCharByte === "function" ? defaultCharByte : null;
256
427
  const state = {
257
- c2b,
428
+ r: 0,
429
+ w: 0,
430
+ c2b: ctx2.c2b,
258
431
  defaultChar,
259
432
  handler
260
433
  };
261
434
  return state;
262
435
  };
263
- var decodeMapped = (decodeState, input) => {
264
- const { decodeFunction } = (
265
- /** @type {!DecodeStateMapped} */
266
- decodeState
436
+ var createEncodeStateMappedFast = (charsetCtx, options) => {
437
+ const ctx2 = (
438
+ /** @type {!MappedCharsetContext} */
439
+ charsetCtx
267
440
  );
268
- return decodeFunction(decodeState, input);
441
+ const defaultCharByte = options.defaultCharByte;
442
+ const defaultChar = getDefaultChar(defaultCharByte, DEFAULT_CHAR_BYTE);
443
+ if (!ctx2.c2bCached || ctx2.c2bCachedForDefaultChar !== defaultChar) {
444
+ ctx2.c2bCached = createCachedForDefaultChar(ctx2.c2b, defaultChar);
445
+ ctx2.c2bCachedForDefaultChar = defaultChar;
446
+ }
447
+ const state = {
448
+ r: 0,
449
+ w: 0,
450
+ c2b: ctx2.c2bCached
451
+ };
452
+ return state;
269
453
  };
270
- var decoderOpMapped = {
271
- createDecodeStateFn: createDecodeStateMapped,
272
- decodeFn: decodeMapped
454
+ var createC2B = (b2c) => {
455
+ const c2b = new Uint16Array(65536).fill(REPLACEMENT_CHARACTER_CODE);
456
+ for (let i = 0; i < b2c.length; i++) {
457
+ const ch = b2c[i];
458
+ if (isMapped(ch)) {
459
+ c2b[ch] = i;
460
+ }
461
+ }
462
+ return c2b;
273
463
  };
274
- var createCharsetMapped = (charsetName, b2c, softwareDecode, encoderOp3) => {
275
- const nativeDecoderSupported = isNativeDecoderSupported(charsetName);
276
- const ctx = { charsetName, nativeDecoderSupported, b2c, c2b: null, softwareDecodeMapped: softwareDecode };
277
- return createEncoding(ctx, decoderOpMapped, encoderOp3);
464
+ var createCharsetMapped = (charsetName, b2c, decoderOp, decoderOpFast, encoderOp, encoderOpFast) => {
465
+ const ctx2 = {
466
+ //
467
+ charsetName,
468
+ b2c,
469
+ b2cCached: null,
470
+ b2cCachedForDefaultChar: 0,
471
+ c2b: createC2B(b2c),
472
+ c2bCached: null,
473
+ c2bCachedForDefaultChar: 0
474
+ };
475
+ return createEncodingFast(
476
+ //
477
+ ctx2,
478
+ decoderOp,
479
+ decoderOpFast,
480
+ encoderOp,
481
+ encoderOpFast
482
+ );
278
483
  };
279
484
 
280
485
  // src/dbcs.mjs
281
- var decodeDBCS = (decodeState, array) => {
486
+ var decodeDBCS = (decodeState, buf) => {
282
487
  const state = (
283
488
  /** @type {!DecodeStateMapped} */
284
489
  decodeState
285
490
  );
286
491
  const { b2c, defaultChar, handler, leftover } = state;
287
- if (!array) {
288
- state.leftover = NO_LEFTOVER;
289
- return leftover === NO_LEFTOVER ? "" : String.fromCharCode(handler?.(leftover, -1) ?? defaultChar);
290
- }
291
- const len = array.length;
492
+ const len = buf.length;
292
493
  if (len === 0) {
293
494
  return "";
294
495
  }
@@ -297,7 +498,7 @@ var decodeDBCS = (decodeState, array) => {
297
498
  let j = 0;
298
499
  let lead;
299
500
  if (leftover === NO_LEFTOVER) {
300
- lead = array[0];
501
+ lead = buf[0];
301
502
  } else {
302
503
  state.leftover = NO_LEFTOVER;
303
504
  lead = leftover;
@@ -308,7 +509,7 @@ var decodeDBCS = (decodeState, array) => {
308
509
  if (isMapped(ch)) {
309
510
  u16[j++] = ch;
310
511
  } else if (i + 1 < len) {
311
- const trail = array[i + 1];
512
+ const trail = buf[i + 1];
312
513
  const code = lead << 8 | trail;
313
514
  ch = b2c[code];
314
515
  if (isMapped(ch)) {
@@ -323,53 +524,72 @@ var decodeDBCS = (decodeState, array) => {
323
524
  }
324
525
  i++;
325
526
  if (i < len) {
326
- lead = array[i];
527
+ lead = buf[i];
327
528
  } else {
328
529
  break;
329
530
  }
330
531
  }
331
532
  return getString(u16.subarray(0, j));
332
533
  };
333
- var encodeIntoDBCS = (encodeState, src, dst) => {
334
- const { c2b, defaultChar, handler } = (
534
+ var decodeEndDBCS = (decodeState) => {
535
+ const state = (
536
+ /** @type {!DecodeStateMapped} */
537
+ decodeState
538
+ );
539
+ const leftover = state.leftover;
540
+ state.leftover = NO_LEFTOVER;
541
+ return leftover === NO_LEFTOVER ? "" : String.fromCharCode(state.handler?.(leftover, -1) ?? state.defaultChar);
542
+ };
543
+ var decoderOpDBCS = createDecoderOperations(
544
+ //
545
+ createDecodeStateMapped,
546
+ decodeDBCS,
547
+ decodeEndDBCS
548
+ );
549
+ var encodeIntoDBCS = (encodeState, str, buf) => {
550
+ const state = (
335
551
  /** @type {!EncodeStateMapped} */
336
552
  encodeState
337
553
  );
554
+ const { c2b, defaultChar, handler } = state;
338
555
  let i = 0;
339
556
  let j = 0;
340
- const srcLen = src.length;
341
- const dstLen = dst.length;
557
+ const srcLen = str.length;
558
+ const dstLen = buf.length;
342
559
  const dstLen1 = dstLen - 1;
343
560
  for (; i < srcLen; i++) {
344
- const ch = src.charCodeAt(i);
561
+ const ch = str.charCodeAt(i);
345
562
  const val = c2b[ch];
346
563
  const value = isMapped(val) ? val : handler?.(ch, i) ?? defaultChar;
347
564
  if (value > 255) {
348
565
  if (j >= dstLen1) {
349
566
  break;
350
567
  }
351
- dst[j] = value >> 8;
352
- dst[j + 1] = value;
568
+ buf[j] = value >> 8;
569
+ buf[j + 1] = value;
353
570
  j += 2;
354
571
  } else {
355
572
  if (j >= dstLen) {
356
573
  break;
357
574
  }
358
- dst[j] = value;
575
+ buf[j] = value;
359
576
  j += 1;
360
577
  }
361
578
  }
362
- return { read: i, written: j };
579
+ state.r += i;
580
+ state.w += j;
363
581
  };
364
- var byteLengthMaxDBCS = (encodeState, op, text) => text.length * 2;
365
- var encoderOp = {
366
- createEncodeStateFn: createEncodeStateMapped,
367
- encodeIntoFn: encodeIntoDBCS,
368
- byteLengthMaxFn: byteLengthMaxDBCS,
369
- byteLengthFn: byteLengthDefault
370
- };
371
- var createB2C = () => new Uint16Array(65536).fill(REPLACEMENT_CHARACTER_CODE);
372
- var applyMappingTable = (b2c, parent, mappingTable) => {
582
+ var encoderOpDBCS = createEncoderOperations(
583
+ //
584
+ createEncodeStateMapped,
585
+ encodeIntoDBCS,
586
+ flushIntoDummy,
587
+ byteLengthMax2X,
588
+ byteLengthDefault
589
+ );
590
+ var createTableDBCS = (ctx2, options) => {
591
+ const { parent, mappingTable } = ctx2;
592
+ const b2c = new Uint16Array(65536).fill(REPLACEMENT_CHARACTER_CODE);
373
593
  for (let rangeIdx = 0; rangeIdx < mappingTable.length; rangeIdx++) {
374
594
  const range = mappingTable[rangeIdx];
375
595
  const start = Number.parseInt(
@@ -396,7 +616,7 @@ var applyMappingTable = (b2c, parent, mappingTable) => {
396
616
  }
397
617
  }
398
618
  if (parent) {
399
- const parentB2C = parent.createB2C();
619
+ const parentB2C = parent.createTable();
400
620
  for (let i = 0; i < parentB2C.length; i++) {
401
621
  const parentCH = parentB2C[i];
402
622
  if (isMapped(parentCH)) {
@@ -407,6 +627,7 @@ var applyMappingTable = (b2c, parent, mappingTable) => {
407
627
  }
408
628
  }
409
629
  }
630
+ return b2c;
410
631
  };
411
632
  var DBCS = class {
412
633
  /**
@@ -416,32 +637,39 @@ var DBCS = class {
416
637
  */
417
638
  constructor(charsetName, parent, mappingTable) {
418
639
  this.charsetName = charsetName;
419
- this.parent = parent;
420
- this.mappingTable = mappingTable;
640
+ this.ctx = { parent, mappingTable };
421
641
  }
422
642
  /**
423
643
  * @override
644
+ * @param {!ns.Options} [options]
424
645
  * @return {!ns.Encoding}
425
646
  */
426
647
  // @ts-expect-error
427
- create() {
428
- return createCharsetMapped(this.charsetName, this.createB2C(), decodeDBCS, encoderOp);
648
+ create(options) {
649
+ return createCharsetMapped(
650
+ //
651
+ this.charsetName,
652
+ this.createTable(options),
653
+ decoderOpDBCS,
654
+ decoderOpDBCS,
655
+ encoderOpDBCS,
656
+ encoderOpDBCS
657
+ );
429
658
  }
430
659
  /**
431
660
  * @override
661
+ * @param {!ns.Options} [options]
432
662
  * @return {!Uint16Array}
433
663
  */
434
664
  // @ts-expect-error
435
- createB2C() {
436
- const b2c = createB2C();
437
- applyMappingTable(b2c, this.parent, this.mappingTable);
438
- return b2c;
665
+ createTable(options) {
666
+ return createTableDBCS(this.ctx, options);
439
667
  }
440
668
  };
441
669
 
442
- // src/iconv-tiny.mjs
670
+ // src/iconv.mjs
443
671
  var canonicalize = (encoding) => encoding.toLowerCase().replace(/[^a-z0-9]/gu, "").replace(/(?<!\d)0+/gu, "");
444
- var IconvTiny = class {
672
+ var Iconv = class {
445
673
  /**
446
674
  * @param {!Object<string, !ns.EncodingFactory>} [encodings]
447
675
  * @param {string} [aliases]
@@ -462,25 +690,27 @@ var IconvTiny = class {
462
690
  }
463
691
  /**
464
692
  * @override
465
- * @param {!Uint8Array} array
693
+ * @param {!Uint8Array} buf
466
694
  * @param {string} encoding
467
695
  * @param {!ns.OptionsAndDecoderOptions} [options]
468
696
  * @return {string}
469
697
  */
470
698
  // @ts-expect-error
471
- decode(array, encoding, options) {
472
- return this.getEncoding(encoding, options).decode(array, options);
699
+ decode(buf, encoding, options) {
700
+ const enc = this.getEncoding(encoding, options);
701
+ const str = enc.decode(buf, options);
702
+ return str;
473
703
  }
474
704
  /**
475
705
  * @override
476
- * @param {string} content
706
+ * @param {string} str
477
707
  * @param {string} encoding
478
708
  * @param {!ns.OptionsAndEncoderOptions} [options]
479
709
  * @return {!Uint8Array}
480
710
  */
481
711
  // @ts-expect-error
482
- encode(content, encoding, options) {
483
- return this.getEncoding(encoding, options).encode(content, options);
712
+ encode(str, encoding, options) {
713
+ return this.getEncoding(encoding, options).encode(str, options);
484
714
  }
485
715
  /**
486
716
  * @override
@@ -504,84 +734,148 @@ var IconvTiny = class {
504
734
  return encoding;
505
735
  }
506
736
  };
507
- var createIconv = (encodings2, aliases2) => new IconvTiny(encodings2, aliases2);
737
+ var createIconv = (encodings2, aliases2) => new Iconv(encodings2, aliases2);
508
738
 
509
739
  // src/sbcs.mjs
510
- var softwareDecodeSBCS = (decodeState, input) => {
511
- if (!input) {
512
- return "";
513
- }
514
- const { b2c, defaultChar, handler } = (
740
+ var decodeSBCS = (decodeState, buf) => {
741
+ const state = (
515
742
  /** @type {!DecodeStateMapped} */
516
743
  decodeState
517
744
  );
518
- const len = input.length;
519
- const u16 = new Uint16Array(len);
520
- for (let i = 0; i < len; i++) {
521
- const byte = input[i];
522
- const ch = b2c[byte];
523
- u16[i] = isMapped(ch) ? ch : handler?.(byte, i) ?? defaultChar;
745
+ const b2c = state.b2c;
746
+ const defaultChar = state.defaultChar;
747
+ const handler = (
748
+ /** @type {!ns.DefaultFunction} */
749
+ state.handler
750
+ );
751
+ const u16 = new Uint16Array(buf.length);
752
+ for (let i = 0; i < buf.length; i++) {
753
+ const bt = buf[i];
754
+ const ch = b2c[bt];
755
+ u16[i] = isMapped(ch) ? ch : handler(bt, i) ?? defaultChar;
756
+ }
757
+ return Buffer ? Buffer.from(u16.buffer, u16.byteOffset, u16.byteLength).toString("ucs2") : getString(u16);
758
+ };
759
+ var decoderOpSBCS = createDecoderOperations(
760
+ //
761
+ createDecodeStateMapped,
762
+ decodeSBCS,
763
+ decodeEndDummy
764
+ );
765
+ var decodeSBCSFast = (decodeState, buf) => {
766
+ const state = (
767
+ /** @type {!DecodeStateMappedFast} */
768
+ decodeState
769
+ );
770
+ const b2c = state.b2c;
771
+ const u16 = new Uint16Array(buf.length);
772
+ for (let i = 0; i < buf.length; i++) {
773
+ const bt = buf[i];
774
+ const ch = b2c[bt];
775
+ u16[i] = ch;
524
776
  }
525
- return getString(u16);
777
+ return Buffer ? Buffer.from(u16.buffer, u16.byteOffset, u16.byteLength).toString("ucs2") : getString(u16);
526
778
  };
527
- var encodeIntoSBCS = (encodeState, src, dst) => {
528
- const { c2b, defaultChar, handler } = (
779
+ var decoderOpSBCSFast = createDecoderOperations(
780
+ //
781
+ createDecodeStateMappedFast,
782
+ decodeSBCSFast,
783
+ decodeEndDummy
784
+ );
785
+ var encodeIntoSBCS = (encodeState, str, buf) => {
786
+ const state = (
529
787
  /** @type {!EncodeStateMapped} */
530
788
  encodeState
531
789
  );
532
- const len = Math.min(src.length, dst.length);
790
+ const c2b = state.c2b;
791
+ const defaultChar = state.defaultChar;
792
+ const handler = (
793
+ /** @type {!ns.DefaultFunction} */
794
+ state.handler
795
+ );
796
+ const len = Math.min(str.length, buf.length);
533
797
  for (let i = 0; i < len; i++) {
534
- const ch = src.charCodeAt(i);
535
- const byte = c2b[ch];
536
- dst[i] = isMapped(byte) ? byte : handler?.(ch, i) ?? defaultChar;
798
+ const ch = str.charCodeAt(i);
799
+ const bt = c2b[ch];
800
+ buf[i] = isMapped(bt) ? bt : handler(ch, i) ?? defaultChar;
537
801
  }
538
- return { read: len, written: len };
539
- };
540
- var byteLengthSBCS = (encodeState, op, text) => text.length;
541
- var encoderOp2 = {
542
- createEncodeStateFn: createEncodeStateMapped,
543
- encodeIntoFn: encodeIntoSBCS,
544
- byteLengthMaxFn: byteLengthSBCS,
545
- byteLengthFn: byteLengthSBCS
802
+ state.r += len;
803
+ state.w += len;
546
804
  };
547
- var createB2C2 = () => new Uint16Array(256).fill(REPLACEMENT_CHARACTER_CODE);
548
- var applySymbols = (b2c, symbols) => {
549
- let i = 0;
550
- while (i < 256 - symbols.length) {
551
- b2c[i] = i++;
552
- }
553
- let j = 0;
554
- while (i < 256) {
555
- b2c[i++] = symbols.charCodeAt(j++);
805
+ var encoderOpSBCS = createEncoderOperations(
806
+ //
807
+ createEncodeStateMapped,
808
+ encodeIntoSBCS,
809
+ flushIntoDummy,
810
+ byteLengthMax1X,
811
+ byteLengthMax1X
812
+ );
813
+ var encodeIntoSBCSFast = (encodeState, str, buf) => {
814
+ const state = (
815
+ /** @type {!EncodeStateMappedFast} */
816
+ encodeState
817
+ );
818
+ const { c2b } = state;
819
+ const len = Math.min(str.length, buf.length);
820
+ for (let i = 0; i < len; i++) {
821
+ const ch = str.charCodeAt(i);
822
+ const bt = c2b[ch];
823
+ buf[i] = bt;
556
824
  }
825
+ state.r += len;
826
+ state.w += len;
557
827
  };
558
- var applyDiff = (b2c, diff) => {
559
- let i = 0;
560
- while (i < diff.length) {
561
- b2c[diff.charCodeAt(i)] = diff.charCodeAt(i + 1);
562
- i += 2;
828
+ var encoderOpSBCSFast = createEncoderOperations(
829
+ //
830
+ createEncodeStateMappedFast,
831
+ encodeIntoSBCSFast,
832
+ flushIntoDummy,
833
+ byteLengthMax1X,
834
+ byteLengthMax1X
835
+ );
836
+ var createTableSBCS = (ctx2, options) => {
837
+ const { symbols, diff } = ctx2;
838
+ const b2c = new Uint16Array(256).fill(REPLACEMENT_CHARACTER_CODE);
839
+ {
840
+ let i = 0;
841
+ while (i < 256 - symbols.length) {
842
+ b2c[i] = i++;
843
+ }
844
+ let j = 0;
845
+ while (i < 256) {
846
+ b2c[i++] = symbols.charCodeAt(j++);
847
+ }
563
848
  }
564
- };
565
- var replaceSpecials = (b2c) => {
566
- let i = 128;
567
- while (i < 256) {
568
- const ch = b2c[i];
569
- if (ch === " ".charCodeAt(0)) {
570
- b2c[i] = i;
849
+ {
850
+ let i = 0;
851
+ while (i < diff.length) {
852
+ b2c[diff.charCodeAt(i)] = diff.charCodeAt(i + 1);
853
+ i += 2;
571
854
  }
572
- if (ch === "?".charCodeAt(0)) {
573
- b2c[i] = REPLACEMENT_CHARACTER_CODE;
855
+ }
856
+ {
857
+ let i = 128;
858
+ while (i < 256) {
859
+ const ch = b2c[i];
860
+ if (ch === " ".charCodeAt(0)) {
861
+ b2c[i] = i;
862
+ }
863
+ if (ch === "?".charCodeAt(0)) {
864
+ b2c[i] = REPLACEMENT_CHARACTER_CODE;
865
+ }
866
+ i++;
574
867
  }
575
- i++;
576
868
  }
577
- };
578
- var applyOverrides = (b2c, overrides) => {
579
- let k = 0;
580
- while (k < overrides.length - 1) {
581
- const code = overrides[k++];
582
- const ch = overrides[k++];
583
- b2c[Number(code)] = typeof ch === "number" ? ch : ch.charCodeAt(0);
869
+ {
870
+ const overrides = options?.overrides ?? [];
871
+ let k = 0;
872
+ while (k < overrides.length - 1) {
873
+ const code = overrides[k++];
874
+ const ch = overrides[k++];
875
+ b2c[Number(code)] = typeof ch === "number" ? ch : ch.charCodeAt(0);
876
+ }
584
877
  }
878
+ return b2c;
585
879
  };
586
880
  var SBCS = class {
587
881
  /**
@@ -591,8 +885,7 @@ var SBCS = class {
591
885
  */
592
886
  constructor(charsetName, symbols, diff) {
593
887
  this.charsetName = charsetName;
594
- this.symbols = symbols;
595
- this.diff = diff ?? "";
888
+ this.ctx = { symbols, diff: diff ?? "" };
596
889
  }
597
890
  /**
598
891
  * @override
@@ -601,7 +894,15 @@ var SBCS = class {
601
894
  */
602
895
  // @ts-expect-error
603
896
  create(options) {
604
- return createCharsetMapped(this.charsetName, this.createB2C(options), softwareDecodeSBCS, encoderOp2);
897
+ return createCharsetMapped(
898
+ //
899
+ this.charsetName,
900
+ this.createTable(options),
901
+ decoderOpSBCS,
902
+ decoderOpSBCSFast,
903
+ encoderOpSBCS,
904
+ encoderOpSBCSFast
905
+ );
605
906
  }
606
907
  /**
607
908
  * @override
@@ -609,323 +910,299 @@ var SBCS = class {
609
910
  * @return {!Uint16Array}
610
911
  */
611
912
  // @ts-expect-error
612
- createB2C(options) {
613
- const { symbols, diff } = this;
614
- const b2c = createB2C2();
615
- applySymbols(b2c, symbols);
616
- applyDiff(b2c, diff);
617
- replaceSpecials(b2c);
618
- applyOverrides(b2c, options?.overrides ?? []);
619
- return b2c;
913
+ createTable(options) {
914
+ return createTableSBCS(this.ctx, options);
620
915
  }
621
916
  };
622
917
 
623
918
  // src/unicode.mjs
624
- var MAX_BPM = 65535;
625
- var MAX_CODE_POINT = 1114111;
626
- var BOM_CHAR = "\uFEFF";
627
- var STRIP_BOM_DEFAULT = true;
628
- var ADD_BOM_DEFAULT = false;
629
- var HIGH_SURROGATE_FROM = 55296;
630
- var LOW_SURROGATE_FROM = 56320;
631
- var put16LE = (src, i, dst, j) => {
632
- const cp = src.charCodeAt(i);
633
- dst[j] = cp;
634
- dst[j + 1] = cp >> 8;
635
- return 0;
636
- };
637
- var put16BE = (src, i, dst, j) => {
638
- const cp = src.charCodeAt(i);
639
- dst[j] = cp >> 8;
640
- dst[j + 1] = cp;
641
- return 0;
642
- };
643
- var put32LE = (src, i, dst, j) => {
644
- const cp = (
645
- /** @type {number} */
646
- src.codePointAt(i)
647
- );
648
- dst[j] = cp;
649
- dst[j + 1] = cp >> 8;
650
- dst[j + 2] = cp >> 16;
651
- dst[j + 3] = cp >> 24;
652
- return cp > 65535 ? 1 : 0;
653
- };
654
- var put32BE = (src, i, dst, j) => {
655
- const cp = (
656
- /** @type {number} */
657
- src.codePointAt(i)
658
- );
659
- dst[j] = cp >> 24;
660
- dst[j + 1] = cp >> 16;
661
- dst[j + 2] = cp >> 8;
662
- dst[j + 3] = cp;
663
- return cp > 65535 ? 1 : 0;
664
- };
665
- var get32LE = (src, i) => (src[i] | src[i + 1] << 8 | src[i + 2] << 16 | src[i + 3] << 24) >>> 0;
666
- var get32BE = (src, i) => (src[i] << 24 | src[i + 1] << 16 | src[i + 2] << 8 | src[i + 3]) >>> 0;
667
- var appendCodePoint = (dst, j, cp) => {
668
- if (cp <= MAX_BPM) {
669
- dst[j] = cp;
670
- dst[j + 1] = cp >> 8;
671
- return 2;
672
- }
673
- if (cp > MAX_CODE_POINT) {
674
- dst[j] = REPLACEMENT_CHARACTER_CODE;
675
- dst[j + 1] = REPLACEMENT_CHARACTER_CODE >> 8;
676
- return 2;
677
- }
678
- cp -= 65536;
679
- const high = HIGH_SURROGATE_FROM | cp >> 10;
680
- const low = LOW_SURROGATE_FROM | cp & 1023;
681
- dst[j] = high;
682
- dst[j + 1] = high >> 8;
683
- dst[j + 2] = low;
684
- dst[j + 3] = low >> 8;
685
- return 4;
686
- };
687
- var createDecodeStateUTF8 = (charsetCtx, options) => {
688
- const noBOM = !(options.stripBOM ?? STRIP_BOM_DEFAULT);
689
- const state = {
690
- decoder: new TextDecoder("UTF-8", { ignoreBOM: noBOM })
919
+ var createUnicodeEncoding = (name, littleEndian, decoderOp, encoderOp) => {
920
+ const charsetName = "UTF-" + name + (littleEndian ? "LE" : "BE");
921
+ const ctx2 = {
922
+ charsetName,
923
+ littleEndian
691
924
  };
692
- return state;
693
- };
694
- var decodeUTF8 = (decodeState, input) => {
695
- const state = (
696
- /** @type {!DecodeStateUTF8} */
697
- decodeState
925
+ return createEncoding(
926
+ //
927
+ ctx2,
928
+ decoderOp,
929
+ encoderOp
698
930
  );
699
- return state.decoder.decode(input, { stream: Boolean(input) });
700
- };
701
- var decoderOpUTF8 = {
702
- createDecodeStateFn: createDecodeStateUTF8,
703
- decodeFn: decodeUTF8
704
931
  };
705
- var createEncodeStateUTF8 = (charsetCtx, options) => {
706
- const doBOM = options.addBOM ?? ADD_BOM_DEFAULT;
932
+
933
+ // src/utf16.mjs
934
+ var decoderOpUTF16 = nativeDecoderOp;
935
+ var createEncodeStateUTF16 = (charsetCtx, options) => {
936
+ const { littleEndian } = (
937
+ /** @type {!CharsetContextUnicode} */
938
+ charsetCtx
939
+ );
940
+ const appendBOM = options.addBOM ?? ADD_BOM_DEFAULT;
707
941
  const state = {
708
- doBOM,
709
- appendBOM: doBOM,
710
- encoder: new TextEncoder(),
711
- highSurrogate: ""
942
+ r: 0,
943
+ w: 0,
944
+ appendBOM,
945
+ put: littleEndian ? put16LE : put16BE
712
946
  };
713
947
  return state;
714
948
  };
715
- var encodeIntoUTF8 = (encodeState, src, dst) => {
949
+ var encodeIntoUTF16 = (encodeState, str, buf) => {
716
950
  const state = (
717
- /** @type {!EncodeStateUTF8} */
951
+ /** @type {!EncodeStateUTF16} */
718
952
  encodeState
719
953
  );
720
- const { appendBOM } = state;
954
+ const { appendBOM, put } = state;
721
955
  let j = 0;
722
956
  if (appendBOM) {
723
- if (dst.length < 3) {
724
- return { read: 0, written: 0 };
957
+ if (buf.length < 2) {
958
+ return;
725
959
  }
726
- dst[0] = 239;
727
- dst[1] = 187;
728
- dst[2] = 191;
729
- j += 3;
960
+ put(BOM_CHAR_CODE, buf, 0);
961
+ j += 2;
730
962
  state.appendBOM = false;
731
963
  }
732
- if (state.highSurrogate) {
733
- src = state.highSurrogate + src;
734
- state.highSurrogate = "";
735
- }
736
- const len1 = src.length - 1;
737
- if (src.length > 0) {
738
- const code = src.charCodeAt(len1);
739
- if (code >= HIGH_SURROGATE_FROM && code < LOW_SURROGATE_FROM) {
740
- state.highSurrogate = src.charAt(len1);
741
- src = src.slice(0, len1);
964
+ let i = 0;
965
+ while (i < str.length) {
966
+ if (buf.length - j < 2) {
967
+ break;
742
968
  }
969
+ const ch = str.charCodeAt(i);
970
+ put(ch, buf, j);
971
+ j += 2;
972
+ i++;
743
973
  }
744
- const { read, written } = state.encoder.encodeInto(src, dst.subarray(j));
745
- return { read: read + (state.highSurrogate ? 1 : 0), written: written + j };
746
- };
747
- var byteLengthMaxUTF8 = (encodeState, op, text) => {
748
- const state = (
749
- /** @type {!EncodeStateUTF8} */
750
- encodeState
751
- );
752
- return (state.doBOM ? 4 : 0) + text.length * 4;
753
- };
754
- var encoderOpUTF8 = {
755
- createEncodeStateFn: createEncodeStateUTF8,
756
- encodeIntoFn: encodeIntoUTF8,
757
- byteLengthMaxFn: byteLengthMaxUTF8,
758
- byteLengthFn: byteLengthDefault
759
- };
760
- var createDecodeStateUTF16 = (charsetCtx, options) => {
761
- const ctx = (
762
- /** @type {!UnicodeCharsetContext} */
763
- charsetCtx
764
- );
765
- const noBOM = !(options.stripBOM ?? STRIP_BOM_DEFAULT);
766
- const { bo } = ctx;
767
- const state = {
768
- decoder: new TextDecoder("UTF-16" + ["LE", "BE"][bo], { ignoreBOM: noBOM })
769
- };
770
- return state;
771
- };
772
- var decodeUTF16 = (decodeState, input) => {
773
- const state = (
774
- /** @type {!DecodeStateUTF16} */
775
- decodeState
776
- );
777
- return state.decoder.decode(input, { stream: Boolean(input) });
778
- };
779
- var decoderOpUTF16 = {
780
- createDecodeStateFn: createDecodeStateUTF16,
781
- decodeFn: decodeUTF16
974
+ state.r += i;
975
+ state.w += j;
782
976
  };
977
+ var encoderOpUTF16 = createEncoderOperations(
978
+ //
979
+ createEncodeStateUTF16,
980
+ encodeIntoUTF16,
981
+ flushIntoDummy,
982
+ byteLengthMax2X,
983
+ byteLengthMax2X
984
+ );
985
+ var UTF_16LE = createUnicodeEncoding(16, true, decoderOpUTF16, encoderOpUTF16);
986
+ var UTF_16BE = createUnicodeEncoding(16, false, decoderOpUTF16, encoderOpUTF16);
987
+
988
+ // src/utf32.mjs
783
989
  var createDecodeStateUTF32 = (charsetCtx, options) => {
784
- const ctx = (
785
- /** @type {!UnicodeCharsetContext} */
990
+ const { littleEndian } = (
991
+ /** @type {!CharsetContextUnicode} */
786
992
  charsetCtx
787
993
  );
788
994
  const state = {
789
995
  leftover: new Uint8Array(4),
790
996
  leftoverSize: 0,
791
- get32: ctx.bo ? get32BE : get32LE,
792
- noBOM: !(options.stripBOM ?? STRIP_BOM_DEFAULT)
997
+ get32: littleEndian ? get32LE : get32BE,
998
+ removeBOM: options.stripBOM ?? STRIP_BOM_DEFAULT
793
999
  };
794
1000
  return state;
795
1001
  };
796
- var decodeUTF32 = (decodeState, input) => {
1002
+ var decodeUTF32 = (decodeState, buf) => {
797
1003
  const state = (
798
1004
  /** @type {!DecodeStateUTF32} */
799
1005
  decodeState
800
1006
  );
801
- const { leftover, get32, noBOM } = state;
802
- if (!input) {
803
- if (state.leftoverSize) {
804
- state.leftoverSize = 0;
805
- return String.fromCharCode(REPLACEMENT_CHARACTER_CODE);
806
- }
807
- return "";
808
- }
809
- const dst = new Uint8Array(input.length + 4);
1007
+ const { leftover, get32 } = state;
1008
+ const u16 = new Uint16Array((buf.length >> 1) + 2);
810
1009
  let i = 0;
811
1010
  let j = 0;
812
1011
  if (state.leftoverSize) {
813
- while (state.leftoverSize < 4 && i < input.length) {
814
- leftover[state.leftoverSize++] = input[i++];
1012
+ while (state.leftoverSize < 4 && i < buf.length) {
1013
+ leftover[state.leftoverSize++] = buf[i++];
815
1014
  }
816
1015
  if (state.leftoverSize < 4) {
817
1016
  return "";
818
1017
  }
819
- j += appendCodePoint(dst, j, get32(leftover, 0));
1018
+ j += appendCodePoint(get32(leftover, 0), u16, j);
820
1019
  }
821
- const max = input.length - 3;
822
- for (; i < max; i += 4) {
823
- j += appendCodePoint(dst, j, get32(input, i));
1020
+ for (; i < buf.length - 3; i += 4) {
1021
+ j += appendCodePoint(get32(buf, i), u16, j);
824
1022
  }
825
- state.leftoverSize = input.length - i;
1023
+ state.leftoverSize = buf.length - i;
826
1024
  if (state.leftoverSize) {
827
- leftover.set(input.subarray(i));
1025
+ leftover.set(buf.subarray(i));
1026
+ }
1027
+ let str = getString(u16.subarray(0, j));
1028
+ if (state.removeBOM && str.charCodeAt(0) === BOM_CHAR_CODE) {
1029
+ str = str.slice(1);
1030
+ state.removeBOM = false;
828
1031
  }
829
- return new TextDecoder("UTF-16", { ignoreBOM: noBOM }).decode(dst.subarray(0, j));
1032
+ return str;
830
1033
  };
831
- var decoderOpUTF32 = {
832
- createDecodeStateFn: createDecodeStateUTF32,
833
- decodeFn: decodeUTF32
1034
+ var decodeEndUTF32 = (decodeState) => {
1035
+ const state = (
1036
+ /** @type {!DecodeStateUTF32} */
1037
+ decodeState
1038
+ );
1039
+ if (state.leftoverSize) {
1040
+ state.leftoverSize = 0;
1041
+ return String.fromCharCode(REPLACEMENT_CHARACTER_CODE);
1042
+ }
1043
+ return "";
834
1044
  };
835
- var createEncodeStateUTF = (charsetCtx, options) => {
836
- const { i, bo } = (
837
- /** @type {!UnicodeCharsetContext} */
1045
+ var decoderOpUTF32 = createDecoderOperations(
1046
+ //
1047
+ createDecodeStateUTF32,
1048
+ decodeUTF32,
1049
+ decodeEndUTF32
1050
+ );
1051
+ var createEncodeStateUTF32 = (charsetCtx, options) => {
1052
+ const { littleEndian } = (
1053
+ /** @type {!CharsetContextUnicode} */
838
1054
  charsetCtx
839
1055
  );
840
- const doBOM = options.addBOM ?? ADD_BOM_DEFAULT;
841
1056
  const state = {
842
- doBOM,
843
- appendBOM: doBOM,
844
- sz: 1 << i + 1,
845
- put: i ? bo ? put32BE : put32LE : bo ? put16BE : put16LE
1057
+ r: 0,
1058
+ w: 0,
1059
+ appendBOM: options.addBOM ?? ADD_BOM_DEFAULT,
1060
+ put: littleEndian ? put32LE : put32BE,
1061
+ highSurrogate: 0
846
1062
  };
847
1063
  return state;
848
1064
  };
849
- var encodeIntoUTF = (encodeState, src, dst) => {
1065
+ var encodeIntoUTF32 = (encodeState, str, buf) => {
850
1066
  const state = (
851
- /** @type {!EncodeStateUTF} */
1067
+ /** @type {!EncodeStateUTF32} */
852
1068
  encodeState
853
1069
  );
854
- const { appendBOM, sz, put } = state;
1070
+ const { appendBOM, put } = state;
855
1071
  let j = 0;
856
1072
  if (appendBOM) {
857
- if (dst.length < sz) {
858
- return { read: 0, written: 0 };
1073
+ if (buf.length < 4) {
1074
+ return;
859
1075
  }
860
- put(BOM_CHAR, 0, dst, j);
861
- j += sz;
1076
+ put(BOM_CHAR_CODE, buf, 0);
1077
+ j += 4;
862
1078
  state.appendBOM = false;
863
1079
  }
864
- const max = Math.min(src.length, dst.length - j & ~(sz - 1));
865
- for (let i = 0; i < max; i++, j += sz) {
866
- i += put(src, i, dst, j);
1080
+ let i = 0;
1081
+ let k = 0;
1082
+ if (state.highSurrogate) {
1083
+ str = String.fromCharCode(state.highSurrogate) + str;
1084
+ state.highSurrogate = 0;
1085
+ k = 1;
1086
+ }
1087
+ while (i < str.length) {
1088
+ const ch = (
1089
+ /** @type {number} */
1090
+ str.codePointAt(i)
1091
+ );
1092
+ if (i === str.length - 1 && ch > HIGH_SURROGATE_FROM) {
1093
+ state.highSurrogate = ch;
1094
+ break;
1095
+ }
1096
+ if (buf.length - j < 4) {
1097
+ break;
1098
+ }
1099
+ put(ch, buf, j);
1100
+ i += ch > 65535 ? 2 : 1;
1101
+ j += 4;
867
1102
  }
868
- return { read: max, written: j };
1103
+ state.r += i - k;
1104
+ state.w += j;
869
1105
  };
870
- var byteLengthMaxUTF = (encodeState, op, text) => {
1106
+ var flushIntoUTF32 = (encodeState, buf) => {
871
1107
  const state = (
872
- /** @type {!EncodeStateUTF} */
1108
+ /** @type {!EncodeStateUTF32} */
873
1109
  encodeState
874
1110
  );
875
- return (state.doBOM ? state.sz : 0) + text.length * state.sz;
1111
+ const { put, highSurrogate } = state;
1112
+ if (!highSurrogate) {
1113
+ return;
1114
+ }
1115
+ if (buf.length < 4) {
1116
+ return;
1117
+ }
1118
+ put(highSurrogate, buf, 0);
1119
+ state.highSurrogate = 0;
1120
+ state.r += 0;
1121
+ state.w += 4;
876
1122
  };
877
- var byteLengthUTF = (encodeState, op, text) => {
1123
+ var encoderOpUTF32 = createEncoderOperations(
1124
+ //
1125
+ createEncodeStateUTF32,
1126
+ encodeIntoUTF32,
1127
+ flushIntoUTF32,
1128
+ byteLengthMax4X,
1129
+ byteLengthDefault
1130
+ );
1131
+ var UTF_32LE = createUnicodeEncoding(32, true, decoderOpUTF32, encoderOpUTF32);
1132
+ var UTF_32BE = createUnicodeEncoding(32, false, decoderOpUTF32, encoderOpUTF32);
1133
+
1134
+ // src/utf8.mjs
1135
+ var decoderOpUTF8 = nativeDecoderOp;
1136
+ var createEncodeStateUTF8 = (charsetCtx, options) => {
1137
+ const appendBOM = options.addBOM ?? ADD_BOM_DEFAULT;
1138
+ const state = {
1139
+ r: 0,
1140
+ w: 0,
1141
+ appendBOM,
1142
+ highSurrogate: ""
1143
+ };
1144
+ return state;
1145
+ };
1146
+ var encodeIntoUTF8 = (encodeState, str, buf) => {
878
1147
  const state = (
879
- /** @type {!EncodeStateUTF} */
1148
+ /** @type {!EncodeStateUTF8} */
880
1149
  encodeState
881
1150
  );
882
- if (state.sz === 4) {
883
- return byteLengthDefault(state, op, text);
1151
+ let j = 0;
1152
+ if (state.appendBOM) {
1153
+ if (buf.length < 3) {
1154
+ return;
1155
+ }
1156
+ buf[0] = 239;
1157
+ buf[1] = 187;
1158
+ buf[2] = 191;
1159
+ j = 3;
1160
+ state.appendBOM = false;
884
1161
  }
885
- return byteLengthMaxUTF(state, op, text);
886
- };
887
- var encoderOpUTF = {
888
- createEncodeStateFn: createEncodeStateUTF,
889
- encodeIntoFn: encodeIntoUTF,
890
- byteLengthMaxFn: byteLengthMaxUTF,
891
- byteLengthFn: byteLengthUTF
892
- };
893
- var CHARSET_CONFIG = [
894
- {
895
- i: 16,
896
- decoderOp: decoderOpUTF16,
897
- encoderOp: encoderOpUTF
898
- },
899
- {
900
- i: 32,
901
- decoderOp: decoderOpUTF32,
902
- encoderOp: encoderOpUTF
903
- },
904
- {
905
- i: 8,
906
- decoderOp: decoderOpUTF8,
907
- encoderOp: encoderOpUTF8
1162
+ if (state.highSurrogate) {
1163
+ str = state.highSurrogate + str;
1164
+ state.highSurrogate = "";
908
1165
  }
909
- ];
910
- var Unicode = class {
911
- /**
912
- * @param {number} i
913
- * @param {number} bo
914
- */
915
- constructor(i, bo) {
916
- const cfg = CHARSET_CONFIG[i];
917
- const ctx = { charsetName: "UTF-" + cfg.i + ["LE", "BE", ""][bo], i, bo };
918
- this.encoding = createEncoding(ctx, cfg.decoderOp, cfg.encoderOp);
1166
+ let i = 0;
1167
+ if (str.length > 0) {
1168
+ const code = str.charCodeAt(str.length - 1);
1169
+ if (code >= HIGH_SURROGATE_FROM && code < LOW_SURROGATE_FROM) {
1170
+ state.highSurrogate = str.charAt(str.length - 1);
1171
+ str = str.slice(0, str.length - 1);
1172
+ i = 1;
1173
+ }
919
1174
  }
920
- /**
921
- * @override
922
- * @return {!ns.Encoding}
923
- */
924
- // @ts-expect-error
925
- create() {
926
- return this.encoding;
1175
+ const { read, written } = TEXT_ENCODER.encodeInto(str, buf.subarray(j));
1176
+ state.r += read + i;
1177
+ state.w += written + j;
1178
+ };
1179
+ var flushIntoUTF8 = (encodeState, buf) => {
1180
+ const state = (
1181
+ /** @type {!EncodeStateUTF8} */
1182
+ encodeState
1183
+ );
1184
+ if (state.highSurrogate) {
1185
+ const { read, written } = TEXT_ENCODER.encodeInto(state.highSurrogate, buf);
1186
+ state.highSurrogate = "";
1187
+ state.r += 1 + read;
1188
+ state.w += written;
927
1189
  }
928
1190
  };
1191
+ var encoderOpUTF8 = createEncoderOperations(
1192
+ //
1193
+ createEncodeStateUTF8,
1194
+ encodeIntoUTF8,
1195
+ flushIntoUTF8,
1196
+ byteLengthMax4X,
1197
+ byteLengthDefault
1198
+ );
1199
+ var ctx = { charsetName: "UTF-8" };
1200
+ var UTF_8 = createEncoding(
1201
+ //
1202
+ ctx,
1203
+ decoderOpUTF8,
1204
+ encoderOpUTF8
1205
+ );
929
1206
 
930
1207
  // dist/main.mjs
931
1208
  var US_ASCII = new SBCS("US-ASCII", "?".repeat(128));
@@ -1101,11 +1378,11 @@ var CP932 = new DBCS("CP932", SHIFT_JIS, [
1101
1378
  ["fb80", "祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],
1102
1379
  ["fc40", "髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]
1103
1380
  ]);
1104
- var UTF8 = new Unicode(2, 2);
1105
- var UTF16LE2 = new Unicode(0, 0);
1106
- var UTF16BE = new Unicode(0, 1);
1107
- var UTF32LE = new Unicode(1, 0);
1108
- var UTF32BE = new Unicode(1, 1);
1381
+ var UTF8 = new Singleton(UTF_8);
1382
+ var UTF16LE2 = new Singleton(UTF_16LE);
1383
+ var UTF16BE = new Singleton(UTF_16BE);
1384
+ var UTF32LE = new Singleton(UTF_32LE);
1385
+ var UTF32BE = new Singleton(UTF_32BE);
1109
1386
  var encodings = { US_ASCII, ISO_8859_1, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, ISO_8859_9, ISO_8859_10, ISO_8859_11, ISO_8859_13, ISO_8859_14, ISO_8859_15, ISO_8859_16, CP037, CP424, CP500, CP875, CP1026, CP437, CP737, CP775, CP850, CP852, CP855, CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP869, CP874, CP1250, CP1251, CP1252, CP1253, CP1254, CP1255, CP1256, CP1257, CP1258, MAC_CYRILLIC, MAC_GREEK, MAC_ICELAND, MAC_LATIN2, MAC_ROMAN, MAC_TURKISH, ATARIST, CP856, CP1006, KOI8_R, KOI8_U, KZ1048, NEXTSTEP, JIS_0201, SHIFT_JIS, CP932, UTF8, UTF16LE: UTF16LE2, UTF16BE, UTF32LE, UTF32BE };
1110
1387
  var aliases = "US-ASCII 646 ansix34 ascii ascii7 cp367 csascii default ibm367 iso646irv iso646us isoir6 us,ISO-8859-1 819 88591 cp819 csisolatin1 ibm819 isoir100 l1 latin1,ISO-8859-2 88592 912 cp912 csisolatin2 ibm912 isoir101 l2 latin2,ISO-8859-3 88593 913 cp913 csisolatin3 ibm913 isoir109 l3 latin3,ISO-8859-4 88594 914 cp914 csisolatin4 ibm914 isoir110 l4 latin4,ISO-8859-5 88595 915 cp915 csisolatincyrillic cyrillic ibm915 isoir144,ISO-8859-6 1089 88596 arabic asmo708 cp1089 csisolatinarabic ecma114 ibm1089 isoir127,ISO-8859-7 813 88597 cp813 csisolatingreek ecma118 elot928 greek greek8 ibm813 isoir126 suneugreek,ISO-8859-8 88598 916 cp916 csisolatinhebrew hebrew ibm916 isoir138,ISO-8859-9 88599 920 cp920 csisolatin5 ibm920 isoir148 l5 latin5,ISO-8859-10 csisolatin6 isoir157 l6 latin6,ISO-8859-11 xiso885911,ISO-8859-13 885913,ISO-8859-14 isoceltic isoir199 l8 latin8,ISO-8859-15 885915 923 cp923 csiso885915 csisolatin csisolatin9 ibm923 iso885915fdis l9 latin latin9,ISO-8859-16 csiso885916 iso8859162001 isoir226 l10 latin10,CP037 37 cpibm37 csebcdiccpca csebcdiccpnl csebcdiccpus csebcdiccpwt csibm37 ebcdiccpca ebcdiccpnl ebcdiccpus ebcdiccpwt ibm37,CP424 424 csibm424 ebcdiccphe ibm424,CP500 500 csibm500 ebcdiccpbh ebcdiccpch ibm500,CP875 875 ibm875 xibm875,CP1026 1026 ibm1026,CP437 437 cspc8codepage437 ibm437 windows437,CP737 737 ibm737 xibm737,CP775 775 ibm775,CP850 850 cspc850multilingual ibm850,CP852 852 cspcp852 ibm852,CP855 855 cspcp855 ibm855,CP857 857 csibm857 ibm857,CP860 860 csibm860 ibm860,CP861 861 cpis csibm861 ibm861,CP862 862 csibm862 cspc862latinhebrew ibm862,CP863 863 csibm863 ibm863,CP864 864 csibm864 ibm864,CP865 865 csibm865 ibm865,CP866 866 csibm866 ibm866,CP869 869 cpgr csibm869 ibm869,CP874 874 ibm874 xibm874,CP1250 cp5346 win1250 windows1250,CP1251 ansi1251 cp5347 win1251 windows1251,CP1252 cp5348 ibm1252 win1252 windows1252,CP1253 cp5349 win1253 windows1253,CP1254 cp5350 win1254 windows1254,CP1255 win1255 windows1255,CP1256 win1256 windows1256,CP1257 cp5353 win1257 windows1257,CP1258 win1258 windows1258,MAC-CYRILLIC xmaccyrillic,MAC-GREEK xmacgreek,MAC-ICELAND xmaciceland,MAC-LATIN2 maccentraleurope xmaccentraleurope,MAC-ROMAN xmacroman,MAC-TURKISH xmacturkish,ATARIST,CP856 856 ibm856 xibm856,CP1006 1006 ibm1006 xibm1006,KOI8-R cskoi8r koi8,KOI8-U cskoi8u,KZ1048 cskz1048 rk1048 strk10482002,NEXTSTEP we8nextstep,JIS-0201 cshalfwidthkatakana x201,SHIFT-JIS csshiftjis jis201 mskanji sjis xsjis,CP932 932 ms932 win932 windows31j windows932,UTF8 unicode11utf8,UTF16LE utf16,UTF16BE,UTF32LE utf32,UTF32BE";
1111
1388
  export {