ygopro-deck-encode 1.0.12 → 1.0.14

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.
package/dist/index.cjs CHANGED
@@ -186,6 +186,9 @@ var BufferReader = class extends BufferCursor {
186
186
  return this.buffer.subarray(idx, this.buffer.length);
187
187
  }
188
188
  };
189
+ var arrayEquals = (a, b) => {
190
+ return a.length === b.length && a.every((v, i) => v === b[i]);
191
+ };
189
192
 
190
193
  // src/ydke.ts
191
194
  function base64ToUint32Array(base64) {
@@ -368,17 +371,22 @@ function fromYGOMobileDeckURL(uri) {
368
371
 
369
372
  // index.ts
370
373
  var YGOProDeck = class {
371
- constructor() {
374
+ constructor(init = {}) {
372
375
  this.main = [];
373
376
  this.extra = [];
374
377
  this.side = [];
378
+ Object.assign(this, init);
375
379
  }
376
380
  bufferLength(noCompact = false) {
377
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
381
+ const counted = [this.main, this.extra, this.side].map(
382
+ noCompact ? countConsecutiveItems : countItems
383
+ );
378
384
  return counted.reduce((a, b) => a + b.length * 4, 0);
379
385
  }
380
386
  toUint8Array(noCompact = false) {
381
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
387
+ const counted = [this.main, this.extra, this.side].map(
388
+ noCompact ? countConsecutiveItems : countItems
389
+ );
382
390
  const writer = new BufferWriter(
383
391
  counted.reduce((a, b) => a + b.length * 4, 0)
384
392
  );
@@ -498,9 +506,14 @@ var YGOProDeck = class {
498
506
  return new YGOProDeck().fromYGOMobileDeckURL(uri);
499
507
  }
500
508
  toYGOMobileDeckURL() {
501
- return toYGOMobileDeckURL(this.main, this.extra, this.side, this.name && {
502
- name: this.name
503
- });
509
+ return toYGOMobileDeckURL(
510
+ this.main,
511
+ this.extra,
512
+ this.side,
513
+ this.name && {
514
+ name: this.name
515
+ }
516
+ );
504
517
  }
505
518
  fromYdkeURL(uri) {
506
519
  const parsed = fromYdkeURL(uri);
@@ -519,6 +532,23 @@ var YGOProDeck = class {
519
532
  side: this.side
520
533
  });
521
534
  }
535
+ isEqual(other, options = {}) {
536
+ const { ignoreOrder = false } = options;
537
+ const fields = ["main", "extra", "side"];
538
+ const getField = (o, field) => o[field] || [];
539
+ if (fields.some(
540
+ (field) => getField(this, field).length !== getField(other, field).length
541
+ )) {
542
+ return false;
543
+ }
544
+ const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
545
+ return fields.every(
546
+ (field) => arrayEquals(
547
+ normalize(getField(this, field)),
548
+ normalize(getField(other, field))
549
+ )
550
+ );
551
+ }
522
552
  };
523
553
  // Annotate the CommonJS export names for ESM import in node:
524
554
  0 && (module.exports = {});
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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 { BufferReader, BufferWriter, countConsecutiveItems, countItems } from './src/utils';\nimport { fromYdkeURL, toYdkeURL } from './src/ydke';\nimport { fromYGOMobileDeckURL, toYGOMobileDeckURL } from './src/ygom';\n\nexport default class YGOProDeck {\n main: number[] = [];\n extra: number[] = [];\n side: number[] = [];\n name?: string;\n\n bufferLength(noCompact = false) {\n const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);\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(noCompact ? countConsecutiveItems : countItems);\n const writer = new BufferWriter(\n counted.reduce((a, b) => a + b.length * 4, 0),\n );\n const writeCards = (countMap: { item: number, count: number }[], type: number) => {\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(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) {\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(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) { \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(this.main, this.extra, this.side, this.name && {\n name: this.name,\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", "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 ] ) |\n (b[idx + 1] << 8) |\n (b[idx + 2] << 16) |\n (b[idx + 3] << 24)\n ) >>> 0;\n }\n\n readUint32BE(): number {\n const idx = this.increasePointer(4);\n const b = this.buffer;\n return (\n (b[idx ] << 24) |\n (b[idx + 1] << 16) |\n (b[idx + 2] << 8) |\n (b[idx + 3] )\n ) >>> 0;\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", "// ydke.ts\n\nexport interface TypedDeck {\n main: number[];\n extra: number[];\n side: number[];\n}\n\nfunction base64ToUint32Array(base64: string): number[] {\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 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 const bytes = new Uint8Array(buffer);\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\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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",
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 Object.assign(this, init);\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 base64ToUint32Array(base64: string): number[] {\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 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 const bytes = new Uint8Array(buffer);\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\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
6
  "names": []
7
7
  }
package/dist/index.d.ts CHANGED
@@ -1,8 +1,15 @@
1
- export default class YGOProDeck {
1
+ export interface YGOProDeckLike {
2
2
  main: number[];
3
3
  extra: number[];
4
4
  side: number[];
5
5
  name?: string;
6
+ }
7
+ export default class YGOProDeck implements YGOProDeckLike {
8
+ main: number[];
9
+ extra: number[];
10
+ side: number[];
11
+ name?: string;
12
+ constructor(init?: Partial<YGOProDeckLike>);
6
13
  bufferLength(noCompact?: boolean): number;
7
14
  toUint8Array(noCompact?: boolean): Uint8Array;
8
15
  toEncodedString(noCompact?: boolean): string;
@@ -23,4 +30,7 @@ export default class YGOProDeck {
23
30
  fromYdkeURL(uri: string): YGOProDeck;
24
31
  static fromYdkeURL(uri: string): YGOProDeck;
25
32
  toYdkeURL(): string;
33
+ isEqual(other: YGOProDeckLike, options?: {
34
+ ignoreOrder?: boolean;
35
+ }): boolean;
26
36
  }
package/dist/index.mjs CHANGED
@@ -162,6 +162,9 @@ var BufferReader = class extends BufferCursor {
162
162
  return this.buffer.subarray(idx, this.buffer.length);
163
163
  }
164
164
  };
165
+ var arrayEquals = (a, b) => {
166
+ return a.length === b.length && a.every((v, i) => v === b[i]);
167
+ };
165
168
 
166
169
  // src/ydke.ts
167
170
  function base64ToUint32Array(base64) {
@@ -345,12 +348,19 @@ var YGOProDeck = class {
345
348
  extra = [];
346
349
  side = [];
347
350
  name;
351
+ constructor(init = {}) {
352
+ Object.assign(this, init);
353
+ }
348
354
  bufferLength(noCompact = false) {
349
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
355
+ const counted = [this.main, this.extra, this.side].map(
356
+ noCompact ? countConsecutiveItems : countItems
357
+ );
350
358
  return counted.reduce((a, b) => a + b.length * 4, 0);
351
359
  }
352
360
  toUint8Array(noCompact = false) {
353
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
361
+ const counted = [this.main, this.extra, this.side].map(
362
+ noCompact ? countConsecutiveItems : countItems
363
+ );
354
364
  const writer = new BufferWriter(
355
365
  counted.reduce((a, b) => a + b.length * 4, 0)
356
366
  );
@@ -470,9 +480,14 @@ var YGOProDeck = class {
470
480
  return new YGOProDeck().fromYGOMobileDeckURL(uri);
471
481
  }
472
482
  toYGOMobileDeckURL() {
473
- return toYGOMobileDeckURL(this.main, this.extra, this.side, this.name && {
474
- name: this.name
475
- });
483
+ return toYGOMobileDeckURL(
484
+ this.main,
485
+ this.extra,
486
+ this.side,
487
+ this.name && {
488
+ name: this.name
489
+ }
490
+ );
476
491
  }
477
492
  fromYdkeURL(uri) {
478
493
  const parsed = fromYdkeURL(uri);
@@ -491,6 +506,23 @@ var YGOProDeck = class {
491
506
  side: this.side
492
507
  });
493
508
  }
509
+ isEqual(other, options = {}) {
510
+ const { ignoreOrder = false } = options;
511
+ const fields = ["main", "extra", "side"];
512
+ const getField = (o, field) => o[field] || [];
513
+ if (fields.some(
514
+ (field) => getField(this, field).length !== getField(other, field).length
515
+ )) {
516
+ return false;
517
+ }
518
+ const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
519
+ return fields.every(
520
+ (field) => arrayEquals(
521
+ normalize(getField(this, field)),
522
+ normalize(getField(other, field))
523
+ )
524
+ );
525
+ }
494
526
  };
495
527
  export {
496
528
  YGOProDeck as default
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/base64.ts", "../src/utils.ts", "../src/ydke.ts", "../src/ygom.ts", "../index.ts"],
4
- "sourcesContent": ["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 ] ) |\n (b[idx + 1] << 8) |\n (b[idx + 2] << 16) |\n (b[idx + 3] << 24)\n ) >>> 0;\n }\n\n readUint32BE(): number {\n const idx = this.increasePointer(4);\n const b = this.buffer;\n return (\n (b[idx ] << 24) |\n (b[idx + 1] << 16) |\n (b[idx + 2] << 8) |\n (b[idx + 3] )\n ) >>> 0;\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", "// ydke.ts\n\nexport interface TypedDeck {\n main: number[];\n extra: number[];\n side: number[];\n}\n\nfunction base64ToUint32Array(base64: string): number[] {\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 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 const bytes = new Uint8Array(buffer);\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\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", "import { fromBase64Url, toBase64Url } from './src/base64';\nimport { BufferReader, BufferWriter, countConsecutiveItems, countItems } from './src/utils';\nimport { fromYdkeURL, toYdkeURL } from './src/ydke';\nimport { fromYGOMobileDeckURL, toYGOMobileDeckURL } from './src/ygom';\n\nexport default class YGOProDeck {\n main: number[] = [];\n extra: number[] = [];\n side: number[] = [];\n name?: string;\n\n bufferLength(noCompact = false) {\n const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);\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(noCompact ? countConsecutiveItems : countItems);\n const writer = new BufferWriter(\n counted.reduce((a, b) => a + b.length * 4, 0),\n );\n const writeCards = (countMap: { item: number, count: number }[], type: number) => {\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(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) {\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(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) { \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(this.main, this.extra, this.side, this.name && {\n name: this.name,\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["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 base64ToUint32Array(base64: string): number[] {\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 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 const bytes = new Uint8Array(buffer);\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\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", "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 Object.assign(this, init);\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"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -37,4 +37,5 @@ export declare class BufferReader extends BufferCursor {
37
37
  readString(length: number): string;
38
38
  readRemaining(): Uint8Array;
39
39
  }
40
+ export declare const arrayEquals: <T>(a: T[], b: T[]) => boolean;
40
41
  export {};
package/index.ts CHANGED
@@ -1,25 +1,49 @@
1
1
  import { fromBase64Url, toBase64Url } from './src/base64';
2
- import { BufferReader, BufferWriter, countConsecutiveItems, countItems } from './src/utils';
2
+ import {
3
+ arrayEquals,
4
+ BufferReader,
5
+ BufferWriter,
6
+ countConsecutiveItems,
7
+ countItems,
8
+ } from './src/utils';
3
9
  import { fromYdkeURL, toYdkeURL } from './src/ydke';
4
10
  import { fromYGOMobileDeckURL, toYGOMobileDeckURL } from './src/ygom';
5
11
 
6
- export default class YGOProDeck {
12
+ export interface YGOProDeckLike {
13
+ main: number[];
14
+ extra: number[];
15
+ side: number[];
16
+ name?: string;
17
+ }
18
+
19
+ export default class YGOProDeck implements YGOProDeckLike {
7
20
  main: number[] = [];
8
21
  extra: number[] = [];
9
22
  side: number[] = [];
10
23
  name?: string;
11
24
 
25
+ constructor(init: Partial<YGOProDeckLike> = {}) {
26
+ Object.assign(this, init);
27
+ }
28
+
12
29
  bufferLength(noCompact = false) {
13
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
30
+ const counted = [this.main, this.extra, this.side].map(
31
+ noCompact ? countConsecutiveItems : countItems,
32
+ );
14
33
  return counted.reduce((a, b) => a + b.length * 4, 0);
15
34
  }
16
35
 
17
36
  toUint8Array(noCompact = false) {
18
- const counted = [this.main, this.extra, this.side].map(noCompact ? countConsecutiveItems : countItems);
37
+ const counted = [this.main, this.extra, this.side].map(
38
+ noCompact ? countConsecutiveItems : countItems,
39
+ );
19
40
  const writer = new BufferWriter(
20
41
  counted.reduce((a, b) => a + b.length * 4, 0),
21
42
  );
22
- const writeCards = (countMap: { item: number, count: number }[], type: number) => {
43
+ const writeCards = (
44
+ countMap: { item: number; count: number }[],
45
+ type: number,
46
+ ) => {
23
47
  // 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)
24
48
  for (const { item, count } of countMap) {
25
49
  if (count > 4) {
@@ -105,14 +129,18 @@ export default class YGOProDeck {
105
129
  return new YGOProDeck().fromYdkString(str);
106
130
  }
107
131
 
108
- fromUpdateDeckPayload(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) {
132
+ fromUpdateDeckPayload(
133
+ buf: Uint8Array,
134
+ isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () =>
135
+ false,
136
+ ) {
109
137
  const reader = new BufferReader(buf);
110
138
  const mainc = reader.readUint32LE();
111
139
  const sidec = reader.readUint32LE();
112
140
  this.main = [];
113
141
  this.extra = [];
114
142
  this.side = [];
115
- for(let i = 0; i < mainc; i++) {
143
+ for (let i = 0; i < mainc; i++) {
116
144
  const id = reader.readUint32LE();
117
145
  if (isExtraDeckCard(id, i, mainc)) {
118
146
  this.extra.push(id);
@@ -120,14 +148,18 @@ export default class YGOProDeck {
120
148
  this.main.push(id);
121
149
  }
122
150
  }
123
- for(let i = 0; i < sidec; i++) {
151
+ for (let i = 0; i < sidec; i++) {
124
152
  const id = reader.readUint32LE();
125
153
  this.side.push(id);
126
154
  }
127
155
  return this;
128
156
  }
129
157
 
130
- static fromUpdateDeckPayload(buf: Uint8Array, isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () => false) {
158
+ static fromUpdateDeckPayload(
159
+ buf: Uint8Array,
160
+ isExtraDeckCard: (code: number, i: number, mainc: number) => boolean = () =>
161
+ false,
162
+ ) {
131
163
  return new YGOProDeck().fromUpdateDeckPayload(buf, isExtraDeckCard);
132
164
  }
133
165
 
@@ -154,9 +186,14 @@ export default class YGOProDeck {
154
186
  }
155
187
 
156
188
  toYGOMobileDeckURL(): string {
157
- return toYGOMobileDeckURL(this.main, this.extra, this.side, this.name && {
158
- name: this.name,
159
- });
189
+ return toYGOMobileDeckURL(
190
+ this.main,
191
+ this.extra,
192
+ this.side,
193
+ this.name && {
194
+ name: this.name,
195
+ },
196
+ );
160
197
  }
161
198
 
162
199
  fromYdkeURL(uri: string): YGOProDeck {
@@ -178,4 +215,32 @@ export default class YGOProDeck {
178
215
  side: this.side,
179
216
  });
180
217
  }
218
+
219
+ isEqual(
220
+ other: YGOProDeckLike,
221
+ options: {
222
+ ignoreOrder?: boolean;
223
+ } = {},
224
+ ): boolean {
225
+ const { ignoreOrder = false } = options;
226
+ const fields = ['main', 'extra', 'side'] as const;
227
+ const getField = (o: YGOProDeckLike, field: (typeof fields)[number]) =>
228
+ o[field] || [];
229
+ if (
230
+ fields.some(
231
+ (field) =>
232
+ getField(this, field).length !== getField(other, field).length,
233
+ )
234
+ ) {
235
+ return false;
236
+ }
237
+ const normalize = (arr: number[]) =>
238
+ ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
239
+ return fields.every((field) =>
240
+ arrayEquals(
241
+ normalize(getField(this, field)),
242
+ normalize(getField(other, field)),
243
+ ),
244
+ );
245
+ }
181
246
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ygopro-deck-encode",
3
3
  "description": "YGOPro Deck encode and decode, with well-browser support.",
4
- "version": "1.0.12",
4
+ "version": "1.0.14",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",