ygopro-cdb-encode
v1.0.2
Published
YGOPro CDB encoder/decoder and query helpers for Node.js/TypeScript.
Readme
ygopro-cdb-encode
YGOPro CDB encoder/decoder and query helpers for Node.js/TypeScript, built on top of sql.js.
Features
- Read and query
.cdbfiles withsql.js. - Convert between DB rows and
CardDataEntry. - Query with SQL or with a filter object (TypeORM-style operators).
- Create new databases, insert cards, and export
.cdbbytes.
Install
npm i ygopro-cdb-encodeUsage
Open an existing CDB
import fs from 'fs';
import initSqlJs from 'sql.js';
import { YGOProCdb } from 'ygopro-cdb-encode';
const SQL = await initSqlJs();
const data = new Uint8Array(fs.readFileSync('cards.cdb'));
const cdb = new YGOProCdb(SQL).from(data);
const blueEyes = cdb.findOne('texts.name = :name', { name: '青眼白龙' });
console.log(blueEyes?.code);Create a new CDB and add cards
import initSqlJs from 'sql.js';
import { YGOProCdb, CardDataEntry } from 'ygopro-cdb-encode';
const SQL = await initSqlJs();
const cdb = new YGOProCdb(SQL);
const card = new CardDataEntry().fromPartial({
code: 123456,
name: '测试卡',
desc: '测试描述',
attack: 1800,
defense: 1000,
level: 4,
});
cdb.addCard(card);
const bytes = cdb.export(); // Uint8ArrayQuery API
SQL statement
const cards = cdb.find('datas.atk >= :atk AND texts.name = :name', {
atk: 2000,
name: '黑魔术师',
});Filter object
const cards = cdb.find({
name: '黑魔术师',
atk: MoreThanOrEqual(2000),
});Operators
import {
Not,
LessThan,
MoreThan,
LessThanOrEqual,
MoreThanOrEqual,
And,
Or,
HasBit,
HasAllBits,
} from 'ygopro-cdb-encode';Not(value)/Not(op)LessThan(value)MoreThan(value)LessThanOrEqual(value)MoreThanOrEqual(value)And(...values | ...ops)Or(...values | ...ops)HasBit(value)→column & value != 0HasAllBits(value)→column & value = value
Virtual fields in filters
The filter API supports computed fields to match CardData semantics:
code→datas.idlevel→datas.level & 255lscale→(datas.level >> 24) & 255rscale→(datas.level >> 16) & 255rawLevel→datas.levelrawDefense→datas.defdefense→CASE WHEN TYPE_LINK THEN NULL ELSE datas.def ENDlinkMarker→CASE WHEN TYPE_LINK THEN datas.def ELSE NULL END
API Overview
class YGOProCdb {
constructor(sqljs: SqlJsStatic | Database | YGOProCdb)
from(db: Database | Uint8Array): this
find(stmt?: string, params?: Record<string, any>): CardDataEntry[]
find(filter?: CdbFindFilter): CardDataEntry[]
findOne(stmt?: string, params?: Record<string, any>): CardDataEntry | undefined
findOne(filter?: CdbFindFilter): CardDataEntry | undefined
findById(id: number): CardDataEntry | undefined
addCard(card: CardDataEntry | CardDataEntry[]): this
export(): Uint8Array
finalize(): void
}License
MIT
