json-fs-query 0.1.0 → 1.0.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 (212) hide show
  1. package/README.md +41 -6
  2. package/browser/jsonFsQuery.js +28271 -0
  3. package/browser/jsonFsQuery.min.js +1 -0
  4. package/dist/data/introspect/create.js +6 -4
  5. package/dist/data/introspect/create.min.js +1 -1
  6. package/dist/data/introspect/drop.js +2 -2
  7. package/dist/data/introspect/drop.min.js +1 -1
  8. package/dist/data/introspect/policies/hasDependents.d.ts +13 -0
  9. package/dist/data/introspect/policies/hasDependents.js +52 -0
  10. package/dist/data/introspect/policies/hasDependents.min.js +1 -0
  11. package/dist/data/introspect/policies/keyGenerate.js +1 -1
  12. package/dist/data/introspect/policies/keyGenerate.min.js +1 -1
  13. package/dist/data/introspect/policies/keyUnique.d.ts +9 -1
  14. package/dist/data/introspect/policies/keyUnique.js +19 -9
  15. package/dist/data/introspect/policies/keyUnique.min.js +1 -1
  16. package/dist/data/queries/deleteEntity.js +36 -15
  17. package/dist/data/queries/deleteEntity.min.js +1 -1
  18. package/dist/data/queries/groupBy.js +22 -22
  19. package/dist/data/queries/groupBy.min.js +1 -1
  20. package/dist/data/queries/insertEntity.js +14 -12
  21. package/dist/data/queries/insertEntity.min.js +1 -1
  22. package/dist/data/queries/readEntity.js +1 -1
  23. package/dist/data/queries/readEntity.min.js +1 -1
  24. package/dist/data/queries/updateEntity.js +68 -42
  25. package/dist/data/queries/updateEntity.min.js +1 -1
  26. package/dist/data/queries/where.js +1 -1
  27. package/dist/data/queries/where.min.js +1 -1
  28. package/dist/data/utilities/computeKeyValue.d.ts +13 -0
  29. package/dist/data/utilities/computeKeyValue.js +26 -0
  30. package/dist/data/utilities/computeKeyValue.min.js +1 -0
  31. package/dist/data/utilities/config.d.ts +28 -0
  32. package/dist/data/utilities/config.js +45 -0
  33. package/dist/data/utilities/config.min.js +1 -0
  34. package/dist/data/utilities/deregisterRecord.js +2 -2
  35. package/dist/data/utilities/deregisterRecord.min.js +1 -1
  36. package/dist/data/utilities/getConditionIndexedList.js +1 -1
  37. package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
  38. package/dist/data/utilities/getJoinIndexedList.js +2 -2
  39. package/dist/data/utilities/getJoinIndexedList.min.js +1 -1
  40. package/dist/data/utilities/getMatchingIndexes.js +2 -2
  41. package/dist/data/utilities/getMatchingIndexes.min.js +1 -1
  42. package/dist/data/utilities/matchIndexedJoins.js +2 -2
  43. package/dist/data/utilities/matchIndexedJoins.min.js +1 -1
  44. package/dist/data/utilities/reconcileJoin.js +26 -26
  45. package/dist/data/utilities/reconcileJoin.min.js +1 -1
  46. package/dist/data/utilities/reconcileJoins.js +26 -27
  47. package/dist/data/utilities/reconcileJoins.min.js +1 -1
  48. package/dist/data/utilities/registerRecord.js +2 -2
  49. package/dist/data/utilities/registerRecord.min.js +1 -1
  50. package/dist/data/utilities/removeFromIndex.js +2 -2
  51. package/dist/data/utilities/removeFromIndex.min.js +1 -1
  52. package/dist/data/utilities/restrictIndexedList.js +45 -45
  53. package/dist/data/utilities/restrictIndexedList.min.js +1 -1
  54. package/dist/data/utilities/retrieveFile.js +3 -3
  55. package/dist/data/utilities/retrieveFile.min.js +1 -1
  56. package/dist/data/utilities/retrieveIndexes.js +1 -1
  57. package/dist/data/utilities/retrieveIndexes.min.js +1 -1
  58. package/dist/data/utilities/updateIndex.js +2 -2
  59. package/dist/data/utilities/updateIndex.min.js +1 -1
  60. package/dist/data/utilities/useJoinClause.js +4 -4
  61. package/dist/data/utilities/useJoinClause.min.js +1 -1
  62. package/dist/index.d.ts +1 -0
  63. package/dist/index.js +7 -0
  64. package/dist/index.min.js +1 -1
  65. package/package.json +11 -4
  66. package/.browserslistrc +0 -1
  67. package/.nvmrc +0 -1
  68. package/MAIN.md +0 -15
  69. package/babel.config.js +0 -3
  70. package/build-tools.config.json +0 -30
  71. package/gulpfile.mjs +0 -15
  72. package/src/data/introspect/create.test.js +0 -67
  73. package/src/data/introspect/create.ts +0 -29
  74. package/src/data/introspect/definitions/field.test.js +0 -23
  75. package/src/data/introspect/definitions/field.ts +0 -48
  76. package/src/data/introspect/definitions/key.test.js +0 -100
  77. package/src/data/introspect/definitions/key.ts +0 -64
  78. package/src/data/introspect/definitions/keyReference.test.js +0 -8
  79. package/src/data/introspect/definitions/keyReference.ts +0 -23
  80. package/src/data/introspect/definitions/record.ts +0 -42
  81. package/src/data/introspect/describe.test.js +0 -36
  82. package/src/data/introspect/describe.ts +0 -9
  83. package/src/data/introspect/drop.test.js +0 -77
  84. package/src/data/introspect/drop.ts +0 -20
  85. package/src/data/introspect/index.ts +0 -8
  86. package/src/data/introspect/policies/foreignKeyExists.test.js +0 -44
  87. package/src/data/introspect/policies/foreignKeyExists.ts +0 -15
  88. package/src/data/introspect/policies/keyGenerate.ts +0 -11
  89. package/src/data/introspect/policies/keyUnique.ts +0 -11
  90. package/src/data/introspect/policies/typeCheck.test.js +0 -84
  91. package/src/data/introspect/policies/typeCheck.ts +0 -49
  92. package/src/data/introspect/policies/typeEnum.ts +0 -6
  93. package/src/data/introspect/policies/useDefault.ts +0 -6
  94. package/src/data/queries/deleteEntity.test.js +0 -86
  95. package/src/data/queries/deleteEntity.ts +0 -56
  96. package/src/data/queries/groupBy.test.js +0 -135
  97. package/src/data/queries/groupBy.ts +0 -16
  98. package/src/data/queries/insertEntity.test.js +0 -156
  99. package/src/data/queries/insertEntity.ts +0 -113
  100. package/src/data/queries/joinEntity.test.js +0 -109
  101. package/src/data/queries/joinEntity.ts +0 -20
  102. package/src/data/queries/mergeJoins.test.js +0 -174
  103. package/src/data/queries/mergeJoins.ts +0 -13
  104. package/src/data/queries/parser.test.js +0 -343
  105. package/src/data/queries/parser.ts +0 -24
  106. package/src/data/queries/query.test.js +0 -233
  107. package/src/data/queries/query.ts +0 -12
  108. package/src/data/queries/readEntity.test.js +0 -85
  109. package/src/data/queries/readEntity.ts +0 -8
  110. package/src/data/queries/sortBy.test.js +0 -131
  111. package/src/data/queries/sortBy.ts +0 -18
  112. package/src/data/queries/updateEntity.test.js +0 -228
  113. package/src/data/queries/updateEntity.ts +0 -162
  114. package/src/data/queries/where.test.js +0 -129
  115. package/src/data/queries/where.ts +0 -54
  116. package/src/data/utilities/deregisterRecord.test.js +0 -26
  117. package/src/data/utilities/deregisterRecord.ts +0 -24
  118. package/src/data/utilities/getConditionIndexedList.ts +0 -43
  119. package/src/data/utilities/getJoinIndexedList.ts +0 -53
  120. package/src/data/utilities/getMatchingIndexes.ts +0 -21
  121. package/src/data/utilities/matchIndexedJoins.ts +0 -45
  122. package/src/data/utilities/mergeJoin.test.js +0 -102
  123. package/src/data/utilities/mergeJoin.ts +0 -28
  124. package/src/data/utilities/parsers/findCommand.ts +0 -25
  125. package/src/data/utilities/parsers/findConditions.test.js +0 -38
  126. package/src/data/utilities/parsers/findConditions.ts +0 -32
  127. package/src/data/utilities/parsers/findGroupBy.ts +0 -20
  128. package/src/data/utilities/parsers/findInsertValues.test.js +0 -26
  129. package/src/data/utilities/parsers/findInsertValues.ts +0 -32
  130. package/src/data/utilities/parsers/findJoinClauses.ts +0 -29
  131. package/src/data/utilities/parsers/findJoinEntity.ts +0 -20
  132. package/src/data/utilities/parsers/findLimit.ts +0 -20
  133. package/src/data/utilities/parsers/findMergeJoins.ts +0 -27
  134. package/src/data/utilities/parsers/findOffset.ts +0 -20
  135. package/src/data/utilities/parsers/findSelects.ts +0 -31
  136. package/src/data/utilities/parsers/findSortClauses.ts +0 -31
  137. package/src/data/utilities/parsers/findUpdateValues.test.js +0 -37
  138. package/src/data/utilities/parsers/findUpdateValues.ts +0 -32
  139. package/src/data/utilities/parsers/isEntityProperty.ts +0 -1
  140. package/src/data/utilities/parsers/parseLiteralValue.test.js +0 -41
  141. package/src/data/utilities/parsers/parseLiteralValue.ts +0 -29
  142. package/src/data/utilities/parsers/parseQuery.ts +0 -73
  143. package/src/data/utilities/parsers/removeFromQuery.ts +0 -1
  144. package/src/data/utilities/parsers/splitEntityProperty.test.js +0 -8
  145. package/src/data/utilities/parsers/splitEntityProperty.ts +0 -17
  146. package/src/data/utilities/parsers/splitQueries.test.js +0 -33
  147. package/src/data/utilities/parsers/splitQueries.ts +0 -4
  148. package/src/data/utilities/reconcileJoin.test.js +0 -38
  149. package/src/data/utilities/reconcileJoin.ts +0 -23
  150. package/src/data/utilities/reconcileJoins.test.js +0 -160
  151. package/src/data/utilities/reconcileJoins.ts +0 -15
  152. package/src/data/utilities/registerRecord.test.js +0 -44
  153. package/src/data/utilities/registerRecord.ts +0 -44
  154. package/src/data/utilities/removeFromIndex.test.js +0 -44
  155. package/src/data/utilities/removeFromIndex.ts +0 -34
  156. package/src/data/utilities/restrictIndexedList.ts +0 -38
  157. package/src/data/utilities/retrieveFile.test.js +0 -49
  158. package/src/data/utilities/retrieveFile.ts +0 -19
  159. package/src/data/utilities/retrieveIndexes.ts +0 -17
  160. package/src/data/utilities/retrieveRecord.ts +0 -3
  161. package/src/data/utilities/retrieveRecords.test.js +0 -223
  162. package/src/data/utilities/retrieveRecords.ts +0 -16
  163. package/src/data/utilities/runQuery.test.js +0 -88
  164. package/src/data/utilities/runQuery.ts +0 -75
  165. package/src/data/utilities/updateIndex.test.js +0 -44
  166. package/src/data/utilities/updateIndex.ts +0 -45
  167. package/src/data/utilities/useJoinClause.test.js +0 -94
  168. package/src/data/utilities/useJoinClause.ts +0 -44
  169. package/src/global.d.ts +0 -1
  170. package/src/index.test.js +0 -52
  171. package/src/index.ts +0 -17
  172. package/test-data/__RECORDS.json +0 -32
  173. package/test-data/__indexes/exercise_muscle/fk_exercise_id.json +0 -14
  174. package/test-data/__indexes/exercise_muscle/fk_muscle_id.json +0 -14
  175. package/test-data/__indexes/exercise_muscle/pk__id.json +0 -14
  176. package/test-data/__indexes/exercises/pk__id.json +0 -14
  177. package/test-data/__indexes/muscles/pk__id.json +0 -58
  178. package/test-data/__indexes/workouts/fk_exercise_id.json +0 -23
  179. package/test-data/__indexes/workouts/index_date.json +0 -18
  180. package/test-data/__indexes/workouts/pk__id.json +0 -26
  181. package/test-data/copyDatabase.ts +0 -64
  182. package/test-data/exercise_muscle/bench_press_pectorals.json +0 -6
  183. package/test-data/exercise_muscle/deadlift_hamstrings.json +0 -6
  184. package/test-data/exercise_muscle/squat_quadriceps.json +0 -6
  185. package/test-data/exercise_muscle.json +0 -69
  186. package/test-data/exercises/bench_press.json +0 -5
  187. package/test-data/exercises/deadlift.json +0 -5
  188. package/test-data/exercises/squat.json +0 -5
  189. package/test-data/exercises.json +0 -34
  190. package/test-data/muscles/abdominal.json +0 -6
  191. package/test-data/muscles/biceps.json +0 -6
  192. package/test-data/muscles/calves.json +0 -6
  193. package/test-data/muscles/deltoids.json +0 -6
  194. package/test-data/muscles/erector_spinae.json +0 -6
  195. package/test-data/muscles/forearms.json +0 -6
  196. package/test-data/muscles/gluteus_maximus.json +0 -6
  197. package/test-data/muscles/hamstrings.json +0 -6
  198. package/test-data/muscles/latissimus_dorsi.json +0 -6
  199. package/test-data/muscles/obliques.json +0 -6
  200. package/test-data/muscles/pectorals.json +0 -6
  201. package/test-data/muscles/quadriceps.json +0 -6
  202. package/test-data/muscles/trapezius.json +0 -6
  203. package/test-data/muscles/triceps.json +0 -6
  204. package/test-data/muscles.json +0 -50
  205. package/test-data/workouts/2024-06-02-001.json +0 -10
  206. package/test-data/workouts/2024-06-02-002.json +0 -10
  207. package/test-data/workouts/2024-06-02-003.json +0 -10
  208. package/test-data/workouts/2024-06-05-001.json +0 -10
  209. package/test-data/workouts/2024-06-05-002.json +0 -10
  210. package/test-data/workouts/2024-06-05-003.json +0 -10
  211. package/test-data/workouts.json +0 -84
  212. package/tsconfig.json +0 -15
@@ -5,9 +5,9 @@ Object.defineProperty(exports, '__esModule', {
5
5
  })
6
6
  exports.create = void 0
7
7
  require('core-js/modules/es.json.stringify.js')
8
- const _testFilesystem = require('test-filesystem')
9
8
  const _record = require('./definitions/record')
10
9
  const _registerRecord = require('../utilities/registerRecord')
10
+ const _config = require('../utilities/config')
11
11
  /**
12
12
  * Create a new record.
13
13
  * @param recordName
@@ -15,16 +15,18 @@ const _registerRecord = require('../utilities/registerRecord')
15
15
  * @param keys
16
16
  */
17
17
  const create = async (recordName, definition = [], keys = []) => {
18
- const gulpConfig = require('js-build-tools/gulp.config')
19
18
  const {
20
19
  writeFile,
21
20
  mkdir
22
21
  } = require('fs/promises')
23
- const databasePath = gulpConfig.get('databasePath', 'database/')
22
+ const {
23
+ existsSync
24
+ } = require('fs')
25
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/')
24
26
  if (recordName === '__RECORDS') {
25
27
  return null
26
28
  }
27
- if ((0, _testFilesystem.fileExists)(`${databasePath}${recordName}.json`)) {
29
+ if (existsSync(`${databasePath}${recordName}.json`)) {
28
30
  return null
29
31
  }
30
32
  await mkdir(databasePath, {
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=void 0,require("core-js/modules/es.json.stringify.js");var _testFilesystem=require("test-filesystem"),_record=require("./definitions/record"),_registerRecord=require("../utilities/registerRecord");const create=async(e,r=[],t=[])=>{const s=require("js-build-tools/gulp.config"),{writeFile:i,mkdir:o}=require("fs/promises"),a=s.get("databasePath","database/");if("__RECORDS"===e)return null;if((0,_testFilesystem.fileExists)(`${a}${e}.json`))return null;await o(a,{recursive:!0});const c=(0,_record.record)({path:e,definition:r,keys:t});return await i(`${a}${e}.json`,JSON.stringify(c,null,2)),await o(`${a}${e}`,{recursive:!0}),await(0,_registerRecord.registerRecord)(e),c};exports.create=create;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=void 0,require("core-js/modules/es.json.stringify.js");var _record=require("./definitions/record"),_registerRecord=require("../utilities/registerRecord"),_config=require("../utilities/config");const create=async(e,r=[],i=[])=>{const{writeFile:t,mkdir:s}=require("fs/promises"),{existsSync:o}=require("fs"),c=(0,_config.getSetting)("databasePath","database/");if("__RECORDS"===e)return null;if(o(`${c}${e}.json`))return null;await s(c,{recursive:!0});const n=(0,_record.record)({path:e,definition:r,keys:i});return await t(`${c}${e}.json`,JSON.stringify(n,null,2)),await s(`${c}${e}`,{recursive:!0}),await(0,_registerRecord.registerRecord)(e),n};exports.create=create;
@@ -10,12 +10,12 @@ Object.defineProperty(exports, '__esModule', {
10
10
  exports.drop = void 0
11
11
  const _retrieveFile = require('../utilities/retrieveFile')
12
12
  const _deregisterRecord = require('../utilities/deregisterRecord')
13
- const gulpConfig = require('js-build-tools/gulp.config')
13
+ const _config = require('../utilities/config')
14
14
  const {
15
15
  rm
16
16
  } = require('fs/promises')
17
17
  const drop = async record => {
18
- const databasePath = gulpConfig.get('databasePath', 'database/')
18
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/')
19
19
  if (record === '__RECORDS') {
20
20
  return null
21
21
  }
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord");const gulpConfig=require("js-build-tools/gulp.config"),{rm:rm}=require("fs/promises"),drop=async e=>{const r=gulpConfig.get("databasePath","database/");if("__RECORDS"===e)return null;const t=await(0,_retrieveFile.retrieveFile)(`${e}.json`);for(const e of t.entries)await rm(`${r}${t.path}/${e}`);await rm(`${r}${t.path}`,{recursive:!0,force:!0}),await rm(`${r}__indexes/${t.path}`,{recursive:!0,force:!0}),await rm(`${r}${e}.json`),await(0,_deregisterRecord.deregisterRecord)(e)};exports.drop=drop;
1
+ "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord"),_config=require("../utilities/config");const{rm:rm}=require("fs/promises"),drop=async e=>{const r=(0,_config.getSetting)("databasePath","database/");if("__RECORDS"===e)return null;const t=await(0,_retrieveFile.retrieveFile)(`${e}.json`);for(const e of t.entries)await rm(`${r}${t.path}/${e}`);await rm(`${r}${t.path}`,{recursive:!0,force:!0}),await rm(`${r}__indexes/${t.path}`,{recursive:!0,force:!0}),await rm(`${r}${e}.json`),await(0,_deregisterRecord.deregisterRecord)(e)};exports.drop=drop;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Check whether any other record, in any entity, still has a single-field foreign key pointing
3
+ * at entity.property = value - the mirror image of foreignKeyExists(), which checks the opposite
4
+ * direction (that a new/updated foreign key value points at something real). Used to RESTRICT a
5
+ * delete or update that would otherwise leave a dangling reference behind. Scans every record in
6
+ * the database via the __RECORDS registry, the same "no index needed, just look" approach as
7
+ * keyUnique()/foreignKeyExists() - correctness over speed, matching this project's overall scale.
8
+ * @param entity
9
+ * @param property
10
+ * @param value
11
+ */
12
+ export declare const hasDependents: (entity: string, property: string, value: any) => Promise<boolean>;
13
+ //# sourceMappingURL=hasDependents.d.ts.map
@@ -0,0 +1,52 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.hasDependents = void 0
7
+ const _describe = require('../describe')
8
+ const _retrieveRecord = require('../../utilities/retrieveRecord')
9
+ const _retrieveRecords = require('../../utilities/retrieveRecords')
10
+ const _where = require('../../queries/where')
11
+ const _splitEntityProperty = require('../../utilities/parsers/splitEntityProperty')
12
+ /**
13
+ * Check whether any other record, in any entity, still has a single-field foreign key pointing
14
+ * at entity.property = value - the mirror image of foreignKeyExists(), which checks the opposite
15
+ * direction (that a new/updated foreign key value points at something real). Used to RESTRICT a
16
+ * delete or update that would otherwise leave a dangling reference behind. Scans every record in
17
+ * the database via the __RECORDS registry, the same "no index needed, just look" approach as
18
+ * keyUnique()/foreignKeyExists() - correctness over speed, matching this project's overall scale.
19
+ * @param entity
20
+ * @param property
21
+ * @param value
22
+ */
23
+ const hasDependents = async (entity, property, value) => {
24
+ const entityFiles = await (0, _describe.describe)()
25
+ for (const entityFile of entityFiles) {
26
+ const otherEntity = entityFile.replace(/\.json$/, '')
27
+ const otherRecord = await (0, _retrieveRecord.retrieveRecord)(otherEntity)
28
+ for (const key of otherRecord.keys) {
29
+ if (key.type !== 'foreign' || key.fields.length !== 1 || !key.references || key.references.length !== 1) {
30
+ continue
31
+ }
32
+ const {
33
+ entity: refEntity,
34
+ property: refProperty
35
+ } = (0, _splitEntityProperty.splitEntityProperty)(key.references[0].fields[0])
36
+ if (refEntity !== entity || refProperty !== property) {
37
+ continue
38
+ }
39
+ const records = await (0, _retrieveRecords.retrieveRecords)(otherEntity)
40
+ const found = (0, _where.where)(records, {
41
+ property: key.fields[0],
42
+ comparator: '=',
43
+ value
44
+ })
45
+ if (found.length) {
46
+ return true
47
+ }
48
+ }
49
+ }
50
+ return false
51
+ }
52
+ exports.hasDependents = hasDependents
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.hasDependents=void 0;var _describe=require("../describe"),_retrieveRecord=require("../../utilities/retrieveRecord"),_retrieveRecords=require("../../utilities/retrieveRecords"),_where=require("../../queries/where"),_splitEntityProperty=require("../../utilities/parsers/splitEntityProperty");const hasDependents=async(e,r,t)=>{const i=await(0,_describe.describe)();for(const s of i){const i=s.replace(/\.json$/,""),o=await(0,_retrieveRecord.retrieveRecord)(i);for(const s of o.keys){if("foreign"!==s.type||1!==s.fields.length||!s.references||1!==s.references.length)continue;const{entity:o,property:n}=(0,_splitEntityProperty.splitEntityProperty)(s.references[0].fields[0]);if(o!==e||n!==r)continue;const c=await(0,_retrieveRecords.retrieveRecords)(i);if((0,_where.where)(c,{property:s.fields[0],comparator:"=",value:t}).length)return!0}}return!1};exports.hasDependents=hasDependents;
@@ -10,7 +10,7 @@ const keyGenerate = async (entity, references = []) => {
10
10
  let isUnique = false
11
11
  while (!isUnique) {
12
12
  uuid = crypto.randomUUID()
13
- isUnique = await (0, _keyUnique.keyUnique)(entity, references, uuid)
13
+ isUnique = await (0, _keyUnique.keyUnique)(entity, references, [uuid])
14
14
  }
15
15
  return uuid
16
16
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyGenerate=void 0;var _keyUnique=require("./keyUnique");const keyGenerate=async(e,r=[])=>{let t=null,n=!1;for(;!n;)t=crypto.randomUUID(),n=await(0,_keyUnique.keyUnique)(e,r,t);return t};exports.keyGenerate=keyGenerate;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyGenerate=void 0;var _keyUnique=require("./keyUnique");const keyGenerate=async(e,r=[])=>{let t=null,n=!1;for(;!n;)t=crypto.randomUUID(),n=await(0,_keyUnique.keyUnique)(e,r,[t]);return t};exports.keyGenerate=keyGenerate;
@@ -1,2 +1,10 @@
1
- export declare const keyUnique: (entity: any, references?: any[], checkKey?: any) => Promise<boolean>;
1
+ /**
2
+ * Check that no existing record already has this combination of values across all of the given
3
+ * fields - a single field for a normal unique/primary key, or several for a composite one.
4
+ * references and checkKeys are parallel arrays: references[i]'s value must equal checkKeys[i].
5
+ * @param entity
6
+ * @param references
7
+ * @param checkKeys
8
+ */
9
+ export declare const keyUnique: (entity: any, references?: any[], checkKeys?: any[]) => Promise<boolean>;
2
10
  //# sourceMappingURL=keyUnique.d.ts.map
@@ -6,16 +6,26 @@ Object.defineProperty(exports, '__esModule', {
6
6
  exports.keyUnique = void 0
7
7
  const _retrieveRecords = require('../../utilities/retrieveRecords')
8
8
  const _where = require('../../queries/where')
9
- const keyUnique = async (entity, references = [], checkKey = null) => {
10
- if (references.length !== 1) {
9
+ /**
10
+ * Check that no existing record already has this combination of values across all of the given
11
+ * fields - a single field for a normal unique/primary key, or several for a composite one.
12
+ * references and checkKeys are parallel arrays: references[i]'s value must equal checkKeys[i].
13
+ * @param entity
14
+ * @param references
15
+ * @param checkKeys
16
+ */
17
+ const keyUnique = async (entity, references = [], checkKeys = []) => {
18
+ if (!references.length || references.length !== checkKeys.length) {
11
19
  return false
12
20
  }
13
- const records = await (0, _retrieveRecords.retrieveRecords)(entity)
14
- const found = (0, _where.where)(records, {
15
- property: references[0],
16
- comparator: '=',
17
- value: checkKey
18
- })
19
- return !found.length
21
+ let records = await (0, _retrieveRecords.retrieveRecords)(entity)
22
+ for (let i = 0; i < references.length; i++) {
23
+ records = (0, _where.where)(records, {
24
+ property: references[i],
25
+ comparator: '=',
26
+ value: checkKeys[i]
27
+ })
28
+ }
29
+ return !records.length
20
30
  }
21
31
  exports.keyUnique = keyUnique
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyUnique=void 0;var _retrieveRecords=require("../../utilities/retrieveRecords"),_where=require("../../queries/where");const keyUnique=async(e,r=[],t=null)=>{if(1!==r.length)return!1;const i=await(0,_retrieveRecords.retrieveRecords)(e);return!(0,_where.where)(i,{property:r[0],comparator:"=",value:t}).length};exports.keyUnique=keyUnique;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyUnique=void 0;var _retrieveRecords=require("../../utilities/retrieveRecords"),_where=require("../../queries/where");const keyUnique=async(e,r=[],t=[])=>{if(!r.length||r.length!==t.length)return!1;let i=await(0,_retrieveRecords.retrieveRecords)(e);for(let e=0;e<r.length;e++)i=(0,_where.where)(i,{property:r[e],comparator:"=",value:t[e]});return!i.length};exports.keyUnique=keyUnique;
@@ -27,52 +27,73 @@ require('core-js/modules/esnext.set.union.js')
27
27
  const _retrieveRecord = require('../utilities/retrieveRecord')
28
28
  const _retrieveFile = require('../utilities/retrieveFile')
29
29
  const _removeFromIndex = require('../utilities/removeFromIndex')
30
- const gulpConfig = require('js-build-tools/gulp.config')
30
+ const _computeKeyValue = require('../utilities/computeKeyValue')
31
+ const _hasDependents = require('../introspect/policies/hasDependents')
32
+ const _config = require('../utilities/config')
31
33
  const {
32
34
  rm,
33
35
  writeFile
34
36
  } = require('fs/promises')
37
+ /**
38
+ * RESTRICT: reject the whole delete (before removing anything) if any row being deleted is still
39
+ * referenced by a single-field foreign key elsewhere. Only meaningful for a single-field primary
40
+ * key, since foreign key support itself is single-field only - a composite primary key can't be
41
+ * the target of one yet, so there's nothing to check.
42
+ * @param entity
43
+ * @param primaryKey
44
+ * @param toDelete
45
+ */
46
+ const assertNoDependents = async (entity, primaryKey, toDelete) => {
47
+ if (!(0, _config.getSetting)('enforceForeignKeys', true) || primaryKey.fields.length !== 1) {
48
+ return
49
+ }
50
+ const property = primaryKey.fields[0]
51
+ for (const row of toDelete) {
52
+ if (await (0, _hasDependents.hasDependents)(entity, property, row[property])) {
53
+ throw new Error(`Cannot delete from "${entity}" where "${property}" = ${row[property]} - other records still reference it`)
54
+ }
55
+ }
56
+ }
35
57
  /**
36
58
  * A record object carries no memory of which entry file it was read from, and files are not
37
59
  * guaranteed to be named after any field's value, so the only reliable way to find a record's
38
- * file is to re-scan every entry and match it by its primary key value.
60
+ * file is to re-scan every entry and match it by its primary key value(s) - a single field, or a
61
+ * composite of several for a multi-field primary key.
39
62
  * @param entity
40
63
  * @param record
41
- * @param primaryField
64
+ * @param primaryKey
42
65
  * @param deletedValues
43
66
  */
44
- const removeMatchingEntries = async (entity, record, primaryField, deletedValues) => {
45
- const databasePath = gulpConfig.get('databasePath', 'database/')
67
+ const removeMatchingEntries = async (entity, record, primaryKey, deletedValues) => {
68
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/')
46
69
  const remainingEntries = []
47
70
  for (const fileName of record.entries) {
48
71
  const data = await (0, _retrieveFile.retrieveFile)(`${record.path}/${fileName}`)
49
- if (!deletedValues.has(data[primaryField])) {
72
+ if (!deletedValues.has((0, _computeKeyValue.computeKeyValue)(primaryKey.fields, data))) {
50
73
  remainingEntries.push(fileName)
51
74
  continue
52
75
  }
53
76
  await rm(`${databasePath}${record.path}/${fileName}`)
54
77
  for (const key of record.keys) {
55
- if (key.fields.length === 1) {
56
- await (0, _removeFromIndex.removeFromIndex)(record.path, key, data[key.fields[0]], fileName)
57
- }
78
+ await (0, _removeFromIndex.removeFromIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, data), fileName)
58
79
  }
59
80
  }
60
81
  return remainingEntries
61
82
  }
62
83
  const deleteEntity = async (entity = '', dataSet = {}) => {
63
- const databasePath = gulpConfig.get('databasePath', 'database/')
84
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/')
64
85
  const record = await (0, _retrieveRecord.retrieveRecord)(entity)
65
- const primaryKey = record.keys.find(key => key.type === 'primary' && key.fields.length === 1)
86
+ const primaryKey = record.keys.find(key => key.type === 'primary')
66
87
  if (!primaryKey) {
67
- throw new Error(`Cannot delete from "${entity}" without a single-field primary key`)
88
+ throw new Error(`Cannot delete from "${entity}" without a primary key`)
68
89
  }
69
- const primaryField = primaryKey.fields[0]
70
90
  const toDelete = dataSet[entity] || []
71
91
  if (!toDelete.length) {
72
92
  return dataSet
73
93
  }
74
- const deletedValues = new Set(toDelete.map(row => row[primaryField]))
75
- record.entries = await removeMatchingEntries(entity, record, primaryField, deletedValues)
94
+ await assertNoDependents(entity, primaryKey, toDelete)
95
+ const deletedValues = new Set(toDelete.map(row => (0, _computeKeyValue.computeKeyValue)(primaryKey.fields, row)))
96
+ record.entries = await removeMatchingEntries(entity, record, primaryKey, deletedValues)
76
97
  await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2))
77
98
  return dataSet
78
99
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _retrieveRecord=require("../utilities/retrieveRecord"),_retrieveFile=require("../utilities/retrieveFile"),_removeFromIndex=require("../utilities/removeFromIndex");const gulpConfig=require("js-build-tools/gulp.config"),{rm:rm,writeFile:writeFile}=require("fs/promises"),removeMatchingEntries=async(e,r,s,t)=>{const i=gulpConfig.get("databasePath","database/"),o=[];for(const e of r.entries){const n=await(0,_retrieveFile.retrieveFile)(`${r.path}/${e}`);if(t.has(n[s])){await rm(`${i}${r.path}/${e}`);for(const s of r.keys)1===s.fields.length&&await(0,_removeFromIndex.removeFromIndex)(r.path,s,n[s.fields[0]],e)}else o.push(e)}return o},deleteEntity=async(e="",r={})=>{const s=gulpConfig.get("databasePath","database/"),t=await(0,_retrieveRecord.retrieveRecord)(e),i=t.keys.find((e=>"primary"===e.type&&1===e.fields.length));if(!i)throw new Error(`Cannot delete from "${e}" without a single-field primary key`);const o=i.fields[0],n=r[e]||[];if(!n.length)return r;const u=new Set(n.map((e=>e[o])));return t.entries=await removeMatchingEntries(0,t,o,u),await writeFile(`${s}${t.path}.json`,JSON.stringify(t,null,2)),r};exports.deleteEntity=deleteEntity;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");var _retrieveRecord=require("../utilities/retrieveRecord"),_retrieveFile=require("../utilities/retrieveFile"),_removeFromIndex=require("../utilities/removeFromIndex"),_computeKeyValue=require("../utilities/computeKeyValue"),_hasDependents=require("../introspect/policies/hasDependents"),_config=require("../utilities/config");const{rm:rm,writeFile:writeFile}=require("fs/promises"),assertNoDependents=async(e,r,s)=>{if(!(0,_config.getSetting)("enforceForeignKeys",!0)||1!==r.fields.length)return;const t=r.fields[0];for(const r of s)if(await(0,_hasDependents.hasDependents)(e,t,r[t]))throw new Error(`Cannot delete from "${e}" where "${t}" = ${r[t]} - other records still reference it`)},removeMatchingEntries=async(e,r,s,t)=>{const i=(0,_config.getSetting)("databasePath","database/"),o=[];for(const e of r.entries){const n=await(0,_retrieveFile.retrieveFile)(`${r.path}/${e}`);if(t.has((0,_computeKeyValue.computeKeyValue)(s.fields,n))){await rm(`${i}${r.path}/${e}`);for(const s of r.keys)await(0,_removeFromIndex.removeFromIndex)(r.path,s,(0,_computeKeyValue.computeKeyValue)(s.fields,n),e)}else o.push(e)}return o},deleteEntity=async(e="",r={})=>{const s=(0,_config.getSetting)("databasePath","database/"),t=await(0,_retrieveRecord.retrieveRecord)(e),i=t.keys.find((e=>"primary"===e.type));if(!i)throw new Error(`Cannot delete from "${e}" without a primary key`);const o=r[e]||[];if(!o.length)return r;await assertNoDependents(e,i,o);const n=new Set(o.map((e=>(0,_computeKeyValue.computeKeyValue)(i.fields,e))));return t.entries=await removeMatchingEntries(0,t,i,n),await writeFile(`${s}${t.path}.json`,JSON.stringify(t,null,2)),r};exports.deleteEntity=deleteEntity;
@@ -1,22 +1,22 @@
1
- 'use strict'
2
-
3
- Object.defineProperty(exports, '__esModule', {
4
- value: true
5
- })
6
- exports.groupBy = void 0
7
- require('core-js/modules/esnext.iterator.constructor.js')
8
- require('core-js/modules/esnext.iterator.reduce.js')
9
- const groupBy = (dataSet = [], groupProperty = '') => {
10
- if (!groupProperty) {
11
- return dataSet
12
- }
13
- return dataSet.reduce((groupedData, data) => {
14
- const property = data[groupProperty]
15
- if (!groupedData.hasOwnProperty(property)) {
16
- groupedData[property] = []
17
- }
18
- groupedData[property].push(data)
19
- return groupedData
20
- }, {})
21
- }
22
- exports.groupBy = groupBy
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.groupBy = void 0
7
+ require('core-js/modules/esnext.iterator.constructor.js')
8
+ require('core-js/modules/esnext.iterator.reduce.js')
9
+ const groupBy = (dataSet = [], groupProperty = '') => {
10
+ if (!groupProperty) {
11
+ return dataSet
12
+ }
13
+ return dataSet.reduce((groupedData, data) => {
14
+ const property = data[groupProperty]
15
+ if (!Object.prototype.hasOwnProperty.call(groupedData, property)) {
16
+ groupedData[property] = []
17
+ }
18
+ groupedData[property].push(data)
19
+ return groupedData
20
+ }, {})
21
+ }
22
+ exports.groupBy = groupBy
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupBy=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");const groupBy=(e=[],r="")=>r?e.reduce(((e,o)=>{const s=o[r];return e.hasOwnProperty(s)||(e[s]=[]),e[s].push(o),e}),{}):e;exports.groupBy=groupBy;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupBy=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");const groupBy=(e=[],r="")=>r?e.reduce(((e,o)=>{const t=o[r];return Object.prototype.hasOwnProperty.call(e,t)||(e[t]=[]),e[t].push(o),e}),{}):e;exports.groupBy=groupBy;
@@ -7,6 +7,7 @@ exports.insertEntity = void 0
7
7
  require('core-js/modules/es.json.stringify.js')
8
8
  require('core-js/modules/esnext.iterator.constructor.js')
9
9
  require('core-js/modules/esnext.iterator.find.js')
10
+ require('core-js/modules/esnext.iterator.map.js')
10
11
  const _retrieveRecord = require('../utilities/retrieveRecord')
11
12
  const _updateIndex = require('../utilities/updateIndex')
12
13
  const _keyGenerate = require('../introspect/policies/keyGenerate')
@@ -15,7 +16,8 @@ const _useDefault = require('../introspect/policies/useDefault')
15
16
  const _typeCheck = require('../introspect/policies/typeCheck')
16
17
  const _foreignKeyExists = require('../introspect/policies/foreignKeyExists')
17
18
  const _splitEntityProperty = require('../utilities/parsers/splitEntityProperty')
18
- const gulpConfig = require('js-build-tools/gulp.config')
19
+ const _computeKeyValue = require('../utilities/computeKeyValue')
20
+ const _config = require('../utilities/config')
19
21
  const {
20
22
  writeFile
21
23
  } = require('fs/promises')
@@ -32,7 +34,7 @@ const buildEntityValues = async (entity, record, rowValues = {}) => {
32
34
  let value = rowValues[field.name]
33
35
  if (field.autoGenerate) {
34
36
  value = await (0, _keyGenerate.keyGenerate)(entity, [field.name])
35
- } else if (field.hasOwnProperty('default')) {
37
+ } else if (Object.prototype.hasOwnProperty.call(field, 'default')) {
36
38
  value = (0, _useDefault.useDefault)(field.default, value)
37
39
  }
38
40
  if (typeof value === 'undefined') {
@@ -46,19 +48,21 @@ const buildEntityValues = async (entity, record, rowValues = {}) => {
46
48
  return entityValues
47
49
  }
48
50
  /**
49
- * Reject the insert if it collides with an existing primary or unique single-field key value.
51
+ * Reject the insert if it collides with an existing primary or unique key value - a single field,
52
+ * or a composite of several for a multi-field key.
50
53
  * @param entity
51
54
  * @param record
52
55
  * @param entityValues
53
56
  */
54
57
  const assertUnique = async (entity, record, entityValues) => {
55
58
  for (const key of record.keys) {
56
- if (key.type !== 'primary' && key.type !== 'unique' || key.fields.length !== 1) {
59
+ if (key.type !== 'primary' && key.type !== 'unique') {
57
60
  continue
58
61
  }
59
- const isUnique = await (0, _keyUnique.keyUnique)(entity, key.fields, entityValues[key.fields[0]])
62
+ const checkKeys = key.fields.map(field => entityValues[field])
63
+ const isUnique = await (0, _keyUnique.keyUnique)(entity, key.fields, checkKeys)
60
64
  if (!isUnique) {
61
- throw new Error(`Duplicate value for ${key.type} key "${key.fields[0]}" on ${entity}`)
65
+ throw new Error(`Duplicate value for ${key.type} key "${key.fields.join(', ')}" on ${entity}`)
62
66
  }
63
67
  }
64
68
  }
@@ -75,7 +79,7 @@ const assertForeignKeys = async (entity, record, entityValues) => {
75
79
  continue
76
80
  }
77
81
  const field = key.fields[0]
78
- if (!entityValues.hasOwnProperty(field)) {
82
+ if (!Object.prototype.hasOwnProperty.call(entityValues, field)) {
79
83
  continue
80
84
  }
81
85
  const {
@@ -89,10 +93,10 @@ const assertForeignKeys = async (entity, record, entityValues) => {
89
93
  }
90
94
  }
91
95
  const insertEntity = async (entity = '', values = [], dataSet = {}) => {
92
- const databasePath = gulpConfig.get('databasePath', 'database/')
96
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/')
93
97
  const record = await (0, _retrieveRecord.retrieveRecord)(entity)
94
98
  const primaryKey = record.keys.find(key => key.type === 'primary' && key.fields.length === 1)
95
- if (!dataSet.hasOwnProperty(entity)) {
99
+ if (!Object.prototype.hasOwnProperty.call(dataSet, entity)) {
96
100
  dataSet[entity] = []
97
101
  }
98
102
  for (const rowValues of values) {
@@ -104,9 +108,7 @@ const insertEntity = async (entity = '', values = [], dataSet = {}) => {
104
108
  record.entries.push(fileName)
105
109
  await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2))
106
110
  for (const key of record.keys) {
107
- if (key.fields.length === 1) {
108
- await (0, _updateIndex.updateIndex)(record.path, key, entityValues[key.fields[0]], fileName)
109
- }
111
+ await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName)
110
112
  }
111
113
  dataSet[entity].push(entityValues)
112
114
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.insertEntity=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js");var _retrieveRecord=require("../utilities/retrieveRecord"),_updateIndex=require("../utilities/updateIndex"),_keyGenerate=require("../introspect/policies/keyGenerate"),_keyUnique=require("../introspect/policies/keyUnique"),_useDefault=require("../introspect/policies/useDefault"),_typeCheck=require("../introspect/policies/typeCheck"),_foreignKeyExists=require("../introspect/policies/foreignKeyExists"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty");const gulpConfig=require("js-build-tools/gulp.config"),{writeFile:writeFile}=require("fs/promises"),buildEntityValues=async(e,t,i={})=>{const r={};for(const s of t.definition){let t=i[s.name];if(s.autoGenerate?t=await(0,_keyGenerate.keyGenerate)(e,[s.name]):s.hasOwnProperty("default")&&(t=(0,_useDefault.useDefault)(s.default,t)),void 0!==t)r[s.name]=(0,_typeCheck.typeCheck)(s.type,t);else if(!s.optional)throw new Error(`Missing required field "${s.name}" for ${e}`)}return r},assertUnique=async(e,t,i)=>{for(const r of t.keys){if("primary"!==r.type&&"unique"!==r.type||1!==r.fields.length)continue;if(!await(0,_keyUnique.keyUnique)(e,r.fields,i[r.fields[0]]))throw new Error(`Duplicate value for ${r.type} key "${r.fields[0]}" on ${e}`)}},assertForeignKeys=async(e,t,i)=>{for(const r of t.keys){if("foreign"!==r.type||1!==r.fields.length||!r.references||1!==r.references.length)continue;const t=r.fields[0];if(!i.hasOwnProperty(t))continue;const{entity:s,property:n}=(0,_splitEntityProperty.splitEntityProperty)(r.references[0].fields[0]);if(!await(0,_foreignKeyExists.foreignKeyExists)(s,n,i[t]))throw new Error(`Foreign key "${t}" on ${e} references a nonexistent ${s}.${n} = ${i[t]}`)}},insertEntity=async(e="",t=[],i={})=>{const r=gulpConfig.get("databasePath","database/"),s=await(0,_retrieveRecord.retrieveRecord)(e),n=s.keys.find((e=>"primary"===e.type&&1===e.fields.length));i.hasOwnProperty(e)||(i[e]=[]);for(const o of t){const t=await buildEntityValues(e,s,o);await assertUnique(e,s,t),await assertForeignKeys(e,s,t);const a=`${n?t[n.fields[0]]:crypto.randomUUID()}.json`;await writeFile(`${r}${s.path}/${a}`,JSON.stringify(t,null,2)),s.entries.push(a),await writeFile(`${r}${s.path}.json`,JSON.stringify(s,null,2));for(const e of s.keys)1===e.fields.length&&await(0,_updateIndex.updateIndex)(s.path,e,t[e.fields[0]],a);i[e].push(t)}return i};exports.insertEntity=insertEntity;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.insertEntity=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.map.js");var _retrieveRecord=require("../utilities/retrieveRecord"),_updateIndex=require("../utilities/updateIndex"),_keyGenerate=require("../introspect/policies/keyGenerate"),_keyUnique=require("../introspect/policies/keyUnique"),_useDefault=require("../introspect/policies/useDefault"),_typeCheck=require("../introspect/policies/typeCheck"),_foreignKeyExists=require("../introspect/policies/foreignKeyExists"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty"),_computeKeyValue=require("../utilities/computeKeyValue"),_config=require("../utilities/config");const{writeFile:writeFile}=require("fs/promises"),buildEntityValues=async(e,t,i={})=>{const r={};for(const s of t.definition){let t=i[s.name];if(s.autoGenerate?t=await(0,_keyGenerate.keyGenerate)(e,[s.name]):Object.prototype.hasOwnProperty.call(s,"default")&&(t=(0,_useDefault.useDefault)(s.default,t)),void 0!==t)r[s.name]=(0,_typeCheck.typeCheck)(s.type,t);else if(!s.optional)throw new Error(`Missing required field "${s.name}" for ${e}`)}return r},assertUnique=async(e,t,i)=>{for(const r of t.keys){if("primary"!==r.type&&"unique"!==r.type)continue;const t=r.fields.map((e=>i[e]));if(!await(0,_keyUnique.keyUnique)(e,r.fields,t))throw new Error(`Duplicate value for ${r.type} key "${r.fields.join(", ")}" on ${e}`)}},assertForeignKeys=async(e,t,i)=>{for(const r of t.keys){if("foreign"!==r.type||1!==r.fields.length||!r.references||1!==r.references.length)continue;const t=r.fields[0];if(!Object.prototype.hasOwnProperty.call(i,t))continue;const{entity:s,property:n}=(0,_splitEntityProperty.splitEntityProperty)(r.references[0].fields[0]);if(!await(0,_foreignKeyExists.foreignKeyExists)(s,n,i[t]))throw new Error(`Foreign key "${t}" on ${e} references a nonexistent ${s}.${n} = ${i[t]}`)}},insertEntity=async(e="",t=[],i={})=>{const r=(0,_config.getSetting)("databasePath","database/"),s=await(0,_retrieveRecord.retrieveRecord)(e),n=s.keys.find((e=>"primary"===e.type&&1===e.fields.length));Object.prototype.hasOwnProperty.call(i,e)||(i[e]=[]);for(const o of t){const t=await buildEntityValues(e,s,o);await assertUnique(e,s,t),await assertForeignKeys(e,s,t);const a=`${n?t[n.fields[0]]:crypto.randomUUID()}.json`;await writeFile(`${r}${s.path}/${a}`,JSON.stringify(t,null,2)),s.entries.push(a),await writeFile(`${r}${s.path}.json`,JSON.stringify(s,null,2));for(const e of s.keys)await(0,_updateIndex.updateIndex)(s.path,e,(0,_computeKeyValue.computeKeyValue)(e.fields,t),a);i[e].push(t)}return i};exports.insertEntity=insertEntity;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, '__esModule', {
6
6
  exports.readEntity = void 0
7
7
  const _retrieveRecords = require('../utilities/retrieveRecords')
8
8
  const readEntity = async (entity = '', dataSet = {}) => {
9
- if (!dataSet.hasOwnProperty(entity) || !dataSet[entity].length) {
9
+ if (!Object.prototype.hasOwnProperty.call(dataSet, entity) || !dataSet[entity].length) {
10
10
  dataSet[entity] = await (0, _retrieveRecords.retrieveRecords)(entity)
11
11
  }
12
12
  return dataSet
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.readEntity=void 0;var _retrieveRecords=require("../utilities/retrieveRecords");const readEntity=async(e="",r={})=>(r.hasOwnProperty(e)&&r[e].length||(r[e]=await(0,_retrieveRecords.retrieveRecords)(e)),r);exports.readEntity=readEntity;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.readEntity=void 0;var _retrieveRecords=require("../utilities/retrieveRecords");const readEntity=async(e="",r={})=>(Object.prototype.hasOwnProperty.call(r,e)&&r[e].length||(r[e]=await(0,_retrieveRecords.retrieveRecords)(e)),r);exports.readEntity=readEntity;