@keepkit/core 0.1.0 → 0.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/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/migration.ts","../src/schema.ts","../src/backup.ts","../src/hooks/useKeepItem.ts","../src/KeepProvider.tsx","../src/store.ts","../src/hooks/useKeepStoreSelector.ts","../src/hooks/useKeepList.ts","../src/KeepButton.tsx","../src/createKeepKit.tsx","../src/integrations.ts"],"sourcesContent":["import type { KeepItem, StorageAdapter } from \"./types\";\n\n/** Merge anonymous local items into a signed-in or remote adapter. */\nexport async function mergeKeepItems<TMeta>(\n localItems: KeepItem<TMeta>[],\n target: StorageAdapter<TMeta>,\n): Promise<KeepItem<TMeta>[]> {\n if (target.merge) return target.merge(localItems);\n\n const remoteItems = await target.getAll();\n const byId = new Map(remoteItems.map((item) => [item.id, item]));\n for (const localItem of localItems) {\n const remoteItem = byId.get(localItem.id);\n if (!remoteItem || localItem.updatedAt > remoteItem.updatedAt) {\n byId.set(localItem.id, localItem);\n }\n }\n\n const merged = [...byId.values()].sort((a, b) => b.updatedAt - a.updatedAt);\n await Promise.all(merged.map((item) => target.set(item)));\n return merged;\n}\n\n/** Read anonymous items, merge them into the target, then clear the source. */\nexport async function migrateKeepItems<TMeta>(\n source: StorageAdapter<TMeta>,\n target: StorageAdapter<TMeta>,\n): Promise<KeepItem<TMeta>[]> {\n const localItems = await source.getAll();\n const merged = await mergeKeepItems(localItems, target);\n await source.clear();\n return merged;\n}\n","import type { KeepItem, KeepSchema } from \"./types\";\n\nexport class KeepSchemaValidationError extends Error {\n readonly cause?: unknown;\n readonly itemId?: string;\n\n constructor(message: string, options: { cause?: unknown; itemId?: string } = {}) {\n super(message);\n this.name = \"KeepSchemaValidationError\";\n this.cause = options.cause;\n this.itemId = options.itemId;\n }\n}\n\n/** Parse metadata with a Zod-like, safeParse-like, or Standard Schema parser. */\nexport async function parseKeepMeta<T>(schema: KeepSchema<T>, value: unknown): Promise<T> {\n try {\n if (\"parse\" in schema) return await schema.parse(value);\n\n if (\"safeParse\" in schema) {\n const result = await schema.safeParse(value);\n if (result.success) return result.data;\n throw new KeepSchemaValidationError(\"KeepKit metadata did not match the configured schema.\", {\n cause: result.error,\n });\n }\n\n const result = await schema[\"~standard\"].validate(value);\n if (!result.issues && \"value\" in result) return result.value as T;\n throw new KeepSchemaValidationError(\"KeepKit metadata did not match the configured schema.\", {\n cause: result.issues,\n });\n } catch (cause) {\n if (cause instanceof KeepSchemaValidationError) throw cause;\n throw new KeepSchemaValidationError(\"KeepKit metadata did not match the configured schema.\", {\n cause,\n });\n }\n}\n\nexport async function validateKeepItem<TMeta>(\n item: KeepItem<unknown>,\n schema: KeepSchema<TMeta>,\n): Promise<KeepItem<TMeta>> {\n return { ...item, meta: await parseKeepMeta(schema, item.meta) };\n}\n","import { mergeKeepItems } from \"./migration\";\nimport { validateKeepItem } from \"./schema\";\nimport type { KeepInvalidItemPolicy, KeepItem, KeepSchema, StorageAdapter } from \"./types\";\n\nexport const KEEP_BACKUP_FORMAT = \"keepkit\";\nexport const KEEP_BACKUP_VERSION = 1;\n\nexport type KeepBackup<TMeta = Record<string, unknown>> = {\n format: typeof KEEP_BACKUP_FORMAT;\n version: typeof KEEP_BACKUP_VERSION;\n exportedAt: number;\n items: KeepItem<TMeta>[];\n};\n\nexport type ImportItemsOptions<TMeta = unknown> = {\n mode?: \"replace\" | \"merge\";\n schema?: KeepSchema<TMeta>;\n invalidItemPolicy?: KeepInvalidItemPolicy;\n onInvalidItem?: (error: unknown, item: KeepItem<unknown>) => void;\n};\n\nexport type ImportItemsResult<TMeta = Record<string, unknown>> = {\n mode: \"replace\" | \"merge\";\n imported: number;\n failed: number;\n total: number;\n items: KeepItem<TMeta>[];\n};\n\nexport class KeepBackupParseError extends Error {\n readonly cause?: unknown;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"KeepBackupParseError\";\n if (options?.cause !== undefined) this.cause = options.cause;\n }\n}\n\nexport class KeepBackupImportError extends Error {\n readonly mode: \"replace\" | \"merge\";\n readonly imported: number;\n readonly failed: number;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n mode: \"replace\" | \"merge\";\n imported: number;\n failed: number;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"KeepBackupImportError\";\n this.mode = options.mode;\n this.imported = options.imported;\n this.failed = options.failed;\n if (options.cause !== undefined) this.cause = options.cause;\n }\n}\n\n/** Serialize all adapter data into a versioned JSON backup. */\nexport async function exportItems<TMeta>(adapter: StorageAdapter<TMeta>): Promise<string> {\n const backup: KeepBackup<TMeta> = {\n format: KEEP_BACKUP_FORMAT,\n version: KEEP_BACKUP_VERSION,\n exportedAt: Date.now(),\n items: await adapter.getAll(),\n };\n return JSON.stringify(backup, null, 2);\n}\n\n/** Validate and restore a backup, either replacing or merging existing data. */\nexport async function importItems<TMeta>(\n adapter: StorageAdapter<TMeta>,\n data: string | KeepBackup<TMeta>,\n options: ImportItemsOptions<TMeta> = {},\n): Promise<ImportItemsResult<TMeta>> {\n const backup = parseBackup<TMeta>(data);\n const mode = options.mode ?? \"merge\";\n const validItems: KeepItem<TMeta>[] = [];\n let failed = 0;\n for (const item of backup.items) {\n if (!options.schema) {\n validItems.push(item);\n continue;\n }\n try {\n validItems.push(await validateKeepItem(item, options.schema));\n } catch (cause) {\n options.onInvalidItem?.(cause, item);\n if ((options.invalidItemPolicy ?? \"error\") === \"drop\") {\n failed += 1;\n continue;\n }\n throw cause;\n }\n }\n let items: KeepItem<TMeta>[];\n\n if (mode === \"merge\") {\n try {\n items = await mergeKeepItems(validItems, adapter);\n } catch (cause) {\n throw new KeepBackupImportError(\"KeepKit could not merge the backup.\", {\n mode,\n imported: 0,\n failed: validItems.length + failed,\n cause,\n });\n }\n } else {\n let imported = 0;\n try {\n await adapter.clear();\n for (const item of validItems) {\n await adapter.set(item);\n imported += 1;\n }\n items = await adapter.getAll();\n } catch (cause) {\n throw new KeepBackupImportError(\"KeepKit could not replace the stored items.\", {\n mode,\n imported,\n failed: validItems.length + failed - imported,\n cause,\n });\n }\n }\n\n return { mode, imported: validItems.length, failed, total: items.length, items };\n}\n\nfunction parseBackup<TMeta>(data: string | KeepBackup<TMeta>): KeepBackup<TMeta> {\n let value: unknown = data;\n if (typeof data === \"string\") {\n try {\n value = JSON.parse(data);\n } catch (cause) {\n throw new KeepBackupParseError(\"KeepKit backup is not valid JSON.\", { cause });\n }\n }\n\n if (!isRecord(value)) throw new KeepBackupParseError(\"KeepKit backup must be an object.\");\n if (value.format !== KEEP_BACKUP_FORMAT || value.version !== KEEP_BACKUP_VERSION) {\n throw new KeepBackupParseError(\"KeepKit backup format or version is unsupported.\");\n }\n if (typeof value.exportedAt !== \"number\" || !Number.isFinite(value.exportedAt)) {\n throw new KeepBackupParseError(\"KeepKit backup has an invalid export timestamp.\");\n }\n if (!Array.isArray(value.items) || !value.items.every(isKeepItem)) {\n throw new KeepBackupParseError(\"KeepKit backup contains invalid items.\");\n }\n return value as KeepBackup<TMeta>;\n}\n\nfunction isKeepItem(value: unknown): value is KeepItem {\n if (!isRecord(value)) return false;\n return (\n typeof value.id === \"string\" &&\n typeof value.savedAt === \"number\" &&\n Number.isFinite(value.savedAt) &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt) &&\n \"meta\" in value &&\n (value.targetType === undefined || typeof value.targetType === \"string\") &&\n (value.note === undefined || typeof value.note === \"string\") &&\n (value.schemaVersion === undefined ||\n (typeof value.schemaVersion === \"number\" && Number.isFinite(value.schemaVersion))) &&\n (value.revision === undefined || typeof value.revision === \"string\") &&\n (value.tags === undefined ||\n (Array.isArray(value.tags) && value.tags.every((tag) => typeof tag === \"string\")))\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { useCallback } from \"react\";\nimport { useKeepStore } from \"../KeepProvider\";\nimport type { KeepItem, KeepItemInput } from \"../types\";\nimport { useKeepStoreSelector } from \"./useKeepStoreSelector\";\n\nexport type UseKeepItemResult<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta> | undefined;\n isSaved: boolean;\n isLoading: boolean;\n isMutating: boolean;\n error: unknown | null;\n save: () => Promise<void>;\n remove: () => Promise<void>;\n toggle: () => Promise<void>;\n updateNote: (note?: string) => Promise<void>;\n updateTags: (tags?: string[]) => Promise<void>;\n};\n\nexport function useKeepItem<TMeta = Record<string, unknown>>(\n id: string,\n itemPayload?: KeepItemInput<TMeta>,\n): UseKeepItemResult<TMeta> {\n const { store, actions } = useKeepStore<TMeta>();\n const item = useKeepStoreSelector(\n store,\n useCallback((state) => state.items.find((current) => current.id === id), [id]),\n );\n const isLoading = useKeepStoreSelector(\n store,\n useCallback((state) => state.isLoading, []),\n );\n const isMutating = useKeepStoreSelector(\n store,\n useCallback((state) => state.isMutating, []),\n );\n const error = useKeepStoreSelector(\n store,\n useCallback((state) => state.error, []),\n );\n\n const save = useCallback(async () => {\n if (!itemPayload) {\n throw new Error(`An itemPayload is required to save item \"${id}\".`);\n }\n const now = Date.now();\n await actions.saveItem({\n id,\n ...itemPayload,\n savedAt: item?.savedAt ?? now,\n updatedAt: now,\n });\n }, [actions, id, item?.savedAt, itemPayload]);\n\n const remove = useCallback(() => actions.removeItem(id), [actions, id]);\n const toggle = useCallback(() => (item ? remove() : save()), [item, remove, save]);\n const updateNote = useCallback((note?: string) => actions.updateNote(id, note), [actions, id]);\n const updateTags = useCallback((tags?: string[]) => actions.updateTags(id, tags), [actions, id]);\n\n return {\n item,\n isSaved: Boolean(item),\n isLoading,\n isMutating,\n error,\n save,\n remove,\n toggle,\n updateNote,\n updateTags,\n };\n}\n","import {\n createContext,\n type PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from \"react\";\nimport { parseKeepMeta } from \"./schema\";\nimport { LocalStorageAdapter } from \"./storage\";\nimport { KeepStore, type KeepStoreActions } from \"./store\";\nimport type {\n KeepAction,\n KeepChangeContext,\n KeepErrorContext,\n KeepErrorHandler,\n KeepEventHandlers,\n KeepInvalidItemPolicy,\n KeepItem,\n KeepPlugin,\n KeepSchema,\n KeepSyncState,\n StorageAdapter,\n SyncCapableStorageAdapter,\n} from \"./types\";\nimport { normalizeKeepTags } from \"./types\";\n\nexport type KeepContextValue<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n isLoading: boolean;\n isHydrated: boolean;\n isMutating: boolean;\n error: unknown | null;\n syncState: KeepSyncState;\n saveItem: (item: KeepItem<TMeta>) => Promise<void>;\n updateNote: (id: string, note?: string) => Promise<void>;\n updateTags: (id: string, tags?: string[]) => Promise<void>;\n updateTagsBatch: (ids: string[], tags?: string[]) => Promise<void>;\n addTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n removeTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n removeItem: (id: string) => Promise<void>;\n removeItems: (ids: string[]) => Promise<void>;\n clear: () => Promise<void>;\n refresh: () => Promise<void>;\n flushSync: () => Promise<void>;\n};\n\nexport type KeepProviderProps<TMeta = Record<string, unknown>> = PropsWithChildren<\n KeepEventHandlers<TMeta> & {\n storage?: StorageAdapter<TMeta>;\n plugins?: KeepPlugin<TMeta>[];\n schemaVersion?: number;\n schema?: KeepSchema<TMeta>;\n invalidItemPolicy?: KeepInvalidItemPolicy;\n onInvalidItem?: (error: unknown, item: KeepItem<unknown>) => void;\n migrateMeta?: (\n meta: unknown,\n fromVersion: number,\n toVersion: number,\n item: KeepItem<TMeta>,\n ) => TMeta | Promise<TMeta>;\n }\n>;\n\nconst defaultStorage = new LocalStorageAdapter();\nconst KeepContext = createContext<KeepContextValue<unknown> | null>(null);\nconst KeepStoreContext = createContext<KeepStoreAccess<unknown> | null>(null);\n\ntype KeepStoreAccess<TMeta> = {\n store: KeepStore<TMeta>;\n actions: KeepStoreActions<TMeta>;\n};\n\ntype MutationPlan<TMeta> = {\n next: KeepItem<TMeta>[];\n persist: () => Promise<void>;\n onSuccess?: () => void;\n pluginContext?: {\n action: KeepAction;\n id?: string;\n item?: KeepItem<TMeta>;\n items?: KeepItem<TMeta>[];\n };\n};\n\nexport function KeepProvider<TMeta = Record<string, unknown>>({\n storage = defaultStorage as StorageAdapter<TMeta>,\n onSave,\n onRemove,\n onNoteUpdate,\n onTagsUpdate,\n onChange,\n onError,\n plugins = [],\n schemaVersion,\n schema,\n invalidItemPolicy = \"error\",\n onInvalidItem,\n migrateMeta,\n children,\n}: KeepProviderProps<TMeta>) {\n const storeRef = useRef<KeepStore<TMeta> | null>(null);\n if (!storeRef.current) {\n storeRef.current = new KeepStore<TMeta>({\n items: [],\n isLoading: true,\n isHydrated: false,\n isMutating: false,\n error: null,\n });\n }\n const store = storeRef.current;\n const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const { items, isLoading, isHydrated, isMutating, error } = state;\n const itemsRef = useRef(items);\n const pluginsRef = useRef(plugins);\n pluginsRef.current = plugins;\n const handlersRef = useRef({ onSave, onRemove, onNoteUpdate, onTagsUpdate, onChange, onError });\n handlersRef.current = { onSave, onRemove, onNoteUpdate, onTagsUpdate, onChange, onError };\n const migrationRef = useRef({\n schemaVersion,\n migrateMeta,\n schema,\n invalidItemPolicy,\n onInvalidItem,\n });\n migrationRef.current = { schemaVersion, migrateMeta, schema, invalidItemPolicy, onInvalidItem };\n const operationTailRef = useRef<Promise<unknown>>(Promise.resolve());\n const pendingRefreshesRef = useRef(0);\n const pendingMutationsRef = useRef(0);\n const syncStorage = isSyncCapableStorage(storage) ? storage : undefined;\n const getSyncState = useCallback(\n () => syncStorage?.getSyncState() ?? IDLE_SYNC_STATE,\n [syncStorage],\n );\n const subscribeSync = useCallback(\n (listener: () => void) => syncStorage?.subscribeSync(listener) ?? (() => undefined),\n [syncStorage],\n );\n const syncState = useSyncExternalStore(subscribeSync, getSyncState, getSyncState);\n\n const reportError = useCallback(\n (cause: unknown, context: KeepErrorContext) => {\n store.setState({ error: cause });\n handlersRef.current.onError?.(cause, context);\n for (const plugin of pluginsRef.current) plugin.onError?.(cause, context);\n },\n [store],\n );\n\n const setItems = useCallback(\n (next: KeepItem<TMeta>[]) => {\n itemsRef.current = next;\n store.setState({ items: next });\n },\n [store],\n );\n\n const runBeforePlugins = useCallback(\n async (context: NonNullable<MutationPlan<TMeta>[\"pluginContext\"]>) => {\n for (const plugin of pluginsRef.current) await plugin.before?.(context);\n return context;\n },\n [],\n );\n\n const runAfterPlugins = useCallback(\n async (context: NonNullable<MutationPlan<TMeta>[\"pluginContext\"]>) => {\n for (const plugin of pluginsRef.current) await plugin.after?.(context);\n },\n [],\n );\n\n const enqueueOperation = useCallback(<T,>(operation: () => Promise<T>): Promise<T> => {\n const run = operationTailRef.current.then(operation, operation);\n operationTailRef.current = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }, []);\n\n const refresh = useCallback(async () => {\n pendingRefreshesRef.current += 1;\n store.setState({ isLoading: true });\n\n try {\n await enqueueOperation(async () => {\n try {\n let next = await storage.getAll();\n let needsMigrationPersist = false;\n if (migrationRef.current.schemaVersion !== undefined) {\n const migrated = await Promise.all(\n next.map(async (item) => {\n const currentSchemaVersion = migrationRef.current.schemaVersion as number;\n if (item.schemaVersion === currentSchemaVersion) return item;\n const meta = migrationRef.current.migrateMeta\n ? await migrationRef.current.migrateMeta(\n item.meta,\n item.schemaVersion ?? 0,\n currentSchemaVersion,\n item,\n )\n : item.meta;\n return { ...item, meta, schemaVersion: currentSchemaVersion };\n }),\n );\n if (migrated.some((item, index) => item !== next[index])) {\n next = migrated;\n needsMigrationPersist = true;\n }\n }\n if (migrationRef.current.schema) {\n const validated: KeepItem<TMeta>[] = [];\n for (const item of next) {\n try {\n validated.push(await parseKeepMetaItem(item, migrationRef.current.schema));\n } catch (cause) {\n migrationRef.current.onInvalidItem?.(cause, item);\n if (migrationRef.current.invalidItemPolicy === \"drop\") continue;\n throw cause;\n }\n }\n next = validated;\n }\n if (needsMigrationPersist) {\n if (storage.setMany) await storage.setMany(next);\n else for (const item of next) await storage.set(item);\n }\n setItems(next);\n store.setState({ error: null });\n } catch (cause) {\n reportError(cause, { action: \"refresh\" });\n }\n });\n } finally {\n pendingRefreshesRef.current -= 1;\n if (pendingRefreshesRef.current === 0) store.setState({ isLoading: false });\n store.setState({ isHydrated: true });\n }\n }, [enqueueOperation, reportError, setItems, storage, store]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n useEffect(() => {\n if (!storage.subscribe) return;\n return storage.subscribe(() => void refresh());\n }, [refresh, storage]);\n\n const runMutation = useCallback(\n (\n action: Exclude<KeepAction, \"refresh\">,\n id: string | undefined,\n createPlan: (previous: KeepItem<TMeta>[]) => MutationPlan<TMeta> | undefined,\n ): Promise<void> => {\n pendingMutationsRef.current += 1;\n store.setState({ isMutating: true });\n\n const run = enqueueOperation(async () => {\n const previous = itemsRef.current;\n const plan = createPlan(previous);\n if (!plan) return;\n\n try {\n if (plan.pluginContext) await runBeforePlugins(plan.pluginContext);\n setItems(plan.next);\n store.setState({ error: null });\n await plan.persist();\n plan.onSuccess?.();\n if (plan.pluginContext) await runAfterPlugins(plan.pluginContext);\n if (plan.pluginContext) {\n const change: KeepChangeContext<TMeta> = { ...plan.pluginContext, phase: \"local\" };\n void Promise.resolve(handlersRef.current.onChange?.(change)).catch((cause) =>\n reportError(cause, { action, id }),\n );\n }\n } catch (cause) {\n setItems(previous);\n reportError(cause, { action, id });\n throw cause;\n }\n });\n\n return run.finally(() => {\n pendingMutationsRef.current -= 1;\n if (pendingMutationsRef.current === 0) store.setState({ isMutating: false });\n });\n },\n [enqueueOperation, reportError, runAfterPlugins, runBeforePlugins, setItems, store],\n );\n\n const saveItem = useCallback(\n async (item: KeepItem<TMeta>) => {\n let normalizedItem: KeepItem<TMeta>;\n try {\n const meta = migrationRef.current.schema\n ? await parseKeepMeta(migrationRef.current.schema, item.meta)\n : item.meta;\n normalizedItem = {\n ...item,\n meta,\n tags: normalizeKeepTags(item.tags),\n ...(migrationRef.current.schemaVersion === undefined\n ? {}\n : { schemaVersion: migrationRef.current.schemaVersion }),\n };\n } catch (cause) {\n reportError(cause, { action: \"save\", id: item.id });\n throw cause;\n }\n await runMutation(\"save\", normalizedItem.id, (previous) => ({\n next: [\n ...previous.filter((current) => current.id !== normalizedItem.id),\n normalizedItem,\n ].sort((a, b) => b.updatedAt - a.updatedAt),\n persist: () => storage.set(normalizedItem),\n onSuccess: () => handlersRef.current.onSave?.(normalizedItem),\n pluginContext: { action: \"save\", id: normalizedItem.id, item: normalizedItem },\n }));\n },\n [reportError, runMutation, storage],\n );\n\n const updateNote = useCallback(\n async (id: string, note?: string) => {\n const nextNote = note?.trim() || undefined;\n await runMutation(\"updateNote\", id, (previous) => {\n const current = previous.find((item) => item.id === id);\n if (!current) return undefined;\n const next = { ...current, note: nextNote, updatedAt: Date.now() };\n return {\n next: previous.map((item) => (item.id === id ? next : item)),\n persist: () => storage.set(next),\n onSuccess: () => handlersRef.current.onNoteUpdate?.(id, nextNote),\n pluginContext: { action: \"updateNote\", id, item: next },\n };\n });\n },\n [runMutation, storage],\n );\n\n const updateTags = useCallback(\n async (id: string, tags?: string[]) => {\n const nextTags = normalizeKeepTags(tags);\n await runMutation(\"updateTags\", id, (previous) => {\n const current = previous.find((item) => item.id === id);\n if (!current) return undefined;\n const next = { ...current, tags: nextTags, updatedAt: Date.now() };\n return {\n next: previous.map((item) => (item.id === id ? next : item)),\n persist: () => storage.set(next),\n onSuccess: () => handlersRef.current.onTagsUpdate?.(id, nextTags),\n pluginContext: { action: \"updateTags\", id, item: next },\n };\n });\n },\n [runMutation, storage],\n );\n\n const updateTagsBatch = useCallback(\n async (ids: string[], tags?: string[]) => {\n const idSet = new Set(ids);\n const nextTags = normalizeKeepTags(tags);\n await runMutation(\"updateTagsBatch\", undefined, (previous) => {\n const currentItems = previous.filter((item) => idSet.has(item.id));\n if (currentItems.length === 0) return undefined;\n const updatedItems = currentItems.map((item) => ({\n ...item,\n tags: nextTags,\n updatedAt: Date.now(),\n }));\n const updatedById = new Map(updatedItems.map((item) => [item.id, item]));\n return {\n next: previous.map((item) => updatedById.get(item.id) ?? item),\n persist: async () => {\n if (storage.setMany) {\n await storage.setMany(updatedItems);\n return;\n }\n const completed: KeepItem<TMeta>[] = [];\n try {\n for (const item of updatedItems) {\n await storage.set(item);\n completed.push(item);\n }\n } catch (cause) {\n const previousById = new Map(currentItems.map((item) => [item.id, item]));\n await Promise.allSettled(\n completed.map((item) => {\n const previousItem = previousById.get(item.id);\n return previousItem ? storage.set(previousItem) : Promise.resolve();\n }),\n );\n throw cause;\n }\n },\n onSuccess: () => {\n updatedItems.forEach((item) => {\n handlersRef.current.onTagsUpdate?.(item.id, nextTags);\n });\n },\n pluginContext: { action: \"updateTagsBatch\", items: updatedItems },\n };\n });\n },\n [runMutation, storage],\n );\n\n const addTagsBatch = useCallback(\n async (ids: string[], tags: string[]) => {\n const additions = normalizeKeepTags(tags) ?? [];\n const idSet = new Set(ids);\n const currentItems = itemsRef.current.filter((item) => idSet.has(item.id));\n await Promise.all(\n currentItems.map((item) =>\n updateTags(item.id, normalizeKeepTags([...(item.tags ?? []), ...additions])),\n ),\n );\n },\n [updateTags],\n );\n\n const removeTagsBatch = useCallback(\n async (ids: string[], tags: string[]) => {\n const removals = new Set(normalizeKeepTags(tags) ?? []);\n const idSet = new Set(ids);\n const currentItems = itemsRef.current.filter((item) => idSet.has(item.id));\n await Promise.all(\n currentItems.map((item) =>\n updateTags(\n item.id,\n normalizeKeepTags((item.tags ?? []).filter((tag) => !removals.has(tag))),\n ),\n ),\n );\n },\n [updateTags],\n );\n\n const removeItem = useCallback(\n async (id: string) => {\n await runMutation(\"remove\", id, (previous) => {\n const current = previous.find((item) => item.id === id);\n if (!current) return undefined;\n return {\n next: previous.filter((item) => item.id !== id),\n persist: () => storage.remove(id),\n onSuccess: () => handlersRef.current.onRemove?.(current),\n pluginContext: { action: \"remove\", id, item: current },\n };\n });\n },\n [runMutation, storage],\n );\n\n const removeItems = useCallback(\n async (ids: string[]) => {\n const idSet = new Set(ids);\n await runMutation(\"removeBatch\", undefined, (previous) => {\n const removedItems = previous.filter((item) => idSet.has(item.id));\n if (removedItems.length === 0) return undefined;\n return {\n next: previous.filter((item) => !idSet.has(item.id)),\n persist: async () => {\n if (storage.removeMany) {\n await storage.removeMany(removedItems.map((item) => item.id));\n return;\n }\n const completed: KeepItem<TMeta>[] = [];\n try {\n for (const item of removedItems) {\n await storage.remove(item.id);\n completed.push(item);\n }\n } catch (cause) {\n await Promise.allSettled(completed.map((item) => storage.set(item)));\n throw cause;\n }\n },\n onSuccess: () => {\n removedItems.forEach((item) => {\n handlersRef.current.onRemove?.(item);\n });\n },\n pluginContext: { action: \"removeBatch\", items: removedItems },\n };\n });\n },\n [runMutation, storage],\n );\n\n const clear = useCallback(\n () =>\n runMutation(\"clear\", undefined, (_previous) => ({\n next: [],\n persist: () => storage.clear(),\n pluginContext: { action: \"clear\", items: [] },\n })),\n [runMutation, storage],\n );\n const flushSync = useCallback(\n () => (syncStorage ? syncStorage.flushSync() : Promise.resolve()),\n [syncStorage],\n );\n\n const value = useMemo<KeepContextValue<TMeta>>(\n () => ({\n items,\n isLoading,\n isHydrated,\n isMutating,\n error,\n syncState,\n saveItem,\n updateNote,\n updateTags,\n updateTagsBatch,\n addTagsBatch,\n removeTagsBatch,\n removeItem,\n removeItems,\n clear,\n refresh,\n flushSync,\n }),\n [\n clear,\n error,\n flushSync,\n isHydrated,\n isLoading,\n isMutating,\n items,\n syncState,\n refresh,\n removeItem,\n saveItem,\n updateNote,\n updateTags,\n updateTagsBatch,\n addTagsBatch,\n removeTagsBatch,\n removeItems,\n ],\n );\n\n const actions = useMemo<KeepStoreActions<TMeta>>(\n () => ({\n saveItem,\n updateNote,\n updateTags,\n updateTagsBatch,\n addTagsBatch,\n removeTagsBatch,\n removeItem,\n removeItems,\n clear,\n refresh,\n }),\n [\n addTagsBatch,\n clear,\n refresh,\n removeItem,\n removeItems,\n removeTagsBatch,\n saveItem,\n updateNote,\n updateTags,\n updateTagsBatch,\n ],\n );\n const storeAccess = useMemo<KeepStoreAccess<TMeta>>(() => ({ store, actions }), [actions, store]);\n\n return (\n <KeepStoreContext.Provider value={storeAccess as KeepStoreAccess<unknown>}>\n <KeepContext.Provider value={value as unknown as KeepContextValue<unknown>}>\n {children}\n </KeepContext.Provider>\n </KeepStoreContext.Provider>\n );\n}\n\nconst IDLE_SYNC_STATE: KeepSyncState = Object.freeze({\n status: \"idle\",\n pendingCount: 0,\n conflictIds: [],\n});\n\nfunction isSyncCapableStorage<TMeta>(\n storage: StorageAdapter<TMeta>,\n): storage is SyncCapableStorageAdapter<TMeta> {\n return (\n \"getSyncState\" in storage &&\n typeof storage.getSyncState === \"function\" &&\n \"subscribeSync\" in storage &&\n typeof storage.subscribeSync === \"function\" &&\n \"flushSync\" in storage &&\n typeof storage.flushSync === \"function\"\n );\n}\n\nasync function parseKeepMetaItem<TMeta>(\n item: KeepItem<unknown>,\n schema: KeepSchema<TMeta>,\n): Promise<KeepItem<TMeta>> {\n return { ...item, meta: await parseKeepMeta(schema, item.meta) };\n}\n\nexport function useKeepContext<TMeta = Record<string, unknown>>(): KeepContextValue<TMeta> {\n const context = useContext(KeepContext);\n if (!context) throw new Error(\"Keep hooks must be used inside a KeepProvider\");\n return context as unknown as KeepContextValue<TMeta>;\n}\n\nexport function useKeepStore<TMeta = Record<string, unknown>>(): KeepStoreAccess<TMeta> {\n const context = useContext(KeepStoreContext);\n if (!context) throw new Error(\"Keep hooks must be used inside a KeepProvider\");\n return context as unknown as KeepStoreAccess<TMeta>;\n}\n\nexport type { KeepErrorHandler };\n","import type { KeepItem } from \"./types\";\n\nexport type KeepStoreState<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n isLoading: boolean;\n isHydrated: boolean;\n isMutating: boolean;\n error: unknown | null;\n};\n\nexport type KeepStoreActions<TMeta = Record<string, unknown>> = {\n saveItem: (item: KeepItem<TMeta>) => Promise<void>;\n updateNote: (id: string, note?: string) => Promise<void>;\n updateTags: (id: string, tags?: string[]) => Promise<void>;\n updateTagsBatch: (ids: string[], tags?: string[]) => Promise<void>;\n addTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n removeTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n removeItem: (id: string) => Promise<void>;\n removeItems: (ids: string[]) => Promise<void>;\n clear: () => Promise<void>;\n refresh: () => Promise<void>;\n};\n\nexport class KeepStore<TMeta = Record<string, unknown>> {\n private state: KeepStoreState<TMeta>;\n private readonly listeners = new Set<() => void>();\n\n constructor(initialState: KeepStoreState<TMeta>) {\n this.state = initialState;\n }\n\n getSnapshot = (): KeepStoreState<TMeta> => this.state;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n setState(next: Partial<KeepStoreState<TMeta>>): void {\n let changed = false;\n for (const key of Object.keys(next) as Array<keyof KeepStoreState<TMeta>>) {\n if (!Object.is(this.state[key], next[key])) {\n changed = true;\n break;\n }\n }\n if (!changed) return;\n this.state = { ...this.state, ...next };\n for (const listener of this.listeners) listener();\n }\n}\n","import { useCallback, useRef, useSyncExternalStore } from \"react\";\nimport type { KeepStore, KeepStoreState } from \"../store\";\n\nexport function useKeepStoreSelector<TMeta, TSelected>(\n store: KeepStore<TMeta>,\n selector: (state: KeepStoreState<TMeta>) => TSelected,\n): TSelected {\n const cacheRef = useRef<{\n snapshot: KeepStoreState<TMeta>;\n selector: (state: KeepStoreState<TMeta>) => TSelected;\n selected: TSelected;\n } | null>(null);\n const getSelectedSnapshot = useCallback(() => {\n const snapshot = store.getSnapshot();\n const cached = cacheRef.current;\n if (cached?.snapshot === snapshot && cached.selector === selector) return cached.selected;\n const selected = selector(snapshot);\n cacheRef.current = { snapshot, selector, selected };\n return selected;\n }, [selector, store]);\n\n return useSyncExternalStore(store.subscribe, getSelectedSnapshot, getSelectedSnapshot);\n}\n","import { useCallback, useMemo } from \"react\";\nimport { useKeepStore } from \"../KeepProvider\";\nimport type { KeepItem } from \"../types\";\nimport { useKeepStoreSelector } from \"./useKeepStoreSelector\";\n\nexport type KeepListOptions<TMeta = Record<string, unknown>> = {\n targetType?: string;\n tag?: string;\n tags?: string[];\n sort?: {\n by: \"savedAt\" | \"updatedAt\";\n direction?: \"asc\" | \"desc\";\n };\n searchQuery?: string;\n search?: {\n query: string;\n mode?: \"and\" | \"or\";\n tokenize?: boolean;\n fields?: Array<\"note\" | \"meta\" | \"tags\">;\n };\n sortBy?: \"savedAt\" | \"updatedAt\";\n order?: \"asc\" | \"desc\";\n limit?: number;\n offset?: number;\n filter?: (item: KeepItem<TMeta>) => boolean;\n filterFn?: (item: KeepItem<TMeta>) => boolean;\n savedBetween?: readonly [Date | number, Date | number];\n};\n\nexport type UseKeepListResult<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n totalCount: number;\n tags: string[];\n tagCounts: Record<string, number>;\n isLoading: boolean;\n isHydrated: boolean;\n isMutating: boolean;\n error: unknown | null;\n remove: (id: string) => Promise<void>;\n removeBatch: (ids: string[]) => Promise<void>;\n updateTagsBatch: (ids: string[], tags?: string[]) => Promise<void>;\n addTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n removeTagsBatch: (ids: string[], tags: string[]) => Promise<void>;\n clear: () => Promise<void>;\n refresh: () => Promise<void>;\n};\n\nexport function useKeepList<TMeta = Record<string, unknown>>(\n options: KeepListOptions<TMeta> = {},\n): UseKeepListResult<TMeta> {\n const { store, actions } = useKeepStore<TMeta>();\n const {\n filter,\n filterFn,\n limit,\n offset,\n order,\n savedBetween,\n search,\n searchQuery,\n sort,\n sortBy,\n tag,\n tags: queryTags,\n targetType,\n } = options;\n const queryOptions = useMemo<KeepListOptions<TMeta>>(\n () => ({\n filter,\n filterFn,\n limit,\n offset,\n order,\n savedBetween,\n search,\n searchQuery,\n sort,\n sortBy,\n tag,\n tags: queryTags,\n targetType,\n }),\n [\n filter,\n filterFn,\n limit,\n offset,\n order,\n savedBetween,\n search,\n searchQuery,\n sort,\n sortBy,\n tag,\n queryTags,\n targetType,\n ],\n );\n const selector = useMemo(() => {\n let previousResult: QueryKeepItemsResult<TMeta> | undefined;\n return (state: { items: KeepItem<TMeta>[] }) => {\n const next = queryKeepItems(state.items, queryOptions);\n if (\n previousResult &&\n previousResult.totalCount === next.totalCount &&\n sameItems(previousResult.items, next.items) &&\n sameCounts(previousResult.tagCounts, next.tagCounts)\n ) {\n return previousResult;\n }\n previousResult = next;\n return previousResult;\n };\n }, [queryOptions]);\n const query = useKeepStoreSelector(store, selector);\n const tagsSelector = useMemo(() => {\n let previous: string[] | undefined;\n return (state: { items: KeepItem<TMeta>[] }) => {\n const next = [...new Set(state.items.flatMap((item) => item.tags ?? []))].sort();\n if (previous?.length === next.length && previous.every((tag, index) => tag === next[index])) {\n return previous;\n }\n previous = next;\n return next;\n };\n }, []);\n const items = query.items;\n const totalCount = query.totalCount;\n const tagCounts = query.tagCounts;\n const tags = useKeepStoreSelector(store, tagsSelector);\n const isLoading = useKeepStoreSelector(\n store,\n useCallback((state) => state.isLoading, []),\n );\n const isHydrated = useKeepStoreSelector(\n store,\n useCallback((state) => state.isHydrated, []),\n );\n const isMutating = useKeepStoreSelector(\n store,\n useCallback((state) => state.isMutating, []),\n );\n const error = useKeepStoreSelector(\n store,\n useCallback((state) => state.error, []),\n );\n const remove = useCallback((id: string) => actions.removeItem(id), [actions]);\n const removeBatch = useCallback((ids: string[]) => actions.removeItems(ids), [actions]);\n const updateTagsBatch = useCallback(\n (ids: string[], tags?: string[]) => actions.updateTagsBatch(ids, tags),\n [actions],\n );\n const addTagsBatch = useCallback(\n (ids: string[], tags: string[]) => actions.addTagsBatch(ids, tags),\n [actions],\n );\n const removeTagsBatch = useCallback(\n (ids: string[], tags: string[]) => actions.removeTagsBatch(ids, tags),\n [actions],\n );\n\n return {\n items,\n totalCount,\n tags,\n tagCounts,\n isLoading,\n isHydrated,\n isMutating,\n error,\n remove,\n removeBatch,\n updateTagsBatch,\n addTagsBatch,\n removeTagsBatch,\n clear: actions.clear,\n refresh: actions.refresh,\n };\n}\n\nexport type QueryKeepItemsResult<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n totalCount: number;\n tagCounts: Record<string, number>;\n};\n\n/** Apply the same filtering and pagination rules as useKeepList without React. */\nexport function queryKeepItems<TMeta = Record<string, unknown>>(\n source: KeepItem<TMeta>[],\n options: KeepListOptions<TMeta> = {},\n): QueryKeepItemsResult<TMeta> {\n const filtered = source.filter((item) => {\n const [from, to] = options.savedBetween ?? [];\n const savedAt = item.savedAt;\n const lowerBound = from === undefined ? undefined : toTimestamp(from);\n const upperBound = to === undefined ? undefined : toTimestamp(to);\n return (\n (options.targetType === undefined || item.targetType === options.targetType) &&\n (options.tag === undefined || item.tags?.includes(options.tag) === true) &&\n (options.tags === undefined || options.tags.every((tag) => item.tags?.includes(tag))) &&\n (lowerBound === undefined || savedAt >= lowerBound) &&\n (upperBound === undefined || savedAt <= upperBound) &&\n matchesSearch(item, options.searchQuery, options.search) &&\n (options.filter?.(item) ?? true) &&\n (options.filterFn?.(item) ?? true)\n );\n });\n const tagCounts = getTagCounts(filtered);\n const sortBy = options.sortBy ?? options.sort?.by;\n const direction = (options.order ?? options.sort?.direction) === \"asc\" ? 1 : -1;\n const sorted = sortBy\n ? [...filtered].sort((a, b) => (a[sortBy] - b[sortBy]) * direction)\n : filtered;\n const offset = Math.max(0, options.offset ?? 0);\n const items =\n options.limit === undefined\n ? sorted.slice(offset)\n : sorted.slice(offset, offset + Math.max(0, options.limit));\n return { items, totalCount: sorted.length, tagCounts };\n}\n\nexport function getTagCounts<TMeta = Record<string, unknown>>(\n items: KeepItem<TMeta>[],\n): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const item of items) {\n for (const tag of item.tags ?? []) counts[tag] = (counts[tag] ?? 0) + 1;\n }\n return Object.fromEntries(Object.entries(counts).sort(([a], [b]) => a.localeCompare(b)));\n}\n\nfunction matchesSearch<TMeta>(\n item: KeepItem<TMeta>,\n searchQuery?: string,\n search?: KeepListOptions<TMeta>[\"search\"],\n): boolean {\n const query = search?.query ?? searchQuery;\n if (!query?.trim()) return true;\n const fields = search?.fields ?? [\"note\", \"meta\", \"tags\"];\n const values = fields.map((field) => {\n if (field === \"note\") return item.note ?? \"\";\n if (field === \"tags\") return (item.tags ?? []).join(\" \");\n try {\n return JSON.stringify(item.meta) ?? \"\";\n } catch {\n return String(item.meta);\n }\n });\n const text = values.join(\" \").toLocaleLowerCase();\n if (!search) return text.includes(query.trim().toLocaleLowerCase());\n const normalized = query.trim().toLocaleLowerCase();\n const needles =\n search.tokenize === false ? [normalized] : normalized.split(/\\s+/).filter(Boolean);\n const matches = needles.map((needle) => text.includes(needle));\n return search.mode === \"or\" ? matches.some(Boolean) : matches.every(Boolean);\n}\n\nfunction toTimestamp(value: Date | number): number {\n return value instanceof Date ? value.getTime() : value;\n}\n\nfunction sameItems<TMeta>(left: KeepItem<TMeta>[], right: KeepItem<TMeta>[]): boolean {\n return left.length === right.length && left.every((item, index) => item === right[index]);\n}\n\nfunction sameCounts(left: Record<string, number>, right: Record<string, number>): boolean {\n const leftEntries = Object.entries(left);\n const rightEntries = Object.entries(right);\n return (\n leftEntries.length === rightEntries.length &&\n leftEntries.every(([key, value], index) => {\n const [rightKey, rightValue] = rightEntries[index] ?? [];\n return key === rightKey && value === rightValue;\n })\n );\n}\n","import {\n type ButtonHTMLAttributes,\n Children,\n cloneElement,\n type HTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { useKeepItem } from \"./hooks/useKeepItem\";\nimport type { KeepItemInput } from \"./types\";\n\nexport type KeepButtonItem<TMeta = Record<string, unknown>> = KeepItemInput<TMeta> & {\n id: string;\n};\n\ntype KeepButtonSharedProps<TMeta> = {\n item: KeepButtonItem<TMeta>;\n children?: ReactNode | ((state: KeepButtonState<TMeta>) => ReactNode);\n savedLabel?: ReactNode;\n unsavedLabel?: ReactNode;\n disabled?: boolean;\n onToggleError?: (error: unknown) => void;\n};\n\nexport type KeepButtonProps<TMeta = Record<string, unknown>> = KeepButtonSharedProps<TMeta> &\n (\n | (Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"onClick\" | \"aria-pressed\"> & {\n asChild?: false;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n })\n | (Omit<HTMLAttributes<HTMLElement>, \"children\" | \"onClick\" | \"aria-pressed\"> & {\n asChild: true;\n children: ReactElement | ((state: KeepButtonState<TMeta>) => ReactElement);\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n })\n );\n\nexport type KeepButtonState<TMeta = Record<string, unknown>> = {\n item: ReturnType<typeof useKeepItem<TMeta>>[\"item\"];\n isSaved: boolean;\n isLoading: boolean;\n isMutating: boolean;\n error: unknown | null;\n save: () => Promise<void>;\n remove: () => Promise<void>;\n toggle: () => Promise<void>;\n updateNote: (note?: string) => Promise<void>;\n updateTags: (tags?: string[]) => Promise<void>;\n};\n\n/** A style-free accessible save toggle. Consumers provide all visual styling. */\nexport function KeepButton<TMeta = Record<string, unknown>>({\n item,\n children,\n savedLabel = \"Saved\",\n unsavedLabel = \"Save\",\n asChild = false,\n onToggleError,\n onClick,\n disabled,\n ...buttonProps\n}: KeepButtonProps<TMeta>) {\n const state = useKeepItem(item.id, {\n meta: item.meta,\n targetType: item.targetType,\n note: item.note,\n tags: item.tags,\n });\n const { isSaved, toggle } = state;\n const isDisabled = disabled ?? state.isMutating;\n\n async function handleClick(event: MouseEvent<HTMLElement>) {\n if (asChild) {\n (onClick as ((event: MouseEvent<HTMLElement>) => void) | undefined)?.(event);\n } else {\n (onClick as ((event: MouseEvent<HTMLButtonElement>) => void) | undefined)?.(\n event as MouseEvent<HTMLButtonElement>,\n );\n }\n if (event.defaultPrevented) return;\n try {\n await toggle();\n } catch (error) {\n onToggleError?.(error);\n }\n }\n\n const content =\n typeof children === \"function\"\n ? children(state)\n : (children ?? (isSaved ? savedLabel : unsavedLabel));\n function handleElementClick(event: MouseEvent<HTMLElement>) {\n if (\n asChild &&\n isValidElement<{ onClick?: (event: MouseEvent<HTMLElement>) => void }>(content)\n ) {\n content.props.onClick?.(event);\n }\n if (!event.defaultPrevented) void handleClick(event);\n }\n\n const commonProps = {\n ...buttonProps,\n \"aria-pressed\": isSaved,\n \"aria-label\":\n (\"aria-label\" in buttonProps ? buttonProps[\"aria-label\"] : undefined) ??\n (isSaved ? \"Remove saved item\" : \"Save item\"),\n disabled: isDisabled,\n onClick: handleElementClick,\n };\n\n if (asChild) {\n const child = Children.only(content);\n if (!isValidElement(child)) {\n throw new Error(\"KeepButton with asChild requires a single React element child.\");\n }\n return cloneElement(child as ReactElement, commonProps);\n }\n\n return (\n <button\n {...commonProps}\n type={\"type\" in buttonProps ? (buttonProps.type ?? \"button\") : \"button\"}\n >\n {content}\n </button>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { type UseKeepItemResult, useKeepItem } from \"./hooks/useKeepItem\";\nimport { type KeepListOptions, type UseKeepListResult, useKeepList } from \"./hooks/useKeepList\";\nimport { KeepButton, type KeepButtonProps } from \"./KeepButton\";\nimport { KeepProvider, type KeepProviderProps, useKeepContext } from \"./KeepProvider\";\nimport type { KeepInvalidItemPolicy, KeepItemInput, KeepPlugin, KeepSchema } from \"./types\";\n\nexport type CreateKeepKitOptions<TMeta = Record<string, unknown>> = {\n plugins?: KeepPlugin<TMeta>[];\n schemaVersion?: number;\n schema?: KeepSchema<TMeta>;\n invalidItemPolicy?: KeepInvalidItemPolicy;\n onInvalidItem?: KeepProviderProps<TMeta>[\"onInvalidItem\"];\n migrateMeta?: KeepProviderProps<TMeta>[\"migrateMeta\"];\n};\n\nexport type KeepKit<TMeta> = {\n KeepProvider: ComponentType<KeepProviderProps<TMeta>>;\n KeepButton: ComponentType<KeepButtonProps<TMeta>>;\n useKeepContext: () => ReturnType<typeof useKeepContext<TMeta>>;\n useKeepItem: (id: string, itemPayload?: KeepItemInput<TMeta>) => UseKeepItemResult<TMeta>;\n useKeepList: (options?: KeepListOptions<TMeta>) => UseKeepListResult<TMeta>;\n};\n\n/** Create an app-specific, fully typed set of KeepKit components and hooks. */\nexport function createKeepKit<TMeta = Record<string, unknown>>(\n options: CreateKeepKitOptions<TMeta> = {},\n): KeepKit<TMeta> {\n return {\n KeepProvider: (props) => <KeepProvider<TMeta> {...options} {...props} />,\n KeepButton: (props) => <KeepButton<TMeta> {...props} />,\n useKeepContext: () => useKeepContext<TMeta>(),\n useKeepItem: (id, itemPayload) => useKeepItem<TMeta>(id, itemPayload),\n useKeepList: (options) => useKeepList<TMeta>(options),\n };\n}\n","import type { KeepPlugin, KeepPluginContext } from \"./types\";\n\nexport type KeepInvalidationPluginOptions<TMeta = Record<string, unknown>> = {\n /** Query keys to invalidate after a successful local KeepKit mutation. */\n queryKeys:\n | readonly unknown[]\n | ((context: KeepPluginContext<TMeta>) => readonly (readonly unknown[])[]);\n /** Connect this callback to queryClient.invalidateQueries or SWR mutate. */\n invalidate: (\n queryKey: readonly unknown[],\n context: KeepPluginContext<TMeta>,\n ) => void | Promise<void>;\n name?: string;\n};\n\n/** Framework-neutral bridge for TanStack Query, SWR, and similar caches. */\nexport function createKeepInvalidationPlugin<TMeta = Record<string, unknown>>(\n options: KeepInvalidationPluginOptions<TMeta>,\n): KeepPlugin<TMeta> {\n return {\n name: options.name ?? \"keepkit-cache-invalidation\",\n after: async (context) => {\n const keys =\n typeof options.queryKeys === \"function\" ? options.queryKeys(context) : [options.queryKeys];\n await Promise.all(keys.map((queryKey) => options.invalidate(queryKey, context)));\n },\n };\n}\n"],"mappings":"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","names":["result","useCallback","useCallback","useRef","useSyncExternalStore","useCallback","useCallback","useMemo","useMemo","tag","useCallback","tags","jsx","jsx","options"]}
@@ -1,316 +0,0 @@
1
- type KeepItem<TMeta = Record<string, unknown>> = {
2
- id: string;
3
- savedAt: number;
4
- updatedAt: number;
5
- meta: TMeta;
6
- targetType?: string;
7
- note?: string;
8
- tags?: string[];
9
- schemaVersion?: number;
10
- /** Optional server-provided revision used by synchronizing adapters. */
11
- revision?: string;
12
- };
13
- type KeepItemInput<TMeta = Record<string, unknown>> = Omit<KeepItem<TMeta>, "id" | "savedAt" | "updatedAt">;
14
- interface StorageAdapter<TMeta = Record<string, unknown>> {
15
- getAll(): Promise<KeepItem<TMeta>[]>;
16
- set(item: KeepItem<TMeta>): Promise<void>;
17
- setMany?(items: KeepItem<TMeta>[]): Promise<void>;
18
- remove(id: string): Promise<void>;
19
- removeMany?(ids: string[]): Promise<void>;
20
- clear(): Promise<void>;
21
- merge?(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]>;
22
- subscribe?(listener: () => void): () => void;
23
- readonly storageKey?: string;
24
- }
25
- type KeepAction = "refresh" | "save" | "updateNote" | "updateTags" | "updateTagsBatch" | "remove" | "removeBatch" | "clear";
26
- type KeepChangePhase = "local" | "synced";
27
- type KeepChangeContext<TMeta = Record<string, unknown>> = {
28
- action: KeepAction;
29
- id?: string;
30
- item?: KeepItem<TMeta>;
31
- items?: KeepItem<TMeta>[];
32
- phase: KeepChangePhase;
33
- };
34
- type KeepPluginContext<TMeta = Record<string, unknown>> = {
35
- action: KeepAction;
36
- id?: string;
37
- item?: KeepItem<TMeta>;
38
- items?: KeepItem<TMeta>[];
39
- };
40
- type KeepPlugin<TMeta = Record<string, unknown>> = {
41
- name?: string;
42
- before?: (context: KeepPluginContext<TMeta>) => void | Promise<void>;
43
- after?: (context: KeepPluginContext<TMeta>) => void | Promise<void>;
44
- onError?: (error: unknown, context: KeepErrorContext) => void;
45
- };
46
- type KeepSchemaParseResult<T> = {
47
- success: true;
48
- data: T;
49
- } | {
50
- success: false;
51
- error?: unknown;
52
- };
53
- type KeepSchema<T> = {
54
- parse: (value: unknown) => T | Promise<T>;
55
- } | {
56
- safeParse: (value: unknown) => KeepSchemaParseResult<T> | Promise<KeepSchemaParseResult<T>>;
57
- } | {
58
- "~standard": {
59
- validate: (value: unknown) => {
60
- value?: T;
61
- issues?: readonly unknown[];
62
- } | Promise<{
63
- value?: T;
64
- issues?: readonly unknown[];
65
- }>;
66
- };
67
- };
68
- type KeepInvalidItemPolicy = "error" | "drop";
69
- type KeepSyncStatus = "idle" | "pending" | "syncing" | "synced" | "conflict" | "error";
70
- type KeepSyncState = {
71
- status: KeepSyncStatus;
72
- pendingCount: number;
73
- conflictIds: string[];
74
- lastSyncedAt?: number;
75
- error?: unknown;
76
- };
77
- type SyncOperation<TMeta = Record<string, unknown>> = {
78
- operationId: string;
79
- type: "upsert" | "remove";
80
- id: string;
81
- item?: KeepItem<TMeta>;
82
- createdAt: number;
83
- baseRevision?: string;
84
- };
85
- type RemoteSyncResult<TMeta = Record<string, unknown>> = {
86
- type: "synced";
87
- item?: KeepItem<TMeta>;
88
- revision?: string;
89
- } | {
90
- type: "conflict";
91
- remote: KeepItem<TMeta>;
92
- revision?: string;
93
- };
94
- type KeepConflictContext<TMeta = Record<string, unknown>> = {
95
- operation: SyncOperation<TMeta>;
96
- remoteRevision?: string;
97
- };
98
- type KeepConflictResolver<TMeta = Record<string, unknown>> = (local: KeepItem<TMeta> | undefined, remote: KeepItem<TMeta>, context: KeepConflictContext<TMeta>) => KeepItem<TMeta> | undefined | Promise<KeepItem<TMeta> | undefined>;
99
- interface RemoteSyncDriver<TMeta = Record<string, unknown>> {
100
- push(operation: SyncOperation<TMeta>): Promise<RemoteSyncResult<TMeta>>;
101
- pull?: () => Promise<KeepItem<TMeta>[]>;
102
- }
103
- interface SyncQueueAdapter<TMeta = Record<string, unknown>> {
104
- getAll(): Promise<SyncOperation<TMeta>[]>;
105
- setMany(operations: SyncOperation<TMeta>[]): Promise<void>;
106
- remove(operationIds: string[]): Promise<void>;
107
- clear(): Promise<void>;
108
- }
109
- interface SyncCapableStorageAdapter<TMeta = Record<string, unknown>> extends StorageAdapter<TMeta> {
110
- getSyncState(): KeepSyncState;
111
- subscribeSync(listener: () => void): () => void;
112
- flushSync(): Promise<void>;
113
- dispose?(): void;
114
- }
115
- type KeepStorageOperation = "getAll" | "set" | "remove" | "clear" | "merge";
116
- declare class KeepStorageError extends Error {
117
- readonly operation: KeepStorageOperation;
118
- readonly storageKey?: string;
119
- readonly cause?: unknown;
120
- constructor(message: string, options: {
121
- operation: KeepStorageOperation;
122
- storageKey?: string;
123
- cause?: unknown;
124
- });
125
- }
126
- declare class KeepStorageQuotaError extends KeepStorageError {
127
- constructor(options: {
128
- operation: KeepStorageOperation;
129
- storageKey?: string;
130
- cause?: unknown;
131
- });
132
- }
133
- declare class KeepStorageAccessError extends KeepStorageError {
134
- constructor(options: {
135
- operation: KeepStorageOperation;
136
- storageKey?: string;
137
- cause?: unknown;
138
- });
139
- }
140
- declare class KeepStorageParseError extends KeepStorageError {
141
- constructor(options: {
142
- operation: KeepStorageOperation;
143
- storageKey?: string;
144
- cause?: unknown;
145
- });
146
- }
147
- type KeepErrorContext = {
148
- action: KeepAction;
149
- id?: string;
150
- };
151
- type KeepErrorHandler = (error: unknown, context: KeepErrorContext) => void;
152
- type KeepEventHandlers<TMeta = Record<string, unknown>> = {
153
- onSave?: (item: KeepItem<TMeta>) => void;
154
- onRemove?: (item: KeepItem<TMeta>) => void;
155
- onNoteUpdate?: (id: string, note?: string) => void;
156
- onTagsUpdate?: (id: string, tags?: string[]) => void;
157
- onChange?: (context: KeepChangeContext<TMeta>) => void | Promise<void>;
158
- onError?: KeepErrorHandler;
159
- };
160
- declare function normalizeKeepTags(tags?: string[]): string[] | undefined;
161
-
162
- type LocalStorageSyncQueueOptions = {
163
- key?: string;
164
- storage?: Storage;
165
- };
166
- type IndexedDBSyncQueueOptions = {
167
- databaseName?: string;
168
- storeName?: string;
169
- version?: number;
170
- indexedDB?: IDBFactory;
171
- };
172
- type SyncStorageAdapterOptions<TMeta = Record<string, unknown>> = {
173
- local: StorageAdapter<TMeta>;
174
- remote: RemoteSyncDriver<TMeta>;
175
- queue?: SyncQueueAdapter<TMeta>;
176
- queueKey?: string;
177
- queueDatabaseName?: string;
178
- clientId?: string;
179
- now?: () => number;
180
- resolveConflict?: KeepConflictResolver<TMeta>;
181
- };
182
- declare const DEFAULT_SYNC_QUEUE_KEY = "keepkit:sync-queue";
183
- declare const DEFAULT_SYNC_QUEUE_DATABASE = "keepkit-sync";
184
- declare const DEFAULT_SYNC_QUEUE_STORE = "sync-queue";
185
- declare class LocalStorageSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {
186
- private readonly key;
187
- private readonly storage;
188
- constructor(options?: LocalStorageSyncQueueOptions);
189
- getAll(): Promise<SyncOperation<TMeta>[]>;
190
- setMany(operations: SyncOperation<TMeta>[]): Promise<void>;
191
- remove(operationIds: string[]): Promise<void>;
192
- clear(): Promise<void>;
193
- }
194
- declare class IndexedDBSyncQueueAdapter<TMeta = Record<string, unknown>> implements SyncQueueAdapter<TMeta> {
195
- private readonly databaseName;
196
- private readonly storeName;
197
- private readonly version;
198
- private readonly indexedDB;
199
- private databasePromise;
200
- constructor(options?: IndexedDBSyncQueueOptions);
201
- getAll(): Promise<SyncOperation<TMeta>[]>;
202
- setMany(operations: SyncOperation<TMeta>[]): Promise<void>;
203
- remove(operationIds: string[]): Promise<void>;
204
- clear(): Promise<void>;
205
- private open;
206
- }
207
- /** A local-first adapter that persists remote operations until they are acknowledged. */
208
- declare class SyncStorageAdapter<TMeta = Record<string, unknown>> implements SyncCapableStorageAdapter<TMeta> {
209
- readonly storageKey?: string;
210
- private readonly local;
211
- private readonly remote;
212
- private readonly queue;
213
- private readonly clientId;
214
- private readonly now;
215
- private readonly resolveConflict?;
216
- private readonly listeners;
217
- private readonly dataListeners;
218
- private queueItems;
219
- private queueLoaded;
220
- private queueLoadPromise;
221
- private flushPromise;
222
- private state;
223
- private onlineHandler?;
224
- constructor(options: SyncStorageAdapterOptions<TMeta>);
225
- getSyncState: () => KeepSyncState;
226
- subscribeSync: (listener: () => void) => (() => void);
227
- subscribe: (listener: () => void) => (() => void);
228
- getAll(): Promise<KeepItem<TMeta>[]>;
229
- set(item: KeepItem<TMeta>): Promise<void>;
230
- setMany(items: KeepItem<TMeta>[]): Promise<void>;
231
- remove(id: string): Promise<void>;
232
- removeMany(ids: string[]): Promise<void>;
233
- clear(): Promise<void>;
234
- merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]>;
235
- flushSync(): Promise<void>;
236
- dispose(): void;
237
- private runFlush;
238
- private createOperation;
239
- private enqueueBeforeLocalWrite;
240
- private enqueueManyBeforeLocalWrite;
241
- private loadQueue;
242
- private persistQueue;
243
- private removeQueued;
244
- private replaceQueued;
245
- private setPendingState;
246
- private pullRemote;
247
- private notifyDataListeners;
248
- private updateState;
249
- }
250
-
251
- declare const DEFAULT_STORAGE_KEY = "keepkit:items";
252
- type LocalStorageAdapterOptions = {
253
- key?: string;
254
- storage?: Storage;
255
- };
256
- type IndexedDBAdapterOptions = {
257
- databaseName?: string;
258
- dbName?: string;
259
- /** Alias for databaseName, useful when switching from LocalStorageAdapter. */
260
- key?: string;
261
- storeName?: string;
262
- version?: number;
263
- indexedDB?: IDBFactory;
264
- };
265
- declare const DEFAULT_INDEXEDDB_DATABASE = "keepkit";
266
- declare const DEFAULT_INDEXEDDB_STORE = "items";
267
- type StorageAdapterFactoryOptions<TMeta = Record<string, unknown>> = {
268
- getAll: () => KeepItem<TMeta>[] | Promise<KeepItem<TMeta>[]>;
269
- set: (item: KeepItem<TMeta>) => void | Promise<void>;
270
- setMany?: (items: KeepItem<TMeta>[]) => void | Promise<void>;
271
- remove: (id: string) => void | Promise<void>;
272
- removeMany?: (ids: string[]) => void | Promise<void>;
273
- clear: () => void | Promise<void>;
274
- merge?: (localItems: KeepItem<TMeta>[]) => KeepItem<TMeta>[] | Promise<KeepItem<TMeta>[]>;
275
- subscribe?: (listener: () => void) => undefined | (() => void);
276
- storageKey?: string;
277
- };
278
- /** Adapt sync or async persistence functions to the StorageAdapter contract. */
279
- declare function createStorageAdapter<TMeta = Record<string, unknown>>(options: StorageAdapterFactoryOptions<TMeta>): StorageAdapter<TMeta>;
280
- /** An async StorageAdapter backed by browser localStorage. */
281
- declare class LocalStorageAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {
282
- readonly storageKey: string;
283
- private readonly storage;
284
- constructor(options?: LocalStorageAdapterOptions);
285
- getAll(): Promise<KeepItem<TMeta>[]>;
286
- set(item: KeepItem<TMeta>): Promise<void>;
287
- setMany(items: KeepItem<TMeta>[]): Promise<void>;
288
- remove(id: string): Promise<void>;
289
- removeMany(ids: string[]): Promise<void>;
290
- clear(): Promise<void>;
291
- merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]>;
292
- subscribe(listener: () => void): () => void;
293
- private write;
294
- }
295
- /** An async StorageAdapter backed by IndexedDB, with one object store per adapter. */
296
- declare class IndexedDBAdapter<TMeta = Record<string, unknown>> implements StorageAdapter<TMeta> {
297
- readonly storageKey: string;
298
- private readonly databaseName;
299
- private readonly storeName;
300
- private readonly version;
301
- private readonly indexedDB;
302
- private databasePromise;
303
- constructor(options?: IndexedDBAdapterOptions);
304
- getAll(): Promise<KeepItem<TMeta>[]>;
305
- set(item: KeepItem<TMeta>): Promise<void>;
306
- setMany(items: KeepItem<TMeta>[]): Promise<void>;
307
- remove(id: string): Promise<void>;
308
- removeMany(ids: string[]): Promise<void>;
309
- clear(): Promise<void>;
310
- merge(localItems: KeepItem<TMeta>[]): Promise<KeepItem<TMeta>[]>;
311
- subscribe(listener: () => void): () => void;
312
- private notifySubscribers;
313
- private open;
314
- }
315
-
316
- export { KeepStorageQuotaError as A, type KeepSyncStatus as B, type LocalStorageAdapterOptions as C, DEFAULT_INDEXEDDB_DATABASE as D, LocalStorageSyncQueueAdapter as E, type LocalStorageSyncQueueOptions as F, type RemoteSyncResult as G, type StorageAdapterFactoryOptions as H, IndexedDBAdapter as I, type SyncCapableStorageAdapter as J, type KeepSchema as K, LocalStorageAdapter as L, type SyncOperation as M, type SyncQueueAdapter as N, SyncStorageAdapter as O, type SyncStorageAdapterOptions as P, createStorageAdapter as Q, type RemoteSyncDriver as R, type StorageAdapter as S, normalizeKeepTags as T, type KeepInvalidItemPolicy as a, type KeepItem as b, type KeepItemInput as c, type KeepEventHandlers as d, type KeepPlugin as e, type KeepSyncState as f, type KeepPluginContext as g, DEFAULT_INDEXEDDB_STORE as h, DEFAULT_STORAGE_KEY as i, DEFAULT_SYNC_QUEUE_DATABASE as j, DEFAULT_SYNC_QUEUE_KEY as k, DEFAULT_SYNC_QUEUE_STORE as l, type IndexedDBAdapterOptions as m, IndexedDBSyncQueueAdapter as n, type IndexedDBSyncQueueOptions as o, type KeepAction as p, type KeepChangeContext as q, type KeepChangePhase as r, type KeepConflictContext as s, type KeepConflictResolver as t, type KeepErrorContext as u, type KeepErrorHandler as v, KeepStorageAccessError as w, KeepStorageError as x, type KeepStorageOperation as y, KeepStorageParseError as z };