ygopro-deck-encode 1.0.13 → 1.0.15

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
@@ -187,13 +187,7 @@ var BufferReader = class extends BufferCursor {
187
187
  }
188
188
  };
189
189
  var arrayEquals = (a, b) => {
190
- if (a.length !== b.length)
191
- return false;
192
- for (let i = 0; i < a.length; i++) {
193
- if (a[i] !== b[i])
194
- return false;
195
- }
196
- return true;
190
+ return a.length === b.length && a.every((v, i) => v === b[i]);
197
191
  };
198
192
 
199
193
  // src/ydke.ts
@@ -381,7 +375,10 @@ var YGOProDeck = class {
381
375
  this.main = [];
382
376
  this.extra = [];
383
377
  this.side = [];
384
- Object.assign(this, init);
378
+ this.main = init.main ? [...init.main] : [];
379
+ this.extra = init.extra ? [...init.extra] : [];
380
+ this.side = init.side ? [...init.side] : [];
381
+ this.name = init.name;
385
382
  }
386
383
  bufferLength(noCompact = false) {
387
384
  const counted = [this.main, this.extra, this.side].map(
@@ -540,10 +537,19 @@ var YGOProDeck = class {
540
537
  }
541
538
  isEqual(other, options = {}) {
542
539
  const { ignoreOrder = false } = options;
543
- const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
544
540
  const fields = ["main", "extra", "side"];
541
+ const getField = (o, field) => o[field] || [];
542
+ if (fields.some(
543
+ (field) => getField(this, field).length !== getField(other, field).length
544
+ )) {
545
+ return false;
546
+ }
547
+ const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
545
548
  return fields.every(
546
- (field) => arrayEquals(normalize(this[field]), normalize(other[field] || []))
549
+ (field) => arrayEquals(
550
+ normalize(getField(this, field)),
551
+ normalize(getField(other, field))
552
+ )
547
553
  );
548
554
  }
549
555
  };
@@ -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 {\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 normalize = (arr: number[]) =>\n ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;\n const fields = ['main', 'extra', 'side'] as const;\n return fields.every((field) =>\n arrayEquals(normalize(this[field]), normalize(other[field] || [])),\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 if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\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 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 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.mjs CHANGED
@@ -163,13 +163,7 @@ var BufferReader = class extends BufferCursor {
163
163
  }
164
164
  };
165
165
  var arrayEquals = (a, b) => {
166
- if (a.length !== b.length)
167
- return false;
168
- for (let i = 0; i < a.length; i++) {
169
- if (a[i] !== b[i])
170
- return false;
171
- }
172
- return true;
166
+ return a.length === b.length && a.every((v, i) => v === b[i]);
173
167
  };
174
168
 
175
169
  // src/ydke.ts
@@ -355,7 +349,10 @@ var YGOProDeck = class {
355
349
  side = [];
356
350
  name;
357
351
  constructor(init = {}) {
358
- Object.assign(this, init);
352
+ this.main = init.main ? [...init.main] : [];
353
+ this.extra = init.extra ? [...init.extra] : [];
354
+ this.side = init.side ? [...init.side] : [];
355
+ this.name = init.name;
359
356
  }
360
357
  bufferLength(noCompact = false) {
361
358
  const counted = [this.main, this.extra, this.side].map(
@@ -514,10 +511,19 @@ var YGOProDeck = class {
514
511
  }
515
512
  isEqual(other, options = {}) {
516
513
  const { ignoreOrder = false } = options;
517
- const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
518
514
  const fields = ["main", "extra", "side"];
515
+ const getField = (o, field) => o[field] || [];
516
+ if (fields.some(
517
+ (field) => getField(this, field).length !== getField(other, field).length
518
+ )) {
519
+ return false;
520
+ }
521
+ const normalize = (arr) => ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
519
522
  return fields.every(
520
- (field) => arrayEquals(normalize(this[field]), normalize(other[field] || []))
523
+ (field) => arrayEquals(
524
+ normalize(getField(this, field)),
525
+ normalize(getField(other, field))
526
+ )
521
527
  );
522
528
  }
523
529
  };
@@ -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] | (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 if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\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 normalize = (arr: number[]) =>\n ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;\n const fields = ['main', 'extra', 'side'] as const;\n return fields.every((field) =>\n arrayEquals(normalize(this[field]), normalize(other[field] || [])),\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 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"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/index.ts CHANGED
@@ -23,7 +23,10 @@ export default class YGOProDeck implements YGOProDeckLike {
23
23
  name?: string;
24
24
 
25
25
  constructor(init: Partial<YGOProDeckLike> = {}) {
26
- Object.assign(this, init);
26
+ this.main = init.main ? [...init.main] : [];
27
+ this.extra = init.extra ? [...init.extra] : [];
28
+ this.side = init.side ? [...init.side] : [];
29
+ this.name = init.name;
27
30
  }
28
31
 
29
32
  bufferLength(noCompact = false) {
@@ -223,11 +226,24 @@ export default class YGOProDeck implements YGOProDeckLike {
223
226
  } = {},
224
227
  ): boolean {
225
228
  const { ignoreOrder = false } = options;
229
+ const fields = ['main', 'extra', 'side'] as const;
230
+ const getField = (o: YGOProDeckLike, field: (typeof fields)[number]) =>
231
+ o[field] || [];
232
+ if (
233
+ fields.some(
234
+ (field) =>
235
+ getField(this, field).length !== getField(other, field).length,
236
+ )
237
+ ) {
238
+ return false;
239
+ }
226
240
  const normalize = (arr: number[]) =>
227
241
  ignoreOrder ? [...arr].sort((a, b) => a - b) : arr;
228
- const fields = ['main', 'extra', 'side'] as const;
229
242
  return fields.every((field) =>
230
- arrayEquals(normalize(this[field]), normalize(other[field] || [])),
243
+ arrayEquals(
244
+ normalize(getField(this, field)),
245
+ normalize(getField(other, field)),
246
+ ),
231
247
  );
232
248
  }
233
249
  }
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.13",
4
+ "version": "1.0.15",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",