@event-driven-io/pongo 0.17.0-beta.39 → 0.17.0-beta.40

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 (45) hide show
  1. package/dist/cli.cjs +2 -2
  2. package/dist/cli.cjs.map +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cloudflare.cjs +2 -2
  6. package/dist/cloudflare.d.cts +2 -2
  7. package/dist/cloudflare.d.ts +2 -2
  8. package/dist/cloudflare.js +2 -2
  9. package/dist/{core-Dtn-d-91.js → core-BHdOCUrr.js} +111 -3
  10. package/dist/core-BHdOCUrr.js.map +1 -0
  11. package/dist/{core-BdTIuXiI.cjs → core-C9SB3XMx.cjs} +116 -2
  12. package/dist/core-C9SB3XMx.cjs.map +1 -0
  13. package/dist/{core-wHw_lMM5.js → core-CH0SOCr3.js} +65 -11
  14. package/dist/core-CH0SOCr3.js.map +1 -0
  15. package/dist/{core-BYk4wCpe.cjs → core-CkmE5dkK.cjs} +65 -11
  16. package/dist/core-CkmE5dkK.cjs.map +1 -0
  17. package/dist/{index-CL0zRxRl.d.ts → index-C3pnS1S_.d.cts} +23 -8
  18. package/dist/{index-Cxo6j266.d.ts → index-CZOmOsQt.d.ts} +2 -2
  19. package/dist/{index-DyNmc6tD.d.cts → index-FXnldVnn.d.cts} +2 -2
  20. package/dist/{index-BfOn92K5.d.cts → index-r7V4paf_.d.ts} +23 -8
  21. package/dist/index.cjs +2 -1
  22. package/dist/index.d.cts +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +2 -2
  25. package/dist/pg.cjs +67 -10
  26. package/dist/pg.cjs.map +1 -1
  27. package/dist/pg.d.cts +1 -1
  28. package/dist/pg.d.ts +1 -1
  29. package/dist/pg.js +67 -10
  30. package/dist/pg.js.map +1 -1
  31. package/dist/shim.cjs +18 -8
  32. package/dist/shim.cjs.map +1 -1
  33. package/dist/shim.d.cts +1 -1
  34. package/dist/shim.d.ts +1 -1
  35. package/dist/shim.js +18 -8
  36. package/dist/shim.js.map +1 -1
  37. package/dist/sqlite3.cjs +2 -2
  38. package/dist/sqlite3.d.cts +2 -2
  39. package/dist/sqlite3.d.ts +2 -2
  40. package/dist/sqlite3.js +2 -2
  41. package/package.json +2 -2
  42. package/dist/core-BYk4wCpe.cjs.map +0 -1
  43. package/dist/core-BdTIuXiI.cjs.map +0 -1
  44. package/dist/core-Dtn-d-91.js.map +0 -1
  45. package/dist/core-wHw_lMM5.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as InferIdType, $t as ExtractPongoDriverOptions, A as MaybePromise, An as PongoCollectionSchemaComponent, At as PongoTransactionOptions, B as DOCUMENT_DOES_NOT_EXIST, Bn as DocumentCommandHandlerOptions, Bt as WithId, C as PongoCacheType, Cn as proxyPongoDbWithSchema, Ct as PongoFilterOperator, D as LRUCacheOptions, Dn as QueryOperators, Dt as PongoMigrationOptions, E as noopCacheProvider, En as OperatorMap, Et as PongoInsertOneResult, F as AlternativeType, Fn as PongoCollectionOptions, Ft as ReplaceManyOptions, G as DocumentHandler, Gt as WithoutVersion, H as DeleteManyOptions, Hn as idFromFilter, Ht as WithVersion, I as AnyPongoDb, In as pongoCollection, It as ReplaceOneOptions, J as ExpectedDocumentVersionGeneral, Jt as isGeneralExpectedDocumentVersion, K as EnhancedOmit, Kt as expectedVersion, L as BatchHandleOptions, Ln as transactionExecutorOrDefault, Lt as RootFilterOperators, M as $push, Mn as PongoCollectionURN, Mt as PongoUpdateManyResult, N as $set, Nn as PongoCollectionURNType, Nt as PongoUpdateResult, O as lruCache, On as hasOperators, Ot as PongoReplaceManyResult, P as $unset, Pn as PongoCollectionSQLBuilder, Pt as RegExpOrString, Q as HasId, Qt as ExtractPongoDatabaseTypeFromDriver, R as CollectionOperationOptions, Rn as DocumentCommandHandler, Rt as UpdateManyOptions, S as PongoCacheSetEntry, Sn as proxyClientWithSchema, St as PongoFilter, T as pongoCache, Tn as toDbSchemaMetadata, Tt as PongoInsertManyResult, U as DeleteOneOptions, Un as NonPartial, Ut as WithoutId, V as DOCUMENT_EXISTS, Vn as getIdsFromIdOnlyFilter, Vt as WithIdAndVersion, W as Document, Wn as objectEntries, Wt as WithoutIdAndVersion, X as FindOptions, Xt as AnyPongoDriver, Y as ExpectedDocumentVersionValue, Yt as operationResult, Z as HandleOptions, Zt as AnyPongoDriverOptions, _ as CacheHooks, _n as PongoDbSchema, _t as PongoDbOptions, a as ConcurrencyError, an as PongoDatabaseSQLBuilder, at as ObjectIdLike, b as CacheType, bn as PongoSchemaConfig, bt as PongoDeleteResult, c as isString, cn as PongoDatabaseURN, ct as OptionalUnlessRequiredId, d as PongoDatabaseCache, dn as DBsMap, dt as OptionalVersion, en as PongoDatabaseFactoryOptions, et as InsertManyOptions, f as PongoTransactionCache, fn as PongoClientSchema, ft as PongoClient, g as CacheConfig, gn as PongoCollectionSchemaMetadata, gt as PongoDb, h as pongoCacheWrapper, hn as PongoCollectionSchema, ht as PongoDBCollectionOptions, i as pongoClient, in as pongoDriverRegistry, it as ObjectId, j as $inc, jn as PongoCollectionSchemaComponentOptions, jt as PongoUpdate, k as identityMapCache, kn as isOperator, kt as PongoSession, l as PongoDatabase, ln as PongoDatabaseURNType, lt as OptionalUnlessRequiredIdAndVersion, m as pongoTransactionCache, mn as PongoClientWithSchema, mt as PongoCollection, n as PongoSessionOptions, nn as PongoDriverOptions, nt as NO_CONCURRENCY_CHECK, o as PongoError, on as PongoDatabaseSchemaComponent, ot as OperationResult, p as PongoTransactionCacheOperationOptions, pn as PongoClientSchemaMetadata, pt as PongoClientOptions, q as ExpectedDocumentVersion, qt as expectedVersionValue, r as pongoSession, rn as PongoDriverRegistry, rt as NonObjectIdLikeDocument, s as isNumber, sn as PongoDatabaseSchemaComponentOptions, st as OptionalId, t as pongoTransaction, tn as PongoDriver, tt as InsertOneOptions, u as PongoDatabaseOptions, un as CollectionsMap, ut as OptionalUnlessRequiredVersion, v as CacheOptions, vn as PongoDbSchemaMetadata, vt as PongoDbTransaction, w as PongoDocumentCacheKey, wn as toClientSchemaMetadata, wt as PongoHandleResult, x as PongoCache, xn as pongoSchema, xt as PongoDocument, y as CacheSettings, yn as PongoDbWithSchema, yt as PongoDeleteManyResult, z as Condition, zn as DocumentCommandHandlerInput, zt as UpdateOneOptions } from "./index-CL0zRxRl.js";
1
+ import { $ as HasId, $t as AnyPongoDriverOptions, A as MaybePromise, An as hasOperators, At as PongoSession, B as DOCUMENT_DOES_NOT_EXIST, Bn as DocumentCommandHandler, Bt as UpdateOneOptions, C as PongoCacheType, Cn as pongoSchema, Ct as PongoFilter, D as LRUCacheOptions, Dn as toDbSchemaMetadata, Dt as PongoInsertOneResult, E as noopCacheProvider, En as toClientSchemaMetadata, Et as PongoInsertManyResult, F as AlternativeType, Fn as PongoCollectionURNType, Ft as RegExpOrString, G as DocumentHandler, Gn as NonPartial, Gt as WithoutIdAndVersion, H as DeleteManyOptions, Hn as DocumentCommandHandlerOptions, Ht as WithIdAndVersion, I as AnyPongoDb, In as PongoCollectionSQLBuilder, It as ReplaceManyOptions, J as ExpectedDocumentVersionGeneral, Jt as expectedVersionPredicate, K as EnhancedOmit, Kn as objectEntries, Kt as WithoutVersion, L as BatchHandleOptions, Ln as PongoCollectionOptions, Lt as ReplaceOneOptions, M as $push, Mn as PongoCollectionSchemaComponent, Mt as PongoUpdate, N as $set, Nn as PongoCollectionSchemaComponentOptions, Nt as PongoUpdateManyResult, O as lruCache, On as OperatorMap, Ot as PongoMigrationOptions, P as $unset, Pn as PongoCollectionURN, Pt as PongoUpdateResult, Q as HandleOptions, Qt as AnyPongoDriver, R as CollectionOperationOptions, Rn as pongoCollection, Rt as RootFilterOperators, S as PongoCacheSetEntry, Sn as PongoSchemaConfig, St as PongoDocument, T as pongoCache, Tn as proxyPongoDbWithSchema, Tt as PongoHandleResult, U as DeleteOneOptions, Un as getIdsFromIdOnlyFilter, Ut as WithVersion, V as DOCUMENT_EXISTS, Vn as DocumentCommandHandlerInput, Vt as WithId, W as Document, Wn as idFromFilter, Wt as WithoutId, X as ExpectedVersionPredicate, Xt as isGeneralExpectedDocumentVersion, Y as ExpectedDocumentVersionValue, Yt as expectedVersionValue, Z as FindOptions, Zt as operationResult, _ as CacheHooks, _n as PongoCollectionSchema, _t as PongoDb, a as ConcurrencyError, an as PongoDriverRegistry, at as ObjectId, b as CacheType, bn as PongoDbSchemaMetadata, bt as PongoDeleteManyResult, c as isString, cn as PongoDatabaseSchemaComponent, ct as OptionalId, d as PongoDatabaseCache, dn as PongoDatabaseURNType, dt as OptionalUnlessRequiredVersion, en as ExtractPongoDatabaseTypeFromDriver, et as InferIdType, f as PongoTransactionCache, fn as CollectionsMap, ft as OptionalVersion, g as CacheConfig, gn as PongoClientWithSchema, gt as PongoDBCollectionOptions, h as pongoCacheWrapper, hn as PongoClientSchemaMetadata, ht as PongoCollection, i as pongoClient, in as PongoDriverOptions, it as NonObjectIdLikeDocument, j as $inc, jn as isOperator, jt as PongoTransactionOptions, k as identityMapCache, kn as QueryOperators, kt as PongoReplaceManyResult, l as PongoDatabase, ln as PongoDatabaseSchemaComponentOptions, lt as OptionalUnlessRequiredId, m as pongoTransactionCache, mn as PongoClientSchema, mt as PongoClientOptions, n as PongoSessionOptions, nn as PongoDatabaseFactoryOptions, nt as InsertOneOptions, o as PongoError, on as pongoDriverRegistry, ot as ObjectIdLike, p as PongoTransactionCacheOperationOptions, pn as DBsMap, pt as PongoClient, q as ExpectedDocumentVersion, qt as expectedVersion, r as pongoSession, rn as PongoDriver, rt as NO_CONCURRENCY_CHECK, s as isNumber, sn as PongoDatabaseSQLBuilder, st as OperationResult, t as pongoTransaction, tn as ExtractPongoDriverOptions, tt as InsertManyOptions, u as PongoDatabaseOptions, un as PongoDatabaseURN, ut as OptionalUnlessRequiredIdAndVersion, v as CacheOptions, vn as PongoCollectionSchemaMetadata, vt as PongoDbOptions, w as PongoDocumentCacheKey, wn as proxyClientWithSchema, wt as PongoFilterOperator, x as PongoCache, xn as PongoDbWithSchema, xt as PongoDeleteResult, y as CacheSettings, yn as PongoDbSchema, yt as PongoDbTransaction, z as Condition, zn as transactionExecutorOrDefault, zt as UpdateManyOptions } from "./index-r7V4paf_.js";
2
2
 
3
3
  //#region src/core/utils/deepEquals.d.ts
4
4
  declare const deepEquals: <T>(left: T, right: T) => boolean;
@@ -17,5 +17,5 @@ declare const mapAsync: <T, R>(items: T[], fn: (item: T, index: number) => Promi
17
17
  //#region src/index.d.ts
18
18
  declare const loadPongoClient: (path: "pg" | "sqlite3" | "d1") => Promise<AnyPongoDriver>;
19
19
  //#endregion
20
- export { $inc, $push, $set, $unset, AlternativeType, AnyPongoDb, AnyPongoDriver, AnyPongoDriverOptions, BatchHandleOptions, CacheConfig, CacheHooks, CacheOptions, CacheSettings, CacheType, CollectionOperationOptions, CollectionsMap, ConcurrencyError, Condition, DBsMap, DOCUMENT_DOES_NOT_EXIST, DOCUMENT_EXISTS, DeleteManyOptions, DeleteOneOptions, Document, DocumentCommandHandler, DocumentCommandHandlerInput, DocumentCommandHandlerOptions, DocumentHandler, EnhancedOmit, Equatable, ExpectedDocumentVersion, ExpectedDocumentVersionGeneral, ExpectedDocumentVersionValue, ExtractPongoDatabaseTypeFromDriver, ExtractPongoDriverOptions, FindOptions, HandleOptions, HasId, InferIdType, InsertManyOptions, InsertOneOptions, LRUCacheOptions, MaybePromise, NO_CONCURRENCY_CHECK, NonObjectIdLikeDocument, NonPartial, ObjectId, ObjectIdLike, OperationResult, OperatorMap, OptionalId, OptionalUnlessRequiredId, OptionalUnlessRequiredIdAndVersion, OptionalUnlessRequiredVersion, OptionalVersion, PongoCache, PongoCacheSetEntry, PongoCacheType, PongoClient, PongoClientOptions, PongoClientSchema, PongoClientSchemaMetadata, PongoClientWithSchema, PongoCollection, PongoCollectionOptions, PongoCollectionSQLBuilder, PongoCollectionSchema, PongoCollectionSchemaComponent, PongoCollectionSchemaComponentOptions, PongoCollectionSchemaMetadata, PongoCollectionURN, PongoCollectionURNType, PongoDBCollectionOptions, PongoDatabase, PongoDatabaseCache, PongoDatabaseFactoryOptions, PongoDatabaseOptions, PongoDatabaseSQLBuilder, PongoDatabaseSchemaComponent, PongoDatabaseSchemaComponentOptions, PongoDatabaseURN, PongoDatabaseURNType, PongoDb, PongoDbOptions, PongoDbSchema, PongoDbSchemaMetadata, PongoDbTransaction, PongoDbWithSchema, PongoDeleteManyResult, PongoDeleteResult, PongoDocument, PongoDocumentCacheKey, PongoDriver, PongoDriverOptions, PongoDriverRegistry, PongoError, PongoFilter, PongoFilterOperator, PongoHandleResult, PongoInsertManyResult, PongoInsertOneResult, PongoMigrationOptions, PongoReplaceManyResult, PongoSchemaConfig, PongoSession, PongoSessionOptions, PongoTransactionCache, PongoTransactionCacheOperationOptions, PongoTransactionOptions, PongoUpdate, PongoUpdateManyResult, PongoUpdateResult, QueryOperators, RegExpOrString, ReplaceManyOptions, ReplaceOneOptions, RootFilterOperators, UpdateManyOptions, UpdateOneOptions, WithId, WithIdAndVersion, WithVersion, WithoutId, WithoutIdAndVersion, WithoutVersion, deepEquals, expectedVersion, expectedVersionValue, getIdsFromIdOnlyFilter, hasOperators, idFromFilter, identityMapCache, isEquatable, isGeneralExpectedDocumentVersion, isNumber, isOperator, isString, loadPongoClient, lruCache, mapAsync, mapParallel, mapSequential, noopCacheProvider, objectEntries, operationResult, pongoCache, pongoCacheWrapper, pongoClient, pongoCollection, pongoDriverRegistry, pongoSchema, pongoSession, pongoTransaction, pongoTransactionCache, proxyClientWithSchema, proxyPongoDbWithSchema, toClientSchemaMetadata, toDbSchemaMetadata, transactionExecutorOrDefault };
20
+ export { $inc, $push, $set, $unset, AlternativeType, AnyPongoDb, AnyPongoDriver, AnyPongoDriverOptions, BatchHandleOptions, CacheConfig, CacheHooks, CacheOptions, CacheSettings, CacheType, CollectionOperationOptions, CollectionsMap, ConcurrencyError, Condition, DBsMap, DOCUMENT_DOES_NOT_EXIST, DOCUMENT_EXISTS, DeleteManyOptions, DeleteOneOptions, Document, DocumentCommandHandler, DocumentCommandHandlerInput, DocumentCommandHandlerOptions, DocumentHandler, EnhancedOmit, Equatable, ExpectedDocumentVersion, ExpectedDocumentVersionGeneral, ExpectedDocumentVersionValue, ExpectedVersionPredicate, ExtractPongoDatabaseTypeFromDriver, ExtractPongoDriverOptions, FindOptions, HandleOptions, HasId, InferIdType, InsertManyOptions, InsertOneOptions, LRUCacheOptions, MaybePromise, NO_CONCURRENCY_CHECK, NonObjectIdLikeDocument, NonPartial, ObjectId, ObjectIdLike, OperationResult, OperatorMap, OptionalId, OptionalUnlessRequiredId, OptionalUnlessRequiredIdAndVersion, OptionalUnlessRequiredVersion, OptionalVersion, PongoCache, PongoCacheSetEntry, PongoCacheType, PongoClient, PongoClientOptions, PongoClientSchema, PongoClientSchemaMetadata, PongoClientWithSchema, PongoCollection, PongoCollectionOptions, PongoCollectionSQLBuilder, PongoCollectionSchema, PongoCollectionSchemaComponent, PongoCollectionSchemaComponentOptions, PongoCollectionSchemaMetadata, PongoCollectionURN, PongoCollectionURNType, PongoDBCollectionOptions, PongoDatabase, PongoDatabaseCache, PongoDatabaseFactoryOptions, PongoDatabaseOptions, PongoDatabaseSQLBuilder, PongoDatabaseSchemaComponent, PongoDatabaseSchemaComponentOptions, PongoDatabaseURN, PongoDatabaseURNType, PongoDb, PongoDbOptions, PongoDbSchema, PongoDbSchemaMetadata, PongoDbTransaction, PongoDbWithSchema, PongoDeleteManyResult, PongoDeleteResult, PongoDocument, PongoDocumentCacheKey, PongoDriver, PongoDriverOptions, PongoDriverRegistry, PongoError, PongoFilter, PongoFilterOperator, PongoHandleResult, PongoInsertManyResult, PongoInsertOneResult, PongoMigrationOptions, PongoReplaceManyResult, PongoSchemaConfig, PongoSession, PongoSessionOptions, PongoTransactionCache, PongoTransactionCacheOperationOptions, PongoTransactionOptions, PongoUpdate, PongoUpdateManyResult, PongoUpdateResult, QueryOperators, RegExpOrString, ReplaceManyOptions, ReplaceOneOptions, RootFilterOperators, UpdateManyOptions, UpdateOneOptions, WithId, WithIdAndVersion, WithVersion, WithoutId, WithoutIdAndVersion, WithoutVersion, deepEquals, expectedVersion, expectedVersionPredicate, expectedVersionValue, getIdsFromIdOnlyFilter, hasOperators, idFromFilter, identityMapCache, isEquatable, isGeneralExpectedDocumentVersion, isNumber, isOperator, isString, loadPongoClient, lruCache, mapAsync, mapParallel, mapSequential, noopCacheProvider, objectEntries, operationResult, pongoCache, pongoCacheWrapper, pongoClient, pongoCollection, pongoDriverRegistry, pongoSchema, pongoSession, pongoTransaction, pongoTransactionCache, proxyClientWithSchema, proxyPongoDbWithSchema, toClientSchemaMetadata, toDbSchemaMetadata, transactionExecutorOrDefault };
21
21
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as objectEntries, B as getIdsFromIdOnlyFilter, C as expectedVersionValue, D as PongoError, E as ConcurrencyError, F as isOperator, G as lruCache, H as pongoTransactionCache, I as PongoCollectionSchemaComponent, K as identityMapCache, L as pongoCollection, M as OperatorMap, N as QueryOperators, O as isNumber, P as hasOperators, R as transactionExecutorOrDefault, S as expectedVersion, T as operationResult, U as pongoCache, V as idFromFilter, W as noopCacheProvider, _ as toDbSchemaMetadata, a as isEquatable, b as NO_CONCURRENCY_CHECK, c as pongoTransaction, d as PongoDatabase, f as PongoDatabaseSchemaComponent, g as toClientSchemaMetadata, h as proxyPongoDbWithSchema, i as deepEquals, j as PongoDatabaseCache, k as isString, l as PongoDriverRegistry, m as proxyClientWithSchema, n as mapParallel, o as pongoClient, p as pongoSchema, q as pongoCacheWrapper, r as mapSequential, s as pongoSession, t as mapAsync, u as pongoDriverRegistry$1, v as DOCUMENT_DOES_NOT_EXIST, w as isGeneralExpectedDocumentVersion, x as ObjectId, y as DOCUMENT_EXISTS, z as DocumentCommandHandler } from "./core-Dtn-d-91.js";
1
+ import { A as isString, B as DocumentCommandHandler, C as expectedVersionPredicate, D as ConcurrencyError, E as operationResult, F as hasOperators, G as noopCacheProvider, H as idFromFilter, I as isOperator, J as pongoCacheWrapper, K as lruCache, L as PongoCollectionSchemaComponent, M as PongoDatabaseCache, N as OperatorMap, O as PongoError, P as QueryOperators, R as pongoCollection, S as expectedVersion, T as isGeneralExpectedDocumentVersion, U as pongoTransactionCache, V as getIdsFromIdOnlyFilter, W as pongoCache, _ as toDbSchemaMetadata, a as isEquatable, b as NO_CONCURRENCY_CHECK, c as pongoTransaction, d as PongoDatabase, f as PongoDatabaseSchemaComponent, g as toClientSchemaMetadata, h as proxyPongoDbWithSchema, i as deepEquals, j as objectEntries, k as isNumber, l as PongoDriverRegistry, m as proxyClientWithSchema, n as mapParallel, o as pongoClient, p as pongoSchema, q as identityMapCache, r as mapSequential, s as pongoSession, t as mapAsync, u as pongoDriverRegistry$1, v as DOCUMENT_DOES_NOT_EXIST, w as expectedVersionValue, x as ObjectId, y as DOCUMENT_EXISTS, z as transactionExecutorOrDefault } from "./core-BHdOCUrr.js";
2
2
 
3
3
  //#region src/index.ts
4
4
  pongoDriverRegistry.register(`PostgreSQL:pg`, () => loadPongoClient("pg"));
@@ -15,5 +15,5 @@ const loadPongoClient = async (path) => {
15
15
  };
16
16
 
17
17
  //#endregion
18
- export { ConcurrencyError, DOCUMENT_DOES_NOT_EXIST, DOCUMENT_EXISTS, DocumentCommandHandler, NO_CONCURRENCY_CHECK, ObjectId, OperatorMap, PongoCollectionSchemaComponent, PongoDatabase, PongoDatabaseCache, PongoDatabaseSchemaComponent, PongoDriverRegistry, PongoError, QueryOperators, deepEquals, expectedVersion, expectedVersionValue, getIdsFromIdOnlyFilter, hasOperators, idFromFilter, identityMapCache, isEquatable, isGeneralExpectedDocumentVersion, isNumber, isOperator, isString, loadPongoClient, lruCache, mapAsync, mapParallel, mapSequential, noopCacheProvider, objectEntries, operationResult, pongoCache, pongoCacheWrapper, pongoClient, pongoCollection, pongoDriverRegistry$1 as pongoDriverRegistry, pongoSchema, pongoSession, pongoTransaction, pongoTransactionCache, proxyClientWithSchema, proxyPongoDbWithSchema, toClientSchemaMetadata, toDbSchemaMetadata, transactionExecutorOrDefault };
18
+ export { ConcurrencyError, DOCUMENT_DOES_NOT_EXIST, DOCUMENT_EXISTS, DocumentCommandHandler, NO_CONCURRENCY_CHECK, ObjectId, OperatorMap, PongoCollectionSchemaComponent, PongoDatabase, PongoDatabaseCache, PongoDatabaseSchemaComponent, PongoDriverRegistry, PongoError, QueryOperators, deepEquals, expectedVersion, expectedVersionPredicate, expectedVersionValue, getIdsFromIdOnlyFilter, hasOperators, idFromFilter, identityMapCache, isEquatable, isGeneralExpectedDocumentVersion, isNumber, isOperator, isString, loadPongoClient, lruCache, mapAsync, mapParallel, mapSequential, noopCacheProvider, objectEntries, operationResult, pongoCache, pongoCacheWrapper, pongoClient, pongoCollection, pongoDriverRegistry$1 as pongoDriverRegistry, pongoSchema, pongoSession, pongoTransaction, pongoTransactionCache, proxyClientWithSchema, proxyPongoDbWithSchema, toClientSchemaMetadata, toDbSchemaMetadata, transactionExecutorOrDefault };
19
19
  //# sourceMappingURL=index.js.map
package/dist/pg.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_core = require('./core-BdTIuXiI.cjs');
2
+ const require_core = require('./core-C9SB3XMx.cjs');
3
3
  const require_cli = require('./cli.cjs');
4
4
  let _event_driven_io_dumbo = require("@event-driven-io/dumbo");
5
5
  let _event_driven_io_dumbo_pg = require("@event-driven-io/dumbo/pg");
@@ -47,11 +47,51 @@ const buildNestedObject = (path, value) => path.split(".").reverse().reduce((acc
47
47
  //#endregion
48
48
  //#region src/storage/postgresql/core/sqlBuilder/filter/index.ts
49
49
  const AND = "AND";
50
- const constructFilterQuery = (filter, serializer) => _event_driven_io_dumbo.SQL.merge(Object.entries(filter).map(([key, value]) => isRecord(value) ? constructComplexFilterQuery(key, value, serializer) : handleOperator(key, "$eq", value, serializer)), ` ${AND} `);
50
+ const OR = "OR";
51
+ const unsupportedRootOperators = [
52
+ "$text",
53
+ "$where",
54
+ "$comment"
55
+ ];
56
+ const constructFilterQuery = (filter, serializer) => {
57
+ ensureSupportedRootOperators(filter);
58
+ const parts = [];
59
+ const fieldFilterQuery = constructFieldFilterQuery(filter, serializer);
60
+ if (!_event_driven_io_dumbo.SQL.check.isEmpty(fieldFilterQuery)) parts.push(fieldFilterQuery);
61
+ const orFilterQuery = constructLogicalFilterQuery(filter.$or, OR, serializer);
62
+ if (!_event_driven_io_dumbo.SQL.check.isEmpty(orFilterQuery)) parts.push(orFilterQuery);
63
+ const andFilterQuery = constructLogicalFilterQuery(filter.$and, AND, serializer);
64
+ if (!_event_driven_io_dumbo.SQL.check.isEmpty(andFilterQuery)) parts.push(andFilterQuery);
65
+ const norFilterQuery = constructNorFilterQuery(filter.$nor, serializer);
66
+ if (!_event_driven_io_dumbo.SQL.check.isEmpty(norFilterQuery)) parts.push(norFilterQuery);
67
+ return _event_driven_io_dumbo.SQL.merge(parts, ` ${AND} `);
68
+ };
69
+ const constructFieldFilterQuery = (filter, serializer) => _event_driven_io_dumbo.SQL.merge(require_core.objectEntries(filter).flatMap(([key, value]) => isLogicalRootOperator(key) ? [] : [isRecord(value) ? constructComplexFilterQuery(key, value, serializer) : handleOperator(key, require_core.QueryOperators.$eq, value, serializer)]), ` ${AND} `);
70
+ const constructLogicalFilterQuery = (filters, joinOperator, serializer) => {
71
+ if (!filters?.length) return _event_driven_io_dumbo.SQL.EMPTY;
72
+ const subFilterQueries = filters.reduce((queries, filter) => {
73
+ const query = constructFilterQuery(filter, serializer);
74
+ if (!_event_driven_io_dumbo.SQL.check.isEmpty(query)) queries.push(query);
75
+ return queries;
76
+ }, []);
77
+ if (subFilterQueries.length === 0) return _event_driven_io_dumbo.SQL.EMPTY;
78
+ if (subFilterQueries.length === 1) return wrapFilterQuery(subFilterQueries[0]);
79
+ return _event_driven_io_dumbo.SQL`(${_event_driven_io_dumbo.SQL.merge(subFilterQueries.map(wrapFilterQuery), ` ${joinOperator} `)})`;
80
+ };
81
+ const constructNorFilterQuery = (filters, serializer) => {
82
+ if (!filters?.length) return _event_driven_io_dumbo.SQL.EMPTY;
83
+ const logicalFilterQuery = constructLogicalFilterQuery(filters, OR, serializer);
84
+ return _event_driven_io_dumbo.SQL.check.isEmpty(logicalFilterQuery) ? _event_driven_io_dumbo.SQL.EMPTY : _event_driven_io_dumbo.SQL`NOT ${logicalFilterQuery}`;
85
+ };
51
86
  const constructComplexFilterQuery = (key, value, serializer) => {
52
87
  const isEquality = !require_core.hasOperators(value);
53
88
  return _event_driven_io_dumbo.SQL.merge(require_core.objectEntries(value).map(([nestedKey, val]) => isEquality ? handleOperator(`${key}.${nestedKey}`, require_core.QueryOperators.$eq, val, serializer) : handleOperator(key, nestedKey, val, serializer)), ` ${AND} `);
54
89
  };
90
+ const wrapFilterQuery = (filterQuery) => _event_driven_io_dumbo.SQL`(${filterQuery})`;
91
+ const ensureSupportedRootOperators = (filter) => {
92
+ for (const operator of unsupportedRootOperators) if (operator in filter) throw new Error(`Unsupported root operator: ${operator}`);
93
+ };
94
+ const isLogicalRootOperator = (key) => key === "$and" || key === "$nor" || key === "$or";
55
95
  const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
56
96
 
57
97
  //#endregion
@@ -81,6 +121,11 @@ const buildPushQuery = (push, currentUpdateQuery, serializer) => {
81
121
 
82
122
  //#endregion
83
123
  //#region src/storage/postgresql/core/sqlBuilder/index.ts
124
+ const versionCheckClause = (collectionName, expectedVersion) => {
125
+ const col = _event_driven_io_dumbo.SQL.identifier(collectionName);
126
+ const predicate = require_core.expectedVersionPredicate(expectedVersion);
127
+ return predicate.operator === "none" ? _event_driven_io_dumbo.SQL.EMPTY : _event_driven_io_dumbo.SQL`AND ${col}._version = ${predicate.value}`;
128
+ };
84
129
  const createCollection = (collectionName) => _event_driven_io_dumbo.SQL`
85
130
  CREATE TABLE IF NOT EXISTS ${_event_driven_io_dumbo.SQL.identifier(collectionName)} (
86
131
  _id TEXT PRIMARY KEY,
@@ -109,10 +154,21 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
109
154
  INSERT INTO ${_event_driven_io_dumbo.SQL.identifier(collectionName)} (_id, data, _version) VALUES ${values}
110
155
  ON CONFLICT(_id) DO NOTHING
111
156
  RETURNING _id;`;
157
+ },
158
+ insertOrReplace: (documents) => {
159
+ const col = _event_driven_io_dumbo.SQL.identifier(collectionName);
160
+ return _event_driven_io_dumbo.SQL`
161
+ INSERT INTO ${col} (_id, data, _version)
162
+ VALUES ${_event_driven_io_dumbo.SQL.merge(documents.map((d) => _event_driven_io_dumbo.SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb || jsonb_build_object('_id', ${d._id}::text) || jsonb_build_object('_version', '1'::text), 1::bigint)`), ",")}
163
+ ON CONFLICT(_id) DO UPDATE SET
164
+ data = EXCLUDED.data
165
+ || jsonb_build_object('_id', ${col}._id)
166
+ || jsonb_build_object('_version', (${col}._version + 1)::text),
167
+ _version = ${col}._version + 1
168
+ RETURNING _id, _version AS version;`;
112
169
  },
113
170
  updateOne: (filter, update, options) => {
114
- const expectedVersion = require_core.expectedVersionValue(options?.expectedVersion);
115
- const expectedVersionUpdate = expectedVersion != null ? _event_driven_io_dumbo.SQL`AND ${_event_driven_io_dumbo.SQL.identifier(collectionName)}._version = ${expectedVersion}` : _event_driven_io_dumbo.SQL``;
171
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
116
172
  const filterQuery = (0, _event_driven_io_dumbo.isSQL)(filter) ? filter : constructFilterQuery(filter, serializer);
117
173
  const updateQuery = (0, _event_driven_io_dumbo.isSQL)(update) ? update : buildUpdateQuery(update, serializer);
118
174
  return _event_driven_io_dumbo.SQL`
@@ -140,8 +196,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
140
196
  ON existing._id = updated._id;`;
141
197
  },
142
198
  replaceOne: (filter, document, options) => {
143
- const expectedVersion = require_core.expectedVersionValue(options?.expectedVersion);
144
- const expectedVersionUpdate = expectedVersion != null ? _event_driven_io_dumbo.SQL`AND ${_event_driven_io_dumbo.SQL.identifier(collectionName)}._version = ${expectedVersion}` : _event_driven_io_dumbo.SQL``;
199
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
145
200
  const filterQuery = (0, _event_driven_io_dumbo.isSQL)(filter) ? filter : constructFilterQuery(filter, serializer);
146
201
  return _event_driven_io_dumbo.SQL`
147
202
  WITH existing AS (
@@ -178,8 +233,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
178
233
  ${where(filterQuery)};`;
179
234
  },
180
235
  deleteOne: (filter, options) => {
181
- const expectedVersion = require_core.expectedVersionValue(options?.expectedVersion);
182
- const expectedVersionUpdate = expectedVersion != null ? _event_driven_io_dumbo.SQL`AND ${_event_driven_io_dumbo.SQL.identifier(collectionName)}._version = ${expectedVersion}` : _event_driven_io_dumbo.SQL``;
236
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
183
237
  const filterQuery = (0, _event_driven_io_dumbo.isSQL)(filter) ? filter : constructFilterQuery(filter, serializer);
184
238
  return _event_driven_io_dumbo.SQL`
185
239
  WITH existing AS (
@@ -208,7 +262,10 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
208
262
  replaceMany: (documents) => {
209
263
  if (documents.some((d) => "_version" in d && d._version !== void 0)) return _event_driven_io_dumbo.SQL`
210
264
  WITH replacements(_id, data, expected_version) AS (
211
- VALUES ${_event_driven_io_dumbo.SQL.merge(documents.map((d) => _event_driven_io_dumbo.SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${d._version ?? 0n}::bigint)`), ",")}
265
+ VALUES ${_event_driven_io_dumbo.SQL.merge(documents.map((d) => {
266
+ const expectedVersion = d._version;
267
+ return expectedVersion !== void 0 ? _event_driven_io_dumbo.SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${expectedVersion}::bigint)` : _event_driven_io_dumbo.SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, NULL::bigint)`;
268
+ }), ",")}
212
269
  )
213
270
  UPDATE ${_event_driven_io_dumbo.SQL.identifier(collectionName)} t
214
271
  SET
@@ -217,7 +274,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
217
274
  || jsonb_build_object('_version', (t._version + 1)::text),
218
275
  _version = t._version + 1
219
276
  FROM replacements r
220
- WHERE t._id = r._id AND t._version = r.expected_version
277
+ WHERE t._id = r._id AND (r.expected_version IS NULL OR t._version = r.expected_version)
221
278
  RETURNING t._id, t._version AS version;`;
222
279
  return _event_driven_io_dumbo.SQL`
223
280
  WITH replacements(_id, data) AS (
package/dist/pg.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pg.cjs","names":["SQL","OperatorMap","objectEntries","SQL","hasOperators","objectEntries","QueryOperators","objectEntries","SQL","SQL","expectedVersionValue","PgDriverType","postgreSQLMetadata","PongoDatabase","dumboDriver","PongoDatabaseSchemaComponent","PongoCollectionSchemaComponent","JSONSerializer","pongoSchema"],"sources":["../src/storage/postgresql/core/sqlBuilder/filter/queryOperators.ts","../src/storage/postgresql/core/sqlBuilder/filter/index.ts","../src/storage/postgresql/core/sqlBuilder/update/index.ts","../src/storage/postgresql/core/sqlBuilder/index.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport { objectEntries, OperatorMap } from '../../../../../core';\n\nexport const handleOperator = (\n path: string,\n operator: string,\n value: unknown,\n serializer: JSONSerializer,\n): SQL => {\n if (path === '_id' || path === '_version') {\n return handleMetadataOperator(path, operator, value);\n }\n\n switch (operator) {\n case '$eq': {\n const nestedPath = serializer.serialize(buildNestedObject(path, value));\n const serializedValue = serializer.serialize(value);\n\n return SQL`(data @> ${nestedPath}::jsonb OR jsonb_path_exists(data, '$.${SQL.plain(path)}[*] ? (@ == ${SQL.plain(serializedValue)})'))`;\n }\n case '$gt':\n case '$gte':\n case '$lt':\n case '$lte':\n case '$ne': {\n const jsonPath = SQL.plain(path.split('.').join(','));\n\n return SQL`data ->> '${jsonPath}' ${SQL.plain(OperatorMap[operator])} ${value}`;\n }\n case '$in': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`data #>> ${jsonPath} = ANY (${value})`;\n }\n case '$nin': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`data #>> ${jsonPath} != ALL (${value})`;\n }\n case '$elemMatch': {\n const subQuery = objectEntries(value as Record<string, unknown>)\n .map(\n ([subKey, subValue]) =>\n `@.\"${subKey}\" == ${serializer.serialize(subValue)}`,\n )\n .join(' && ');\n return SQL`jsonb_path_exists(data, '$.${SQL.plain(path)}[*] ? (${SQL.plain(subQuery)})')`;\n }\n case '$all': {\n const nestedPath = serializer.serialize(buildNestedObject(path, value));\n return SQL`data @> ${nestedPath}::jsonb`;\n }\n case '$size': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`jsonb_array_length(data #> ${jsonPath}) = ${value}`;\n }\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n};\n\nconst handleMetadataOperator = (\n fieldName: string,\n operator: string,\n value: unknown,\n): SQL => {\n switch (operator) {\n case '$eq':\n return SQL`${SQL.plain(fieldName)} = ${value}`;\n case '$gt':\n case '$gte':\n case '$lt':\n case '$lte':\n case '$ne':\n return SQL`${SQL.plain(fieldName)} ${SQL.plain(OperatorMap[operator])} ${value}`;\n case '$in':\n return SQL`${SQL.plain(fieldName)} = ANY (${value})`;\n case '$nin':\n return SQL`${SQL.plain(fieldName)} != ALL (${value})`;\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n};\n\nconst buildNestedObject = (\n path: string,\n value: unknown,\n): Record<string, unknown> =>\n path\n .split('.')\n .reverse()\n .reduce((acc, key) => ({ [key]: acc }), value as Record<string, unknown>);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport {\n hasOperators,\n objectEntries,\n QueryOperators,\n type PongoFilter,\n} from '../../../../../core';\nimport { handleOperator } from './queryOperators';\n\nexport * from './queryOperators';\n\nconst AND = 'AND';\n\nexport const constructFilterQuery = <T>(\n filter: PongoFilter<T>,\n serializer: JSONSerializer,\n): SQL =>\n SQL.merge(\n Object.entries(filter).map(([key, value]) =>\n isRecord(value)\n ? constructComplexFilterQuery(key, value, serializer)\n : handleOperator(key, '$eq', value, serializer),\n ),\n ` ${AND} `,\n );\n\nconst constructComplexFilterQuery = (\n key: string,\n value: Record<string, unknown>,\n serializer: JSONSerializer,\n): SQL => {\n const isEquality = !hasOperators(value);\n\n return SQL.merge(\n objectEntries(value).map(([nestedKey, val]) =>\n isEquality\n ? handleOperator(\n `${key}.${nestedKey}`,\n QueryOperators.$eq,\n val,\n serializer,\n )\n : handleOperator(key, nestedKey, val, serializer),\n ),\n ` ${AND} `,\n );\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport {\n objectEntries,\n type $inc,\n type $push,\n type $set,\n type $unset,\n type PongoUpdate,\n} from '../../../../../core';\n\nexport const buildUpdateQuery = <T>(\n update: PongoUpdate<T>,\n serializer: JSONSerializer,\n): SQL =>\n objectEntries(update).reduce(\n (currentUpdateQuery, [op, value]) => {\n switch (op) {\n case '$set':\n return buildSetQuery(value, currentUpdateQuery, serializer);\n case '$unset':\n return buildUnsetQuery(value, currentUpdateQuery);\n case '$inc':\n return buildIncQuery(value, currentUpdateQuery);\n case '$push':\n return buildPushQuery(value, currentUpdateQuery, serializer);\n default:\n return currentUpdateQuery;\n }\n },\n SQL`data`,\n );\n\nexport const buildSetQuery = <T>(\n set: $set<T>,\n currentUpdateQuery: SQL,\n serializer: JSONSerializer,\n): SQL => SQL`${currentUpdateQuery} || ${serializer.serialize(set)}::jsonb`;\n\nexport const buildUnsetQuery = <T>(\n unset: $unset<T>,\n currentUpdateQuery: SQL,\n): SQL =>\n SQL`${currentUpdateQuery} - ${Object.keys(unset)\n .map((k) => `{${k}}`)\n .join(', ')}`;\n\nexport const buildIncQuery = <T>(\n inc: $inc<T>,\n currentUpdateQuery: SQL,\n): SQL => {\n for (const [key, value] of Object.entries(inc)) {\n currentUpdateQuery =\n typeof value === 'bigint'\n ? SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', to_jsonb((COALESCE((data->>'${SQL.plain(key)}')::BIGINT, 0) + ${value})::TEXT), true)`\n : SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', to_jsonb(COALESCE((data->>'${SQL.plain(key)}')::NUMERIC, 0) + ${value}), true)`;\n }\n return currentUpdateQuery;\n};\n\nexport const buildPushQuery = <T>(\n push: $push<T>,\n currentUpdateQuery: SQL,\n serializer: JSONSerializer,\n): SQL => {\n for (const [key, value] of Object.entries(push)) {\n const serializedValue = serializer.serialize([value]);\n currentUpdateQuery = SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', (coalesce(data->'${SQL.plain(key)}', '[]'::jsonb) || ${serializedValue}::jsonb), true)`;\n }\n return currentUpdateQuery;\n};\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { isSQL, SQL, sqlMigration } from '@event-driven-io/dumbo';\nimport {\n expectedVersionValue,\n type DeleteOneOptions,\n type FindOptions,\n type OptionalUnlessRequiredIdAndVersion,\n type PongoCollectionSQLBuilder,\n type PongoFilter,\n type PongoUpdate,\n type ReplaceOneOptions,\n type UpdateOneOptions,\n type WithId,\n type WithIdAndVersion,\n type WithoutId,\n} from '../../../../core';\nimport { constructFilterQuery } from './filter';\nimport { buildUpdateQuery } from './update';\n\nconst createCollection = (collectionName: string): SQL =>\n SQL`\n CREATE TABLE IF NOT EXISTS ${SQL.identifier(collectionName)} (\n _id TEXT PRIMARY KEY, \n data JSONB NOT NULL, \n metadata JSONB NOT NULL DEFAULT '{}',\n _version BIGINT NOT NULL DEFAULT 1,\n _partition TEXT NOT NULL DEFAULT 'png_global',\n _archived BOOLEAN NOT NULL DEFAULT FALSE,\n _created TIMESTAMPTZ NOT NULL DEFAULT now(),\n _updated TIMESTAMPTZ NOT NULL DEFAULT now()\n )`;\n\nexport const pongoCollectionPostgreSQLMigrations = (collectionName: string) => [\n sqlMigration(`pongoCollection:${collectionName}:001:createtable`, [\n createCollection(collectionName),\n ]),\n];\n\nexport const postgresSQLBuilder = (\n collectionName: string,\n serializer: JSONSerializer,\n): PongoCollectionSQLBuilder => ({\n createCollection: (): SQL => createCollection(collectionName),\n insertOne: <T>(document: OptionalUnlessRequiredIdAndVersion<T>): SQL => {\n const serialized = serializer.serialize(document);\n const id = document._id;\n const version = document._version ?? 1n;\n\n return SQL`\n INSERT INTO ${SQL.identifier(collectionName)} (_id, data, _version) \n VALUES (${id}, ${serialized}, ${version}) ON CONFLICT(_id) DO NOTHING;`;\n },\n insertMany: <T>(documents: OptionalUnlessRequiredIdAndVersion<T>[]): SQL => {\n const values = SQL.merge(\n documents.map(\n (doc) =>\n SQL`(${doc._id}, ${serializer.serialize(doc)}, ${doc._version ?? 1n})`,\n ),\n ',',\n );\n\n return SQL`\n INSERT INTO ${SQL.identifier(collectionName)} (_id, data, _version) VALUES ${values}\n ON CONFLICT(_id) DO NOTHING\n RETURNING _id;`;\n },\n updateOne: <T>(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): SQL => {\n const expectedVersion = expectedVersionValue(options?.expectedVersion);\n const expectedVersionUpdate =\n expectedVersion != null\n ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}`\n : SQL``;\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const updateQuery = isSQL(update)\n ? update\n : buildUpdateQuery(update, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id, _version as current_version\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n updated AS (\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${updateQuery} || jsonb_build_object('_id', ${SQL.identifier(collectionName)}._id) || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n FROM existing \n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id, ${SQL.identifier(collectionName)}._version\n )\n SELECT \n existing._id,\n COALESCE(updated._version, existing.current_version) AS version,\n COUNT(existing._id) over() AS matched,\n COUNT(updated._id) over() AS modified\n FROM existing\n LEFT JOIN updated \n ON existing._id = updated._id;`;\n },\n replaceOne: <T>(\n filter: PongoFilter<T> | SQL,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): SQL => {\n const expectedVersion = expectedVersionValue(options?.expectedVersion);\n const expectedVersionUpdate =\n expectedVersion != null\n ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}`\n : SQL``;\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id, _version as current_version\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n updated AS (\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${serializer.serialize(document)} || jsonb_build_object('_id', ${SQL.identifier(collectionName)}._id) || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n FROM existing \n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id, ${SQL.identifier(collectionName)}._version\n )\n SELECT \n existing._id,\n COALESCE(updated._version, existing.current_version) AS version,\n COUNT(existing._id) over() AS matched,\n COUNT(updated._id) over() AS modified\n FROM existing\n LEFT JOIN updated \n ON existing._id = updated._id;`;\n },\n updateMany: <T>(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n ): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const updateQuery = isSQL(update)\n ? update\n : buildUpdateQuery(update, serializer);\n\n return SQL`\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${updateQuery} || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n ${where(filterQuery)};`;\n },\n deleteOne: <T>(\n filter: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): SQL => {\n const expectedVersion = expectedVersionValue(options?.expectedVersion);\n const expectedVersionUpdate =\n expectedVersion != null\n ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}`\n : SQL``;\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)}\n USING existing\n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id\n )\n SELECT \n existing._id,\n COUNT(existing._id) over() AS matched,\n COUNT(deleted._id) over() AS deleted\n FROM existing\n LEFT JOIN deleted \n ON existing._id = deleted._id;`;\n },\n deleteMany: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`DELETE FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}`;\n },\n replaceMany: <T>(documents: Array<WithIdAndVersion<T> | WithId<T>>): SQL => {\n const hasVersions = documents.some(\n (d) => '_version' in d && d._version !== undefined,\n );\n\n if (hasVersions) {\n const values = SQL.merge(\n documents.map(\n (d) =>\n SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${(d as WithIdAndVersion<T>)._version ?? 0n}::bigint)`,\n ),\n ',',\n );\n return SQL`\n WITH replacements(_id, data, expected_version) AS (\n VALUES ${values}\n )\n UPDATE ${SQL.identifier(collectionName)} t\n SET\n data = r.data\n || jsonb_build_object('_id', t._id)\n || jsonb_build_object('_version', (t._version + 1)::text),\n _version = t._version + 1\n FROM replacements r\n WHERE t._id = r._id AND t._version = r.expected_version\n RETURNING t._id, t._version AS version;`;\n }\n\n const values = SQL.merge(\n documents.map(\n (d) => SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb)`,\n ),\n ',',\n );\n return SQL`\n WITH replacements(_id, data) AS (\n VALUES ${values}\n )\n UPDATE ${SQL.identifier(collectionName)} t\n SET\n data = r.data\n || jsonb_build_object('_id', t._id)\n || jsonb_build_object('_version', (t._version + 1)::text),\n _version = t._version + 1\n FROM replacements r\n WHERE t._id = r._id\n RETURNING t._id, t._version AS version;`;\n },\n deleteManyByIds: (ids: Array<{ _id: string; _version?: bigint }>): SQL => {\n const hasVersions = ids.some((d) => d._version !== undefined);\n\n if (hasVersions) {\n const values = SQL.merge(\n ids.map((d) => SQL`(${d._id}::text, ${d._version ?? 0n}::bigint)`),\n ',',\n );\n\n return SQL`\n WITH targets(_id, expected_version) AS (\n VALUES ${values}\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)} t\n USING targets r\n WHERE t._id = r._id AND t._version = r.expected_version\n RETURNING t._id\n )\n SELECT r._id,\n CASE WHEN d._id IS NOT NULL THEN 1 ELSE 0 END as deleted\n FROM targets r\n LEFT JOIN deleted d ON r._id = d._id;`;\n }\n\n const values = SQL.merge(\n ids.map((d) => SQL`(${d._id}::text)`),\n ',',\n );\n\n return SQL`\n WITH targets(_id) AS (\n VALUES ${values}\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)} t\n USING targets r\n WHERE t._id = r._id\n RETURNING t._id\n )\n SELECT r._id,\n CASE WHEN d._id IS NOT NULL THEN 1 ELSE 0 END as deleted\n FROM targets r\n LEFT JOIN deleted d ON r._id = d._id;`;\n },\n findOne: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`SELECT data, _id, _version FROM ${SQL.identifier(collectionName)} ${where(filterQuery)} LIMIT 1;`;\n },\n find: <T>(filter: PongoFilter<T> | SQL, options?: FindOptions): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const query: SQL[] = [];\n\n query.push(\n SQL`SELECT data, _id, _version FROM ${SQL.identifier(collectionName)}`,\n );\n\n query.push(where(filterQuery));\n\n if (options?.sort && Object.keys(options.sort).length > 0) {\n const clauses = Object.entries(options.sort).map(([field, dir]) => {\n const isMetadata = field === '_id' || field === '_version';\n const isNested = !isMetadata && field.includes('.');\n // _id and _version are native columns, not JSON fields.\n // Use -> / #> (returns jsonb) rather than ->> / #>> (returns text) so\n // that numeric fields are sorted numerically, not lexicographically.\n const accessor = isMetadata\n ? SQL`${SQL.plain(field)}`\n : isNested\n ? SQL`data #> '${SQL.plain(`{${field.split('.').join(',')}}`)}'`\n : SQL`data -> '${SQL.plain(field)}'`;\n // Match MongoDB's null ordering: missing/null values sort first on ASC,\n // last on DESC. PostgreSQL's default is the opposite for ASC (NULLS LAST).\n return dir === 1\n ? SQL`${accessor} ASC NULLS FIRST`\n : SQL`${accessor} DESC NULLS LAST`;\n });\n query.push(SQL`ORDER BY ${SQL.merge(clauses, ',')}`);\n }\n\n if (options?.limit) {\n query.push(SQL`LIMIT ${options.limit}`);\n }\n\n if (options?.skip) {\n query.push(SQL`OFFSET ${options.skip}`);\n }\n\n return SQL.merge([...query, SQL`;`]);\n },\n countDocuments: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = SQL.check.isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n return SQL`SELECT COUNT(1) as count FROM ${SQL.identifier(collectionName)} ${where(filterQuery)};`;\n },\n rename: (newName: string): SQL =>\n SQL`ALTER TABLE ${SQL.identifier(collectionName)} RENAME TO ${SQL.identifier(newName)};`,\n drop: (targetName: string = collectionName): SQL =>\n SQL`DROP TABLE IF EXISTS ${SQL.identifier(targetName)}`,\n});\n\nconst where = (filterQuery: SQL): SQL =>\n SQL.check.isEmpty(filterQuery)\n ? SQL.EMPTY\n : SQL.merge([SQL`WHERE `, filterQuery]);\n","import { dumbo, JSONSerializer } from '@event-driven-io/dumbo';\nimport {\n pgDumboDriver as dumboDriver,\n PgDriverType,\n postgreSQLMetadata,\n type PgConnection,\n} from '@event-driven-io/dumbo/pg';\nimport type pg from 'pg';\nimport {\n PongoCollectionSchemaComponent,\n PongoDatabase,\n PongoDatabaseSchemaComponent,\n pongoDriverRegistry,\n pongoSchema,\n type PongoDb,\n type PongoDriver,\n type PongoDriverOptions,\n} from '../../../core';\nimport {\n pongoCollectionPostgreSQLMigrations,\n postgresSQLBuilder,\n} from '../core';\n\nexport type PgPongoClientOptions =\n PooledPongoClientOptions | NotPooledPongoOptions;\n\nexport type PooledPongoClientOptions =\n | {\n pool: pg.Pool;\n }\n | {\n pooled: true;\n }\n | {\n pool: pg.Pool;\n pooled: true;\n }\n | object;\n\nexport type NotPooledPongoOptions =\n | {\n client: pg.Client;\n }\n | {\n pooled: false;\n }\n | {\n client: pg.Client;\n pooled: false;\n }\n | {\n connection: PgConnection;\n pooled?: false;\n };\n\ntype PgDatabaseDriverOptions = PongoDriverOptions<PgPongoClientOptions> & {\n databaseName?: string | undefined;\n connectionString: string;\n};\n\nconst pgPongoDriver: PongoDriver<\n PongoDb<PgDriverType>,\n PgDatabaseDriverOptions\n> = {\n driverType: PgDriverType,\n databaseFactory: (options) => {\n const databaseName =\n options.databaseName ??\n postgreSQLMetadata.parseDatabaseName(options.connectionString) ??\n postgreSQLMetadata.defaultDatabaseName;\n\n return PongoDatabase({\n ...options,\n pool: dumbo({\n connectionString: options.connectionString,\n driver: dumboDriver,\n ...options.connectionOptions,\n serialization: { serializer: options.serializer },\n }),\n schemaComponent: PongoDatabaseSchemaComponent({\n driverType: PgDriverType,\n collectionFactory: (schema) =>\n PongoCollectionSchemaComponent({\n driverType: PgDriverType,\n definition: schema,\n migrationsOrSchemaComponents: {\n migrations: pongoCollectionPostgreSQLMigrations(schema.name),\n },\n sqlBuilder: postgresSQLBuilder(\n schema.name,\n options.serialization?.serializer ?? JSONSerializer,\n ),\n }),\n definition:\n options.schema?.definition ?? pongoSchema.db(databaseName, {}),\n }),\n databaseName,\n });\n },\n};\n\nexport const usePgPongoDriver = () => {\n pongoDriverRegistry.register(PgDriverType, pgPongoDriver);\n};\n\nusePgPongoDriver();\n\nexport { pgPongoDriver as pgDriver, pgPongoDriver as pongoDriver };\n"],"mappings":"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"}
1
+ {"version":3,"file":"pg.cjs","names":["SQL","OperatorMap","objectEntries","SQL","objectEntries","QueryOperators","hasOperators","objectEntries","SQL","SQL","expectedVersionPredicate","PgDriverType","postgreSQLMetadata","PongoDatabase","dumboDriver","PongoDatabaseSchemaComponent","PongoCollectionSchemaComponent","JSONSerializer","pongoSchema"],"sources":["../src/storage/postgresql/core/sqlBuilder/filter/queryOperators.ts","../src/storage/postgresql/core/sqlBuilder/filter/index.ts","../src/storage/postgresql/core/sqlBuilder/update/index.ts","../src/storage/postgresql/core/sqlBuilder/index.ts","../src/storage/postgresql/pg/index.ts"],"sourcesContent":["import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport { objectEntries, OperatorMap } from '../../../../../core';\n\nexport const handleOperator = (\n path: string,\n operator: string,\n value: unknown,\n serializer: JSONSerializer,\n): SQL => {\n if (path === '_id' || path === '_version') {\n return handleMetadataOperator(path, operator, value);\n }\n\n switch (operator) {\n case '$eq': {\n const nestedPath = serializer.serialize(buildNestedObject(path, value));\n const serializedValue = serializer.serialize(value);\n\n return SQL`(data @> ${nestedPath}::jsonb OR jsonb_path_exists(data, '$.${SQL.plain(path)}[*] ? (@ == ${SQL.plain(serializedValue)})'))`;\n }\n case '$gt':\n case '$gte':\n case '$lt':\n case '$lte':\n case '$ne': {\n const jsonPath = SQL.plain(path.split('.').join(','));\n\n return SQL`data ->> '${jsonPath}' ${SQL.plain(OperatorMap[operator])} ${value}`;\n }\n case '$in': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`data #>> ${jsonPath} = ANY (${value})`;\n }\n case '$nin': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`data #>> ${jsonPath} != ALL (${value})`;\n }\n case '$elemMatch': {\n const subQuery = objectEntries(value as Record<string, unknown>)\n .map(\n ([subKey, subValue]) =>\n `@.\"${subKey}\" == ${serializer.serialize(subValue)}`,\n )\n .join(' && ');\n return SQL`jsonb_path_exists(data, '$.${SQL.plain(path)}[*] ? (${SQL.plain(subQuery)})')`;\n }\n case '$all': {\n const nestedPath = serializer.serialize(buildNestedObject(path, value));\n return SQL`data @> ${nestedPath}::jsonb`;\n }\n case '$size': {\n const jsonPath = `{${path.split('.').join(',')}}`;\n\n return SQL`jsonb_array_length(data #> ${jsonPath}) = ${value}`;\n }\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n};\n\nconst handleMetadataOperator = (\n fieldName: string,\n operator: string,\n value: unknown,\n): SQL => {\n switch (operator) {\n case '$eq':\n return SQL`${SQL.plain(fieldName)} = ${value}`;\n case '$gt':\n case '$gte':\n case '$lt':\n case '$lte':\n case '$ne':\n return SQL`${SQL.plain(fieldName)} ${SQL.plain(OperatorMap[operator])} ${value}`;\n case '$in':\n return SQL`${SQL.plain(fieldName)} = ANY (${value})`;\n case '$nin':\n return SQL`${SQL.plain(fieldName)} != ALL (${value})`;\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n};\n\nconst buildNestedObject = (\n path: string,\n value: unknown,\n): Record<string, unknown> =>\n path\n .split('.')\n .reverse()\n .reduce((acc, key) => ({ [key]: acc }), value as Record<string, unknown>);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport {\n hasOperators,\n objectEntries,\n QueryOperators,\n type PongoFilter,\n} from '../../../../../core';\nimport { handleOperator } from './queryOperators';\n\nexport * from './queryOperators';\n\nconst AND = 'AND';\nconst OR = 'OR';\n\nconst unsupportedRootOperators = ['$text', '$where', '$comment'] as const;\n\nexport const constructFilterQuery = <T>(\n filter: PongoFilter<T>,\n serializer: JSONSerializer,\n): SQL => {\n ensureSupportedRootOperators(filter);\n const parts: SQL[] = [];\n\n const fieldFilterQuery = constructFieldFilterQuery(filter, serializer);\n if (!SQL.check.isEmpty(fieldFilterQuery)) {\n parts.push(fieldFilterQuery);\n }\n\n const orFilterQuery = constructLogicalFilterQuery(filter.$or, OR, serializer);\n if (!SQL.check.isEmpty(orFilterQuery)) {\n parts.push(orFilterQuery);\n }\n\n const andFilterQuery = constructLogicalFilterQuery(\n filter.$and,\n AND,\n serializer,\n );\n if (!SQL.check.isEmpty(andFilterQuery)) {\n parts.push(andFilterQuery);\n }\n\n const norFilterQuery = constructNorFilterQuery(filter.$nor, serializer);\n if (!SQL.check.isEmpty(norFilterQuery)) {\n parts.push(norFilterQuery);\n }\n\n return SQL.merge(parts, ` ${AND} `);\n};\n\nconst constructFieldFilterQuery = <T>(\n filter: PongoFilter<T>,\n serializer: JSONSerializer,\n): SQL =>\n SQL.merge(\n objectEntries(filter).flatMap(([key, value]) =>\n isLogicalRootOperator(key)\n ? []\n : [\n isRecord(value)\n ? constructComplexFilterQuery(key, value, serializer)\n : handleOperator(key, QueryOperators.$eq, value, serializer),\n ],\n ),\n ` ${AND} `,\n );\n\nconst constructLogicalFilterQuery = <T>(\n filters: PongoFilter<T>[] | undefined,\n joinOperator: typeof AND | typeof OR,\n serializer: JSONSerializer,\n): SQL => {\n if (!filters?.length) {\n return SQL.EMPTY;\n }\n\n const subFilterQueries = filters.reduce<SQL[]>((queries, filter) => {\n const query = constructFilterQuery(filter, serializer);\n if (!SQL.check.isEmpty(query)) {\n queries.push(query);\n }\n\n return queries;\n }, []);\n\n if (subFilterQueries.length === 0) {\n return SQL.EMPTY;\n }\n\n if (subFilterQueries.length === 1) {\n return wrapFilterQuery(subFilterQueries[0]!);\n }\n\n return SQL`(${SQL.merge(subFilterQueries.map(wrapFilterQuery), ` ${joinOperator} `)})`;\n};\n\nconst constructNorFilterQuery = <T>(\n filters: PongoFilter<T>[] | undefined,\n serializer: JSONSerializer,\n): SQL => {\n if (!filters?.length) {\n return SQL.EMPTY;\n }\n\n const logicalFilterQuery = constructLogicalFilterQuery(\n filters,\n OR,\n serializer,\n );\n return SQL.check.isEmpty(logicalFilterQuery)\n ? SQL.EMPTY\n : SQL`NOT ${logicalFilterQuery}`;\n};\n\nconst constructComplexFilterQuery = (\n key: string,\n value: Record<string, unknown>,\n serializer: JSONSerializer,\n): SQL => {\n const isEquality = !hasOperators(value);\n\n return SQL.merge(\n objectEntries(value).map(([nestedKey, val]) =>\n isEquality\n ? handleOperator(\n `${key}.${nestedKey}`,\n QueryOperators.$eq,\n val,\n serializer,\n )\n : handleOperator(key, nestedKey, val, serializer),\n ),\n ` ${AND} `,\n );\n};\n\nconst wrapFilterQuery = (filterQuery: SQL): SQL => SQL`(${filterQuery})`;\n\nconst ensureSupportedRootOperators = (filter: object): void => {\n for (const operator of unsupportedRootOperators) {\n if (operator in filter) {\n throw new Error(`Unsupported root operator: ${operator}`);\n }\n }\n};\n\nconst isLogicalRootOperator = (key: string): key is '$and' | '$nor' | '$or' =>\n key === '$and' || key === '$nor' || key === '$or';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { SQL } from '@event-driven-io/dumbo';\nimport {\n objectEntries,\n type $inc,\n type $push,\n type $set,\n type $unset,\n type PongoUpdate,\n} from '../../../../../core';\n\nexport const buildUpdateQuery = <T>(\n update: PongoUpdate<T>,\n serializer: JSONSerializer,\n): SQL =>\n objectEntries(update).reduce(\n (currentUpdateQuery, [op, value]) => {\n switch (op) {\n case '$set':\n return buildSetQuery(value, currentUpdateQuery, serializer);\n case '$unset':\n return buildUnsetQuery(value, currentUpdateQuery);\n case '$inc':\n return buildIncQuery(value, currentUpdateQuery);\n case '$push':\n return buildPushQuery(value, currentUpdateQuery, serializer);\n default:\n return currentUpdateQuery;\n }\n },\n SQL`data`,\n );\n\nexport const buildSetQuery = <T>(\n set: $set<T>,\n currentUpdateQuery: SQL,\n serializer: JSONSerializer,\n): SQL => SQL`${currentUpdateQuery} || ${serializer.serialize(set)}::jsonb`;\n\nexport const buildUnsetQuery = <T>(\n unset: $unset<T>,\n currentUpdateQuery: SQL,\n): SQL =>\n SQL`${currentUpdateQuery} - ${Object.keys(unset)\n .map((k) => `{${k}}`)\n .join(', ')}`;\n\nexport const buildIncQuery = <T>(\n inc: $inc<T>,\n currentUpdateQuery: SQL,\n): SQL => {\n for (const [key, value] of Object.entries(inc)) {\n currentUpdateQuery =\n typeof value === 'bigint'\n ? SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', to_jsonb((COALESCE((data->>'${SQL.plain(key)}')::BIGINT, 0) + ${value})::TEXT), true)`\n : SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', to_jsonb(COALESCE((data->>'${SQL.plain(key)}')::NUMERIC, 0) + ${value}), true)`;\n }\n return currentUpdateQuery;\n};\n\nexport const buildPushQuery = <T>(\n push: $push<T>,\n currentUpdateQuery: SQL,\n serializer: JSONSerializer,\n): SQL => {\n for (const [key, value] of Object.entries(push)) {\n const serializedValue = serializer.serialize([value]);\n currentUpdateQuery = SQL`jsonb_set(${currentUpdateQuery}, '{${SQL.plain(key)}}', (coalesce(data->'${SQL.plain(key)}', '[]'::jsonb) || ${serializedValue}::jsonb), true)`;\n }\n return currentUpdateQuery;\n};\n","import type { JSONSerializer } from '@event-driven-io/dumbo';\nimport { isSQL, SQL, sqlMigration } from '@event-driven-io/dumbo';\nimport {\n expectedVersionPredicate,\n type DeleteOneOptions,\n type ExpectedDocumentVersion,\n type FindOptions,\n type OptionalUnlessRequiredIdAndVersion,\n type PongoCollectionSQLBuilder,\n type PongoFilter,\n type PongoUpdate,\n type ReplaceOneOptions,\n type UpdateOneOptions,\n type WithId,\n type WithIdAndVersion,\n type WithoutId,\n} from '../../../../core';\nimport { constructFilterQuery } from './filter';\nimport { buildUpdateQuery } from './update';\n\nconst versionCheckClause = (\n collectionName: string,\n expectedVersion: ExpectedDocumentVersion | undefined,\n): SQL => {\n const col = SQL.identifier(collectionName);\n const predicate = expectedVersionPredicate(expectedVersion);\n return predicate.operator === 'none'\n ? SQL.EMPTY\n : SQL`AND ${col}._version = ${predicate.value}`;\n};\n\nconst createCollection = (collectionName: string): SQL =>\n SQL`\n CREATE TABLE IF NOT EXISTS ${SQL.identifier(collectionName)} (\n _id TEXT PRIMARY KEY, \n data JSONB NOT NULL, \n metadata JSONB NOT NULL DEFAULT '{}',\n _version BIGINT NOT NULL DEFAULT 1,\n _partition TEXT NOT NULL DEFAULT 'png_global',\n _archived BOOLEAN NOT NULL DEFAULT FALSE,\n _created TIMESTAMPTZ NOT NULL DEFAULT now(),\n _updated TIMESTAMPTZ NOT NULL DEFAULT now()\n )`;\n\nexport const pongoCollectionPostgreSQLMigrations = (collectionName: string) => [\n sqlMigration(`pongoCollection:${collectionName}:001:createtable`, [\n createCollection(collectionName),\n ]),\n];\n\nexport const postgresSQLBuilder = (\n collectionName: string,\n serializer: JSONSerializer,\n): PongoCollectionSQLBuilder => ({\n createCollection: (): SQL => createCollection(collectionName),\n insertOne: <T>(document: OptionalUnlessRequiredIdAndVersion<T>): SQL => {\n const serialized = serializer.serialize(document);\n const id = document._id;\n const version = document._version ?? 1n;\n\n return SQL`\n INSERT INTO ${SQL.identifier(collectionName)} (_id, data, _version) \n VALUES (${id}, ${serialized}, ${version}) ON CONFLICT(_id) DO NOTHING;`;\n },\n insertMany: <T>(documents: OptionalUnlessRequiredIdAndVersion<T>[]): SQL => {\n const values = SQL.merge(\n documents.map(\n (doc) =>\n SQL`(${doc._id}, ${serializer.serialize(doc)}, ${doc._version ?? 1n})`,\n ),\n ',',\n );\n\n return SQL`\n INSERT INTO ${SQL.identifier(collectionName)} (_id, data, _version) VALUES ${values}\n ON CONFLICT(_id) DO NOTHING\n RETURNING _id;`;\n },\n insertOrReplace: <T>(documents: Array<WithId<T>>): SQL => {\n const col = SQL.identifier(collectionName);\n const values = SQL.merge(\n documents.map(\n (d) =>\n SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb || jsonb_build_object('_id', ${d._id}::text) || jsonb_build_object('_version', '1'::text), 1::bigint)`,\n ),\n ',',\n );\n\n return SQL`\n INSERT INTO ${col} (_id, data, _version)\n VALUES ${values}\n ON CONFLICT(_id) DO UPDATE SET\n data = EXCLUDED.data\n || jsonb_build_object('_id', ${col}._id)\n || jsonb_build_object('_version', (${col}._version + 1)::text),\n _version = ${col}._version + 1\n RETURNING _id, _version AS version;`;\n },\n updateOne: <T>(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n options?: UpdateOneOptions,\n ): SQL => {\n const expectedVersionUpdate = versionCheckClause(\n collectionName,\n options?.expectedVersion,\n );\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const updateQuery = isSQL(update)\n ? update\n : buildUpdateQuery(update, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id, _version as current_version\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n updated AS (\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${updateQuery} || jsonb_build_object('_id', ${SQL.identifier(collectionName)}._id) || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n FROM existing \n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id, ${SQL.identifier(collectionName)}._version\n )\n SELECT \n existing._id,\n COALESCE(updated._version, existing.current_version) AS version,\n COUNT(existing._id) over() AS matched,\n COUNT(updated._id) over() AS modified\n FROM existing\n LEFT JOIN updated \n ON existing._id = updated._id;`;\n },\n replaceOne: <T>(\n filter: PongoFilter<T> | SQL,\n document: WithoutId<T>,\n options?: ReplaceOneOptions,\n ): SQL => {\n const expectedVersionUpdate = versionCheckClause(\n collectionName,\n options?.expectedVersion,\n );\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id, _version as current_version\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n updated AS (\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${serializer.serialize(document)} || jsonb_build_object('_id', ${SQL.identifier(collectionName)}._id) || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n FROM existing \n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id, ${SQL.identifier(collectionName)}._version\n )\n SELECT \n existing._id,\n COALESCE(updated._version, existing.current_version) AS version,\n COUNT(existing._id) over() AS matched,\n COUNT(updated._id) over() AS modified\n FROM existing\n LEFT JOIN updated \n ON existing._id = updated._id;`;\n },\n updateMany: <T>(\n filter: PongoFilter<T> | SQL,\n update: PongoUpdate<T> | SQL,\n ): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const updateQuery = isSQL(update)\n ? update\n : buildUpdateQuery(update, serializer);\n\n return SQL`\n UPDATE ${SQL.identifier(collectionName)} \n SET \n data = ${updateQuery} || jsonb_build_object('_version', (_version + 1)::text),\n _version = _version + 1\n ${where(filterQuery)};`;\n },\n deleteOne: <T>(\n filter: PongoFilter<T> | SQL,\n options?: DeleteOneOptions,\n ): SQL => {\n const expectedVersionUpdate = versionCheckClause(\n collectionName,\n options?.expectedVersion,\n );\n\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`\n WITH existing AS (\n SELECT _id\n FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}\n LIMIT 1\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)}\n USING existing\n WHERE ${SQL.identifier(collectionName)}._id = existing._id ${expectedVersionUpdate}\n RETURNING ${SQL.identifier(collectionName)}._id\n )\n SELECT \n existing._id,\n COUNT(existing._id) over() AS matched,\n COUNT(deleted._id) over() AS deleted\n FROM existing\n LEFT JOIN deleted \n ON existing._id = deleted._id;`;\n },\n deleteMany: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`DELETE FROM ${SQL.identifier(collectionName)} ${where(filterQuery)}`;\n },\n replaceMany: <T>(\n documents: Array<WithIdAndVersion<T>> | Array<WithId<T>>,\n ): SQL => {\n const hasVersions = documents.some(\n (d) => '_version' in d && d._version !== undefined,\n );\n\n if (hasVersions) {\n const values = SQL.merge(\n documents.map((d) => {\n const expectedVersion = (d as WithIdAndVersion<T>)._version;\n return expectedVersion !== undefined\n ? SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${expectedVersion}::bigint)`\n : SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, NULL::bigint)`;\n }),\n ',',\n );\n return SQL`\n WITH replacements(_id, data, expected_version) AS (\n VALUES ${values}\n )\n UPDATE ${SQL.identifier(collectionName)} t\n SET\n data = r.data\n || jsonb_build_object('_id', t._id)\n || jsonb_build_object('_version', (t._version + 1)::text),\n _version = t._version + 1\n FROM replacements r\n WHERE t._id = r._id AND (r.expected_version IS NULL OR t._version = r.expected_version)\n RETURNING t._id, t._version AS version;`;\n }\n\n const values = SQL.merge(\n documents.map(\n (d) => SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb)`,\n ),\n ',',\n );\n return SQL`\n WITH replacements(_id, data) AS (\n VALUES ${values}\n )\n UPDATE ${SQL.identifier(collectionName)} t\n SET\n data = r.data\n || jsonb_build_object('_id', t._id)\n || jsonb_build_object('_version', (t._version + 1)::text),\n _version = t._version + 1\n FROM replacements r\n WHERE t._id = r._id\n RETURNING t._id, t._version AS version;`;\n },\n deleteManyByIds: (ids: Array<{ _id: string; _version?: bigint }>): SQL => {\n const hasVersions = ids.some((d) => d._version !== undefined);\n\n if (hasVersions) {\n const values = SQL.merge(\n ids.map((d) => SQL`(${d._id}::text, ${d._version ?? 0n}::bigint)`),\n ',',\n );\n\n return SQL`\n WITH targets(_id, expected_version) AS (\n VALUES ${values}\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)} t\n USING targets r\n WHERE t._id = r._id AND t._version = r.expected_version\n RETURNING t._id\n )\n SELECT r._id,\n CASE WHEN d._id IS NOT NULL THEN 1 ELSE 0 END as deleted\n FROM targets r\n LEFT JOIN deleted d ON r._id = d._id;`;\n }\n\n const values = SQL.merge(\n ids.map((d) => SQL`(${d._id}::text)`),\n ',',\n );\n\n return SQL`\n WITH targets(_id) AS (\n VALUES ${values}\n ),\n deleted AS (\n DELETE FROM ${SQL.identifier(collectionName)} t\n USING targets r\n WHERE t._id = r._id\n RETURNING t._id\n )\n SELECT r._id,\n CASE WHEN d._id IS NOT NULL THEN 1 ELSE 0 END as deleted\n FROM targets r\n LEFT JOIN deleted d ON r._id = d._id;`;\n },\n findOne: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n\n return SQL`SELECT data, _id, _version FROM ${SQL.identifier(collectionName)} ${where(filterQuery)} LIMIT 1;`;\n },\n find: <T>(filter: PongoFilter<T> | SQL, options?: FindOptions): SQL => {\n const filterQuery = isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n const query: SQL[] = [];\n\n query.push(\n SQL`SELECT data, _id, _version FROM ${SQL.identifier(collectionName)}`,\n );\n\n query.push(where(filterQuery));\n\n if (options?.sort && Object.keys(options.sort).length > 0) {\n const clauses = Object.entries(options.sort).map(([field, dir]) => {\n const isMetadata = field === '_id' || field === '_version';\n const isNested = !isMetadata && field.includes('.');\n // _id and _version are native columns, not JSON fields.\n // Use -> / #> (returns jsonb) rather than ->> / #>> (returns text) so\n // that numeric fields are sorted numerically, not lexicographically.\n const accessor = isMetadata\n ? SQL`${SQL.plain(field)}`\n : isNested\n ? SQL`data #> '${SQL.plain(`{${field.split('.').join(',')}}`)}'`\n : SQL`data -> '${SQL.plain(field)}'`;\n // Match MongoDB's null ordering: missing/null values sort first on ASC,\n // last on DESC. PostgreSQL's default is the opposite for ASC (NULLS LAST).\n return dir === 1\n ? SQL`${accessor} ASC NULLS FIRST`\n : SQL`${accessor} DESC NULLS LAST`;\n });\n query.push(SQL`ORDER BY ${SQL.merge(clauses, ',')}`);\n }\n\n if (options?.limit) {\n query.push(SQL`LIMIT ${options.limit}`);\n }\n\n if (options?.skip) {\n query.push(SQL`OFFSET ${options.skip}`);\n }\n\n return SQL.merge([...query, SQL`;`]);\n },\n countDocuments: <T>(filter: PongoFilter<T> | SQL): SQL => {\n const filterQuery = SQL.check.isSQL(filter)\n ? filter\n : constructFilterQuery(filter, serializer);\n return SQL`SELECT COUNT(1) as count FROM ${SQL.identifier(collectionName)} ${where(filterQuery)};`;\n },\n rename: (newName: string): SQL =>\n SQL`ALTER TABLE ${SQL.identifier(collectionName)} RENAME TO ${SQL.identifier(newName)};`,\n drop: (targetName: string = collectionName): SQL =>\n SQL`DROP TABLE IF EXISTS ${SQL.identifier(targetName)}`,\n});\n\nconst where = (filterQuery: SQL): SQL =>\n SQL.check.isEmpty(filterQuery)\n ? SQL.EMPTY\n : SQL.merge([SQL`WHERE `, filterQuery]);\n","import { dumbo, JSONSerializer } from '@event-driven-io/dumbo';\nimport {\n pgDumboDriver as dumboDriver,\n PgDriverType,\n postgreSQLMetadata,\n type PgConnection,\n} from '@event-driven-io/dumbo/pg';\nimport type pg from 'pg';\nimport {\n PongoCollectionSchemaComponent,\n PongoDatabase,\n PongoDatabaseSchemaComponent,\n pongoDriverRegistry,\n pongoSchema,\n type PongoDb,\n type PongoDriver,\n type PongoDriverOptions,\n} from '../../../core';\nimport {\n pongoCollectionPostgreSQLMigrations,\n postgresSQLBuilder,\n} from '../core';\n\nexport type PgPongoClientOptions =\n PooledPongoClientOptions | NotPooledPongoOptions;\n\nexport type PooledPongoClientOptions =\n | {\n pool: pg.Pool;\n }\n | {\n pooled: true;\n }\n | {\n pool: pg.Pool;\n pooled: true;\n }\n | object;\n\nexport type NotPooledPongoOptions =\n | {\n client: pg.Client;\n }\n | {\n pooled: false;\n }\n | {\n client: pg.Client;\n pooled: false;\n }\n | {\n connection: PgConnection;\n pooled?: false;\n };\n\ntype PgDatabaseDriverOptions = PongoDriverOptions<PgPongoClientOptions> & {\n databaseName?: string | undefined;\n connectionString: string;\n};\n\nconst pgPongoDriver: PongoDriver<\n PongoDb<PgDriverType>,\n PgDatabaseDriverOptions\n> = {\n driverType: PgDriverType,\n databaseFactory: (options) => {\n const databaseName =\n options.databaseName ??\n postgreSQLMetadata.parseDatabaseName(options.connectionString) ??\n postgreSQLMetadata.defaultDatabaseName;\n\n return PongoDatabase({\n ...options,\n pool: dumbo({\n connectionString: options.connectionString,\n driver: dumboDriver,\n ...options.connectionOptions,\n serialization: { serializer: options.serializer },\n }),\n schemaComponent: PongoDatabaseSchemaComponent({\n driverType: PgDriverType,\n collectionFactory: (schema) =>\n PongoCollectionSchemaComponent({\n driverType: PgDriverType,\n definition: schema,\n migrationsOrSchemaComponents: {\n migrations: pongoCollectionPostgreSQLMigrations(schema.name),\n },\n sqlBuilder: postgresSQLBuilder(\n schema.name,\n options.serialization?.serializer ?? JSONSerializer,\n ),\n }),\n definition:\n options.schema?.definition ?? pongoSchema.db(databaseName, {}),\n }),\n databaseName,\n });\n },\n};\n\nexport const usePgPongoDriver = () => {\n pongoDriverRegistry.register(PgDriverType, pgPongoDriver);\n};\n\nusePgPongoDriver();\n\nexport { pgPongoDriver as pgDriver, pgPongoDriver as pongoDriver };\n"],"mappings":"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"}
package/dist/pg.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Pn as PongoCollectionSQLBuilder, gt as PongoDb, nn as PongoDriverOptions, tn as PongoDriver } from "./index-BfOn92K5.cjs";
1
+ import { In as PongoCollectionSQLBuilder, _t as PongoDb, in as PongoDriverOptions, rn as PongoDriver } from "./index-C3pnS1S_.cjs";
2
2
  import * as _$_event_driven_io_dumbo0 from "@event-driven-io/dumbo";
3
3
  import { JSONSerializer } from "@event-driven-io/dumbo";
4
4
  import { PgConnection, PgDriverType } from "@event-driven-io/dumbo/pg";
package/dist/pg.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Pn as PongoCollectionSQLBuilder, gt as PongoDb, nn as PongoDriverOptions, tn as PongoDriver } from "./index-CL0zRxRl.js";
1
+ import { In as PongoCollectionSQLBuilder, _t as PongoDb, in as PongoDriverOptions, rn as PongoDriver } from "./index-r7V4paf_.js";
2
2
  import * as _$_event_driven_io_dumbo0 from "@event-driven-io/dumbo";
3
3
  import { JSONSerializer } from "@event-driven-io/dumbo";
4
4
  import { PgConnection, PgDriverType } from "@event-driven-io/dumbo/pg";
package/dist/pg.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as objectEntries, C as expectedVersionValue, I as PongoCollectionSchemaComponent, M as OperatorMap, N as QueryOperators, P as hasOperators, d as PongoDatabase, f as PongoDatabaseSchemaComponent, p as pongoSchema, u as pongoDriverRegistry } from "./core-Dtn-d-91.js";
1
+ import { C as expectedVersionPredicate, F as hasOperators, L as PongoCollectionSchemaComponent, N as OperatorMap, P as QueryOperators, d as PongoDatabase, f as PongoDatabaseSchemaComponent, j as objectEntries, p as pongoSchema, u as pongoDriverRegistry } from "./core-BHdOCUrr.js";
2
2
  import { JSONSerializer, SQL, dumbo, isSQL, sqlMigration } from "@event-driven-io/dumbo";
3
3
  import { PgDriverType, pgDumboDriver, postgreSQLMetadata } from "@event-driven-io/dumbo/pg";
4
4
 
@@ -45,11 +45,51 @@ const buildNestedObject = (path, value) => path.split(".").reverse().reduce((acc
45
45
  //#endregion
46
46
  //#region src/storage/postgresql/core/sqlBuilder/filter/index.ts
47
47
  const AND = "AND";
48
- const constructFilterQuery = (filter, serializer) => SQL.merge(Object.entries(filter).map(([key, value]) => isRecord(value) ? constructComplexFilterQuery(key, value, serializer) : handleOperator(key, "$eq", value, serializer)), ` ${AND} `);
48
+ const OR = "OR";
49
+ const unsupportedRootOperators = [
50
+ "$text",
51
+ "$where",
52
+ "$comment"
53
+ ];
54
+ const constructFilterQuery = (filter, serializer) => {
55
+ ensureSupportedRootOperators(filter);
56
+ const parts = [];
57
+ const fieldFilterQuery = constructFieldFilterQuery(filter, serializer);
58
+ if (!SQL.check.isEmpty(fieldFilterQuery)) parts.push(fieldFilterQuery);
59
+ const orFilterQuery = constructLogicalFilterQuery(filter.$or, OR, serializer);
60
+ if (!SQL.check.isEmpty(orFilterQuery)) parts.push(orFilterQuery);
61
+ const andFilterQuery = constructLogicalFilterQuery(filter.$and, AND, serializer);
62
+ if (!SQL.check.isEmpty(andFilterQuery)) parts.push(andFilterQuery);
63
+ const norFilterQuery = constructNorFilterQuery(filter.$nor, serializer);
64
+ if (!SQL.check.isEmpty(norFilterQuery)) parts.push(norFilterQuery);
65
+ return SQL.merge(parts, ` ${AND} `);
66
+ };
67
+ const constructFieldFilterQuery = (filter, serializer) => SQL.merge(objectEntries(filter).flatMap(([key, value]) => isLogicalRootOperator(key) ? [] : [isRecord(value) ? constructComplexFilterQuery(key, value, serializer) : handleOperator(key, QueryOperators.$eq, value, serializer)]), ` ${AND} `);
68
+ const constructLogicalFilterQuery = (filters, joinOperator, serializer) => {
69
+ if (!filters?.length) return SQL.EMPTY;
70
+ const subFilterQueries = filters.reduce((queries, filter) => {
71
+ const query = constructFilterQuery(filter, serializer);
72
+ if (!SQL.check.isEmpty(query)) queries.push(query);
73
+ return queries;
74
+ }, []);
75
+ if (subFilterQueries.length === 0) return SQL.EMPTY;
76
+ if (subFilterQueries.length === 1) return wrapFilterQuery(subFilterQueries[0]);
77
+ return SQL`(${SQL.merge(subFilterQueries.map(wrapFilterQuery), ` ${joinOperator} `)})`;
78
+ };
79
+ const constructNorFilterQuery = (filters, serializer) => {
80
+ if (!filters?.length) return SQL.EMPTY;
81
+ const logicalFilterQuery = constructLogicalFilterQuery(filters, OR, serializer);
82
+ return SQL.check.isEmpty(logicalFilterQuery) ? SQL.EMPTY : SQL`NOT ${logicalFilterQuery}`;
83
+ };
49
84
  const constructComplexFilterQuery = (key, value, serializer) => {
50
85
  const isEquality = !hasOperators(value);
51
86
  return SQL.merge(objectEntries(value).map(([nestedKey, val]) => isEquality ? handleOperator(`${key}.${nestedKey}`, QueryOperators.$eq, val, serializer) : handleOperator(key, nestedKey, val, serializer)), ` ${AND} `);
52
87
  };
88
+ const wrapFilterQuery = (filterQuery) => SQL`(${filterQuery})`;
89
+ const ensureSupportedRootOperators = (filter) => {
90
+ for (const operator of unsupportedRootOperators) if (operator in filter) throw new Error(`Unsupported root operator: ${operator}`);
91
+ };
92
+ const isLogicalRootOperator = (key) => key === "$and" || key === "$nor" || key === "$or";
53
93
  const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
54
94
 
55
95
  //#endregion
@@ -79,6 +119,11 @@ const buildPushQuery = (push, currentUpdateQuery, serializer) => {
79
119
 
80
120
  //#endregion
81
121
  //#region src/storage/postgresql/core/sqlBuilder/index.ts
122
+ const versionCheckClause = (collectionName, expectedVersion) => {
123
+ const col = SQL.identifier(collectionName);
124
+ const predicate = expectedVersionPredicate(expectedVersion);
125
+ return predicate.operator === "none" ? SQL.EMPTY : SQL`AND ${col}._version = ${predicate.value}`;
126
+ };
82
127
  const createCollection = (collectionName) => SQL`
83
128
  CREATE TABLE IF NOT EXISTS ${SQL.identifier(collectionName)} (
84
129
  _id TEXT PRIMARY KEY,
@@ -107,10 +152,21 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
107
152
  INSERT INTO ${SQL.identifier(collectionName)} (_id, data, _version) VALUES ${values}
108
153
  ON CONFLICT(_id) DO NOTHING
109
154
  RETURNING _id;`;
155
+ },
156
+ insertOrReplace: (documents) => {
157
+ const col = SQL.identifier(collectionName);
158
+ return SQL`
159
+ INSERT INTO ${col} (_id, data, _version)
160
+ VALUES ${SQL.merge(documents.map((d) => SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb || jsonb_build_object('_id', ${d._id}::text) || jsonb_build_object('_version', '1'::text), 1::bigint)`), ",")}
161
+ ON CONFLICT(_id) DO UPDATE SET
162
+ data = EXCLUDED.data
163
+ || jsonb_build_object('_id', ${col}._id)
164
+ || jsonb_build_object('_version', (${col}._version + 1)::text),
165
+ _version = ${col}._version + 1
166
+ RETURNING _id, _version AS version;`;
110
167
  },
111
168
  updateOne: (filter, update, options) => {
112
- const expectedVersion = expectedVersionValue(options?.expectedVersion);
113
- const expectedVersionUpdate = expectedVersion != null ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}` : SQL``;
169
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
114
170
  const filterQuery = isSQL(filter) ? filter : constructFilterQuery(filter, serializer);
115
171
  const updateQuery = isSQL(update) ? update : buildUpdateQuery(update, serializer);
116
172
  return SQL`
@@ -138,8 +194,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
138
194
  ON existing._id = updated._id;`;
139
195
  },
140
196
  replaceOne: (filter, document, options) => {
141
- const expectedVersion = expectedVersionValue(options?.expectedVersion);
142
- const expectedVersionUpdate = expectedVersion != null ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}` : SQL``;
197
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
143
198
  const filterQuery = isSQL(filter) ? filter : constructFilterQuery(filter, serializer);
144
199
  return SQL`
145
200
  WITH existing AS (
@@ -176,8 +231,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
176
231
  ${where(filterQuery)};`;
177
232
  },
178
233
  deleteOne: (filter, options) => {
179
- const expectedVersion = expectedVersionValue(options?.expectedVersion);
180
- const expectedVersionUpdate = expectedVersion != null ? SQL`AND ${SQL.identifier(collectionName)}._version = ${expectedVersion}` : SQL``;
234
+ const expectedVersionUpdate = versionCheckClause(collectionName, options?.expectedVersion);
181
235
  const filterQuery = isSQL(filter) ? filter : constructFilterQuery(filter, serializer);
182
236
  return SQL`
183
237
  WITH existing AS (
@@ -206,7 +260,10 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
206
260
  replaceMany: (documents) => {
207
261
  if (documents.some((d) => "_version" in d && d._version !== void 0)) return SQL`
208
262
  WITH replacements(_id, data, expected_version) AS (
209
- VALUES ${SQL.merge(documents.map((d) => SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${d._version ?? 0n}::bigint)`), ",")}
263
+ VALUES ${SQL.merge(documents.map((d) => {
264
+ const expectedVersion = d._version;
265
+ return expectedVersion !== void 0 ? SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, ${expectedVersion}::bigint)` : SQL`(${d._id}::text, ${serializer.serialize(d)}::jsonb, NULL::bigint)`;
266
+ }), ",")}
210
267
  )
211
268
  UPDATE ${SQL.identifier(collectionName)} t
212
269
  SET
@@ -215,7 +272,7 @@ const postgresSQLBuilder = (collectionName, serializer) => ({
215
272
  || jsonb_build_object('_version', (t._version + 1)::text),
216
273
  _version = t._version + 1
217
274
  FROM replacements r
218
- WHERE t._id = r._id AND t._version = r.expected_version
275
+ WHERE t._id = r._id AND (r.expected_version IS NULL OR t._version = r.expected_version)
219
276
  RETURNING t._id, t._version AS version;`;
220
277
  return SQL`
221
278
  WITH replacements(_id, data) AS (