@nymphjs/nymph 1.0.0-beta.12 → 1.0.0-beta.121

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 (103) hide show
  1. package/CHANGELOG.md +588 -0
  2. package/README.md +23 -21
  3. package/dist/Entity.d.ts +295 -12
  4. package/dist/Entity.js +560 -148
  5. package/dist/Entity.js.map +1 -1
  6. package/dist/Entity.test.js +52 -13
  7. package/dist/Entity.test.js.map +1 -1
  8. package/dist/Entity.types.d.ts +256 -23
  9. package/dist/Entity.types.js +1 -2
  10. package/dist/Nymph.d.ts +590 -13
  11. package/dist/Nymph.js +846 -180
  12. package/dist/Nymph.js.map +1 -1
  13. package/dist/Nymph.types.d.ts +131 -8
  14. package/dist/Nymph.types.js +47 -5
  15. package/dist/Nymph.types.js.map +1 -1
  16. package/dist/conf/defaults.d.ts +1 -1
  17. package/dist/conf/defaults.js +26 -3
  18. package/dist/conf/defaults.js.map +1 -1
  19. package/dist/conf/index.d.ts +50 -2
  20. package/dist/conf/index.js +2 -8
  21. package/dist/conf/index.js.map +1 -1
  22. package/dist/driver/NymphDriver.d.ts +205 -40
  23. package/dist/driver/NymphDriver.js +712 -238
  24. package/dist/driver/NymphDriver.js.map +1 -1
  25. package/dist/driver/index.d.ts +1 -2
  26. package/dist/driver/index.js +2 -23
  27. package/dist/driver/index.js.map +1 -1
  28. package/dist/driver/testArtifacts.d.ts +4 -4
  29. package/dist/driver/testArtifacts.js +1920 -1086
  30. package/dist/driver/testArtifacts.js.map +1 -1
  31. package/dist/errors/ClassNotAvailableError.js +1 -5
  32. package/dist/errors/ClassNotAvailableError.js.map +1 -1
  33. package/dist/errors/EntityConflictError.js +1 -5
  34. package/dist/errors/EntityConflictError.js.map +1 -1
  35. package/dist/errors/EntityInvalidDataError.d.ts +6 -0
  36. package/dist/errors/EntityInvalidDataError.js +8 -6
  37. package/dist/errors/EntityInvalidDataError.js.map +1 -1
  38. package/dist/errors/EntityIsSleepingReferenceError.js +1 -5
  39. package/dist/errors/EntityIsSleepingReferenceError.js.map +1 -1
  40. package/dist/errors/EntityUniqueConstraintError.d.ts +3 -0
  41. package/dist/errors/EntityUniqueConstraintError.js +7 -0
  42. package/dist/errors/EntityUniqueConstraintError.js.map +1 -0
  43. package/dist/errors/HttpError.d.ts +5 -0
  44. package/dist/errors/HttpError.js +11 -0
  45. package/dist/errors/HttpError.js.map +1 -0
  46. package/dist/errors/InvalidParametersError.js +1 -5
  47. package/dist/errors/InvalidParametersError.js.map +1 -1
  48. package/dist/errors/InvalidStateError.d.ts +3 -0
  49. package/dist/errors/InvalidStateError.js +7 -0
  50. package/dist/errors/InvalidStateError.js.map +1 -0
  51. package/dist/errors/NotConfiguredError.js +1 -5
  52. package/dist/errors/NotConfiguredError.js.map +1 -1
  53. package/dist/errors/QueryFailedError.d.ts +2 -1
  54. package/dist/errors/QueryFailedError.js +5 -6
  55. package/dist/errors/QueryFailedError.js.map +1 -1
  56. package/dist/errors/UnableToConnectError.js +1 -5
  57. package/dist/errors/UnableToConnectError.js.map +1 -1
  58. package/dist/errors/index.d.ts +11 -8
  59. package/dist/errors/index.js +11 -24
  60. package/dist/errors/index.js.map +1 -1
  61. package/dist/index.d.ts +11 -11
  62. package/dist/index.js +14 -34
  63. package/dist/index.js.map +1 -1
  64. package/dist/nymphJoiProps.d.ts +1 -1
  65. package/dist/nymphJoiProps.js +10 -15
  66. package/dist/nymphJoiProps.js.map +1 -1
  67. package/dist/testArtifacts.d.ts +19 -6
  68. package/dist/testArtifacts.js +32 -37
  69. package/dist/testArtifacts.js.map +1 -1
  70. package/dist/testMocks.d.ts +27 -12
  71. package/dist/testMocks.js +40 -29
  72. package/dist/testMocks.js.map +1 -1
  73. package/dist/utils.d.ts +4 -4
  74. package/dist/utils.js +40 -29
  75. package/dist/utils.js.map +1 -1
  76. package/jest.config.js +31 -5
  77. package/package.json +33 -23
  78. package/src/Entity.test.ts +50 -7
  79. package/src/Entity.ts +489 -150
  80. package/src/Entity.types.ts +72 -74
  81. package/src/Nymph.ts +991 -324
  82. package/src/Nymph.types.ts +201 -27
  83. package/src/conf/defaults.ts +34 -1
  84. package/src/conf/index.ts +50 -2
  85. package/src/driver/NymphDriver.ts +898 -413
  86. package/src/driver/index.ts +1 -3
  87. package/src/driver/testArtifacts.ts +2557 -1629
  88. package/src/errors/EntityUniqueConstraintError.ts +6 -0
  89. package/src/errors/HttpError.ts +12 -0
  90. package/src/errors/InvalidStateError.ts +6 -0
  91. package/src/errors/QueryFailedError.ts +3 -1
  92. package/src/errors/index.ts +14 -8
  93. package/src/index.ts +11 -11
  94. package/src/nymphJoiProps.ts +2 -2
  95. package/src/testArtifacts.ts +20 -20
  96. package/src/testMocks.ts +76 -35
  97. package/src/utils.ts +39 -18
  98. package/tsconfig.json +6 -3
  99. package/typedoc.json +4 -0
  100. package/dist/conf/d.d.ts +0 -6
  101. package/dist/conf/d.js +0 -3
  102. package/dist/conf/d.js.map +0 -1
  103. package/src/conf/d.ts +0 -24
package/dist/utils.js CHANGED
@@ -1,23 +1,15 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.sortObj = exports.referencesToEntities = exports.entitiesToReferences = exports.classNamesToEntityConstructors = exports.uniqueStrings = exports.xor = void 0;
7
- const Entity_1 = __importDefault(require("./Entity"));
8
- function xor(a, b) {
1
+ import Entity from './Entity.js';
2
+ export function xor(a, b) {
9
3
  return !!(a && !b) || (!a && b);
10
4
  }
11
- exports.xor = xor;
12
- function uniqueStrings(array) {
5
+ export function uniqueStrings(array) {
13
6
  const obj = {};
14
7
  for (let i = 0; i < array.length; ++i) {
15
8
  obj[array[i]] = true;
16
9
  }
17
10
  return Object.keys(obj);
18
11
  }
19
- exports.uniqueStrings = uniqueStrings;
20
- function classNamesToEntityConstructors(nymph, selectors) {
12
+ export function classNamesToEntityConstructors(nymph, selectors, enforceRestEnabledFlag = false) {
21
13
  const newSelectors = [];
22
14
  for (const curSelector of selectors) {
23
15
  const newSelector = { type: curSelector.type };
@@ -37,24 +29,31 @@ function classNamesToEntityConstructors(nymph, selectors) {
37
29
  for (let i = 0; i < tmpArr.length; i++) {
38
30
  const name = tmpArr[i][0];
39
31
  const [qrefOptions, ...selectors] = tmpArr[i][1];
40
- const QrefEntityClass = typeof qrefOptions.class === 'string'
32
+ const QrefEntityClass = qrefOptions.class
41
33
  ? nymph.getEntityClass(qrefOptions.class)
42
- : qrefOptions.class ?? nymph.getEntityClass('Entity');
34
+ : nymph.getEntityClass('Entity');
35
+ if (enforceRestEnabledFlag && !QrefEntityClass.restEnabled) {
36
+ throw new Error('Not accessible.');
37
+ }
43
38
  const options = { ...qrefOptions, class: QrefEntityClass };
44
39
  if (!newSelector[key]) {
45
40
  newSelector[key] = [];
46
41
  }
47
42
  newSelector[key].push([
48
43
  name,
49
- [options, ...classNamesToEntityConstructors(nymph, selectors)],
44
+ [
45
+ options,
46
+ ...classNamesToEntityConstructors(nymph, selectors, enforceRestEnabledFlag),
47
+ ],
50
48
  ]);
51
49
  }
52
50
  }
53
51
  else if (key === 'selector' || key === '!selector') {
54
52
  const tmpArr = (Array.isArray(value) ? value : [value]);
55
- newSelector[key] = classNamesToEntityConstructors(nymph, tmpArr);
53
+ newSelector[key] = classNamesToEntityConstructors(nymph, tmpArr, enforceRestEnabledFlag);
56
54
  }
57
55
  else {
56
+ // @ts-ignore: ts doesn't know what value is here.
58
57
  newSelector[key] = value;
59
58
  }
60
59
  }
@@ -62,26 +61,35 @@ function classNamesToEntityConstructors(nymph, selectors) {
62
61
  }
63
62
  return newSelectors;
64
63
  }
65
- exports.classNamesToEntityConstructors = classNamesToEntityConstructors;
66
- function entitiesToReferences(item) {
67
- if (item instanceof Entity_1.default && typeof item.$toReference === 'function') {
68
- return item.$toReference();
64
+ export function entitiesToReferences(item, existingOnly) {
65
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
66
+ return item;
67
+ }
68
+ else if (item instanceof Entity &&
69
+ typeof item.$toReference === 'function') {
70
+ // Convert entities to references.
71
+ return item.$toReference(existingOnly);
69
72
  }
70
73
  else if (Array.isArray(item)) {
71
- return item.map((entry) => entitiesToReferences(entry));
74
+ // Recurse into lower arrays.
75
+ return item.map((entry) => entitiesToReferences(entry, existingOnly));
72
76
  }
73
77
  else if (item instanceof Object) {
74
78
  let newObj = Object.create(item);
75
79
  for (let [key, value] of Object.entries(item)) {
76
- newObj[key] = entitiesToReferences(value);
80
+ newObj[key] = entitiesToReferences(value, existingOnly);
77
81
  }
78
82
  return newObj;
79
83
  }
84
+ // Not an entity or array, just return it.
80
85
  return item;
81
86
  }
82
- exports.entitiesToReferences = entitiesToReferences;
83
- function referencesToEntities(item, nymph, useSkipAc = false) {
84
- if (Array.isArray(item)) {
87
+ export function referencesToEntities(item, nymph, useSkipAc = false) {
88
+ if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) {
89
+ return item;
90
+ }
91
+ else if (Array.isArray(item)) {
92
+ // Check if it's a reference.
85
93
  if (item[0] === 'nymph_entity_reference') {
86
94
  try {
87
95
  const EntityClass = nymph.getEntityClass(item[2]);
@@ -95,26 +103,29 @@ function referencesToEntities(item, nymph, useSkipAc = false) {
95
103
  }
96
104
  }
97
105
  else {
106
+ // Recurse into lower arrays.
98
107
  return item.map((entry) => referencesToEntities(entry, nymph, useSkipAc));
99
108
  }
100
109
  }
101
- else if (Entity_1.default && item instanceof Object && !(item instanceof Entity_1.default)) {
110
+ else if (Entity && item instanceof Object && !(item instanceof Entity)) {
102
111
  for (let [key, value] of Object.entries(item)) {
103
112
  item[key] = referencesToEntities(value, nymph);
104
113
  }
105
114
  }
115
+ // Not an array, just return it.
106
116
  return item;
107
117
  }
108
- exports.referencesToEntities = referencesToEntities;
109
- function sortObj(obj) {
118
+ export function sortObj(obj) {
119
+ // adapted from
120
+ // http://am.aurlien.net/post/1221493460/sorting-javascript-objects
110
121
  const tempArray = Object.keys(obj);
111
122
  tempArray.sort();
112
123
  for (let i = 0; i < tempArray.length; i++) {
113
124
  const temp = obj[tempArray[i]];
114
125
  delete obj[tempArray[i]];
126
+ // @ts-ignore: string can't be used to index type T?? yes, it can.
115
127
  obj[tempArray[i]] = temp;
116
128
  }
117
129
  return obj;
118
130
  }
119
- exports.sortObj = sortObj;
120
131
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/jest.config.js CHANGED
@@ -1,6 +1,32 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
3
- preset: 'ts-jest',
4
- testEnvironment: 'node',
5
- rootDir: 'src/',
1
+ const jestConfig = {
2
+ extensionsToTreatAsEsm: ['.ts', '.tsx'],
3
+ testMatch: [
4
+ '<rootDir>/src/**/__tests__/**/*.{js,ts,jsx,tsx,mjs,mts}',
5
+ '<rootDir>/src/**/?(*.)(spec|test).{js,ts,jsx,tsx,mjs,mts}',
6
+ ],
7
+ transform: {
8
+ '^.+\\.(ts|tsx|mts)$': [
9
+ '@swc/jest',
10
+ {
11
+ jsc: {
12
+ parser: {
13
+ syntax: 'typescript',
14
+ tsx: true,
15
+ decorators: true,
16
+ },
17
+ target: 'es2023',
18
+ },
19
+ module: {
20
+ type: 'commonjs',
21
+ },
22
+ },
23
+ ],
24
+ },
25
+ transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$'],
26
+ moduleDirectories: ['node_modules', 'src'],
27
+ moduleNameMapper: {
28
+ '^(\\.|\\.\\.)\\/(.+)\\.js': '$1/$2',
29
+ },
6
30
  };
31
+
32
+ export default jestConfig;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@nymphjs/nymph",
3
- "version": "1.0.0-beta.12",
4
- "description": "NymphJS - Nymph ORM",
5
- "type": "commonjs",
3
+ "version": "1.0.0-beta.121",
4
+ "description": "Nymph.js - Nymph ORM",
5
+ "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "keywords": [
@@ -14,38 +14,48 @@
14
14
  "clean": "test -d dist && rm -r dist || true",
15
15
  "build": "tsc",
16
16
  "watch": "tsc --watch",
17
- "prepare": "npm run clean && npm run build",
18
- "test": "jest",
19
- "test:watch": "jest --watch"
17
+ "prepublish": "npm run clean && npm run build",
18
+ "typecheck": "npx tsc --noEmit",
19
+ "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests",
20
+ "test:watch": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests --watch"
20
21
  },
21
22
  "publishConfig": {
22
23
  "access": "public"
23
24
  },
25
+ "homepage": "https://nymph.io",
24
26
  "repository": {
25
27
  "type": "git",
26
- "url": "git+https://github.com/sciactive/nymphjs.git"
28
+ "url": "https://forge.sciactive.com/sciactive/nymphjs.git",
29
+ "directory": "packages/nymph"
27
30
  },
28
- "author": "Hunter Perrin <hperrin@gmail.com>",
31
+ "author": "Hunter Perrin <hperrin@port87.com>",
29
32
  "bugs": {
30
- "url": "https://github.com/sciactive/nymphjs/issues"
33
+ "url": "https://forge.sciactive.com/sciactive/nymphjs/issues"
31
34
  },
32
35
  "license": "Apache-2.0",
33
36
  "dependencies": {
34
- "@nymphjs/guid": "^1.0.0-beta.12",
35
- "joi": "^17.8.3",
36
- "locutus": "^2.0.16",
37
- "lodash": "^4.17.21",
38
- "n-readlines": "^1.0.3"
37
+ "@nymphjs/guid": "^1.0.0-beta.121",
38
+ "@sciactive/tokenizer": "^3.4.0",
39
+ "debug": "^4.4.3",
40
+ "joi": "^18.2.5",
41
+ "locutus": "^3.0.36",
42
+ "lodash-es": "^4.18.1",
43
+ "n-readlines": "^3.4.1"
39
44
  },
40
45
  "devDependencies": {
41
- "@tsconfig/recommended": "^1.0.2",
42
- "@types/jest": "^29.4.0",
43
- "@types/locutus": "^0.0.6",
44
- "@types/lodash": "^4.14.191",
45
- "@types/n-readlines": "^1.0.3",
46
- "jest": "^29.4.3",
47
- "ts-jest": "^29.0.5",
48
- "typescript": "^4.9.5"
46
+ "@swc/core": "^1.16.1",
47
+ "@swc/jest": "^0.2.39",
48
+ "@tsconfig/recommended": "^1.0.13",
49
+ "@types/debug": "^4.1.13",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/locutus": "^0.0.8",
52
+ "@types/lodash-es": "^4.17.12",
53
+ "@types/n-readlines": "^1.0.6",
54
+ "@types/node": "^26.2.0",
55
+ "cross-env": "^10.1.0",
56
+ "jest": "^30.4.2",
57
+ "ts-node": "^10.9.2",
58
+ "typescript": "^7.0.2"
49
59
  },
50
- "gitHead": "976040d986831ee0b9a15990adb7e8a48a5379e8"
60
+ "gitHead": "74e39aff81353d16831656431e97b66ac6effc18"
51
61
  }
@@ -1,10 +1,13 @@
1
- import { MockNymph } from './testMocks';
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { cloneDeep } from 'lodash-es';
4
+
5
+ import { MockNymph } from './testMocks.js';
2
6
  import {
3
7
  TestBModel as TestBModelClass,
4
8
  TestModel as TestModelClass,
5
9
  TestModelData,
6
- } from './testArtifacts';
7
- import { cloneDeep } from 'lodash';
10
+ } from './testArtifacts.js';
8
11
 
9
12
  const nymph = new MockNymph();
10
13
 
@@ -142,7 +145,7 @@ describe('Entity', () => {
142
145
  await testEntity.$refresh();
143
146
 
144
147
  expect(testEntityCopy.mdate ?? Infinity).toBeLessThanOrEqual(
145
- testEntity.mdate ?? 0
148
+ testEntity.mdate ?? 0,
146
149
  );
147
150
  });
148
151
 
@@ -156,13 +159,25 @@ describe('Entity', () => {
156
159
  ]);
157
160
  });
158
161
 
162
+ it('toReference works even on an unsaved entity', () => {
163
+ const unsavedEntity = TestModel.factorySync();
164
+ const reference = unsavedEntity.$toReference();
165
+
166
+ expect(unsavedEntity.guid).toBeNull();
167
+ expect(reference).toEqual([
168
+ 'nymph_entity_reference',
169
+ unsavedEntity.$getGuaranteedGUID(),
170
+ 'TestModel',
171
+ ]);
172
+ });
173
+
159
174
  it('tags work', async () => {
160
175
  expect(testEntity.$hasTag('test')).toEqual(true);
161
176
  testEntity.$addTag('test', 'test2');
162
177
  expect(testEntity.$hasTag('test', 'test2')).toEqual(true);
163
178
  testEntity.$addTag('test', 'test3', 'test4', 'test5', 'test6');
164
179
  expect(
165
- testEntity.$hasTag('test', 'test3', 'test4', 'test5', 'test6')
180
+ testEntity.$hasTag('test', 'test3', 'test4', 'test5', 'test6'),
166
181
  ).toEqual(true);
167
182
  testEntity.$removeTag('test2');
168
183
  expect(testEntity.$hasTag('test2')).toEqual(false);
@@ -183,27 +198,34 @@ describe('Entity', () => {
183
198
  expect(testEntity.$hasTag('test')).toEqual(true);
184
199
  });
185
200
 
186
- it('references works', async () => {
201
+ it('references work', async () => {
187
202
  await testEntity.$refresh();
188
203
 
204
+ await testEntity.reference?.$wake();
189
205
  expect(testEntity.reference?.guid).toEqual(entityReferenceGuid);
206
+ await Promise.all(testEntity.refArray?.map((e) => e.$wake()) || []);
190
207
  expect(testEntity.refArray?.[0].guid).toEqual(entityReferenceGuid);
208
+ await testEntity.refObject?.entity.$wake();
191
209
  expect(testEntity.refObject?.entity.guid).toEqual(entityReferenceGuid);
192
210
 
193
211
  const entity = await TestModel.factory(testEntity.guid as string);
194
212
 
213
+ await entity.reference?.$wake();
195
214
  expect(entity.reference?.guid).toEqual(entityReferenceGuid);
215
+ await Promise.all(entity.refArray?.map((e) => e.$wake()) || []);
196
216
  expect(entity.refArray?.[0].guid).toEqual(entityReferenceGuid);
217
+ await entity.refObject?.entity.$wake();
197
218
  expect(entity.refObject?.entity.guid).toEqual(entityReferenceGuid);
198
219
  });
199
220
 
200
- it('sleeping references wake up', () => {
221
+ it('sleeping references wake up', async () => {
201
222
  const entity = TestModel.factoryReference([
202
223
  'nymph_entity_reference',
203
224
  testEntity.guid as string,
204
225
  'TestModel',
205
226
  ]) as TestModelClass & TestModelData;
206
227
 
228
+ await entity.$wake();
207
229
  expect(entity.guid).toEqual(testEntity.guid);
208
230
  expect(entity.cdate).toEqual(testEntity.cdate);
209
231
  expect(entity.mdate).toEqual(testEntity.mdate);
@@ -213,8 +235,11 @@ describe('Entity', () => {
213
235
  expect(entity.string).toEqual('test');
214
236
  expect(entity.array).toEqual(['full', 'of', 'values', 500]);
215
237
  expect(entity.number).toEqual(30);
238
+ await entity.reference?.$wake();
216
239
  expect(entity.reference?.guid).toEqual(entityReferenceGuid);
240
+ await Promise.all(entity.refArray?.map((e) => e.$wake()) || []);
217
241
  expect(entity.refArray?.[0].guid).toEqual(entityReferenceGuid);
242
+ await entity.refObject?.entity.$wake();
218
243
  expect(entity.refObject?.entity.guid).toEqual(entityReferenceGuid);
219
244
  });
220
245
 
@@ -239,6 +264,7 @@ describe('Entity', () => {
239
264
  array: ['full', 'of', 'values', 500],
240
265
  string: 'test',
241
266
  null: null,
267
+ uniques: [],
242
268
  },
243
269
  class: 'TestModel',
244
270
  });
@@ -288,8 +314,11 @@ describe('Entity', () => {
288
314
  expect(testEntity.string).toEqual('good');
289
315
  expect(testEntity.array).toEqual(['imanarray']);
290
316
  expect(testEntity.number).toEqual(30);
317
+ await testEntity.reference?.$wake();
291
318
  expect(testEntity.reference?.guid).toEqual(entityReferenceGuid);
319
+ await Promise.all(testEntity.refArray?.map((e) => e.$wake()) || []);
292
320
  expect(testEntity.refArray?.[0].guid).toEqual(entityReferenceGuid);
321
+ await testEntity.refObject?.entity.$wake();
293
322
  expect(testEntity.refObject?.entity.guid).toEqual(entityReferenceGuid);
294
323
 
295
324
  expect(await testEntity.$refresh()).toEqual(true);
@@ -311,7 +340,9 @@ describe('Entity', () => {
311
340
  expect(testEntity.$hasTag('notag')).toEqual(false);
312
341
  expect(testEntity.$hasTag('test')).toEqual(true);
313
342
  expect(testEntity.$hasTag('newtag')).toEqual(true);
343
+ await testEntity.reference?.$wake();
314
344
  expect(testEntity.reference?.guid).toEqual(entityReferenceGuid);
345
+ await Promise.all(testEntity.refArray?.map((e) => e.$wake()) || []);
315
346
  expect(testEntity.refArray?.[0].guid).toEqual(entityReferenceGuid);
316
347
 
317
348
  expect(await testEntity.$refresh()).toEqual(true);
@@ -403,4 +434,16 @@ describe('Entity', () => {
403
434
 
404
435
  expect(thrown).toEqual(true);
405
436
  });
437
+
438
+ it('JSON with new entities works', async () => {
439
+ testEntity.reference = await TestModel.factory();
440
+
441
+ // Test that an old JSON payload causes a conflict.
442
+ const json = JSON.stringify(testEntity);
443
+ const data = JSON.parse(json);
444
+
445
+ testEntity.$jsonAcceptData(data);
446
+
447
+ expect(testEntity.reference.guid).toBeNull();
448
+ });
406
449
  });