@korajs/store 1.0.0-beta.1 → 1.0.0-beta.4

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.
Files changed (58) hide show
  1. package/dist/adapters/better-sqlite3.cjs.map +1 -1
  2. package/dist/adapters/better-sqlite3.js +1 -1
  3. package/dist/adapters/indexeddb.cjs +196 -39
  4. package/dist/adapters/indexeddb.cjs.map +1 -1
  5. package/dist/adapters/indexeddb.d.cts +1 -1
  6. package/dist/adapters/indexeddb.d.ts +1 -1
  7. package/dist/adapters/indexeddb.js +15 -8
  8. package/dist/adapters/indexeddb.js.map +1 -1
  9. package/dist/adapters/sqlite-wasm-shared-host.cjs +80 -53
  10. package/dist/adapters/sqlite-wasm-shared-host.cjs.map +1 -1
  11. package/dist/adapters/sqlite-wasm-shared-host.d.cts +63 -1
  12. package/dist/adapters/sqlite-wasm-shared-host.d.ts +63 -1
  13. package/dist/adapters/sqlite-wasm-shared-host.js +56 -52
  14. package/dist/adapters/sqlite-wasm-shared-host.js.map +1 -1
  15. package/dist/adapters/sqlite-wasm-worker.cjs +25 -3
  16. package/dist/adapters/sqlite-wasm-worker.cjs.map +1 -1
  17. package/dist/adapters/sqlite-wasm-worker.js +25 -3
  18. package/dist/adapters/sqlite-wasm-worker.js.map +1 -1
  19. package/dist/adapters/sqlite-wasm.cjs +186 -34
  20. package/dist/adapters/sqlite-wasm.cjs.map +1 -1
  21. package/dist/adapters/sqlite-wasm.d.cts +29 -3
  22. package/dist/adapters/sqlite-wasm.d.ts +29 -3
  23. package/dist/adapters/sqlite-wasm.js +3 -3
  24. package/dist/{backup-ZV4Y424B.js → backup-IQE4QC7Q.js} +2 -2
  25. package/dist/{chunk-RBPVEAVM.js → chunk-2ZRQGFEF.js} +179 -36
  26. package/dist/chunk-2ZRQGFEF.js.map +1 -0
  27. package/dist/{chunk-IOEFNHHP.js → chunk-COJSQBXW.js} +2 -2
  28. package/dist/{chunk-X57MWW35.js → chunk-OCOGQRHW.js} +12 -9
  29. package/dist/chunk-OCOGQRHW.js.map +1 -0
  30. package/dist/{chunk-FFYA7J5H.js → chunk-RCTG3IJG.js} +3 -2
  31. package/dist/chunk-RCTG3IJG.js.map +1 -0
  32. package/dist/{chunk-QL2XVZRN.js → chunk-TUR7RGEP.js} +12 -1
  33. package/dist/{chunk-QL2XVZRN.js.map → chunk-TUR7RGEP.js.map} +1 -1
  34. package/dist/{chunk-ZLWAYQEQ.js → chunk-UXRWVXBP.js} +32 -28
  35. package/dist/chunk-UXRWVXBP.js.map +1 -0
  36. package/dist/{export-audit-AJ7RORNK.js → export-audit-MT2LTMIN.js} +2 -2
  37. package/dist/index.cjs +167 -141
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +10 -1
  40. package/dist/index.d.ts +10 -1
  41. package/dist/index.js +51 -41
  42. package/dist/index.js.map +1 -1
  43. package/dist/internal.cjs +45 -40
  44. package/dist/internal.cjs.map +1 -1
  45. package/dist/internal.js +2 -2
  46. package/dist/{sqlite-wasm-channel-DUDPclTE.d.cts → sqlite-wasm-channel-CNHRf-m2.d.cts} +1 -1
  47. package/dist/{sqlite-wasm-channel-DUDPclTE.d.ts → sqlite-wasm-channel-CNHRf-m2.d.ts} +1 -1
  48. package/dist/sqlite-wasm-channel-NGSBJR44.js +12 -0
  49. package/package.json +2 -2
  50. package/dist/chunk-FFYA7J5H.js.map +0 -1
  51. package/dist/chunk-RBPVEAVM.js.map +0 -1
  52. package/dist/chunk-X57MWW35.js.map +0 -1
  53. package/dist/chunk-ZLWAYQEQ.js.map +0 -1
  54. package/dist/sqlite-wasm-channel-H43KEZLM.js +0 -12
  55. /package/dist/{backup-ZV4Y424B.js.map → backup-IQE4QC7Q.js.map} +0 -0
  56. /package/dist/{chunk-IOEFNHHP.js.map → chunk-COJSQBXW.js.map} +0 -0
  57. /package/dist/{export-audit-AJ7RORNK.js.map → export-audit-MT2LTMIN.js.map} +0 -0
  58. /package/dist/{sqlite-wasm-channel-H43KEZLM.js.map → sqlite-wasm-channel-NGSBJR44.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
71
71
  declare class WorkerTimeoutError extends KoraError {
72
72
  constructor(operation: string, timeoutMs: number);
73
73
  }
74
+ /**
75
+ * Thrown when a follower tab cannot reach a live leader tab over the multi-tab
76
+ * broadcast channel (the leader tab was closed, crashed, or is unresponsive).
77
+ * Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
78
+ * leader instead of waiting out the full RPC timeout.
79
+ */
80
+ declare class NoLeaderError extends KoraError {
81
+ constructor(operation: string);
82
+ }
74
83
  /**
75
84
  * Thrown when IndexedDB persistence operations fail (serialize/deserialize).
76
85
  */
@@ -1748,4 +1757,4 @@ declare function createChunkPortPair(): {
1748
1757
  b: ChunkMessagePort;
1749
1758
  };
1750
1759
 
1751
- export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
1760
+ export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
package/dist/index.d.ts CHANGED
@@ -71,6 +71,15 @@ declare class WorkerInitError extends KoraError {
71
71
  declare class WorkerTimeoutError extends KoraError {
72
72
  constructor(operation: string, timeoutMs: number);
73
73
  }
74
+ /**
75
+ * Thrown when a follower tab cannot reach a live leader tab over the multi-tab
76
+ * broadcast channel (the leader tab was closed, crashed, or is unresponsive).
77
+ * Distinct from {@link WorkerTimeoutError}: this fails fast on a confirmed-absent
78
+ * leader instead of waiting out the full RPC timeout.
79
+ */
80
+ declare class NoLeaderError extends KoraError {
81
+ constructor(operation: string);
82
+ }
74
83
  /**
75
84
  * Thrown when IndexedDB persistence operations fail (serialize/deserialize).
76
85
  */
@@ -1748,4 +1757,4 @@ declare function createChunkPortPair(): {
1748
1757
  b: ChunkMessagePort;
1749
1758
  };
1750
1759
 
1751
- export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
1760
+ export { AdapterError, ApplyRemoteOptions, type AuditExportManifest, type AuditExportOptions, type AuditExportPayload, type AuditExportProgress, type AuditTraceQuery, type BackupManifest, type BackupOptions, type BackupProgress, type BlobGcOptions, type BlobGcResult, type BlobManifest, type BlobManifestMetadata, COMPACTION_BASELINE_META_KEY, type ChunkMessage, type ChunkMessagePort, type ChunkProvider, type ChunkRequestMessage, type ChunkResponseMessage, type ClockRebaseResult, type CollectionAccessor, CollectionRecord, type CompactionResult, type CompactionStrategy, ContentAddressedBlobStore, type CreateRichTextControllerOptions, DEFAULT_CHUNK_SIZE, InvalidStateTransitionError, LAST_ACKED_SERVER_VECTOR_META_KEY, LocalMutationHandler, MaterializedRowSnapshot, MemoryBlobStore, NoLeaderError, type OpfsBlobDirectory, OpfsBlobStore, OptimisticLockError, OrderByDirection, type PersistedAuditTrace, PersistenceError, QueryBuilder, QueryDescriptor, QueryError, QueryStore, QueryStoreCache, type ReceiveBlobResult, type ReceiveBlobStores, RecordNotFoundError, type RemoteChunkProvider, type ReplaySnapshot, type RestoreOptions, type RestoreResult, type RichTextAwarenessUser, type RichTextController, type RichTextControllerSnapshot, type RichTextCursorInfo, type RichTextSyncEngine, RowVersionState, SequenceManager, type ServerBlobCallbacks, StorageAdapter, Store, StoreConfig, StoreNotOpenError, SubscriptionBloomFilter, SubscriptionCallback, SubscriptionManager, type SubscriptionManagerOptions, type SubscriptionStats, type TransactionCollectionAccessor, TransactionContext, type TransactionContextConfig, WhereClause, WorkerInitError, WorkerTimeoutError, asRichTextSyncEngine, assertQueryReady, chunkBlob, collectBlobGarbage, collectOperationsAheadOfServer, compactOperationLog, computeAckCompactionWatermark, createChunkPortPair, createMemoryServerBlobStore, createOpfsBlobDirectory, createOpfsBlobStore, createRemoteChunkProvider, createRichTextController, decodeAuditExport, decodeRichtext, deserializeVersionVectorFromMeta, encodeRichtext, exportBackup, extractBlobRefs, fetchBlobManifest, getSharedQueryStoreCache, mergeVersionVectors, parseBlobManifest, persistedAuditTraceFromEvent, pluralize, prepareBlobForSend, putBlobForTransfer, readAuditExportManifest, readBackupManifest, reassembleBlob, receiveBlob, resolveBlobManifest, restoreBackup, richtextStatesEqual, richtextToPlainText, serializeBlobManifest, serializeVersionVectorToMeta, serveBlobChunks, singularize, toServerBlobCallbacks, validateStateTransition, validateUpdateStateMachine, verifyAuditExportChecksum, verifyBackupChecksum };
package/dist/index.js CHANGED
@@ -3,12 +3,12 @@ import {
3
3
  readBackupManifest,
4
4
  restoreBackup,
5
5
  verifyBackupChecksum
6
- } from "./chunk-X57MWW35.js";
6
+ } from "./chunk-OCOGQRHW.js";
7
7
  import {
8
8
  decodeAuditExport,
9
9
  readAuditExportManifest,
10
10
  verifyAuditExportChecksum
11
- } from "./chunk-FFYA7J5H.js";
11
+ } from "./chunk-RCTG3IJG.js";
12
12
  import {
13
13
  persistedAuditTraceFromEvent
14
14
  } from "./chunk-MYSJN3DF.js";
@@ -39,7 +39,7 @@ import {
39
39
  serializeRowVersion,
40
40
  validateStateTransition,
41
41
  validateUpdateStateMachine
42
- } from "./chunk-ZLWAYQEQ.js";
42
+ } from "./chunk-UXRWVXBP.js";
43
43
  import {
44
44
  decodeRichtext,
45
45
  decodeRichtextFieldsFromOpData,
@@ -54,6 +54,7 @@ import {
54
54
  } from "./chunk-6NKLDBTY.js";
55
55
  import {
56
56
  AdapterError,
57
+ NoLeaderError,
57
58
  OptimisticLockError,
58
59
  PersistenceError,
59
60
  QueryError,
@@ -61,13 +62,13 @@ import {
61
62
  StoreNotOpenError,
62
63
  WorkerInitError,
63
64
  WorkerTimeoutError
64
- } from "./chunk-QL2XVZRN.js";
65
+ } from "./chunk-TUR7RGEP.js";
65
66
 
66
67
  // src/compaction/types.ts
67
68
  var COMPACTION_BASELINE_META_KEY = "compaction_baseline_at";
68
69
 
69
70
  // src/compaction/compact-operation-log.ts
70
- import { HybridLogicalClock, createVersionVector } from "@korajs/core";
71
+ import { HybridLogicalClock, createVersionVector, quoteIdent } from "@korajs/core";
71
72
  function computeAckCompactionWatermark(serverVector) {
72
73
  const watermark = createVersionVector();
73
74
  for (const [nodeId, seq] of serverVector) {
@@ -95,7 +96,7 @@ async function compactOperationLog(adapter, schema, strategy, serverVector) {
95
96
  const collectionNames = Object.keys(schema.collections);
96
97
  await adapter.transaction(async (tx) => {
97
98
  for (const collectionName of collectionNames) {
98
- const table = `_kora_ops_${collectionName}`;
99
+ const table = quoteIdent(`_kora_ops_${collectionName}`);
99
100
  for (const [nodeId, maxSeq] of watermark) {
100
101
  if (maxSeq <= 0) continue;
101
102
  const countSql = buildCountSql(table, ageCutoffSerialized !== null);
@@ -209,10 +210,12 @@ import {
209
210
  HybridLogicalClock as HybridLogicalClock3,
210
211
  createVersionVector as createVersionVector3,
211
212
  generateUUIDv7 as generateUUIDv73,
212
- migrationStepsToSQL
213
+ migrationStepsToSQL,
214
+ quoteIdent as quoteIdent7
213
215
  } from "@korajs/core";
214
216
 
215
217
  // src/collection/collection.ts
218
+ import { quoteIdent as quoteIdent2 } from "@korajs/core";
216
219
  var Collection = class {
217
220
  constructor(name, definition, schema, adapter, clock, nodeId, allocateSequenceNumber, onMutation, relationEnforcer, mutationHandler, causalTracker, secretKeyProvider) {
218
221
  this.name = name;
@@ -264,7 +267,7 @@ var Collection = class {
264
267
  }
265
268
  async findById(id) {
266
269
  const rows = await this.adapter.query(
267
- `SELECT * FROM ${this.name} WHERE id = ? AND _deleted = 0`,
270
+ `SELECT * FROM ${quoteIdent2(this.name)} WHERE id = ? AND _deleted = 0`,
268
271
  [id]
269
272
  );
270
273
  const row = rows[0];
@@ -296,6 +299,9 @@ var Collection = class {
296
299
  }
297
300
  };
298
301
 
302
+ // src/query/query-builder.ts
303
+ import { quoteIdent as quoteIdent3 } from "@korajs/core";
304
+
299
305
  // src/query/pluralize.ts
300
306
  function isVowel(char) {
301
307
  if (!char) return false;
@@ -525,7 +531,7 @@ var QueryBuilder = class _QueryBuilder {
525
531
  const relatedDef = this.schema?.collections[relatedCollection];
526
532
  if (!relatedDef) return;
527
533
  const placeholders = uniqueFks.map(() => "?").join(", ");
528
- const sql = `SELECT * FROM ${relatedCollection} WHERE id IN (${placeholders}) AND _deleted = 0`;
534
+ const sql = `SELECT * FROM ${quoteIdent3(relatedCollection)} WHERE id IN (${placeholders}) AND _deleted = 0`;
529
535
  const rows = await this.adapter.query(sql, uniqueFks);
530
536
  const relatedRecords = rows.map((row) => deserializeRecord(row, relatedDef.fields));
531
537
  const lookup = /* @__PURE__ */ new Map();
@@ -548,7 +554,7 @@ var QueryBuilder = class _QueryBuilder {
548
554
  if (!relatedDef) return;
549
555
  const fkField = relation.field;
550
556
  const placeholders = primaryIds.map(() => "?").join(", ");
551
- const sql = `SELECT * FROM ${relatedCollection} WHERE ${fkField} IN (${placeholders}) AND _deleted = 0`;
557
+ const sql = `SELECT * FROM ${quoteIdent3(relatedCollection)} WHERE ${quoteIdent3(fkField)} IN (${placeholders}) AND _deleted = 0`;
552
558
  const rows = await this.adapter.query(sql, primaryIds);
553
559
  const relatedRecords = rows.map((row) => deserializeRecord(row, relatedDef.fields));
554
560
  const grouped = /* @__PURE__ */ new Map();
@@ -590,7 +596,7 @@ var QueryError2 = class extends Error {
590
596
  };
591
597
 
592
598
  // src/relations/relation-enforcer.ts
593
- import { KoraError, createOperation } from "@korajs/core";
599
+ import { KoraError, createOperation, quoteIdent as quoteIdent4 } from "@korajs/core";
594
600
 
595
601
  // src/relations/relation-lookup.ts
596
602
  function buildRelationLookup(schema) {
@@ -693,7 +699,7 @@ var RelationEnforcer = class {
693
699
  async enforceCascade(incoming, deletedRecordId, tx, causalDeps) {
694
700
  const { sourceCollection, foreignKeyField } = incoming;
695
701
  const referencingRows = await tx.query(
696
- `SELECT id FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
702
+ `SELECT id FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
697
703
  [deletedRecordId]
698
704
  );
699
705
  if (referencingRows.length === 0) {
@@ -740,7 +746,7 @@ var RelationEnforcer = class {
740
746
  return [];
741
747
  }
742
748
  const referencingRows = await tx.query(
743
- `SELECT id FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
749
+ `SELECT id FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
744
750
  [deletedRecordId]
745
751
  );
746
752
  if (referencingRows.length === 0) {
@@ -788,7 +794,7 @@ var RelationEnforcer = class {
788
794
  async enforceRestrict(incoming, deletedRecordId, tx) {
789
795
  const { sourceCollection, foreignKeyField, relationName } = incoming;
790
796
  const countRows = await tx.query(
791
- `SELECT COUNT(*) as cnt FROM ${sourceCollection} WHERE ${foreignKeyField} = ? AND _deleted = 0`,
797
+ `SELECT COUNT(*) as cnt FROM ${quoteIdent4(sourceCollection)} WHERE ${quoteIdent4(foreignKeyField)} = ? AND _deleted = 0`,
792
798
  [deletedRecordId]
793
799
  );
794
800
  const count = countRows[0]?.cnt ?? 0;
@@ -1476,7 +1482,7 @@ var SubscriptionManager = class {
1476
1482
  };
1477
1483
 
1478
1484
  // src/sync/rebase-unsynced-operations.ts
1479
- import { HybridLogicalClock as HybridLogicalClock2, MAX_LOGICAL } from "@korajs/core";
1485
+ import { HybridLogicalClock as HybridLogicalClock2, MAX_LOGICAL, quoteIdent as quoteIdent5 } from "@korajs/core";
1480
1486
  import { computeOperationId } from "@korajs/core/internal";
1481
1487
  var LOGICAL_COUNTER_LIMIT = MAX_LOGICAL + 1;
1482
1488
  function emptyResult() {
@@ -1490,7 +1496,9 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
1490
1496
  const rebased = [];
1491
1497
  let maxOtherSerializedTs = null;
1492
1498
  for (const collectionName of Object.keys(schema.collections)) {
1493
- const rows = await adapter.query(`SELECT * FROM _kora_ops_${collectionName}`);
1499
+ const rows = await adapter.query(
1500
+ `SELECT * FROM ${quoteIdent5(`_kora_ops_${collectionName}`)}`
1501
+ );
1494
1502
  for (const row of rows) {
1495
1503
  if (rebaseIds.has(row.id)) {
1496
1504
  rebased.push(deserializeOperationWithCollection(row, collectionName));
@@ -1559,7 +1567,7 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
1559
1567
  continue;
1560
1568
  }
1561
1569
  const opsTable = `_kora_ops_${oldOp.collection}`;
1562
- await tx.execute(`DELETE FROM ${opsTable} WHERE id = ?`, [oldOp.id]);
1570
+ await tx.execute(`DELETE FROM ${quoteIdent5(opsTable)} WHERE id = ?`, [oldOp.id]);
1563
1571
  const opInsert = buildInsertQuery(
1564
1572
  opsTable,
1565
1573
  serializeOperation(newOp)
@@ -1568,11 +1576,11 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
1568
1576
  const oldVersion = serializeRowVersion(oldOp.timestamp);
1569
1577
  const newVersion = serializeRowVersion(newOp.timestamp);
1570
1578
  await tx.execute(
1571
- `UPDATE ${oldOp.collection} SET _version = ?, _updated_at = ? WHERE id = ? AND _version = ?`,
1579
+ `UPDATE ${quoteIdent5(oldOp.collection)} SET _version = ?, _updated_at = ? WHERE id = ? AND _version = ?`,
1572
1580
  [newVersion, newOp.timestamp.wallTime, oldOp.recordId, oldVersion]
1573
1581
  );
1574
1582
  const rows = await tx.query(
1575
- `SELECT _field_versions FROM ${oldOp.collection} WHERE id = ?`,
1583
+ `SELECT _field_versions FROM ${quoteIdent5(oldOp.collection)} WHERE id = ?`,
1576
1584
  [oldOp.recordId]
1577
1585
  );
1578
1586
  const fieldVersions = parseFieldVersions(rows[0]?._field_versions);
@@ -1584,14 +1592,14 @@ async function rebaseUnsyncedOperationsInLog(adapter, schema, unsyncedOpIds, cor
1584
1592
  }
1585
1593
  }
1586
1594
  if (changed) {
1587
- await tx.execute(`UPDATE ${oldOp.collection} SET _field_versions = ? WHERE id = ?`, [
1588
- serializeFieldVersions(fieldVersions),
1589
- oldOp.recordId
1590
- ]);
1595
+ await tx.execute(
1596
+ `UPDATE ${quoteIdent5(oldOp.collection)} SET _field_versions = ? WHERE id = ?`,
1597
+ [serializeFieldVersions(fieldVersions), oldOp.recordId]
1598
+ );
1591
1599
  }
1592
1600
  if (oldOp.type === "insert") {
1593
1601
  await tx.execute(
1594
- `UPDATE ${oldOp.collection} SET _created_at = ? WHERE id = ? AND _created_at = ?`,
1602
+ `UPDATE ${quoteIdent5(oldOp.collection)} SET _created_at = ? WHERE id = ? AND _created_at = ?`,
1595
1603
  [newOp.timestamp.wallTime, oldOp.recordId, oldOp.timestamp.wallTime]
1596
1604
  );
1597
1605
  }
@@ -1611,6 +1619,7 @@ import {
1611
1619
  createOperation as createOperation2,
1612
1620
  generateUUIDv7,
1613
1621
  isAtomicOp,
1622
+ quoteIdent as quoteIdent6,
1614
1623
  resolveAtomicOp,
1615
1624
  toAtomicOp,
1616
1625
  validateRecord
@@ -1927,7 +1936,7 @@ var TransactionContext = class {
1927
1936
  }
1928
1937
  }
1929
1938
  const rows = await this.config.adapter.query(
1930
- `SELECT * FROM ${collectionName} WHERE id = ? AND _deleted = 0`,
1939
+ `SELECT * FROM ${quoteIdent6(collectionName)} WHERE id = ? AND _deleted = 0`,
1931
1940
  [id]
1932
1941
  );
1933
1942
  let record = rows[0] ? deserializeRecord(rows[0], definition.fields) : null;
@@ -2162,7 +2171,7 @@ var Store = class {
2162
2171
  return "skipped";
2163
2172
  }
2164
2173
  const existing = await this.adapter.query(
2165
- `SELECT id FROM _kora_ops_${collection} WHERE id = ?`,
2174
+ `SELECT id FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE id = ?`,
2166
2175
  [op.id]
2167
2176
  );
2168
2177
  if (existing.length > 0) {
@@ -2267,7 +2276,7 @@ var Store = class {
2267
2276
  const serializedChanges = serializeRecord(materializeSource, definition.fields);
2268
2277
  const changedFields = Object.keys(serializedChanges);
2269
2278
  const currentRows = await tx.query(
2270
- `SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
2279
+ `SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
2271
2280
  [op.recordId]
2272
2281
  );
2273
2282
  const currentRow = currentRows[0];
@@ -2363,7 +2372,7 @@ var Store = class {
2363
2372
  */
2364
2373
  async foldOrphanedOperations(tx, collection, definition, recordId) {
2365
2374
  const orphanRows = await tx.query(
2366
- `SELECT * FROM _kora_ops_${collection} WHERE record_id = ? AND type IN ('update', 'delete')`,
2375
+ `SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ? AND type IN ('update', 'delete')`,
2367
2376
  [recordId]
2368
2377
  );
2369
2378
  if (orphanRows.length === 0) {
@@ -2376,7 +2385,7 @@ var Store = class {
2376
2385
  if (orphan.type === "update" && orphan.data) {
2377
2386
  const orphanChanges = serializeRecord(orphan.data, definition.fields);
2378
2387
  const rows = await tx.query(
2379
- `SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
2388
+ `SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
2380
2389
  [recordId]
2381
2390
  );
2382
2391
  const current = rows[0];
@@ -2426,7 +2435,7 @@ var Store = class {
2426
2435
  const allOps = [];
2427
2436
  for (const collectionName of Object.keys(this.schema.collections)) {
2428
2437
  const rows = await this.adapter.query(
2429
- `SELECT * FROM _kora_ops_${collectionName} WHERE node_id = ? AND sequence_number >= ? AND sequence_number <= ? ORDER BY sequence_number ASC`,
2438
+ `SELECT * FROM ${quoteIdent7(`_kora_ops_${collectionName}`)} WHERE node_id = ? AND sequence_number >= ? AND sequence_number <= ? ORDER BY sequence_number ASC`,
2430
2439
  [nodeId, fromSeq, toSeq]
2431
2440
  );
2432
2441
  for (const row of rows) {
@@ -2445,7 +2454,7 @@ var Store = class {
2445
2454
  const allOps = [];
2446
2455
  for (const collectionName of Object.keys(this.schema.collections)) {
2447
2456
  const rows = await this.adapter.query(
2448
- `SELECT * FROM _kora_ops_${collectionName} ORDER BY sequence_number ASC`
2457
+ `SELECT * FROM ${quoteIdent7(`_kora_ops_${collectionName}`)} ORDER BY sequence_number ASC`
2449
2458
  );
2450
2459
  for (const row of rows) {
2451
2460
  allOps.push(deserializeOperationWithCollection(row, collectionName));
@@ -2496,7 +2505,7 @@ var Store = class {
2496
2505
  */
2497
2506
  async exportAudit(options) {
2498
2507
  this.ensureOpen();
2499
- const { exportAudit: doExport } = await import("./export-audit-AJ7RORNK.js");
2508
+ const { exportAudit: doExport } = await import("./export-audit-MT2LTMIN.js");
2500
2509
  return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
2501
2510
  }
2502
2511
  /**
@@ -2555,7 +2564,7 @@ var Store = class {
2555
2564
  return null;
2556
2565
  }
2557
2566
  const rows = await this.adapter.query(
2558
- `SELECT * FROM ${collection} WHERE id = ?`,
2567
+ `SELECT * FROM ${quoteIdent7(collection)} WHERE id = ?`,
2559
2568
  [recordId]
2560
2569
  );
2561
2570
  const row = rows[0];
@@ -2580,7 +2589,7 @@ var Store = class {
2580
2589
  return null;
2581
2590
  }
2582
2591
  const rows = await this.adapter.query(
2583
- `SELECT _version, _field_versions FROM ${collection} WHERE id = ?`,
2592
+ `SELECT _version, _field_versions FROM ${quoteIdent7(collection)} WHERE id = ?`,
2584
2593
  [recordId]
2585
2594
  );
2586
2595
  const row = rows[0];
@@ -2686,7 +2695,7 @@ var Store = class {
2686
2695
  async getLatestLocalOperationForRecord(collection, recordId) {
2687
2696
  this.ensureOpen();
2688
2697
  const rows = await this.adapter.query(
2689
- `SELECT * FROM _kora_ops_${collection} WHERE node_id = ? AND record_id = ? ORDER BY sequence_number DESC LIMIT 1`,
2698
+ `SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE node_id = ? AND record_id = ? ORDER BY sequence_number DESC LIMIT 1`,
2690
2699
  [this.nodeId, recordId]
2691
2700
  );
2692
2701
  const row = rows[0];
@@ -2701,7 +2710,7 @@ var Store = class {
2701
2710
  async getLatestOperationForRecord(collection, recordId) {
2702
2711
  this.ensureOpen();
2703
2712
  const rows = await this.adapter.query(
2704
- `SELECT * FROM _kora_ops_${collection} WHERE record_id = ?`,
2713
+ `SELECT * FROM ${quoteIdent7(`_kora_ops_${collection}`)} WHERE record_id = ?`,
2705
2714
  [recordId]
2706
2715
  );
2707
2716
  let latest = null;
@@ -2791,7 +2800,7 @@ var Store = class {
2791
2800
  */
2792
2801
  async exportBackup(options) {
2793
2802
  this.ensureOpen();
2794
- const { exportBackup: doExport } = await import("./backup-ZV4Y424B.js");
2803
+ const { exportBackup: doExport } = await import("./backup-IQE4QC7Q.js");
2795
2804
  return doExport(this.adapter, this.schema, this.nodeId, this.schema.version, options);
2796
2805
  }
2797
2806
  /**
@@ -2803,7 +2812,7 @@ var Store = class {
2803
2812
  */
2804
2813
  async importBackup(data, options) {
2805
2814
  this.ensureOpen();
2806
- const { restoreBackup: doRestore } = await import("./backup-ZV4Y424B.js");
2815
+ const { restoreBackup: doRestore } = await import("./backup-IQE4QC7Q.js");
2807
2816
  return doRestore(this.adapter, this.schema, data, options);
2808
2817
  }
2809
2818
  /**
@@ -2888,14 +2897,14 @@ var Store = class {
2888
2897
  */
2889
2898
  async runBackfill(collection, transform) {
2890
2899
  const rows = await this.adapter.query(
2891
- `SELECT * FROM ${collection} WHERE _deleted = 0`
2900
+ `SELECT * FROM ${quoteIdent7(collection)} WHERE _deleted = 0`
2892
2901
  );
2893
2902
  await this.adapter.transaction(async (tx) => {
2894
2903
  for (const row of rows) {
2895
2904
  const updates = transform(row);
2896
2905
  const fields = Object.keys(updates);
2897
2906
  if (fields.length === 0) continue;
2898
- const setClauses = fields.map((f) => `${f} = ?`).join(", ");
2907
+ const setClauses = fields.map((f) => `${quoteIdent7(f)} = ?`).join(", ");
2899
2908
  const values = fields.map((f) => {
2900
2909
  const val = updates[f];
2901
2910
  if (typeof val === "boolean") return val ? 1 : 0;
@@ -2905,7 +2914,7 @@ var Store = class {
2905
2914
  return val;
2906
2915
  });
2907
2916
  values.push(row.id);
2908
- await tx.execute(`UPDATE ${collection} SET ${setClauses} WHERE id = ?`, values);
2917
+ await tx.execute(`UPDATE ${quoteIdent7(collection)} SET ${setClauses} WHERE id = ?`, values);
2909
2918
  }
2910
2919
  });
2911
2920
  }
@@ -3944,6 +3953,7 @@ export {
3944
3953
  InvalidStateTransitionError,
3945
3954
  LAST_ACKED_SERVER_VECTOR_META_KEY,
3946
3955
  MemoryBlobStore,
3956
+ NoLeaderError,
3947
3957
  OpfsBlobStore,
3948
3958
  OptimisticLockError,
3949
3959
  PersistenceError,