mpb-localkit 1.4.9 → 1.4.11

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.
@@ -316,16 +316,28 @@ function LocalKitProvider({
316
316
  const [defaultClient] = useState(() => new QueryClient());
317
317
  const client = queryClient ?? defaultClient;
318
318
  const upgraded = useRef(false);
319
+ console.log("[LocalKit] Provider render:", {
320
+ upgraded: upgraded.current,
321
+ hasIndexedDB: typeof indexedDB !== "undefined",
322
+ collectionsLength: collections.length
323
+ });
319
324
  if (!upgraded.current && typeof indexedDB !== "undefined" && collections.length > 0) {
320
325
  const col = collections[0];
321
326
  const proxy = col[STORAGE_PROXY_KEY];
322
327
  const needsUpgrade = col[NEEDS_UPGRADE_KEY];
328
+ console.log("[LocalKit] Upgrade check:", {
329
+ hasProxy: !!proxy,
330
+ needsUpgrade,
331
+ proxyTarget: proxy ? proxy.target?.constructor?.name : "n/a",
332
+ symbolKeys: Object.getOwnPropertySymbols(col).map((s) => s.toString())
333
+ });
323
334
  if (proxy && needsUpgrade) {
324
335
  proxy.setTarget(new IndexedDBAdapter(appName));
325
336
  for (const c of collections) {
326
337
  c[NEEDS_UPGRADE_KEY] = false;
327
338
  }
328
339
  upgraded.current = true;
340
+ console.log("[LocalKit] Storage upgraded to IndexedDB");
329
341
  }
330
342
  }
331
343
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/query.ts","../../src/react/useCollection.ts","../../src/core/storage/query.ts","../../src/react/useCollectionStore.ts","../../src/react/useAuth.ts","../../src/react/useSync.ts","../../src/core/storage/indexeddb.ts","../../src/react/provider.tsx"],"names":["useQueryClient","useQuery","useMutation","db","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import type { QueryOptions } from './storage/query.js'\nimport type { WithMeta } from './schema/types.js'\nimport type { Collection } from './client/collection.js'\n\n/** Minimal QueryClient interface — avoids a hard dep on @tanstack/query-core */\ninterface MinimalQueryClient {\n invalidateQueries(opts: { queryKey: readonly unknown[] }): Promise<void>\n}\n\nexport const localkitKeys = {\n all: ['offlinekit'] as const,\n collection: (name: string) => ['offlinekit', name] as const,\n collectionQuery: (name: string, opts: unknown) =>\n ['offlinekit', name, JSON.stringify(opts)] as const,\n}\n\nexport function collectionQueryOptions<T>(\n collection: Collection<T>,\n queryOptions?: QueryOptions<T>,\n): {\n queryKey: readonly unknown[]\n queryFn: () => Promise<WithMeta<T>[]>\n} {\n const queryKey = queryOptions\n ? localkitKeys.collectionQuery(collection.name, queryOptions)\n : localkitKeys.collection(collection.name)\n\n return {\n queryKey,\n queryFn: () => collection.findMany(queryOptions),\n }\n}\n\nexport function subscribeToCollection<T>(\n collection: Collection<T>,\n queryClient: MinimalQueryClient,\n): () => void {\n const queryKey = localkitKeys.collection(collection.name)\n\n if (!('subscribe' in collection)) {\n return () => {}\n }\n\n const obs = collection as Collection<T> & {\n subscribe(listener: () => void): () => void\n }\n\n return obs.subscribe(() => {\n void queryClient.invalidateQueries({ queryKey })\n })\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport { localkitKeys } from '../core/query.js'\nimport type { QueryOptions } from '../core/storage/query.js'\nimport type { WithMeta } from '../core/schema/types.js'\nimport type { UseCollectionResult } from './types.js'\n\n/**\n * React hook for reading and mutating an LocalKit collection.\n * Uses @tanstack/react-query for caching and reactivity.\n *\n * @example\n * const { data: brews, create } = useCollection(app.brews)\n * const { data: ipas } = useCollection(app.brews, { where: { style: 'IPA' } })\n */\nexport function useCollection<T>(\n collection: ObservableCollection<T>,\n options?: QueryOptions<T>,\n): UseCollectionResult<T> {\n const queryClient = useQueryClient()\n const queryKey = options\n ? localkitKeys.collectionQuery(collection.name, options)\n : localkitKeys.collection(collection.name)\n\n const query = useQuery({\n queryKey,\n queryFn: () => collection.findMany(options),\n })\n\n const invalidate = () =>\n queryClient.invalidateQueries({ queryKey: localkitKeys.collection(collection.name) })\n\n const createMutation = useMutation({\n mutationFn: (input: T) => collection.create(input),\n onSuccess: invalidate,\n })\n\n const updateMutation = useMutation({\n mutationFn: ({ id, input }: { id: string; input: Partial<T> }) =>\n collection.update(id, input),\n onSuccess: invalidate,\n })\n\n const deleteMutation = useMutation({\n mutationFn: (id: string) => collection.delete(id),\n onSuccess: invalidate,\n })\n\n return {\n data: (query.data ?? []) as WithMeta<T>[],\n isLoading: query.isLoading,\n error: query.error as Error | null,\n create: (input: T) => createMutation.mutateAsync(input),\n update: (id: string, input: Partial<T>) => updateMutation.mutateAsync({ id, input }),\n remove: (id: string) => deleteMutation.mutateAsync(id),\n }\n}\n","export interface QueryOptions<T> {\n where?: WhereClause<T>\n sort?: Partial<Record<keyof T, 'asc' | 'desc'>>\n limit?: number\n offset?: number\n}\n\nexport type WhereClause<T> = {\n [K in keyof T]?: T[K] | { $gt?: T[K]; $lt?: T[K]; $gte?: T[K]; $lte?: T[K]; $in?: T[K][] }\n}\n\ntype FieldCondition<V> = { $gt?: V; $lt?: V; $gte?: V; $lte?: V; $in?: V[] }\n\nfunction isCondition<V>(value: unknown): value is FieldCondition<V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const keys = Object.keys(value)\n return keys.some(k => k === '$gt' || k === '$lt' || k === '$gte' || k === '$lte' || k === '$in')\n}\n\nexport function matchesWhere<T>(doc: T, where: WhereClause<T>): boolean {\n for (const key of Object.keys(where) as Array<keyof T>) {\n const condition = where[key]\n const docValue = doc[key]\n\n if (isCondition<T[typeof key]>(condition)) {\n if (condition.$gt != null && !(docValue > condition.$gt)) return false\n if (condition.$lt != null && !(docValue < condition.$lt)) return false\n if (condition.$gte != null && !(docValue >= condition.$gte)) return false\n if (condition.$lte != null && !(docValue <= condition.$lte)) return false\n if (condition.$in !== undefined && !condition.$in.includes(docValue)) return false\n } else {\n if (docValue !== condition) return false\n }\n }\n return true\n}\n\nexport function applySort<T>(docs: T[], sort: Partial<Record<keyof T, 'asc' | 'desc'>>): T[] {\n const entries = Object.entries(sort) as Array<[keyof T, 'asc' | 'desc']>\n if (entries.length === 0) return docs\n\n return [...docs].sort((a, b) => {\n for (const [field, direction] of entries) {\n const av = a[field]\n const bv = b[field]\n if (av === bv) continue\n const cmp = av < bv ? -1 : 1\n return direction === 'asc' ? cmp : -cmp\n }\n return 0\n })\n}\n\nexport function applyQuery<T>(docs: T[], options: QueryOptions<T>): T[] {\n let result = docs\n\n if (options.where) {\n const where = options.where\n result = result.filter(doc => matchesWhere(doc, where))\n }\n\n if (options.sort) {\n result = applySort(result, options.sort)\n }\n\n const offset = options.offset ?? 0\n if (offset > 0) {\n result = result.slice(offset)\n }\n\n if (options.limit !== undefined) {\n result = result.slice(0, options.limit)\n }\n\n return result\n}\n","import { useSyncExternalStore, useMemo } from 'react'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport type { QueryOptions } from '../core/storage/query.js'\nimport { applyQuery } from '../core/storage/query.js'\nimport type { WithMeta } from '../core/schema/types.js'\n\n/**\n * Zero-dependency React hook for reading an OfflineKit collection.\n * Uses React's built-in useSyncExternalStore for reactivity — no TanStack Query required.\n * Returns a read-only array that updates automatically when documents change.\n *\n * For mutations, use collection.create/update/delete directly.\n *\n * @example\n * const todos = useCollectionStore(app.todos)\n * const ipas = useCollectionStore(app.brews, { where: { style: 'IPA' } })\n */\nexport function useCollectionStore<T>(\n collection: ObservableCollection<T>,\n options?: QueryOptions<T>,\n): ReadonlyArray<WithMeta<T>> {\n const snapshot = useSyncExternalStore(\n collection.subscribe,\n collection.getSnapshot,\n (): ReadonlyArray<WithMeta<T>> => [],\n )\n\n // Serialize options to a stable string so inline object literals don't break memoization.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const optionsKey = options !== undefined ? JSON.stringify(options) : undefined\n\n return useMemo(() => {\n if (!options) return snapshot as unknown as WithMeta<T>[]\n return applyQuery([...snapshot] as WithMeta<T>[], options) as WithMeta<T>[]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [snapshot, optionsKey])\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport type { AuthAdapter } from '../core/auth/types.js'\nimport type { UseAuthResult } from './types.js'\n\nconst AUTH_KEY = ['localkit', 'auth'] as const\n\n/**\n * React hook for LocalKit auth (signUp, signIn, signOut).\n * Uses @tanstack/react-query for state management.\n *\n * @example\n * const { user, signIn } = useAuth(app.auth)\n */\nexport function useAuth(auth: AuthAdapter): UseAuthResult {\n const queryClient = useQueryClient()\n\n const query = useQuery({\n queryKey: AUTH_KEY,\n queryFn: () => Promise.resolve(auth.currentUser()),\n })\n\n const invalidateAuth = () => queryClient.invalidateQueries({ queryKey: AUTH_KEY })\n\n const signUpMut = useMutation({\n mutationFn: (credentials: { email: string; password: string }) => auth.signUp(credentials),\n onSuccess: invalidateAuth,\n })\n\n const signInMut = useMutation({\n mutationFn: (credentials: { email: string; password: string }) => auth.signIn(credentials),\n onSuccess: invalidateAuth,\n })\n\n const signOutMut = useMutation({\n mutationFn: () => auth.signOut(),\n onSuccess: invalidateAuth,\n })\n\n return {\n user: query.data ?? null,\n isLoading: query.isLoading,\n error: (query.error ?? signUpMut.error ?? signInMut.error ?? signOutMut.error) as Error | null,\n signUp: (credentials) => signUpMut.mutateAsync(credentials).then(() => {}),\n signIn: (credentials) => signInMut.mutateAsync(credentials).then(() => {}),\n signOut: () => signOutMut.mutateAsync().then(() => {}),\n }\n}\n","import { useCallback, useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { SyncEngine } from '../core/sync/engine.js'\nimport type { SyncStore } from '../core/client/events.js'\nimport type { SyncAPI } from '../core/client/types.js'\nimport type { UseSyncResult } from './types.js'\n\nconst SYNC_KEY = ['localkit', 'sync'] as const\n\ninterface AppWithSync {\n sync: SyncAPI\n syncStore: SyncStore\n}\n\nfunction isAppWithSync(source: SyncEngine | AppWithSync): source is AppWithSync {\n return 'syncStore' in source\n}\n\n/**\n * React hook for observing and triggering LocalKit sync.\n * Accepts either a raw SyncEngine or an App instance (created by createApp).\n *\n * @example\n * const { status, lastSyncAt, sync } = useSync(app)\n * const { status, lastSyncAt, sync } = useSync(syncEngine)\n */\nexport function useSync(source: SyncEngine | AppWithSync): UseSyncResult {\n const queryClient = useQueryClient()\n const isApp = isAppWithSync(source)\n\n const query = useQuery({\n queryKey: SYNC_KEY,\n queryFn: () => {\n if (isApp) {\n const s = (source as AppWithSync).syncStore.getSnapshot()\n return Promise.resolve({ status: s.status, lastSyncAt: s.lastSyncAt ?? 0 })\n }\n const engine = source as SyncEngine\n return Promise.resolve({ status: engine.getStatus(), lastSyncAt: engine.getLastSyncAt() })\n },\n })\n\n useEffect(() => {\n if (isApp) {\n const appSource = source as AppWithSync\n return appSource.syncStore.subscribe(() => {\n const s = appSource.syncStore.getSnapshot()\n queryClient.setQueryData(SYNC_KEY, { status: s.status, lastSyncAt: s.lastSyncAt ?? 0 })\n })\n } else {\n const engine = source as SyncEngine\n const onStart = () =>\n queryClient.setQueryData(SYNC_KEY, { status: 'syncing', lastSyncAt: engine.getLastSyncAt() })\n const onComplete = () =>\n queryClient.setQueryData(SYNC_KEY, { status: 'idle', lastSyncAt: engine.getLastSyncAt() })\n const onError = () =>\n queryClient.setQueryData(SYNC_KEY, { status: engine.getStatus(), lastSyncAt: engine.getLastSyncAt() })\n\n engine.on('sync:start', onStart)\n engine.on('sync:complete', onComplete)\n engine.on('sync:error', onError)\n\n return () => {\n engine.off('sync:start', onStart)\n engine.off('sync:complete', onComplete)\n engine.off('sync:error', onError)\n }\n }\n }, [source, queryClient, isApp])\n\n const sync = useCallback(async (): Promise<void> => {\n if (isApp) {\n const appSource = source as AppWithSync\n await appSource.sync.push()\n await appSource.sync.pull()\n } else {\n await (source as SyncEngine).sync()\n }\n await queryClient.invalidateQueries({ queryKey: SYNC_KEY })\n }, [source, queryClient, isApp])\n\n return {\n status: query.data?.status ?? 'idle',\n lastSyncAt: query.data?.lastSyncAt ?? 0,\n sync,\n }\n}\n","import { openDB, IDBPDatabase } from 'idb'\nimport type { Doc } from '../schema/types.js'\nimport type { Filter, Change, StorageAdapter } from './types.js'\n\nconst CHANGES_INDEX = '_updatedAt'\n\nexport class IndexedDBAdapter implements StorageAdapter {\n private dbName: string\n private db: IDBPDatabase | null = null\n private _ensureLock: Promise<void> = Promise.resolve()\n\n constructor(appName: string) {\n this.dbName = `offlinekit-${appName}`\n }\n\n private async getDb(): Promise<IDBPDatabase> {\n if (this.db) return this.db\n this.db = await openDB(this.dbName, 1, {\n upgrade(_db) {\n // Stores are created dynamically per collection on first use\n },\n })\n return this.db\n }\n\n private async ensureStore(collection: string): Promise<IDBPDatabase> {\n // Capture and replace the lock synchronously before any await.\n // This serializes concurrent callers: each waits for its predecessor.\n const prev = this._ensureLock\n let release: () => void\n this._ensureLock = new Promise<void>(r => { release = r })\n\n await prev\n\n try {\n let db = await this.getDb()\n if (db.objectStoreNames.contains(collection)) return db\n\n const version = db.version + 1\n db.close()\n this.db = null\n db = await openDB(this.dbName, version, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(collection)) {\n const store = db.createObjectStore(collection, { keyPath: '_id' })\n store.createIndex(CHANGES_INDEX, '_updatedAt')\n }\n },\n })\n this.db = db\n return db\n } finally {\n release!()\n }\n }\n\n async get(collection: string, id: string): Promise<Doc | null> {\n const db = await this.ensureStore(collection)\n const doc = await db.get(collection, id)\n if (!doc || doc._deleted) return null\n return doc as Doc\n }\n\n async getMany(collection: string, filter?: Filter): Promise<Doc[]> {\n const db = await this.ensureStore(collection)\n const all = await db.getAll(collection) as Doc[]\n return all.filter(doc => {\n if (doc._deleted) return false\n if (!filter) return true\n return Object.entries(filter).every(([k, v]) => Reflect.get(doc as object, k) === v)\n })\n }\n\n async put(collection: string, id: string, doc: Doc): Promise<void> {\n const db = await this.ensureStore(collection)\n await db.put(collection, { ...doc, _id: id, _collection: collection })\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const db = await this.ensureStore(collection)\n const existing = await db.get(collection, id) as Doc | undefined\n if (!existing) return\n await db.put(collection, {\n ...existing,\n _deleted: true,\n _updatedAt: Date.now(),\n })\n }\n\n async getChangesSince(timestamp: number): Promise<Change[]> {\n const db = await this.getDb()\n const results: Change[] = []\n for (const storeName of Array.from(db.objectStoreNames)) {\n if (!db.objectStoreNames.contains(storeName)) continue\n const tx = db.transaction(storeName, 'readonly')\n const store = tx.objectStore(storeName)\n const index = store.index(CHANGES_INDEX)\n const range = IDBKeyRange.lowerBound(timestamp, true)\n const docs = await index.getAll(range) as Doc[]\n for (const doc of docs) {\n results.push({\n collection: storeName,\n id: doc._id,\n doc,\n updatedAt: doc._updatedAt,\n deleted: doc._deleted,\n })\n }\n }\n return results\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport { IndexedDBAdapter } from '../core/storage/indexeddb.js'\nimport { subscribeToCollection } from '../core/query.js'\n\n// Symbol.for() produces the same symbol across bundle chunks\nconst STORAGE_PROXY_KEY = Symbol.for('localkit:storageProxy')\n// Flag set on StorageProxy to indicate it needs upgrading (avoids instanceof across chunks)\nconst NEEDS_UPGRADE_KEY = Symbol.for('localkit:needsUpgrade')\n\ninterface StorageProxyLike {\n target: unknown\n setTarget: (adapter: unknown) => void\n}\n\ninterface LocalKitProviderProps {\n children: ReactNode\n queryClient?: QueryClient\n collections?: ObservableCollection<unknown>[]\n /** App name used for the IndexedDB database name (default: 'localkit') */\n appName?: string\n}\n\nexport function LocalKitProvider({\n children,\n queryClient,\n collections = [],\n appName = 'localkit',\n}: LocalKitProviderProps) {\n const [defaultClient] = useState(() => new QueryClient())\n const client = queryClient ?? defaultClient\n const upgraded = useRef(false)\n\n // Discover StorageProxy through collections and upgrade MemoryAdapter→IndexedDB.\n // Uses Symbol.for() so the key matches across separate bundle chunks.\n // Runs during render (not useEffect) so IndexedDB is active before any CRUD.\n if (!upgraded.current && typeof indexedDB !== 'undefined' && collections.length > 0) {\n const col = collections[0] as unknown as Record<symbol, StorageProxyLike | boolean>\n const proxy = col[STORAGE_PROXY_KEY] as StorageProxyLike | undefined\n const needsUpgrade = col[NEEDS_UPGRADE_KEY] as boolean | undefined\n if (proxy && needsUpgrade) {\n proxy.setTarget(new IndexedDBAdapter(appName))\n // Clear the flag on all collections so we don't upgrade again\n for (const c of collections) {\n (c as unknown as Record<symbol, boolean>)[NEEDS_UPGRADE_KEY] = false\n }\n upgraded.current = true\n }\n }\n\n useEffect(() => {\n const unsubs = collections.map(col => subscribeToCollection(col, client))\n return () => {\n for (const unsub of unsubs) unsub()\n }\n }, [client, collections])\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/query.ts","../../src/react/useCollection.ts","../../src/core/storage/query.ts","../../src/react/useCollectionStore.ts","../../src/react/useAuth.ts","../../src/react/useSync.ts","../../src/core/storage/indexeddb.ts","../../src/react/provider.tsx"],"names":["useQueryClient","useQuery","useMutation","db","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import type { QueryOptions } from './storage/query.js'\nimport type { WithMeta } from './schema/types.js'\nimport type { Collection } from './client/collection.js'\n\n/** Minimal QueryClient interface — avoids a hard dep on @tanstack/query-core */\ninterface MinimalQueryClient {\n invalidateQueries(opts: { queryKey: readonly unknown[] }): Promise<void>\n}\n\nexport const localkitKeys = {\n all: ['offlinekit'] as const,\n collection: (name: string) => ['offlinekit', name] as const,\n collectionQuery: (name: string, opts: unknown) =>\n ['offlinekit', name, JSON.stringify(opts)] as const,\n}\n\nexport function collectionQueryOptions<T>(\n collection: Collection<T>,\n queryOptions?: QueryOptions<T>,\n): {\n queryKey: readonly unknown[]\n queryFn: () => Promise<WithMeta<T>[]>\n} {\n const queryKey = queryOptions\n ? localkitKeys.collectionQuery(collection.name, queryOptions)\n : localkitKeys.collection(collection.name)\n\n return {\n queryKey,\n queryFn: () => collection.findMany(queryOptions),\n }\n}\n\nexport function subscribeToCollection<T>(\n collection: Collection<T>,\n queryClient: MinimalQueryClient,\n): () => void {\n const queryKey = localkitKeys.collection(collection.name)\n\n if (!('subscribe' in collection)) {\n return () => {}\n }\n\n const obs = collection as Collection<T> & {\n subscribe(listener: () => void): () => void\n }\n\n return obs.subscribe(() => {\n void queryClient.invalidateQueries({ queryKey })\n })\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport { localkitKeys } from '../core/query.js'\nimport type { QueryOptions } from '../core/storage/query.js'\nimport type { WithMeta } from '../core/schema/types.js'\nimport type { UseCollectionResult } from './types.js'\n\n/**\n * React hook for reading and mutating an LocalKit collection.\n * Uses @tanstack/react-query for caching and reactivity.\n *\n * @example\n * const { data: brews, create } = useCollection(app.brews)\n * const { data: ipas } = useCollection(app.brews, { where: { style: 'IPA' } })\n */\nexport function useCollection<T>(\n collection: ObservableCollection<T>,\n options?: QueryOptions<T>,\n): UseCollectionResult<T> {\n const queryClient = useQueryClient()\n const queryKey = options\n ? localkitKeys.collectionQuery(collection.name, options)\n : localkitKeys.collection(collection.name)\n\n const query = useQuery({\n queryKey,\n queryFn: () => collection.findMany(options),\n })\n\n const invalidate = () =>\n queryClient.invalidateQueries({ queryKey: localkitKeys.collection(collection.name) })\n\n const createMutation = useMutation({\n mutationFn: (input: T) => collection.create(input),\n onSuccess: invalidate,\n })\n\n const updateMutation = useMutation({\n mutationFn: ({ id, input }: { id: string; input: Partial<T> }) =>\n collection.update(id, input),\n onSuccess: invalidate,\n })\n\n const deleteMutation = useMutation({\n mutationFn: (id: string) => collection.delete(id),\n onSuccess: invalidate,\n })\n\n return {\n data: (query.data ?? []) as WithMeta<T>[],\n isLoading: query.isLoading,\n error: query.error as Error | null,\n create: (input: T) => createMutation.mutateAsync(input),\n update: (id: string, input: Partial<T>) => updateMutation.mutateAsync({ id, input }),\n remove: (id: string) => deleteMutation.mutateAsync(id),\n }\n}\n","export interface QueryOptions<T> {\n where?: WhereClause<T>\n sort?: Partial<Record<keyof T, 'asc' | 'desc'>>\n limit?: number\n offset?: number\n}\n\nexport type WhereClause<T> = {\n [K in keyof T]?: T[K] | { $gt?: T[K]; $lt?: T[K]; $gte?: T[K]; $lte?: T[K]; $in?: T[K][] }\n}\n\ntype FieldCondition<V> = { $gt?: V; $lt?: V; $gte?: V; $lte?: V; $in?: V[] }\n\nfunction isCondition<V>(value: unknown): value is FieldCondition<V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const keys = Object.keys(value)\n return keys.some(k => k === '$gt' || k === '$lt' || k === '$gte' || k === '$lte' || k === '$in')\n}\n\nexport function matchesWhere<T>(doc: T, where: WhereClause<T>): boolean {\n for (const key of Object.keys(where) as Array<keyof T>) {\n const condition = where[key]\n const docValue = doc[key]\n\n if (isCondition<T[typeof key]>(condition)) {\n if (condition.$gt != null && !(docValue > condition.$gt)) return false\n if (condition.$lt != null && !(docValue < condition.$lt)) return false\n if (condition.$gte != null && !(docValue >= condition.$gte)) return false\n if (condition.$lte != null && !(docValue <= condition.$lte)) return false\n if (condition.$in !== undefined && !condition.$in.includes(docValue)) return false\n } else {\n if (docValue !== condition) return false\n }\n }\n return true\n}\n\nexport function applySort<T>(docs: T[], sort: Partial<Record<keyof T, 'asc' | 'desc'>>): T[] {\n const entries = Object.entries(sort) as Array<[keyof T, 'asc' | 'desc']>\n if (entries.length === 0) return docs\n\n return [...docs].sort((a, b) => {\n for (const [field, direction] of entries) {\n const av = a[field]\n const bv = b[field]\n if (av === bv) continue\n const cmp = av < bv ? -1 : 1\n return direction === 'asc' ? cmp : -cmp\n }\n return 0\n })\n}\n\nexport function applyQuery<T>(docs: T[], options: QueryOptions<T>): T[] {\n let result = docs\n\n if (options.where) {\n const where = options.where\n result = result.filter(doc => matchesWhere(doc, where))\n }\n\n if (options.sort) {\n result = applySort(result, options.sort)\n }\n\n const offset = options.offset ?? 0\n if (offset > 0) {\n result = result.slice(offset)\n }\n\n if (options.limit !== undefined) {\n result = result.slice(0, options.limit)\n }\n\n return result\n}\n","import { useSyncExternalStore, useMemo } from 'react'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport type { QueryOptions } from '../core/storage/query.js'\nimport { applyQuery } from '../core/storage/query.js'\nimport type { WithMeta } from '../core/schema/types.js'\n\n/**\n * Zero-dependency React hook for reading an OfflineKit collection.\n * Uses React's built-in useSyncExternalStore for reactivity — no TanStack Query required.\n * Returns a read-only array that updates automatically when documents change.\n *\n * For mutations, use collection.create/update/delete directly.\n *\n * @example\n * const todos = useCollectionStore(app.todos)\n * const ipas = useCollectionStore(app.brews, { where: { style: 'IPA' } })\n */\nexport function useCollectionStore<T>(\n collection: ObservableCollection<T>,\n options?: QueryOptions<T>,\n): ReadonlyArray<WithMeta<T>> {\n const snapshot = useSyncExternalStore(\n collection.subscribe,\n collection.getSnapshot,\n (): ReadonlyArray<WithMeta<T>> => [],\n )\n\n // Serialize options to a stable string so inline object literals don't break memoization.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const optionsKey = options !== undefined ? JSON.stringify(options) : undefined\n\n return useMemo(() => {\n if (!options) return snapshot as unknown as WithMeta<T>[]\n return applyQuery([...snapshot] as WithMeta<T>[], options) as WithMeta<T>[]\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [snapshot, optionsKey])\n}\n","import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport type { AuthAdapter } from '../core/auth/types.js'\nimport type { UseAuthResult } from './types.js'\n\nconst AUTH_KEY = ['localkit', 'auth'] as const\n\n/**\n * React hook for LocalKit auth (signUp, signIn, signOut).\n * Uses @tanstack/react-query for state management.\n *\n * @example\n * const { user, signIn } = useAuth(app.auth)\n */\nexport function useAuth(auth: AuthAdapter): UseAuthResult {\n const queryClient = useQueryClient()\n\n const query = useQuery({\n queryKey: AUTH_KEY,\n queryFn: () => Promise.resolve(auth.currentUser()),\n })\n\n const invalidateAuth = () => queryClient.invalidateQueries({ queryKey: AUTH_KEY })\n\n const signUpMut = useMutation({\n mutationFn: (credentials: { email: string; password: string }) => auth.signUp(credentials),\n onSuccess: invalidateAuth,\n })\n\n const signInMut = useMutation({\n mutationFn: (credentials: { email: string; password: string }) => auth.signIn(credentials),\n onSuccess: invalidateAuth,\n })\n\n const signOutMut = useMutation({\n mutationFn: () => auth.signOut(),\n onSuccess: invalidateAuth,\n })\n\n return {\n user: query.data ?? null,\n isLoading: query.isLoading,\n error: (query.error ?? signUpMut.error ?? signInMut.error ?? signOutMut.error) as Error | null,\n signUp: (credentials) => signUpMut.mutateAsync(credentials).then(() => {}),\n signIn: (credentials) => signInMut.mutateAsync(credentials).then(() => {}),\n signOut: () => signOutMut.mutateAsync().then(() => {}),\n }\n}\n","import { useCallback, useEffect } from 'react'\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { SyncEngine } from '../core/sync/engine.js'\nimport type { SyncStore } from '../core/client/events.js'\nimport type { SyncAPI } from '../core/client/types.js'\nimport type { UseSyncResult } from './types.js'\n\nconst SYNC_KEY = ['localkit', 'sync'] as const\n\ninterface AppWithSync {\n sync: SyncAPI\n syncStore: SyncStore\n}\n\nfunction isAppWithSync(source: SyncEngine | AppWithSync): source is AppWithSync {\n return 'syncStore' in source\n}\n\n/**\n * React hook for observing and triggering LocalKit sync.\n * Accepts either a raw SyncEngine or an App instance (created by createApp).\n *\n * @example\n * const { status, lastSyncAt, sync } = useSync(app)\n * const { status, lastSyncAt, sync } = useSync(syncEngine)\n */\nexport function useSync(source: SyncEngine | AppWithSync): UseSyncResult {\n const queryClient = useQueryClient()\n const isApp = isAppWithSync(source)\n\n const query = useQuery({\n queryKey: SYNC_KEY,\n queryFn: () => {\n if (isApp) {\n const s = (source as AppWithSync).syncStore.getSnapshot()\n return Promise.resolve({ status: s.status, lastSyncAt: s.lastSyncAt ?? 0 })\n }\n const engine = source as SyncEngine\n return Promise.resolve({ status: engine.getStatus(), lastSyncAt: engine.getLastSyncAt() })\n },\n })\n\n useEffect(() => {\n if (isApp) {\n const appSource = source as AppWithSync\n return appSource.syncStore.subscribe(() => {\n const s = appSource.syncStore.getSnapshot()\n queryClient.setQueryData(SYNC_KEY, { status: s.status, lastSyncAt: s.lastSyncAt ?? 0 })\n })\n } else {\n const engine = source as SyncEngine\n const onStart = () =>\n queryClient.setQueryData(SYNC_KEY, { status: 'syncing', lastSyncAt: engine.getLastSyncAt() })\n const onComplete = () =>\n queryClient.setQueryData(SYNC_KEY, { status: 'idle', lastSyncAt: engine.getLastSyncAt() })\n const onError = () =>\n queryClient.setQueryData(SYNC_KEY, { status: engine.getStatus(), lastSyncAt: engine.getLastSyncAt() })\n\n engine.on('sync:start', onStart)\n engine.on('sync:complete', onComplete)\n engine.on('sync:error', onError)\n\n return () => {\n engine.off('sync:start', onStart)\n engine.off('sync:complete', onComplete)\n engine.off('sync:error', onError)\n }\n }\n }, [source, queryClient, isApp])\n\n const sync = useCallback(async (): Promise<void> => {\n if (isApp) {\n const appSource = source as AppWithSync\n await appSource.sync.push()\n await appSource.sync.pull()\n } else {\n await (source as SyncEngine).sync()\n }\n await queryClient.invalidateQueries({ queryKey: SYNC_KEY })\n }, [source, queryClient, isApp])\n\n return {\n status: query.data?.status ?? 'idle',\n lastSyncAt: query.data?.lastSyncAt ?? 0,\n sync,\n }\n}\n","import { openDB, IDBPDatabase } from 'idb'\nimport type { Doc } from '../schema/types.js'\nimport type { Filter, Change, StorageAdapter } from './types.js'\n\nconst CHANGES_INDEX = '_updatedAt'\n\nexport class IndexedDBAdapter implements StorageAdapter {\n private dbName: string\n private db: IDBPDatabase | null = null\n private _ensureLock: Promise<void> = Promise.resolve()\n\n constructor(appName: string) {\n this.dbName = `offlinekit-${appName}`\n }\n\n private async getDb(): Promise<IDBPDatabase> {\n if (this.db) return this.db\n this.db = await openDB(this.dbName, 1, {\n upgrade(_db) {\n // Stores are created dynamically per collection on first use\n },\n })\n return this.db\n }\n\n private async ensureStore(collection: string): Promise<IDBPDatabase> {\n // Capture and replace the lock synchronously before any await.\n // This serializes concurrent callers: each waits for its predecessor.\n const prev = this._ensureLock\n let release: () => void\n this._ensureLock = new Promise<void>(r => { release = r })\n\n await prev\n\n try {\n let db = await this.getDb()\n if (db.objectStoreNames.contains(collection)) return db\n\n const version = db.version + 1\n db.close()\n this.db = null\n db = await openDB(this.dbName, version, {\n upgrade(db) {\n if (!db.objectStoreNames.contains(collection)) {\n const store = db.createObjectStore(collection, { keyPath: '_id' })\n store.createIndex(CHANGES_INDEX, '_updatedAt')\n }\n },\n })\n this.db = db\n return db\n } finally {\n release!()\n }\n }\n\n async get(collection: string, id: string): Promise<Doc | null> {\n const db = await this.ensureStore(collection)\n const doc = await db.get(collection, id)\n if (!doc || doc._deleted) return null\n return doc as Doc\n }\n\n async getMany(collection: string, filter?: Filter): Promise<Doc[]> {\n const db = await this.ensureStore(collection)\n const all = await db.getAll(collection) as Doc[]\n return all.filter(doc => {\n if (doc._deleted) return false\n if (!filter) return true\n return Object.entries(filter).every(([k, v]) => Reflect.get(doc as object, k) === v)\n })\n }\n\n async put(collection: string, id: string, doc: Doc): Promise<void> {\n const db = await this.ensureStore(collection)\n await db.put(collection, { ...doc, _id: id, _collection: collection })\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const db = await this.ensureStore(collection)\n const existing = await db.get(collection, id) as Doc | undefined\n if (!existing) return\n await db.put(collection, {\n ...existing,\n _deleted: true,\n _updatedAt: Date.now(),\n })\n }\n\n async getChangesSince(timestamp: number): Promise<Change[]> {\n const db = await this.getDb()\n const results: Change[] = []\n for (const storeName of Array.from(db.objectStoreNames)) {\n if (!db.objectStoreNames.contains(storeName)) continue\n const tx = db.transaction(storeName, 'readonly')\n const store = tx.objectStore(storeName)\n const index = store.index(CHANGES_INDEX)\n const range = IDBKeyRange.lowerBound(timestamp, true)\n const docs = await index.getAll(range) as Doc[]\n for (const doc of docs) {\n results.push({\n collection: storeName,\n id: doc._id,\n doc,\n updatedAt: doc._updatedAt,\n deleted: doc._deleted,\n })\n }\n }\n return results\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport type { ObservableCollection } from '../core/client/collection.js'\nimport { IndexedDBAdapter } from '../core/storage/indexeddb.js'\nimport { subscribeToCollection } from '../core/query.js'\n\n// Symbol.for() produces the same symbol across bundle chunks\nconst STORAGE_PROXY_KEY = Symbol.for('localkit:storageProxy')\n// Flag set on StorageProxy to indicate it needs upgrading (avoids instanceof across chunks)\nconst NEEDS_UPGRADE_KEY = Symbol.for('localkit:needsUpgrade')\n\ninterface StorageProxyLike {\n target: unknown\n setTarget: (adapter: unknown) => void\n}\n\ninterface LocalKitProviderProps {\n children: ReactNode\n queryClient?: QueryClient\n collections?: ObservableCollection<unknown>[]\n /** App name used for the IndexedDB database name (default: 'localkit') */\n appName?: string\n}\n\nexport function LocalKitProvider({\n children,\n queryClient,\n collections = [],\n appName = 'localkit',\n}: LocalKitProviderProps) {\n const [defaultClient] = useState(() => new QueryClient())\n const client = queryClient ?? defaultClient\n const upgraded = useRef(false)\n\n // Discover StorageProxy through collections and upgrade MemoryAdapter→IndexedDB.\n // Uses Symbol.for() so the key matches across separate bundle chunks.\n // Runs during render (not useEffect) so IndexedDB is active before any CRUD.\n // Diagnostic: log unconditionally before any checks\n console.log('[LocalKit] Provider render:', {\n upgraded: upgraded.current,\n hasIndexedDB: typeof indexedDB !== 'undefined',\n collectionsLength: collections.length,\n })\n\n if (!upgraded.current && typeof indexedDB !== 'undefined' && collections.length > 0) {\n const col = collections[0] as unknown as Record<symbol, StorageProxyLike | boolean>\n const proxy = col[STORAGE_PROXY_KEY] as StorageProxyLike | undefined\n const needsUpgrade = col[NEEDS_UPGRADE_KEY] as boolean | undefined\n\n console.log('[LocalKit] Upgrade check:', {\n hasProxy: !!proxy,\n needsUpgrade,\n proxyTarget: proxy ? (proxy.target as { constructor?: { name?: string } })?.constructor?.name : 'n/a',\n symbolKeys: Object.getOwnPropertySymbols(col).map(s => s.toString()),\n })\n\n if (proxy && needsUpgrade) {\n proxy.setTarget(new IndexedDBAdapter(appName))\n for (const c of collections) {\n (c as unknown as Record<symbol, boolean>)[NEEDS_UPGRADE_KEY] = false\n }\n upgraded.current = true\n console.log('[LocalKit] Storage upgraded to IndexedDB')\n }\n }\n\n useEffect(() => {\n const unsubs = collections.map(col => subscribeToCollection(col, client))\n return () => {\n for (const unsub of unsubs) unsub()\n }\n }, [client, collections])\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mpb-localkit",
3
- "version": "1.4.9",
3
+ "version": "1.4.11",
4
4
  "description": "Type-driven, offline-first SDK for TypeScript developers",
5
5
  "license": "MIT",
6
6
  "author": "Erik Olsen",