@bedrockio/model 0.1.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 (54) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +932 -0
  3. package/babel.config.cjs +41 -0
  4. package/dist/cjs/access.js +66 -0
  5. package/dist/cjs/assign.js +50 -0
  6. package/dist/cjs/const.js +16 -0
  7. package/dist/cjs/errors.js +17 -0
  8. package/dist/cjs/include.js +222 -0
  9. package/dist/cjs/index.js +62 -0
  10. package/dist/cjs/load.js +40 -0
  11. package/dist/cjs/package.json +1 -0
  12. package/dist/cjs/references.js +104 -0
  13. package/dist/cjs/schema.js +277 -0
  14. package/dist/cjs/search.js +266 -0
  15. package/dist/cjs/serialization.js +55 -0
  16. package/dist/cjs/slug.js +47 -0
  17. package/dist/cjs/soft-delete.js +192 -0
  18. package/dist/cjs/testing.js +33 -0
  19. package/dist/cjs/utils.js +73 -0
  20. package/dist/cjs/validation.js +313 -0
  21. package/dist/cjs/warn.js +13 -0
  22. package/jest-mongodb-config.js +10 -0
  23. package/jest.config.js +8 -0
  24. package/package.json +53 -0
  25. package/src/access.js +60 -0
  26. package/src/assign.js +45 -0
  27. package/src/const.js +9 -0
  28. package/src/errors.js +9 -0
  29. package/src/include.js +209 -0
  30. package/src/index.js +5 -0
  31. package/src/load.js +37 -0
  32. package/src/references.js +101 -0
  33. package/src/schema.js +286 -0
  34. package/src/search.js +263 -0
  35. package/src/serialization.js +49 -0
  36. package/src/slug.js +45 -0
  37. package/src/soft-delete.js +234 -0
  38. package/src/testing.js +29 -0
  39. package/src/utils.js +63 -0
  40. package/src/validation.js +329 -0
  41. package/src/warn.js +7 -0
  42. package/test/assign.test.js +225 -0
  43. package/test/definitions/custom-model.json +9 -0
  44. package/test/definitions/special-category.json +18 -0
  45. package/test/include.test.js +896 -0
  46. package/test/load.test.js +47 -0
  47. package/test/references.test.js +71 -0
  48. package/test/schema.test.js +919 -0
  49. package/test/search.test.js +652 -0
  50. package/test/serialization.test.js +748 -0
  51. package/test/setup.js +27 -0
  52. package/test/slug.test.js +112 -0
  53. package/test/soft-delete.test.js +333 -0
  54. package/test/validation.test.js +1925 -0
@@ -0,0 +1,47 @@
1
+ import mongoose from 'mongoose';
2
+
3
+ import { loadModel, loadModelDir } from '../src/load';
4
+
5
+ describe('loadModel', () => {
6
+ it('should create basic model', async () => {
7
+ expect(!!mongoose.models.Box).toBe(false);
8
+ const Box = loadModel(
9
+ {
10
+ attributes: {
11
+ name: {
12
+ type: 'String',
13
+ validate: /[a-z]/,
14
+ },
15
+ },
16
+ },
17
+ 'Box'
18
+ );
19
+ expect(!!mongoose.models.Box).toBe(true);
20
+ const box = new Box({ name: 'foo' });
21
+
22
+ expect(box.name).toBe('foo');
23
+
24
+ await expect(async () => {
25
+ box.name = 'FOO';
26
+ await box.save();
27
+ }).rejects.toThrow();
28
+ });
29
+ });
30
+
31
+ describe('loadModelDir', () => {
32
+ it('should create models from a folder', async () => {
33
+ expect(!!mongoose.models.SpecialCategory).toBe(false);
34
+ expect(!!mongoose.models.CustomModel).toBe(false);
35
+ loadModelDir('test/definitions');
36
+ expect(!!mongoose.models.SpecialCategory).toBe(true);
37
+ const { SpecialCategory } = mongoose.models;
38
+ await SpecialCategory.deleteMany({});
39
+ const someRef = mongoose.Types.ObjectId();
40
+ const category = new SpecialCategory({ name: 'foo', someRef, count: 3 });
41
+ await category.save();
42
+ const foundCategory = await SpecialCategory.findOne();
43
+ expect(foundCategory.name).toBe('foo');
44
+ expect(foundCategory.someRef.toString()).toBe(someRef.toString());
45
+ expect(foundCategory.count).toBe(3);
46
+ });
47
+ });
@@ -0,0 +1,71 @@
1
+ import mongoose from 'mongoose';
2
+
3
+ import { createTestModel } from '../src/testing';
4
+
5
+ const User = createTestModel({
6
+ name: {
7
+ type: 'String',
8
+ required: true,
9
+ },
10
+ });
11
+ const Shop = createTestModel({
12
+ user: {
13
+ ref: User.modelName,
14
+ type: mongoose.Schema.Types.ObjectId,
15
+ },
16
+ });
17
+
18
+ describe('assertNoReferences', () => {
19
+ it('should throw error if document is referenced externally', async () => {
20
+ const user1 = await User.create({ name: 'foo ' });
21
+ const user2 = await User.create({ name: 'foo ' });
22
+ await Shop.create({ user: user1 });
23
+
24
+ await expect(async () => {
25
+ await user1.assertNoReferences();
26
+ }).rejects.toThrow('Refusing to delete.');
27
+
28
+ await expect(
29
+ user1.assertNoReferences({
30
+ except: [Shop],
31
+ })
32
+ ).resolves.not.toThrow();
33
+
34
+ await expect(
35
+ user1.assertNoReferences({
36
+ except: [Shop.modelName],
37
+ })
38
+ ).resolves.not.toThrow();
39
+
40
+ await expect(user2.assertNoReferences()).resolves.not.toThrow();
41
+ });
42
+
43
+ it('should expose references on the error object', async () => {
44
+ const user1 = await User.create({ name: 'foo ' });
45
+ await User.create({ name: 'foo ' });
46
+ const shop = await Shop.create({ user: user1 });
47
+
48
+ try {
49
+ await user1.assertNoReferences();
50
+ } catch (error) {
51
+ expect(error.references).toEqual([
52
+ {
53
+ model: Shop,
54
+ count: 1,
55
+ ids: [shop.id],
56
+ },
57
+ ]);
58
+ }
59
+ });
60
+
61
+ it('should throw error exception is unknown model', async () => {
62
+ const User = createTestModel();
63
+ const user = await User.create({});
64
+
65
+ await expect(
66
+ user.assertNoReferences({
67
+ except: ['BadModelName'],
68
+ })
69
+ ).rejects.toThrow('Unknown model "BadModelName".');
70
+ });
71
+ });