data-of-loathing 3.1.3 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/browser.js +15 -6
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-7W3YGJW5.js → chunk-CGQXM66N.js} +21 -10
- package/dist/chunk-CGQXM66N.js.map +1 -0
- package/dist/node.js +11 -6
- package/dist/node.js.map +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +3 -1
- package/dist/vite.js.map +1 -1
- package/dist/workers/memory.js +11 -2
- package/dist/workers/memory.js.map +1 -1
- package/dist/workers/opfs.js +6 -1
- package/dist/workers/opfs.js.map +1 -1
- package/dist/workers/ranged.js +17 -4
- package/dist/workers/ranged.js.map +1 -1
- package/package.json +4 -2
- package/dist/chunk-7W3YGJW5.js.map +0 -1
package/README.md
CHANGED
|
@@ -55,7 +55,10 @@ const client = createClient({ strategy: "ranged" });
|
|
|
55
55
|
All three accept a `url` option if you are hosting the database yourself:
|
|
56
56
|
|
|
57
57
|
```ts
|
|
58
|
-
const client = createClient({
|
|
58
|
+
const client = createClient({
|
|
59
|
+
strategy: "memory",
|
|
60
|
+
url: "https://example.com/dol.sqlite",
|
|
61
|
+
});
|
|
59
62
|
```
|
|
60
63
|
|
|
61
64
|
### Vite setup
|
|
@@ -76,7 +79,7 @@ The plugin excludes the package and its SQLite WASM dependency from Vite's depen
|
|
|
76
79
|
If your deployment needs [cross-origin isolation headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy) for other reasons, pass `{ coi: true }` to enable them on the dev server:
|
|
77
80
|
|
|
78
81
|
```ts
|
|
79
|
-
plugins: [dol({ coi: true })]
|
|
82
|
+
plugins: [dol({ coi: true })];
|
|
80
83
|
```
|
|
81
84
|
|
|
82
85
|
## Querying
|
package/dist/browser.js
CHANGED
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
ZapGroup,
|
|
59
59
|
ZapGroupSchema,
|
|
60
60
|
entities
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-CGQXM66N.js";
|
|
62
62
|
|
|
63
63
|
// src/browser.ts
|
|
64
64
|
import { SqlMikroORM, SqliteDriver } from "@mikro-orm/sql";
|
|
@@ -188,17 +188,23 @@ var Client = class extends BaseClient {
|
|
|
188
188
|
switch (strategy.strategy) {
|
|
189
189
|
case "ranged": {
|
|
190
190
|
this.#dialect = new SqliteWorkerDialect(
|
|
191
|
-
new Worker(new URL("./workers/ranged.js", import.meta.url), {
|
|
191
|
+
new Worker(new URL("./workers/ranged.js", import.meta.url), {
|
|
192
|
+
type: "module"
|
|
193
|
+
})
|
|
192
194
|
);
|
|
193
195
|
await this.#dialect.loadRanged(url);
|
|
194
196
|
break;
|
|
195
197
|
}
|
|
196
198
|
case "opfs": {
|
|
197
199
|
this.#dialect = new SqliteWorkerDialect(
|
|
198
|
-
new Worker(new URL("./workers/opfs.js", import.meta.url), {
|
|
200
|
+
new Worker(new URL("./workers/opfs.js", import.meta.url), {
|
|
201
|
+
type: "module"
|
|
202
|
+
})
|
|
199
203
|
);
|
|
200
204
|
const { force = false } = strategy;
|
|
201
|
-
const remoteEtag = (await fetch(url, { method: "HEAD" })).headers.get(
|
|
205
|
+
const remoteEtag = (await fetch(url, { method: "HEAD" })).headers.get(
|
|
206
|
+
"etag"
|
|
207
|
+
);
|
|
202
208
|
const storedEtag = force ? null : await getOpfsEtag();
|
|
203
209
|
if (force || storedEtag !== remoteEtag) {
|
|
204
210
|
const buffer = await this.fetchDb(url);
|
|
@@ -211,13 +217,16 @@ var Client = class extends BaseClient {
|
|
|
211
217
|
case "memory":
|
|
212
218
|
default: {
|
|
213
219
|
this.#dialect = new SqliteWorkerDialect(
|
|
214
|
-
new Worker(new URL("./workers/memory.js", import.meta.url), {
|
|
220
|
+
new Worker(new URL("./workers/memory.js", import.meta.url), {
|
|
221
|
+
type: "module"
|
|
222
|
+
})
|
|
215
223
|
);
|
|
216
224
|
const { force = false } = strategy;
|
|
217
225
|
const response = await fetch(url, {
|
|
218
226
|
cache: force ? "reload" : "default"
|
|
219
227
|
});
|
|
220
|
-
if (!response.ok)
|
|
228
|
+
if (!response.ok)
|
|
229
|
+
throw new Error(`Failed to fetch database: ${response.status}`);
|
|
221
230
|
const buffer = await response.arrayBuffer();
|
|
222
231
|
await this.#dialect.loadMemory(buffer);
|
|
223
232
|
}
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser.ts","../src/SqliteWorkerDialect.ts"],"sourcesContent":["import { SqlMikroORM, SqliteDriver } from \"@mikro-orm/sql\";\nimport { entities } from \"./schema.js\";\nimport { SqliteWorkerDialect } from \"./SqliteWorkerDialect.js\";\nimport { BaseClient, DEFAULT_URL, ETAG_KEY } from \"./BaseClient.js\";\n\nexport type Strategy =\n | { strategy?: \"memory\"; url?: string; force?: boolean }\n | { strategy: \"opfs\"; url?: string; force?: boolean }\n | { strategy: \"ranged\"; url?: string };\n\nasync function getOpfsEtag(): Promise<string | null> {\n try {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(\".dol-etag\");\n return (await handle.getFile()).text();\n } catch {\n return null;\n }\n}\n\nasync function setOpfsEtag(etag: string): Promise<void> {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(\".dol-etag\", { create: true });\n const writable = await handle.createWritable();\n await writable.write(etag);\n await writable.close();\n}\n\nasync function writeToOpfs(filename: string, buffer: ArrayBuffer): Promise<void> {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(filename, { create: true });\n const writable = await handle.createWritable();\n await writable.write(buffer);\n await writable.close();\n}\n\nexport class Client extends BaseClient<Strategy> {\n #dialect?: SqliteWorkerDialect;\n\n constructor(strategy: Strategy = {}) {\n super(strategy);\n }\n\n protected async getStoredEtag(_key: string): Promise<string | null> {\n return localStorage.getItem(ETAG_KEY);\n }\n\n protected async storeEtag(_key: string, etag: string): Promise<void> {\n localStorage.setItem(ETAG_KEY, etag);\n }\n\n async load(): Promise<void> {\n await this._orm?.close();\n this.#dialect?.createDriver().destroy();\n\n const strategy = this._strategy;\n const url = this._strategy.url ?? DEFAULT_URL;\n\n switch (strategy.strategy) {\n case \"ranged\": {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/ranged.js\", import.meta.url), { type: \"module\" }),\n );\n await this.#dialect.loadRanged(url);\n break;\n }\n case \"opfs\": {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/opfs.js\", import.meta.url), { type: \"module\" }),\n );\n const { force = false } = strategy;\n const remoteEtag = (await fetch(url, { method: \"HEAD\" })).headers.get(\"etag\");\n const storedEtag = force ? null : await getOpfsEtag();\n\n if (force || storedEtag !== remoteEtag) {\n const buffer = await this.fetchDb(url);\n await writeToOpfs(\"dol.sqlite\", buffer);\n if (remoteEtag) await setOpfsEtag(remoteEtag);\n }\n\n await this.#dialect.loadOpfs(\"/dol.sqlite\");\n break;\n }\n case \"memory\":\n default: {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/memory.js\", import.meta.url), { type: \"module\" }),\n );\n const { force = false } = strategy;\n const response = await fetch(url, {\n cache: force ? \"reload\" : \"default\",\n });\n if (!response.ok) throw new Error(`Failed to fetch database: ${response.status}`);\n const buffer = await response.arrayBuffer();\n await this.#dialect.loadMemory(buffer);\n }\n }\n\n this._orm = await SqlMikroORM.init({\n driver: SqliteDriver,\n driverOptions: this.#dialect,\n dbName: \"dol.sqlite\",\n entities,\n allowGlobalContext: true,\n });\n }\n}\n\nexport function createClient(strategy: Strategy = {}): Client {\n return new Client(strategy);\n}\n\nexport * from \"./schema.js\";\n","import { type SqlValue } from \"@sqlite.org/sqlite-wasm\";\nimport {\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n type CompiledQuery,\n type DatabaseConnection,\n type DatabaseIntrospector,\n type Dialect,\n type DialectAdapter,\n type Driver,\n type Kysely,\n type QueryCompiler,\n type QueryResult,\n} from \"kysely\";\n\ntype WorkerResponse =\n | { id: string; type: \"loaded\" }\n | { id: string; type: \"exec\"; rows: Record<string, SqlValue>[] }\n | { id: string; type: \"error\"; error: string };\n\nexport class SqliteWorkerDialect implements Dialect {\n readonly #worker: Worker;\n readonly #pending = new Map<string, { resolve: (value: Record<string, SqlValue>[] | undefined) => void; reject: (err: Error) => void }>();\n #nextId = 0;\n\n constructor(worker: Worker) {\n this.#worker = worker;\n this.#worker.onmessage = (event: MessageEvent<WorkerResponse>) => {\n const pending = this.#pending.get(event.data.id);\n if (!pending) return;\n this.#pending.delete(event.data.id);\n if (event.data.type === \"error\") {\n pending.reject(new Error(event.data.error));\n } else if (event.data.type === \"exec\") {\n pending.resolve(event.data.rows);\n } else {\n pending.resolve(undefined);\n }\n };\n }\n\n #send<T>(message: object, transfer?: Transferable[]): Promise<T> {\n const id = String(++this.#nextId);\n const promise = new Promise<T>((resolve, reject) => {\n this.#pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.#worker.postMessage({ ...message, id }, transfer ?? []);\n return promise;\n }\n\n loadMemory(buffer: ArrayBuffer): Promise<void> {\n return this.#send<void>({ type: \"load\", buffer }, [buffer]);\n }\n\n loadOpfs(filename: string): Promise<void> {\n return this.#send<void>({ type: \"load\", filename });\n }\n\n loadRanged(url: string): Promise<void> {\n return this.#send<void>({ type: \"load\", url });\n }\n\n createDriver(): Driver {\n const dialect = this;\n const connection: DatabaseConnection = {\n executeQuery<O>(query: CompiledQuery): Promise<QueryResult<O>> {\n return dialect\n .#send<O[]>({ type: \"exec\", sql: query.sql, bind: [...query.parameters] })\n .then((rows) => ({ rows }));\n },\n async *streamQuery() {\n throw new Error(\"Streaming not supported\");\n },\n };\n return {\n async init() {},\n async acquireConnection() { return connection; },\n async beginTransaction() {},\n async commitTransaction() {},\n async rollbackTransaction() {},\n async releaseConnection() {},\n async destroy() { dialect.#worker.terminate(); },\n };\n }\n\n createQueryCompiler(): QueryCompiler {\n return new SqliteQueryCompiler();\n }\n\n createAdapter(): DialectAdapter {\n return new SqliteAdapter();\n }\n\n createIntrospector(db: Kysely<any>): DatabaseIntrospector {\n return new SqliteIntrospector(db);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts","../src/SqliteWorkerDialect.ts"],"sourcesContent":["import { SqlMikroORM, SqliteDriver } from \"@mikro-orm/sql\";\nimport { entities } from \"./schema.js\";\nimport { SqliteWorkerDialect } from \"./SqliteWorkerDialect.js\";\nimport { BaseClient, DEFAULT_URL, ETAG_KEY } from \"./BaseClient.js\";\n\nexport type Strategy =\n | { strategy?: \"memory\"; url?: string; force?: boolean }\n | { strategy: \"opfs\"; url?: string; force?: boolean }\n | { strategy: \"ranged\"; url?: string };\n\nasync function getOpfsEtag(): Promise<string | null> {\n try {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(\".dol-etag\");\n return (await handle.getFile()).text();\n } catch {\n return null;\n }\n}\n\nasync function setOpfsEtag(etag: string): Promise<void> {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(\".dol-etag\", { create: true });\n const writable = await handle.createWritable();\n await writable.write(etag);\n await writable.close();\n}\n\nasync function writeToOpfs(\n filename: string,\n buffer: ArrayBuffer,\n): Promise<void> {\n const root = await navigator.storage.getDirectory();\n const handle = await root.getFileHandle(filename, { create: true });\n const writable = await handle.createWritable();\n await writable.write(buffer);\n await writable.close();\n}\n\nexport class Client extends BaseClient<Strategy> {\n #dialect?: SqliteWorkerDialect;\n\n constructor(strategy: Strategy = {}) {\n super(strategy);\n }\n\n protected async getStoredEtag(_key: string): Promise<string | null> {\n return localStorage.getItem(ETAG_KEY);\n }\n\n protected async storeEtag(_key: string, etag: string): Promise<void> {\n localStorage.setItem(ETAG_KEY, etag);\n }\n\n async load(): Promise<void> {\n await this._orm?.close();\n this.#dialect?.createDriver().destroy();\n\n const strategy = this._strategy;\n const url = this._strategy.url ?? DEFAULT_URL;\n\n switch (strategy.strategy) {\n case \"ranged\": {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/ranged.js\", import.meta.url), {\n type: \"module\",\n }),\n );\n await this.#dialect.loadRanged(url);\n break;\n }\n case \"opfs\": {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/opfs.js\", import.meta.url), {\n type: \"module\",\n }),\n );\n const { force = false } = strategy;\n const remoteEtag = (await fetch(url, { method: \"HEAD\" })).headers.get(\n \"etag\",\n );\n const storedEtag = force ? null : await getOpfsEtag();\n\n if (force || storedEtag !== remoteEtag) {\n const buffer = await this.fetchDb(url);\n await writeToOpfs(\"dol.sqlite\", buffer);\n if (remoteEtag) await setOpfsEtag(remoteEtag);\n }\n\n await this.#dialect.loadOpfs(\"/dol.sqlite\");\n break;\n }\n case \"memory\":\n default: {\n this.#dialect = new SqliteWorkerDialect(\n new Worker(new URL(\"./workers/memory.js\", import.meta.url), {\n type: \"module\",\n }),\n );\n const { force = false } = strategy;\n const response = await fetch(url, {\n cache: force ? \"reload\" : \"default\",\n });\n if (!response.ok)\n throw new Error(`Failed to fetch database: ${response.status}`);\n const buffer = await response.arrayBuffer();\n await this.#dialect.loadMemory(buffer);\n }\n }\n\n this._orm = await SqlMikroORM.init({\n driver: SqliteDriver,\n driverOptions: this.#dialect,\n dbName: \"dol.sqlite\",\n entities,\n allowGlobalContext: true,\n });\n }\n}\n\nexport function createClient(strategy: Strategy = {}): Client {\n return new Client(strategy);\n}\n\nexport * from \"./schema.js\";\n","import { type SqlValue } from \"@sqlite.org/sqlite-wasm\";\nimport {\n SqliteAdapter,\n SqliteIntrospector,\n SqliteQueryCompiler,\n type CompiledQuery,\n type DatabaseConnection,\n type DatabaseIntrospector,\n type Dialect,\n type DialectAdapter,\n type Driver,\n type Kysely,\n type QueryCompiler,\n type QueryResult,\n} from \"kysely\";\n\ntype WorkerResponse =\n | { id: string; type: \"loaded\" }\n | { id: string; type: \"exec\"; rows: Record<string, SqlValue>[] }\n | { id: string; type: \"error\"; error: string };\n\nexport class SqliteWorkerDialect implements Dialect {\n readonly #worker: Worker;\n readonly #pending = new Map<\n string,\n {\n resolve: (value: Record<string, SqlValue>[] | undefined) => void;\n reject: (err: Error) => void;\n }\n >();\n #nextId = 0;\n\n constructor(worker: Worker) {\n this.#worker = worker;\n this.#worker.onmessage = (event: MessageEvent<WorkerResponse>) => {\n const pending = this.#pending.get(event.data.id);\n if (!pending) return;\n this.#pending.delete(event.data.id);\n if (event.data.type === \"error\") {\n pending.reject(new Error(event.data.error));\n } else if (event.data.type === \"exec\") {\n pending.resolve(event.data.rows);\n } else {\n pending.resolve(undefined);\n }\n };\n }\n\n #send<T>(message: object, transfer?: Transferable[]): Promise<T> {\n const id = String(++this.#nextId);\n const promise = new Promise<T>((resolve, reject) => {\n this.#pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.#worker.postMessage({ ...message, id }, transfer ?? []);\n return promise;\n }\n\n loadMemory(buffer: ArrayBuffer): Promise<void> {\n return this.#send<void>({ type: \"load\", buffer }, [buffer]);\n }\n\n loadOpfs(filename: string): Promise<void> {\n return this.#send<void>({ type: \"load\", filename });\n }\n\n loadRanged(url: string): Promise<void> {\n return this.#send<void>({ type: \"load\", url });\n }\n\n createDriver(): Driver {\n const dialect = this;\n const connection: DatabaseConnection = {\n executeQuery<O>(query: CompiledQuery): Promise<QueryResult<O>> {\n return dialect\n .#send<\n O[]\n >({ type: \"exec\", sql: query.sql, bind: [...query.parameters] })\n .then((rows) => ({ rows }));\n },\n async *streamQuery() {\n throw new Error(\"Streaming not supported\");\n },\n };\n return {\n async init() {},\n async acquireConnection() {\n return connection;\n },\n async beginTransaction() {},\n async commitTransaction() {},\n async rollbackTransaction() {},\n async releaseConnection() {},\n async destroy() {\n dialect.#worker.terminate();\n },\n };\n }\n\n createQueryCompiler(): QueryCompiler {\n return new SqliteQueryCompiler();\n }\n\n createAdapter(): DialectAdapter {\n return new SqliteAdapter();\n }\n\n createIntrospector(db: Kysely<any>): DatabaseIntrospector {\n return new SqliteIntrospector(db);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -532,8 +532,18 @@ var FamiliarSchema = new EntitySchema({
|
|
|
532
532
|
name: { type: "string" },
|
|
533
533
|
image: { type: "string" },
|
|
534
534
|
categories: { type: "json" },
|
|
535
|
-
larva: {
|
|
536
|
-
|
|
535
|
+
larva: {
|
|
536
|
+
kind: "m:1",
|
|
537
|
+
entity: () => Item,
|
|
538
|
+
nullable: true,
|
|
539
|
+
fieldName: "larva"
|
|
540
|
+
},
|
|
541
|
+
equipment: {
|
|
542
|
+
kind: "m:1",
|
|
543
|
+
entity: () => Item,
|
|
544
|
+
nullable: true,
|
|
545
|
+
fieldName: "equipment"
|
|
546
|
+
},
|
|
537
547
|
cageMatch: { type: "integer" },
|
|
538
548
|
scavengerHunt: { type: "integer" },
|
|
539
549
|
obstacleCourse: { type: "integer" },
|
|
@@ -656,7 +666,12 @@ var AscensionClassSchema = new EntitySchema({
|
|
|
656
666
|
enumName: { type: "string" },
|
|
657
667
|
image: { type: "string", nullable: true },
|
|
658
668
|
primeStatIndex: { type: "integer" },
|
|
659
|
-
path: {
|
|
669
|
+
path: {
|
|
670
|
+
kind: "m:1",
|
|
671
|
+
entity: () => Path,
|
|
672
|
+
nullable: true,
|
|
673
|
+
fieldName: "path"
|
|
674
|
+
},
|
|
660
675
|
stun: { type: "string", nullable: true },
|
|
661
676
|
stomachCapacity: { type: "integer", nullable: true },
|
|
662
677
|
liverCapacity: { type: "integer", nullable: true },
|
|
@@ -750,9 +765,7 @@ var FoldGroupSchema = new EntitySchema({
|
|
|
750
765
|
items: {
|
|
751
766
|
kind: "m:n",
|
|
752
767
|
entity: () => Item,
|
|
753
|
-
|
|
754
|
-
joinColumn: "foldGroup",
|
|
755
|
-
inverseJoinColumn: "item"
|
|
768
|
+
mappedBy: "foldGroups"
|
|
756
769
|
}
|
|
757
770
|
}
|
|
758
771
|
});
|
|
@@ -764,9 +777,7 @@ var ZapGroupSchema = new EntitySchema({
|
|
|
764
777
|
items: {
|
|
765
778
|
kind: "m:n",
|
|
766
779
|
entity: () => Item,
|
|
767
|
-
|
|
768
|
-
joinColumn: "zapGroup",
|
|
769
|
-
inverseJoinColumn: "item"
|
|
780
|
+
mappedBy: "zapGroups"
|
|
770
781
|
}
|
|
771
782
|
}
|
|
772
783
|
});
|
|
@@ -995,4 +1006,4 @@ export {
|
|
|
995
1006
|
ETAG_KEY,
|
|
996
1007
|
BaseClient
|
|
997
1008
|
};
|
|
998
|
-
//# sourceMappingURL=chunk-
|
|
1009
|
+
//# sourceMappingURL=chunk-CGQXM66N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts","../src/BaseClient.ts"],"sourcesContent":["import { Collection, EntitySchema, type Ref } from \"@mikro-orm/core\";\n\n// ---- Enums ----------------------------------------------------------------\n\nexport enum ItemUse {\n Food = \"food\",\n Drink = \"drink\",\n Spleen = \"spleen\",\n Potion = \"potion\",\n Avatar = \"avatar\",\n Usable = \"usable\",\n Multiple = \"multiple\",\n Reusable = \"reusable\",\n Message = \"message\",\n Grow = \"grow\",\n PokePill = \"pokepill\",\n Hat = \"hat\",\n Weapon = \"weapon\",\n Sixgun = \"sixgun\",\n Offhand = \"offhand\",\n Container = \"container\",\n Shirt = \"shirt\",\n Pants = \"pants\",\n Accessory = \"accessory\",\n Familiar = \"familiar\",\n Sticker = \"sticker\",\n Card = \"card\",\n Folder = \"folder\",\n Bootspur = \"bootspur\",\n Bootskin = \"bootskin\",\n FoodHelper = \"food helper\",\n DrinkHelper = \"drink helper\",\n Zap = \"zap\",\n Sphere = \"sphere\",\n Guardian = \"guardian\",\n Combat = \"combat\",\n CombatReusable = \"combat reusable\",\n Single = \"single\",\n Solo = \"solo\",\n Curse = \"curse\",\n Bounty = \"bounty\",\n Package = \"package\",\n Candy = \"candy\",\n Candy1 = \"candy1\",\n Candy2 = \"candy2\",\n Chocolate = \"chocolate\",\n Fancy = \"fancy\",\n Paste = \"paste\",\n Smith = \"smith\",\n Cook = \"cook\",\n Mix = \"mix\",\n Matchable = \"matchable\",\n}\n\nexport enum EffectQuality {\n Good = \"good\",\n Neutral = \"neutral\",\n Bad = \"bad\",\n}\n\nexport enum SkillTag {\n Passive = \"passive\",\n Combat = \"combat\",\n NonCombat = \"nc\",\n Heal = \"heal\",\n ItemSummon = \"item\",\n Effect = \"effect\",\n Self = \"self\",\n Other = \"other\",\n Song = \"song\",\n Expression = \"expression\",\n Walk = \"walk\",\n}\n\nexport enum FamiliarCategory {\n Stat0 = \"stat0\",\n Stat1 = \"stat1\",\n Item0 = \"item0\",\n Item1 = \"item1\",\n Item2 = \"item2\",\n Item3 = \"item3\",\n Meat0 = \"meat0\",\n Combat0 = \"combat0\",\n Combat1 = \"combat1\",\n Drop = \"drop\",\n Block = \"block\",\n Delevel0 = \"delevel0\",\n Delevel1 = \"delevel1\",\n Hp0 = \"hp0\",\n Mp0 = \"mp0\",\n Meat1 = \"meat1\",\n Stat2 = \"stat2\",\n Other0 = \"other0\",\n Hp1 = \"hp1\",\n Mp1 = \"mp1\",\n Stat3 = \"stat3\",\n Other1 = \"other1\",\n Passive = \"passive\",\n Underwater = \"underwater\",\n Pokefam = \"pokefam\",\n Variable = \"variable\",\n}\n\nexport enum MonsterElement {\n BadSpelling = \"bad spelling\",\n Cold = \"cold\",\n Cute = \"cute\",\n Hot = \"hot\",\n Shadow = \"shadow\",\n Spooky = \"spooky\",\n Sleaze = \"sleaze\",\n Slime = \"slime\",\n Supercold = \"supercold\",\n Stench = \"stench\",\n}\n\nexport enum MonsterDropCategory {\n PickpocketOnly = \"p\",\n NoPickpocket = \"n\",\n Conditional = \"c\",\n Fixed = \"f\",\n Accordion = \"a\",\n Multi = \"m\",\n}\n\nexport enum LocationDifficulty {\n None = \"none\",\n Unknown = \"unknown\",\n Low = \"low\",\n Medium = \"medium\",\n High = \"high\",\n}\n\nexport enum LocationEnvironment {\n None = \"none\",\n Indoor = \"indoor\",\n Outdoor = \"outdoor\",\n Underground = \"underground\",\n Underwater = \"underwater\",\n}\n\nexport enum ConsumableQuality {\n None = \"none\",\n Crappy = \"crappy\",\n Decent = \"decent\",\n Good = \"good\",\n Awesome = \"awesome\",\n EPIC = \"EPIC\",\n SuperEPIC = \"super_EPIC\",\n SuperUltraEPIC = \"super_ultra_EPIC\",\n SuperUltraMegaEPIC = \"super_ultra_mega_EPIC\",\n SuperUltraMegaTurboEPIC = \"super_ultra_mega_turbo_EPIC\",\n Quest = \"quest\",\n Changing = \"changing\",\n Drippy = \"drippy\",\n}\n\n// ---- Entity Classes -------------------------------------------------------\n\nexport class Item {\n id!: number;\n name!: string;\n descid?: number;\n image!: string;\n uses!: ItemUse[];\n quest!: boolean;\n gift!: boolean;\n tradeable!: boolean;\n discardable!: boolean;\n autosell!: number;\n plural?: string;\n ambiguous!: boolean;\n // relations\n equipment?: Equipment;\n consumable?: Consumable;\n modifiers?: ItemModifiers;\n monsterDrops = new Collection<MonsterDrop>(this);\n outfitEquipment = new Collection<Outfit>(this);\n outfitTreats = new Collection<OutfitTreat>(this);\n ingredients = new Collection<Ingredient>(this);\n foldGroups = new Collection<FoldGroup>(this);\n zapGroups = new Collection<ZapGroup>(this);\n}\n\nexport class Effect {\n id!: number;\n name!: string;\n descid?: string;\n image!: string;\n quality!: EffectQuality;\n nohookah!: boolean;\n nopvp!: boolean;\n noremove!: boolean;\n song!: boolean;\n actions!: string[];\n ambiguous!: boolean;\n modifiers?: EffectModifiers;\n}\n\nexport class Skill {\n id!: number;\n name!: string;\n image!: string;\n tags!: SkillTag[];\n mpCost!: number;\n duration!: number;\n guildLevel?: number;\n maxLevel?: number;\n permable!: boolean;\n ambiguous!: boolean;\n modifiers?: SkillModifiers;\n}\n\nexport class Familiar {\n id!: number;\n name!: string;\n image!: string;\n categories!: FamiliarCategory[];\n larva?: Item;\n equipment?: Item;\n cageMatch!: number;\n scavengerHunt!: number;\n obstacleCourse!: number;\n hideAndSeek!: number;\n attributes!: string[];\n modifiers?: FamiliarModifiers;\n}\n\nexport class Monster {\n id!: number;\n name!: string;\n image!: string[];\n ambiguous!: boolean;\n article!: string;\n attack!: string;\n boss!: boolean;\n defence!: string;\n drippy!: boolean;\n element?: MonsterElement;\n elementalAttack?: MonsterElement;\n elementalDefence?: MonsterElement;\n elementalResistance!: string;\n experience?: string;\n free!: boolean;\n ghost!: boolean;\n groupSize!: number;\n hp!: string;\n initiative!: string;\n itemBlockChance!: number;\n lucky!: boolean;\n manuel?: string;\n meat?: number;\n meatExpression?: string;\n monsterLevelMultiplier!: string;\n nobanish!: boolean;\n nocopy!: boolean;\n nomanuel!: boolean;\n nowander!: boolean;\n nowish!: boolean;\n phylum!: string;\n physicalResistance!: string;\n poison?: string;\n scaling!: string;\n scalingCap!: string;\n scalingFloor!: string;\n skeleton!: boolean;\n skillBlockChance!: number;\n snake!: boolean;\n spellBlockChance!: number;\n sprinkles!: [number | string, number | string];\n superlikely!: boolean;\n ultrarare!: boolean;\n wanderer!: boolean;\n wiki?: string;\n wish!: boolean;\n zombie!: boolean;\n // relations\n drops = new Collection<MonsterDrop>(this);\n nativeLocations = new Collection<NativeMonster>(this);\n}\n\nexport class Location {\n name!: string;\n id?: number;\n zone!: string;\n url!: string;\n difficulty!: LocationDifficulty;\n environment!: LocationEnvironment;\n statRequirement!: number;\n waterLevel?: number;\n overdrunk!: boolean;\n nowander!: boolean;\n combatRate!: number;\n // relations\n nativeMonsters = new Collection<NativeMonster>(this);\n}\n\nexport class Path {\n id!: number;\n name!: string;\n enumName!: string;\n image?: string;\n isAvatar!: boolean;\n article?: string;\n pointsPreference?: string;\n maximumPoints!: number;\n bucket!: boolean;\n stomachCapacity!: number;\n liverCapacity!: number;\n spleenCapacity!: number;\n classes = new Collection<AscensionClass>(this);\n}\n\nexport class AscensionClass {\n id!: number;\n name!: string;\n enumName!: string;\n image?: string;\n primeStatIndex!: number;\n path?: Path;\n stun?: string;\n stomachCapacity?: number;\n liverCapacity?: number;\n spleenCapacity?: number;\n}\n\nexport class Equipment {\n // PK is a FK to Item. Access the id via equipment.item.id\n item!: Ref<Item>;\n power!: number;\n musRequirement!: number;\n mysRequirement!: number;\n moxRequirement!: number;\n type?: string;\n hands?: number;\n}\n\nexport class Consumable {\n // PK is a FK to Item. Access the id via consumable.item.id\n item!: Ref<Item>;\n stomach!: number;\n liver!: number;\n spleen!: number;\n levelRequirement!: number;\n quality?: ConsumableQuality;\n adventureRange!: string;\n adventures!: number;\n muscle!: number;\n muscleRange!: string;\n mysticality!: number;\n mysticalityRange!: string;\n moxie!: number;\n moxieRange!: string;\n notes?: string;\n}\n\nexport class Concoction {\n id!: number;\n item!: Item;\n methods!: string[];\n comment?: string;\n ingredients = new Collection<Ingredient>(this);\n}\n\nexport class Outfit {\n id!: number;\n name!: string;\n image!: string;\n equipment = new Collection<Item>(this);\n treats = new Collection<OutfitTreat>(this);\n}\n\nexport class FoldGroup {\n id!: number;\n damage!: number;\n items = new Collection<Item>(this);\n}\n\nexport class ZapGroup {\n id!: number;\n items = new Collection<Item>(this);\n}\n\n// Junction entities (surrogate autoincrement id)\n\nexport class MonsterDrop {\n id!: number;\n monster!: Monster;\n item!: Item;\n rate!: number;\n category?: MonsterDropCategory;\n}\n\nexport class NativeMonster {\n id!: number;\n location!: Location;\n monster!: Monster;\n weight!: number;\n rejection!: number;\n parity?: number;\n}\n\nexport class Ingredient {\n id!: number;\n concoction!: Concoction;\n item!: Item;\n quantity!: number;\n}\n\nexport class OutfitTreat {\n id!: number;\n outfit!: Outfit;\n item!: Item;\n chance!: number;\n}\n\n// Modifier entities (FK-as-PK)\n\nexport class ItemModifiers {\n item!: Ref<Item>;\n modifiers!: Record<string, string>;\n}\n\nexport class EffectModifiers {\n effect!: Ref<Effect>;\n modifiers!: Record<string, string>;\n}\n\nexport class SkillModifiers {\n skill!: Ref<Skill>;\n modifiers!: Record<string, string>;\n}\n\nexport class FamiliarModifiers {\n familiar!: Ref<Familiar>;\n modifiers!: Record<string, string>;\n}\n\nexport class Meta {\n id!: number;\n lastUpdate!: Date;\n lastRevision!: number;\n}\n\n// ---- EntitySchema Definitions ---------------------------------------------\n\nexport const ItemSchema = new EntitySchema<Item>({\n class: Item,\n tableName: \"items\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\", index: true },\n descid: { type: \"integer\", nullable: true, unique: true },\n image: { type: \"string\" },\n uses: { type: \"json\" },\n quest: { type: \"boolean\" },\n gift: { type: \"boolean\" },\n tradeable: { type: \"boolean\" },\n discardable: { type: \"boolean\" },\n autosell: { type: \"integer\" },\n plural: { type: \"string\", nullable: true },\n ambiguous: { type: \"boolean\", default: false },\n equipment: {\n kind: \"1:1\",\n entity: () => Equipment,\n mappedBy: \"item\",\n nullable: true,\n },\n consumable: {\n kind: \"1:1\",\n entity: () => Consumable,\n mappedBy: \"item\",\n nullable: true,\n },\n modifiers: {\n kind: \"1:1\",\n entity: () => ItemModifiers,\n mappedBy: \"item\",\n nullable: true,\n },\n monsterDrops: { kind: \"1:m\", entity: () => MonsterDrop, mappedBy: \"item\" },\n outfitEquipment: {\n kind: \"m:n\",\n entity: () => Outfit,\n pivotTable: \"outfitEquipment\",\n joinColumn: \"equipment\",\n inverseJoinColumn: \"outfit\",\n },\n outfitTreats: {\n kind: \"1:m\",\n entity: () => OutfitTreat,\n mappedBy: \"item\",\n },\n ingredients: {\n kind: \"1:m\",\n entity: () => Ingredient,\n mappedBy: \"item\",\n },\n foldGroups: {\n kind: \"m:n\",\n entity: () => FoldGroup,\n pivotTable: \"foldables\",\n joinColumn: \"item\",\n inverseJoinColumn: \"foldGroup\",\n },\n zapGroups: {\n kind: \"m:n\",\n entity: () => ZapGroup,\n pivotTable: \"zapGroupItems\",\n joinColumn: \"item\",\n inverseJoinColumn: \"zapGroup\",\n },\n },\n});\n\nexport const EffectSchema = new EntitySchema<Effect>({\n class: Effect,\n tableName: \"effects\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n descid: { type: \"string\", nullable: true, unique: true },\n image: { type: \"string\" },\n quality: { type: \"string\" },\n nohookah: { type: \"boolean\" },\n nopvp: { type: \"boolean\" },\n noremove: { type: \"boolean\" },\n song: { type: \"boolean\" },\n actions: { type: \"json\" },\n ambiguous: { type: \"boolean\", default: false },\n modifiers: {\n kind: \"1:1\",\n entity: () => EffectModifiers,\n mappedBy: \"effect\",\n nullable: true,\n },\n },\n});\n\nexport const SkillSchema = new EntitySchema<Skill>({\n class: Skill,\n tableName: \"skills\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n tags: { type: \"json\" },\n mpCost: { type: \"integer\" },\n duration: { type: \"integer\" },\n guildLevel: { type: \"integer\", nullable: true },\n maxLevel: { type: \"integer\", nullable: true },\n permable: { type: \"boolean\" },\n ambiguous: { type: \"boolean\", default: false },\n modifiers: {\n kind: \"1:1\",\n entity: () => SkillModifiers,\n mappedBy: \"skill\",\n nullable: true,\n },\n },\n});\n\nexport const FamiliarSchema = new EntitySchema<Familiar>({\n class: Familiar,\n tableName: \"familiars\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n categories: { type: \"json\" },\n larva: {\n kind: \"m:1\",\n entity: () => Item,\n nullable: true,\n fieldName: \"larva\",\n },\n equipment: {\n kind: \"m:1\",\n entity: () => Item,\n nullable: true,\n fieldName: \"equipment\",\n },\n cageMatch: { type: \"integer\" },\n scavengerHunt: { type: \"integer\" },\n obstacleCourse: { type: \"integer\" },\n hideAndSeek: { type: \"integer\" },\n attributes: { type: \"json\" },\n modifiers: {\n kind: \"1:1\",\n entity: () => FamiliarModifiers,\n mappedBy: \"familiar\",\n nullable: true,\n },\n },\n});\n\nexport const MonsterSchema = new EntitySchema<Monster>({\n class: Monster,\n tableName: \"monsters\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"json\" },\n ambiguous: { type: \"boolean\", default: false },\n article: { type: \"string\" },\n attack: { type: \"string\" },\n boss: { type: \"boolean\" },\n defence: { type: \"string\" },\n drippy: { type: \"boolean\" },\n element: { type: \"string\", nullable: true },\n elementalAttack: { type: \"string\", nullable: true },\n elementalDefence: { type: \"string\", nullable: true },\n elementalResistance: { type: \"string\" },\n experience: { type: \"string\", nullable: true },\n free: { type: \"boolean\" },\n ghost: { type: \"boolean\" },\n groupSize: { type: \"integer\" },\n hp: { type: \"string\" },\n initiative: { type: \"string\" },\n itemBlockChance: { type: \"float\" },\n lucky: { type: \"boolean\" },\n manuel: { type: \"string\", nullable: true },\n meat: { type: \"float\", nullable: true },\n meatExpression: { type: \"string\", nullable: true },\n monsterLevelMultiplier: { type: \"string\" },\n nobanish: { type: \"boolean\" },\n nocopy: { type: \"boolean\" },\n nomanuel: { type: \"boolean\" },\n nowander: { type: \"boolean\" },\n nowish: { type: \"boolean\" },\n phylum: { type: \"string\" },\n physicalResistance: { type: \"string\" },\n poison: { type: \"string\", nullable: true },\n scaling: { type: \"string\" },\n scalingCap: { type: \"string\" },\n scalingFloor: { type: \"string\" },\n skeleton: { type: \"boolean\" },\n skillBlockChance: { type: \"float\" },\n snake: { type: \"boolean\" },\n spellBlockChance: { type: \"float\" },\n sprinkles: { type: \"json\" },\n superlikely: { type: \"boolean\" },\n ultrarare: { type: \"boolean\" },\n wanderer: { type: \"boolean\" },\n wiki: { type: \"string\", nullable: true },\n wish: { type: \"boolean\" },\n zombie: { type: \"boolean\" },\n drops: { kind: \"1:m\", entity: () => MonsterDrop, mappedBy: \"monster\" },\n nativeLocations: {\n kind: \"1:m\",\n entity: () => NativeMonster,\n mappedBy: \"monster\",\n },\n },\n});\n\nexport const LocationSchema = new EntitySchema<Location>({\n class: Location,\n tableName: \"locations\",\n properties: {\n name: { type: \"string\", primary: true },\n id: { type: \"integer\", nullable: true },\n zone: { type: \"string\" },\n url: { type: \"string\" },\n difficulty: { type: \"string\" },\n environment: { type: \"string\" },\n statRequirement: { type: \"integer\" },\n waterLevel: { type: \"integer\", nullable: true },\n overdrunk: { type: \"boolean\" },\n nowander: { type: \"boolean\" },\n combatRate: { type: \"integer\" },\n nativeMonsters: {\n kind: \"1:m\",\n entity: () => NativeMonster,\n mappedBy: \"location\",\n },\n },\n});\n\nexport const PathSchema = new EntitySchema<Path>({\n class: Path,\n tableName: \"paths\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n enumName: { type: \"string\" },\n image: { type: \"string\", nullable: true, unique: true },\n isAvatar: { type: \"boolean\" },\n article: { type: \"string\", nullable: true },\n pointsPreference: { type: \"string\", nullable: true },\n maximumPoints: { type: \"integer\" },\n bucket: { type: \"boolean\" },\n stomachCapacity: { type: \"integer\" },\n liverCapacity: { type: \"integer\" },\n spleenCapacity: { type: \"integer\" },\n classes: { kind: \"1:m\", entity: () => AscensionClass, mappedBy: \"path\" },\n },\n});\n\nexport const AscensionClassSchema = new EntitySchema<AscensionClass>({\n class: AscensionClass,\n tableName: \"classes\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n enumName: { type: \"string\" },\n image: { type: \"string\", nullable: true },\n primeStatIndex: { type: \"integer\" },\n path: {\n kind: \"m:1\",\n entity: () => Path,\n nullable: true,\n fieldName: \"path\",\n },\n stun: { type: \"string\", nullable: true },\n stomachCapacity: { type: \"integer\", nullable: true },\n liverCapacity: { type: \"integer\", nullable: true },\n spleenCapacity: { type: \"integer\", nullable: true },\n },\n});\n\nexport const EquipmentSchema = new EntitySchema<Equipment>({\n class: Equipment,\n tableName: \"equipment\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"id\",\n inversedBy: \"equipment\",\n },\n power: { type: \"integer\" },\n musRequirement: { type: \"integer\" },\n mysRequirement: { type: \"integer\" },\n moxRequirement: { type: \"integer\" },\n type: { type: \"string\", nullable: true },\n hands: { type: \"integer\", nullable: true },\n },\n});\n\nexport const ConsumableSchema = new EntitySchema<Consumable>({\n class: Consumable,\n tableName: \"consumables\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"id\",\n inversedBy: \"consumable\",\n },\n stomach: { type: \"integer\" },\n liver: { type: \"integer\" },\n spleen: { type: \"integer\" },\n levelRequirement: { type: \"integer\" },\n quality: { type: \"string\", nullable: true },\n adventureRange: { type: \"string\" },\n adventures: { type: \"float\" },\n muscle: { type: \"float\" },\n muscleRange: { type: \"string\" },\n mysticality: { type: \"float\" },\n mysticalityRange: { type: \"string\" },\n moxie: { type: \"float\" },\n moxieRange: { type: \"string\" },\n notes: { type: \"string\", nullable: true },\n },\n});\n\nexport const ConcoctionSchema = new EntitySchema<Concoction>({\n class: Concoction,\n tableName: \"concoctions\",\n properties: {\n id: { type: \"integer\", primary: true },\n item: { kind: \"m:1\", entity: () => Item, fieldName: \"item\" },\n methods: { type: \"json\" },\n comment: { type: \"string\", nullable: true },\n ingredients: {\n kind: \"1:m\",\n entity: () => Ingredient,\n mappedBy: \"concoction\",\n },\n },\n});\n\nexport const OutfitSchema = new EntitySchema<Outfit>({\n class: Outfit,\n tableName: \"outfits\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n equipment: {\n kind: \"m:n\",\n entity: () => Item,\n pivotTable: \"outfitEquipment\",\n joinColumn: \"outfit\",\n inverseJoinColumn: \"equipment\",\n },\n treats: { kind: \"1:m\", entity: () => OutfitTreat, mappedBy: \"outfit\" },\n },\n});\n\nexport const FoldGroupSchema = new EntitySchema<FoldGroup>({\n class: FoldGroup,\n tableName: \"foldGroups\",\n properties: {\n id: { type: \"integer\", primary: true },\n damage: { type: \"integer\" },\n items: {\n kind: \"m:n\",\n entity: () => Item,\n mappedBy: \"foldGroups\",\n },\n },\n});\n\nexport const ZapGroupSchema = new EntitySchema<ZapGroup>({\n class: ZapGroup,\n tableName: \"zapGroups\",\n properties: {\n id: { type: \"integer\", primary: true },\n items: {\n kind: \"m:n\",\n entity: () => Item,\n mappedBy: \"zapGroups\",\n },\n },\n});\n\nexport const MonsterDropSchema = new EntitySchema<MonsterDrop>({\n class: MonsterDrop,\n tableName: \"monsterDrops\",\n properties: {\n id: { type: \"integer\", primary: true },\n monster: { kind: \"m:1\", entity: () => Monster },\n item: { kind: \"m:1\", entity: () => Item },\n rate: { type: \"float\" },\n category: { type: \"string\", nullable: true },\n },\n});\n\nexport const NativeMonsterSchema = new EntitySchema<NativeMonster>({\n class: NativeMonster,\n tableName: \"nativeMonsters\",\n properties: {\n id: { type: \"integer\", primary: true },\n location: { kind: \"m:1\", entity: () => Location },\n monster: { kind: \"m:1\", entity: () => Monster },\n weight: { type: \"float\" },\n rejection: { type: \"float\" },\n parity: { type: \"integer\", nullable: true },\n },\n});\n\nexport const IngredientSchema = new EntitySchema<Ingredient>({\n class: Ingredient,\n tableName: \"ingredients\",\n properties: {\n id: { type: \"integer\", primary: true },\n concoction: { kind: \"m:1\", entity: () => Concoction },\n item: { kind: \"m:1\", entity: () => Item },\n quantity: { type: \"integer\" },\n },\n});\n\nexport const OutfitTreatSchema = new EntitySchema<OutfitTreat>({\n class: OutfitTreat,\n tableName: \"outfitTreats\",\n properties: {\n id: { type: \"integer\", primary: true },\n outfit: { kind: \"m:1\", entity: () => Outfit },\n item: { kind: \"m:1\", entity: () => Item },\n chance: { type: \"float\" },\n },\n});\n\nexport const ItemModifiersSchema = new EntitySchema<ItemModifiers>({\n class: ItemModifiers,\n tableName: \"itemModifiers\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"item\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const EffectModifiersSchema = new EntitySchema<EffectModifiers>({\n class: EffectModifiers,\n tableName: \"effectModifiers\",\n properties: {\n effect: {\n kind: \"1:1\",\n entity: () => Effect,\n primary: true,\n fieldName: \"effect\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const SkillModifiersSchema = new EntitySchema<SkillModifiers>({\n class: SkillModifiers,\n tableName: \"skillModifiers\",\n properties: {\n skill: {\n kind: \"1:1\",\n entity: () => Skill,\n primary: true,\n fieldName: \"skill\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const FamiliarModifiersSchema = new EntitySchema<FamiliarModifiers>({\n class: FamiliarModifiers,\n tableName: \"familiarModifiers\",\n properties: {\n familiar: {\n kind: \"1:1\",\n entity: () => Familiar,\n primary: true,\n fieldName: \"familiar\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const MetaSchema = new EntitySchema<Meta>({\n class: Meta,\n tableName: \"meta\",\n properties: {\n id: { type: \"integer\", primary: true, default: 1 },\n lastUpdate: { type: \"Date\" },\n lastRevision: { type: \"integer\" },\n },\n});\n\n// All schemas in dependency order for MikroORM.init({ entities })\nexport const entities = [\n ItemSchema,\n EffectSchema,\n SkillSchema,\n FamiliarSchema,\n MonsterSchema,\n LocationSchema,\n PathSchema,\n AscensionClassSchema,\n EquipmentSchema,\n ConsumableSchema,\n ConcoctionSchema,\n OutfitSchema,\n FoldGroupSchema,\n ZapGroupSchema,\n MonsterDropSchema,\n NativeMonsterSchema,\n IngredientSchema,\n OutfitTreatSchema,\n ItemModifiersSchema,\n EffectModifiersSchema,\n SkillModifiersSchema,\n FamiliarModifiersSchema,\n MetaSchema,\n];\n","import { type EntityManager, MikroORM } from \"@mikro-orm/core\";\n\nexport const DEFAULT_URL = \"https://data.loathers.net/dol.sqlite\";\nexport const ETAG_KEY = \"dol-etag\";\n\nexport abstract class BaseClient<S> {\n protected _orm?: MikroORM;\n protected readonly _strategy: S;\n\n constructor(strategy: S) {\n this._strategy = strategy;\n }\n\n get query(): EntityManager {\n if (!this._orm) throw new Error(\"Call await client.load() before querying\");\n return this._orm.em;\n }\n\n abstract load(): Promise<void>;\n\n protected async fetchDb(url: string): Promise<ArrayBuffer> {\n const response = await fetch(url);\n if (!response.ok)\n throw new Error(`Failed to fetch database: ${response.status}`);\n return response.arrayBuffer();\n }\n\n protected abstract getStoredEtag(key: string): Promise<string | null>;\n protected abstract storeEtag(key: string, etag: string): Promise<void>;\n\n protected async syncIfNeeded(\n url: string,\n key: string,\n apply: (data: ArrayBuffer) => Promise<void>,\n force = false,\n ): Promise<void> {\n const storedEtag = force ? null : await this.getStoredEtag(key);\n const head = await fetch(url, { method: \"HEAD\" });\n const remoteEtag = head.headers.get(\"etag\");\n\n if (force || storedEtag !== remoteEtag) {\n await apply(await this.fetchDb(url));\n if (remoteEtag) await this.storeEtag(key, remoteEtag);\n }\n }\n}\n"],"mappings":"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","names":["ItemUse","EffectQuality","SkillTag","FamiliarCategory","MonsterElement","MonsterDropCategory","LocationDifficulty","LocationEnvironment","ConsumableQuality"]}
|
package/dist/node.js
CHANGED
|
@@ -57,13 +57,13 @@ import {
|
|
|
57
57
|
ZapGroup,
|
|
58
58
|
ZapGroupSchema,
|
|
59
59
|
entities
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-CGQXM66N.js";
|
|
61
61
|
|
|
62
62
|
// src/node.ts
|
|
63
63
|
import { existsSync } from "fs";
|
|
64
64
|
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
65
|
-
import { homedir } from "os";
|
|
66
65
|
import { join } from "path";
|
|
66
|
+
import envPaths from "env-paths";
|
|
67
67
|
import { SqlMikroORM, SqliteDriver, NodeSqliteDialect } from "@mikro-orm/sql";
|
|
68
68
|
var Client = class extends BaseClient {
|
|
69
69
|
constructor(strategy = {}) {
|
|
@@ -83,13 +83,18 @@ var Client = class extends BaseClient {
|
|
|
83
83
|
default:
|
|
84
84
|
case "url": {
|
|
85
85
|
const { url = DEFAULT_URL, force = false } = strategy;
|
|
86
|
-
const cacheDir =
|
|
86
|
+
const cacheDir = envPaths("data-of-loathing").cache;
|
|
87
87
|
const dbPath = join(cacheDir, "dol.sqlite");
|
|
88
88
|
const etagPath = join(cacheDir, "etag");
|
|
89
89
|
await mkdir(cacheDir, { recursive: true });
|
|
90
|
-
await this.syncIfNeeded(
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
await this.syncIfNeeded(
|
|
91
|
+
url,
|
|
92
|
+
etagPath,
|
|
93
|
+
async (data) => {
|
|
94
|
+
await writeFile(dbPath, Buffer.from(data));
|
|
95
|
+
},
|
|
96
|
+
force
|
|
97
|
+
);
|
|
93
98
|
return dbPath;
|
|
94
99
|
}
|
|
95
100
|
}
|
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/node.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/node.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport envPaths from \"env-paths\";\nimport { SqlMikroORM, SqliteDriver, NodeSqliteDialect } from \"@mikro-orm/sql\";\nimport { entities } from \"./schema.js\";\nimport { BaseClient, DEFAULT_URL } from \"./BaseClient.js\";\n\nexport type Strategy =\n | { strategy?: \"url\"; url?: string; force?: boolean }\n | { strategy: \"local\"; path: string };\n\nexport class Client extends BaseClient<Strategy> {\n constructor(strategy: Strategy = {}) {\n super(strategy);\n }\n\n protected async getStoredEtag(key: string): Promise<string | null> {\n return existsSync(key) ? readFile(key, \"utf-8\") : null;\n }\n\n protected async storeEtag(key: string, etag: string): Promise<void> {\n await writeFile(key, etag, \"utf-8\");\n }\n\n private async resolveDbPath(): Promise<string> {\n const strategy = this._strategy;\n switch (strategy.strategy) {\n case \"local\":\n return strategy.path;\n\n default:\n case \"url\": {\n const { url = DEFAULT_URL, force = false } = strategy;\n\n const cacheDir = envPaths(\"data-of-loathing\").cache;\n const dbPath = join(cacheDir, \"dol.sqlite\");\n const etagPath = join(cacheDir, \"etag\");\n await mkdir(cacheDir, { recursive: true });\n\n await this.syncIfNeeded(\n url,\n etagPath,\n async (data) => {\n await writeFile(dbPath, Buffer.from(data));\n },\n force,\n );\n\n return dbPath;\n }\n }\n }\n\n async load(): Promise<void> {\n await this._orm?.close();\n const path = await this.resolveDbPath();\n this._orm = await SqlMikroORM.init({\n driver: SqliteDriver,\n driverOptions: new NodeSqliteDialect(path),\n dbName: path,\n entities,\n allowGlobalContext: true,\n });\n }\n}\n\nexport function createClient(strategy: Strategy = {}): Client {\n return new Client(strategy);\n}\n\nexport * from \"./schema.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,YAAY;AACrB,OAAO,cAAc;AACrB,SAAS,aAAa,cAAc,yBAAyB;AAQtD,IAAM,SAAN,cAAqB,WAAqB;AAAA,EAC/C,YAAY,WAAqB,CAAC,GAAG;AACnC,UAAM,QAAQ;AAAA,EAChB;AAAA,EAEA,MAAgB,cAAc,KAAqC;AACjE,WAAO,WAAW,GAAG,IAAI,SAAS,KAAK,OAAO,IAAI;AAAA,EACpD;AAAA,EAEA,MAAgB,UAAU,KAAa,MAA6B;AAClE,UAAM,UAAU,KAAK,MAAM,OAAO;AAAA,EACpC;AAAA,EAEA,MAAc,gBAAiC;AAC7C,UAAM,WAAW,KAAK;AACtB,YAAQ,SAAS,UAAU;AAAA,MACzB,KAAK;AACH,eAAO,SAAS;AAAA,MAElB;AAAA,MACA,KAAK,OAAO;AACV,cAAM,EAAE,MAAM,aAAa,QAAQ,MAAM,IAAI;AAE7C,cAAM,WAAW,SAAS,kBAAkB,EAAE;AAC9C,cAAM,SAAS,KAAK,UAAU,YAAY;AAC1C,cAAM,WAAW,KAAK,UAAU,MAAM;AACtC,cAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAEzC,cAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO,SAAS;AACd,kBAAM,UAAU,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,UAC3C;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,MAAM,MAAM;AACvB,UAAM,OAAO,MAAM,KAAK,cAAc;AACtC,SAAK,OAAO,MAAM,YAAY,KAAK;AAAA,MACjC,QAAQ;AAAA,MACR,eAAe,IAAI,kBAAkB,IAAI;AAAA,MACzC,QAAQ;AAAA,MACR;AAAA,MACA,oBAAoB;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,aAAa,WAAqB,CAAC,GAAW;AAC5D,SAAO,IAAI,OAAO,QAAQ;AAC5B;","names":[]}
|
package/dist/vite.d.ts
CHANGED
package/dist/vite.js
CHANGED
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vite.ts"],"sourcesContent":["import { nodePolyfills } from \"vite-plugin-node-polyfills\";\nimport type { Plugin, PluginOption } from \"vite\";\n\nexport default function dol({
|
|
1
|
+
{"version":3,"sources":["../src/vite.ts"],"sourcesContent":["import { nodePolyfills } from \"vite-plugin-node-polyfills\";\nimport type { Plugin, PluginOption } from \"vite\";\n\nexport default function dol({\n coi = false,\n}: { coi?: boolean } = {}): PluginOption[] {\n const plugin: Plugin = {\n name: \"data-of-loathing\",\n config() {\n return {\n optimizeDeps: {\n exclude: [\"data-of-loathing\", \"@sqlite.org/sqlite-wasm\"],\n },\n };\n },\n };\n\n if (coi) {\n plugin.configureServer = (server) => {\n server.middlewares.use((_, res, next) => {\n res.setHeader(\"Cross-Origin-Embedder-Policy\", \"credentialless\");\n res.setHeader(\"Cross-Origin-Opener-Policy\", \"same-origin\");\n next();\n });\n };\n }\n\n return [nodePolyfills({ include: [\"buffer\"] }), plugin];\n}\n"],"mappings":";AAAA,SAAS,qBAAqB;AAGf,SAAR,IAAqB;AAAA,EAC1B,MAAM;AACR,IAAuB,CAAC,GAAmB;AACzC,QAAM,SAAiB;AAAA,IACrB,MAAM;AAAA,IACN,SAAS;AACP,aAAO;AAAA,QACL,cAAc;AAAA,UACZ,SAAS,CAAC,oBAAoB,yBAAyB;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK;AACP,WAAO,kBAAkB,CAAC,WAAW;AACnC,aAAO,YAAY,IAAI,CAAC,GAAG,KAAK,SAAS;AACvC,YAAI,UAAU,gCAAgC,gBAAgB;AAC9D,YAAI,UAAU,8BAA8B,aAAa;AACzD,aAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,CAAC,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM;AACxD;","names":[]}
|
package/dist/workers/memory.js
CHANGED
|
@@ -5,7 +5,11 @@ var sqlite3;
|
|
|
5
5
|
self.onmessage = async (event) => {
|
|
6
6
|
const { type, id } = event.data;
|
|
7
7
|
try {
|
|
8
|
-
sqlite3 ??= await sqlite3InitModule(
|
|
8
|
+
sqlite3 ??= await sqlite3InitModule({
|
|
9
|
+
printErr: (msg) => {
|
|
10
|
+
if (!msg.includes("OPFS")) console.error(msg);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
9
13
|
switch (type) {
|
|
10
14
|
case "load": {
|
|
11
15
|
const { buffer } = event.data;
|
|
@@ -24,7 +28,12 @@ self.onmessage = async (event) => {
|
|
|
24
28
|
}
|
|
25
29
|
case "exec": {
|
|
26
30
|
const rows = [];
|
|
27
|
-
db.exec({
|
|
31
|
+
db.exec({
|
|
32
|
+
sql: event.data.sql,
|
|
33
|
+
bind: event.data.bind,
|
|
34
|
+
rowMode: "object",
|
|
35
|
+
resultRows: rows
|
|
36
|
+
});
|
|
28
37
|
self.postMessage({ id, type: "exec", rows });
|
|
29
38
|
break;
|
|
30
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workers/memory.ts"],"sourcesContent":["import sqlite3InitModule, {
|
|
1
|
+
{"version":3,"sources":["../../src/workers/memory.ts"],"sourcesContent":["import sqlite3InitModule, {\n BindingSpec,\n Database,\n Sqlite3Static,\n SqlValue,\n} from \"@sqlite.org/sqlite-wasm\";\n\ntype WorkerMessage =\n | { type: \"load\"; id: string; buffer: ArrayBuffer }\n | { type: \"exec\"; id: string; sql: string; bind: BindingSpec };\n\nlet db: Database;\nlet sqlite3: Sqlite3Static | undefined;\n\nself.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const { type, id } = event.data;\n try {\n // @ts-expect-error - printErr is supported at runtime but not in the type definition\n sqlite3 ??= await sqlite3InitModule({\n printErr: (msg: string) => {\n if (!msg.includes(\"OPFS\")) console.error(msg);\n },\n });\n\n switch (type) {\n case \"load\": {\n const { buffer } = event.data;\n const p = sqlite3.wasm.allocFromTypedArray(new Uint8Array(buffer));\n db = new sqlite3.oo1.DB();\n sqlite3.capi.sqlite3_deserialize(\n db.pointer!,\n \"main\",\n p,\n buffer.byteLength,\n buffer.byteLength,\n sqlite3.capi.SQLITE_DESERIALIZE_FREEONCLOSE |\n sqlite3.capi.SQLITE_DESERIALIZE_READONLY,\n );\n self.postMessage({ id, type: \"loaded\" });\n break;\n }\n case \"exec\": {\n const rows: Record<string, SqlValue>[] = [];\n db.exec({\n sql: event.data.sql,\n bind: event.data.bind,\n rowMode: \"object\",\n resultRows: rows,\n });\n self.postMessage({ id, type: \"exec\", rows });\n break;\n }\n }\n } catch (e) {\n self.postMessage({ id, type: \"error\", error: String(e) });\n }\n};\n"],"mappings":";AAAA,OAAO,uBAKA;AAMP,IAAI;AACJ,IAAI;AAEJ,KAAK,YAAY,OAAO,UAAuC;AAC7D,QAAM,EAAE,MAAM,GAAG,IAAI,MAAM;AAC3B,MAAI;AAEF,gBAAY,MAAM,kBAAkB;AAAA,MAClC,UAAU,CAAC,QAAgB;AACzB,YAAI,CAAC,IAAI,SAAS,MAAM,EAAG,SAAQ,MAAM,GAAG;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ;AACX,cAAM,EAAE,OAAO,IAAI,MAAM;AACzB,cAAM,IAAI,QAAQ,KAAK,oBAAoB,IAAI,WAAW,MAAM,CAAC;AACjE,aAAK,IAAI,QAAQ,IAAI,GAAG;AACxB,gBAAQ,KAAK;AAAA,UACX,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ,KAAK,iCACX,QAAQ,KAAK;AAAA,QACjB;AACA,aAAK,YAAY,EAAE,IAAI,MAAM,SAAS,CAAC;AACvC;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,OAAmC,CAAC;AAC1C,WAAG,KAAK;AAAA,UACN,KAAK,MAAM,KAAK;AAAA,UAChB,MAAM,MAAM,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,QACd,CAAC;AACD,aAAK,YAAY,EAAE,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,SAAK,YAAY,EAAE,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,EAC1D;AACF;","names":[]}
|
package/dist/workers/opfs.js
CHANGED
|
@@ -14,7 +14,12 @@ self.onmessage = async (event) => {
|
|
|
14
14
|
}
|
|
15
15
|
case "exec": {
|
|
16
16
|
const rows = [];
|
|
17
|
-
db.exec({
|
|
17
|
+
db.exec({
|
|
18
|
+
sql: event.data.sql,
|
|
19
|
+
bind: event.data.bind,
|
|
20
|
+
rowMode: "object",
|
|
21
|
+
resultRows: rows
|
|
22
|
+
});
|
|
18
23
|
self.postMessage({ id, type: "exec", rows });
|
|
19
24
|
break;
|
|
20
25
|
}
|
package/dist/workers/opfs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workers/opfs.ts"],"sourcesContent":["import sqlite3InitModule, {
|
|
1
|
+
{"version":3,"sources":["../../src/workers/opfs.ts"],"sourcesContent":["import sqlite3InitModule, {\n BindingSpec,\n Database,\n Sqlite3Static,\n SqlValue,\n} from \"@sqlite.org/sqlite-wasm\";\n\ntype WorkerMessage =\n | { type: \"load\"; id: string; filename: string }\n | { type: \"exec\"; id: string; sql: string; bind: BindingSpec };\n\nlet db: Database;\nlet sqlite3: Sqlite3Static | undefined;\n\nself.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const { type, id } = event.data;\n try {\n sqlite3 ??= await sqlite3InitModule();\n\n switch (type) {\n case \"load\": {\n db = new sqlite3.oo1.OpfsDb(event.data.filename);\n self.postMessage({ id, type: \"loaded\" });\n break;\n }\n case \"exec\": {\n const rows: Record<string, SqlValue>[] = [];\n db!.exec({\n sql: event.data.sql,\n bind: event.data.bind,\n rowMode: \"object\",\n resultRows: rows,\n });\n self.postMessage({ id, type: \"exec\", rows });\n break;\n }\n }\n } catch (e) {\n self.postMessage({ id, type: \"error\", error: String(e) });\n }\n};\n"],"mappings":";AAAA,OAAO,uBAKA;AAMP,IAAI;AACJ,IAAI;AAEJ,KAAK,YAAY,OAAO,UAAuC;AAC7D,QAAM,EAAE,MAAM,GAAG,IAAI,MAAM;AAC3B,MAAI;AACF,gBAAY,MAAM,kBAAkB;AAEpC,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ;AACX,aAAK,IAAI,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;AAC/C,aAAK,YAAY,EAAE,IAAI,MAAM,SAAS,CAAC;AACvC;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,OAAmC,CAAC;AAC1C,WAAI,KAAK;AAAA,UACP,KAAK,MAAM,KAAK;AAAA,UAChB,MAAM,MAAM,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,YAAY;AAAA,QACd,CAAC;AACD,aAAK,YAAY,EAAE,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,SAAK,YAAY,EAAE,IAAI,MAAM,SAAS,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,EAC1D;AACF;","names":[]}
|
package/dist/workers/ranged.js
CHANGED
|
@@ -134,11 +134,15 @@ function installRangedVfs(s3) {
|
|
|
134
134
|
readCache.set(pFile, cache);
|
|
135
135
|
const prefetch = syncFetchRange(url, 0, 65535);
|
|
136
136
|
if (prefetch) {
|
|
137
|
-
if (prefetch.totalSize != null)
|
|
137
|
+
if (prefetch.totalSize != null)
|
|
138
|
+
fileSizes.set(pFile, prefetch.totalSize);
|
|
138
139
|
const rawPgSize = prefetch.data.length >= 18 ? prefetch.data[16] << 8 | prefetch.data[17] : 0;
|
|
139
140
|
const pageSize = rawPgSize === 1 ? 65536 : rawPgSize || 4096;
|
|
140
141
|
for (let offset = 0; offset + pageSize <= prefetch.data.length; offset += pageSize) {
|
|
141
|
-
cache.set(
|
|
142
|
+
cache.set(
|
|
143
|
+
`${offset}:${pageSize}`,
|
|
144
|
+
prefetch.data.slice(offset, offset + pageSize)
|
|
145
|
+
);
|
|
142
146
|
}
|
|
143
147
|
}
|
|
144
148
|
if (pOutFlags) wasm.poke(pOutFlags, capi.SQLITE_OPEN_READONLY, "i32");
|
|
@@ -184,7 +188,11 @@ function installRangedVfs(s3) {
|
|
|
184
188
|
self.onmessage = async (event) => {
|
|
185
189
|
const { type, id } = event.data;
|
|
186
190
|
try {
|
|
187
|
-
sqlite3 ??= await sqlite3InitModule(
|
|
191
|
+
sqlite3 ??= await sqlite3InitModule({
|
|
192
|
+
printErr: (msg) => {
|
|
193
|
+
if (!msg.includes("OPFS")) console.error(msg);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
188
196
|
switch (type) {
|
|
189
197
|
case "load": {
|
|
190
198
|
installRangedVfs(sqlite3);
|
|
@@ -194,7 +202,12 @@ self.onmessage = async (event) => {
|
|
|
194
202
|
}
|
|
195
203
|
case "exec": {
|
|
196
204
|
const rows = [];
|
|
197
|
-
db.exec({
|
|
205
|
+
db.exec({
|
|
206
|
+
sql: event.data.sql,
|
|
207
|
+
bind: event.data.bind,
|
|
208
|
+
rowMode: "object",
|
|
209
|
+
resultRows: rows
|
|
210
|
+
});
|
|
198
211
|
self.postMessage({ id, type: "exec", rows });
|
|
199
212
|
break;
|
|
200
213
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workers/ranged.ts"],"sourcesContent":["import sqlite3InitModule, { BindingSpec, CAPI, Database, Sqlite3Result, SqlValue, type Sqlite3Static, type SQLiteStruct } from \"@sqlite.org/sqlite-wasm\";\n\ntype WorkerMessage =\n | { type: \"load\"; id: string; url: string }\n | { type: \"exec\"; id: string; sql: string; bind: BindingSpec };\n\nlet db: Database;\nlet sqlite3: Sqlite3Static | undefined;\n\nconst fileUrls = new Map<number, string>();\nconst fileSizes = new Map<number, number>();\nconst readCache = new Map<number, Map<string, Uint8Array>>();\nlet vfsInstalled = false;\n\nfunction syncFetchRange(url: string, start: number, end: number): { data: Uint8Array; totalSize: number | null } | null {\n try {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.setRequestHeader(\"Range\", `bytes=${start}-${end}`);\n xhr.send();\n if (xhr.status !== 200 && xhr.status !== 206) return null;\n const data = new Uint8Array(xhr.response);\n\n let totalSize: number | null = null;\n const contentRange = xhr.getResponseHeader(\"Content-Range\");\n if (contentRange) {\n const match = /\\/(\\d+)$/.exec(contentRange);\n if (match) totalSize = parseInt(match[1], 10);\n }\n if (totalSize === null) {\n const cl = xhr.getResponseHeader(\"Content-Length\");\n if (cl) totalSize = parseInt(cl, 10);\n }\n\n return { data, totalSize };\n } catch {\n return null;\n }\n}\n\nfunction structSizeof(capi: CAPI): number {\n const tmp = new capi.sqlite3_file();\n const size = tmp.structInfo.sizeof;\n tmp.dispose();\n return size;\n}\n\nfunction installRangedVfs(s3: Sqlite3Static): void {\n if (vfsInstalled) return;\n vfsInstalled = true;\n\n const { capi, wasm } = s3;\n\n const ioMethods = new capi.sqlite3_io_methods();\n ioMethods.iVersion = 1;\n\n const vfsStruct = new capi.sqlite3_vfs();\n vfsStruct.$iVersion = 1;\n vfsStruct.$szOsFile = structSizeof(capi);\n vfsStruct.$mxPathname = 2048;\n\n s3.vfs.installVfs({\n io: {\n struct: ioMethods,\n methods: {\n xClose(pFile: number) {\n fileUrls.delete(pFile);\n fileSizes.delete(pFile);\n readCache.delete(pFile);\n return capi.SQLITE_OK;\n },\n xRead(pFile: number, pBuf: number, iAmt: number, iOfst: number) {\n const url = fileUrls.get(pFile);\n if (!url) return capi.SQLITE_IOERR_READ;\n\n // iOfst is BigInt at runtime in WASM_BIGINT builds despite the number type\n const offset = Number(iOfst);\n const cacheKey = `${offset}:${iAmt}`;\n const cache = readCache.get(pFile);\n const cached = cache?.get(cacheKey);\n if (cached) {\n wasm.heap8u().set(cached, pBuf);\n return capi.SQLITE_OK;\n }\n\n const result = syncFetchRange(url, offset, offset + iAmt - 1);\n if (!result) return capi.SQLITE_IOERR_READ;\n\n cache?.set(cacheKey, result.data);\n\n const heap = wasm.heap8u();\n const toCopy = Math.min(result.data.length, iAmt);\n heap.set(result.data.subarray(0, toCopy), pBuf);\n if (toCopy < iAmt) {\n heap.fill(0, pBuf + toCopy, pBuf + iAmt);\n return capi.SQLITE_IOERR_SHORT_READ;\n }\n return capi.SQLITE_OK;\n },\n xWrite() { return capi.SQLITE_READONLY; },\n xTruncate() { return capi.SQLITE_READONLY; },\n xSync() { return capi.SQLITE_OK; },\n xFileSize(pFile: number, pSize: number) {\n const url = fileUrls.get(pFile);\n if (!url) return capi.SQLITE_IOERR;\n let size = fileSizes.get(pFile);\n if (size === undefined) {\n const result = syncFetchRange(url, 0, 0);\n size = result?.totalSize ?? 0;\n fileSizes.set(pFile, size);\n }\n // Write i64 as two i32s (little-endian); poke(\"i64\") requires BigInt in WASM_BIGINT mode\n wasm.poke(pSize, size >>> 0, \"i32\");\n wasm.poke(pSize + 4, Math.floor(size / 0x100000000), \"i32\");\n return capi.SQLITE_OK;\n },\n xLock() { return capi.SQLITE_OK; },\n xUnlock() { return capi.SQLITE_OK; },\n xCheckReservedLock(_pFile: number, pResOut: number) {\n wasm.poke(pResOut, 0, \"i32\");\n return capi.SQLITE_OK;\n },\n xFileControl() { return capi.SQLITE_NOTFOUND; },\n xSectorSize() { return 512 as Sqlite3Result; },\n xDeviceCharacteristics() { return capi.SQLITE_IOCAP_IMMUTABLE as Sqlite3Result; },\n },\n },\n vfs: {\n struct: vfsStruct,\n methods: {\n xOpen(_pVfs: number, zName: number, pFile: number, _flags: number, pOutFlags: number) {\n const url = zName ? (wasm.cstrToJs(zName) ?? \"\") : \"\";\n const fileObj = new capi.sqlite3_file(pFile);\n fileObj.$pMethods = ioMethods.pointer;\n fileUrls.set(pFile, url);\n const cache = new Map<string, Uint8Array>();\n readCache.set(pFile, cache);\n\n // Pre-fetch first 64KB to warm cache with header + early B-tree pages\n const prefetch = syncFetchRange(url, 0, 65535);\n if (prefetch) {\n if (prefetch.totalSize != null) fileSizes.set(pFile, prefetch.totalSize);\n // Detect page size from SQLite header bytes 16-17 (big-endian); value of 1 means 65536\n const rawPgSize = prefetch.data.length >= 18\n ? ((prefetch.data[16] << 8) | prefetch.data[17])\n : 0;\n const pageSize = rawPgSize === 1 ? 65536 : (rawPgSize || 4096);\n for (let offset = 0; offset + pageSize <= prefetch.data.length; offset += pageSize) {\n cache.set(`${offset}:${pageSize}`, prefetch.data.slice(offset, offset + pageSize));\n }\n }\n\n if (pOutFlags) wasm.poke(pOutFlags, capi.SQLITE_OPEN_READONLY, \"i32\");\n return capi.SQLITE_OK;\n },\n xDelete() { return capi.SQLITE_IOERR_DELETE; },\n xAccess(_pVfs: number, _zName: number, _flags: number, pResOut: number) {\n wasm.poke(pResOut, 1, \"i32\");\n return capi.SQLITE_OK;\n },\n xFullPathname(_pVfs: number, zName: number, nOut: number, zOut: number) {\n const name = wasm.cstrToJs(zName) ?? \"\";\n const bytes = new TextEncoder().encode(name + \"\\0\");\n if (bytes.length > nOut) return capi.SQLITE_CANTOPEN;\n wasm.heap8u().set(bytes, zOut);\n return capi.SQLITE_OK;\n },\n xRandomness(_pVfs: number, nByte: number, zOut: number) {\n const buf = new Uint8Array(nByte);\n crypto.getRandomValues(buf);\n wasm.heap8u().set(buf, zOut);\n return nByte as Sqlite3Result;\n },\n xSleep() { return capi.SQLITE_OK; },\n xCurrentTime(_pVfs: number, pTimeOut: number) {\n wasm.poke(pTimeOut, Date.now() / 86400000 + 2440587.5, \"f64\");\n return capi.SQLITE_OK;\n },\n xGetLastError(_pVfs: number, nBuf: number, zBuf: number) {\n if (nBuf > 0) wasm.poke(zBuf, 0, \"i8\");\n return 0;\n },\n },\n name: \"ranged\",\n asDefault: false,\n },\n });\n}\n\nself.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const { type, id } = event.data;\n try {\n sqlite3 ??= await sqlite3InitModule();\n\n switch (type) {\n case \"load\": {\n installRangedVfs(sqlite3);\n db = new sqlite3.oo1.DB(event.data.url, \"r\", \"ranged\");\n self.postMessage({ id, type: \"loaded\" });\n break;\n }\n case \"exec\": {\n const rows: Record<string, SqlValue>[] = [];\n db!.exec({ sql: event.data.sql, bind: event.data.bind, rowMode: \"object\", resultRows: rows });\n self.postMessage({ id, type: \"exec\", rows });\n break;\n }\n }\n } catch (e) {\n self.postMessage({ id, type: \"error\", error: String(e) });\n }\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/workers/ranged.ts"],"sourcesContent":["import sqlite3InitModule, {\n BindingSpec,\n CAPI,\n Database,\n Sqlite3Result,\n SqlValue,\n type Sqlite3Static,\n type SQLiteStruct,\n} from \"@sqlite.org/sqlite-wasm\";\n\ntype WorkerMessage =\n | { type: \"load\"; id: string; url: string }\n | { type: \"exec\"; id: string; sql: string; bind: BindingSpec };\n\nlet db: Database;\nlet sqlite3: Sqlite3Static | undefined;\n\nconst fileUrls = new Map<number, string>();\nconst fileSizes = new Map<number, number>();\nconst readCache = new Map<number, Map<string, Uint8Array>>();\nlet vfsInstalled = false;\n\nfunction syncFetchRange(\n url: string,\n start: number,\n end: number,\n): { data: Uint8Array; totalSize: number | null } | null {\n try {\n const xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.setRequestHeader(\"Range\", `bytes=${start}-${end}`);\n xhr.send();\n if (xhr.status !== 200 && xhr.status !== 206) return null;\n const data = new Uint8Array(xhr.response);\n\n let totalSize: number | null = null;\n const contentRange = xhr.getResponseHeader(\"Content-Range\");\n if (contentRange) {\n const match = /\\/(\\d+)$/.exec(contentRange);\n if (match) totalSize = parseInt(match[1], 10);\n }\n if (totalSize === null) {\n const cl = xhr.getResponseHeader(\"Content-Length\");\n if (cl) totalSize = parseInt(cl, 10);\n }\n\n return { data, totalSize };\n } catch {\n return null;\n }\n}\n\nfunction structSizeof(capi: CAPI): number {\n const tmp = new capi.sqlite3_file();\n const size = tmp.structInfo.sizeof;\n tmp.dispose();\n return size;\n}\n\nfunction installRangedVfs(s3: Sqlite3Static): void {\n if (vfsInstalled) return;\n vfsInstalled = true;\n\n const { capi, wasm } = s3;\n\n const ioMethods = new capi.sqlite3_io_methods();\n ioMethods.iVersion = 1;\n\n const vfsStruct = new capi.sqlite3_vfs();\n vfsStruct.$iVersion = 1;\n vfsStruct.$szOsFile = structSizeof(capi);\n vfsStruct.$mxPathname = 2048;\n\n s3.vfs.installVfs({\n io: {\n struct: ioMethods,\n methods: {\n xClose(pFile: number) {\n fileUrls.delete(pFile);\n fileSizes.delete(pFile);\n readCache.delete(pFile);\n return capi.SQLITE_OK;\n },\n xRead(pFile: number, pBuf: number, iAmt: number, iOfst: number) {\n const url = fileUrls.get(pFile);\n if (!url) return capi.SQLITE_IOERR_READ;\n\n // iOfst is BigInt at runtime in WASM_BIGINT builds despite the number type\n const offset = Number(iOfst);\n const cacheKey = `${offset}:${iAmt}`;\n const cache = readCache.get(pFile);\n const cached = cache?.get(cacheKey);\n if (cached) {\n wasm.heap8u().set(cached, pBuf);\n return capi.SQLITE_OK;\n }\n\n const result = syncFetchRange(url, offset, offset + iAmt - 1);\n if (!result) return capi.SQLITE_IOERR_READ;\n\n cache?.set(cacheKey, result.data);\n\n const heap = wasm.heap8u();\n const toCopy = Math.min(result.data.length, iAmt);\n heap.set(result.data.subarray(0, toCopy), pBuf);\n if (toCopy < iAmt) {\n heap.fill(0, pBuf + toCopy, pBuf + iAmt);\n return capi.SQLITE_IOERR_SHORT_READ;\n }\n return capi.SQLITE_OK;\n },\n xWrite() {\n return capi.SQLITE_READONLY;\n },\n xTruncate() {\n return capi.SQLITE_READONLY;\n },\n xSync() {\n return capi.SQLITE_OK;\n },\n xFileSize(pFile: number, pSize: number) {\n const url = fileUrls.get(pFile);\n if (!url) return capi.SQLITE_IOERR;\n let size = fileSizes.get(pFile);\n if (size === undefined) {\n const result = syncFetchRange(url, 0, 0);\n size = result?.totalSize ?? 0;\n fileSizes.set(pFile, size);\n }\n // Write i64 as two i32s (little-endian); poke(\"i64\") requires BigInt in WASM_BIGINT mode\n wasm.poke(pSize, size >>> 0, \"i32\");\n wasm.poke(pSize + 4, Math.floor(size / 0x100000000), \"i32\");\n return capi.SQLITE_OK;\n },\n xLock() {\n return capi.SQLITE_OK;\n },\n xUnlock() {\n return capi.SQLITE_OK;\n },\n xCheckReservedLock(_pFile: number, pResOut: number) {\n wasm.poke(pResOut, 0, \"i32\");\n return capi.SQLITE_OK;\n },\n xFileControl() {\n return capi.SQLITE_NOTFOUND;\n },\n xSectorSize() {\n return 512 as Sqlite3Result;\n },\n xDeviceCharacteristics() {\n return capi.SQLITE_IOCAP_IMMUTABLE as Sqlite3Result;\n },\n },\n },\n vfs: {\n struct: vfsStruct,\n methods: {\n xOpen(\n _pVfs: number,\n zName: number,\n pFile: number,\n _flags: number,\n pOutFlags: number,\n ) {\n const url = zName ? (wasm.cstrToJs(zName) ?? \"\") : \"\";\n const fileObj = new capi.sqlite3_file(pFile);\n fileObj.$pMethods = ioMethods.pointer;\n fileUrls.set(pFile, url);\n const cache = new Map<string, Uint8Array>();\n readCache.set(pFile, cache);\n\n // Pre-fetch first 64KB to warm cache with header + early B-tree pages\n const prefetch = syncFetchRange(url, 0, 65535);\n if (prefetch) {\n if (prefetch.totalSize != null)\n fileSizes.set(pFile, prefetch.totalSize);\n // Detect page size from SQLite header bytes 16-17 (big-endian); value of 1 means 65536\n const rawPgSize =\n prefetch.data.length >= 18\n ? (prefetch.data[16] << 8) | prefetch.data[17]\n : 0;\n const pageSize = rawPgSize === 1 ? 65536 : rawPgSize || 4096;\n for (\n let offset = 0;\n offset + pageSize <= prefetch.data.length;\n offset += pageSize\n ) {\n cache.set(\n `${offset}:${pageSize}`,\n prefetch.data.slice(offset, offset + pageSize),\n );\n }\n }\n\n if (pOutFlags) wasm.poke(pOutFlags, capi.SQLITE_OPEN_READONLY, \"i32\");\n return capi.SQLITE_OK;\n },\n xDelete() {\n return capi.SQLITE_IOERR_DELETE;\n },\n xAccess(\n _pVfs: number,\n _zName: number,\n _flags: number,\n pResOut: number,\n ) {\n wasm.poke(pResOut, 1, \"i32\");\n return capi.SQLITE_OK;\n },\n xFullPathname(\n _pVfs: number,\n zName: number,\n nOut: number,\n zOut: number,\n ) {\n const name = wasm.cstrToJs(zName) ?? \"\";\n const bytes = new TextEncoder().encode(name + \"\\0\");\n if (bytes.length > nOut) return capi.SQLITE_CANTOPEN;\n wasm.heap8u().set(bytes, zOut);\n return capi.SQLITE_OK;\n },\n xRandomness(_pVfs: number, nByte: number, zOut: number) {\n const buf = new Uint8Array(nByte);\n crypto.getRandomValues(buf);\n wasm.heap8u().set(buf, zOut);\n return nByte as Sqlite3Result;\n },\n xSleep() {\n return capi.SQLITE_OK;\n },\n xCurrentTime(_pVfs: number, pTimeOut: number) {\n wasm.poke(pTimeOut, Date.now() / 86400000 + 2440587.5, \"f64\");\n return capi.SQLITE_OK;\n },\n xGetLastError(_pVfs: number, nBuf: number, zBuf: number) {\n if (nBuf > 0) wasm.poke(zBuf, 0, \"i8\");\n return 0;\n },\n },\n name: \"ranged\",\n asDefault: false,\n },\n });\n}\n\nself.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const { type, id } = event.data;\n try {\n // @ts-expect-error - printErr is supported at runtime but not in the type definition\n sqlite3 ??= await sqlite3InitModule({\n printErr: (msg: string) => {\n if (!msg.includes(\"OPFS\")) console.error(msg);\n },\n });\n\n switch (type) {\n case \"load\": {\n installRangedVfs(sqlite3);\n db = new sqlite3.oo1.DB(event.data.url, \"r\", \"ranged\");\n self.postMessage({ id, type: \"loaded\" });\n break;\n }\n case \"exec\": {\n const rows: Record<string, SqlValue>[] = [];\n db!.exec({\n sql: event.data.sql,\n bind: event.data.bind,\n rowMode: \"object\",\n resultRows: rows,\n });\n self.postMessage({ id, type: \"exec\", rows });\n break;\n }\n }\n } catch (e) {\n self.postMessage({ id, type: \"error\", error: String(e) });\n }\n};\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "data-of-loathing",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "yarn@4.6.0",
|
|
6
6
|
"repository": {
|
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
|
-
"build": "rm -rf dist && tsup"
|
|
34
|
+
"build": "rm -rf dist && tsup",
|
|
35
|
+
"format": "prettier --write ."
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
37
38
|
"@mikro-orm/core": "^7.0.14",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
},
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@types/node": "^25.0.2",
|
|
46
|
+
"prettier": "^3.8.3",
|
|
45
47
|
"tsup": "^8.5.1",
|
|
46
48
|
"typescript": "^5.9.3",
|
|
47
49
|
"vite": "^6.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema.ts","../src/BaseClient.ts"],"sourcesContent":["import { Collection, EntitySchema, type Ref } from \"@mikro-orm/core\";\n\n// ---- Enums ----------------------------------------------------------------\n\nexport enum ItemUse {\n Food = \"food\",\n Drink = \"drink\",\n Spleen = \"spleen\",\n Potion = \"potion\",\n Avatar = \"avatar\",\n Usable = \"usable\",\n Multiple = \"multiple\",\n Reusable = \"reusable\",\n Message = \"message\",\n Grow = \"grow\",\n PokePill = \"pokepill\",\n Hat = \"hat\",\n Weapon = \"weapon\",\n Sixgun = \"sixgun\",\n Offhand = \"offhand\",\n Container = \"container\",\n Shirt = \"shirt\",\n Pants = \"pants\",\n Accessory = \"accessory\",\n Familiar = \"familiar\",\n Sticker = \"sticker\",\n Card = \"card\",\n Folder = \"folder\",\n Bootspur = \"bootspur\",\n Bootskin = \"bootskin\",\n FoodHelper = \"food helper\",\n DrinkHelper = \"drink helper\",\n Zap = \"zap\",\n Sphere = \"sphere\",\n Guardian = \"guardian\",\n Combat = \"combat\",\n CombatReusable = \"combat reusable\",\n Single = \"single\",\n Solo = \"solo\",\n Curse = \"curse\",\n Bounty = \"bounty\",\n Package = \"package\",\n Candy = \"candy\",\n Candy1 = \"candy1\",\n Candy2 = \"candy2\",\n Chocolate = \"chocolate\",\n Fancy = \"fancy\",\n Paste = \"paste\",\n Smith = \"smith\",\n Cook = \"cook\",\n Mix = \"mix\",\n Matchable = \"matchable\",\n}\n\nexport enum EffectQuality {\n Good = \"good\",\n Neutral = \"neutral\",\n Bad = \"bad\",\n}\n\nexport enum SkillTag {\n Passive = \"passive\",\n Combat = \"combat\",\n NonCombat = \"nc\",\n Heal = \"heal\",\n ItemSummon = \"item\",\n Effect = \"effect\",\n Self = \"self\",\n Other = \"other\",\n Song = \"song\",\n Expression = \"expression\",\n Walk = \"walk\",\n}\n\nexport enum FamiliarCategory {\n Stat0 = \"stat0\",\n Stat1 = \"stat1\",\n Item0 = \"item0\",\n Item1 = \"item1\",\n Item2 = \"item2\",\n Item3 = \"item3\",\n Meat0 = \"meat0\",\n Combat0 = \"combat0\",\n Combat1 = \"combat1\",\n Drop = \"drop\",\n Block = \"block\",\n Delevel0 = \"delevel0\",\n Delevel1 = \"delevel1\",\n Hp0 = \"hp0\",\n Mp0 = \"mp0\",\n Meat1 = \"meat1\",\n Stat2 = \"stat2\",\n Other0 = \"other0\",\n Hp1 = \"hp1\",\n Mp1 = \"mp1\",\n Stat3 = \"stat3\",\n Other1 = \"other1\",\n Passive = \"passive\",\n Underwater = \"underwater\",\n Pokefam = \"pokefam\",\n Variable = \"variable\",\n}\n\nexport enum MonsterElement {\n BadSpelling = \"bad spelling\",\n Cold = \"cold\",\n Cute = \"cute\",\n Hot = \"hot\",\n Shadow = \"shadow\",\n Spooky = \"spooky\",\n Sleaze = \"sleaze\",\n Slime = \"slime\",\n Supercold = \"supercold\",\n Stench = \"stench\",\n}\n\nexport enum MonsterDropCategory {\n PickpocketOnly = \"p\",\n NoPickpocket = \"n\",\n Conditional = \"c\",\n Fixed = \"f\",\n Accordion = \"a\",\n Multi = \"m\",\n}\n\nexport enum LocationDifficulty {\n None = \"none\",\n Unknown = \"unknown\",\n Low = \"low\",\n Medium = \"medium\",\n High = \"high\",\n}\n\nexport enum LocationEnvironment {\n None = \"none\",\n Indoor = \"indoor\",\n Outdoor = \"outdoor\",\n Underground = \"underground\",\n Underwater = \"underwater\",\n}\n\nexport enum ConsumableQuality {\n None = \"none\",\n Crappy = \"crappy\",\n Decent = \"decent\",\n Good = \"good\",\n Awesome = \"awesome\",\n EPIC = \"EPIC\",\n SuperEPIC = \"super_EPIC\",\n SuperUltraEPIC = \"super_ultra_EPIC\",\n SuperUltraMegaEPIC = \"super_ultra_mega_EPIC\",\n SuperUltraMegaTurboEPIC = \"super_ultra_mega_turbo_EPIC\",\n Quest = \"quest\",\n Changing = \"changing\",\n Drippy = \"drippy\",\n}\n\n// ---- Entity Classes -------------------------------------------------------\n\nexport class Item {\n id!: number;\n name!: string;\n descid?: number;\n image!: string;\n uses!: ItemUse[];\n quest!: boolean;\n gift!: boolean;\n tradeable!: boolean;\n discardable!: boolean;\n autosell!: number;\n plural?: string;\n ambiguous!: boolean;\n // relations\n equipment?: Equipment;\n consumable?: Consumable;\n modifiers?: ItemModifiers;\n monsterDrops = new Collection<MonsterDrop>(this);\n outfitEquipment = new Collection<Outfit>(this);\n outfitTreats = new Collection<OutfitTreat>(this);\n ingredients = new Collection<Ingredient>(this);\n foldGroups = new Collection<FoldGroup>(this);\n zapGroups = new Collection<ZapGroup>(this);\n}\n\nexport class Effect {\n id!: number;\n name!: string;\n descid?: string;\n image!: string;\n quality!: EffectQuality;\n nohookah!: boolean;\n nopvp!: boolean;\n noremove!: boolean;\n song!: boolean;\n actions!: string[];\n ambiguous!: boolean;\n modifiers?: EffectModifiers;\n}\n\nexport class Skill {\n id!: number;\n name!: string;\n image!: string;\n tags!: SkillTag[];\n mpCost!: number;\n duration!: number;\n guildLevel?: number;\n maxLevel?: number;\n permable!: boolean;\n ambiguous!: boolean;\n modifiers?: SkillModifiers;\n}\n\nexport class Familiar {\n id!: number;\n name!: string;\n image!: string;\n categories!: FamiliarCategory[];\n larva?: Item;\n equipment?: Item;\n cageMatch!: number;\n scavengerHunt!: number;\n obstacleCourse!: number;\n hideAndSeek!: number;\n attributes!: string[];\n modifiers?: FamiliarModifiers;\n}\n\nexport class Monster {\n id!: number;\n name!: string;\n image!: string[];\n ambiguous!: boolean;\n article!: string;\n attack!: string;\n boss!: boolean;\n defence!: string;\n drippy!: boolean;\n element?: MonsterElement;\n elementalAttack?: MonsterElement;\n elementalDefence?: MonsterElement;\n elementalResistance!: string;\n experience?: string;\n free!: boolean;\n ghost!: boolean;\n groupSize!: number;\n hp!: string;\n initiative!: string;\n itemBlockChance!: number;\n lucky!: boolean;\n manuel?: string;\n meat?: number;\n meatExpression?: string;\n monsterLevelMultiplier!: string;\n nobanish!: boolean;\n nocopy!: boolean;\n nomanuel!: boolean;\n nowander!: boolean;\n nowish!: boolean;\n phylum!: string;\n physicalResistance!: string;\n poison?: string;\n scaling!: string;\n scalingCap!: string;\n scalingFloor!: string;\n skeleton!: boolean;\n skillBlockChance!: number;\n snake!: boolean;\n spellBlockChance!: number;\n sprinkles!: [number | string, number | string];\n superlikely!: boolean;\n ultrarare!: boolean;\n wanderer!: boolean;\n wiki?: string;\n wish!: boolean;\n zombie!: boolean;\n // relations\n drops = new Collection<MonsterDrop>(this);\n nativeLocations = new Collection<NativeMonster>(this);\n}\n\nexport class Location {\n name!: string;\n id?: number;\n zone!: string;\n url!: string;\n difficulty!: LocationDifficulty;\n environment!: LocationEnvironment;\n statRequirement!: number;\n waterLevel?: number;\n overdrunk!: boolean;\n nowander!: boolean;\n combatRate!: number;\n // relations\n nativeMonsters = new Collection<NativeMonster>(this);\n}\n\nexport class Path {\n id!: number;\n name!: string;\n enumName!: string;\n image?: string;\n isAvatar!: boolean;\n article?: string;\n pointsPreference?: string;\n maximumPoints!: number;\n bucket!: boolean;\n stomachCapacity!: number;\n liverCapacity!: number;\n spleenCapacity!: number;\n classes = new Collection<AscensionClass>(this);\n}\n\nexport class AscensionClass {\n id!: number;\n name!: string;\n enumName!: string;\n image?: string;\n primeStatIndex!: number;\n path?: Path;\n stun?: string;\n stomachCapacity?: number;\n liverCapacity?: number;\n spleenCapacity?: number;\n}\n\nexport class Equipment {\n // PK is a FK to Item. Access the id via equipment.item.id\n item!: Ref<Item>;\n power!: number;\n musRequirement!: number;\n mysRequirement!: number;\n moxRequirement!: number;\n type?: string;\n hands?: number;\n}\n\nexport class Consumable {\n // PK is a FK to Item. Access the id via consumable.item.id\n item!: Ref<Item>;\n stomach!: number;\n liver!: number;\n spleen!: number;\n levelRequirement!: number;\n quality?: ConsumableQuality;\n adventureRange!: string;\n adventures!: number;\n muscle!: number;\n muscleRange!: string;\n mysticality!: number;\n mysticalityRange!: string;\n moxie!: number;\n moxieRange!: string;\n notes?: string;\n}\n\nexport class Concoction {\n id!: number;\n item!: Item;\n methods!: string[];\n comment?: string;\n ingredients = new Collection<Ingredient>(this);\n}\n\nexport class Outfit {\n id!: number;\n name!: string;\n image!: string;\n equipment = new Collection<Item>(this);\n treats = new Collection<OutfitTreat>(this);\n}\n\nexport class FoldGroup {\n id!: number;\n damage!: number;\n items = new Collection<Item>(this);\n}\n\nexport class ZapGroup {\n id!: number;\n items = new Collection<Item>(this);\n}\n\n// Junction entities (surrogate autoincrement id)\n\nexport class MonsterDrop {\n id!: number;\n monster!: Monster;\n item!: Item;\n rate!: number;\n category?: MonsterDropCategory;\n}\n\nexport class NativeMonster {\n id!: number;\n location!: Location;\n monster!: Monster;\n weight!: number;\n rejection!: number;\n parity?: number;\n}\n\nexport class Ingredient {\n id!: number;\n concoction!: Concoction;\n item!: Item;\n quantity!: number;\n}\n\nexport class OutfitTreat {\n id!: number;\n outfit!: Outfit;\n item!: Item;\n chance!: number;\n}\n\n// Modifier entities (FK-as-PK)\n\nexport class ItemModifiers {\n item!: Ref<Item>;\n modifiers!: Record<string, string>;\n}\n\nexport class EffectModifiers {\n effect!: Ref<Effect>;\n modifiers!: Record<string, string>;\n}\n\nexport class SkillModifiers {\n skill!: Ref<Skill>;\n modifiers!: Record<string, string>;\n}\n\nexport class FamiliarModifiers {\n familiar!: Ref<Familiar>;\n modifiers!: Record<string, string>;\n}\n\nexport class Meta {\n id!: number;\n lastUpdate!: Date;\n lastRevision!: number;\n}\n\n// ---- EntitySchema Definitions ---------------------------------------------\n\nexport const ItemSchema = new EntitySchema<Item>({\n class: Item,\n tableName: \"items\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\", index: true },\n descid: { type: \"integer\", nullable: true, unique: true },\n image: { type: \"string\" },\n uses: { type: \"json\" },\n quest: { type: \"boolean\" },\n gift: { type: \"boolean\" },\n tradeable: { type: \"boolean\" },\n discardable: { type: \"boolean\" },\n autosell: { type: \"integer\" },\n plural: { type: \"string\", nullable: true },\n ambiguous: { type: \"boolean\", default: false },\n equipment: {\n kind: \"1:1\",\n entity: () => Equipment,\n mappedBy: \"item\",\n nullable: true,\n },\n consumable: {\n kind: \"1:1\",\n entity: () => Consumable,\n mappedBy: \"item\",\n nullable: true,\n },\n modifiers: {\n kind: \"1:1\",\n entity: () => ItemModifiers,\n mappedBy: \"item\",\n nullable: true,\n },\n monsterDrops: { kind: \"1:m\", entity: () => MonsterDrop, mappedBy: \"item\" },\n outfitEquipment: {\n kind: \"m:n\",\n entity: () => Outfit,\n pivotTable: \"outfitEquipment\",\n joinColumn: \"equipment\",\n inverseJoinColumn: \"outfit\",\n },\n outfitTreats: {\n kind: \"1:m\",\n entity: () => OutfitTreat,\n mappedBy: \"item\",\n },\n ingredients: {\n kind: \"1:m\",\n entity: () => Ingredient,\n mappedBy: \"item\",\n },\n foldGroups: {\n kind: \"m:n\",\n entity: () => FoldGroup,\n pivotTable: \"foldables\",\n joinColumn: \"item\",\n inverseJoinColumn: \"foldGroup\",\n },\n zapGroups: {\n kind: \"m:n\",\n entity: () => ZapGroup,\n pivotTable: \"zapGroupItems\",\n joinColumn: \"item\",\n inverseJoinColumn: \"zapGroup\",\n },\n },\n});\n\nexport const EffectSchema = new EntitySchema<Effect>({\n class: Effect,\n tableName: \"effects\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n descid: { type: \"string\", nullable: true, unique: true },\n image: { type: \"string\" },\n quality: { type: \"string\" },\n nohookah: { type: \"boolean\" },\n nopvp: { type: \"boolean\" },\n noremove: { type: \"boolean\" },\n song: { type: \"boolean\" },\n actions: { type: \"json\" },\n ambiguous: { type: \"boolean\", default: false },\n modifiers: {\n kind: \"1:1\",\n entity: () => EffectModifiers,\n mappedBy: \"effect\",\n nullable: true,\n },\n },\n});\n\nexport const SkillSchema = new EntitySchema<Skill>({\n class: Skill,\n tableName: \"skills\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n tags: { type: \"json\" },\n mpCost: { type: \"integer\" },\n duration: { type: \"integer\" },\n guildLevel: { type: \"integer\", nullable: true },\n maxLevel: { type: \"integer\", nullable: true },\n permable: { type: \"boolean\" },\n ambiguous: { type: \"boolean\", default: false },\n modifiers: {\n kind: \"1:1\",\n entity: () => SkillModifiers,\n mappedBy: \"skill\",\n nullable: true,\n },\n },\n});\n\nexport const FamiliarSchema = new EntitySchema<Familiar>({\n class: Familiar,\n tableName: \"familiars\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n categories: { type: \"json\" },\n larva: { kind: \"m:1\", entity: () => Item, nullable: true, fieldName: \"larva\" },\n equipment: { kind: \"m:1\", entity: () => Item, nullable: true, fieldName: \"equipment\" },\n cageMatch: { type: \"integer\" },\n scavengerHunt: { type: \"integer\" },\n obstacleCourse: { type: \"integer\" },\n hideAndSeek: { type: \"integer\" },\n attributes: { type: \"json\" },\n modifiers: {\n kind: \"1:1\",\n entity: () => FamiliarModifiers,\n mappedBy: \"familiar\",\n nullable: true,\n },\n },\n});\n\nexport const MonsterSchema = new EntitySchema<Monster>({\n class: Monster,\n tableName: \"monsters\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"json\" },\n ambiguous: { type: \"boolean\", default: false },\n article: { type: \"string\" },\n attack: { type: \"string\" },\n boss: { type: \"boolean\" },\n defence: { type: \"string\" },\n drippy: { type: \"boolean\" },\n element: { type: \"string\", nullable: true },\n elementalAttack: { type: \"string\", nullable: true },\n elementalDefence: { type: \"string\", nullable: true },\n elementalResistance: { type: \"string\" },\n experience: { type: \"string\", nullable: true },\n free: { type: \"boolean\" },\n ghost: { type: \"boolean\" },\n groupSize: { type: \"integer\" },\n hp: { type: \"string\" },\n initiative: { type: \"string\" },\n itemBlockChance: { type: \"float\" },\n lucky: { type: \"boolean\" },\n manuel: { type: \"string\", nullable: true },\n meat: { type: \"float\", nullable: true },\n meatExpression: { type: \"string\", nullable: true },\n monsterLevelMultiplier: { type: \"string\" },\n nobanish: { type: \"boolean\" },\n nocopy: { type: \"boolean\" },\n nomanuel: { type: \"boolean\" },\n nowander: { type: \"boolean\" },\n nowish: { type: \"boolean\" },\n phylum: { type: \"string\" },\n physicalResistance: { type: \"string\" },\n poison: { type: \"string\", nullable: true },\n scaling: { type: \"string\" },\n scalingCap: { type: \"string\" },\n scalingFloor: { type: \"string\" },\n skeleton: { type: \"boolean\" },\n skillBlockChance: { type: \"float\" },\n snake: { type: \"boolean\" },\n spellBlockChance: { type: \"float\" },\n sprinkles: { type: \"json\" },\n superlikely: { type: \"boolean\" },\n ultrarare: { type: \"boolean\" },\n wanderer: { type: \"boolean\" },\n wiki: { type: \"string\", nullable: true },\n wish: { type: \"boolean\" },\n zombie: { type: \"boolean\" },\n drops: { kind: \"1:m\", entity: () => MonsterDrop, mappedBy: \"monster\" },\n nativeLocations: {\n kind: \"1:m\",\n entity: () => NativeMonster,\n mappedBy: \"monster\",\n },\n },\n});\n\nexport const LocationSchema = new EntitySchema<Location>({\n class: Location,\n tableName: \"locations\",\n properties: {\n name: { type: \"string\", primary: true },\n id: { type: \"integer\", nullable: true },\n zone: { type: \"string\" },\n url: { type: \"string\" },\n difficulty: { type: \"string\" },\n environment: { type: \"string\" },\n statRequirement: { type: \"integer\" },\n waterLevel: { type: \"integer\", nullable: true },\n overdrunk: { type: \"boolean\" },\n nowander: { type: \"boolean\" },\n combatRate: { type: \"integer\" },\n nativeMonsters: {\n kind: \"1:m\",\n entity: () => NativeMonster,\n mappedBy: \"location\",\n },\n },\n});\n\nexport const PathSchema = new EntitySchema<Path>({\n class: Path,\n tableName: \"paths\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n enumName: { type: \"string\" },\n image: { type: \"string\", nullable: true, unique: true },\n isAvatar: { type: \"boolean\" },\n article: { type: \"string\", nullable: true },\n pointsPreference: { type: \"string\", nullable: true },\n maximumPoints: { type: \"integer\" },\n bucket: { type: \"boolean\" },\n stomachCapacity: { type: \"integer\" },\n liverCapacity: { type: \"integer\" },\n spleenCapacity: { type: \"integer\" },\n classes: { kind: \"1:m\", entity: () => AscensionClass, mappedBy: \"path\" },\n },\n});\n\nexport const AscensionClassSchema = new EntitySchema<AscensionClass>({\n class: AscensionClass,\n tableName: \"classes\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n enumName: { type: \"string\" },\n image: { type: \"string\", nullable: true },\n primeStatIndex: { type: \"integer\" },\n path: { kind: \"m:1\", entity: () => Path, nullable: true, fieldName: \"path\" },\n stun: { type: \"string\", nullable: true },\n stomachCapacity: { type: \"integer\", nullable: true },\n liverCapacity: { type: \"integer\", nullable: true },\n spleenCapacity: { type: \"integer\", nullable: true },\n },\n});\n\nexport const EquipmentSchema = new EntitySchema<Equipment>({\n class: Equipment,\n tableName: \"equipment\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"id\",\n inversedBy: \"equipment\",\n },\n power: { type: \"integer\" },\n musRequirement: { type: \"integer\" },\n mysRequirement: { type: \"integer\" },\n moxRequirement: { type: \"integer\" },\n type: { type: \"string\", nullable: true },\n hands: { type: \"integer\", nullable: true },\n },\n});\n\nexport const ConsumableSchema = new EntitySchema<Consumable>({\n class: Consumable,\n tableName: \"consumables\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"id\",\n inversedBy: \"consumable\",\n },\n stomach: { type: \"integer\" },\n liver: { type: \"integer\" },\n spleen: { type: \"integer\" },\n levelRequirement: { type: \"integer\" },\n quality: { type: \"string\", nullable: true },\n adventureRange: { type: \"string\" },\n adventures: { type: \"float\" },\n muscle: { type: \"float\" },\n muscleRange: { type: \"string\" },\n mysticality: { type: \"float\" },\n mysticalityRange: { type: \"string\" },\n moxie: { type: \"float\" },\n moxieRange: { type: \"string\" },\n notes: { type: \"string\", nullable: true },\n },\n});\n\nexport const ConcoctionSchema = new EntitySchema<Concoction>({\n class: Concoction,\n tableName: \"concoctions\",\n properties: {\n id: { type: \"integer\", primary: true },\n item: { kind: \"m:1\", entity: () => Item, fieldName: \"item\" },\n methods: { type: \"json\" },\n comment: { type: \"string\", nullable: true },\n ingredients: {\n kind: \"1:m\",\n entity: () => Ingredient,\n mappedBy: \"concoction\",\n },\n },\n});\n\nexport const OutfitSchema = new EntitySchema<Outfit>({\n class: Outfit,\n tableName: \"outfits\",\n properties: {\n id: { type: \"integer\", primary: true },\n name: { type: \"string\" },\n image: { type: \"string\" },\n equipment: {\n kind: \"m:n\",\n entity: () => Item,\n pivotTable: \"outfitEquipment\",\n joinColumn: \"outfit\",\n inverseJoinColumn: \"equipment\",\n },\n treats: { kind: \"1:m\", entity: () => OutfitTreat, mappedBy: \"outfit\" },\n },\n});\n\nexport const FoldGroupSchema = new EntitySchema<FoldGroup>({\n class: FoldGroup,\n tableName: \"foldGroups\",\n properties: {\n id: { type: \"integer\", primary: true },\n damage: { type: \"integer\" },\n items: {\n kind: \"m:n\",\n entity: () => Item,\n pivotTable: \"foldables\",\n joinColumn: \"foldGroup\",\n inverseJoinColumn: \"item\",\n },\n },\n});\n\nexport const ZapGroupSchema = new EntitySchema<ZapGroup>({\n class: ZapGroup,\n tableName: \"zapGroups\",\n properties: {\n id: { type: \"integer\", primary: true },\n items: {\n kind: \"m:n\",\n entity: () => Item,\n pivotTable: \"zapGroupItems\",\n joinColumn: \"zapGroup\",\n inverseJoinColumn: \"item\",\n },\n },\n});\n\nexport const MonsterDropSchema = new EntitySchema<MonsterDrop>({\n class: MonsterDrop,\n tableName: \"monsterDrops\",\n properties: {\n id: { type: \"integer\", primary: true },\n monster: { kind: \"m:1\", entity: () => Monster },\n item: { kind: \"m:1\", entity: () => Item },\n rate: { type: \"float\" },\n category: { type: \"string\", nullable: true },\n },\n});\n\nexport const NativeMonsterSchema = new EntitySchema<NativeMonster>({\n class: NativeMonster,\n tableName: \"nativeMonsters\",\n properties: {\n id: { type: \"integer\", primary: true },\n location: { kind: \"m:1\", entity: () => Location },\n monster: { kind: \"m:1\", entity: () => Monster },\n weight: { type: \"float\" },\n rejection: { type: \"float\" },\n parity: { type: \"integer\", nullable: true },\n },\n});\n\nexport const IngredientSchema = new EntitySchema<Ingredient>({\n class: Ingredient,\n tableName: \"ingredients\",\n properties: {\n id: { type: \"integer\", primary: true },\n concoction: { kind: \"m:1\", entity: () => Concoction },\n item: { kind: \"m:1\", entity: () => Item },\n quantity: { type: \"integer\" },\n },\n});\n\nexport const OutfitTreatSchema = new EntitySchema<OutfitTreat>({\n class: OutfitTreat,\n tableName: \"outfitTreats\",\n properties: {\n id: { type: \"integer\", primary: true },\n outfit: { kind: \"m:1\", entity: () => Outfit },\n item: { kind: \"m:1\", entity: () => Item },\n chance: { type: \"float\" },\n },\n});\n\nexport const ItemModifiersSchema = new EntitySchema<ItemModifiers>({\n class: ItemModifiers,\n tableName: \"itemModifiers\",\n properties: {\n item: {\n kind: \"1:1\",\n entity: () => Item,\n primary: true,\n fieldName: \"item\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const EffectModifiersSchema = new EntitySchema<EffectModifiers>({\n class: EffectModifiers,\n tableName: \"effectModifiers\",\n properties: {\n effect: {\n kind: \"1:1\",\n entity: () => Effect,\n primary: true,\n fieldName: \"effect\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const SkillModifiersSchema = new EntitySchema<SkillModifiers>({\n class: SkillModifiers,\n tableName: \"skillModifiers\",\n properties: {\n skill: {\n kind: \"1:1\",\n entity: () => Skill,\n primary: true,\n fieldName: \"skill\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const FamiliarModifiersSchema = new EntitySchema<FamiliarModifiers>({\n class: FamiliarModifiers,\n tableName: \"familiarModifiers\",\n properties: {\n familiar: {\n kind: \"1:1\",\n entity: () => Familiar,\n primary: true,\n fieldName: \"familiar\",\n inversedBy: \"modifiers\",\n },\n modifiers: { type: \"json\" },\n },\n});\n\nexport const MetaSchema = new EntitySchema<Meta>({\n class: Meta,\n tableName: \"meta\",\n properties: {\n id: { type: \"integer\", primary: true, default: 1 },\n lastUpdate: { type: \"Date\" },\n lastRevision: { type: \"integer\" },\n },\n});\n\n// All schemas in dependency order for MikroORM.init({ entities })\nexport const entities = [\n ItemSchema,\n EffectSchema,\n SkillSchema,\n FamiliarSchema,\n MonsterSchema,\n LocationSchema,\n PathSchema,\n AscensionClassSchema,\n EquipmentSchema,\n ConsumableSchema,\n ConcoctionSchema,\n OutfitSchema,\n FoldGroupSchema,\n ZapGroupSchema,\n MonsterDropSchema,\n NativeMonsterSchema,\n IngredientSchema,\n OutfitTreatSchema,\n ItemModifiersSchema,\n EffectModifiersSchema,\n SkillModifiersSchema,\n FamiliarModifiersSchema,\n MetaSchema,\n];\n","import { type EntityManager, MikroORM } from \"@mikro-orm/core\";\n\nexport const DEFAULT_URL = \"https://data.loathers.net/dol.sqlite\";\nexport const ETAG_KEY = \"dol-etag\";\n\nexport abstract class BaseClient<S> {\n protected _orm?: MikroORM;\n protected readonly _strategy: S;\n\n constructor(strategy: S) {\n this._strategy = strategy;\n }\n\n get query(): EntityManager {\n if (!this._orm) throw new Error(\"Call await client.load() before querying\");\n return this._orm.em;\n }\n\n abstract load(): Promise<void>;\n\n protected async fetchDb(url: string): Promise<ArrayBuffer> {\n const response = await fetch(url);\n if (!response.ok)\n throw new Error(`Failed to fetch database: ${response.status}`);\n return response.arrayBuffer();\n }\n\n protected abstract getStoredEtag(key: string): Promise<string | null>;\n protected abstract storeEtag(key: string, etag: string): Promise<void>;\n\n protected async syncIfNeeded(\n url: string,\n key: string,\n apply: (data: ArrayBuffer) => Promise<void>,\n force = false,\n ): Promise<void> {\n const storedEtag = force ? null : await this.getStoredEtag(key);\n const head = await fetch(url, { method: \"HEAD\" });\n const remoteEtag = head.headers.get(\"etag\");\n\n if (force || storedEtag !== remoteEtag) {\n await apply(await this.fetchDb(url));\n if (remoteEtag) await this.storeEtag(key, remoteEtag);\n }\n }\n}\n"],"mappings":"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","names":["ItemUse","EffectQuality","SkillTag","FamiliarCategory","MonsterElement","MonsterDropCategory","LocationDifficulty","LocationEnvironment","ConsumableQuality"]}
|