@delta-comic/db 3.0.0-next.4 → 3.0.0-next.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +5 -5
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isTauri } from "@tauri-apps/api/core";
|
|
2
2
|
import { JSONColumnType, Kysely, SelectQueryBuilder, Selectable } from "kysely";
|
|
3
|
-
import { FormResult, FormSingleConfigure, SourcedKeyType, SourcedValue,
|
|
3
|
+
import { FormResult, FormSingleConfigure, SourcedKeyType, SourcedValue, UniEpRaw, UniItem, UniItemAuthor, UniItemRaw } from "@delta-comic/model";
|
|
4
4
|
import { MaybeRefOrGetter, Ref } from "vue";
|
|
5
5
|
|
|
6
6
|
//#region lib/utils.d.ts
|
|
@@ -18,9 +18,9 @@ declare namespace itemStore_d_exports {
|
|
|
18
18
|
interface Table$6 {
|
|
19
19
|
/** @description primary key */
|
|
20
20
|
key: string;
|
|
21
|
-
item: JSONColumnType<
|
|
21
|
+
item: JSONColumnType<UniItemRaw>;
|
|
22
22
|
}
|
|
23
|
-
type StorableItem =
|
|
23
|
+
type StorableItem = UniItem | UniItemRaw;
|
|
24
24
|
type StoredItem = Selectable<Table$6>;
|
|
25
25
|
declare const itemKey: SourcedValue<[string, string]>;
|
|
26
26
|
declare enum QueryKey$5 {
|
|
@@ -289,7 +289,7 @@ interface Table$4 {
|
|
|
289
289
|
/** @description primary key */
|
|
290
290
|
timestamp: number;
|
|
291
291
|
itemKey: string;
|
|
292
|
-
ep: JSONColumnType<
|
|
292
|
+
ep: JSONColumnType<UniEpRaw>;
|
|
293
293
|
}
|
|
294
294
|
type Item$2 = Selectable<Table$4>;
|
|
295
295
|
declare enum QueryKey$2 {
|
|
@@ -429,7 +429,7 @@ declare const key: SourcedValue<[plugin: string, label: string]>;
|
|
|
429
429
|
type Key_ = SourcedKeyType<typeof key>;
|
|
430
430
|
type Key = Exclude<Key_, string>;
|
|
431
431
|
interface AuthorTable {
|
|
432
|
-
author: JSONColumnType<
|
|
432
|
+
author: JSONColumnType<UniItemAuthor>;
|
|
433
433
|
itemKey: null;
|
|
434
434
|
type: 'author';
|
|
435
435
|
/** @description primary key */
|
package/dist/index.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import { isTauri } from "@tauri-apps/api/core";
|
|
|
4
4
|
import { CamelCasePlugin, Kysely } from "kysely";
|
|
5
5
|
import { SerializePlugin } from "kysely-plugin-serialize";
|
|
6
6
|
import { defineMutation, useMutation, useQuery, useQueryCache } from "@pinia/colada";
|
|
7
|
-
import { SourcedValue, Struct,
|
|
7
|
+
import { SourcedValue, Struct, UniContentPage } from "@delta-comic/model";
|
|
8
8
|
import { fromPairs } from "es-toolkit/compat";
|
|
9
9
|
import { ref, toValue, watch } from "vue";
|
|
10
10
|
//#region lib/utils.ts
|
|
@@ -170,7 +170,7 @@ const useUpsert$3 = defineMutation(() => {
|
|
|
170
170
|
const key = ["db", "db:itemStore:"];
|
|
171
171
|
const { mutateAsync, ...mutation } = useMutation({
|
|
172
172
|
mutation: async ({ item, trx }) => withTransition(async (trx) => {
|
|
173
|
-
const k = itemKey.toString([
|
|
173
|
+
const k = itemKey.toString([UniContentPage.contentPages.key.toString(item.contentType), item.id]);
|
|
174
174
|
await trx.replaceInto("itemStore").values({
|
|
175
175
|
item: Struct.toRaw(item),
|
|
176
176
|
key: k
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["QueryKey","useUpsert","useRemove","useQuery","useColadaQuery","QueryKey","useUpsert","QueryKey","ItemStoreDB.useUpsert","useColadaQuery","QueryKey","useUpsert","ItemStoreDB.useUpsert","useRemove","useQuery","useColadaQuery","QueryKey","useUpsert","useRemove","useQuery","useColadaQuery","ItemStoreDB.useUpsert","useQuery","useColadaQuery"],"sources":["../lib/utils.ts","../lib/plugin.ts","../lib/itemStore.ts","../lib/favourite.ts","../lib/history.ts","../lib/subscribe.ts","../lib/recentView.ts","../lib/config.ts","../lib/nativeStore/index.ts","../lib/index.ts"],"sourcesContent":["import { logger } from '@delta-comic/logger'\nimport type { Kysely, SelectQueryBuilder } from 'kysely'\n\nimport type { DB } from '.'\n\nconst transactionLogger = logger.scoped('db:transaction')\n\nexport const withTransition = async <T>(\n handler: (trx: Kysely<DB>) => Promise<T>,\n trx?: Kysely<DB>,\n) => {\n if (trx) return await handler(trx)\n else {\n const { db } = await import('.')\n transactionLogger.trace('database transaction started')\n try {\n const result = await db\n .transaction()\n .setAccessMode('read write')\n .setIsolationLevel('read committed')\n .execute(handler)\n transactionLogger.trace('database transaction committed')\n return result\n } catch (error) {\n transactionLogger.error('database transaction failed', error)\n throw error\n }\n }\n}\n\nexport async function countDb(sql: SelectQueryBuilder<DB, any, object>) {\n const v = await sql.select(db => db.fn.countAll<number>().as('count')).executeTakeFirstOrThrow()\n return v.count\n}\n\nexport enum CommonQueryKey {\n common = 'db',\n}","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Meta {\n name: { display: string; id: string }\n version: { plugin: string; supportCore: string }\n author: string\n description: string\n /** An HTTP(S) URL or a path relative to the installed plugin root. */\n icon?: string\n require: { id: string; download?: string | undefined }[]\n entry?: { jsPath: string; cssPath?: string }\n kind?: 'normal' | 'preboot'\n integrity?: { algorithm: 'blake3' | 'sha256'; digest: string }\n}\n\nexport interface Table {\n installerName: string\n loaderName: string\n /** @description primary key */\n pluginName: string\n meta: JSONColumnType<Meta>\n enable: boolean\n installInput: string\n displayName: string\n}\n\n/** @description Not Blue */\nexport type Archive = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:plugin:',\n}\n\nexport const removeByNames = async (keys: Archive['pluginName'][], trx: Kysely<DB>) => {\n if (keys.length === 0) return\n await trx.deleteFrom('plugin').where('plugin.pluginName', 'in', keys).execute()\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ archives, trx }: { archives: Archive[]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx\n .replaceInto('plugin')\n .values(archives.map(a => ({ ...a, meta: JSON.stringify(a.meta) })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Archive['pluginName'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await removeByNames(keys, trx)\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useToggleEnable = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Archive['pluginName'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n for (const key of keys) {\n const isEnable = await trx\n .selectFrom('plugin')\n .where('pluginName', '=', key)\n .select('enable')\n .executeTakeFirstOrThrow()\n return trx\n .updateTable('plugin')\n .where('pluginName', '=', key)\n .set({ enable: !isEnable.enable })\n .execute()\n }\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, toggle: mutateAsync, key }\n})\n\nexport const useSetKind = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n pluginName,\n kind,\n }: {\n pluginName: string\n kind: NonNullable<Meta['kind']>\n }) =>\n withTransition(async trx => {\n const plugin = await trx\n .selectFrom('plugin')\n .select(['loaderName', 'meta'])\n .where('pluginName', '=', pluginName)\n .executeTakeFirstOrThrow()\n if (plugin.loaderName === 'builtin')\n throw new Error('built-in plugin kind cannot be changed')\n await trx\n .updateTable('plugin')\n .set({ meta: JSON.stringify({ ...plugin.meta, kind }) })\n .where('pluginName', '=', pluginName)\n .execute()\n }),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, setKind: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'plugin', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('plugin'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { SourcedValue, Struct, uni } from '@delta-comic/model'\nimport { defineMutation, useMutation, useQueryCache } from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n key: string\n item: JSONColumnType<uni.item.RawItem>\n}\nexport type StorableItem = uni.item.Item | uni.item.RawItem\nexport type StoredItem = Selectable<Table>\nexport const itemKey = new SourcedValue('*')\n\nexport enum QueryKey {\n item = 'db:itemStore:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const k = itemKey.toString([\n uni.content.ContentPage.contentPages.key.toString(item.contentType),\n item.id,\n ])\n await trx\n .replaceInto('itemStore')\n .values({ item: Struct.toRaw(item), key: k })\n .execute()\n return k\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface CardTable {\n title: string\n private: boolean\n description: string\n /** @description primary key */\n createAt: number\n}\n\nexport type Card = Selectable<CardTable>\n\nexport interface ItemTable {\n itemKey: string\n /** @description foreign key */\n belongTo: CardTable['createAt']\n addTime: number\n}\n\nexport type Item = Selectable<ItemTable>\n\nexport enum QueryKey {\n item = 'db:favouriteItem:',\n card = 'db:favouriteCard:',\n}\n\nexport const useUpsertItem = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n item,\n belongTos,\n trx,\n }: {\n item: ItemStoreDB.StorableItem\n belongTos: Item['belongTo'][]\n trx?: Kysely<DB>\n }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('favouriteItem')\n .values(belongTos.map(belongTo => ({ addTime: Date.now(), itemKey, belongTo })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useMoveItem = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n item,\n from,\n aims,\n trx,\n }: {\n item: ItemStoreDB.StorableItem\n from: Item['belongTo']\n aims: Item['belongTo'][]\n trx?: Kysely<DB>\n }) =>\n withTransition(async trx => {\n await trx\n .deleteFrom('favouriteItem')\n .where('itemKey', '=', item.id)\n .where('belongTo', '=', from)\n .execute()\n await trx\n .replaceInto('favouriteItem')\n .values(aims.map(to => ({ addTime: Date.now(), itemKey: item.id, belongTo: to })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, move: mutateAsync, key }\n})\n\nexport const useCreateCard = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [QueryKey.card, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ card, trx }: { card: Card; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.replaceInto('favouriteCard').values(card).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, createCard: mutateAsync, key }\n})\n\nexport const useQueryItem = <T>(\n query: (db: SelectQueryBuilder<DB, 'favouriteItem', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('favouriteItem'))\n },\n key: () => [QueryKey.item, QueryKey.card, query].concat(otherKeys),\n staleTime: 15000,\n initialData,\n initialDataUpdatedAt: 0,\n })\n\nexport const useQueryCard = <T>(\n query: (db: SelectQueryBuilder<DB, 'favouriteCard', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('favouriteCard'))\n },\n key: () => [QueryKey.card, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { Struct, type uni } from '@delta-comic/model'\nimport {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n timestamp: number\n itemKey: string\n ep: JSONColumnType<uni.ep.RawEp>\n}\n\nexport type Item = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:history:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: ItemStoreDB.StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('history')\n .values({ itemKey, timestamp: Date.now(), ep: Struct.toRaw(item) })\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: ({ keys, trx }: { keys: Item['timestamp'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('history').where('history.timestamp', 'is', keys).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'history', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('history'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { SourcedValue, type SourcedKeyType, type uni } from '@delta-comic/model'\nimport {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport const key = new SourcedValue<[plugin: string, label: string]>()\nexport type Key_ = SourcedKeyType<typeof key>\nexport type Key = Exclude<Key_, string>\n\nexport interface AuthorTable {\n author: JSONColumnType<uni.item.Author>\n itemKey: null\n type: 'author'\n /** @description primary key */\n key: string\n plugin: string\n}\nexport type AuthorItem = Selectable<AuthorTable>\n\nexport interface EpTable {\n author: null\n itemKey: string // not f key\n type: 'ep'\n /** @description primary key */\n key: string\n plugin: string\n}\nexport type EpItem = Selectable<EpTable>\n\nexport type Table = AuthorTable | EpTable\nexport type Item = AuthorItem | EpItem\n\nexport enum QueryKey {\n item = 'db:subscribe:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ items, trx }: { items: Item[]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx\n .replaceInto('subscribe')\n .values(items.map(item => ({ ...item, author: JSON.stringify(item.author) })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Item['key'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('subscribe').where('subscribe.key', 'is', keys).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'subscribe', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('subscribe'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n timestamp: number\n itemKey: string\n isViewed: boolean\n}\nexport type Item = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:recentView:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: ItemStoreDB.StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('recentView')\n .values({ isViewed: false, itemKey, timestamp: Date.now() })\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ items, trx }: { items: Item['timestamp'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('recentView').where('recentView.timestamp', 'is', items).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'recentView', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('recentView'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { logger } from '@delta-comic/logger'\nimport type { FormResult, FormSingleConfigure } from '@delta-comic/model'\nimport { fromPairs } from 'es-toolkit/compat'\nimport { ref, watch, type Ref } from 'vue'\n\nconst configLogger = logger.scoped('db:config')\n\nexport type ConfigDescription = Record<\n string,\n Required<Pick<FormSingleConfigure, 'defaultValue'>> & FormSingleConfigure\n>\n\nexport interface Table {\n /** @description config owner, usually plugin name */\n belongTo: string\n /** @description serialized form structure */\n form: string\n /** @description serialized config data */\n data: string\n}\n\nexport type ConfigRef<T> = Ref<T> & { readonly ready: Promise<void> }\n\nconst cloneValue = <T>(value: T): T => {\n if (typeof structuredClone === 'function') return structuredClone(value)\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nconst createDefaultData = <T extends ConfigDescription>(config: T): FormResult<T> =>\n fromPairs(\n Object.entries(config).map(([name, desc]) => [name, desc.defaultValue]),\n ) as FormResult<T>\n\nconst parseJson = <T>(value: unknown, fallback: T): T => {\n if (!value) return cloneValue(fallback)\n if (typeof value !== 'string') return cloneValue(value as T)\n try {\n return JSON.parse(value) as T\n } catch (error) {\n configLogger.warn('failed to parse config value', error)\n return cloneValue(fallback)\n }\n}\n\nconst upsertConfig = async (belongTo: string, form: ConfigDescription, data: unknown) => {\n const { db } = await import('.')\n await db\n .replaceInto('config')\n .values({ belongTo, form: JSON.stringify(form), data: JSON.stringify(data) })\n .execute()\n configLogger.debug('config persisted', { belongTo })\n}\n\nexport const useConfig = <T extends ConfigDescription>(\n belongTo: string,\n form: T,\n): ConfigRef<FormResult<T>> => {\n const defaultData = createDefaultData(form)\n const data = ref(cloneValue(defaultData)) as Ref<FormResult<T>>\n let hydrated = false\n let saveTimer: ReturnType<typeof setTimeout> | undefined\n\n const persist = () => {\n if (saveTimer) clearTimeout(saveTimer)\n saveTimer = setTimeout(() => {\n void upsertConfig(belongTo, form, data.value).catch(error => {\n configLogger.warn('failed to persist config value', { belongTo }, error)\n })\n }, 100)\n }\n\n const ready = (async () => {\n try {\n const { db } = await import('.')\n const stored = await db\n .selectFrom('config')\n .select(['form', 'data'])\n .where('belongTo', '=', belongTo)\n .executeTakeFirst()\n data.value = parseJson(stored?.data, defaultData)\n configLogger.debug('config hydrated', { belongTo, found: Boolean(stored) })\n hydrated = true\n const storedForm =\n typeof stored?.form === 'string' ? stored.form : JSON.stringify(stored?.form)\n if (!stored || storedForm !== JSON.stringify(form)) persist()\n } catch (error) {\n configLogger.warn('failed to load config value', { belongTo }, error)\n data.value = cloneValue(defaultData)\n hydrated = true\n }\n })()\n\n watch(\n data,\n () => {\n if (!hydrated) return\n persist()\n },\n { deep: true, flush: 'sync' },\n )\n\n return Object.assign(data, { ready })\n}","import { logger } from '@delta-comic/logger'\nimport { SourcedValue } from '@delta-comic/model'\nimport { ref, toValue, watch, type MaybeRefOrGetter, type Ref } from 'vue'\n\nconst nativeStoreLogger = logger.scoped('db:native-store')\n\nexport interface Table {\n namespace: string\n key: string\n value: string\n}\n\nconst saveKey = new SourcedValue<[namespace: string, key: string]>()\n\nconst cloneDefault = <T extends object>(defaultValue: MaybeRefOrGetter<T>): T => {\n const value = toValue(defaultValue)\n if (typeof structuredClone === 'function') return structuredClone(value)\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nconst legacyValue = (namespace: string, key: string) => {\n try {\n return globalThis.localStorage?.getItem(saveKey.toString([namespace, key])) ?? null\n } catch {\n return null\n }\n}\n\nconst parseValue = <T extends object>(value: unknown, defaultValue: MaybeRefOrGetter<T>): T => {\n if (value === null || value === '') return cloneDefault(defaultValue)\n if (typeof value !== 'string') {\n if (typeof structuredClone === 'function') return structuredClone(value as T)\n return JSON.parse(JSON.stringify(value)) as T\n }\n try {\n return JSON.parse(value) as T\n } catch (error) {\n nativeStoreLogger.warn('failed to parse native store value', error)\n return cloneDefault(defaultValue)\n }\n}\n\nconst getStoreValue = async (namespace: string, key: string) => {\n const { db } = await import('../index')\n return (\n (\n await db\n .selectFrom('nativeStore')\n .select('value')\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .executeTakeFirst()\n )?.value ?? null\n )\n}\n\nconst setStoreValue = async (namespace: string, key: string, value: string) => {\n const { db } = await import('../index')\n await db.replaceInto('nativeStore').values({ namespace, key, value }).execute()\n}\n\nexport const useNativeStore = <T extends object>(\n namespace: string,\n key: MaybeRefOrGetter<string>,\n defaultValue: MaybeRefOrGetter<T>,\n) => {\n const state = ref(cloneDefault(defaultValue)) as Ref<T>\n let version = 0\n let hydrated = false\n let saveTimer: ReturnType<typeof setTimeout> | undefined\n\n const persist = (resolvedKey: string, value: T) => {\n if (saveTimer) clearTimeout(saveTimer)\n const encoded = JSON.stringify(value)\n saveTimer = setTimeout(() => {\n void setStoreValue(namespace, resolvedKey, encoded).catch(error => {\n nativeStoreLogger.warn(\n 'failed to persist native store value',\n { key: resolvedKey, namespace },\n error,\n )\n })\n }, 100)\n }\n\n const load = async () => {\n const current = ++version\n const resolvedKey = toValue(key)\n hydrated = false\n try {\n const storeValue = await getStoreValue(namespace, resolvedKey)\n const storedValue = storeValue ?? legacyValue(namespace, resolvedKey)\n if (current !== version) return\n state.value = parseValue(storedValue, defaultValue)\n nativeStoreLogger.debug('native store value hydrated', {\n key: resolvedKey,\n namespace,\n source: storeValue === null ? 'legacy-or-default' : 'database',\n })\n hydrated = true\n if (storeValue === null) persist(resolvedKey, state.value)\n } catch (error) {\n nativeStoreLogger.warn(\n 'failed to load native store value',\n { key: resolvedKey, namespace },\n error,\n )\n if (current !== version) return\n state.value = cloneDefault(defaultValue)\n hydrated = true\n }\n }\n\n watch(\n () => toValue(key),\n () => void load(),\n { immediate: true },\n )\n watch(\n state,\n value => {\n if (!hydrated) return\n persist(toValue(key), value)\n },\n { deep: true },\n )\n\n return state\n}","import { logger } from '@delta-comic/logger'\nimport { isTauri } from '@tauri-apps/api/core'\nimport { CamelCasePlugin, type Dialect, Kysely } from 'kysely'\nimport { SerializePlugin } from 'kysely-plugin-serialize'\n\nimport type * as FavouriteDB from './favourite'\nexport * as PluginArchiveDB from './plugin'\nimport type * as HistoryDB from './history'\nexport * as FavouriteDB from './favourite'\nimport type * as ConfigDB from './config'\nimport type * as ItemStoreDB from './itemStore'\nimport type * as NativeStoreDB from './nativeStore'\nexport * as HistoryDB from './history'\nimport type * as PluginArchiveDB from './plugin'\nexport * as ItemStoreDB from './itemStore'\nimport type * as RecentDB from './recentView'\nexport * as SubscribeDB from './subscribe'\nimport type * as SubscribeDB from './subscribe'\nexport * as RecentDB from './recentView'\nexport * as ConfigDB from './config'\n\nexport interface DB {\n itemStore: ItemStoreDB.Table\n favouriteCard: FavouriteDB.CardTable\n favouriteItem: FavouriteDB.ItemTable\n history: HistoryDB.Table\n recentView: RecentDB.Table\n subscribe: SubscribeDB.Table\n plugin: PluginArchiveDB.Table\n nativeStore: NativeStoreDB.Table\n config: ConfigDB.Table\n}\n\nconst databaseLogger = logger.scoped('db:lifecycle')\n\ndatabaseLogger.info('database initialization started')\n\nexport const isTauriRuntime = isTauri\n\nconst createDialect = async (): Promise<Dialect> => {\n if (isTauriRuntime()) {\n const [{ default: Database }, { TauriSqliteDialect }] = await Promise.all([\n import('@tauri-apps/plugin-sql'),\n import('kysely-dialect-tauri'),\n ])\n const database = await Database.load('sqlite:app.db')\n databaseLogger.info('native sqlite dialect initialized')\n return new TauriSqliteDialect({ database })\n }\n\n const { createWebDialect } = await import('./web')\n databaseLogger.info('web sqlite dialect initialized')\n return createWebDialect()\n}\n\nexport const db = new Kysely<DB>({\n dialect: await createDialect(),\n plugins: [new CamelCasePlugin(), new SerializePlugin()],\n})\n\nexport * as DBUtils from './utils'\n\nexport * from './nativeStore'\nexport { useConfig } from './config'"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["QueryKey","useUpsert","useRemove","useQuery","useColadaQuery","QueryKey","useUpsert","QueryKey","ItemStoreDB.useUpsert","useColadaQuery","QueryKey","useUpsert","ItemStoreDB.useUpsert","useRemove","useQuery","useColadaQuery","QueryKey","useUpsert","useRemove","useQuery","useColadaQuery","ItemStoreDB.useUpsert","useQuery","useColadaQuery"],"sources":["../lib/utils.ts","../lib/plugin.ts","../lib/itemStore.ts","../lib/favourite.ts","../lib/history.ts","../lib/subscribe.ts","../lib/recentView.ts","../lib/config.ts","../lib/nativeStore/index.ts","../lib/index.ts"],"sourcesContent":["import { logger } from '@delta-comic/logger'\nimport type { Kysely, SelectQueryBuilder } from 'kysely'\n\nimport type { DB } from '.'\n\nconst transactionLogger = logger.scoped('db:transaction')\n\nexport const withTransition = async <T>(\n handler: (trx: Kysely<DB>) => Promise<T>,\n trx?: Kysely<DB>,\n) => {\n if (trx) return await handler(trx)\n else {\n const { db } = await import('.')\n transactionLogger.trace('database transaction started')\n try {\n const result = await db\n .transaction()\n .setAccessMode('read write')\n .setIsolationLevel('read committed')\n .execute(handler)\n transactionLogger.trace('database transaction committed')\n return result\n } catch (error) {\n transactionLogger.error('database transaction failed', error)\n throw error\n }\n }\n}\n\nexport async function countDb(sql: SelectQueryBuilder<DB, any, object>) {\n const v = await sql.select(db => db.fn.countAll<number>().as('count')).executeTakeFirstOrThrow()\n return v.count\n}\n\nexport enum CommonQueryKey {\n common = 'db',\n}","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Meta {\n name: { display: string; id: string }\n version: { plugin: string; supportCore: string }\n author: string\n description: string\n /** An HTTP(S) URL or a path relative to the installed plugin root. */\n icon?: string\n require: { id: string; download?: string | undefined }[]\n entry?: { jsPath: string; cssPath?: string }\n kind?: 'normal' | 'preboot'\n integrity?: { algorithm: 'blake3' | 'sha256'; digest: string }\n}\n\nexport interface Table {\n installerName: string\n loaderName: string\n /** @description primary key */\n pluginName: string\n meta: JSONColumnType<Meta>\n enable: boolean\n installInput: string\n displayName: string\n}\n\n/** @description Not Blue */\nexport type Archive = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:plugin:',\n}\n\nexport const removeByNames = async (keys: Archive['pluginName'][], trx: Kysely<DB>) => {\n if (keys.length === 0) return\n await trx.deleteFrom('plugin').where('plugin.pluginName', 'in', keys).execute()\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ archives, trx }: { archives: Archive[]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx\n .replaceInto('plugin')\n .values(archives.map(a => ({ ...a, meta: JSON.stringify(a.meta) })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Archive['pluginName'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await removeByNames(keys, trx)\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useToggleEnable = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Archive['pluginName'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n for (const key of keys) {\n const isEnable = await trx\n .selectFrom('plugin')\n .where('pluginName', '=', key)\n .select('enable')\n .executeTakeFirstOrThrow()\n return trx\n .updateTable('plugin')\n .where('pluginName', '=', key)\n .set({ enable: !isEnable.enable })\n .execute()\n }\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, toggle: mutateAsync, key }\n})\n\nexport const useSetKind = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n pluginName,\n kind,\n }: {\n pluginName: string\n kind: NonNullable<Meta['kind']>\n }) =>\n withTransition(async trx => {\n const plugin = await trx\n .selectFrom('plugin')\n .select(['loaderName', 'meta'])\n .where('pluginName', '=', pluginName)\n .executeTakeFirstOrThrow()\n if (plugin.loaderName === 'builtin')\n throw new Error('built-in plugin kind cannot be changed')\n await trx\n .updateTable('plugin')\n .set({ meta: JSON.stringify({ ...plugin.meta, kind }) })\n .where('pluginName', '=', pluginName)\n .execute()\n }),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, setKind: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'plugin', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('plugin'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import {\n SourcedValue,\n Struct,\n UniContentPage,\n type UniItem,\n type UniItemRaw,\n} from '@delta-comic/model'\nimport { defineMutation, useMutation, useQueryCache } from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n key: string\n item: JSONColumnType<UniItemRaw>\n}\nexport type StorableItem = UniItem | UniItemRaw\nexport type StoredItem = Selectable<Table>\nexport const itemKey = new SourcedValue('*')\n\nexport enum QueryKey {\n item = 'db:itemStore:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const k = itemKey.toString([\n UniContentPage.contentPages.key.toString(item.contentType),\n item.id,\n ])\n await trx\n .replaceInto('itemStore')\n .values({ item: Struct.toRaw(item), key: k })\n .execute()\n return k\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface CardTable {\n title: string\n private: boolean\n description: string\n /** @description primary key */\n createAt: number\n}\n\nexport type Card = Selectable<CardTable>\n\nexport interface ItemTable {\n itemKey: string\n /** @description foreign key */\n belongTo: CardTable['createAt']\n addTime: number\n}\n\nexport type Item = Selectable<ItemTable>\n\nexport enum QueryKey {\n item = 'db:favouriteItem:',\n card = 'db:favouriteCard:',\n}\n\nexport const useUpsertItem = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n item,\n belongTos,\n trx,\n }: {\n item: ItemStoreDB.StorableItem\n belongTos: Item['belongTo'][]\n trx?: Kysely<DB>\n }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('favouriteItem')\n .values(belongTos.map(belongTo => ({ addTime: Date.now(), itemKey, belongTo })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useMoveItem = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({\n item,\n from,\n aims,\n trx,\n }: {\n item: ItemStoreDB.StorableItem\n from: Item['belongTo']\n aims: Item['belongTo'][]\n trx?: Kysely<DB>\n }) =>\n withTransition(async trx => {\n await trx\n .deleteFrom('favouriteItem')\n .where('itemKey', '=', item.id)\n .where('belongTo', '=', from)\n .execute()\n await trx\n .replaceInto('favouriteItem')\n .values(aims.map(to => ({ addTime: Date.now(), itemKey: item.id, belongTo: to })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, move: mutateAsync, key }\n})\n\nexport const useCreateCard = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [QueryKey.card, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ card, trx }: { card: Card; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.replaceInto('favouriteCard').values(card).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, createCard: mutateAsync, key }\n})\n\nexport const useQueryItem = <T>(\n query: (db: SelectQueryBuilder<DB, 'favouriteItem', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('favouriteItem'))\n },\n key: () => [QueryKey.item, QueryKey.card, query].concat(otherKeys),\n staleTime: 15000,\n initialData,\n initialDataUpdatedAt: 0,\n })\n\nexport const useQueryCard = <T>(\n query: (db: SelectQueryBuilder<DB, 'favouriteCard', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('favouriteCard'))\n },\n key: () => [QueryKey.card, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { Struct, type UniEpRaw } from '@delta-comic/model'\nimport {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n timestamp: number\n itemKey: string\n ep: JSONColumnType<UniEpRaw>\n}\n\nexport type Item = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:history:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: ItemStoreDB.StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('history')\n .values({ itemKey, timestamp: Date.now(), ep: Struct.toRaw(item) })\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: ({ keys, trx }: { keys: Item['timestamp'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('history').where('history.timestamp', 'is', keys).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'history', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('history'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { SourcedValue, type SourcedKeyType, type UniItemAuthor } from '@delta-comic/model'\nimport {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { JSONColumnType, Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport const key = new SourcedValue<[plugin: string, label: string]>()\nexport type Key_ = SourcedKeyType<typeof key>\nexport type Key = Exclude<Key_, string>\n\nexport interface AuthorTable {\n author: JSONColumnType<UniItemAuthor>\n itemKey: null\n type: 'author'\n /** @description primary key */\n key: string\n plugin: string\n}\nexport type AuthorItem = Selectable<AuthorTable>\n\nexport interface EpTable {\n author: null\n itemKey: string // not f key\n type: 'ep'\n /** @description primary key */\n key: string\n plugin: string\n}\nexport type EpItem = Selectable<EpTable>\n\nexport type Table = AuthorTable | EpTable\nexport type Item = AuthorItem | EpItem\n\nexport enum QueryKey {\n item = 'db:subscribe:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ items, trx }: { items: Item[]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx\n .replaceInto('subscribe')\n .values(items.map(item => ({ ...item, author: JSON.stringify(item.author) })))\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ keys, trx }: { keys: Item['key'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('subscribe').where('subscribe.key', 'is', keys).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'subscribe', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('subscribe'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import {\n defineMutation,\n useMutation,\n useQueryCache,\n useQuery as useColadaQuery,\n} from '@pinia/colada'\nimport type { Kysely, Selectable, SelectQueryBuilder } from 'kysely'\n\nimport * as ItemStoreDB from './itemStore'\nimport { CommonQueryKey, withTransition } from './utils'\n\nimport type { DB } from '.'\n\nexport interface Table {\n /** @description primary key */\n timestamp: number\n itemKey: string\n isViewed: boolean\n}\nexport type Item = Selectable<Table>\n\nexport enum QueryKey {\n item = 'db:recentView:',\n}\n\nexport const useUpsert = defineMutation(() => {\n const queryCache = useQueryCache()\n const { key: iKey, upsert } = ItemStoreDB.useUpsert()\n const key = [CommonQueryKey.common, QueryKey.item, ...iKey]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ item, trx }: { item: ItemStoreDB.StorableItem; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n const itemKey = await upsert({ item, trx })\n await trx\n .replaceInto('recentView')\n .values({ isViewed: false, itemKey, timestamp: Date.now() })\n .execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, upsert: mutateAsync, key }\n})\n\nexport const useRemove = defineMutation(() => {\n const queryCache = useQueryCache()\n const key = [CommonQueryKey.common, QueryKey.item]\n const { mutateAsync, ...mutation } = useMutation({\n mutation: async ({ items, trx }: { items: Item['timestamp'][]; trx?: Kysely<DB> }) =>\n withTransition(async trx => {\n await trx.deleteFrom('recentView').where('recentView.timestamp', 'is', items).execute()\n }, trx),\n onSettled: () => {\n void queryCache.invalidateQueries({ key })\n },\n key,\n })\n return { ...mutation, remove: mutateAsync, key }\n})\n\nexport const useQuery = <T>(\n query: (db: SelectQueryBuilder<DB, 'recentView', {}>) => Promise<T>,\n otherKeys: any[] = [],\n initialData?: () => T,\n) =>\n useColadaQuery({\n query: async () => {\n const { db } = await import('.')\n return await query(db.selectFrom('recentView'))\n },\n key: () => [CommonQueryKey.common, QueryKey.item, query].concat(otherKeys),\n staleTime: 15000,\n refetchOnMount: 'always',\n initialData,\n initialDataUpdatedAt: 0,\n })","import { logger } from '@delta-comic/logger'\nimport type { FormResult, FormSingleConfigure } from '@delta-comic/model'\nimport { fromPairs } from 'es-toolkit/compat'\nimport { ref, watch, type Ref } from 'vue'\n\nconst configLogger = logger.scoped('db:config')\n\nexport type ConfigDescription = Record<\n string,\n Required<Pick<FormSingleConfigure, 'defaultValue'>> & FormSingleConfigure\n>\n\nexport interface Table {\n /** @description config owner, usually plugin name */\n belongTo: string\n /** @description serialized form structure */\n form: string\n /** @description serialized config data */\n data: string\n}\n\nexport type ConfigRef<T> = Ref<T> & { readonly ready: Promise<void> }\n\nconst cloneValue = <T>(value: T): T => {\n if (typeof structuredClone === 'function') return structuredClone(value)\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nconst createDefaultData = <T extends ConfigDescription>(config: T): FormResult<T> =>\n fromPairs(\n Object.entries(config).map(([name, desc]) => [name, desc.defaultValue]),\n ) as FormResult<T>\n\nconst parseJson = <T>(value: unknown, fallback: T): T => {\n if (!value) return cloneValue(fallback)\n if (typeof value !== 'string') return cloneValue(value as T)\n try {\n return JSON.parse(value) as T\n } catch (error) {\n configLogger.warn('failed to parse config value', error)\n return cloneValue(fallback)\n }\n}\n\nconst upsertConfig = async (belongTo: string, form: ConfigDescription, data: unknown) => {\n const { db } = await import('.')\n await db\n .replaceInto('config')\n .values({ belongTo, form: JSON.stringify(form), data: JSON.stringify(data) })\n .execute()\n configLogger.debug('config persisted', { belongTo })\n}\n\nexport const useConfig = <T extends ConfigDescription>(\n belongTo: string,\n form: T,\n): ConfigRef<FormResult<T>> => {\n const defaultData = createDefaultData(form)\n const data = ref(cloneValue(defaultData)) as Ref<FormResult<T>>\n let hydrated = false\n let saveTimer: ReturnType<typeof setTimeout> | undefined\n\n const persist = () => {\n if (saveTimer) clearTimeout(saveTimer)\n saveTimer = setTimeout(() => {\n void upsertConfig(belongTo, form, data.value).catch(error => {\n configLogger.warn('failed to persist config value', { belongTo }, error)\n })\n }, 100)\n }\n\n const ready = (async () => {\n try {\n const { db } = await import('.')\n const stored = await db\n .selectFrom('config')\n .select(['form', 'data'])\n .where('belongTo', '=', belongTo)\n .executeTakeFirst()\n data.value = parseJson(stored?.data, defaultData)\n configLogger.debug('config hydrated', { belongTo, found: Boolean(stored) })\n hydrated = true\n const storedForm =\n typeof stored?.form === 'string' ? stored.form : JSON.stringify(stored?.form)\n if (!stored || storedForm !== JSON.stringify(form)) persist()\n } catch (error) {\n configLogger.warn('failed to load config value', { belongTo }, error)\n data.value = cloneValue(defaultData)\n hydrated = true\n }\n })()\n\n watch(\n data,\n () => {\n if (!hydrated) return\n persist()\n },\n { deep: true, flush: 'sync' },\n )\n\n return Object.assign(data, { ready })\n}","import { logger } from '@delta-comic/logger'\nimport { SourcedValue } from '@delta-comic/model'\nimport { ref, toValue, watch, type MaybeRefOrGetter, type Ref } from 'vue'\n\nconst nativeStoreLogger = logger.scoped('db:native-store')\n\nexport interface Table {\n namespace: string\n key: string\n value: string\n}\n\nconst saveKey = new SourcedValue<[namespace: string, key: string]>()\n\nconst cloneDefault = <T extends object>(defaultValue: MaybeRefOrGetter<T>): T => {\n const value = toValue(defaultValue)\n if (typeof structuredClone === 'function') return structuredClone(value)\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nconst legacyValue = (namespace: string, key: string) => {\n try {\n return globalThis.localStorage?.getItem(saveKey.toString([namespace, key])) ?? null\n } catch {\n return null\n }\n}\n\nconst parseValue = <T extends object>(value: unknown, defaultValue: MaybeRefOrGetter<T>): T => {\n if (value === null || value === '') return cloneDefault(defaultValue)\n if (typeof value !== 'string') {\n if (typeof structuredClone === 'function') return structuredClone(value as T)\n return JSON.parse(JSON.stringify(value)) as T\n }\n try {\n return JSON.parse(value) as T\n } catch (error) {\n nativeStoreLogger.warn('failed to parse native store value', error)\n return cloneDefault(defaultValue)\n }\n}\n\nconst getStoreValue = async (namespace: string, key: string) => {\n const { db } = await import('../index')\n return (\n (\n await db\n .selectFrom('nativeStore')\n .select('value')\n .where('namespace', '=', namespace)\n .where('key', '=', key)\n .executeTakeFirst()\n )?.value ?? null\n )\n}\n\nconst setStoreValue = async (namespace: string, key: string, value: string) => {\n const { db } = await import('../index')\n await db.replaceInto('nativeStore').values({ namespace, key, value }).execute()\n}\n\nexport const useNativeStore = <T extends object>(\n namespace: string,\n key: MaybeRefOrGetter<string>,\n defaultValue: MaybeRefOrGetter<T>,\n) => {\n const state = ref(cloneDefault(defaultValue)) as Ref<T>\n let version = 0\n let hydrated = false\n let saveTimer: ReturnType<typeof setTimeout> | undefined\n\n const persist = (resolvedKey: string, value: T) => {\n if (saveTimer) clearTimeout(saveTimer)\n const encoded = JSON.stringify(value)\n saveTimer = setTimeout(() => {\n void setStoreValue(namespace, resolvedKey, encoded).catch(error => {\n nativeStoreLogger.warn(\n 'failed to persist native store value',\n { key: resolvedKey, namespace },\n error,\n )\n })\n }, 100)\n }\n\n const load = async () => {\n const current = ++version\n const resolvedKey = toValue(key)\n hydrated = false\n try {\n const storeValue = await getStoreValue(namespace, resolvedKey)\n const storedValue = storeValue ?? legacyValue(namespace, resolvedKey)\n if (current !== version) return\n state.value = parseValue(storedValue, defaultValue)\n nativeStoreLogger.debug('native store value hydrated', {\n key: resolvedKey,\n namespace,\n source: storeValue === null ? 'legacy-or-default' : 'database',\n })\n hydrated = true\n if (storeValue === null) persist(resolvedKey, state.value)\n } catch (error) {\n nativeStoreLogger.warn(\n 'failed to load native store value',\n { key: resolvedKey, namespace },\n error,\n )\n if (current !== version) return\n state.value = cloneDefault(defaultValue)\n hydrated = true\n }\n }\n\n watch(\n () => toValue(key),\n () => void load(),\n { immediate: true },\n )\n watch(\n state,\n value => {\n if (!hydrated) return\n persist(toValue(key), value)\n },\n { deep: true },\n )\n\n return state\n}","import { logger } from '@delta-comic/logger'\nimport { isTauri } from '@tauri-apps/api/core'\nimport { CamelCasePlugin, type Dialect, Kysely } from 'kysely'\nimport { SerializePlugin } from 'kysely-plugin-serialize'\n\nimport type * as FavouriteDB from './favourite'\nexport * as PluginArchiveDB from './plugin'\nimport type * as HistoryDB from './history'\nexport * as FavouriteDB from './favourite'\nimport type * as ConfigDB from './config'\nimport type * as ItemStoreDB from './itemStore'\nimport type * as NativeStoreDB from './nativeStore'\nexport * as HistoryDB from './history'\nimport type * as PluginArchiveDB from './plugin'\nexport * as ItemStoreDB from './itemStore'\nimport type * as RecentDB from './recentView'\nexport * as SubscribeDB from './subscribe'\nimport type * as SubscribeDB from './subscribe'\nexport * as RecentDB from './recentView'\nexport * as ConfigDB from './config'\n\nexport interface DB {\n itemStore: ItemStoreDB.Table\n favouriteCard: FavouriteDB.CardTable\n favouriteItem: FavouriteDB.ItemTable\n history: HistoryDB.Table\n recentView: RecentDB.Table\n subscribe: SubscribeDB.Table\n plugin: PluginArchiveDB.Table\n nativeStore: NativeStoreDB.Table\n config: ConfigDB.Table\n}\n\nconst databaseLogger = logger.scoped('db:lifecycle')\n\ndatabaseLogger.info('database initialization started')\n\nexport const isTauriRuntime = isTauri\n\nconst createDialect = async (): Promise<Dialect> => {\n if (isTauriRuntime()) {\n const [{ default: Database }, { TauriSqliteDialect }] = await Promise.all([\n import('@tauri-apps/plugin-sql'),\n import('kysely-dialect-tauri'),\n ])\n const database = await Database.load('sqlite:app.db')\n databaseLogger.info('native sqlite dialect initialized')\n return new TauriSqliteDialect({ database })\n }\n\n const { createWebDialect } = await import('./web')\n databaseLogger.info('web sqlite dialect initialized')\n return createWebDialect()\n}\n\nexport const db = new Kysely<DB>({\n dialect: await createDialect(),\n plugins: [new CamelCasePlugin(), new SerializePlugin()],\n})\n\nexport * as DBUtils from './utils'\n\nexport * from './nativeStore'\nexport { useConfig } from './config'"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@delta-comic/db",
|
|
3
|
-
"version": "3.0.0-next.
|
|
3
|
+
"version": "3.0.0-next.6",
|
|
4
4
|
"description": "空阙虱楼",
|
|
5
5
|
"homepage": "https://github.com/delta-comic/delta-comic",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"kysely-plugin-serialize": "^0.8.2",
|
|
39
39
|
"kysely-wasqlite-worker": "^1.2.1",
|
|
40
40
|
"mitt": "^3.0.1",
|
|
41
|
-
"@delta-comic/logger": "3.0.0-next.
|
|
41
|
+
"@delta-comic/logger": "3.0.0-next.6"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@pinia/colada": "^1.3.1",
|
|
50
50
|
"vue": "^3.5.40",
|
|
51
|
-
"@delta-comic/model": "3.0.0-next.
|
|
51
|
+
"@delta-comic/model": "3.0.0-next.6"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "vp pack",
|