@bedrockio/model 0.3.0 → 0.3.2

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.
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.hasAccess = hasAccess;
7
7
  var _errors = require("./errors");
8
+ var _utils = require("./utils");
8
9
  var _warn = _interopRequireDefault(require("./warn"));
9
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
11
  /**
@@ -28,10 +29,10 @@ function hasAccess(allowed = 'all', options = {}) {
28
29
  return document.id == authUser.id;
29
30
  } else if (token === 'user') {
30
31
  assertOptions(token, options);
31
- return document.user?.id == authUser.id;
32
+ return (0, _utils.isEqual)(document.user, authUser);
32
33
  } else if (token === 'owner') {
33
34
  assertOptions(token, options);
34
- return document.owner?.id == authUser.id;
35
+ return (0, _utils.isEqual)(document.owner, authUser);
35
36
  } else {
36
37
  return scopes?.includes(token);
37
38
  }
@@ -5,14 +5,15 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.applyAssign = applyAssign;
7
7
  var _lodash = require("lodash");
8
+ var _mongoose = _interopRequireDefault(require("mongoose"));
8
9
  var _utils = require("./utils");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
11
  function applyAssign(schema) {
10
12
  schema.method('assign', function assign(fields) {
11
13
  unsetReferenceFields(fields, schema.obj);
12
14
  for (let [path, value] of Object.entries(flattenObject(fields))) {
13
15
  if (value === null) {
14
16
  this.set(path, undefined);
15
- this.markModified(path);
16
17
  } else {
17
18
  this.set(path, value);
18
19
  }
@@ -27,6 +28,8 @@ function unsetReferenceFields(fields, schema = {}) {
27
28
  for (let [key, value] of Object.entries(fields)) {
28
29
  if (!value && (0, _utils.isReferenceField)(schema, key)) {
29
30
  fields[key] = undefined;
31
+ } else if (value instanceof _mongoose.default.Document) {
32
+ fields[key] = value;
30
33
  } else if (value && typeof value === 'object') {
31
34
  unsetReferenceFields(value, (0, _utils.getField)(schema, key));
32
35
  }
package/dist/cjs/index.js CHANGED
@@ -7,7 +7,8 @@ var _exportNames = {
7
7
  createSchema: true,
8
8
  loadModel: true,
9
9
  loadModelDir: true,
10
- addValidators: true
10
+ addValidators: true,
11
+ isEqual: true
11
12
  };
12
13
  Object.defineProperty(exports, "addValidators", {
13
14
  enumerable: true,
@@ -21,6 +22,12 @@ Object.defineProperty(exports, "createSchema", {
21
22
  return _schema.createSchema;
22
23
  }
23
24
  });
25
+ Object.defineProperty(exports, "isEqual", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _utils.isEqual;
29
+ }
30
+ });
24
31
  Object.defineProperty(exports, "loadModel", {
25
32
  enumerable: true,
26
33
  get: function () {
@@ -36,6 +43,7 @@ Object.defineProperty(exports, "loadModelDir", {
36
43
  var _schema = require("./schema");
37
44
  var _load = require("./load");
38
45
  var _validation = require("./validation");
46
+ var _utils = require("./utils");
39
47
  var _testing = require("./testing");
40
48
  Object.keys(_testing).forEach(function (key) {
41
49
  if (key === "default" || key === "__esModule") return;
package/dist/cjs/utils.js CHANGED
@@ -6,12 +6,32 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getField = getField;
7
7
  exports.getInnerField = getInnerField;
8
8
  exports.isDateField = isDateField;
9
+ exports.isEqual = isEqual;
9
10
  exports.isMongooseSchema = isMongooseSchema;
10
11
  exports.isNumberField = isNumberField;
11
12
  exports.isReferenceField = isReferenceField;
12
13
  exports.isSchemaTypedef = isSchemaTypedef;
13
14
  var _mongoose = _interopRequireDefault(require("mongoose"));
14
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ // Mongoose provides an "equals" method on both documents and
17
+ // ObjectIds, however it does not provide a static method to
18
+ // compare two unknown values that may be either, so provide
19
+ // it here.
20
+ function isEqual(a, b) {
21
+ if (a === b) {
22
+ return true;
23
+ } else if (a instanceof _mongoose.default.Document) {
24
+ return a.equals(b);
25
+ } else if (b instanceof _mongoose.default.Document) {
26
+ return b.equals(a);
27
+ } else if (a instanceof _mongoose.default.Types.ObjectId) {
28
+ return a.equals(b);
29
+ } else if (b instanceof _mongoose.default.Types.ObjectId) {
30
+ return b.equals(a);
31
+ } else {
32
+ return false;
33
+ }
34
+ }
15
35
  function isMongooseSchema(obj) {
16
36
  return obj instanceof _mongoose.default.Schema;
17
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bedrockio/model",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Bedrock utilities for model creation.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -39,7 +39,7 @@
39
39
  "@babel/preset-env": "^7.20.2",
40
40
  "@bedrockio/prettier-config": "^1.0.2",
41
41
  "@bedrockio/yada": "^1.0.40",
42
- "@shelf/jest-mongodb": "^4.2.0",
42
+ "@shelf/jest-mongodb": "^4.3.2",
43
43
  "eslint": "^8.33.0",
44
44
  "eslint-plugin-bedrock": "^1.0.26",
45
45
  "jest": "^29.4.1",
package/src/access.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { ImplementationError } from './errors';
2
+ import { isEqual } from './utils';
2
3
  import warn from './warn';
3
4
 
4
5
  /**
@@ -20,10 +21,10 @@ export function hasAccess(allowed = 'all', options = {}) {
20
21
  return document.id == authUser.id;
21
22
  } else if (token === 'user') {
22
23
  assertOptions(token, options);
23
- return document.user?.id == authUser.id;
24
+ return isEqual(document.user, authUser);
24
25
  } else if (token === 'owner') {
25
26
  assertOptions(token, options);
26
- return document.owner?.id == authUser.id;
27
+ return isEqual(document.owner, authUser);
27
28
  } else {
28
29
  return scopes?.includes(token);
29
30
  }
package/src/assign.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { isPlainObject } from 'lodash';
2
+ import mongoose from 'mongoose';
2
3
 
3
4
  import { isReferenceField, getField } from './utils';
4
5
 
@@ -8,7 +9,6 @@ export function applyAssign(schema) {
8
9
  for (let [path, value] of Object.entries(flattenObject(fields))) {
9
10
  if (value === null) {
10
11
  this.set(path, undefined);
11
- this.markModified(path);
12
12
  } else {
13
13
  this.set(path, value);
14
14
  }
@@ -23,6 +23,8 @@ function unsetReferenceFields(fields, schema = {}) {
23
23
  for (let [key, value] of Object.entries(fields)) {
24
24
  if (!value && isReferenceField(schema, key)) {
25
25
  fields[key] = undefined;
26
+ } else if (value instanceof mongoose.Document) {
27
+ fields[key] = value;
26
28
  } else if (value && typeof value === 'object') {
27
29
  unsetReferenceFields(value, getField(schema, key));
28
30
  }
package/src/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createSchema } from './schema';
2
2
  export { loadModel, loadModelDir } from './load';
3
3
  export { addValidators } from './validation';
4
+ export { isEqual } from './utils';
4
5
  export * from './testing';
5
6
  export * from './errors';
package/src/utils.js CHANGED
@@ -1,5 +1,25 @@
1
1
  import mongoose from 'mongoose';
2
2
 
3
+ // Mongoose provides an "equals" method on both documents and
4
+ // ObjectIds, however it does not provide a static method to
5
+ // compare two unknown values that may be either, so provide
6
+ // it here.
7
+ export function isEqual(a, b) {
8
+ if (a === b) {
9
+ return true;
10
+ } else if (a instanceof mongoose.Document) {
11
+ return a.equals(b);
12
+ } else if (b instanceof mongoose.Document) {
13
+ return b.equals(a);
14
+ } else if (a instanceof mongoose.Types.ObjectId) {
15
+ return a.equals(b);
16
+ } else if (b instanceof mongoose.Types.ObjectId) {
17
+ return b.equals(a);
18
+ } else {
19
+ return false;
20
+ }
21
+ }
22
+
3
23
  export function isMongooseSchema(obj) {
4
24
  return obj instanceof mongoose.Schema;
5
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,oCAFW,MAAM,GAAC,MAAM,EAAE,yBA2BzB"}
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.js"],"names":[],"mappings":"AAIA;;GAEG;AACH,oCAFW,MAAM,GAAC,MAAM,EAAE,yBA2BzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../src/assign.js"],"names":[],"mappings":"AAIA,+CAYC"}
1
+ {"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../src/assign.js"],"names":[],"mappings":"AAKA,+CAWC"}
@@ -14,7 +14,7 @@ export const INCLUDE_FIELD_SCHEMA: {
14
14
  meta: {};
15
15
  required(): any;
16
16
  default(arg: any): any;
17
- custom(...args: import("@bedrockio/yada/types/Schema").CustomSignature): any;
17
+ custom(fn: Function): any;
18
18
  strip(strip: any): any;
19
19
  allow(...set: any[]): any;
20
20
  reject(...set: any[]): any;
package/types/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createSchema } from "./schema";
2
2
  export { addValidators } from "./validation";
3
+ export { isEqual } from "./utils";
3
4
  export * from "./testing";
4
5
  export * from "./errors";
5
6
  export { loadModel, loadModelDir } from "./load";
package/types/load.d.ts CHANGED
@@ -4,73 +4,7 @@
4
4
  * @param {string} name
5
5
  * @returns mongoose.Model
6
6
  */
7
- export function loadModel(definition: object, name: string): mongoose.Model<any, any, any, any, any, mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, any, any, any, {
8
- [x: string]: any;
9
- }, {
10
- autoIndex?: boolean;
11
- autoCreate?: boolean;
12
- bufferCommands?: boolean;
13
- bufferTimeoutMS?: number;
14
- capped?: number | boolean | {
15
- size?: number;
16
- max?: number;
17
- autoIndexId?: boolean;
18
- };
19
- collation?: mongoose.mongo.CollationOptions;
20
- collectionOptions?: mongoose.mongo.CreateCollectionOptions;
21
- timeseries?: mongoose.mongo.TimeSeriesCollectionOptions;
22
- expireAfterSeconds?: number;
23
- expires?: string | number;
24
- collection?: string;
25
- discriminatorKey?: string;
26
- excludeIndexes?: boolean;
27
- id?: boolean;
28
- _id?: boolean;
29
- minimize?: boolean;
30
- optimisticConcurrency?: boolean;
31
- pluginTags?: string[];
32
- read?: string;
33
- writeConcern?: mongoose.mongo.WriteConcern;
34
- safe?: boolean | {
35
- w?: string | number;
36
- wtimeout?: number;
37
- j?: boolean;
38
- };
39
- shardKey?: Record<string, unknown>;
40
- strict?: boolean | "throw";
41
- strictQuery?: boolean | "throw";
42
- toJSON: {
43
- getters: boolean;
44
- versionKey: boolean;
45
- transform: (doc: any, ret: any, options: any) => void;
46
- } | mongoose.ToObjectOptions<any>;
47
- toObject: {
48
- getters: boolean;
49
- versionKey: boolean;
50
- transform: (doc: any, ret: any, options: any) => void;
51
- } | mongoose.ToObjectOptions<any>;
52
- typeKey?: string;
53
- validateBeforeSave?: boolean;
54
- validateModifiedOnly?: boolean;
55
- versionKey?: string | boolean;
56
- selectPopulatedPaths?: boolean;
57
- skipVersioning?: {
58
- [key: string]: boolean;
59
- };
60
- storeSubdocValidationError?: boolean;
61
- timestamps: boolean | mongoose.SchemaTimestampsConfig;
62
- suppressReservedKeysWarning?: boolean;
63
- statics?: {
64
- [x: string]: any;
65
- };
66
- methods?: any;
67
- query?: any;
68
- castNonArrays?: boolean;
69
- virtuals?: mongoose.SchemaOptionsVirtualsPropertyType<any, any, any>;
70
- overwriteModels?: boolean;
71
- }, any, any>> & {
72
- [x: string]: any;
73
- };
7
+ export function loadModel(definition: object, name: string): any;
74
8
  /**
75
9
  * Loads all model definitions in the given directory.
76
10
  * Returns the full loaded model set.
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,sCAJW,MAAM,QACN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAahB;AAED;;;;GAIG;AACH,sCAFW,MAAM,mBAkBhB"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,sCAJW,MAAM,QACN,MAAM,OAahB;AAED;;;;GAIG;AACH,sCAFW,MAAM,mBAkBhB"}
package/types/schema.d.ts CHANGED
@@ -6,10 +6,9 @@
6
6
  * @param {mongoose.SchemaOptions} options
7
7
  * @returns mongoose.Schema
8
8
  */
9
- export function createSchema(definition: object, options?: mongoose.SchemaOptions): mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, any, any, any, {
10
- [x: string]: any;
11
- }, {
9
+ export function createSchema(definition: object, options?: mongoose.SchemaOptions): mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, any, any, any, any, {
12
10
  autoIndex?: boolean;
11
+ autoSearchIndex?: boolean;
13
12
  autoCreate?: boolean;
14
13
  bufferCommands?: boolean;
15
14
  bufferTimeoutMS?: number;
@@ -32,6 +31,9 @@ export function createSchema(definition: object, options?: mongoose.SchemaOption
32
31
  optimisticConcurrency?: boolean;
33
32
  pluginTags?: string[];
34
33
  read?: string;
34
+ readConcern?: {
35
+ level: "local" | "available" | "majority" | "snapshot" | "linearizable";
36
+ };
35
37
  writeConcern?: mongoose.mongo.WriteConcern;
36
38
  safe?: boolean | {
37
39
  w?: string | number;
@@ -62,10 +64,8 @@ export function createSchema(definition: object, options?: mongoose.SchemaOption
62
64
  storeSubdocValidationError?: boolean;
63
65
  timestamps: boolean | mongoose.SchemaTimestampsConfig;
64
66
  suppressReservedKeysWarning?: boolean;
65
- statics?: {
66
- [x: string]: any;
67
- };
68
- methods?: any;
67
+ statics?: mongoose.AddThisParameter<any, mongoose.Model<any, {}, {}, {}, any, any>>;
68
+ methods?: mongoose.AddThisParameter<any, any> & mongoose.AnyObject;
69
69
  query?: any;
70
70
  castNonArrays?: boolean;
71
71
  virtuals?: mongoose.SchemaOptionsVirtualsPropertyType<any, any, any>;
package/types/search.d.ts CHANGED
@@ -11,7 +11,7 @@ export function searchValidation(options?: {}): {
11
11
  meta: {};
12
12
  required(): any;
13
13
  default(arg: any): any;
14
- custom(...args: import("@bedrockio/yada/types/Schema").CustomSignature): any;
14
+ custom(fn: Function): any;
15
15
  strip(strip: any): any;
16
16
  allow(...set: any[]): any;
17
17
  reject(...set: any[]): any;
package/types/utils.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export function isEqual(a: any, b: any): boolean;
1
2
  export function isMongooseSchema(obj: any): boolean;
2
3
  export function isReferenceField(obj: any, path: any): boolean;
3
4
  export function isDateField(obj: any, path: any): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.js"],"names":[],"mappings":"AAEA,oDAEC;AAED,+DAEC;AAED,0DAEC;AAED,4DAEC;AAOD,mDAGC;AAuBD,mDAYC;AAKD,wDAEC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.js"],"names":[],"mappings":"AAMA,iDAcC;AAED,oDAEC;AAED,+DAEC;AAED,0DAEC;AAED,4DAEC;AAOD,mDAGC;AAuBD,mDAYC;AAKD,wDAEC"}
@@ -73,7 +73,7 @@ export const OBJECT_ID_SCHEMA: {
73
73
  assertions: any[];
74
74
  meta: {};
75
75
  default(arg: any): any;
76
- custom(...args: import("@bedrockio/yada/types/Schema").CustomSignature): any;
76
+ custom(fn: Function): any;
77
77
  strip(strip: any): any;
78
78
  allow(...set: any[]): any;
79
79
  reject(...set: any[]): any;