@thisisagile/easy-mongo 11.8.8 → 12.0.1

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.
@@ -1,19 +1,19 @@
1
- import { Condition, Database, Field, Get, Json, LogicalCondition, MapOptions, Mapper, Mapping, PropertyOptions, Sort, Text } from '@thisisagile/easy';
1
+ import { Condition, Database, Field, Get, Json, LogicalCondition, MapOptions, Mapper, PropertyOptions, Sort, Text } from '@thisisagile/easy';
2
2
  import { MongoProvider } from './MongoProvider';
3
3
  export declare class Collection extends Mapper {
4
4
  protected readonly map: {
5
5
  field: <T = unknown>(name: string, options?: PropertyOptions<T> | undefined) => Field;
6
6
  item: (property: string, options?: PropertyOptions<unknown> | undefined) => import("@thisisagile/easy").Property<unknown>;
7
- ignore: (property?: string | undefined) => Mapping;
8
- skipIn: (property: string) => Mapping;
9
- skipOut: (property: string) => Mapping;
10
- func: (property: string, funcIn: Get<import("@thisisagile/easy").JsonValue | undefined, Json>, funcOut: Get<import("@thisisagile/easy").JsonValue | undefined, Json>) => Mapping;
11
- add: (funcIn: Get<import("@thisisagile/easy").JsonValue, Json>) => Mapping;
12
- map: (mapper: import("@thisisagile/easy").Construct<Mapper>, property?: string | undefined) => Mapping;
13
- propsToList: (...maps: Mapping[]) => Mapping;
14
- list: (mapper: Mapping, property: string) => Mapping;
7
+ ignore: (property?: string | undefined) => import("@thisisagile/easy").Mapping;
8
+ skipIn: (property: string) => import("@thisisagile/easy").Mapping;
9
+ skipOut: (property: string) => import("@thisisagile/easy").Mapping;
10
+ func: (property: string, funcIn: Get<import("@thisisagile/easy").JsonValue | undefined, Json>, funcOut: Get<import("@thisisagile/easy").JsonValue | undefined, Json>) => import("@thisisagile/easy").Mapping;
11
+ add: (funcIn: Get<import("@thisisagile/easy").JsonValue, Json>) => import("@thisisagile/easy").Mapping;
12
+ map: (mapper: import("@thisisagile/easy").Construct<Mapper>, property?: string | undefined) => import("@thisisagile/easy").Mapping;
13
+ propsToList: (...maps: import("@thisisagile/easy").Mapping[]) => import("@thisisagile/easy").Mapping;
14
+ list: (mapper: import("@thisisagile/easy").Mapping, property: string) => import("@thisisagile/easy").Mapping;
15
15
  };
16
- readonly id: Mapping;
16
+ readonly id: Field;
17
17
  constructor(options?: MapOptions);
18
18
  get db(): Database;
19
19
  get provider(): MongoProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"Collection.js","sourceRoot":"","sources":["../src/Collection.ts"],"names":[],"mappings":";;;AAAA,4CAkB2B;AAC3B,mCAAsC;AACtC,mDAAgD;AAEhD,MAAa,UAAW,SAAQ,aAAM;IAOpC,YAAY,UAAsB,EAAE,SAAS,EAAE,QAAQ,EAAE;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAPE,QAAG,GAAG;YACvB,GAAG,eAAQ;YACX,KAAK,EAAE,CAAc,IAAY,EAAE,OAA4B,EAAS,EAAE,CAAC,IAAI,YAAK,CAAC,IAAI,EAAE,OAAO,CAAC;SACpG,CAAC;QACO,OAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAM,EAAE,CAAY,CAAC;QAchE,UAAK,GAAG,CAAC,GAAG,UAAkC,EAAQ,EAAE,CACtD,IAAI,uBAAgB,CAClB,KAAK,EACL,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,YAAK,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACpC,CAAC,MAAM,EAAE,CAAC;QAEb,UAAK,GAAG,CAAC,SAAkD,EAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAA,YAAK,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEpH,UAAK,GAAG,CAAC,GAAG,UAAkC,EAAQ,EAAE,CACtD,IAAI,uBAAgB,CAClB,OAAO,EACP,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,YAAK,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACpC,CAAC,MAAM,EAAE,CAAC;QAEb,WAAM,GAAG,CAAC,KAAc,EAAa,EAAE,CAAC,IAAA,kBAAW,EAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE9E,WAAM,GAAG,CAAC,GAAS,EAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,SAAI,GAAG,CAAC,GAAG,UAAkB,EAAQ,EAAE,CACrC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAO,EAAE,CAAC,EAAE,EAAE;YAC/B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IAhCT,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,eAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,6BAAa,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IA0BD,GAAG,CAAC,KAAW,EAAE;QACf,OAAO,IAAA,mBAAW,EAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;CACF;AA9CD,gCA8CC"}
1
+ {"version":3,"file":"Collection.js","sourceRoot":"","sources":["../src/Collection.ts"],"names":[],"mappings":";;;AAAA,4CAiB2B;AAC3B,mCAAsC;AACtC,mDAAgD;AAEhD,MAAa,UAAW,SAAQ,aAAM;IAOpC,YAAY,UAAsB,EAAE,SAAS,EAAE,QAAQ,EAAE;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAPE,QAAG,GAAG;YACvB,GAAG,eAAQ;YACX,KAAK,EAAE,CAAc,IAAY,EAAE,OAA4B,EAAS,EAAE,CAAC,IAAI,YAAK,CAAC,IAAI,EAAE,OAAO,CAAC;SACpG,CAAC;QACO,OAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAM,EAAE,CAAC,CAAC;QAcrD,UAAK,GAAG,CAAC,GAAG,UAAkC,EAAQ,EAAE,CACtD,IAAI,uBAAgB,CAClB,KAAK,EACL,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,YAAK,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACpC,CAAC,MAAM,EAAE,CAAC;QAEb,UAAK,GAAG,CAAC,SAAkD,EAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAA,YAAK,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAEpH,UAAK,GAAG,CAAC,GAAG,UAAkC,EAAQ,EAAE,CACtD,IAAI,uBAAgB,CAClB,OAAO,EACP,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,YAAK,EAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACpC,CAAC,MAAM,EAAE,CAAC;QAEb,WAAM,GAAG,CAAC,KAAc,EAAa,EAAE,CAAC,IAAA,kBAAW,EAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE9E,WAAM,GAAG,CAAC,GAAS,EAAS,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAA,eAAQ,EAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,SAAI,GAAG,CAAC,GAAG,UAAkB,EAAQ,EAAE,CACrC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAO,EAAE,CAAC,EAAE,EAAE;YAC/B,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IAhCT,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,eAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,6BAAa,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IA0BD,GAAG,CAAC,KAAW,EAAE;QACf,OAAO,IAAA,mBAAW,EAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;CACF;AA9CD,gCA8CC"}
@@ -1,5 +1,5 @@
1
- import { Condition, Database, Field, Id, Json, JsonValue, LogicalCondition, PageList, PageOptions } from '@thisisagile/easy';
2
- import { AggregationCursor, Collection as MongoCollection, Document, Filter as MongoFilter, FindCursor, FindOptions as MongoFindOptions, MongoClient } from 'mongodb';
1
+ import { Condition, Database, Field, Id, Json, JsonValue, LogicalCondition, OneOrMore, PageList, PageOptions, Sort } from '@thisisagile/easy';
2
+ import { AggregationCursor, Collection as MongoCollection, CreateIndexesOptions, Document, Filter as MongoFilter, FindCursor, FindOptions as MongoFindOptions, IndexSpecification, MongoClient } from 'mongodb';
3
3
  import { Collection } from './Collection';
4
4
  export declare type Projection = Record<string, 0 | 1>;
5
5
  export declare type FindOptions = PageOptions & {
@@ -7,6 +7,13 @@ export declare type FindOptions = PageOptions & {
7
7
  };
8
8
  export declare type Filter<T> = MongoFilter<T>;
9
9
  export declare type Query = Condition | LogicalCondition | Filter<any>;
10
+ export declare type IndexOptions = {
11
+ unique?: boolean;
12
+ filter?: Query;
13
+ languageOverride?: string;
14
+ languageDefault?: string;
15
+ };
16
+ export declare type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;
10
17
  export declare class MongoProvider {
11
18
  readonly coll: Collection;
12
19
  private client?;
@@ -18,6 +25,8 @@ export declare class MongoProvider {
18
25
  protected toFindOptions(options?: FindOptions): MongoFindOptions & {
19
26
  total: boolean;
20
27
  };
28
+ protected toIndexSpecification(index: Indexes): IndexSpecification;
29
+ protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions;
21
30
  protected toArray(cursor: FindCursor<Document> | AggregationCursor<Document>, options?: {
22
31
  take?: number;
23
32
  skip?: number;
@@ -32,8 +41,8 @@ export declare class MongoProvider {
32
41
  update(item: Json): Promise<Json>;
33
42
  remove(id: Id): Promise<boolean>;
34
43
  count(query?: Query): Promise<number>;
35
- createIndex(field: string | any, unique?: boolean): Promise<string>;
36
- createPartialIndex(field: string | any, filter: Query, unique?: boolean): Promise<string>;
37
- createTextIndexes(...fields: Field[]): Promise<string>;
44
+ createIndex(indexes: Indexes, options?: IndexOptions): Promise<string>;
45
+ createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string>;
46
+ createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string>;
38
47
  collection(): Promise<MongoCollection>;
39
48
  }
@@ -41,6 +41,22 @@ class MongoProvider {
41
41
  projection: { _id: 0, ...options?.projection },
42
42
  };
43
43
  }
44
+ toIndexSpecification(index) {
45
+ return (0, easy_1.choose)(index)
46
+ .type(easy_1.isField, f => f.property)
47
+ .type(easy_1.isSortCondition, s => s.toJSON())
48
+ .type(easy_1.isArray, aa => aa.map(a => this.toIndexSpecification(a)))
49
+ .else(i => i);
50
+ }
51
+ toCreateIndexesOptions(options) {
52
+ return {
53
+ unique: options?.unique ?? true,
54
+ language_override: options?.languageOverride,
55
+ default_language: options?.languageDefault,
56
+ partialFilterExpression: options?.filter ? (0, Utils_1.toMongoType)((0, easy_1.asJson)(options?.filter)) : undefined,
57
+ writeConcern: { w: 1 },
58
+ };
59
+ }
44
60
  toArray(cursor, options) {
45
61
  return cursor.toArray().then(r => (0, easy_1.toPageList)(r, options));
46
62
  }
@@ -81,19 +97,15 @@ class MongoProvider {
81
97
  count(query) {
82
98
  return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));
83
99
  }
84
- createIndex(field, unique = true) {
85
- return this.collection().then(c => c.createIndex(field, { unique, writeConcern: { w: 1 } }));
100
+ createIndex(indexes, options) {
101
+ return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));
86
102
  }
87
- createPartialIndex(field, filter, unique = true) {
88
- return this.collection().then(c => c.createIndex(field, {
89
- partialFilterExpression: (0, Utils_1.toMongoType)((0, easy_1.asJson)(filter)),
90
- unique,
91
- writeConcern: { w: 1 },
92
- }));
103
+ createPartialIndex(indexes, filter, options) {
104
+ return this.createIndex(indexes, { ...options, filter });
93
105
  }
94
- createTextIndexes(...fields) {
95
- const indexes = fields.reduce((i, f) => ({ ...i, [f.property]: 'text' }), {});
96
- return this.collection().then(c => c.createIndex(indexes));
106
+ createTextIndex(indexes, options) {
107
+ const ii = (0, easy_1.toArray)(indexes).reduce((i, f) => ({ ...i, [(0, easy_1.asString)(f)]: 'text' }), {});
108
+ return this.createIndex(ii, options);
97
109
  }
98
110
  collection() {
99
111
  return this.cluster()
@@ -1 +1 @@
1
- {"version":3,"file":"MongoProvider.js","sourceRoot":"","sources":["../src/MongoProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoProvider.js","sourceRoot":"","sources":["../src/MongoProvider.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy-mongo",
3
- "version": "11.8.8",
3
+ "version": "12.0.1",
4
4
  "description": "Add support for MongoDB",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -31,10 +31,10 @@
31
31
  "access": "public"
32
32
  },
33
33
  "devDependencies": {
34
- "@thisisagile/easy-test": "11.8.8"
34
+ "@thisisagile/easy-test": "12.0.1"
35
35
  },
36
36
  "dependencies": {
37
- "@thisisagile/easy": "^11.8.8",
37
+ "@thisisagile/easy": "^12.0.1",
38
38
  "mongodb": "^4.7.0"
39
39
  }
40
40
  }
package/src/Collection.ts CHANGED
@@ -8,7 +8,6 @@ import {
8
8
  LogicalCondition,
9
9
  MapOptions,
10
10
  Mapper,
11
- Mapping,
12
11
  mappings,
13
12
  ofGet,
14
13
  PropertyOptions,
@@ -25,7 +24,7 @@ export class Collection extends Mapper {
25
24
  ...mappings,
26
25
  field: <T = unknown>(name: string, options?: PropertyOptions<T>): Field => new Field(name, options),
27
26
  };
28
- readonly id = this.map.field('id', { dflt: toUuid }) as Mapping;
27
+ readonly id = this.map.field('id', { dflt: toUuid });
29
28
 
30
29
  constructor(options: MapOptions = { startFrom: 'source' }) {
31
30
  super(options);
@@ -1,20 +1,27 @@
1
1
  import {
2
2
  asJson,
3
3
  asString,
4
+ choose,
4
5
  Condition,
5
6
  Database,
6
7
  Exception,
7
8
  Field,
8
9
  Id,
9
10
  ifTrue,
11
+ isArray,
10
12
  isDefined,
13
+ isField,
14
+ isSortCondition,
11
15
  json,
12
16
  Json,
13
17
  JsonValue,
14
18
  LogicalCondition,
19
+ OneOrMore,
15
20
  PageList,
16
21
  PageOptions,
17
22
  reject,
23
+ Sort,
24
+ toArray,
18
25
  toPageList,
19
26
  tuple2,
20
27
  tuple3,
@@ -23,10 +30,12 @@ import {
23
30
  import {
24
31
  AggregationCursor,
25
32
  Collection as MongoCollection,
33
+ CreateIndexesOptions,
26
34
  Document,
27
35
  Filter as MongoFilter,
28
36
  FindCursor,
29
37
  FindOptions as MongoFindOptions,
38
+ IndexSpecification,
30
39
  MongoClient,
31
40
  } from 'mongodb';
32
41
  import { Collection } from './Collection';
@@ -39,6 +48,15 @@ export type FindOptions = PageOptions & { projection?: Projection };
39
48
  export type Filter<T> = MongoFilter<T>;
40
49
  export type Query = Condition | LogicalCondition | Filter<any>;
41
50
 
51
+ export type IndexOptions = {
52
+ unique?: boolean;
53
+ filter?: Query;
54
+ languageOverride?: string;
55
+ languageDefault?: string;
56
+ };
57
+
58
+ export type Indexes = OneOrMore<string | Field | Sort | Record<string, 1 | -1>>;
59
+
42
60
  export class MongoProvider {
43
61
  aggregate = this.group;
44
62
 
@@ -81,6 +99,24 @@ export class MongoProvider {
81
99
  };
82
100
  }
83
101
 
102
+ protected toIndexSpecification(index: Indexes): IndexSpecification {
103
+ return choose(index)
104
+ .type(isField, f => f.property as IndexSpecification)
105
+ .type(isSortCondition, s => s.toJSON() as IndexSpecification)
106
+ .type(isArray, aa => aa.map(a => this.toIndexSpecification(a)) as IndexSpecification)
107
+ .else(i => i as IndexSpecification);
108
+ }
109
+
110
+ protected toCreateIndexesOptions(options?: IndexOptions): CreateIndexesOptions {
111
+ return {
112
+ unique: options?.unique ?? true,
113
+ language_override: options?.languageOverride,
114
+ default_language: options?.languageDefault,
115
+ partialFilterExpression: options?.filter ? toMongoType(asJson(options?.filter)) : undefined,
116
+ writeConcern: { w: 1 },
117
+ };
118
+ }
119
+
84
120
  protected toArray(
85
121
  cursor: FindCursor<Document> | AggregationCursor<Document>,
86
122
  options?: { take?: number; skip?: number; total?: number }
@@ -139,23 +175,17 @@ export class MongoProvider {
139
175
  return this.collection().then(c => c.countDocuments(this.toMongoJson(query ?? {})));
140
176
  }
141
177
 
142
- createIndex(field: string | any, unique = true): Promise<string> {
143
- return this.collection().then(c => c.createIndex(field, { unique, writeConcern: { w: 1 } }));
178
+ createIndex(indexes: Indexes, options?: IndexOptions): Promise<string> {
179
+ return this.collection().then(c => c.createIndex(this.toIndexSpecification(indexes), this.toCreateIndexesOptions(options)));
144
180
  }
145
181
 
146
- createPartialIndex(field: string | any, filter: Query, unique = true): Promise<string> {
147
- return this.collection().then(c =>
148
- c.createIndex(field, {
149
- partialFilterExpression: toMongoType(asJson(filter)),
150
- unique,
151
- writeConcern: { w: 1 },
152
- })
153
- );
182
+ createPartialIndex(indexes: Indexes, filter: Query, options?: Omit<IndexOptions, 'filter'>): Promise<string> {
183
+ return this.createIndex(indexes, { ...options, filter });
154
184
  }
155
185
 
156
- createTextIndexes(...fields: Field[]): Promise<string> {
157
- const indexes = fields.reduce((i, f) => ({ ...i, [f.property]: 'text' }), {});
158
- return this.collection().then(c => c.createIndex(indexes));
186
+ createTextIndex(indexes: OneOrMore<Field | string>, options?: IndexOptions): Promise<string> {
187
+ const ii = toArray(indexes).reduce((i, f) => ({ ...i, [asString(f)]: 'text' }), {});
188
+ return this.createIndex(ii, options);
159
189
  }
160
190
 
161
191
  collection(): Promise<MongoCollection> {