ygopro-deck-encode 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,570 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // index.ts
20
+ var ygopro_deck_encode_exports = {};
21
+ __export(ygopro_deck_encode_exports, {
22
+ default: () => YGOProDeck
23
+ });
24
+ module.exports = __toCommonJS(ygopro_deck_encode_exports);
25
+
26
+ // src/base64.ts
27
+ function toBase64Url(bytes) {
28
+ const base64 = typeof Buffer !== "undefined" ? Buffer.from(bytes).toString("base64") : btoa(String.fromCharCode(...bytes));
29
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
30
+ }
31
+ function fromBase64Url(encoded) {
32
+ const base64 = encoded.replace(/-/g, "+").replace(/_/g, "/");
33
+ const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, "=");
34
+ if (typeof Buffer !== "undefined") {
35
+ return Uint8Array.from(Buffer.from(padded, "base64"));
36
+ }
37
+ const binary = atob(padded);
38
+ const bytes = new Uint8Array(binary.length);
39
+ for (let i = 0; i < binary.length; i++) {
40
+ bytes[i] = binary.charCodeAt(i);
41
+ }
42
+ return bytes;
43
+ }
44
+
45
+ // src/utils.ts
46
+ function countItems(arr) {
47
+ const map = /* @__PURE__ */ new Map();
48
+ for (const item of arr) {
49
+ map.set(item, (map.get(item) || 0) + 1);
50
+ }
51
+ const blocks = [];
52
+ for (const [item, count] of map.entries()) {
53
+ blocks.push({ item, count });
54
+ }
55
+ return blocks;
56
+ }
57
+ function countConsecutiveItems(arr) {
58
+ const result = [];
59
+ if (arr.length === 0)
60
+ return result;
61
+ let currentItem = arr[0];
62
+ let count = 1;
63
+ for (let i = 1; i < arr.length; i++) {
64
+ if (arr[i] === currentItem) {
65
+ count++;
66
+ } else {
67
+ result.push({ item: currentItem, count });
68
+ currentItem = arr[i];
69
+ count = 1;
70
+ }
71
+ }
72
+ result.push({ item: currentItem, count });
73
+ return result;
74
+ }
75
+ var BufferCursor = class {
76
+ constructor(bufOrLength) {
77
+ this.pointer = 0;
78
+ if (typeof bufOrLength === "number") {
79
+ this.buffer = new Uint8Array(bufOrLength);
80
+ } else {
81
+ this.buffer = bufOrLength;
82
+ }
83
+ }
84
+ /**
85
+ * 安全地将 pointer 向前移动指定字节数。
86
+ * @param bytes 要移动的字节数
87
+ * @returns 原来 pointer 的值
88
+ * @throws RangeError 如果越界
89
+ */
90
+ increasePointer(bytes) {
91
+ const old = this.pointer;
92
+ const next = old + bytes;
93
+ if (next > this.buffer.length) {
94
+ throw new RangeError(
95
+ `Pointer overflow: tried to move to ${next}, but buffer length is ${this.buffer.length}`
96
+ );
97
+ }
98
+ this.pointer = next;
99
+ return old;
100
+ }
101
+ };
102
+ var BufferWriter = class extends BufferCursor {
103
+ constructor(length) {
104
+ super(length);
105
+ }
106
+ writeUint32LE(value) {
107
+ const idx = this.increasePointer(4);
108
+ this.buffer[idx] = value & 255;
109
+ this.buffer[idx + 1] = value >>> 8 & 255;
110
+ this.buffer[idx + 2] = value >>> 16 & 255;
111
+ this.buffer[idx + 3] = value >>> 24 & 255;
112
+ return this;
113
+ }
114
+ writeUint32BE(value) {
115
+ const idx = this.increasePointer(4);
116
+ this.buffer[idx] = value >>> 24 & 255;
117
+ this.buffer[idx + 1] = value >>> 16 & 255;
118
+ this.buffer[idx + 2] = value >>> 8 & 255;
119
+ this.buffer[idx + 3] = value & 255;
120
+ return this;
121
+ }
122
+ writeUint16LE(value) {
123
+ const idx = this.increasePointer(2);
124
+ this.buffer[idx] = value & 255;
125
+ this.buffer[idx + 1] = value >>> 8 & 255;
126
+ return this;
127
+ }
128
+ writeUint16BE(value) {
129
+ const idx = this.increasePointer(2);
130
+ this.buffer[idx] = value >>> 8 & 255;
131
+ this.buffer[idx + 1] = value & 255;
132
+ return this;
133
+ }
134
+ writeUint8(value) {
135
+ const idx = this.increasePointer(1);
136
+ this.buffer[idx] = value & 255;
137
+ return this;
138
+ }
139
+ writeString(str) {
140
+ for (let i = 0; i < str.length; i++) {
141
+ const idx = this.increasePointer(1);
142
+ this.buffer[idx] = str.charCodeAt(i);
143
+ }
144
+ return this;
145
+ }
146
+ };
147
+ var BufferReader = class extends BufferCursor {
148
+ constructor(buf) {
149
+ super(buf);
150
+ }
151
+ readUint32LE() {
152
+ const idx = this.increasePointer(4);
153
+ const b = this.buffer;
154
+ return (b[idx] | b[idx + 1] << 8 | b[idx + 2] << 16 | b[idx + 3] << 24) >>> 0;
155
+ }
156
+ readUint32BE() {
157
+ const idx = this.increasePointer(4);
158
+ const b = this.buffer;
159
+ return (b[idx] << 24 | b[idx + 1] << 16 | b[idx + 2] << 8 | b[idx + 3]) >>> 0;
160
+ }
161
+ readUint16LE() {
162
+ const idx = this.increasePointer(2);
163
+ const b = this.buffer;
164
+ return b[idx] | b[idx + 1] << 8;
165
+ }
166
+ readUint16BE() {
167
+ const idx = this.increasePointer(2);
168
+ const b = this.buffer;
169
+ return b[idx] << 8 | b[idx + 1];
170
+ }
171
+ readUint8() {
172
+ const idx = this.increasePointer(1);
173
+ return this.buffer[idx];
174
+ }
175
+ readString(length) {
176
+ let s = "";
177
+ for (let i = 0; i < length; i++) {
178
+ const idx = this.increasePointer(1);
179
+ s += String.fromCharCode(this.buffer[idx]);
180
+ }
181
+ return s;
182
+ }
183
+ readRemaining() {
184
+ const remaining = this.buffer.length - this.pointer;
185
+ const idx = this.increasePointer(remaining);
186
+ return this.buffer.subarray(idx, this.buffer.length);
187
+ }
188
+ };
189
+ var arrayEquals = (a, b) => {
190
+ return a.length === b.length && a.every((v, i) => v === b[i]);
191
+ };
192
+
193
+ // src/ydke.ts
194
+ function decodeBase64(base64) {
195
+ if (typeof Buffer !== "undefined") {
196
+ return Uint8Array.from(Buffer.from(base64, "base64"));
197
+ }
198
+ const binary = atob(base64);
199
+ const bytes = new Uint8Array(binary.length);
200
+ for (let i = 0; i < binary.length; i++) {
201
+ bytes[i] = binary.charCodeAt(i);
202
+ }
203
+ return bytes;
204
+ }
205
+ function encodeBase64(bytes) {
206
+ if (typeof Buffer !== "undefined") {
207
+ return Buffer.from(bytes).toString("base64");
208
+ }
209
+ let binary = "";
210
+ for (let i = 0; i < bytes.length; i++) {
211
+ binary += String.fromCharCode(bytes[i]);
212
+ }
213
+ return btoa(binary);
214
+ }
215
+ function base64ToUint32Array(base64) {
216
+ const bytes = decodeBase64(base64);
217
+ const view = new DataView(bytes.buffer);
218
+ const result = [];
219
+ for (let i = 0; i < bytes.length; i += 4) {
220
+ result.push(view.getUint32(i, true));
221
+ }
222
+ return result;
223
+ }
224
+ function uint32ArrayToBase64(data) {
225
+ const buffer = new ArrayBuffer(data.length * 4);
226
+ const view = new DataView(buffer);
227
+ data.forEach((val, i) => view.setUint32(i * 4, val, true));
228
+ return encodeBase64(new Uint8Array(buffer));
229
+ }
230
+ function toYdkeURL(deck) {
231
+ return "ydke://" + uint32ArrayToBase64(deck.main) + "!" + uint32ArrayToBase64(deck.extra) + "!" + uint32ArrayToBase64(deck.side) + "!";
232
+ }
233
+ function fromYdkeURL(ydke) {
234
+ if (!ydke.startsWith("ydke://")) {
235
+ throw new Error("Invalid ydke:// URI");
236
+ }
237
+ const [mainStr, extraStr, sideStr] = ydke.slice(7).split("!");
238
+ if (mainStr === void 0 || extraStr === void 0 || sideStr === void 0) {
239
+ throw new Error("Incomplete ydke:// URI");
240
+ }
241
+ return {
242
+ main: base64ToUint32Array(mainStr),
243
+ extra: base64ToUint32Array(extraStr),
244
+ side: base64ToUint32Array(sideStr)
245
+ };
246
+ }
247
+
248
+ // src/ygom.ts
249
+ var QUERY_YGO_TYPE = "ygotype";
250
+ var QUERY_VERSION = "v";
251
+ var ARG_DECK = "deck";
252
+ var QUERY_DECK = "d";
253
+ var QUERY_NAME = "name";
254
+ var URL_SCHEME_HTTP = "http";
255
+ var URL_HOST_DECK = "deck.ourygo.top";
256
+ var BitWriter = class {
257
+ constructor() {
258
+ this.buffer = [];
259
+ this.current = 0;
260
+ this.bitPos = 0;
261
+ }
262
+ writeBits(value, length) {
263
+ while (length > 0) {
264
+ const remain = 8 - this.bitPos;
265
+ const take = Math.min(remain, length);
266
+ const shift = length - take;
267
+ this.current |= (value >>> shift & (1 << take) - 1) << remain - take;
268
+ this.bitPos += take;
269
+ length -= take;
270
+ if (this.bitPos === 8) {
271
+ this.buffer.push(this.current);
272
+ this.current = 0;
273
+ this.bitPos = 0;
274
+ }
275
+ }
276
+ }
277
+ finish() {
278
+ if (this.bitPos > 0)
279
+ this.buffer.push(this.current);
280
+ return new Uint8Array(this.buffer);
281
+ }
282
+ };
283
+ var BitReader = class {
284
+ constructor(bytes) {
285
+ this.bytes = bytes;
286
+ this.index = 0;
287
+ this.bitPos = 0;
288
+ }
289
+ readBits(length) {
290
+ let result = 0;
291
+ while (length > 0) {
292
+ const remain = 8 - this.bitPos;
293
+ const take = Math.min(remain, length);
294
+ const bits = this.bytes[this.index] >>> remain - take & (1 << take) - 1;
295
+ result = result << take | bits;
296
+ this.bitPos += take;
297
+ length -= take;
298
+ if (this.bitPos === 8) {
299
+ this.bitPos = 0;
300
+ this.index++;
301
+ }
302
+ }
303
+ return result;
304
+ }
305
+ };
306
+ function countUnique(cards) {
307
+ let count = 0;
308
+ for (let i = 0; i < cards.length; ) {
309
+ const id = cards[i];
310
+ count++;
311
+ while (i < cards.length && cards[i] === id)
312
+ i++;
313
+ }
314
+ return count;
315
+ }
316
+ function toYGOMobileDeckURL(main, extra, side, customParams = {}) {
317
+ const mNum = countUnique(main);
318
+ const eNum = countUnique(extra);
319
+ const sNum = countUnique(side);
320
+ const writer = new BitWriter();
321
+ writer.writeBits(mNum, 8);
322
+ writer.writeBits(eNum, 4);
323
+ writer.writeBits(sNum, 4);
324
+ const encodeSection = (cards) => {
325
+ for (let i = 0; i < cards.length; ) {
326
+ const id = cards[i];
327
+ let count = 1;
328
+ while (i + count < cards.length && cards[i + count] === id && count < 3)
329
+ count++;
330
+ const prefix = count === 2 ? 2 : count === 3 ? 3 : 1;
331
+ writer.writeBits(prefix, 2);
332
+ writer.writeBits(id, 27);
333
+ i += count;
334
+ }
335
+ };
336
+ encodeSection(main);
337
+ encodeSection(extra);
338
+ encodeSection(side);
339
+ const encoded = toBase64Url(writer.finish());
340
+ const searchParams = new URLSearchParams();
341
+ for (const [k, v] of Object.entries(customParams)) {
342
+ searchParams.set(k, v);
343
+ }
344
+ searchParams.set(QUERY_YGO_TYPE, ARG_DECK);
345
+ searchParams.set(QUERY_VERSION, "1");
346
+ searchParams.set(QUERY_DECK, encoded);
347
+ return `${URL_SCHEME_HTTP}://${URL_HOST_DECK}?${searchParams.toString()}`;
348
+ }
349
+ function fromYGOMobileDeckURL(uri) {
350
+ var _a;
351
+ const url = new URL(uri);
352
+ if (url.searchParams.get(QUERY_YGO_TYPE) !== ARG_DECK) {
353
+ throw new Error("Invalid deck URL");
354
+ }
355
+ const encoded = url.searchParams.get(QUERY_DECK);
356
+ if (!encoded)
357
+ throw new Error("Missing deck data");
358
+ const bytes = fromBase64Url(encoded);
359
+ const reader = new BitReader(bytes);
360
+ const mNum = reader.readBits(8);
361
+ const eNum = reader.readBits(4);
362
+ const sNum = reader.readBits(4);
363
+ const total = mNum + eNum + sNum;
364
+ const result = {
365
+ main: [],
366
+ extra: [],
367
+ side: []
368
+ };
369
+ for (let i = 0; i < total; i++) {
370
+ const prefix = reader.readBits(2);
371
+ const count = prefix === 2 ? 2 : prefix === 3 ? 3 : 1;
372
+ const id = reader.readBits(27);
373
+ const target = i < mNum ? result.main : i < mNum + eNum ? result.extra : result.side;
374
+ for (let j = 0; j < count; j++) {
375
+ target.push(id);
376
+ }
377
+ }
378
+ return {
379
+ ...result,
380
+ name: (_a = url.searchParams.get(QUERY_NAME)) != null ? _a : void 0
381
+ };
382
+ }
383
+
384
+ // index.ts
385
+ var YGOProDeck = class {
386
+ constructor(init = {}) {
387
+ this.main = [];
388
+ this.extra = [];
389
+ this.side = [];
390
+ this.main = init.main ? [...init.main] : [];
391
+ this.extra = init.extra ? [...init.extra] : [];
392
+ this.side = init.side ? [...init.side] : [];
393
+ this.name = init.name;
394
+ }
395
+ bufferLength(noCompact = false) {
396
+ const counted = [this.main, this.extra, this.side].map(
397
+ noCompact ? countConsecutiveItems : countItems
398
+ );
399
+ return counted.reduce((a, b) => a + b.length * 4, 0);
400
+ }
401
+ toUint8Array(noCompact = false) {
402
+ const counted = [this.main, this.extra, this.side].map(
403
+ noCompact ? countConsecutiveItems : countItems
404
+ );
405
+ const writer = new BufferWriter(
406
+ counted.reduce((a, b) => a + b.length * 4, 0)
407
+ );
408
+ const writeCards = (countMap, type) => {
409
+ for (const { item, count } of countMap) {
410
+ if (count > 4) {
411
+ throw new Error(`Too many cards: ${item}`);
412
+ }
413
+ const value = item & 268435455 | type << 28 | count - 1 << 30;
414
+ writer.writeUint32LE(value);
415
+ }
416
+ };
417
+ counted.forEach(writeCards);
418
+ return writer.buffer;
419
+ }
420
+ toEncodedString(noCompact = false) {
421
+ return toBase64Url(this.toUint8Array(noCompact));
422
+ }
423
+ toString(noCompact = false) {
424
+ return this.toEncodedString(noCompact);
425
+ }
426
+ fromUint8Array(buf) {
427
+ for (let i = 0; i < buf.length - 3; i += 4) {
428
+ const value = buf[i] | buf[i + 1] << 8 | buf[i + 2] << 16 | buf[i + 3] << 24;
429
+ const id = value & 268435455;
430
+ const type = value >>> 28 & 3;
431
+ const count = (value >>> 30 & 3) + 1;
432
+ const cards = [this.main, this.extra, this.side][type];
433
+ for (let j = 0; j < count; j++) {
434
+ cards.push(id);
435
+ }
436
+ }
437
+ return this;
438
+ }
439
+ static fromUint8Array(buf) {
440
+ return new YGOProDeck().fromUint8Array(buf);
441
+ }
442
+ fromEncodedString(str) {
443
+ return this.fromUint8Array(fromBase64Url(str));
444
+ }
445
+ static fromEncodedString(str) {
446
+ return new YGOProDeck().fromEncodedString(str);
447
+ }
448
+ toYdkString() {
449
+ return [
450
+ "#created by ygopro-deck-encode",
451
+ "#main",
452
+ ...this.main.map((id) => id.toString()),
453
+ "#extra",
454
+ ...this.extra.map((id) => id.toString()),
455
+ "!side",
456
+ ...this.side.map((id) => id.toString())
457
+ ].join("\n");
458
+ }
459
+ fromYdkString(str) {
460
+ const lines = str.split(/\r?\n/);
461
+ let current = this.main;
462
+ for (const _line of lines) {
463
+ const line = _line.trim();
464
+ if (line === "#main") {
465
+ current = this.main;
466
+ }
467
+ if (line === "#extra") {
468
+ current = this.extra;
469
+ }
470
+ if (line === "!side") {
471
+ current = this.side;
472
+ }
473
+ if (line.match(/^\d+$/)) {
474
+ current.push(parseInt(line, 10));
475
+ }
476
+ }
477
+ return this;
478
+ }
479
+ static fromYdkString(str) {
480
+ return new YGOProDeck().fromYdkString(str);
481
+ }
482
+ fromUpdateDeckPayload(buf, isExtraDeckCard = () => false) {
483
+ const reader = new BufferReader(buf);
484
+ const mainc = reader.readUint32LE();
485
+ const sidec = reader.readUint32LE();
486
+ this.main = [];
487
+ this.extra = [];
488
+ this.side = [];
489
+ for (let i = 0; i < mainc; i++) {
490
+ const id = reader.readUint32LE();
491
+ if (isExtraDeckCard(id, i, mainc)) {
492
+ this.extra.push(id);
493
+ } else {
494
+ this.main.push(id);
495
+ }
496
+ }
497
+ for (let i = 0; i < sidec; i++) {
498
+ const id = reader.readUint32LE();
499
+ this.side.push(id);
500
+ }
501
+ return this;
502
+ }
503
+ static fromUpdateDeckPayload(buf, isExtraDeckCard = () => false) {
504
+ return new YGOProDeck().fromUpdateDeckPayload(buf, isExtraDeckCard);
505
+ }
506
+ toUpdateDeckPayload() {
507
+ const cards = [...this.main, ...this.extra, ...this.side];
508
+ const writer = new BufferWriter(cards.length * 4 + 8).writeUint32LE(this.main.length + this.extra.length).writeUint32LE(this.side.length);
509
+ cards.forEach((id) => writer.writeUint32LE(id));
510
+ return writer.buffer;
511
+ }
512
+ fromYGOMobileDeckURL(uri) {
513
+ const parsed = fromYGOMobileDeckURL(uri);
514
+ this.main = parsed.main;
515
+ this.extra = parsed.extra;
516
+ this.side = parsed.side;
517
+ this.name = parsed.name;
518
+ return this;
519
+ }
520
+ static fromYGOMobileDeckURL(uri) {
521
+ return new YGOProDeck().fromYGOMobileDeckURL(uri);
522
+ }
523
+ toYGOMobileDeckURL() {
524
+ return toYGOMobileDeckURL(
525
+ this.main,
526
+ this.extra,
527
+ this.side,
528
+ this.name && {
529
+ name: this.name
530
+ }
531
+ );
532
+ }
533
+ fromYdkeURL(uri) {
534
+ const parsed = fromYdkeURL(uri);
535
+ this.main = parsed.main;
536
+ this.extra = parsed.extra;
537
+ this.side = parsed.side;
538
+ return this;
539
+ }
540
+ static fromYdkeURL(uri) {
541
+ return new YGOProDeck().fromYdkeURL(uri);
542
+ }
543
+ toYdkeURL() {
544
+ return toYdkeURL({
545
+ main: this.main,
546
+ extra: this.extra,
547
+ side: this.side
548
+ });
549
+ }
550
+ isEqual(other, options = {}) {
551
+ const { ignoreOrder = false } = options;
552
+ const fields = ["main", "extra", "side"];
553
+ const getField = (o, field) => o[field] || [];
554
+ if (fields.some(
555
+ (field) => getField(this, field).length !== getField(other, field).length
556
+ )) {
557
+ return false;
558
+ }
559
+ const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
560
+ return fields.every(
561
+ (field) => arrayEquals(
562
+ normalize(getField(this, field)),
563
+ normalize(getField(other, field))
564
+ )
565
+ );
566
+ }
567
+ };
568
+ // Annotate the CommonJS export names for ESM import in node:
569
+ 0 && (module.exports = {});
570
+ //# sourceMappingURL=index.legacy.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../index.ts", "../src/base64.ts", "../src/utils.ts", "../src/ydke.ts", "../src/ygom.ts"],
4
+ "sourcesContent": ["import { fromBase64Url, toBase64Url } from './src/base64';\nimport {\n arrayEquals,\n BufferReader,\n BufferWriter,\n countConsecutiveItems,\n countItems,\n} from './src/utils';\nimport { fromYdkeURL, toYdkeURL } from './src/ydke';\nimport { fromYGOMobileDeckURL, toYGOMobileDeckURL } from './src/ygom';\n\nexport interface YGOProDeckLike {\n main: number[];\n extra: number[];\n side: number[];\n name?: string;\n}\n\nexport default class YGOProDeck implements YGOProDeckLike {\n main: number[] = [];\n extra: number[] = [];\n side: number[] = [];\n name?: string;\n\n constructor(init: Partial<YGOProDeckLike> = {}) {\n this.main = init.main ? [...init.main] : [];\n this.extra = init.extra ? [...init.extra] : [];\n this.side = init.side ? [...init.side] : [];\n this.name = init.name;\n }\n\n bufferLength(noCompact = false) {\n const counted = [this.main, this.extra, this.side].map(\n noCompact ? countConsecutiveItems : countItems,\n );\n return counted.reduce((a, b) => a + b.length * 4, 0);\n }\n\n toUint8Array(noCompact = false) {\n const counted = [this.main, this.extra, this.side].map(\n noCompact ? countConsecutiveItems : countItems,\n );\n const writer = new BufferWriter(\n counted.reduce((a, b) => a + b.length * 4, 0),\n );\n const writeCards = (\n countMap: { item: number; count: number }[],\n type: number,\n ) => {\n // each card: 28 bits for id, 2 bits(0, 1, 2, 3) for type(0: main, 1: extra, 2: side, 3: unknown), 2 bits for count (0: 1, 1: 2, 2: 3, 3: 4)\n for (const { item, count } of countMap) {\n if (count > 4) {\n throw new Error(`Too many cards: ${item}`);\n }\n const value = (item & 0xfffffff) | (type << 28) | ((count - 1) << 30);\n writer.writeUint32LE(value);\n }\n };\n counted.forEach(writeCards);\n return writer.buffer;\n }\n\n toEncodedString(noCompact = false) {\n return toBase64Url(this.toUint8Array(noCompact));\n }\n\n toString(noCompact = false) {\n return this.toEncodedString(noCompact);\n }\n\n fromUint8Array(buf: Uint8Array) {\n for (let i = 0; i < buf.length - 3; i += 4) {\n const value =\n buf[i] | (buf[i + 1] << 8) | (buf[i + 2] << 16) | (buf[i + 3] << 24);\n const id = value & 0xfffffff;\n const type = (value >>> 28) & 0x3;\n const count = ((value >>> 30) & 0x3) + 1;\n const cards = [this.main, this.extra, this.side][type];\n for (let j = 0; j < count; j++) {\n cards.push(id);\n }\n }\n return this;\n }\n\n static fromUint8Array(buf: Uint8Array) {\n return new YGOProDeck().fromUint8Array(buf);\n }\n\n fromEncodedString(str: string) {\n return this.fromUint8Array(fromBase64Url(str));\n }\n\n static fromEncodedString(str: string) {\n return new YGOProDeck().fromEncodedString(str);\n }\n\n toYdkString() {\n return [\n '#created by ygopro-deck-encode',\n '#main',\n ...this.main.map((id) => id.toString()),\n '#extra',\n ...this.extra.map((id) => id.toString()),\n '!side',\n ...this.side.map((id) => id.toString()),\n ].join('\\n');\n }\n\n fromYdkString(str: string) {\n const lines = str.split(/\\r?\\n/);\n let current = this.main;\n for (const _line of lines) {\n const line = _line.trim();\n if (line === '#main') {\n current = this.main;\n }\n if (line === '#extra') {\n current = this.extra;\n }\n if (line === '!side') {\n current = this.side;\n }\n if (line.match(/^\\d+$/)) {\n current.push(parseInt(line, 10));\n }\n }\n return this;\n }\n\n static fromYdkString(str: string) {\n return new YGOProDeck().fromYdkString(str);\n }\n\n fromUpdateDeckPayload(\n buf: Uint8Array,\n isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () =>\n false,\n ) {\n const reader = new BufferReader(buf);\n const mainc = reader.readUint32LE();\n const sidec = reader.readUint32LE();\n this.main = [];\n this.extra = [];\n this.side = [];\n for (let i = 0; i < mainc; i++) {\n const id = reader.readUint32LE();\n if (isExtraDeckCard(id, i, mainc)) {\n this.extra.push(id);\n } else {\n this.main.push(id);\n }\n }\n for (let i = 0; i < sidec; i++) {\n const id = reader.readUint32LE();\n this.side.push(id);\n }\n return this;\n }\n\n static fromUpdateDeckPayload(\n buf: Uint8Array,\n isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () =>\n false,\n ) {\n return new YGOProDeck().fromUpdateDeckPayload(buf, isExtraDeckCard);\n }\n\n toUpdateDeckPayload() {\n const cards = [...this.main, ...this.extra, ...this.side];\n const writer = new BufferWriter(cards.length * 4 + 8)\n .writeUint32LE(this.main.length + this.extra.length)\n .writeUint32LE(this.side.length);\n cards.forEach((id) => writer.writeUint32LE(id));\n return writer.buffer;\n }\n\n fromYGOMobileDeckURL(uri: string): YGOProDeck {\n const parsed = fromYGOMobileDeckURL(uri);\n this.main = parsed.main;\n this.extra = parsed.extra;\n this.side = parsed.side;\n this.name = parsed.name;\n return this;\n }\n\n static fromYGOMobileDeckURL(uri: string): YGOProDeck {\n return new YGOProDeck().fromYGOMobileDeckURL(uri);\n }\n\n toYGOMobileDeckURL(): string {\n return toYGOMobileDeckURL(\n this.main,\n this.extra,\n this.side,\n this.name && {\n name: this.name,\n },\n );\n }\n\n fromYdkeURL(uri: string): YGOProDeck {\n const parsed = fromYdkeURL(uri);\n this.main = parsed.main;\n this.extra = parsed.extra;\n this.side = parsed.side;\n return this;\n }\n\n static fromYdkeURL(uri: string): YGOProDeck {\n return new YGOProDeck().fromYdkeURL(uri);\n }\n\n toYdkeURL(): string {\n return toYdkeURL({\n main: this.main,\n extra: this.extra,\n side: this.side,\n });\n }\n\n isEqual(\n other: YGOProDeckLike,\n options: {\n ignoreOrder?: boolean;\n } = {},\n ): boolean {\n const { ignoreOrder = false } = options;\n const fields = ['main', 'extra', 'side'] as const;\n const getField = (o: YGOProDeckLike, field: (typeof fields)[number]) =>\n o[field] || [];\n if (\n fields.some(\n (field) =>\n getField(this, field).length !== getField(other, field).length,\n )\n ) {\n return false;\n }\n const normalize = (arr: number[]) =>\n ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;\n return fields.every((field) =>\n arrayEquals(\n normalize(getField(this, field)),\n normalize(getField(other, field)),\n ),\n );\n }\n}\n", "export function toBase64Url(bytes: Uint8Array): string {\n const base64 = typeof Buffer !== 'undefined'\n ? Buffer.from(bytes).toString('base64')\n : btoa(String.fromCharCode(...bytes));\n\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function fromBase64Url(encoded: string): Uint8Array {\n const base64 = encoded.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, '=');\n\n if (typeof Buffer !== 'undefined') {\n return Uint8Array.from(Buffer.from(padded, 'base64'));\n }\n\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n", "export function countItems<T>(arr: T[]) {\n const map = new Map<T, number>();\n for (const item of arr) {\n map.set(item, (map.get(item) || 0) + 1);\n }\n const blocks: { item: T; count: number }[] = [];\n for (const [item, count] of map.entries()) {\n blocks.push({ item, count });\n }\n return blocks;\n}\n\nexport function countConsecutiveItems<T>(arr: T[]) {\n const result: { item: T; count: number }[] = [];\n\n if (arr.length === 0) return result;\n\n let currentItem = arr[0];\n let count = 1;\n\n for (let i = 1; i < arr.length; i++) {\n if (arr[i] === currentItem) {\n count++;\n } else {\n result.push({ item: currentItem, count });\n currentItem = arr[i];\n count = 1;\n }\n }\n\n // \u63A8\u5165\u6700\u540E\u4E00\u7EC4\n result.push({ item: currentItem, count });\n\n return result;\n}\n\nabstract class BufferCursor {\n buffer: Uint8Array;\n pointer = 0;\n\n constructor(bufOrLength: Uint8Array | number) {\n if (typeof bufOrLength === 'number') {\n this.buffer = new Uint8Array(bufOrLength);\n } else {\n this.buffer = bufOrLength;\n }\n }\n\n /**\n * \u5B89\u5168\u5730\u5C06 pointer \u5411\u524D\u79FB\u52A8\u6307\u5B9A\u5B57\u8282\u6570\u3002\n * @param bytes \u8981\u79FB\u52A8\u7684\u5B57\u8282\u6570\n * @returns \u539F\u6765 pointer \u7684\u503C\n * @throws RangeError \u5982\u679C\u8D8A\u754C\n */\n protected increasePointer(bytes: number): number {\n const old = this.pointer;\n const next = old + bytes;\n if (next > this.buffer.length) {\n throw new RangeError(\n `Pointer overflow: tried to move to ${next}, but buffer length is ${this.buffer.length}`,\n );\n }\n this.pointer = next;\n return old;\n }\n}\n\nexport class BufferWriter extends BufferCursor {\n constructor(length: number) {\n super(length);\n }\n\n writeUint32LE(value: number) {\n const idx = this.increasePointer(4);\n this.buffer[idx] = value & 0xff;\n this.buffer[idx + 1] = (value >>> 8) & 0xff;\n this.buffer[idx + 2] = (value >>> 16) & 0xff;\n this.buffer[idx + 3] = (value >>> 24) & 0xff;\n return this;\n }\n\n writeUint32BE(value: number) {\n const idx = this.increasePointer(4);\n this.buffer[idx] = (value >>> 24) & 0xff;\n this.buffer[idx + 1] = (value >>> 16) & 0xff;\n this.buffer[idx + 2] = (value >>> 8) & 0xff;\n this.buffer[idx + 3] = value & 0xff;\n return this;\n }\n\n writeUint16LE(value: number) {\n const idx = this.increasePointer(2);\n this.buffer[idx] = value & 0xff;\n this.buffer[idx + 1] = (value >>> 8) & 0xff;\n return this;\n }\n\n writeUint16BE(value: number) {\n const idx = this.increasePointer(2);\n this.buffer[idx] = (value >>> 8) & 0xff;\n this.buffer[idx + 1] = value & 0xff;\n return this;\n }\n\n writeUint8(value: number) {\n const idx = this.increasePointer(1);\n this.buffer[idx] = value & 0xff;\n return this;\n }\n\n writeString(str: string) {\n for (let i = 0; i < str.length; i++) {\n const idx = this.increasePointer(1);\n this.buffer[idx] = str.charCodeAt(i);\n }\n return this;\n }\n}\n\nexport class BufferReader extends BufferCursor {\n constructor(buf: Uint8Array) {\n super(buf);\n }\n\n readUint32LE(): number {\n const idx = this.increasePointer(4);\n const b = this.buffer;\n // >>>0 \u4FDD\u8BC1\u65E0\u7B26\u53F7\u8F93\u51FA\n return (\n (b[idx] | (b[idx + 1] << 8) | (b[idx + 2] << 16) | (b[idx + 3] << 24)) >>>\n 0\n );\n }\n\n readUint32BE(): number {\n const idx = this.increasePointer(4);\n const b = this.buffer;\n return (\n ((b[idx] << 24) | (b[idx + 1] << 16) | (b[idx + 2] << 8) | b[idx + 3]) >>>\n 0\n );\n }\n\n readUint16LE(): number {\n const idx = this.increasePointer(2);\n const b = this.buffer;\n return b[idx] | (b[idx + 1] << 8);\n }\n\n readUint16BE(): number {\n const idx = this.increasePointer(2);\n const b = this.buffer;\n return (b[idx] << 8) | b[idx + 1];\n }\n\n readUint8(): number {\n const idx = this.increasePointer(1);\n return this.buffer[idx];\n }\n\n readString(length: number): string {\n let s = '';\n for (let i = 0; i < length; i++) {\n const idx = this.increasePointer(1);\n s += String.fromCharCode(this.buffer[idx]);\n }\n return s;\n }\n\n readRemaining(): Uint8Array {\n const remaining = this.buffer.length - this.pointer;\n const idx = this.increasePointer(remaining);\n return this.buffer.subarray(idx, this.buffer.length);\n }\n}\n\nexport const arrayEquals = <T>(a: T[], b: T[]): boolean => {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n};\n", "// ydke.ts\n\nexport interface TypedDeck {\n main: number[];\n extra: number[];\n side: number[];\n}\n\nfunction decodeBase64(base64: string): Uint8Array {\n if (typeof Buffer !== 'undefined') {\n return Uint8Array.from(Buffer.from(base64, 'base64'));\n }\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction encodeBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(bytes).toString('base64');\n }\n\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToUint32Array(base64: string): number[] {\n const bytes = decodeBase64(base64);\n const view = new DataView(bytes.buffer);\n const result: number[] = [];\n for (let i = 0; i < bytes.length; i += 4) {\n result.push(view.getUint32(i, true)); // little-endian\n }\n return result;\n}\n\nfunction uint32ArrayToBase64(data: number[]): string {\n const buffer = new ArrayBuffer(data.length * 4);\n const view = new DataView(buffer);\n data.forEach((val, i) => view.setUint32(i * 4, val, true));\n return encodeBase64(new Uint8Array(buffer));\n}\n\nexport function toYdkeURL(deck: TypedDeck): string {\n return (\n 'ydke://' +\n uint32ArrayToBase64(deck.main) +\n '!' +\n uint32ArrayToBase64(deck.extra) +\n '!' +\n uint32ArrayToBase64(deck.side) +\n '!'\n );\n}\n\nexport function fromYdkeURL(ydke: string): TypedDeck {\n if (!ydke.startsWith('ydke://')) {\n throw new Error('Invalid ydke:// URI');\n }\n const [mainStr, extraStr, sideStr] = ydke.slice(7).split('!');\n if (mainStr === undefined || extraStr === undefined || sideStr === undefined) {\n throw new Error('Incomplete ydke:// URI');\n }\n return {\n main: base64ToUint32Array(mainStr),\n extra: base64ToUint32Array(extraStr),\n side: base64ToUint32Array(sideStr),\n };\n}\n", "import { fromBase64Url, toBase64Url } from \"./base64\";\n\n// === \u5E38\u91CF ===\nconst QUERY_YGO_TYPE = 'ygotype';\nconst QUERY_VERSION = 'v';\nconst ARG_DECK = 'deck';\nconst QUERY_DECK = 'd';\nconst QUERY_NAME = 'name';\nconst URL_SCHEME_HTTP = 'http';\nconst URL_HOST_DECK = 'deck.ourygo.top';\n\n// === BitWriter \u7C7B ===\nclass BitWriter {\n private buffer: number[] = [];\n private current = 0;\n private bitPos = 0;\n\n writeBits(value: number, length: number) {\n while (length > 0) {\n const remain = 8 - this.bitPos;\n const take = Math.min(remain, length);\n const shift = length - take;\n this.current |= ((value >>> shift) & ((1 << take) - 1)) << (remain - take);\n this.bitPos += take;\n length -= take;\n\n if (this.bitPos === 8) {\n this.buffer.push(this.current);\n this.current = 0;\n this.bitPos = 0;\n }\n }\n }\n\n finish(): Uint8Array {\n if (this.bitPos > 0) this.buffer.push(this.current);\n return new Uint8Array(this.buffer);\n }\n}\n\n// === BitReader \u7C7B ===\nclass BitReader {\n private index = 0;\n private bitPos = 0;\n\n constructor(private bytes: Uint8Array) {}\n\n readBits(length: number): number {\n let result = 0;\n while (length > 0) {\n const remain = 8 - this.bitPos;\n const take = Math.min(remain, length);\n const bits = (this.bytes[this.index] >>> (remain - take)) & ((1 << take) - 1);\n result = (result << take) | bits;\n this.bitPos += take;\n length -= take;\n\n if (this.bitPos === 8) {\n this.bitPos = 0;\n this.index++;\n }\n }\n return result;\n }\n}\n\n// === \u5DE5\u5177\u51FD\u6570 ===\nfunction countUnique(cards: number[]): number {\n let count = 0;\n for (let i = 0; i < cards.length; ) {\n const id = cards[i];\n count++;\n while (i < cards.length && cards[i] === id) i++;\n }\n return count;\n}\n\n// === \u4E3B\u51FD\u6570\uFF1A\u7F16\u7801 ===\nexport function toYGOMobileDeckURL(\n main: number[],\n extra: number[],\n side: number[],\n customParams: Record<string, string> = {},\n): string {\n const mNum = countUnique(main);\n const eNum = countUnique(extra);\n const sNum = countUnique(side);\n\n const writer = new BitWriter();\n writer.writeBits(mNum, 8);\n writer.writeBits(eNum, 4);\n writer.writeBits(sNum, 4);\n\n const encodeSection = (cards: number[]) => {\n for (let i = 0; i < cards.length; ) {\n const id = cards[i];\n let count = 1;\n while (i + count < cards.length && cards[i + count] === id && count < 3) count++;\n const prefix = count === 2 ? 0b10 : count === 3 ? 0b11 : 0b01;\n writer.writeBits(prefix, 2);\n writer.writeBits(id, 27);\n i += count;\n }\n };\n\n encodeSection(main);\n encodeSection(extra);\n encodeSection(side);\n\n const encoded = toBase64Url(writer.finish());\n\n const searchParams = new URLSearchParams();\n for (const [k, v] of Object.entries(customParams)) {\n searchParams.set(k, v);\n }\n searchParams.set(QUERY_YGO_TYPE, ARG_DECK);\n searchParams.set(QUERY_VERSION, '1');\n searchParams.set(QUERY_DECK, encoded);\n\n return `${URL_SCHEME_HTTP}://${URL_HOST_DECK}?${searchParams.toString()}`;\n}\n\n// === \u4E3B\u51FD\u6570\uFF1A\u89E3\u7801 ===\nexport function fromYGOMobileDeckURL(uri: string): {\n main: number[];\n extra: number[];\n side: number[];\n name?: string;\n} {\n const url = new URL(uri);\n if (url.searchParams.get(QUERY_YGO_TYPE) !== ARG_DECK) {\n throw new Error('Invalid deck URL');\n }\n\n const encoded = url.searchParams.get(QUERY_DECK);\n if (!encoded) throw new Error('Missing deck data');\n\n const bytes = fromBase64Url(encoded);\n const reader = new BitReader(bytes);\n\n const mNum = reader.readBits(8);\n const eNum = reader.readBits(4);\n const sNum = reader.readBits(4);\n const total = mNum + eNum + sNum;\n\n const result = {\n main: [] as number[],\n extra: [] as number[],\n side: [] as number[],\n };\n\n for (let i = 0; i < total; i++) {\n const prefix = reader.readBits(2);\n const count = prefix === 0b10 ? 2 : prefix === 0b11 ? 3 : 1;\n const id = reader.readBits(27);\n const target =\n i < mNum ? result.main : i < mNum + eNum ? result.extra : result.side;\n for (let j = 0; j < count; j++) {\n target.push(id);\n }\n }\n\n return {\n ...result,\n name: url.searchParams.get(QUERY_NAME) ?? undefined,\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }