korajs 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -17
- package/dist/index.cjs +554 -539
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -52
- package/dist/index.d.ts +9 -52
- package/dist/index.js +538 -528
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +47 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +3 -0
- package/dist/react.d.ts +3 -0
- package/dist/react.js +24 -0
- package/dist/react.js.map +1 -0
- package/dist/svelte.cjs +71 -0
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.d.cts +1 -0
- package/dist/svelte.d.ts +1 -0
- package/dist/svelte.js +48 -0
- package/dist/svelte.js.map +1 -0
- package/dist/vue.cjs +57 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +1 -0
- package/dist/vue.d.ts +1 -0
- package/dist/vue.js +34 -0
- package/dist/vue.js.map +1 -0
- package/package.json +71 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create-app.ts","../src/adapter-resolver.ts","../src/app-not-ready-error.ts","../src/audit-bridge.ts","../src/sync-query-bridge.ts","../src/sync-status-bridge.ts","../src/validate-config.ts","../src/index.ts"],"sourcesContent":["import type { KoraEventEmitter, Operation, SchemaInput } from '@korajs/core'\nimport { buildScopeMap } from '@korajs/core'\nimport { SimpleEventEmitter } from '@korajs/core/internal'\nimport { Instrumenter } from '@korajs/devtools'\nimport { MergeEngine } from '@korajs/merge'\nimport { Store } from '@korajs/store'\nimport type {\n\tAuditExportOptions,\n\tBackupOptions,\n\tCollectionAccessor,\n\tQueryBuilder,\n\tReplaySnapshot,\n\tRestoreOptions,\n\tRestoreResult,\n\tStorageAdapter,\n} from '@korajs/store'\nimport {\n\tConnectionMonitor,\n\tHttpLongPollingTransport,\n\tReconnectionManager,\n\tSyncEncryptor,\n\tSyncEngine,\n\tWebSocketTransport,\n} from '@korajs/sync'\nimport type { SyncTransport } from '@korajs/sync'\nimport type { SyncStatusInfo } from '@korajs/sync'\nimport { createAdapter, detectAdapterType } from './adapter-resolver'\nimport { AppNotReadyError } from './app-not-ready-error'\nimport { ApplyPipeline } from './apply-pipeline'\nimport { wireAuditPersistence } from './audit-bridge'\nimport { MergeAwareSyncStore } from './merge-aware-sync-store'\nimport { StoreQueueStorage } from './store-queue-storage'\nimport { StoreSyncStatePersistence } from './store-sync-state'\nimport { createSyncQuerySubscriptionHook } from './sync-query-bridge'\nimport { createSyncStatusBridge } from './sync-status-bridge'\nimport type {\n\tAuthSyncBinding,\n\tKoraApp,\n\tKoraConfig,\n\tKoraSyncEvent,\n\tSequenceAccessor,\n\tSyncControl,\n\tTransactionProxy,\n\tTypedKoraApp,\n\tTypedKoraConfig,\n} from './types'\nimport { validateCreateAppConfig } from './validate-config'\n\n/**\n * Creates a new Kora application instance.\n *\n * Wires together store, merge engine, event emitter, and optionally sync\n * into a single developer-facing `KoraApp` object. Collection accessors\n * (e.g. `app.todos`) are defined as properties for immediate use after `await app.ready`.\n *\n * @param config - Application configuration including schema and optional sync settings\n * @returns A KoraApp instance with reactive collections ready for use\n *\n * @example\n * ```typescript\n * const app = createApp({\n * schema: defineSchema({\n * version: 1,\n * collections: {\n * todos: {\n * fields: {\n * title: t.string(),\n * completed: t.boolean().default(false)\n * }\n * }\n * }\n * })\n * })\n *\n * await app.ready\n * const todo = await app.todos.insert({ title: 'Hello' })\n * ```\n */\n/**\n * Creates a new typed Kora application instance.\n * When the schema is created with `defineSchema()`, full type inference flows through\n * to collection accessors, providing autocomplete and type checking for all CRUD operations.\n */\nexport function createApp<const S extends SchemaInput>(config: TypedKoraConfig<S>): TypedKoraApp<S>\n/**\n * Creates a new Kora application instance (untyped fallback).\n */\nexport function createApp(config: KoraConfig): KoraApp\nexport function createApp<const S extends SchemaInput>(\n\tconfig: TypedKoraConfig<S> | KoraConfig,\n): TypedKoraApp<S> | KoraApp {\n\tvalidateCreateAppConfig(config)\n\n\tconst emitter: KoraEventEmitter & { clear(): void } = new SimpleEventEmitter()\n\tconst mergeEngine = new MergeEngine()\n\n\tif (config.onSyncEvent) {\n\t\tconst handler = config.onSyncEvent\n\t\tconst syncTypes = [\n\t\t\t'sync:connected',\n\t\t\t'sync:disconnected',\n\t\t\t'sync:schema-mismatch',\n\t\t\t'sync:auth-failed',\n\t\t\t'sync:sent',\n\t\t\t'sync:received',\n\t\t\t'sync:acknowledged',\n\t\t\t'sync:apply-failed',\n\t\t\t'sync:diagnostics',\n\t\t\t'sync:bandwidth',\n\t\t\t'sync:initial-sync-progress',\n\t\t] as const\n\t\tfor (const type of syncTypes) {\n\t\t\temitter.on(type, (event) => {\n\t\t\t\thandler(event as KoraSyncEvent)\n\t\t\t})\n\t\t}\n\t}\n\n\tlet store: Store | null = null\n\tlet syncEngine: SyncEngine | null = null\n\tlet unsubscribeSync: (() => void) | null = null\n\tlet unsubscribeAudit: (() => void) | null = null\n\tlet reconnectionManager: ReconnectionManager | null = null\n\tlet connectionMonitor: ConnectionMonitor | null = null\n\tlet instrumenter: Instrumenter | null = null\n\tlet intentionalDisconnect = false\n\tlet qualityInterval: ReturnType<typeof setInterval> | null = null\n\tlet syncStatusBridge: ReturnType<typeof createSyncStatusBridge> | null = null\n\tlet destroyDevtoolsOverlay: (() => void) | null = null\n\n\t// Wire DevTools instrumentation immediately (emitter exists synchronously)\n\tif (config.devtools) {\n\t\tinstrumenter = new Instrumenter(emitter, {\n\t\t\tbridgeEnabled: typeof globalThis !== 'undefined' && 'window' in globalThis,\n\t\t})\n\t\tif (typeof globalThis !== 'undefined' && 'window' in globalThis) {\n\t\t\tvoid import('@korajs/devtools/overlay')\n\t\t\t\t.then(({ mountKoraDevtoolsOverlay }) => {\n\t\t\t\t\tif (instrumenter) {\n\t\t\t\t\t\tdestroyDevtoolsOverlay = mountKoraDevtoolsOverlay(instrumenter)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// Overlay is optional; extension bridge still works.\n\t\t\t\t})\n\t\t}\n\t}\n\n\t// Build the ready promise — resolves when the store is open and wired\n\tconst ready = initializeAsync(config, emitter, mergeEngine).then((result) => {\n\t\tstore = result.store\n\t\tsyncEngine = result.syncEngine\n\t\tunsubscribeSync = result.unsubscribeSync\n\t\tunsubscribeAudit = result.unsubscribeAudit\n\t\tconst authBinding = result.authBinding\n\n\t\tif (config.sync) {\n\t\t\tsyncStatusBridge = createSyncStatusBridge(emitter, () => syncEngine)\n\t\t\tsyncStatusBridge.refresh()\n\t\t}\n\n\t\tif (config.sync && syncEngine && authBinding?.subscribe) {\n\t\t\tauthBinding.subscribe(() => {\n\t\t\t\tconst engine = syncEngine\n\t\t\t\tif (!engine) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tvoid (async () => {\n\t\t\t\t\tconst headers = await authBinding.auth()\n\t\t\t\t\tif (!headers.token) {\n\t\t\t\t\t\tawait engine.stop()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (authBinding.resolveScopeMap) {\n\t\t\t\t\t\tconst nextScope = await authBinding.resolveScopeMap()\n\t\t\t\t\t\tengine.updateScope(nextScope)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst status = engine.getStatus().status\n\t\t\t\t\tif (status !== 'offline') {\n\t\t\t\t\t\tawait engine.stop()\n\t\t\t\t\t}\n\t\t\t\t\tawait engine.start()\n\t\t\t\t})()\n\t\t\t})\n\t\t}\n\n\t\t// Wire reconnection and connection quality after sync engine is ready\n\t\tif (config.sync && syncEngine) {\n\t\t\tconnectionMonitor = new ConnectionMonitor()\n\t\t\treconnectionManager = new ReconnectionManager({\n\t\t\t\tinitialDelay: config.sync.reconnectInterval,\n\t\t\t\tmaxDelay: config.sync.maxReconnectInterval,\n\t\t\t})\n\n\t\t\t// Track activity for connection quality\n\t\t\temitter.on('sync:sent', () => connectionMonitor?.recordActivity())\n\t\t\temitter.on('sync:received', () => connectionMonitor?.recordActivity())\n\t\t\temitter.on('sync:acknowledged', () => connectionMonitor?.recordActivity())\n\n\t\t\t// Emit quality on timer while connected\n\t\t\temitter.on('sync:connected', () => {\n\t\t\t\tif (qualityInterval !== null) clearInterval(qualityInterval)\n\t\t\t\tqualityInterval = setInterval(() => {\n\t\t\t\t\tif (connectionMonitor) {\n\t\t\t\t\t\temitter.emit({ type: 'connection:quality', quality: connectionMonitor.getQuality() })\n\t\t\t\t\t}\n\t\t\t\t}, 5000)\n\t\t\t})\n\n\t\t\t// Reset monitor and clear timer on disconnect\n\t\t\temitter.on('sync:disconnected', () => {\n\t\t\t\tconnectionMonitor?.reset()\n\t\t\t\tif (qualityInterval !== null) {\n\t\t\t\t\tclearInterval(qualityInterval)\n\t\t\t\t\tqualityInterval = null\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Reconnect immediately when the browser reports connectivity restored\n\t\t\tconst browserGlobal = globalThis as typeof globalThis & {\n\t\t\t\taddEventListener?: (type: string, listener: () => void) => void\n\t\t\t}\n\t\t\tif (typeof browserGlobal.addEventListener === 'function') {\n\t\t\t\tconst engine = syncEngine\n\t\t\t\tbrowserGlobal.addEventListener('online', () => {\n\t\t\t\t\tif (intentionalDisconnect || config.sync?.autoReconnect === false) return\n\t\t\t\t\treconnectionManager?.wake()\n\t\t\t\t\treconnectionManager?.reset()\n\t\t\t\t\tvoid engine.retryNow()\n\t\t\t\t})\n\t\t\t}\n\n\t\t\temitter.on('sync:schema-mismatch', () => {\n\t\t\t\treconnectionManager?.stop()\n\t\t\t\tintentionalDisconnect = true\n\t\t\t})\n\n\t\t\t// Auto-reconnect on unexpected disconnect\n\t\t\tif (config.sync.autoReconnect !== false) {\n\t\t\t\tconst engine = syncEngine\n\t\t\t\temitter.on('sync:disconnected', () => {\n\t\t\t\t\tif (intentionalDisconnect || engine.isSchemaBlocked()) return\n\t\t\t\t\t// Ignore cascading disconnect events from failed reconnection attempts.\n\t\t\t\t\t// The reconnection manager is already retrying — don't restart it.\n\t\t\t\t\tif (reconnectionManager?.isRunning()) return\n\n\t\t\t\t\tengine.setReconnecting(true)\n\t\t\t\t\treconnectionManager?.stop()\n\t\t\t\t\treconnectionManager\n\t\t\t\t\t\t?.start(async () => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait engine.start()\n\t\t\t\t\t\t\t\tengine.setReconnecting(false)\n\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t// If reconnection exhausted max attempts without success, clear flag\n\t\t\t\t\t\t\tengine.setReconnecting(false)\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (config.sync.autoConnect === true && syncEngine) {\n\t\t\t\tvoid syncEngine.start().catch(() => {\n\t\t\t\t\t// Errors surface via sync:disconnected / sync events; avoid unhandled rejection.\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t})\n\n\tconst offlineSyncStatus = (): SyncStatusInfo => ({\n\t\tstatus: 'offline',\n\t\tpendingOperations: 0,\n\t\tlastSyncedAt: null,\n\t\tlastSuccessfulPush: null,\n\t\tlastSuccessfulPull: null,\n\t\tconflicts: 0,\n\t})\n\n\t// Build sync control\n\tconst syncControl: SyncControl | null = config.sync\n\t\t? {\n\t\t\t\tget status(): SyncStatusInfo {\n\t\t\t\t\treturn syncStatusBridge?.status ?? offlineSyncStatus()\n\t\t\t\t},\n\t\t\t\tsubscribeStatus(listener: (status: SyncStatusInfo) => void): () => void {\n\t\t\t\t\tif (syncStatusBridge) {\n\t\t\t\t\t\treturn syncStatusBridge.subscribe(listener)\n\t\t\t\t\t}\n\t\t\t\t\tlistener(offlineSyncStatus())\n\t\t\t\t\treturn () => {}\n\t\t\t\t},\n\t\t\t\tasync connect(): Promise<void> {\n\t\t\t\t\tawait ready\n\t\t\t\t\tif (syncEngine) {\n\t\t\t\t\t\tintentionalDisconnect = false\n\t\t\t\t\t\treconnectionManager?.stop()\n\t\t\t\t\t\treconnectionManager?.reset()\n\t\t\t\t\t\tawait syncEngine.start()\n\t\t\t\t\t\tsyncStatusBridge?.refresh()\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tasync disconnect(): Promise<void> {\n\t\t\t\t\tawait ready\n\t\t\t\t\tif (syncEngine) {\n\t\t\t\t\t\tintentionalDisconnect = true\n\t\t\t\t\t\treconnectionManager?.stop()\n\t\t\t\t\t\tawait syncEngine.stop()\n\t\t\t\t\t\tsyncStatusBridge?.refresh()\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetStatus(): SyncStatusInfo {\n\t\t\t\t\tif (syncEngine) {\n\t\t\t\t\t\treturn syncEngine.getStatus()\n\t\t\t\t\t}\n\t\t\t\t\treturn offlineSyncStatus()\n\t\t\t\t},\n\t\t\t\tasync retryNow(): Promise<void> {\n\t\t\t\t\tawait ready\n\t\t\t\t\tif (syncEngine) {\n\t\t\t\t\t\tawait syncEngine.retryNow()\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tclearSchemaBlock(): void {\n\t\t\t\t\tsyncEngine?.clearSchemaBlock()\n\t\t\t\t},\n\t\t\t\texportDiagnostics() {\n\t\t\t\t\tif (syncEngine) {\n\t\t\t\t\t\treturn syncEngine.exportDiagnostics()\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstate: 'disconnected' as const,\n\t\t\t\t\t\tstatus: {\n\t\t\t\t\t\t\tstatus: 'offline' as const,\n\t\t\t\t\t\t\tpendingOperations: 0,\n\t\t\t\t\t\t\tlastSyncedAt: null,\n\t\t\t\t\t\t\tlastSuccessfulPush: null,\n\t\t\t\t\t\t\tlastSuccessfulPull: null,\n\t\t\t\t\t\t\tconflicts: 0,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnodeId: '',\n\t\t\t\t\t\turl: config.sync?.url ?? '',\n\t\t\t\t\t\tschemaVersion: config.schema.version,\n\t\t\t\t\t\tlastSyncedAt: null,\n\t\t\t\t\t\tlastSuccessfulPush: null,\n\t\t\t\t\t\tlastSuccessfulPull: null,\n\t\t\t\t\t\tconflicts: 0,\n\t\t\t\t\t\tpendingOperations: 0,\n\t\t\t\t\t\thasInFlightBatch: false,\n\t\t\t\t\t\treconnecting: false,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}\n\t\t: null\n\n\t// Shared transaction executor for both transaction() and mutation()\n\tasync function executeTransaction(\n\t\tfn: (tx: TransactionProxy) => Promise<void>,\n\t\tmutationName?: string,\n\t): Promise<Operation[]> {\n\t\tawait ready\n\t\tif (!store) {\n\t\t\tthrow new Error('Store not initialized. Await app.ready before using transactions.')\n\t\t}\n\t\tconst collectionNames = Object.keys(config.schema.collections)\n\n\t\treturn store.transaction(async (tx) => {\n\t\t\tif (mutationName !== undefined) {\n\t\t\t\ttx.setMutationName(mutationName)\n\t\t\t}\n\t\t\tconst proxy: TransactionProxy = {} as TransactionProxy\n\t\t\tfor (const name of collectionNames) {\n\t\t\t\tObject.defineProperty(proxy, name, {\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn tx.collection(name)\n\t\t\t\t\t},\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: false,\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait fn(proxy)\n\t\t})\n\t}\n\n\t// Build sequences accessor (delegates to SequenceManager after ready)\n\tconst sequences: SequenceAccessor = {\n\t\tasync next(name, config) {\n\t\t\tawait ready\n\t\t\tif (!store) throw new Error('Store not initialized. Await app.ready before using sequences.')\n\t\t\treturn store.getSequenceManager().next(name, config)\n\t\t},\n\t\tasync current(name, config) {\n\t\t\tawait ready\n\t\t\tif (!store) throw new Error('Store not initialized. Await app.ready before using sequences.')\n\t\t\treturn store.getSequenceManager().current(name, config)\n\t\t},\n\t\tasync reset(name, config) {\n\t\t\tawait ready\n\t\t\tif (!store) throw new Error('Store not initialized. Await app.ready before using sequences.')\n\t\t\treturn store.getSequenceManager().reset(name, config)\n\t\t},\n\t}\n\n\t// Build the KoraApp object\n\tconst app: KoraApp = {\n\t\tready,\n\t\tevents: emitter,\n\t\tsync: syncControl,\n\t\tsequences,\n\t\tgetStore(): Store {\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before accessing the store.')\n\t\t\t}\n\t\t\treturn store\n\t\t},\n\t\tgetSyncEngine(): SyncEngine | null {\n\t\t\treturn syncEngine\n\t\t},\n\t\tasync transaction(fn: (tx: TransactionProxy) => Promise<void>): Promise<Operation[]> {\n\t\t\treturn executeTransaction(fn)\n\t\t},\n\t\tasync mutation(\n\t\t\tname: string,\n\t\t\tfn: (tx: TransactionProxy) => Promise<void>,\n\t\t): Promise<Operation[]> {\n\t\t\treturn executeTransaction(fn, name)\n\t\t},\n\t\tasync close(): Promise<void> {\n\t\t\tawait ready\n\t\t\tintentionalDisconnect = true\n\t\t\tif (qualityInterval !== null) {\n\t\t\t\tclearInterval(qualityInterval)\n\t\t\t\tqualityInterval = null\n\t\t\t}\n\t\t\treconnectionManager?.stop()\n\t\t\tif (destroyDevtoolsOverlay) {\n\t\t\t\tdestroyDevtoolsOverlay()\n\t\t\t\tdestroyDevtoolsOverlay = null\n\t\t\t}\n\t\t\tif (instrumenter) {\n\t\t\t\tinstrumenter.destroy()\n\t\t\t\tinstrumenter = null\n\t\t\t}\n\t\t\tif (unsubscribeSync) {\n\t\t\t\tunsubscribeSync()\n\t\t\t\tunsubscribeSync = null\n\t\t\t}\n\t\t\tif (unsubscribeAudit) {\n\t\t\t\tunsubscribeAudit()\n\t\t\t\tunsubscribeAudit = null\n\t\t\t}\n\t\t\tif (syncEngine) {\n\t\t\t\tawait syncEngine.stop()\n\t\t\t\tsyncEngine = null\n\t\t\t}\n\t\t\tif (syncStatusBridge) {\n\t\t\t\tsyncStatusBridge.destroy()\n\t\t\t\tsyncStatusBridge = null\n\t\t\t}\n\t\t\tif (store) {\n\t\t\t\tawait store.close()\n\t\t\t\tstore = null\n\t\t\t}\n\t\t\temitter.clear()\n\t\t},\n\t\tasync exportBackup(options?: BackupOptions): Promise<Uint8Array> {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before exporting backup.')\n\t\t\t}\n\t\t\treturn store.exportBackup(options)\n\t\t},\n\t\tasync importBackup(data: Uint8Array, options?: RestoreOptions): Promise<RestoreResult> {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before importing backup.')\n\t\t\t}\n\t\t\treturn store.importBackup(data, options)\n\t\t},\n\t\tasync replayTo(operationId: string): Promise<ReplaySnapshot> {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before replaying operations.')\n\t\t\t}\n\t\t\treturn store.replayTo(operationId)\n\t\t},\n\t\tasync exportAudit(options?: AuditExportOptions): Promise<Uint8Array> {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before exporting audit data.')\n\t\t\t}\n\t\t\treturn store.exportAudit(options)\n\t\t},\n\t}\n\n\t// Define collection accessors via Object.defineProperty.\n\t// Before ready resolves, query methods return empty results.\n\tfor (const collectionName of Object.keys(config.schema.collections)) {\n\t\tObject.defineProperty(app, collectionName, {\n\t\t\tget(): CollectionAccessor {\n\t\t\t\treturn createCollectionAccessor(collectionName, () => store)\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t})\n\t}\n\n\treturn app\n}\n\n/**\n * Asynchronous initialization: create adapter, open store, wire sync.\n */\nasync function initializeAsync(\n\tconfig: KoraConfig,\n\temitter: KoraEventEmitter,\n\tmergeEngine: MergeEngine,\n): Promise<{\n\tstore: Store\n\tsyncEngine: SyncEngine | null\n\tunsubscribeSync: (() => void) | null\n\tunsubscribeAudit: (() => void) | null\n\tauthBinding: AuthSyncBinding | null\n}> {\n\t// Resolve adapter\n\tconst adapterType = config.store?.adapter ?? detectAdapterType()\n\tconst dbName = config.store?.name ?? 'kora-db'\n\tconst adapter: StorageAdapter = await createAdapter(\n\t\tadapterType,\n\t\tdbName,\n\t\tconfig.store?.workerUrl,\n\t\temitter,\n\t\tconfig.store?.workerResponseTimeoutMs,\n\t\tconfig.store?.sharedWorkerUrl,\n\t)\n\n\t// Device-bound sync node id from auth token (`dev` claim), separate from user id (`sub`).\n\tconst authBinding = config.sync?.authClient\n\tconst authNodeId = authBinding?.resolveNodeId ? await authBinding.resolveNodeId() : undefined\n\n\t// Create and open the store (sync query hook uses a ref filled after SyncEngine is created)\n\tlet syncEngine: SyncEngine | null = null\n\n\tconst store = new Store({\n\t\tschema: config.schema,\n\t\tadapter,\n\t\temitter,\n\t\tdbName,\n\t\tnodeId: authNodeId,\n\t\tisolation: authNodeId ? 'shared' : config.store?.isolation,\n\t\t...(config.sync\n\t\t\t? { onQuerySubscribed: createSyncQuerySubscriptionHook(() => syncEngine) }\n\t\t\t: {}),\n\t})\n\tawait store.open()\n\n\tlet recordConflict: (() => void) | undefined\n\tconst applyPipeline = new ApplyPipeline({\n\t\tstore,\n\t\tmergeEngine,\n\t\temitter,\n\t\tonMergeConflict: () => recordConflict?.(),\n\t})\n\tstore.setLocalMutationHandler(applyPipeline)\n\tconst unsubscribeAudit = wireAuditPersistence(store, emitter)\n\n\t// Wire sync if configured\n\tlet unsubscribeSync: (() => void) | null = null\n\n\tif (config.sync) {\n\t\tconst transport = createSyncTransport(config.sync)\n\t\tconst mergeAwareStore = new MergeAwareSyncStore(store, mergeEngine, emitter, {\n\t\t\tonMergeConflict: () => recordConflict?.(),\n\t\t})\n\n\t\t// Build scope map from auth binding, flat scope values, or static config\n\t\tlet scopeMap = config.sync.scope ? buildScopeMap(config.schema, config.sync.scope) : undefined\n\t\tif (authBinding?.resolveScopeMap) {\n\t\t\tscopeMap = (await authBinding.resolveScopeMap()) ?? scopeMap\n\t\t}\n\n\t\tconst syncAuth = authBinding?.auth ?? config.sync.auth\n\n\t\tconst encryptor =\n\t\t\tconfig.sync.encryption?.enabled === true\n\t\t\t\t? await SyncEncryptor.create(config.sync.encryption)\n\t\t\t\t: undefined\n\n\t\tsyncEngine = new SyncEngine({\n\t\t\ttransport,\n\t\t\tstore: mergeAwareStore,\n\t\t\tconfig: {\n\t\t\t\turl: config.sync.url,\n\t\t\t\ttransport: config.sync.transport,\n\t\t\t\tauth: syncAuth,\n\t\t\t\tbatchSize: config.sync.batchSize,\n\t\t\t\tschemaVersion: config.sync.schemaVersion ?? config.schema.version,\n\t\t\t\tscopeMap,\n\t\t\t\tencryption: config.sync.encryption,\n\t\t\t\tstrictHandshake: config.sync.strictHandshake,\n\t\t\t\toperationTransforms: config.sync.operationTransforms,\n\t\t\t},\n\t\t\temitter,\n\t\t\tqueueStorage: new StoreQueueStorage(adapter),\n\t\t\tsyncState: new StoreSyncStatePersistence(store, scopeMap),\n\t\t\tencryptor,\n\t\t})\n\t\trecordConflict = () => syncEngine?.recordConflict()\n\n\t\t// Wire local mutations → sync outbound queue\n\t\tunsubscribeSync = emitter.on('operation:created', (event) => {\n\t\t\tif (syncEngine) {\n\t\t\t\tsyncEngine.pushOperation(event.operation)\n\t\t\t}\n\t\t})\n\t}\n\n\treturn {\n\t\tstore,\n\t\tsyncEngine,\n\t\tunsubscribeSync,\n\t\tunsubscribeAudit,\n\t\tauthBinding: config.sync?.authClient ?? null,\n\t}\n}\n\nfunction createSyncTransport(sync: NonNullable<KoraConfig['sync']>): SyncTransport {\n\tif (sync.transport === 'http') {\n\t\treturn new HttpLongPollingTransport()\n\t}\n\treturn new WebSocketTransport()\n}\n\nfunction createCollectionAccessor(\n\tcollectionName: string,\n\tgetStore: () => Store | null,\n): CollectionAccessor {\n\treturn {\n\t\tasync insert(data: Record<string, unknown>) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow new Error(`Cannot mutate collection \"${collectionName}\" before app.ready resolves.`)\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).insert(data)\n\t\t},\n\t\tasync findById(id: string) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) return null\n\t\t\treturn currentStore.collection(collectionName).findById(id)\n\t\t},\n\t\tasync update(id: string, data: Record<string, unknown>) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow new Error(`Cannot mutate collection \"${collectionName}\" before app.ready resolves.`)\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).update(id, data)\n\t\t},\n\t\tasync delete(id: string) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow new Error(`Cannot mutate collection \"${collectionName}\" before app.ready resolves.`)\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).delete(id)\n\t\t},\n\t\twhere(conditions: Record<string, unknown>) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\treturn createPendingQueryBuilder(conditions)\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).where(conditions)\n\t\t},\n\t}\n}\n\nfunction createPendingQueryBuilder(initialWhere: Record<string, unknown>): QueryBuilder {\n\tconst descriptor = {\n\t\tcollection: '__pending__',\n\t\twhere: { ...initialWhere },\n\t\torderBy: [] as Array<{ field: string; direction: 'asc' | 'desc' }>,\n\t\tlimit: undefined as number | undefined,\n\t\toffset: undefined as number | undefined,\n\t}\n\n\tconst builder = {\n\t\twhere(conditions: Record<string, unknown>) {\n\t\t\tdescriptor.where = { ...descriptor.where, ...conditions }\n\t\t\treturn this\n\t\t},\n\t\torderBy(field: string, direction: 'asc' | 'desc' = 'asc') {\n\t\t\tdescriptor.orderBy.push({ field, direction })\n\t\t\treturn this\n\t\t},\n\t\tlimit(n: number) {\n\t\t\tdescriptor.limit = n\n\t\t\treturn this\n\t\t},\n\t\toffset(n: number) {\n\t\t\tdescriptor.offset = n\n\t\t\treturn this\n\t\t},\n\t\tasync exec() {\n\t\t\tthrow new AppNotReadyError(\n\t\t\t\t'Cannot execute a query before app.ready. Await app.ready or use <KoraProvider app={app}>.',\n\t\t\t)\n\t\t},\n\t\tasync count() {\n\t\t\tthrow new AppNotReadyError(\n\t\t\t\t'Cannot count query results before app.ready. Await app.ready or use <KoraProvider app={app}>.',\n\t\t\t)\n\t\t},\n\t\tsubscribe(_callback: (results: Array<Record<string, unknown>>) => void) {\n\t\t\tthrow new AppNotReadyError(\n\t\t\t\t'Cannot subscribe to a query before app.ready. Await app.ready or use <KoraProvider app={app}>.',\n\t\t\t)\n\t\t},\n\t\tgetDescriptor() {\n\t\t\treturn { ...descriptor, where: { ...descriptor.where }, orderBy: [...descriptor.orderBy] }\n\t\t},\n\t}\n\n\treturn builder as unknown as QueryBuilder\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport type { StorageAdapter } from '@korajs/store'\nimport type { AdapterType } from './types'\n\n/** Dynamic import that bundlers cannot statically analyze (optional peer packages). */\nfunction importOptionalPeer<T>(specifier: string): Promise<T> {\n\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\ts: string,\n\t) => Promise<T>\n\treturn dynamicImport(specifier)\n}\n\n/**\n * Detect the best storage adapter for the current environment.\n *\n * - Tauri app: 'tauri-sqlite' (native SQLite via Tauri plugin)\n * - Node.js: 'better-sqlite3'\n * - Browser with OPFS: 'sqlite-wasm'\n * - Browser without OPFS: 'indexeddb'\n */\nexport function detectAdapterType(): AdapterType {\n\t// Tauri environment — detected via __TAURI_INTERNALS__ injected by the Tauri runtime\n\tif (\n\t\ttypeof globalThis !== 'undefined' &&\n\t\ttypeof (globalThis as Record<string, unknown>).__TAURI_INTERNALS__ !== 'undefined'\n\t) {\n\t\treturn 'tauri-sqlite'\n\t}\n\n\t// Node.js environment\n\tif (typeof process !== 'undefined' && process.versions?.node) {\n\t\treturn 'better-sqlite3'\n\t}\n\n\t// Browser environment\n\tif (typeof globalThis.navigator !== 'undefined') {\n\t\t// Check for OPFS support (FileSystemHandle indicates OPFS availability)\n\t\tif (typeof (globalThis as Record<string, unknown>).FileSystemHandle !== 'undefined') {\n\t\t\treturn 'sqlite-wasm'\n\t\t}\n\t\treturn 'indexeddb'\n\t}\n\n\t// Default fallback (e.g., Deno, Bun, or other runtimes)\n\treturn 'better-sqlite3'\n}\n\n/**\n * Create a StorageAdapter for the given adapter type.\n * Uses dynamic imports so unused adapters are not bundled.\n *\n * @param type - The adapter type to create\n * @param dbName - Database name (used by all adapters)\n * @returns A configured StorageAdapter instance\n */\nexport async function createAdapter(\n\ttype: AdapterType,\n\tdbName: string,\n\tworkerUrl?: string | URL,\n\temitter?: KoraEventEmitter,\n\tworkerResponseTimeoutMs?: number,\n\tsharedWorkerUrl?: string | URL,\n): Promise<StorageAdapter> {\n\tswitch (type) {\n\t\tcase 'tauri-sqlite': {\n\t\t\t// @korajs/tauri is only installed in Tauri projects (optional peer dep).\n\t\t\t// Runtime import via Function so Vite/Rollup do not pre-bundle or resolve the module.\n\t\t\tconst { TauriSqliteAdapter } = await importOptionalPeer<{\n\t\t\t\tTauriSqliteAdapter: new (options: { path: string }) => StorageAdapter\n\t\t\t}>('@korajs/tauri')\n\t\t\treturn new TauriSqliteAdapter({ path: `${dbName}.db` })\n\t\t}\n\t\tcase 'better-sqlite3': {\n\t\t\tconst { BetterSqlite3Adapter } = await import(\n\t\t\t\t/* @vite-ignore */ '@korajs/store/better-sqlite3'\n\t\t\t)\n\t\t\treturn new BetterSqlite3Adapter(dbName)\n\t\t}\n\t\tcase 'sqlite-wasm': {\n\t\t\tconst { SqliteWasmAdapter } = await import('@korajs/store/sqlite-wasm')\n\t\t\treturn new SqliteWasmAdapter({ dbName, workerUrl, sharedWorkerUrl, workerResponseTimeoutMs })\n\t\t}\n\t\tcase 'indexeddb': {\n\t\t\tconst { IndexedDbAdapter } = await import('@korajs/store/indexeddb')\n\t\t\treturn new IndexedDbAdapter({ dbName, workerUrl, emitter, workerResponseTimeoutMs })\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = type\n\t\t\tthrow new Error(`Unknown adapter type: ${_exhaustive}`)\n\t\t}\n\t}\n}\n","import { KoraError } from '@korajs/core'\n\n/**\n * Thrown when collection/query APIs are used before {@link KoraApp.ready} resolves.\n */\nexport class AppNotReadyError extends KoraError {\n\tconstructor(detail: string) {\n\t\tsuper(detail, 'APP_NOT_READY', {\n\t\t\tfix: 'Await app.ready, or wrap your UI in <KoraProvider app={app}> before calling useQuery().',\n\t\t})\n\t\tthis.name = 'AppNotReadyError'\n\t}\n}\n","import type { KoraEvent, KoraEventEmitter } from '@korajs/core'\nimport type { Store } from '@korajs/store'\nimport { persistedAuditTraceFromEvent } from '@korajs/store'\n\nconst AUDIT_EVENT_TYPES = ['merge:completed', 'merge:conflict', 'constraint:violated'] as const\n\ntype AuditEventType = (typeof AUDIT_EVENT_TYPES)[number]\n\nfunction isAuditEvent(event: KoraEvent): event is Extract<KoraEvent, { type: AuditEventType }> {\n\treturn (AUDIT_EVENT_TYPES as readonly string[]).includes(event.type)\n}\n\n/**\n * Persist merge and constraint traces from the event bus to `_kora_audit_traces`.\n */\nexport function wireAuditPersistence(store: Store, emitter: KoraEventEmitter): () => void {\n\tconst unsubscribers = AUDIT_EVENT_TYPES.map((eventType) =>\n\t\temitter.on(eventType, (event) => {\n\t\t\tif (!isAuditEvent(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst trace = persistedAuditTraceFromEvent(event)\n\t\t\tvoid store.appendAuditTrace(trace).catch(() => {\n\t\t\t\t// Audit persistence must not break mutations or sync.\n\t\t\t})\n\t\t}),\n\t)\n\n\treturn () => {\n\t\tfor (const unsub of unsubscribers) {\n\t\t\tunsub()\n\t\t}\n\t}\n}\n","import type { QueryDescriptor } from '@korajs/store'\nimport type { SyncEngine } from '@korajs/sync'\nimport type { SyncQuerySubset } from '@korajs/sync'\n\n/**\n * Extract equality-only WHERE conditions for sync query subset registration.\n * Operator-based filters (e.g. `$gt`) are not representable as sync subsets yet.\n */\nexport function queryDescriptorToSyncSubset(descriptor: QueryDescriptor): SyncQuerySubset | null {\n\tconst where: Record<string, unknown> = {}\n\n\tfor (const [field, value] of Object.entries(descriptor.where)) {\n\t\tif (value === null || value === undefined) {\n\t\t\twhere[field] = value\n\t\t\tcontinue\n\t\t}\n\t\tif (typeof value !== 'object' || Array.isArray(value)) {\n\t\t\twhere[field] = value\n\t\t}\n\t}\n\n\tif (Object.keys(where).length === 0) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\tcollection: descriptor.collection,\n\t\twhere,\n\t}\n}\n\n/**\n * Creates a store hook that registers live query filters with the sync engine.\n */\nexport function createSyncQuerySubscriptionHook(\n\tgetSyncEngine: () => SyncEngine | null,\n): (descriptor: QueryDescriptor) => () => void {\n\treturn (descriptor) => {\n\t\tconst subset = queryDescriptorToSyncSubset(descriptor)\n\t\tif (!subset) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\tconst engine = getSyncEngine()\n\t\tif (!engine) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\treturn engine.registerQuerySubset(subset)\n\t}\n}\n","import type { KoraEventEmitter, KoraEventType } from '@korajs/core'\nimport type { SyncStatusInfo } from '@korajs/sync'\n\nconst OFFLINE_STATUS: SyncStatusInfo = Object.freeze({\n\tstatus: 'offline',\n\tpendingOperations: 0,\n\tlastSyncedAt: null,\n\tlastSuccessfulPush: null,\n\tlastSuccessfulPull: null,\n\tconflicts: 0,\n})\n\n/** Sync-related events that may change {@link SyncStatusInfo}. */\nconst SYNC_STATUS_EVENT_TYPES = [\n\t'sync:connected',\n\t'sync:disconnected',\n\t'sync:schema-mismatch',\n\t'sync:auth-failed',\n\t'sync:sent',\n\t'sync:received',\n\t'sync:acknowledged',\n\t'sync:apply-failed',\n\t'sync:diagnostics',\n\t'sync:initial-sync-progress',\n] as const satisfies readonly KoraEventType[]\n\n/**\n * Event-driven sync status snapshot for non-React consumers (`app.sync.status`).\n */\nexport interface SyncStatusBridge {\n\treadonly status: SyncStatusInfo\n\tsubscribe(listener: (status: SyncStatusInfo) => void): () => void\n\trefresh(): void\n\tdestroy(): void\n}\n\n/**\n * Subscribe to sync events and expose a reactive status snapshot.\n */\nexport function createSyncStatusBridge(\n\temitter: KoraEventEmitter,\n\tgetSyncEngine: () => { getStatus(): SyncStatusInfo } | null,\n): SyncStatusBridge {\n\tlet currentStatus: SyncStatusInfo = OFFLINE_STATUS\n\tconst listeners = new Set<(status: SyncStatusInfo) => void>()\n\n\tconst refresh = (): void => {\n\t\tconst engine = getSyncEngine()\n\t\tconst next = engine ? engine.getStatus() : OFFLINE_STATUS\n\t\tconst prevSerialized = JSON.stringify(currentStatus)\n\t\tconst nextSerialized = JSON.stringify(next)\n\t\tif (prevSerialized === nextSerialized) {\n\t\t\treturn\n\t\t}\n\t\tcurrentStatus = next\n\t\tfor (const listener of listeners) {\n\t\t\tlistener(currentStatus)\n\t\t}\n\t}\n\n\tconst unsubs: Array<() => void> = []\n\tfor (const type of SYNC_STATUS_EVENT_TYPES) {\n\t\tunsubs.push(emitter.on(type, refresh))\n\t}\n\n\tconst bridge: SyncStatusBridge = {\n\t\tget status() {\n\t\t\treturn currentStatus\n\t\t},\n\t\tsubscribe(listener: (status: SyncStatusInfo) => void): () => void {\n\t\t\tlisteners.add(listener)\n\t\t\tlistener(currentStatus)\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener)\n\t\t\t}\n\t\t},\n\t\trefresh,\n\t\tdestroy(): void {\n\t\t\tfor (const unsub of unsubs) {\n\t\t\t\tunsub()\n\t\t\t}\n\t\t\tunsubs.length = 0\n\t\t\tlisteners.clear()\n\t\t},\n\t}\n\n\trefresh()\n\n\treturn bridge\n}\n","import { KoraError, SchemaValidationError } from '@korajs/core'\nimport { detectAdapterType } from './adapter-resolver'\nimport type { KoraConfig } from './types'\n\n/**\n * Fail fast on invalid createApp configuration before opening storage or sync.\n */\nexport function validateCreateAppConfig(config: KoraConfig): void {\n\tif (!config.schema) {\n\t\tthrow new SchemaValidationError('createApp requires a schema.', {\n\t\t\tfix: 'Pass schema: defineSchema({ version: 1, collections: { ... } })',\n\t\t})\n\t}\n\n\tif (config.schema.version < 1) {\n\t\tthrow new SchemaValidationError('Schema version must be at least 1.', {\n\t\t\tversion: config.schema.version,\n\t\t})\n\t}\n\n\tconst collectionNames = Object.keys(config.schema.collections)\n\tif (collectionNames.length === 0) {\n\t\tthrow new SchemaValidationError('Schema must define at least one collection.', {\n\t\t\tfix: 'Add entries under collections in defineSchema().',\n\t\t})\n\t}\n\n\tif (config.sync) {\n\t\tvalidateSyncUrl(config.sync.url, config.sync.transport ?? 'websocket')\n\t}\n\n\tconst adapter = config.store?.adapter ?? detectAdapterType()\n\tconst isBrowser =\n\t\ttypeof globalThis !== 'undefined' &&\n\t\ttypeof (globalThis as Record<string, unknown>).window !== 'undefined'\n\n\tif (\n\t\tisBrowser &&\n\t\t(adapter === 'sqlite-wasm' || adapter === 'indexeddb') &&\n\t\t!config.store?.workerUrl\n\t) {\n\t\tthrow new KoraError(\n\t\t\t'Browser storage requires store.workerUrl pointing to the SQLite WASM worker script.',\n\t\t\t'MISSING_WORKER_URL',\n\t\t\t{\n\t\t\t\tadapter,\n\t\t\t\tfix: 'Add store: { workerUrl: \"/sqlite-wasm-worker.js\" } (see create-kora-app templates).',\n\t\t\t},\n\t\t)\n\t}\n}\n\nfunction validateSyncUrl(url: string, transport: 'websocket' | 'http'): void {\n\tif (!url || url.trim().length === 0) {\n\t\tthrow new KoraError('sync.url is required when sync is configured.', 'INVALID_SYNC_URL', {\n\t\t\tfix: 'Pass sync: { url: \"wss://your-server/kora\" }.',\n\t\t})\n\t}\n\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\tif (transport === 'http') {\n\t\t\tif (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n\t\t\t\tthrow new Error('bad protocol')\n\t\t\t}\n\t\t} else if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {\n\t\t\tthrow new Error('bad protocol')\n\t\t}\n\t} catch {\n\t\tthrow new KoraError(\n\t\t\t`Invalid sync URL \"${url}\" for transport \"${transport}\".`,\n\t\t\t'INVALID_SYNC_URL',\n\t\t\t{\n\t\t\t\turl,\n\t\t\t\ttransport,\n\t\t\t\tfix:\n\t\t\t\t\ttransport === 'http'\n\t\t\t\t\t\t? 'Use an absolute http:// or https:// URL.'\n\t\t\t\t\t\t: 'Use an absolute ws:// or wss:// URL.',\n\t\t\t},\n\t\t)\n\t}\n}\n","// kora — meta-package re-exporting core, store, merge, sync\n// This is the primary entry point for `import { createApp, defineSchema, t } from 'korajs'`\n\n// === createApp factory ===\nexport { createApp } from './create-app'\n\n// === App types ===\nexport type {\n\tAdapterType,\n\tAuthSyncBinding,\n\tKoraApp,\n\tKoraConfig,\n\tStoreOptions,\n\tSyncControl,\n\tSyncOptions,\n\tSequenceAccessor,\n\tTransactionCollectionProxy,\n\tTransactionProxy,\n\tTypedCollectionAccessor,\n\tTypedKoraApp,\n\tTypedKoraConfig,\n} from './types'\n\nexport type { ReplaySnapshot } from '@korajs/store'\nexport type {\n\tAuditExportManifest,\n\tAuditExportOptions,\n\tAuditExportPayload,\n\tPersistedAuditTrace,\n} from '@korajs/store'\nexport {\n\tdecodeAuditExport,\n\treadAuditExportManifest,\n\tverifyAuditExportChecksum,\n} from '@korajs/store'\n\n// === @korajs/core re-exports ===\nexport { defineSchema, migrate, t } from '@korajs/core'\nexport { HybridLogicalClock } from '@korajs/core'\nexport { generateUUIDv7 } from '@korajs/core'\nexport { createOperation } from '@korajs/core'\nexport { KoraError } from '@korajs/core'\nexport { op } from '@korajs/core'\nexport type {\n\tAtomicOp,\n\tAtomicOpType,\n\tCollectionDefinition,\n\tConnectionQuality,\n\tConstraint,\n\tFieldDescriptor,\n\tFieldKindToType,\n\tHLCTimestamp,\n\tInferFieldType,\n\tInferInsertInput,\n\tInferRecord,\n\tInferUpdateInput,\n\tKoraEvent,\n\tKoraEventEmitter,\n\tKoraEventListener,\n\tKoraEventType,\n\tMergeStrategy,\n\tMergeTrace,\n\tMigrationDefinition,\n\tMigrationStep,\n\tOperation,\n\tSchemaDefinition,\n\tSchemaInput,\n\tSequenceConfig,\n\tSyncRuleDefinition,\n\tTypedSchemaDefinition,\n\tVersionVector,\n} from '@korajs/core'\n\n// === @korajs/store re-exports ===\nexport { SequenceManager, Store } from '@korajs/store'\nexport { TransactionContext } from '@korajs/store'\nexport {\n\texportBackup,\n\treadBackupManifest,\n\trestoreBackup,\n\tverifyBackupChecksum,\n} from '@korajs/store'\nexport type {\n\tBackupManifest,\n\tBackupOptions,\n\tBackupProgress,\n\tCollectionAccessor,\n\tCollectionRecord,\n\tRestoreOptions,\n\tRestoreResult,\n\tStorageAdapter,\n\tStoreConfig,\n\tTransactionCollectionAccessor,\n\tTransactionContextConfig,\n} from '@korajs/store'\n\n// === @korajs/merge re-exports ===\nexport { MergeEngine } from '@korajs/merge'\nexport type { MergeInput, MergeResult } from '@korajs/merge'\n\n// === @korajs/sync re-exports ===\nexport { SyncEngine, WebSocketTransport } from '@korajs/sync'\nexport type {\n\tSyncConfig,\n\tSyncDiagnostics,\n\tSyncEncryptionConfig,\n\tSyncState,\n\tSyncStatus,\n\tSyncStatusInfo,\n\tSyncStore,\n} from '@korajs/sync'\n"],"mappings":"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","names":["KoraError","KoraError","config","KoraError","Store","MergeEngine","SyncEngine","WebSocketTransport"]}
|
|
1
|
+
{"version":3,"sources":["../src/create-app.ts","../src/collection-accessor.ts","../src/initialize-app.ts","../src/adapter-resolver.ts","../src/audit-bridge.ts","../src/create-sync-transport.ts","../src/sync-query-bridge.ts","../src/sequences-accessor.ts","../src/setup-devtools.ts","../src/sync-control.ts","../src/auth-sync-coordinator.ts","../src/sync-status-bridge.ts","../src/sync-lifecycle.ts","../src/transaction-executor.ts","../src/validate-config.ts","../src/wire-sync-event-forwarding.ts","../src/index.ts"],"sourcesContent":["import type { SchemaInput } from '@korajs/core'\nimport { SimpleEventEmitter } from '@korajs/core/internal'\nimport { MergeEngine } from '@korajs/merge'\nimport type { Store } from '@korajs/store'\nimport { QueryStoreCache } from '@korajs/store'\nimport type { SyncEngine } from '@korajs/sync'\nimport { createCollectionAccessor } from './collection-accessor'\nimport { initializeApp } from './initialize-app'\nimport { createSequencesAccessor } from './sequences-accessor'\nimport { setupDevtools } from './setup-devtools'\nimport { createSyncControl } from './sync-control'\nimport { type SyncRuntimeState, teardownSyncLifecycle, wireSyncLifecycleAfterReady } from './sync-lifecycle'\nimport { createTransactionExecutor } from './transaction-executor'\nimport type { KoraApp, KoraConfig, TypedKoraApp, TypedKoraConfig } from './types'\nimport { validateCreateAppConfig } from './validate-config'\nimport { wireSyncEventForwarding } from './wire-sync-event-forwarding'\n\n/**\n * Creates a new Kora application instance.\n *\n * Wires together store, merge engine, event emitter, and optionally sync\n * into a single developer-facing `KoraApp` object. Collection accessors\n * (e.g. `app.todos`) are defined as properties for immediate use after `await app.ready`.\n */\nexport function createApp<const S extends SchemaInput>(config: TypedKoraConfig<S>): TypedKoraApp<S>\nexport function createApp(config: KoraConfig): KoraApp\nexport function createApp<const S extends SchemaInput>(\n\tconfig: TypedKoraConfig<S> | KoraConfig,\n): TypedKoraApp<S> | KoraApp {\n\tvalidateCreateAppConfig(config)\n\n\tconst emitter = new SimpleEventEmitter()\n\tconst mergeEngine = new MergeEngine()\n\n\tif (config.onSyncEvent) {\n\t\twireSyncEventForwarding(emitter, config.onSyncEvent)\n\t}\n\n\tlet store: Store | null = null\n\tlet unsubscribeSync: (() => void) | null = null\n\tlet unsubscribeAudit: (() => void) | null = null\n\n\tconst syncState: SyncRuntimeState = {\n\t\tsyncEngine: null,\n\t\tsyncStatusBridge: null,\n\t\tauthSyncCoordinator: null,\n\t\treconnectionManager: null,\n\t\tconnectionMonitor: null,\n\t\tqualityInterval: null,\n\t\tintentionalDisconnect: false,\n\t\tremoveOnlineListener: null,\n\t}\n\n\tconst devtools = setupDevtools(config, emitter)\n\tconst queryStoreCache = new QueryStoreCache(config.store?.name ?? 'kora-db')\n\n\tconst ready = initializeApp(config, emitter, mergeEngine).then((init) => {\n\t\tstore = init.store\n\t\tunsubscribeSync = init.unsubscribeSync\n\t\tunsubscribeAudit = init.unsubscribeAudit\n\t\twireSyncLifecycleAfterReady(config, emitter, syncState, init)\n\t})\n\n\tconst getStore = (): Store | null => store\n\tconst executeTransaction = createTransactionExecutor(config, ready, getStore)\n\n\tconst app: KoraApp = {\n\t\tready,\n\t\tevents: emitter,\n\t\tsync: createSyncControl({ config, ready, state: syncState }),\n\t\tsequences: createSequencesAccessor(ready, getStore),\n\t\tgetStore(): Store {\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before accessing the store.')\n\t\t\t}\n\t\t\treturn store\n\t\t},\n\t\tgetSyncEngine(): SyncEngine | null {\n\t\t\treturn syncState.syncEngine\n\t\t},\n\t\tgetQueryStoreCache(): QueryStoreCache {\n\t\t\treturn queryStoreCache\n\t\t},\n\t\ttransaction(fn) {\n\t\t\treturn executeTransaction(fn)\n\t\t},\n\t\tmutation(name, fn) {\n\t\t\treturn executeTransaction(fn, name)\n\t\t},\n\t\tasync close() {\n\t\t\tawait ready\n\t\t\tsyncState.intentionalDisconnect = true\n\t\t\tteardownSyncLifecycle(syncState)\n\t\t\tdevtools.destroyOverlay?.()\n\t\t\tdevtools.instrumenter?.destroy()\n\t\t\tif (unsubscribeSync) {\n\t\t\t\tunsubscribeSync()\n\t\t\t\tunsubscribeSync = null\n\t\t\t}\n\t\t\tif (unsubscribeAudit) {\n\t\t\t\tunsubscribeAudit()\n\t\t\t\tunsubscribeAudit = null\n\t\t\t}\n\t\t\tif (syncState.syncEngine) {\n\t\t\t\tawait syncState.syncEngine.stop()\n\t\t\t\tsyncState.syncEngine = null\n\t\t\t}\n\t\t\tqueryStoreCache.clear()\n\t\t\tif (store) {\n\t\t\t\tawait store.close()\n\t\t\t\tstore = null\n\t\t\t}\n\t\t\temitter.clear()\n\t\t},\n\t\tasync exportBackup(options) {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before exporting backup.')\n\t\t\t}\n\t\t\treturn store.exportBackup(options)\n\t\t},\n\t\tasync importBackup(data, options) {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before importing backup.')\n\t\t\t}\n\t\t\treturn store.importBackup(data, options)\n\t\t},\n\t\tasync replayTo(operationId) {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before replaying operations.')\n\t\t\t}\n\t\t\treturn store.replayTo(operationId)\n\t\t},\n\t\tasync exportAudit(options) {\n\t\t\tawait ready\n\t\t\tif (!store) {\n\t\t\t\tthrow new Error('Store not initialized. Await app.ready before exporting audit data.')\n\t\t\t}\n\t\t\treturn store.exportAudit(options)\n\t\t},\n\t}\n\n\tfor (const collectionName of Object.keys(config.schema.collections)) {\n\t\tObject.defineProperty(app, collectionName, {\n\t\t\tget() {\n\t\t\t\treturn createCollectionAccessor(collectionName, getStore)\n\t\t\t},\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t})\n\t}\n\n\treturn app\n}\n","import { AppNotReadyError } from '@korajs/core'\nimport type { CollectionAccessor, QueryBuilder, Store } from '@korajs/store'\n\n/**\n * Builds a collection accessor that throws {@link AppNotReadyError} until the store opens.\n */\nexport function createCollectionAccessor(\n\tcollectionName: string,\n\tgetStore: () => Store | null,\n): CollectionAccessor {\n\tconst notReady = (action: string): AppNotReadyError =>\n\t\tnew AppNotReadyError(\n\t\t\t`Cannot ${action} on collection \"${collectionName}\" before app.ready. Await app.ready or use <KoraProvider app={app}>.`,\n\t\t)\n\n\treturn {\n\t\tasync insert(data: Record<string, unknown>) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow notReady('insert into')\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).insert(data)\n\t\t},\n\t\tasync findById(id: string) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) return null\n\t\t\treturn currentStore.collection(collectionName).findById(id)\n\t\t},\n\t\tasync update(id: string, data: Record<string, unknown>) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow notReady('update')\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).update(id, data)\n\t\t},\n\t\tasync delete(id: string) {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow notReady('delete from')\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).delete(id)\n\t\t},\n\t\twhere(conditions: Record<string, unknown>): QueryBuilder {\n\t\t\tconst currentStore = getStore()\n\t\t\tif (!currentStore) {\n\t\t\t\tthrow notReady('query')\n\t\t\t}\n\t\t\treturn currentStore.collection(collectionName).where(conditions)\n\t\t},\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport { buildScopeMap } from '@korajs/core'\nimport type { MergeEngine } from '@korajs/merge'\nimport { Store } from '@korajs/store'\nimport type { StorageAdapter } from '@korajs/store'\nimport { SyncEncryptor, SyncEngine } from '@korajs/sync'\nimport { createAdapter, detectAdapterType } from './adapter-resolver'\nimport { ApplyPipeline } from './apply-pipeline'\nimport { wireAuditPersistence } from './audit-bridge'\nimport { createSyncTransport } from './create-sync-transport'\nimport { MergeAwareSyncStore } from './merge-aware-sync-store'\nimport { StoreQueueStorage } from './store-queue-storage'\nimport { StoreSyncStatePersistence } from './store-sync-state'\nimport { createSyncQuerySubscriptionHook } from './sync-query-bridge'\nimport type { AuthSyncBinding, KoraConfig } from './types'\n\n/** Result of opening the local store and optionally constructing a sync engine. */\nexport interface InitializeAppResult {\n\tstore: Store\n\tsyncEngine: SyncEngine | null\n\tunsubscribeSync: (() => void) | null\n\tunsubscribeAudit: (() => void) | null\n\tauthBinding: AuthSyncBinding | null\n}\n\n/**\n * Opens the local store, wires apply/audit pipelines, and optionally constructs sync.\n */\nexport async function initializeApp(\n\tconfig: KoraConfig,\n\temitter: KoraEventEmitter,\n\tmergeEngine: MergeEngine,\n): Promise<InitializeAppResult> {\n\tconst adapterType = config.store?.adapter ?? detectAdapterType()\n\tconst dbName = config.store?.name ?? 'kora-db'\n\tconst adapter: StorageAdapter = await createAdapter(\n\t\tadapterType,\n\t\tdbName,\n\t\tconfig.store?.workerUrl,\n\t\temitter,\n\t\tconfig.store?.workerResponseTimeoutMs,\n\t\tconfig.store?.sharedWorkerUrl,\n\t)\n\n\tconst authBinding = config.sync?.authClient ?? null\n\tconst authNodeId = authBinding?.resolveNodeId ? await authBinding.resolveNodeId() : undefined\n\n\tlet syncEngine: SyncEngine | null = null\n\n\tconst store = new Store({\n\t\tschema: config.schema,\n\t\tadapter,\n\t\temitter,\n\t\tdbName,\n\t\tnodeId: authNodeId,\n\t\tisolation: authNodeId ? 'shared' : config.store?.isolation,\n\t\t...(config.sync ? { onQuerySubscribed: createSyncQuerySubscriptionHook(() => syncEngine) } : {}),\n\t})\n\tawait store.open()\n\n\tlet recordConflict: (() => void) | undefined\n\tconst applyPipeline = new ApplyPipeline({\n\t\tstore,\n\t\tmergeEngine,\n\t\temitter,\n\t\tonMergeConflict: () => recordConflict?.(),\n\t})\n\tstore.setLocalMutationHandler(applyPipeline)\n\tconst unsubscribeAudit = wireAuditPersistence(store, emitter)\n\n\tlet unsubscribeSync: (() => void) | null = null\n\n\tif (config.sync) {\n\t\tconst transport = createSyncTransport(config.sync)\n\t\tconst mergeAwareStore = new MergeAwareSyncStore(store, mergeEngine, emitter, {\n\t\t\tonMergeConflict: () => recordConflict?.(),\n\t\t})\n\n\t\tlet scopeMap = config.sync.scope ? buildScopeMap(config.schema, config.sync.scope) : undefined\n\t\tif (authBinding?.resolveScopeMap) {\n\t\t\tscopeMap = (await authBinding.resolveScopeMap()) ?? scopeMap\n\t\t}\n\n\t\tconst syncAuth = authBinding?.auth ?? config.sync.auth\n\n\t\tconst encryptor =\n\t\t\tconfig.sync.encryption?.enabled === true\n\t\t\t\t? await SyncEncryptor.create(config.sync.encryption)\n\t\t\t\t: undefined\n\n\t\tsyncEngine = new SyncEngine({\n\t\t\ttransport,\n\t\t\tstore: mergeAwareStore,\n\t\t\tconfig: {\n\t\t\t\turl: config.sync.url,\n\t\t\t\ttransport: config.sync.transport,\n\t\t\t\tauth: syncAuth,\n\t\t\t\tbatchSize: config.sync.batchSize,\n\t\t\t\tschemaVersion: config.sync.schemaVersion ?? config.schema.version,\n\t\t\t\tscopeMap,\n\t\t\t\tencryption: config.sync.encryption,\n\t\t\t\tstrictHandshake: config.sync.strictHandshake,\n\t\t\t\toperationTransforms: config.sync.operationTransforms,\n\t\t\t},\n\t\t\temitter,\n\t\t\tqueueStorage: new StoreQueueStorage(adapter),\n\t\t\tsyncState: new StoreSyncStatePersistence(store, scopeMap),\n\t\t\tencryptor,\n\t\t})\n\t\trecordConflict = () => syncEngine?.recordConflict()\n\n\t\tunsubscribeSync = emitter.on('operation:created', (event) => {\n\t\t\tif (syncEngine) {\n\t\t\t\tsyncEngine.pushOperation(event.operation)\n\t\t\t}\n\t\t})\n\t}\n\n\treturn {\n\t\tstore,\n\t\tsyncEngine,\n\t\tunsubscribeSync,\n\t\tunsubscribeAudit,\n\t\tauthBinding,\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport type { StorageAdapter } from '@korajs/store'\nimport type { AdapterType } from './types'\n\n/** Dynamic import that bundlers cannot statically analyze (optional peer packages). */\nfunction importOptionalPeer<T>(specifier: string): Promise<T> {\n\tconst dynamicImport = new Function('specifier', 'return import(specifier)') as (\n\t\ts: string,\n\t) => Promise<T>\n\treturn dynamicImport(specifier)\n}\n\n/**\n * Detect the best storage adapter for the current environment.\n *\n * - Tauri app: 'tauri-sqlite' (native SQLite via Tauri plugin)\n * - Node.js: 'better-sqlite3'\n * - Browser with OPFS: 'sqlite-wasm'\n * - Browser without OPFS: 'indexeddb'\n */\nexport function detectAdapterType(): AdapterType {\n\t// Tauri environment — detected via __TAURI_INTERNALS__ injected by the Tauri runtime\n\tif (\n\t\ttypeof globalThis !== 'undefined' &&\n\t\ttypeof (globalThis as Record<string, unknown>).__TAURI_INTERNALS__ !== 'undefined'\n\t) {\n\t\treturn 'tauri-sqlite'\n\t}\n\n\t// Node.js environment\n\tif (typeof process !== 'undefined' && process.versions?.node) {\n\t\treturn 'better-sqlite3'\n\t}\n\n\t// Browser environment\n\tif (typeof globalThis.navigator !== 'undefined') {\n\t\t// Check for OPFS support (FileSystemHandle indicates OPFS availability)\n\t\tif (typeof (globalThis as Record<string, unknown>).FileSystemHandle !== 'undefined') {\n\t\t\treturn 'sqlite-wasm'\n\t\t}\n\t\treturn 'indexeddb'\n\t}\n\n\t// Default fallback (e.g., Deno, Bun, or other runtimes)\n\treturn 'better-sqlite3'\n}\n\n/**\n * Create a StorageAdapter for the given adapter type.\n * Uses dynamic imports so unused adapters are not bundled.\n *\n * @param type - The adapter type to create\n * @param dbName - Database name (used by all adapters)\n * @returns A configured StorageAdapter instance\n */\nexport async function createAdapter(\n\ttype: AdapterType,\n\tdbName: string,\n\tworkerUrl?: string | URL,\n\temitter?: KoraEventEmitter,\n\tworkerResponseTimeoutMs?: number,\n\tsharedWorkerUrl?: string | URL,\n): Promise<StorageAdapter> {\n\tswitch (type) {\n\t\tcase 'tauri-sqlite': {\n\t\t\t// @korajs/tauri is only installed in Tauri projects (optional peer dep).\n\t\t\t// Runtime import via Function so Vite/Rollup do not pre-bundle or resolve the module.\n\t\t\tconst { TauriSqliteAdapter } = await importOptionalPeer<{\n\t\t\t\tTauriSqliteAdapter: new (options: { path: string }) => StorageAdapter\n\t\t\t}>('@korajs/tauri')\n\t\t\treturn new TauriSqliteAdapter({ path: `${dbName}.db` })\n\t\t}\n\t\tcase 'better-sqlite3': {\n\t\t\tconst { BetterSqlite3Adapter } = await import(\n\t\t\t\t/* @vite-ignore */ '@korajs/store/better-sqlite3'\n\t\t\t)\n\t\t\treturn new BetterSqlite3Adapter(dbName)\n\t\t}\n\t\tcase 'sqlite-wasm': {\n\t\t\tconst { SqliteWasmAdapter } = await import('@korajs/store/sqlite-wasm')\n\t\t\treturn new SqliteWasmAdapter({ dbName, workerUrl, sharedWorkerUrl, workerResponseTimeoutMs })\n\t\t}\n\t\tcase 'indexeddb': {\n\t\t\tconst { IndexedDbAdapter } = await import('@korajs/store/indexeddb')\n\t\t\treturn new IndexedDbAdapter({ dbName, workerUrl, emitter, workerResponseTimeoutMs })\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = type\n\t\t\tthrow new Error(`Unknown adapter type: ${_exhaustive}`)\n\t\t}\n\t}\n}\n","import type { KoraEvent, KoraEventEmitter } from '@korajs/core'\nimport type { Store } from '@korajs/store'\nimport { persistedAuditTraceFromEvent } from '@korajs/store'\n\nconst AUDIT_EVENT_TYPES = ['merge:completed', 'merge:conflict', 'constraint:violated'] as const\n\ntype AuditEventType = (typeof AUDIT_EVENT_TYPES)[number]\n\nfunction isAuditEvent(event: KoraEvent): event is Extract<KoraEvent, { type: AuditEventType }> {\n\treturn (AUDIT_EVENT_TYPES as readonly string[]).includes(event.type)\n}\n\n/**\n * Persist merge and constraint traces from the event bus to `_kora_audit_traces`.\n */\nexport function wireAuditPersistence(store: Store, emitter: KoraEventEmitter): () => void {\n\tconst unsubscribers = AUDIT_EVENT_TYPES.map((eventType) =>\n\t\temitter.on(eventType, (event) => {\n\t\t\tif (!isAuditEvent(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst trace = persistedAuditTraceFromEvent(event)\n\t\t\tvoid store.appendAuditTrace(trace).catch(() => {\n\t\t\t\t// Audit persistence must not break mutations or sync.\n\t\t\t})\n\t\t}),\n\t)\n\n\treturn () => {\n\t\tfor (const unsub of unsubscribers) {\n\t\t\tunsub()\n\t\t}\n\t}\n}\n","import { HttpLongPollingTransport, WebSocketTransport } from '@korajs/sync'\nimport type { SyncTransport } from '@korajs/sync'\nimport type { KoraConfig } from './types'\n\n/**\n * Instantiates the sync transport matching {@link KoraConfig.sync} settings.\n */\nexport function createSyncTransport(sync: NonNullable<KoraConfig['sync']>): SyncTransport {\n\tif (sync.transport === 'http') {\n\t\treturn new HttpLongPollingTransport()\n\t}\n\treturn new WebSocketTransport()\n}\n","import type { QueryDescriptor } from '@korajs/store'\nimport type { SyncEngine, SyncQuerySubset } from '@korajs/sync'\n\n/**\n * Extract equality-only WHERE conditions for sync query subset registration.\n * Operator-based filters (e.g. `$gt`) are not representable as sync subsets yet.\n */\nexport function queryDescriptorToSyncSubset(descriptor: QueryDescriptor): SyncQuerySubset | null {\n\tconst where: Record<string, unknown> = {}\n\tconst skippedFields: string[] = []\n\n\tfor (const [field, value] of Object.entries(descriptor.where)) {\n\t\tif (value === null || value === undefined) {\n\t\t\twhere[field] = value\n\t\t\tcontinue\n\t\t}\n\t\tif (typeof value !== 'object' || Array.isArray(value)) {\n\t\t\twhere[field] = value\n\t\t\tcontinue\n\t\t}\n\t\tskippedFields.push(field)\n\t}\n\n\tif (skippedFields.length > 0 && typeof console !== 'undefined') {\n\t\tconsole.warn(\n\t\t\t`[Kora] Sync query subset omitted non-equality filters on ${descriptor.collection}: ${skippedFields.join(', ')}. ` +\n\t\t\t\t'Only plain equality WHERE clauses are registered for incremental sync.',\n\t\t)\n\t}\n\n\tif (Object.keys(where).length === 0) {\n\t\treturn null\n\t}\n\n\treturn {\n\t\tcollection: descriptor.collection,\n\t\twhere,\n\t}\n}\n\n/**\n * Creates a store hook that registers live query filters with the sync engine.\n */\nexport function createSyncQuerySubscriptionHook(\n\tgetSyncEngine: () => SyncEngine | null,\n): (descriptor: QueryDescriptor) => () => void {\n\treturn (descriptor) => {\n\t\tconst subset = queryDescriptorToSyncSubset(descriptor)\n\t\tif (!subset) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\tconst engine = getSyncEngine()\n\t\tif (!engine) {\n\t\t\treturn () => {}\n\t\t}\n\n\t\treturn engine.registerQuerySubset(subset)\n\t}\n}\n","import type { Store } from '@korajs/store'\nimport type { SequenceAccessor } from './types'\n\n/**\n * Builds the offline-safe sequences accessor backed by the store sequence manager.\n */\nexport function createSequencesAccessor(\n\tready: Promise<void>,\n\tgetStore: () => Store | null,\n): SequenceAccessor {\n\tconst requireStore = async (): Promise<Store> => {\n\t\tawait ready\n\t\tconst store = getStore()\n\t\tif (!store) {\n\t\t\tthrow new Error('Store not initialized. Await app.ready before using sequences.')\n\t\t}\n\t\treturn store\n\t}\n\n\treturn {\n\t\tasync next(name, config) {\n\t\t\tconst store = await requireStore()\n\t\t\treturn store.getSequenceManager().next(name, config)\n\t\t},\n\t\tasync current(name, config) {\n\t\t\tconst store = await requireStore()\n\t\t\treturn store.getSequenceManager().current(name, config)\n\t\t},\n\t\tasync reset(name, config) {\n\t\t\tconst store = await requireStore()\n\t\t\treturn store.getSequenceManager().reset(name, config)\n\t\t},\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport { Instrumenter } from '@korajs/devtools'\nimport type { KoraConfig } from './types'\n\nexport interface DevtoolsSetup {\n\tinstrumenter: Instrumenter | null\n\tdestroyOverlay: (() => void) | null\n}\n\n/**\n * Enables DevTools instrumentation and optionally mounts the browser overlay.\n */\nexport function setupDevtools(config: KoraConfig, emitter: KoraEventEmitter): DevtoolsSetup {\n\tif (!config.devtools) {\n\t\treturn { instrumenter: null, destroyOverlay: null }\n\t}\n\n\tconst instrumenter = new Instrumenter(emitter, {\n\t\tbridgeEnabled: typeof globalThis !== 'undefined' && 'window' in globalThis,\n\t})\n\n\tlet destroyOverlay: (() => void) | null = null\n\n\tif (typeof globalThis !== 'undefined' && 'window' in globalThis) {\n\t\tvoid import('@korajs/devtools/overlay')\n\t\t\t.then(({ mountKoraDevtoolsOverlay }) => {\n\t\t\t\tdestroyOverlay = mountKoraDevtoolsOverlay(instrumenter)\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Overlay is optional; extension bridge still works.\n\t\t\t})\n\t}\n\n\treturn { instrumenter, destroyOverlay: () => destroyOverlay?.() }\n}\n","import type { SyncStatusInfo } from '@korajs/sync'\nimport { OFFLINE_SYNC_STATUS } from '@korajs/sync'\nimport type { SyncRuntimeState } from './sync-lifecycle'\nimport type { KoraConfig, SyncControl } from './types'\n\nexport interface CreateSyncControlOptions {\n\tconfig: KoraConfig\n\tready: Promise<void>\n\tstate: SyncRuntimeState\n}\n\n/**\n * Builds the developer-facing `app.sync` control surface.\n */\nexport function createSyncControl(options: CreateSyncControlOptions): SyncControl | null {\n\tconst { config, ready, state } = options\n\n\tif (!config.sync) {\n\t\treturn null\n\t}\n\n\tconst offlineSyncStatus = (): SyncStatusInfo => OFFLINE_SYNC_STATUS\n\n\tconst bridgeStatus = (): SyncStatusInfo =>\n\t\tstate.syncStatusBridge?.status ?? offlineSyncStatus()\n\n\treturn {\n\t\tget status(): SyncStatusInfo {\n\t\t\treturn bridgeStatus()\n\t\t},\n\t\tsubscribeStatus(listener: (status: SyncStatusInfo) => void): () => void {\n\t\t\tif (state.syncStatusBridge) {\n\t\t\t\treturn state.syncStatusBridge.subscribe(listener)\n\t\t\t}\n\t\t\tlistener(offlineSyncStatus())\n\t\t\treturn () => {}\n\t\t},\n\t\tasync connect(): Promise<void> {\n\t\t\tawait ready\n\t\t\tif (state.syncEngine) {\n\t\t\t\tstate.intentionalDisconnect = false\n\t\t\t\tstate.reconnectionManager?.stop()\n\t\t\t\tstate.reconnectionManager?.reset()\n\t\t\t\tawait state.syncEngine.start()\n\t\t\t\tstate.syncStatusBridge?.refresh()\n\t\t\t}\n\t\t},\n\t\tasync disconnect(): Promise<void> {\n\t\t\tawait ready\n\t\t\tif (state.syncEngine) {\n\t\t\t\tstate.intentionalDisconnect = true\n\t\t\t\tstate.reconnectionManager?.stop()\n\t\t\t\tawait state.syncEngine.stop()\n\t\t\t\tstate.syncStatusBridge?.refresh()\n\t\t\t}\n\t\t},\n\t\tgetStatus(): SyncStatusInfo {\n\t\t\tif (state.syncEngine) {\n\t\t\t\treturn state.syncEngine.getStatus()\n\t\t\t}\n\t\t\treturn offlineSyncStatus()\n\t\t},\n\t\tasync retryNow(): Promise<void> {\n\t\t\tawait ready\n\t\t\tif (state.syncEngine) {\n\t\t\t\tawait state.syncEngine.retryNow()\n\t\t\t}\n\t\t},\n\t\tclearSchemaBlock(): void {\n\t\t\tstate.syncEngine?.clearSchemaBlock()\n\t\t},\n\t\texportDiagnostics() {\n\t\t\tif (state.syncEngine) {\n\t\t\t\treturn state.syncEngine.exportDiagnostics()\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstate: 'disconnected' as const,\n\t\t\t\tstatus: {\n\t\t\t\t\tstatus: 'offline' as const,\n\t\t\t\t\tpendingOperations: 0,\n\t\t\t\t\tlastSyncedAt: null,\n\t\t\t\t\tlastSuccessfulPush: null,\n\t\t\t\t\tlastSuccessfulPull: null,\n\t\t\t\t\tconflicts: 0,\n\t\t\t\t},\n\t\t\t\tnodeId: '',\n\t\t\t\turl: config.sync?.url ?? '',\n\t\t\t\tschemaVersion: config.schema.version,\n\t\t\t\tlastSyncedAt: null,\n\t\t\t\tlastSuccessfulPush: null,\n\t\t\t\tlastSuccessfulPull: null,\n\t\t\t\tconflicts: 0,\n\t\t\t\tpendingOperations: 0,\n\t\t\t\thasInFlightBatch: false,\n\t\t\t\treconnecting: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t}\n\t\t},\n\t}\n}\n","import type { SyncEngine } from '@korajs/sync'\nimport type { AuthSyncBinding } from './types'\n\n/**\n * Serializes auth-driven sync reconnects so overlapping token refresh events\n * do not stack concurrent stop/start cycles on the sync engine.\n */\nexport class AuthSyncCoordinator {\n\tprivate inFlight: Promise<void> | null = null\n\tprivate pending = false\n\tprivate disposed = false\n\n\tconstructor(\n\t\tprivate readonly getEngine: () => SyncEngine | null,\n\t\tprivate readonly authBinding: AuthSyncBinding,\n\t) {}\n\n\tscheduleReconnect(): void {\n\t\tif (this.disposed) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.inFlight) {\n\t\t\tthis.pending = true\n\t\t\treturn\n\t\t}\n\n\t\tthis.inFlight = this.run().finally(() => {\n\t\t\tthis.inFlight = null\n\t\t\tif (this.pending && !this.disposed) {\n\t\t\t\tthis.pending = false\n\t\t\t\tthis.scheduleReconnect()\n\t\t\t}\n\t\t})\n\t}\n\n\tdestroy(): void {\n\t\tthis.disposed = true\n\t\tthis.pending = false\n\t}\n\n\tprivate async run(): Promise<void> {\n\t\tconst engine = this.getEngine()\n\t\tif (!engine) {\n\t\t\treturn\n\t\t}\n\n\t\tconst headers = await this.authBinding.auth()\n\t\tif (!headers.token) {\n\t\t\tawait engine.stop()\n\t\t\treturn\n\t\t}\n\n\t\tif (this.authBinding.resolveScopeMap) {\n\t\t\tconst nextScope = await this.authBinding.resolveScopeMap()\n\t\t\tengine.updateScope(nextScope)\n\t\t}\n\n\t\tconst status = engine.getStatus().status\n\t\tif (status !== 'offline') {\n\t\t\tawait engine.stop()\n\t\t}\n\t\tawait engine.start()\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport { createSyncStatusController, type SyncStatusInfo } from '@korajs/sync'\n\n/**\n * Event-driven sync status snapshot for non-React consumers (`app.sync.status`).\n */\nexport interface SyncStatusBridge {\n\treadonly status: SyncStatusInfo\n\tsubscribe(listener: (status: SyncStatusInfo) => void): () => void\n\trefresh(): void\n\tdestroy(): void\n}\n\n/**\n * Subscribe to sync events and expose a reactive status snapshot.\n */\nexport function createSyncStatusBridge(\n\temitter: KoraEventEmitter,\n\tgetSyncEngine: () => { getStatus(): SyncStatusInfo } | null,\n): SyncStatusBridge {\n\tconst controller = createSyncStatusController({\n\t\tgetSyncEngine,\n\t\tsubscribeSyncStatus: null,\n\t\tevents: emitter,\n\t})\n\n\treturn {\n\t\tget status() {\n\t\t\treturn controller.getSnapshot()\n\t\t},\n\t\tsubscribe(listener: (status: SyncStatusInfo) => void): () => void {\n\t\t\treturn controller.subscribe(() => {\n\t\t\t\tlistener(controller.getSnapshot())\n\t\t\t})\n\t\t},\n\t\trefresh: () => controller.refresh(),\n\t\tdestroy: () => controller.destroy(),\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport { AuthSyncCoordinator } from './auth-sync-coordinator'\nimport type { InitializeAppResult } from './initialize-app'\nimport { createSyncStatusBridge, type SyncStatusBridge } from './sync-status-bridge'\nimport type { KoraConfig } from './types'\nimport {\n\tConnectionMonitor,\n\tReconnectionManager,\n\ttype SyncEngine,\n} from '@korajs/sync'\n\n/** Mutable sync runtime state owned by {@link createApp}. */\nexport interface SyncRuntimeState {\n\tsyncEngine: SyncEngine | null\n\tsyncStatusBridge: SyncStatusBridge | null\n\tauthSyncCoordinator: AuthSyncCoordinator | null\n\treconnectionManager: ReconnectionManager | null\n\tconnectionMonitor: ConnectionMonitor | null\n\tqualityInterval: ReturnType<typeof setInterval> | null\n\tintentionalDisconnect: boolean\n\t/** Removes the browser `online` listener registered in {@link wireSyncLifecycleAfterReady}. */\n\tremoveOnlineListener: (() => void) | null\n}\n\n/**\n * Wires sync status bridge, auth reconnect coordinator, reconnection, and quality monitoring\n * after {@link initializeApp} completes.\n */\nexport function wireSyncLifecycleAfterReady(\n\tconfig: KoraConfig,\n\temitter: KoraEventEmitter,\n\tstate: SyncRuntimeState,\n\tinit: InitializeAppResult,\n): void {\n\tstate.syncEngine = init.syncEngine\n\n\tif (!config.sync) {\n\t\treturn\n\t}\n\n\tstate.syncStatusBridge = createSyncStatusBridge(emitter, () => state.syncEngine)\n\tstate.syncStatusBridge.refresh()\n\n\tif (state.syncEngine && init.authBinding?.subscribe) {\n\t\tstate.authSyncCoordinator = new AuthSyncCoordinator(() => state.syncEngine, init.authBinding)\n\t\tinit.authBinding.subscribe(() => {\n\t\t\tstate.authSyncCoordinator?.scheduleReconnect()\n\t\t})\n\t}\n\n\tif (!state.syncEngine) {\n\t\treturn\n\t}\n\n\tconst syncEngine = state.syncEngine\n\tstate.connectionMonitor = new ConnectionMonitor()\n\tstate.reconnectionManager = new ReconnectionManager({\n\t\tinitialDelay: config.sync.reconnectInterval,\n\t\tmaxDelay: config.sync.maxReconnectInterval,\n\t})\n\n\temitter.on('sync:sent', () => state.connectionMonitor?.recordActivity())\n\temitter.on('sync:received', () => state.connectionMonitor?.recordActivity())\n\temitter.on('sync:acknowledged', () => state.connectionMonitor?.recordActivity())\n\n\temitter.on('sync:connected', () => {\n\t\tif (state.qualityInterval !== null) {\n\t\t\tclearInterval(state.qualityInterval)\n\t\t}\n\t\tstate.qualityInterval = setInterval(() => {\n\t\t\tif (state.connectionMonitor) {\n\t\t\t\temitter.emit({\n\t\t\t\t\ttype: 'connection:quality',\n\t\t\t\t\tquality: state.connectionMonitor.getQuality(),\n\t\t\t\t})\n\t\t\t}\n\t\t}, 5000)\n\t})\n\n\temitter.on('sync:disconnected', () => {\n\t\tstate.connectionMonitor?.reset()\n\t\tif (state.qualityInterval !== null) {\n\t\t\tclearInterval(state.qualityInterval)\n\t\t\tstate.qualityInterval = null\n\t\t}\n\t})\n\n\tconst browserGlobal = globalThis as typeof globalThis & {\n\t\taddEventListener?: (type: string, listener: () => void) => void\n\t\tremoveEventListener?: (type: string, listener: () => void) => void\n\t}\n\tif (typeof browserGlobal.addEventListener === 'function') {\n\t\tconst onOnline = (): void => {\n\t\t\tif (state.intentionalDisconnect || config.sync?.autoReconnect === false) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstate.reconnectionManager?.wake()\n\t\t\tstate.reconnectionManager?.reset()\n\t\t\tvoid syncEngine.retryNow()\n\t\t}\n\t\tbrowserGlobal.addEventListener('online', onOnline)\n\t\tstate.removeOnlineListener = (): void => {\n\t\t\tbrowserGlobal.removeEventListener?.('online', onOnline)\n\t\t}\n\t}\n\n\temitter.on('sync:schema-mismatch', () => {\n\t\tstate.reconnectionManager?.stop()\n\t\tstate.intentionalDisconnect = true\n\t})\n\n\tif (config.sync.autoReconnect !== false) {\n\t\temitter.on('sync:disconnected', () => {\n\t\t\tif (state.intentionalDisconnect || syncEngine.isSchemaBlocked()) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (state.reconnectionManager?.isRunning()) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsyncEngine.setReconnecting(true)\n\t\t\tstate.reconnectionManager?.stop()\n\t\t\tstate.reconnectionManager\n\t\t\t\t?.start(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait syncEngine.start()\n\t\t\t\t\t\tsyncEngine.setReconnecting(false)\n\t\t\t\t\t\treturn true\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tsyncEngine.setReconnecting(false)\n\t\t\t\t})\n\t\t})\n\t}\n\n\tif (config.sync.autoConnect === true) {\n\t\tvoid syncEngine.start().catch(() => {\n\t\t\t// Errors surface via sync:disconnected / sync events; avoid unhandled rejection.\n\t\t})\n\t}\n}\n\n/**\n * Stops timers and managers during {@link KoraApp.close}.\n */\nexport function teardownSyncLifecycle(state: SyncRuntimeState): void {\n\tif (state.qualityInterval !== null) {\n\t\tclearInterval(state.qualityInterval)\n\t\tstate.qualityInterval = null\n\t}\n\tstate.reconnectionManager?.stop()\n\tstate.syncStatusBridge?.destroy()\n\tstate.syncStatusBridge = null\n\tstate.authSyncCoordinator?.destroy()\n\tstate.authSyncCoordinator = null\n\tstate.removeOnlineListener?.()\n\tstate.removeOnlineListener = null\n}\n","import type { Operation } from '@korajs/core'\nimport type { Store } from '@korajs/store'\nimport type { KoraConfig, TransactionProxy } from './types'\n\nexport interface TransactionExecutor {\n\t(fn: (tx: TransactionProxy) => Promise<void>, mutationName?: string): Promise<Operation[]>\n}\n\n/**\n * Creates the shared executor used by {@link KoraApp.transaction} and {@link KoraApp.mutation}.\n */\nexport function createTransactionExecutor(\n\tconfig: KoraConfig,\n\tready: Promise<void>,\n\tgetStore: () => Store | null,\n): TransactionExecutor {\n\treturn async (fn, mutationName) => {\n\t\tawait ready\n\t\tconst store = getStore()\n\t\tif (!store) {\n\t\t\tthrow new Error('Store not initialized. Await app.ready before using transactions.')\n\t\t}\n\n\t\tconst collectionNames = Object.keys(config.schema.collections)\n\n\t\treturn store.transaction(async (tx) => {\n\t\t\tif (mutationName !== undefined) {\n\t\t\t\ttx.setMutationName(mutationName)\n\t\t\t}\n\n\t\t\tconst proxy: TransactionProxy = {} as TransactionProxy\n\t\t\tfor (const name of collectionNames) {\n\t\t\t\tObject.defineProperty(proxy, name, {\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn tx.collection(name)\n\t\t\t\t\t},\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: false,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tawait fn(proxy)\n\t\t})\n\t}\n}\n","import { KoraError, SchemaValidationError } from '@korajs/core'\nimport { detectAdapterType } from './adapter-resolver'\nimport type { KoraConfig } from './types'\n\n/**\n * Fail fast on invalid createApp configuration before opening storage or sync.\n */\nexport function validateCreateAppConfig(config: KoraConfig): void {\n\tif (!config.schema) {\n\t\tthrow new SchemaValidationError('createApp requires a schema.', {\n\t\t\tfix: 'Pass schema: defineSchema({ version: 1, collections: { ... } })',\n\t\t})\n\t}\n\n\tif (config.schema.version < 1) {\n\t\tthrow new SchemaValidationError('Schema version must be at least 1.', {\n\t\t\tversion: config.schema.version,\n\t\t})\n\t}\n\n\tconst collectionNames = Object.keys(config.schema.collections)\n\tif (collectionNames.length === 0) {\n\t\tthrow new SchemaValidationError('Schema must define at least one collection.', {\n\t\t\tfix: 'Add entries under collections in defineSchema().',\n\t\t})\n\t}\n\n\tif (config.sync) {\n\t\tvalidateSyncUrl(config.sync.url, config.sync.transport ?? 'websocket')\n\t}\n\n\tconst adapter = config.store?.adapter ?? detectAdapterType()\n\tconst isBrowser =\n\t\ttypeof globalThis !== 'undefined' &&\n\t\ttypeof (globalThis as Record<string, unknown>).window !== 'undefined'\n\n\tif (\n\t\tisBrowser &&\n\t\t(adapter === 'sqlite-wasm' || adapter === 'indexeddb') &&\n\t\t!config.store?.workerUrl\n\t) {\n\t\tthrow new KoraError(\n\t\t\t'Browser storage requires store.workerUrl pointing to the SQLite WASM worker script.',\n\t\t\t'MISSING_WORKER_URL',\n\t\t\t{\n\t\t\t\tadapter,\n\t\t\t\tfix: 'Add store: { workerUrl: \"/sqlite-wasm-worker.js\" } (see create-kora-app templates).',\n\t\t\t},\n\t\t)\n\t}\n}\n\nfunction validateSyncUrl(url: string, transport: 'websocket' | 'http'): void {\n\tif (!url || url.trim().length === 0) {\n\t\tthrow new KoraError('sync.url is required when sync is configured.', 'INVALID_SYNC_URL', {\n\t\t\tfix: 'Pass sync: { url: \"wss://your-server/kora\" }.',\n\t\t})\n\t}\n\n\ttry {\n\t\tconst parsed = new URL(url)\n\t\tif (transport === 'http') {\n\t\t\tif (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n\t\t\t\tthrow new Error('bad protocol')\n\t\t\t}\n\t\t} else if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {\n\t\t\tthrow new Error('bad protocol')\n\t\t}\n\t} catch {\n\t\tthrow new KoraError(\n\t\t\t`Invalid sync URL \"${url}\" for transport \"${transport}\".`,\n\t\t\t'INVALID_SYNC_URL',\n\t\t\t{\n\t\t\t\turl,\n\t\t\t\ttransport,\n\t\t\t\tfix:\n\t\t\t\t\ttransport === 'http'\n\t\t\t\t\t\t? 'Use an absolute http:// or https:// URL.'\n\t\t\t\t\t\t: 'Use an absolute ws:// or wss:// URL.',\n\t\t\t},\n\t\t)\n\t}\n}\n","import type { KoraEventEmitter } from '@korajs/core'\nimport type { KoraSyncEvent } from './types'\n\nconst SYNC_EVENT_TYPES = [\n\t'sync:connected',\n\t'sync:disconnected',\n\t'sync:schema-mismatch',\n\t'sync:auth-failed',\n\t'sync:sent',\n\t'sync:received',\n\t'sync:acknowledged',\n\t'sync:apply-failed',\n\t'sync:diagnostics',\n\t'sync:bandwidth',\n\t'sync:initial-sync-progress',\n] as const\n\n/**\n * Forwards selected sync events from the app emitter to {@link KoraConfig.onSyncEvent}.\n */\nexport function wireSyncEventForwarding(\n\temitter: KoraEventEmitter,\n\thandler: (event: KoraSyncEvent) => void,\n): void {\n\tfor (const type of SYNC_EVENT_TYPES) {\n\t\temitter.on(type, (event) => {\n\t\t\thandler(event as KoraSyncEvent)\n\t\t})\n\t}\n}\n","// kora — meta-package re-exporting core, store, merge, sync\n// This is the primary entry point for `import { createApp, defineSchema, t } from 'korajs'`\n\n// === createApp factory ===\nexport { createApp } from './create-app'\n\n// === App types ===\nexport type {\n\tAdapterType,\n\tAuthSyncBinding,\n\tKoraApp,\n\tKoraConfig,\n\tStoreOptions,\n\tSyncControl,\n\tSyncOptions,\n\tSequenceAccessor,\n\tTransactionCollectionProxy,\n\tTransactionProxy,\n\tTypedCollectionAccessor,\n\tTypedKoraApp,\n\tTypedKoraConfig,\n} from './types'\n\nexport type { ReplaySnapshot } from '@korajs/store'\nexport type {\n\tAuditExportManifest,\n\tAuditExportOptions,\n\tAuditExportPayload,\n\tPersistedAuditTrace,\n} from '@korajs/store'\nexport {\n\tdecodeAuditExport,\n\treadAuditExportManifest,\n\tverifyAuditExportChecksum,\n} from '@korajs/store'\n\n// === @korajs/core re-exports ===\nexport { defineSchema, migrate, t } from '@korajs/core'\nexport { HybridLogicalClock } from '@korajs/core'\nexport { generateUUIDv7 } from '@korajs/core'\nexport { createOperation } from '@korajs/core'\nexport { KoraError, AppNotReadyError } from '@korajs/core'\nexport { op } from '@korajs/core'\nexport type {\n\tAtomicOp,\n\tAtomicOpType,\n\tCollectionDefinition,\n\tConnectionQuality,\n\tConstraint,\n\tFieldDescriptor,\n\tFieldKindToType,\n\tHLCTimestamp,\n\tInferFieldType,\n\tInferInsertInput,\n\tInferRecord,\n\tInferUpdateInput,\n\tKoraEvent,\n\tKoraEventEmitter,\n\tKoraEventListener,\n\tKoraEventType,\n\tMergeStrategy,\n\tMergeTrace,\n\tMigrationDefinition,\n\tMigrationStep,\n\tOperation,\n\tSchemaDefinition,\n\tSchemaInput,\n\tSequenceConfig,\n\tSyncRuleDefinition,\n\tTypedSchemaDefinition,\n\tVersionVector,\n} from '@korajs/core'\n\n// === @korajs/store re-exports ===\nexport { SequenceManager, Store } from '@korajs/store'\nexport { TransactionContext } from '@korajs/store'\nexport {\n\texportBackup,\n\treadBackupManifest,\n\trestoreBackup,\n\tverifyBackupChecksum,\n} from '@korajs/store'\nexport type {\n\tBackupManifest,\n\tBackupOptions,\n\tBackupProgress,\n\tCollectionAccessor,\n\tCollectionRecord,\n\tRestoreOptions,\n\tRestoreResult,\n\tStorageAdapter,\n\tStoreConfig,\n\tTransactionCollectionAccessor,\n\tTransactionContextConfig,\n} from '@korajs/store'\n\n// === @korajs/merge re-exports ===\nexport { MergeEngine } from '@korajs/merge'\nexport type { MergeInput, MergeResult } from '@korajs/merge'\n\n// === @korajs/sync re-exports ===\nexport { SyncEngine, WebSocketTransport } from '@korajs/sync'\nexport type {\n\tSyncConfig,\n\tSyncDiagnostics,\n\tSyncEncryptionConfig,\n\tSyncState,\n\tSyncStatus,\n\tSyncStatusInfo,\n\tSyncStore,\n} from '@korajs/sync'\n"],"mappings":"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","names":["KoraError","AppNotReadyError","Store","MergeEngine","SyncEngine","WebSocketTransport"]}
|
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/react.ts
|
|
21
|
+
var react_exports = {};
|
|
22
|
+
__export(react_exports, {
|
|
23
|
+
KoraProvider: () => import_react.KoraProvider,
|
|
24
|
+
useApp: () => import_react.useApp,
|
|
25
|
+
useCollaborators: () => import_react.useCollaborators,
|
|
26
|
+
useCollection: () => import_react.useCollection,
|
|
27
|
+
useMutation: () => import_react.useMutation,
|
|
28
|
+
usePresence: () => import_react.usePresence,
|
|
29
|
+
useQuery: () => import_react.useQuery,
|
|
30
|
+
useRichText: () => import_react.useRichText,
|
|
31
|
+
useSyncStatus: () => import_react.useSyncStatus
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(react_exports);
|
|
34
|
+
var import_react = require("@korajs/react");
|
|
35
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
36
|
+
0 && (module.exports = {
|
|
37
|
+
KoraProvider,
|
|
38
|
+
useApp,
|
|
39
|
+
useCollaborators,
|
|
40
|
+
useCollection,
|
|
41
|
+
useMutation,
|
|
42
|
+
usePresence,
|
|
43
|
+
useQuery,
|
|
44
|
+
useRichText,
|
|
45
|
+
useSyncStatus
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.ts"],"sourcesContent":["/**\n * React bindings — re-exported from `@korajs/react` for `import { ... } from 'korajs/react'`.\n */\nexport type {\n\tKoraAppLike,\n\tKoraContextValue,\n\tKoraProviderProps,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/react'\n\nexport type { UseRichTextOptions } from '@korajs/react'\n\nexport {\n\tKoraProvider,\n\tuseApp,\n\tuseCollection,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tusePresence,\n\tuseCollaborators,\n} from '@korajs/react'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,mBAUO;","names":[]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { KoraAppLike, KoraContextValue, KoraProvider, KoraProviderProps, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, useApp, useCollaborators, useCollection, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/react';
|
|
2
|
+
import '@korajs/svelte';
|
|
3
|
+
import '@korajs/vue';
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { KoraAppLike, KoraContextValue, KoraProvider, KoraProviderProps, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, useApp, useCollaborators, useCollection, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/react';
|
|
2
|
+
import '@korajs/svelte';
|
|
3
|
+
import '@korajs/vue';
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// src/react.ts
|
|
2
|
+
import {
|
|
3
|
+
KoraProvider,
|
|
4
|
+
useApp,
|
|
5
|
+
useCollection,
|
|
6
|
+
useMutation,
|
|
7
|
+
useQuery,
|
|
8
|
+
useRichText,
|
|
9
|
+
useSyncStatus,
|
|
10
|
+
usePresence,
|
|
11
|
+
useCollaborators
|
|
12
|
+
} from "@korajs/react";
|
|
13
|
+
export {
|
|
14
|
+
KoraProvider,
|
|
15
|
+
useApp,
|
|
16
|
+
useCollaborators,
|
|
17
|
+
useCollection,
|
|
18
|
+
useMutation,
|
|
19
|
+
usePresence,
|
|
20
|
+
useQuery,
|
|
21
|
+
useRichText,
|
|
22
|
+
useSyncStatus
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react.ts"],"sourcesContent":["/**\n * React bindings — re-exported from `@korajs/react` for `import { ... } from 'korajs/react'`.\n */\nexport type {\n\tKoraAppLike,\n\tKoraContextValue,\n\tKoraProviderProps,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/react'\n\nexport type { UseRichTextOptions } from '@korajs/react'\n\nexport {\n\tKoraProvider,\n\tuseApp,\n\tuseCollection,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tusePresence,\n\tuseCollaborators,\n} from '@korajs/react'\n"],"mappings":";AAeA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;","names":[]}
|
package/dist/svelte.cjs
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/svelte.ts
|
|
21
|
+
var svelte_exports = {};
|
|
22
|
+
__export(svelte_exports, {
|
|
23
|
+
applyPresence: () => import_svelte.applyPresence,
|
|
24
|
+
createCollaboratorsStore: () => import_svelte.createCollaboratorsStore,
|
|
25
|
+
createMutation: () => import_svelte.createMutation,
|
|
26
|
+
createQueryStore: () => import_svelte.createQueryStore,
|
|
27
|
+
createRichTextBinding: () => import_svelte.createRichTextBinding,
|
|
28
|
+
createSyncStatusStore: () => import_svelte.createSyncStatusStore,
|
|
29
|
+
getApp: () => import_svelte.getApp,
|
|
30
|
+
getCollection: () => import_svelte.getCollection,
|
|
31
|
+
getKoraApp: () => import_svelte.getKoraApp,
|
|
32
|
+
getKoraContext: () => import_svelte.getKoraContext,
|
|
33
|
+
initKoraProvider: () => import_svelte.initKoraProvider,
|
|
34
|
+
setKoraAppContext: () => import_svelte.setKoraAppContext,
|
|
35
|
+
setKoraContext: () => import_svelte.setKoraContext,
|
|
36
|
+
useApp: () => import_svelte.useApp,
|
|
37
|
+
useCollaborators: () => import_svelte.useCollaborators,
|
|
38
|
+
useCollection: () => import_svelte.useCollection,
|
|
39
|
+
useMutation: () => import_svelte.useMutation,
|
|
40
|
+
usePresence: () => import_svelte.usePresence,
|
|
41
|
+
useQuery: () => import_svelte.useQuery,
|
|
42
|
+
useRichText: () => import_svelte.useRichText,
|
|
43
|
+
useSyncStatus: () => import_svelte.useSyncStatus
|
|
44
|
+
});
|
|
45
|
+
module.exports = __toCommonJS(svelte_exports);
|
|
46
|
+
var import_svelte = require("@korajs/svelte");
|
|
47
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
+
0 && (module.exports = {
|
|
49
|
+
applyPresence,
|
|
50
|
+
createCollaboratorsStore,
|
|
51
|
+
createMutation,
|
|
52
|
+
createQueryStore,
|
|
53
|
+
createRichTextBinding,
|
|
54
|
+
createSyncStatusStore,
|
|
55
|
+
getApp,
|
|
56
|
+
getCollection,
|
|
57
|
+
getKoraApp,
|
|
58
|
+
getKoraContext,
|
|
59
|
+
initKoraProvider,
|
|
60
|
+
setKoraAppContext,
|
|
61
|
+
setKoraContext,
|
|
62
|
+
useApp,
|
|
63
|
+
useCollaborators,
|
|
64
|
+
useCollection,
|
|
65
|
+
useMutation,
|
|
66
|
+
usePresence,
|
|
67
|
+
useQuery,
|
|
68
|
+
useRichText,
|
|
69
|
+
useSyncStatus
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=svelte.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/svelte.ts"],"sourcesContent":["/**\n * Svelte bindings — re-exported from `@korajs/svelte` for `import { ... } from 'korajs/svelte'`.\n */\nexport type {\n\tKoraAppHandle,\n\tKoraAppLike,\n\tKoraContextValue,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/svelte'\n\nexport type { UseRichTextOptions } from '@korajs/svelte'\n\nexport {\n\tcreateMutation,\n\tcreateQueryStore,\n\tcreateRichTextBinding,\n\tcreateSyncStatusStore,\n\tgetApp,\n\tgetCollection,\n\tgetKoraApp,\n\tgetKoraContext,\n\tinitKoraProvider,\n\tsetKoraAppContext,\n\tsetKoraContext,\n\tuseApp,\n\tuseCollection,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tapplyPresence,\n\tusePresence,\n\tcreateCollaboratorsStore,\n\tuseCollaborators,\n} from '@korajs/svelte'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,oBAsBO;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KoraAppHandle, KoraAppLike, KoraContextValue, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, applyPresence, createCollaboratorsStore, createMutation, createQueryStore, createRichTextBinding, createSyncStatusStore, getApp, getCollection, getKoraApp, getKoraContext, initKoraProvider, setKoraAppContext, setKoraContext, useApp, useCollaborators, useCollection, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/svelte';
|
package/dist/svelte.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KoraAppHandle, KoraAppLike, KoraContextValue, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, applyPresence, createCollaboratorsStore, createMutation, createQueryStore, createRichTextBinding, createSyncStatusStore, getApp, getCollection, getKoraApp, getKoraContext, initKoraProvider, setKoraAppContext, setKoraContext, useApp, useCollaborators, useCollection, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/svelte';
|
package/dist/svelte.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/svelte.ts
|
|
2
|
+
import {
|
|
3
|
+
createMutation,
|
|
4
|
+
createQueryStore,
|
|
5
|
+
createRichTextBinding,
|
|
6
|
+
createSyncStatusStore,
|
|
7
|
+
getApp,
|
|
8
|
+
getCollection,
|
|
9
|
+
getKoraApp,
|
|
10
|
+
getKoraContext,
|
|
11
|
+
initKoraProvider,
|
|
12
|
+
setKoraAppContext,
|
|
13
|
+
setKoraContext,
|
|
14
|
+
useApp,
|
|
15
|
+
useCollection,
|
|
16
|
+
useMutation,
|
|
17
|
+
useQuery,
|
|
18
|
+
useRichText,
|
|
19
|
+
useSyncStatus,
|
|
20
|
+
applyPresence,
|
|
21
|
+
usePresence,
|
|
22
|
+
createCollaboratorsStore,
|
|
23
|
+
useCollaborators
|
|
24
|
+
} from "@korajs/svelte";
|
|
25
|
+
export {
|
|
26
|
+
applyPresence,
|
|
27
|
+
createCollaboratorsStore,
|
|
28
|
+
createMutation,
|
|
29
|
+
createQueryStore,
|
|
30
|
+
createRichTextBinding,
|
|
31
|
+
createSyncStatusStore,
|
|
32
|
+
getApp,
|
|
33
|
+
getCollection,
|
|
34
|
+
getKoraApp,
|
|
35
|
+
getKoraContext,
|
|
36
|
+
initKoraProvider,
|
|
37
|
+
setKoraAppContext,
|
|
38
|
+
setKoraContext,
|
|
39
|
+
useApp,
|
|
40
|
+
useCollaborators,
|
|
41
|
+
useCollection,
|
|
42
|
+
useMutation,
|
|
43
|
+
usePresence,
|
|
44
|
+
useQuery,
|
|
45
|
+
useRichText,
|
|
46
|
+
useSyncStatus
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=svelte.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/svelte.ts"],"sourcesContent":["/**\n * Svelte bindings — re-exported from `@korajs/svelte` for `import { ... } from 'korajs/svelte'`.\n */\nexport type {\n\tKoraAppHandle,\n\tKoraAppLike,\n\tKoraContextValue,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/svelte'\n\nexport type { UseRichTextOptions } from '@korajs/svelte'\n\nexport {\n\tcreateMutation,\n\tcreateQueryStore,\n\tcreateRichTextBinding,\n\tcreateSyncStatusStore,\n\tgetApp,\n\tgetCollection,\n\tgetKoraApp,\n\tgetKoraContext,\n\tinitKoraProvider,\n\tsetKoraAppContext,\n\tsetKoraContext,\n\tuseApp,\n\tuseCollection,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tapplyPresence,\n\tusePresence,\n\tcreateCollaboratorsStore,\n\tuseCollaborators,\n} from '@korajs/svelte'\n"],"mappings":";AAeA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;","names":[]}
|
package/dist/vue.cjs
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/vue.ts
|
|
21
|
+
var vue_exports = {};
|
|
22
|
+
__export(vue_exports, {
|
|
23
|
+
KoraProvider: () => import_vue.KoraProvider,
|
|
24
|
+
installKora: () => import_vue.installKora,
|
|
25
|
+
koraAppInjectionKey: () => import_vue.koraAppInjectionKey,
|
|
26
|
+
koraContextKey: () => import_vue.koraContextKey,
|
|
27
|
+
useApp: () => import_vue.useApp,
|
|
28
|
+
useCollaborators: () => import_vue.useCollaborators,
|
|
29
|
+
useCollection: () => import_vue.useCollection,
|
|
30
|
+
useKoraApp: () => import_vue.useKoraApp,
|
|
31
|
+
useKoraContext: () => import_vue.useKoraContext,
|
|
32
|
+
useMutation: () => import_vue.useMutation,
|
|
33
|
+
usePresence: () => import_vue.usePresence,
|
|
34
|
+
useQuery: () => import_vue.useQuery,
|
|
35
|
+
useRichText: () => import_vue.useRichText,
|
|
36
|
+
useSyncStatus: () => import_vue.useSyncStatus
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(vue_exports);
|
|
39
|
+
var import_vue = require("@korajs/vue");
|
|
40
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
41
|
+
0 && (module.exports = {
|
|
42
|
+
KoraProvider,
|
|
43
|
+
installKora,
|
|
44
|
+
koraAppInjectionKey,
|
|
45
|
+
koraContextKey,
|
|
46
|
+
useApp,
|
|
47
|
+
useCollaborators,
|
|
48
|
+
useCollection,
|
|
49
|
+
useKoraApp,
|
|
50
|
+
useKoraContext,
|
|
51
|
+
useMutation,
|
|
52
|
+
usePresence,
|
|
53
|
+
useQuery,
|
|
54
|
+
useRichText,
|
|
55
|
+
useSyncStatus
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=vue.cjs.map
|
package/dist/vue.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vue.ts"],"sourcesContent":["/**\n * Vue 3 bindings — re-exported from `@korajs/vue` for `import { ... } from 'korajs/vue'`.\n */\nexport type {\n\tKoraAppHandle,\n\tKoraAppLike,\n\tKoraContextValue,\n\tKoraProviderProps,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/vue'\n\nexport type { UseRichTextOptions } from '@korajs/vue'\n\nexport {\n\tKoraProvider,\n\tinstallKora,\n\tkoraAppInjectionKey,\n\tkoraContextKey,\n\tuseApp,\n\tuseCollection,\n\tuseKoraApp,\n\tuseKoraContext,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tusePresence,\n\tuseCollaborators,\n} from '@korajs/vue'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,iBAeO;","names":[]}
|
package/dist/vue.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KoraAppHandle, KoraAppLike, KoraContextValue, KoraProvider, KoraProviderProps, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, installKora, koraAppInjectionKey, koraContextKey, useApp, useCollaborators, useCollection, useKoraApp, useKoraContext, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/vue';
|
package/dist/vue.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KoraAppHandle, KoraAppLike, KoraContextValue, KoraProvider, KoraProviderProps, UseMutationOptions, UseMutationResult, UseQueryOptions, UseRichTextOptions, UseRichTextResult, installKora, koraAppInjectionKey, koraContextKey, useApp, useCollaborators, useCollection, useKoraApp, useKoraContext, useMutation, usePresence, useQuery, useRichText, useSyncStatus } from '@korajs/vue';
|
package/dist/vue.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/vue.ts
|
|
2
|
+
import {
|
|
3
|
+
KoraProvider,
|
|
4
|
+
installKora,
|
|
5
|
+
koraAppInjectionKey,
|
|
6
|
+
koraContextKey,
|
|
7
|
+
useApp,
|
|
8
|
+
useCollection,
|
|
9
|
+
useKoraApp,
|
|
10
|
+
useKoraContext,
|
|
11
|
+
useMutation,
|
|
12
|
+
useQuery,
|
|
13
|
+
useRichText,
|
|
14
|
+
useSyncStatus,
|
|
15
|
+
usePresence,
|
|
16
|
+
useCollaborators
|
|
17
|
+
} from "@korajs/vue";
|
|
18
|
+
export {
|
|
19
|
+
KoraProvider,
|
|
20
|
+
installKora,
|
|
21
|
+
koraAppInjectionKey,
|
|
22
|
+
koraContextKey,
|
|
23
|
+
useApp,
|
|
24
|
+
useCollaborators,
|
|
25
|
+
useCollection,
|
|
26
|
+
useKoraApp,
|
|
27
|
+
useKoraContext,
|
|
28
|
+
useMutation,
|
|
29
|
+
usePresence,
|
|
30
|
+
useQuery,
|
|
31
|
+
useRichText,
|
|
32
|
+
useSyncStatus
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=vue.js.map
|
package/dist/vue.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vue.ts"],"sourcesContent":["/**\n * Vue 3 bindings — re-exported from `@korajs/vue` for `import { ... } from 'korajs/vue'`.\n */\nexport type {\n\tKoraAppHandle,\n\tKoraAppLike,\n\tKoraContextValue,\n\tKoraProviderProps,\n\tUseMutationOptions,\n\tUseMutationResult,\n\tUseQueryOptions,\n\tUseRichTextResult,\n} from '@korajs/vue'\n\nexport type { UseRichTextOptions } from '@korajs/vue'\n\nexport {\n\tKoraProvider,\n\tinstallKora,\n\tkoraAppInjectionKey,\n\tkoraContextKey,\n\tuseApp,\n\tuseCollection,\n\tuseKoraApp,\n\tuseKoraContext,\n\tuseMutation,\n\tuseQuery,\n\tuseRichText,\n\tuseSyncStatus,\n\tusePresence,\n\tuseCollaborators,\n} from '@korajs/vue'\n"],"mappings":";AAgBA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;","names":[]}
|