@procedures/mongo 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +74 -3
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/module.d.ts.map +1 -1
  8. package/dist/module.js +9 -0
  9. package/dist/module.js.map +1 -1
  10. package/dist/procedures/documents.aggregate.d.ts +5 -0
  11. package/dist/procedures/documents.aggregate.d.ts.map +1 -1
  12. package/dist/procedures/documents.aggregate.js +36 -3
  13. package/dist/procedures/documents.aggregate.js.map +1 -1
  14. package/dist/procedures/documents.bulk.d.ts +42 -0
  15. package/dist/procedures/documents.bulk.d.ts.map +1 -0
  16. package/dist/procedures/documents.bulk.js +159 -0
  17. package/dist/procedures/documents.bulk.js.map +1 -0
  18. package/dist/procedures/documents.distinct.d.ts +22 -0
  19. package/dist/procedures/documents.distinct.d.ts.map +1 -0
  20. package/dist/procedures/documents.distinct.js +33 -0
  21. package/dist/procedures/documents.distinct.js.map +1 -0
  22. package/dist/procedures/documents.explain.d.ts +41 -0
  23. package/dist/procedures/documents.explain.d.ts.map +1 -0
  24. package/dist/procedures/documents.explain.js +111 -0
  25. package/dist/procedures/documents.explain.js.map +1 -0
  26. package/dist/procedures/index.d.ts +4 -0
  27. package/dist/procedures/index.d.ts.map +1 -1
  28. package/dist/procedures/index.js +5 -0
  29. package/dist/procedures/index.js.map +1 -1
  30. package/dist/procedures/watch.d.ts +59 -0
  31. package/dist/procedures/watch.d.ts.map +1 -0
  32. package/dist/procedures/watch.js +149 -0
  33. package/dist/procedures/watch.js.map +1 -0
  34. package/dist/procedures.types.d.ts +24 -3
  35. package/dist/procedures.types.d.ts.map +1 -1
  36. package/dist/storage/mongo-storage.d.ts +1 -0
  37. package/dist/storage/mongo-storage.d.ts.map +1 -1
  38. package/dist/storage/mongo-storage.js +4 -0
  39. package/dist/storage/mongo-storage.js.map +1 -1
  40. package/dist/types.d.ts +20 -2
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +4 -4
  43. package/src/index.ts +10 -0
  44. package/src/module.ts +9 -0
  45. package/src/procedures/documents.aggregate.ts +34 -3
  46. package/src/procedures/documents.bulk.ts +192 -0
  47. package/src/procedures/documents.distinct.ts +57 -0
  48. package/src/procedures/documents.explain.ts +144 -0
  49. package/src/procedures/index.ts +6 -0
  50. package/src/procedures/watch.ts +184 -0
  51. package/src/procedures.types.ts +25 -0
  52. package/src/storage/mongo-storage.ts +5 -0
  53. package/src/types.ts +22 -2
package/dist/index.d.ts CHANGED
@@ -24,8 +24,8 @@ export { connect, configure, ensureConnection, disconnect, getDb, getClient, get
24
24
  export type { MongoConnection, MongoConnectionOptions } from "./connection.js";
25
25
  export type { ScopeInput } from "./scope.js";
26
26
  export { hasCollection, requireCollection, getBaseMeta, } from "./types.js";
27
- export type { MongoProcedures, ProcedureInput, ProcedureOutput, PingInput, PingOutput, InfoInput, ListCollectionsInput, ListCollectionsOutput, CreateCollectionInput, CreateCollectionOutput, DropCollectionInput, DropCollectionOutput, StatsInput, FindInput, FindOutput, GetInput, GetOutput, InsertInput, InsertOutput, UpdateInput, UpdateOutput, DeleteInput, DeleteOutput, CountInput, CountOutput, AggregateInput, AggregateOutput, ListIndexesInput, ListIndexesOutput, CreateIndexInput, CreateIndexOutput, DropIndexInput, DropIndexOutput, } from "./procedures.types.js";
28
- export type { PaginationInput, PaginationOutput, SortOrder, SortSpec, DocumentId, BaseDocument, MongoDocument, DocumentQuery, DocumentUpdate, BaseMeta, CollectionMeta, BulkInsertOne, BulkUpdateOne, BulkDeleteOne, BulkOperation, BulkWriteResult, IndexSpec, IndexOptions, IndexInfo, CollectionOptions, CollectionStats, DatabaseInfo, AggregationStage, AggregationOptions, } from "./types.js";
27
+ export type { MongoProcedures, ProcedureInput, ProcedureOutput, PingInput, PingOutput, InfoInput, ListCollectionsInput, ListCollectionsOutput, CreateCollectionInput, CreateCollectionOutput, DropCollectionInput, DropCollectionOutput, StatsInput, FindInput, FindOutput, GetInput, GetOutput, InsertInput, InsertOutput, UpdateInput, UpdateOutput, DeleteInput, DeleteOutput, CountInput, CountOutput, AggregateInput, AggregateOutput, DistinctInput, DistinctOutput, BulkInput, BulkOutput, ExplainInput, ExplainOutput, WatchInput, WatchChange, ListIndexesInput, ListIndexesOutput, CreateIndexInput, CreateIndexOutput, DropIndexInput, DropIndexOutput, } from "./procedures.types.js";
28
+ export type { PaginationInput, PaginationOutput, SortOrder, SortSpec, DocumentId, BaseDocument, MongoDocument, DocumentQuery, DocumentUpdate, BaseMeta, CollectionMeta, BulkInsertOne, BulkUpdateOne, BulkUpdateMany, BulkDeleteOne, BulkDeleteMany, BulkOperation, BulkWriteResult, IndexSpec, IndexOptions, IndexInfo, CollectionOptions, CollectionStats, DatabaseInfo, AggregationStage, AggregationOptions, } from "./types.js";
29
29
  export { MongoStorage } from "./storage/index.js";
30
30
  export type { MongoStorageOptions } from "./storage/index.js";
31
31
  export { registerMongoProcedures, procedures } from "./module.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,OAAO,EAEL,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EAEf,SAAS,EACT,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAEV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,QAAQ,EAER,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EAEd,QAAQ,EACR,cAAc,EAEd,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EAEf,SAAS,EACT,YAAY,EACZ,SAAS,EAET,iBAAiB,EACjB,eAAe,EAEf,YAAY,EAEZ,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAM9D,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMlE,cAAc,uBAAuB,CAAC;AAMtC,YAAY,EACV,EAAE,EACF,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,OAAO,EAEL,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EAEf,SAAS,EACT,UAAU,EACV,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAEV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,QAAQ,EAER,UAAU,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EAEd,QAAQ,EACR,cAAc,EAEd,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,eAAe,EAEf,SAAS,EACT,YAAY,EACZ,SAAS,EAET,iBAAiB,EACjB,eAAe,EAEf,YAAY,EAEZ,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAM9D,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMlE,cAAc,uBAAuB,CAAC;AAMtC,YAAY,EACV,EAAE,EACF,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAKzB,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,cAAc;AACd,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AA2EpB,gFAAgF;AAChF,6CAA6C;AAC7C,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAEhF,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,OAAO,EACL,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,KAAK,EACL,SAAS,EACT,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAKzB,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,cAAc;AACd,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAqFpB,gFAAgF;AAChF,6CAA6C;AAC7C,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,gFAAgF;AAChF,sDAAsD;AACtD,gFAAgF;AAEhF,cAAc,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAgB,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAoBxJ;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,YAAY,EAqB7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,eAAoE,CAAC;eAEhF,WAAW;AAE1B;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,iBAAsC,GAAG,IAAI,CAE9F"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAgB,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAwBxJ;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,YAAY,EA0B7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,eAAoE,CAAC;eAEhF,WAAW;AAE1B;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,iBAAsC,GAAG,IAAI,CAE9F"}
package/dist/module.js CHANGED
@@ -21,6 +21,10 @@ import { updateProcedure } from "./procedures/documents.update.js";
21
21
  import { deleteProcedure } from "./procedures/documents.delete.js";
22
22
  import { countProcedure } from "./procedures/documents.count.js";
23
23
  import { aggregateProcedure } from "./procedures/documents.aggregate.js";
24
+ import { distinctProcedure } from "./procedures/documents.distinct.js";
25
+ import { bulkProcedure } from "./procedures/documents.bulk.js";
26
+ import { explainProcedure } from "./procedures/documents.explain.js";
27
+ import { watchProcedure } from "./procedures/watch.js";
24
28
  import { listIndexesProcedure } from "./procedures/indexes.list.js";
25
29
  import { createIndexProcedure } from "./procedures/indexes.create.js";
26
30
  import { dropIndexProcedure } from "./procedures/indexes.drop.js";
@@ -44,10 +48,15 @@ export const procedures = [
44
48
  deleteProcedure,
45
49
  countProcedure,
46
50
  aggregateProcedure,
51
+ distinctProcedure,
52
+ bulkProcedure,
53
+ explainProcedure,
47
54
  // Indexes
48
55
  listIndexesProcedure,
49
56
  createIndexProcedure,
50
57
  dropIndexProcedure,
58
+ // Change streams
59
+ watchProcedure,
51
60
  ];
52
61
  /**
53
62
  * The module of this package, for `createRegistry()`: its procedures as data. Importing this
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqB,YAAY,EAAwB,kBAAkB,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAExJ,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4B;IACjD,WAAW;IACX,aAAa;IACb,aAAa;IACb,cAAc;IACd,aAAa;IACb,yBAAyB;IACzB,aAAa;IACb,cAAc;IACd,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,eAAe;IACf,eAAe;IACf,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,UAAU;IACV,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB,YAAY,CAAC,mBAAmB,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAE/F,eAAe,WAAW,CAAC;AAE3B;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAQ,GAAsB,kBAAkB;IACtF,eAAe,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqB,YAAY,EAAwB,kBAAkB,EAAE,eAAe,EAA0B,MAAM,oBAAoB,CAAC;AAExJ,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAA4B;IACjD,WAAW;IACX,aAAa;IACb,aAAa;IACb,cAAc;IACd,aAAa;IACb,yBAAyB;IACzB,aAAa;IACb,cAAc;IACd,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,eAAe;IACf,eAAe;IACf,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,UAAU;IACV,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,cAAc;CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB,YAAY,CAAC,mBAAmB,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAE/F,eAAe,WAAW,CAAC;AAE3B;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAQ,GAAsB,kBAAkB;IACtF,eAAe,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -12,6 +12,11 @@ interface AggregateInput extends ScopeInput {
12
12
  interface AggregateOutput {
13
13
  results: MongoDocument[];
14
14
  }
15
+ /**
16
+ * The first stage that writes, or undefined. The search also goes into the pipelines of
17
+ * `$facet`, `$lookup` and `$unionWith`.
18
+ */
19
+ export declare function writingStage(pipeline: unknown): string | undefined;
15
20
  export declare const aggregateProcedure: Procedure<AggregateInput, AggregateOutput, {
16
21
  description: string;
17
22
  effects?: Effects;
@@ -1 +1 @@
1
- {"version":3,"file":"documents.aggregate.d.ts","sourceRoot":"","sources":["../../src/procedures/documents.aggregate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAGrB,UAAU,cAAe,SAAQ,UAAU;IACzC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC1C;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAsBD,eAAO,MAAM,kBAAkB,EAAE,SAAS,CACxC,cAAc,EACd,eAAe,EACf;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAoBlC,CAAC;AAEX,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"documents.aggregate.d.ts","sourceRoot":"","sources":["../../src/procedures/documents.aggregate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAGrB,UAAU,cAAe,SAAQ,UAAU;IACzC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC1C;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAyBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAiBlE;AAED,eAAO,MAAM,kBAAkB,EAAE,SAAS,CACxC,cAAc,EACd,eAAe,EACf;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAyBlC,CAAC;AAEX,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -22,16 +22,49 @@ const aggregateInputSchema = zodAdapter(z.object({
22
22
  const aggregateOutputSchema = zodAdapter(z.looseObject({
23
23
  results: z.array(z.record(z.string(), z.unknown())).describe("The documents that the pipeline gave"),
24
24
  }));
25
+ /** The stages that write to a collection. A read-only procedure refuses them (CAP-2). */
26
+ const WRITING_STAGES = ["$out", "$merge"];
27
+ /**
28
+ * The first stage that writes, or undefined. The search also goes into the pipelines of
29
+ * `$facet`, `$lookup` and `$unionWith`.
30
+ */
31
+ export function writingStage(pipeline) {
32
+ if (Array.isArray(pipeline)) {
33
+ for (const stage of pipeline) {
34
+ const found = writingStage(stage);
35
+ if (found)
36
+ return found;
37
+ }
38
+ return undefined;
39
+ }
40
+ if (pipeline === null || typeof pipeline !== "object")
41
+ return undefined;
42
+ for (const [key, value] of Object.entries(pipeline)) {
43
+ if (WRITING_STAGES.includes(key))
44
+ return key;
45
+ if (value !== null && typeof value === "object") {
46
+ const found = writingStage(value);
47
+ if (found)
48
+ return found;
49
+ }
50
+ }
51
+ return undefined;
52
+ }
25
53
  export const aggregateProcedure = createProcedure()
26
54
  .path(["mongo", "documents", "aggregate"])
27
55
  .input(aggregateInputSchema)
28
56
  .output(aggregateOutputSchema)
29
57
  .meta({
30
- description: "Run an aggregation pipeline",
31
- // A $out or $merge stage of the pipeline writes to a collection, and $out replaces it
32
- effects: { reads: ["mongo", "network"], writes: ["mongo", "network"] },
58
+ description: "Run an aggregation pipeline (read only: $out and $merge are refused)",
59
+ // The procedure refuses $out and $merge, so it only reads (CAP-2). Before, it declared that
60
+ // it writes, and a read-only session refused every aggregation.
61
+ effects: { reads: ["mongo", "network"], writes: [] },
33
62
  })
34
63
  .handler(async (input, ctx) => {
64
+ const stage = writingStage(input.pipeline);
65
+ if (stage) {
66
+ throw new Error(`mongo.documents.aggregate is read only: the stage ${stage} writes to a collection`);
67
+ }
35
68
  const { collection } = await collectionFor(input, ctx);
36
69
  const results = await collection
37
70
  // The schema leaves out an option that the input does not give
@@ -1 +1 @@
1
- {"version":3,"file":"documents.aggregate.js","sourceRoot":"","sources":["../../src/procedures/documents.aggregate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAuD,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAIN,MAAM,aAAa,CAAC;AAYrB,UAAU;AACV,MAAM,oBAAoB,GAAG,UAAU,CACrC,CAAC,CAAC,MAAM,CAAC;IACP,GAAG,WAAW,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,uFAAuF,CAAC;IACrI,OAAO,EAAE,CAAC;SACP,WAAW,CAAC;QACX,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QACvF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KAClF,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CAAC,gCAAgC,CAAC;CAC9C,CAAC,CACH,CAAC;AACF,MAAM,qBAAqB,GAAG,UAAU,CACtC,CAAC,CAAC,WAAW,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACrG,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAI3B,eAAe,EAAE;KAClB,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;KACzC,KAAK,CAAC,oBAAoB,CAAC;KAC3B,MAAM,CAAC,qBAAqB,CAAC;KAC7B,IAAI,CAAC;IACJ,WAAW,EAAE,6BAA6B;IAC1C,sFAAsF;IACtF,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;CACvE,CAAC;KACD,OAAO,CAAC,KAAK,EAAE,KAAqB,EAAE,GAAqB,EAAE,EAAE;IAC9D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,UAAU;QAC9B,+DAA+D;SAC9D,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAuC,CAAC;SACxE,OAAO,EAAE,CAAC;IAEb,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC,CAAC;KACD,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"documents.aggregate.js","sourceRoot":"","sources":["../../src/procedures/documents.aggregate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Procedure: mongo.documents.bulk (roadmap R44)
3
+ * Several writes in one request: insertOne, updateOne, updateMany, deleteOne and deleteMany
4
+ *
5
+ * The operations have the form of the `bulkWrite` of the driver, and run in order by default.
6
+ * In order, the first failure stops the rest. With `ordered: false`, the server runs each
7
+ * operation, and the error tells which ones failed.
8
+ *
9
+ * The rules of `update` and `delete` (deep dive DATA-4) apply to each operation: an empty filter
10
+ * of an update or a delete needs `confirm: true`, and an unknown field is an error.
11
+ */
12
+ import { type Effects, type Procedure } from "@procedures/client";
13
+ import { type ScopeInput } from "../scope.js";
14
+ import type { BulkOperation } from "../types.js";
15
+ interface BulkInput extends ScopeInput {
16
+ /** The writes, in order */
17
+ operations: BulkOperation[];
18
+ /** True (the default): the first failure stops the rest */
19
+ ordered?: boolean;
20
+ /** Set to true to use an empty filter in an update or a delete */
21
+ confirm?: boolean;
22
+ }
23
+ interface BulkOutput {
24
+ ok: boolean;
25
+ insertedCount: number;
26
+ matchedCount: number;
27
+ modifiedCount: number;
28
+ deletedCount: number;
29
+ upsertedCount: number;
30
+ /** The ids of the inserted documents, as text, by the index of their operation */
31
+ insertedIds: Record<string, string>;
32
+ /** The ids of the documents that an upsert made, as text, by the index of their operation */
33
+ upsertedIds: Record<string, string>;
34
+ }
35
+ /** This function checks the input of a bulk write. */
36
+ export declare function parseBulkInput(data: unknown): BulkInput;
37
+ export declare const bulkProcedure: Procedure<BulkInput, BulkOutput, {
38
+ description: string;
39
+ effects?: Effects;
40
+ }>;
41
+ export type { BulkInput, BulkOutput };
42
+ //# sourceMappingURL=documents.bulk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.bulk.d.ts","sourceRoot":"","sources":["../../src/procedures/documents.bulk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AAGtH,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAiC,MAAM,aAAa,CAAC;AAGhF,UAAU,SAAU,SAAQ,UAAU;IACpC,2BAA2B;IAC3B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAwDD,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAkBvD;AAgDD,eAAO,MAAM,aAAa,EAAE,SAAS,CACnC,SAAS,EACT,UAAU,EACV;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAuBlC,CAAC;AAEX,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Procedure: mongo.documents.bulk (roadmap R44)
3
+ * Several writes in one request: insertOne, updateOne, updateMany, deleteOne and deleteMany
4
+ *
5
+ * The operations have the form of the `bulkWrite` of the driver, and run in order by default.
6
+ * In order, the first failure stops the rest. With `ordered: false`, the server runs each
7
+ * operation, and the error tells which ones failed.
8
+ *
9
+ * The rules of `update` and `delete` (deep dive DATA-4) apply to each operation: an empty filter
10
+ * of an update or a delete needs `confirm: true`, and an unknown field is an error.
11
+ */
12
+ import { createProcedure, zodAdapter } from "@procedures/client";
13
+ import { z } from "zod";
14
+ import { collectionFor, copyScope, SCOPE_FIELDS } from "../scope.js";
15
+ import { described, documentObject, scopeFields } from "./input-schemas.js";
16
+ const PROCEDURE = "mongo.documents.bulk";
17
+ const INPUT_FIELDS = new Set(["operations", "ordered", "confirm", ...SCOPE_FIELDS]);
18
+ /** The fields of the body of each kind of operation, and the fields that it needs. */
19
+ const KINDS = {
20
+ insertOne: { fields: ["document"], required: ["document"] },
21
+ updateOne: { fields: ["filter", "update", "upsert"], required: ["filter", "update"] },
22
+ updateMany: { fields: ["filter", "update", "upsert"], required: ["filter", "update"] },
23
+ deleteOne: { fields: ["filter"], required: ["filter"] },
24
+ deleteMany: { fields: ["filter"], required: ["filter"] },
25
+ };
26
+ function isPlainObject(value) {
27
+ return typeof value === "object" && value !== null && !Array.isArray(value);
28
+ }
29
+ /** This function checks one operation, and gives it in the form of the driver. */
30
+ function parseOperation(raw, index, confirm) {
31
+ const at = `${PROCEDURE}: operations[${index}]`;
32
+ if (!isPlainObject(raw) || Object.keys(raw).length !== 1) {
33
+ throw new Error(`${at} must be an object with one of the keys ${Object.keys(KINDS).join(", ")}`);
34
+ }
35
+ const kind = Object.keys(raw)[0];
36
+ const spec = KINDS[kind];
37
+ if (!spec)
38
+ throw new Error(`${at}: unknown operation "${kind}". The operations are: ${Object.keys(KINDS).join(", ")}`);
39
+ const body = raw[kind];
40
+ if (!isPlainObject(body))
41
+ throw new Error(`${at}.${kind} must be an object`);
42
+ for (const key of Object.keys(body)) {
43
+ if (!spec.fields.includes(key))
44
+ throw new Error(`${at}.${kind}: unknown field "${key}". The fields are: ${spec.fields.join(", ")}`);
45
+ }
46
+ for (const key of spec.required) {
47
+ if (body[key] === undefined)
48
+ throw new Error(`${at}.${kind}: ${key} is required`);
49
+ }
50
+ if (kind === "insertOne") {
51
+ if (!isPlainObject(body["document"]))
52
+ throw new Error(`${at}.insertOne: document must be an object`);
53
+ return { insertOne: { document: body["document"] } };
54
+ }
55
+ const filter = body["filter"];
56
+ if (!isPlainObject(filter))
57
+ throw new Error(`${at}.${kind}: filter must be an object`);
58
+ if (Object.keys(filter).length === 0 && !confirm) {
59
+ throw new Error(`${at}.${kind}: an empty filter matches every document. Set confirm: true to use it.`);
60
+ }
61
+ if (kind === "deleteOne")
62
+ return { deleteOne: { filter: filter } };
63
+ if (kind === "deleteMany")
64
+ return { deleteMany: { filter: filter } };
65
+ const update = body["update"];
66
+ if (typeof update !== "object" || update === null) {
67
+ throw new Error(`${at}.${kind}: update must be an object (or a pipeline array)`);
68
+ }
69
+ const upsert = body["upsert"];
70
+ if (upsert !== undefined && typeof upsert !== "boolean")
71
+ throw new Error(`${at}.${kind}: upsert must be a boolean`);
72
+ const operation = { filter: filter, update: update, ...(upsert !== undefined ? { upsert } : {}) };
73
+ return kind === "updateOne" ? { updateOne: operation } : { updateMany: operation };
74
+ }
75
+ /** This function checks the input of a bulk write. */
76
+ export function parseBulkInput(data) {
77
+ if (!isPlainObject(data))
78
+ throw new Error(`${PROCEDURE}: input must be an object`);
79
+ for (const key of Object.keys(data)) {
80
+ if (!INPUT_FIELDS.has(key))
81
+ throw new Error(`${PROCEDURE}: unknown field "${key}". The fields are: ${[...INPUT_FIELDS].join(", ")}`);
82
+ }
83
+ for (const field of ["ordered", "confirm"]) {
84
+ if (data[field] !== undefined && typeof data[field] !== "boolean")
85
+ throw new Error(`${PROCEDURE}: ${field} must be a boolean`);
86
+ }
87
+ const confirm = data["confirm"] === true;
88
+ const operations = data["operations"];
89
+ if (!Array.isArray(operations) || operations.length === 0) {
90
+ throw new Error(`${PROCEDURE}: operations must be a list with at least one operation`);
91
+ }
92
+ const result = { operations: operations.map((operation, index) => parseOperation(operation, index, confirm)) };
93
+ copyScope(data, result);
94
+ if (data["ordered"] !== undefined)
95
+ result.ordered = data["ordered"];
96
+ if (confirm)
97
+ result.confirm = true;
98
+ return result;
99
+ }
100
+ /** The ids of a result, as text, by the index of their operation. */
101
+ function idsAsText(ids) {
102
+ return Object.fromEntries(Object.entries(ids ?? {}).map(([index, id]) => [index, String(id)]));
103
+ }
104
+ // Schemas
105
+ const operationBody = (fields) => z.object(fields);
106
+ const filterField = documentObject().describe("The filter of the documents. An empty filter needs confirm: true.");
107
+ const updateField = z
108
+ .union([documentObject(), z.array(documentObject())])
109
+ .describe('The update operations, for example { $set: { status: "done" } }, or a pipeline');
110
+ const upsertField = z.boolean().optional().describe("Insert a document when none matches");
111
+ const bulkInputSchema = described(parseBulkInput, z.object({
112
+ ...scopeFields(),
113
+ operations: z
114
+ .array(z.union([
115
+ z.object({ insertOne: operationBody({ document: documentObject().describe("The new document") }) }),
116
+ z.object({ updateOne: operationBody({ filter: filterField, update: updateField, upsert: upsertField }) }),
117
+ z.object({ updateMany: operationBody({ filter: filterField, update: updateField, upsert: upsertField }) }),
118
+ z.object({ deleteOne: operationBody({ filter: filterField }) }),
119
+ z.object({ deleteMany: operationBody({ filter: filterField }) }),
120
+ ]))
121
+ .min(1)
122
+ .describe("The writes, in order: each one is { insertOne }, { updateOne }, { updateMany }, { deleteOne } or { deleteMany }"),
123
+ ordered: z.boolean().optional().describe("True (the default): the first failure stops the rest. False: the server tries each write."),
124
+ confirm: z.boolean().optional().describe("Set to true to use an empty filter, which matches every document, in an update or a delete"),
125
+ }));
126
+ const bulkOutputSchema = zodAdapter(z.looseObject({
127
+ ok: z.boolean().describe("True when the server confirmed the writes"),
128
+ insertedCount: z.number().describe("The number of inserted documents"),
129
+ matchedCount: z.number().describe("The number of documents that the updates matched"),
130
+ modifiedCount: z.number().describe("The number of documents that the updates changed"),
131
+ deletedCount: z.number().describe("The number of deleted documents"),
132
+ upsertedCount: z.number().describe("The number of documents that an upsert made"),
133
+ insertedIds: z.record(z.string(), z.string()).describe("The ids of the inserted documents, as text, by the index of their operation"),
134
+ upsertedIds: z.record(z.string(), z.string()).describe("The ids of the upserted documents, as text, by the index of their operation"),
135
+ }));
136
+ export const bulkProcedure = createProcedure()
137
+ .path(["mongo", "documents", "bulk"])
138
+ .input(bulkInputSchema)
139
+ .output(bulkOutputSchema)
140
+ .meta({
141
+ description: "Several writes in one request: insertOne, updateOne, updateMany, deleteOne and deleteMany, in order by default",
142
+ effects: { reads: ["mongo", "network"], writes: ["mongo", "network"] },
143
+ })
144
+ .handler(async (input, ctx) => {
145
+ const { collection } = await collectionFor(input, ctx);
146
+ const result = await collection.bulkWrite(input.operations, { ordered: input.ordered ?? true });
147
+ return {
148
+ ok: result.ok === 1,
149
+ insertedCount: result.insertedCount,
150
+ matchedCount: result.matchedCount,
151
+ modifiedCount: result.modifiedCount,
152
+ deletedCount: result.deletedCount,
153
+ upsertedCount: result.upsertedCount,
154
+ insertedIds: idsAsText(result.insertedIds),
155
+ upsertedIds: idsAsText(result.upsertedIds),
156
+ };
157
+ })
158
+ .build();
159
+ //# sourceMappingURL=documents.bulk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.bulk.js","sourceRoot":"","sources":["../../src/procedures/documents.bulk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAuD,MAAM,oBAAoB,CAAC;AAEtH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0B5E,MAAM,SAAS,GAAG,sBAAsB,CAAC;AACzC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;AAE5F,sFAAsF;AACtF,MAAM,KAAK,GAA+E;IACxF,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE;IAC3D,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;IACrF,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;IACtF,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE;IACvD,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE;CACzD,CAAC;AAEF,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,kFAAkF;AAClF,SAAS,cAAc,CAAC,GAAY,EAAE,KAAa,EAAE,OAAgB;IACnE,MAAM,EAAE,GAAG,GAAG,SAAS,gBAAgB,KAAK,GAAG,CAAC;IAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,2CAA2C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,wBAAwB,IAAI,0BAA0B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,oBAAoB,CAAC,CAAC;IAC7E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,oBAAoB,GAAG,sBAAsB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,cAAc,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,wCAAwC,CAAC,CAAC;QACrG,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,4BAA4B,CAAC,CAAC;IACvF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,wEAAwE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAuB,EAAE,EAAE,CAAC;IACpF,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAuB,EAAE,EAAE,CAAC;IACtF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,kDAAkD,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,4BAA4B,CAAC,CAAC;IACpH,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,MAAuB,EAAE,MAAM,EAAE,MAAwB,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACrI,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACrF,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,2BAA2B,CAAC,CAAC;IACnF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,oBAAoB,GAAG,sBAAsB,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,KAAK,KAAK,oBAAoB,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,yDAAyD,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAc,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAC1H,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAY,CAAC;IAC/E,IAAI,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,SAAS,SAAS,CAAC,GAAwC;IACzD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,UAAU;AACV,MAAM,aAAa,GAAG,CAAC,MAAiC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC,CAAC;AACnH,MAAM,WAAW,GAAG,CAAC;KAClB,KAAK,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;KACpD,QAAQ,CAAC,gFAAgF,CAAC,CAAC;AAC9F,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC;AAE3F,MAAM,eAAe,GAAG,SAAS,CAC/B,cAAc,EACd,CAAC,CAAC,MAAM,CAAC;IACP,GAAG,WAAW,EAAE;IAChB,UAAU,EAAE,CAAC;SACV,KAAK,CACJ,CAAC,CAAC,KAAK,CAAC;QACN,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;QACnG,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACzG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC/D,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;KACjE,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,iHAAiH,CAAC;IAC9H,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;IACrI,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4FAA4F,CAAC;CACvI,CAAC,CACH,CAAC;AACF,MAAM,gBAAgB,GAAG,UAAU,CACjC,CAAC,CAAC,WAAW,CAAC;IACZ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACrE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACtE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACrF,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACtF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACpE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;IACjF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,6EAA6E,CAAC;IACrI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,6EAA6E,CAAC;CACtI,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAItB,eAAe,EAAE;KAClB,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;KACpC,KAAK,CAAC,eAAe,CAAC;KACtB,MAAM,CAAC,gBAAgB,CAAC;KACxB,IAAI,CAAC;IACJ,WAAW,EAAE,gHAAgH;IAC7H,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;CACvE,CAAC;KACD,OAAO,CAAC,KAAK,EAAE,KAAgB,EAAE,GAAqB,EAAE,EAAE;IACzD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,UAA+C,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;IACrI,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QAC1C,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;KAC3C,CAAC;AACJ,CAAC,CAAC;KACD,KAAK,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Procedure: mongo.documents.distinct (roadmap R44)
3
+ * The distinct values of one field in the documents that match a filter
4
+ */
5
+ import { type Effects, type Procedure } from "@procedures/client";
6
+ import { type ScopeInput } from "../scope.js";
7
+ import { type DocumentQuery } from "../types.js";
8
+ interface DistinctInput extends ScopeInput {
9
+ /** The field, with dots for an embedded field ("address.city") */
10
+ field: string;
11
+ /** The filter of the documents (default: all documents) */
12
+ query?: DocumentQuery | undefined;
13
+ }
14
+ interface DistinctOutput {
15
+ values: unknown[];
16
+ }
17
+ export declare const distinctProcedure: Procedure<DistinctInput, DistinctOutput, {
18
+ description: string;
19
+ effects?: Effects;
20
+ }>;
21
+ export type { DistinctInput, DistinctOutput };
22
+ //# sourceMappingURL=documents.distinct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.distinct.d.ts","sourceRoot":"","sources":["../../src/procedures/documents.distinct.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,UAAU,aAAc,SAAQ,UAAU;IACxC,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,UAAU,cAAc;IACtB,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAgBD,eAAO,MAAM,iBAAiB,EAAE,SAAS,CACvC,aAAa,EACb,cAAc,EACd;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAclC,CAAC;AAEX,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Procedure: mongo.documents.distinct (roadmap R44)
3
+ * The distinct values of one field in the documents that match a filter
4
+ */
5
+ import { createProcedure, zodAdapter } from "@procedures/client";
6
+ import { collectionFor } from "../scope.js";
7
+ import { scopeFields, documentObject } from "./input-schemas.js";
8
+ import { z } from "zod";
9
+ import {} from "../types.js";
10
+ // Schemas
11
+ const distinctInputSchema = zodAdapter(z.object({
12
+ ...scopeFields(),
13
+ field: z.string().min(1).describe('The field, with dots for an embedded field (for example "address.city")'),
14
+ query: documentObject().optional().describe("The filter of the documents (default: all documents)"),
15
+ }));
16
+ const distinctOutputSchema = zodAdapter(z.looseObject({
17
+ values: z.array(z.unknown()).describe("The distinct values of the field. An array field gives each of its elements."),
18
+ }));
19
+ export const distinctProcedure = createProcedure()
20
+ .path(["mongo", "documents", "distinct"])
21
+ .input(distinctInputSchema)
22
+ .output(distinctOutputSchema)
23
+ .meta({
24
+ description: "The distinct values of a field in the documents that match a filter",
25
+ effects: { reads: ["mongo", "network"], writes: [] },
26
+ })
27
+ .handler(async (input, ctx) => {
28
+ const { collection } = await collectionFor(input, ctx);
29
+ const values = await collection.distinct(input.field, input.query ?? {});
30
+ return { values };
31
+ })
32
+ .build();
33
+ //# sourceMappingURL=documents.distinct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.distinct.js","sourceRoot":"","sources":["../../src/procedures/documents.distinct.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAuD,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAsB,MAAM,aAAa,CAAC;AAcjD,UAAU;AACV,MAAM,mBAAmB,GAAG,UAAU,CACpC,CAAC,CAAC,MAAM,CAAC;IACP,GAAG,WAAW,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yEAAyE,CAAC;IAC5G,KAAK,EAAE,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CACpG,CAAC,CACH,CAAC;AACF,MAAM,oBAAoB,GAAG,UAAU,CACrC,CAAC,CAAC,WAAW,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,8EAA8E,CAAC;CACtH,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAI1B,eAAe,EAAE;KAClB,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;KACxC,KAAK,CAAC,mBAAmB,CAAC;KAC1B,MAAM,CAAC,oBAAoB,CAAC;KAC5B,IAAI,CAAC;IACJ,WAAW,EAAE,qEAAqE;IAClF,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;CACrD,CAAC;KACD,OAAO,CAAC,KAAK,EAAE,KAAoB,EAAE,GAAqB,EAAE,EAAE;IAC7D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC;KACD,KAAK,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Procedure: mongo.documents.explain (roadmap R44)
3
+ * The plan of a find or of an aggregation pipeline
4
+ *
5
+ * With `pipeline`, the procedure explains an aggregation. Else it explains a find with `query`
6
+ * (default: all documents). It refuses `$out` and `$merge`, as `documents.aggregate` does (R7):
7
+ * the verbosity `executionStats` runs the plan.
8
+ */
9
+ import { type Effects, type Procedure } from "@procedures/client";
10
+ import { type ScopeInput } from "../scope.js";
11
+ import type { AggregationStage, DocumentQuery, SortSpec } from "../types.js";
12
+ /** How much the server tells: the plan only, or also the statistics of a run. */
13
+ type Verbosity = "queryPlanner" | "executionStats" | "allPlansExecution";
14
+ interface ExplainInput extends ScopeInput {
15
+ /** The filter of a find (default: all documents). Not with `pipeline`. */
16
+ query?: DocumentQuery;
17
+ /** The fields of a find to give (1) or to leave out (0) */
18
+ projection?: Record<string, 0 | 1>;
19
+ /** The sort order of a find */
20
+ sort?: SortSpec;
21
+ /** The most documents of a find */
22
+ limit?: number;
23
+ /** An aggregation pipeline (not with `query`) */
24
+ pipeline?: AggregationStage[];
25
+ /** The verbosity (default: queryPlanner) */
26
+ verbosity?: Verbosity;
27
+ }
28
+ interface ExplainOutput {
29
+ /** "find" or "aggregate" */
30
+ operation: "find" | "aggregate";
31
+ /** The explain document of the server */
32
+ plan: Record<string, unknown>;
33
+ }
34
+ /** This function checks the input of an explain. */
35
+ export declare function parseExplainInput(data: unknown): ExplainInput;
36
+ export declare const explainProcedure: Procedure<ExplainInput, ExplainOutput, {
37
+ description: string;
38
+ effects?: Effects;
39
+ }>;
40
+ export type { ExplainInput, ExplainOutput };
41
+ //# sourceMappingURL=documents.explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.explain.d.ts","sourceRoot":"","sources":["../../src/procedures/documents.explain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AAGtH,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7E,iFAAiF;AACjF,KAAK,SAAS,GAAG,cAAc,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAIzE,UAAU,YAAa,SAAQ,UAAU;IACvC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,+BAA+B;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,UAAU,aAAa;IACrB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC;IAChC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AASD,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAkC7D;AA+BD,eAAO,MAAM,gBAAgB,EAAE,SAAS,CACtC,YAAY,EACZ,aAAa,EACb;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAqBlC,CAAC;AAEX,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Procedure: mongo.documents.explain (roadmap R44)
3
+ * The plan of a find or of an aggregation pipeline
4
+ *
5
+ * With `pipeline`, the procedure explains an aggregation. Else it explains a find with `query`
6
+ * (default: all documents). It refuses `$out` and `$merge`, as `documents.aggregate` does (R7):
7
+ * the verbosity `executionStats` runs the plan.
8
+ */
9
+ import { createProcedure, zodAdapter } from "@procedures/client";
10
+ import { z } from "zod";
11
+ import { collectionFor, copyScope, SCOPE_FIELDS } from "../scope.js";
12
+ import { described, documentObject, scopeFields } from "./input-schemas.js";
13
+ import { writingStage } from "./documents.aggregate.js";
14
+ const VERBOSITIES = ["queryPlanner", "executionStats", "allPlansExecution"];
15
+ const PROCEDURE = "mongo.documents.explain";
16
+ const INPUT_FIELDS = new Set(["query", "projection", "sort", "limit", "pipeline", "verbosity", ...SCOPE_FIELDS]);
17
+ function isPlainObject(value) {
18
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19
+ }
20
+ /** This function checks the input of an explain. */
21
+ export function parseExplainInput(data) {
22
+ if (!isPlainObject(data))
23
+ throw new Error(`${PROCEDURE}: input must be an object`);
24
+ for (const key of Object.keys(data)) {
25
+ if (!INPUT_FIELDS.has(key))
26
+ throw new Error(`${PROCEDURE}: unknown field "${key}". The fields are: ${[...INPUT_FIELDS].join(", ")}`);
27
+ }
28
+ const result = {};
29
+ copyScope(data, result);
30
+ const pipeline = data["pipeline"];
31
+ if (pipeline !== undefined) {
32
+ for (const field of ["query", "projection", "sort", "limit"]) {
33
+ if (data[field] !== undefined)
34
+ throw new Error(`${PROCEDURE}: give a pipeline or the fields of a find (${field}), not both`);
35
+ }
36
+ if (!Array.isArray(pipeline) || !pipeline.every(isPlainObject))
37
+ throw new Error(`${PROCEDURE}: pipeline must be a list of stages`);
38
+ const stage = writingStage(pipeline);
39
+ if (stage)
40
+ throw new Error(`${PROCEDURE} is read only: the stage ${stage} writes to a collection`);
41
+ result.pipeline = pipeline;
42
+ }
43
+ for (const field of ["query", "projection", "sort"]) {
44
+ const value = data[field];
45
+ if (value === undefined)
46
+ continue;
47
+ if (!isPlainObject(value))
48
+ throw new Error(`${PROCEDURE}: ${field} must be an object`);
49
+ result[field] = value;
50
+ }
51
+ const limit = data["limit"];
52
+ if (limit !== undefined) {
53
+ if (typeof limit !== "number" || !Number.isInteger(limit) || limit < 1)
54
+ throw new Error(`${PROCEDURE}: limit must be an integer >= 1`);
55
+ result.limit = limit;
56
+ }
57
+ const verbosity = data["verbosity"];
58
+ if (verbosity !== undefined) {
59
+ if (!VERBOSITIES.includes(verbosity))
60
+ throw new Error(`${PROCEDURE}: verbosity must be ${VERBOSITIES.join(", ")}`);
61
+ result.verbosity = verbosity;
62
+ }
63
+ return result;
64
+ }
65
+ /** The explain document without the fields of the cluster time: they hold signatures, not the plan. */
66
+ function planOf(explained) {
67
+ const { $clusterTime: _clusterTime, operationTime: _operationTime, ...plan } = explained;
68
+ return plan;
69
+ }
70
+ // Schemas
71
+ const explainInputSchema = described(parseExplainInput, z.object({
72
+ ...scopeFields(),
73
+ query: documentObject().optional().describe("The filter of a find (default: all documents). Not with pipeline."),
74
+ projection: z.record(z.string(), z.union([z.literal(0), z.literal(1)])).optional().describe("The fields of a find to give (1) or to leave out (0)"),
75
+ sort: z.record(z.string(), z.unknown()).optional().describe("The sort order of a find: { field: 1 } ascending, { field: -1 } descending"),
76
+ limit: z.number().int().min(1).optional().describe("The most documents of a find"),
77
+ pipeline: z.array(documentObject()).optional().describe("An aggregation pipeline to explain, in place of a find. $out and $merge are refused."),
78
+ verbosity: z
79
+ .enum(["queryPlanner", "executionStats", "allPlansExecution"])
80
+ .optional()
81
+ .describe("queryPlanner (the default): the plan only. executionStats and allPlansExecution also run the plan."),
82
+ }));
83
+ const explainOutputSchema = zodAdapter(z.looseObject({
84
+ operation: z.enum(["find", "aggregate"]).describe("The operation that the server explained"),
85
+ plan: z.record(z.string(), z.unknown()).describe("The explain document of the server (queryPlanner, and executionStats with that verbosity)"),
86
+ }));
87
+ export const explainProcedure = createProcedure()
88
+ .path(["mongo", "documents", "explain"])
89
+ .input(explainInputSchema)
90
+ .output(explainOutputSchema)
91
+ .meta({
92
+ description: "The plan of a find or an aggregation pipeline (read only: $out and $merge are refused)",
93
+ effects: { reads: ["mongo", "network"], writes: [] },
94
+ })
95
+ .handler(async (input, ctx) => {
96
+ const { collection } = await collectionFor(input, ctx);
97
+ const verbosity = input.verbosity ?? "queryPlanner";
98
+ if (input.pipeline) {
99
+ return { operation: "aggregate", plan: planOf(await collection.aggregate(input.pipeline).explain(verbosity)) };
100
+ }
101
+ const options = {};
102
+ if (input.projection)
103
+ options.projection = input.projection;
104
+ if (input.sort)
105
+ options.sort = input.sort;
106
+ if (input.limit !== undefined)
107
+ options.limit = input.limit;
108
+ return { operation: "find", plan: planOf(await collection.find(input.query ?? {}, options).explain(verbosity)) };
109
+ })
110
+ .build();
111
+ //# sourceMappingURL=documents.explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.explain.js","sourceRoot":"","sources":["../../src/procedures/documents.explain.ts"],"names":[],"mappings":"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"}