json-fs-query 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 (336) hide show
  1. package/.browserslistrc +1 -0
  2. package/.nvmrc +1 -0
  3. package/LICENSE +674 -0
  4. package/MAIN.md +15 -0
  5. package/README.md +63 -0
  6. package/babel.config.js +3 -0
  7. package/build-tools.config.json +30 -0
  8. package/dist/data/introspect/create.d.ts +11 -0
  9. package/dist/data/introspect/create.js +45 -0
  10. package/dist/data/introspect/create.min.js +1 -0
  11. package/dist/data/introspect/definitions/field.d.ts +28 -0
  12. package/dist/data/introspect/definitions/field.js +36 -0
  13. package/dist/data/introspect/definitions/field.min.js +1 -0
  14. package/dist/data/introspect/definitions/key.d.ts +26 -0
  15. package/dist/data/introspect/definitions/key.js +53 -0
  16. package/dist/data/introspect/definitions/key.min.js +1 -0
  17. package/dist/data/introspect/definitions/keyReference.d.ts +18 -0
  18. package/dist/data/introspect/definitions/keyReference.js +20 -0
  19. package/dist/data/introspect/definitions/keyReference.min.js +1 -0
  20. package/dist/data/introspect/definitions/record.d.ts +26 -0
  21. package/dist/data/introspect/definitions/record.js +32 -0
  22. package/dist/data/introspect/definitions/record.min.js +1 -0
  23. package/dist/data/introspect/describe.d.ts +2 -0
  24. package/dist/data/introspect/describe.js +15 -0
  25. package/dist/data/introspect/describe.min.js +1 -0
  26. package/dist/data/introspect/drop.d.ts +2 -0
  27. package/dist/data/introspect/drop.js +37 -0
  28. package/dist/data/introspect/drop.min.js +1 -0
  29. package/dist/data/introspect/index.d.ts +8 -0
  30. package/dist/data/introspect/index.js +30 -0
  31. package/dist/data/introspect/index.min.js +1 -0
  32. package/dist/data/introspect/policies/foreignKeyExists.d.ts +9 -0
  33. package/dist/data/introspect/policies/foreignKeyExists.js +25 -0
  34. package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -0
  35. package/dist/data/introspect/policies/keyGenerate.d.ts +2 -0
  36. package/dist/data/introspect/policies/keyGenerate.js +17 -0
  37. package/dist/data/introspect/policies/keyGenerate.min.js +1 -0
  38. package/dist/data/introspect/policies/keyUnique.d.ts +2 -0
  39. package/dist/data/introspect/policies/keyUnique.js +21 -0
  40. package/dist/data/introspect/policies/keyUnique.min.js +1 -0
  41. package/dist/data/introspect/policies/typeCheck.d.ts +12 -0
  42. package/dist/data/introspect/policies/typeCheck.js +57 -0
  43. package/dist/data/introspect/policies/typeCheck.min.js +1 -0
  44. package/dist/data/introspect/policies/typeEnum.d.ts +2 -0
  45. package/dist/data/introspect/policies/typeEnum.js +14 -0
  46. package/dist/data/introspect/policies/typeEnum.min.js +1 -0
  47. package/dist/data/introspect/policies/useDefault.d.ts +2 -0
  48. package/dist/data/introspect/policies/useDefault.js +13 -0
  49. package/dist/data/introspect/policies/useDefault.min.js +1 -0
  50. package/dist/data/queries/deleteEntity.d.ts +2 -0
  51. package/dist/data/queries/deleteEntity.js +79 -0
  52. package/dist/data/queries/deleteEntity.min.js +1 -0
  53. package/dist/data/queries/groupBy.d.ts +2 -0
  54. package/dist/data/queries/groupBy.js +22 -0
  55. package/dist/data/queries/groupBy.min.js +1 -0
  56. package/dist/data/queries/insertEntity.d.ts +2 -0
  57. package/dist/data/queries/insertEntity.js +115 -0
  58. package/dist/data/queries/insertEntity.min.js +1 -0
  59. package/dist/data/queries/joinEntity.d.ts +2 -0
  60. package/dist/data/queries/joinEntity.js +27 -0
  61. package/dist/data/queries/joinEntity.min.js +1 -0
  62. package/dist/data/queries/mergeJoins.d.ts +2 -0
  63. package/dist/data/queries/mergeJoins.js +19 -0
  64. package/dist/data/queries/mergeJoins.min.js +1 -0
  65. package/dist/data/queries/parser.d.ts +2 -0
  66. package/dist/data/queries/parser.js +30 -0
  67. package/dist/data/queries/parser.min.js +1 -0
  68. package/dist/data/queries/query.d.ts +2 -0
  69. package/dist/data/queries/query.js +18 -0
  70. package/dist/data/queries/query.min.js +1 -0
  71. package/dist/data/queries/readEntity.d.ts +2 -0
  72. package/dist/data/queries/readEntity.js +14 -0
  73. package/dist/data/queries/readEntity.min.js +1 -0
  74. package/dist/data/queries/sortBy.d.ts +2 -0
  75. package/dist/data/queries/sortBy.js +25 -0
  76. package/dist/data/queries/sortBy.min.js +1 -0
  77. package/dist/data/queries/updateEntity.d.ts +2 -0
  78. package/dist/data/queries/updateEntity.js +164 -0
  79. package/dist/data/queries/updateEntity.min.js +1 -0
  80. package/dist/data/queries/where.d.ts +7 -0
  81. package/dist/data/queries/where.js +56 -0
  82. package/dist/data/queries/where.min.js +1 -0
  83. package/dist/data/utilities/deregisterRecord.d.ts +8 -0
  84. package/dist/data/utilities/deregisterRecord.js +34 -0
  85. package/dist/data/utilities/deregisterRecord.min.js +1 -0
  86. package/dist/data/utilities/getConditionIndexedList.d.ts +3 -0
  87. package/dist/data/utilities/getConditionIndexedList.js +47 -0
  88. package/dist/data/utilities/getConditionIndexedList.min.js +1 -0
  89. package/dist/data/utilities/getJoinIndexedList.d.ts +3 -0
  90. package/dist/data/utilities/getJoinIndexedList.js +59 -0
  91. package/dist/data/utilities/getJoinIndexedList.min.js +1 -0
  92. package/dist/data/utilities/getMatchingIndexes.d.ts +2 -0
  93. package/dist/data/utilities/getMatchingIndexes.js +28 -0
  94. package/dist/data/utilities/getMatchingIndexes.min.js +1 -0
  95. package/dist/data/utilities/matchIndexedJoins.d.ts +2 -0
  96. package/dist/data/utilities/matchIndexedJoins.js +61 -0
  97. package/dist/data/utilities/matchIndexedJoins.min.js +1 -0
  98. package/dist/data/utilities/mergeJoin.d.ts +2 -0
  99. package/dist/data/utilities/mergeJoin.js +44 -0
  100. package/dist/data/utilities/mergeJoin.min.js +1 -0
  101. package/dist/data/utilities/parsers/findCommand.d.ts +10 -0
  102. package/dist/data/utilities/parsers/findCommand.js +25 -0
  103. package/dist/data/utilities/parsers/findCommand.min.js +1 -0
  104. package/dist/data/utilities/parsers/findConditions.d.ts +15 -0
  105. package/dist/data/utilities/parsers/findConditions.js +28 -0
  106. package/dist/data/utilities/parsers/findConditions.min.js +1 -0
  107. package/dist/data/utilities/parsers/findGroupBy.d.ts +9 -0
  108. package/dist/data/utilities/parsers/findGroupBy.js +22 -0
  109. package/dist/data/utilities/parsers/findGroupBy.min.js +1 -0
  110. package/dist/data/utilities/parsers/findInsertValues.d.ts +13 -0
  111. package/dist/data/utilities/parsers/findInsertValues.js +34 -0
  112. package/dist/data/utilities/parsers/findInsertValues.min.js +1 -0
  113. package/dist/data/utilities/parsers/findJoinClauses.d.ts +13 -0
  114. package/dist/data/utilities/parsers/findJoinClauses.js +27 -0
  115. package/dist/data/utilities/parsers/findJoinClauses.min.js +1 -0
  116. package/dist/data/utilities/parsers/findJoinEntity.d.ts +9 -0
  117. package/dist/data/utilities/parsers/findJoinEntity.js +22 -0
  118. package/dist/data/utilities/parsers/findJoinEntity.min.js +1 -0
  119. package/dist/data/utilities/parsers/findLimit.d.ts +9 -0
  120. package/dist/data/utilities/parsers/findLimit.js +22 -0
  121. package/dist/data/utilities/parsers/findLimit.min.js +1 -0
  122. package/dist/data/utilities/parsers/findMergeJoins.d.ts +12 -0
  123. package/dist/data/utilities/parsers/findMergeJoins.js +26 -0
  124. package/dist/data/utilities/parsers/findMergeJoins.min.js +1 -0
  125. package/dist/data/utilities/parsers/findOffset.d.ts +9 -0
  126. package/dist/data/utilities/parsers/findOffset.js +22 -0
  127. package/dist/data/utilities/parsers/findOffset.min.js +1 -0
  128. package/dist/data/utilities/parsers/findSelects.d.ts +12 -0
  129. package/dist/data/utilities/parsers/findSelects.js +30 -0
  130. package/dist/data/utilities/parsers/findSelects.min.js +1 -0
  131. package/dist/data/utilities/parsers/findSortClauses.d.ts +12 -0
  132. package/dist/data/utilities/parsers/findSortClauses.js +30 -0
  133. package/dist/data/utilities/parsers/findSortClauses.min.js +1 -0
  134. package/dist/data/utilities/parsers/findUpdateValues.d.ts +15 -0
  135. package/dist/data/utilities/parsers/findUpdateValues.js +34 -0
  136. package/dist/data/utilities/parsers/findUpdateValues.min.js +1 -0
  137. package/dist/data/utilities/parsers/isEntityProperty.d.ts +2 -0
  138. package/dist/data/utilities/parsers/isEntityProperty.js +8 -0
  139. package/dist/data/utilities/parsers/isEntityProperty.min.js +1 -0
  140. package/dist/data/utilities/parsers/parseLiteralValue.d.ts +12 -0
  141. package/dist/data/utilities/parsers/parseLiteralValue.js +34 -0
  142. package/dist/data/utilities/parsers/parseLiteralValue.min.js +1 -0
  143. package/dist/data/utilities/parsers/parseQuery.d.ts +33 -0
  144. package/dist/data/utilities/parsers/parseQuery.js +51 -0
  145. package/dist/data/utilities/parsers/parseQuery.min.js +1 -0
  146. package/dist/data/utilities/parsers/removeFromQuery.d.ts +2 -0
  147. package/dist/data/utilities/parsers/removeFromQuery.js +8 -0
  148. package/dist/data/utilities/parsers/removeFromQuery.min.js +1 -0
  149. package/dist/data/utilities/parsers/splitEntityProperty.d.ts +5 -0
  150. package/dist/data/utilities/parsers/splitEntityProperty.js +23 -0
  151. package/dist/data/utilities/parsers/splitEntityProperty.min.js +1 -0
  152. package/dist/data/utilities/parsers/splitQueries.d.ts +2 -0
  153. package/dist/data/utilities/parsers/splitQueries.js +11 -0
  154. package/dist/data/utilities/parsers/splitQueries.min.js +1 -0
  155. package/dist/data/utilities/reconcileJoin.d.ts +2 -0
  156. package/dist/data/utilities/reconcileJoin.js +26 -0
  157. package/dist/data/utilities/reconcileJoin.min.js +1 -0
  158. package/dist/data/utilities/reconcileJoins.d.ts +2 -0
  159. package/dist/data/utilities/reconcileJoins.js +27 -0
  160. package/dist/data/utilities/reconcileJoins.min.js +1 -0
  161. package/dist/data/utilities/registerRecord.d.ts +8 -0
  162. package/dist/data/utilities/registerRecord.js +67 -0
  163. package/dist/data/utilities/registerRecord.min.js +1 -0
  164. package/dist/data/utilities/removeFromIndex.d.ts +14 -0
  165. package/dist/data/utilities/removeFromIndex.js +46 -0
  166. package/dist/data/utilities/removeFromIndex.min.js +1 -0
  167. package/dist/data/utilities/restrictIndexedList.d.ts +2 -0
  168. package/dist/data/utilities/restrictIndexedList.js +45 -0
  169. package/dist/data/utilities/restrictIndexedList.min.js +1 -0
  170. package/dist/data/utilities/retrieveFile.d.ts +2 -0
  171. package/dist/data/utilities/retrieveFile.js +28 -0
  172. package/dist/data/utilities/retrieveFile.min.js +1 -0
  173. package/dist/data/utilities/retrieveIndexes.d.ts +2 -0
  174. package/dist/data/utilities/retrieveIndexes.js +24 -0
  175. package/dist/data/utilities/retrieveIndexes.min.js +1 -0
  176. package/dist/data/utilities/retrieveRecord.d.ts +2 -0
  177. package/dist/data/utilities/retrieveRecord.js +9 -0
  178. package/dist/data/utilities/retrieveRecord.min.js +1 -0
  179. package/dist/data/utilities/retrieveRecords.d.ts +2 -0
  180. package/dist/data/utilities/retrieveRecords.js +21 -0
  181. package/dist/data/utilities/retrieveRecords.min.js +1 -0
  182. package/dist/data/utilities/runQuery.d.ts +2 -0
  183. package/dist/data/utilities/runQuery.js +72 -0
  184. package/dist/data/utilities/runQuery.min.js +1 -0
  185. package/dist/data/utilities/updateIndex.d.ts +17 -0
  186. package/dist/data/utilities/updateIndex.js +56 -0
  187. package/dist/data/utilities/updateIndex.min.js +1 -0
  188. package/dist/data/utilities/useJoinClause.d.ts +6 -0
  189. package/dist/data/utilities/useJoinClause.js +51 -0
  190. package/dist/data/utilities/useJoinClause.min.js +1 -0
  191. package/dist/index.d.ts +4 -0
  192. package/dist/index.js +35 -0
  193. package/dist/index.min.js +1 -0
  194. package/gulpfile.mjs +15 -0
  195. package/package.json +44 -0
  196. package/src/data/introspect/create.test.js +67 -0
  197. package/src/data/introspect/create.ts +29 -0
  198. package/src/data/introspect/definitions/field.test.js +23 -0
  199. package/src/data/introspect/definitions/field.ts +48 -0
  200. package/src/data/introspect/definitions/key.test.js +100 -0
  201. package/src/data/introspect/definitions/key.ts +64 -0
  202. package/src/data/introspect/definitions/keyReference.test.js +8 -0
  203. package/src/data/introspect/definitions/keyReference.ts +23 -0
  204. package/src/data/introspect/definitions/record.ts +42 -0
  205. package/src/data/introspect/describe.test.js +36 -0
  206. package/src/data/introspect/describe.ts +9 -0
  207. package/src/data/introspect/drop.test.js +77 -0
  208. package/src/data/introspect/drop.ts +20 -0
  209. package/src/data/introspect/index.ts +8 -0
  210. package/src/data/introspect/policies/foreignKeyExists.test.js +44 -0
  211. package/src/data/introspect/policies/foreignKeyExists.ts +15 -0
  212. package/src/data/introspect/policies/keyGenerate.ts +11 -0
  213. package/src/data/introspect/policies/keyUnique.ts +11 -0
  214. package/src/data/introspect/policies/typeCheck.test.js +84 -0
  215. package/src/data/introspect/policies/typeCheck.ts +49 -0
  216. package/src/data/introspect/policies/typeEnum.ts +6 -0
  217. package/src/data/introspect/policies/useDefault.ts +6 -0
  218. package/src/data/queries/deleteEntity.test.js +86 -0
  219. package/src/data/queries/deleteEntity.ts +56 -0
  220. package/src/data/queries/groupBy.test.js +135 -0
  221. package/src/data/queries/groupBy.ts +16 -0
  222. package/src/data/queries/insertEntity.test.js +156 -0
  223. package/src/data/queries/insertEntity.ts +113 -0
  224. package/src/data/queries/joinEntity.test.js +109 -0
  225. package/src/data/queries/joinEntity.ts +20 -0
  226. package/src/data/queries/mergeJoins.test.js +174 -0
  227. package/src/data/queries/mergeJoins.ts +13 -0
  228. package/src/data/queries/parser.test.js +343 -0
  229. package/src/data/queries/parser.ts +24 -0
  230. package/src/data/queries/query.test.js +233 -0
  231. package/src/data/queries/query.ts +12 -0
  232. package/src/data/queries/readEntity.test.js +85 -0
  233. package/src/data/queries/readEntity.ts +8 -0
  234. package/src/data/queries/sortBy.test.js +131 -0
  235. package/src/data/queries/sortBy.ts +18 -0
  236. package/src/data/queries/updateEntity.test.js +228 -0
  237. package/src/data/queries/updateEntity.ts +162 -0
  238. package/src/data/queries/where.test.js +129 -0
  239. package/src/data/queries/where.ts +54 -0
  240. package/src/data/utilities/deregisterRecord.test.js +26 -0
  241. package/src/data/utilities/deregisterRecord.ts +24 -0
  242. package/src/data/utilities/getConditionIndexedList.ts +43 -0
  243. package/src/data/utilities/getJoinIndexedList.ts +53 -0
  244. package/src/data/utilities/getMatchingIndexes.ts +21 -0
  245. package/src/data/utilities/matchIndexedJoins.ts +45 -0
  246. package/src/data/utilities/mergeJoin.test.js +102 -0
  247. package/src/data/utilities/mergeJoin.ts +28 -0
  248. package/src/data/utilities/parsers/findCommand.ts +25 -0
  249. package/src/data/utilities/parsers/findConditions.test.js +38 -0
  250. package/src/data/utilities/parsers/findConditions.ts +32 -0
  251. package/src/data/utilities/parsers/findGroupBy.ts +20 -0
  252. package/src/data/utilities/parsers/findInsertValues.test.js +26 -0
  253. package/src/data/utilities/parsers/findInsertValues.ts +32 -0
  254. package/src/data/utilities/parsers/findJoinClauses.ts +29 -0
  255. package/src/data/utilities/parsers/findJoinEntity.ts +20 -0
  256. package/src/data/utilities/parsers/findLimit.ts +20 -0
  257. package/src/data/utilities/parsers/findMergeJoins.ts +27 -0
  258. package/src/data/utilities/parsers/findOffset.ts +20 -0
  259. package/src/data/utilities/parsers/findSelects.ts +31 -0
  260. package/src/data/utilities/parsers/findSortClauses.ts +31 -0
  261. package/src/data/utilities/parsers/findUpdateValues.test.js +37 -0
  262. package/src/data/utilities/parsers/findUpdateValues.ts +32 -0
  263. package/src/data/utilities/parsers/isEntityProperty.ts +1 -0
  264. package/src/data/utilities/parsers/parseLiteralValue.test.js +41 -0
  265. package/src/data/utilities/parsers/parseLiteralValue.ts +29 -0
  266. package/src/data/utilities/parsers/parseQuery.ts +73 -0
  267. package/src/data/utilities/parsers/removeFromQuery.ts +1 -0
  268. package/src/data/utilities/parsers/splitEntityProperty.test.js +8 -0
  269. package/src/data/utilities/parsers/splitEntityProperty.ts +17 -0
  270. package/src/data/utilities/parsers/splitQueries.test.js +33 -0
  271. package/src/data/utilities/parsers/splitQueries.ts +4 -0
  272. package/src/data/utilities/reconcileJoin.test.js +38 -0
  273. package/src/data/utilities/reconcileJoin.ts +23 -0
  274. package/src/data/utilities/reconcileJoins.test.js +160 -0
  275. package/src/data/utilities/reconcileJoins.ts +15 -0
  276. package/src/data/utilities/registerRecord.test.js +44 -0
  277. package/src/data/utilities/registerRecord.ts +44 -0
  278. package/src/data/utilities/removeFromIndex.test.js +44 -0
  279. package/src/data/utilities/removeFromIndex.ts +34 -0
  280. package/src/data/utilities/restrictIndexedList.ts +38 -0
  281. package/src/data/utilities/retrieveFile.test.js +49 -0
  282. package/src/data/utilities/retrieveFile.ts +19 -0
  283. package/src/data/utilities/retrieveIndexes.ts +17 -0
  284. package/src/data/utilities/retrieveRecord.ts +3 -0
  285. package/src/data/utilities/retrieveRecords.test.js +223 -0
  286. package/src/data/utilities/retrieveRecords.ts +16 -0
  287. package/src/data/utilities/runQuery.test.js +88 -0
  288. package/src/data/utilities/runQuery.ts +75 -0
  289. package/src/data/utilities/updateIndex.test.js +44 -0
  290. package/src/data/utilities/updateIndex.ts +45 -0
  291. package/src/data/utilities/useJoinClause.test.js +94 -0
  292. package/src/data/utilities/useJoinClause.ts +44 -0
  293. package/src/global.d.ts +1 -0
  294. package/src/index.test.js +52 -0
  295. package/src/index.ts +17 -0
  296. package/test-data/__RECORDS.json +32 -0
  297. package/test-data/__indexes/exercise_muscle/fk_exercise_id.json +14 -0
  298. package/test-data/__indexes/exercise_muscle/fk_muscle_id.json +14 -0
  299. package/test-data/__indexes/exercise_muscle/pk__id.json +14 -0
  300. package/test-data/__indexes/exercises/pk__id.json +14 -0
  301. package/test-data/__indexes/muscles/pk__id.json +58 -0
  302. package/test-data/__indexes/workouts/fk_exercise_id.json +23 -0
  303. package/test-data/__indexes/workouts/index_date.json +18 -0
  304. package/test-data/__indexes/workouts/pk__id.json +26 -0
  305. package/test-data/copyDatabase.ts +64 -0
  306. package/test-data/exercise_muscle/bench_press_pectorals.json +6 -0
  307. package/test-data/exercise_muscle/deadlift_hamstrings.json +6 -0
  308. package/test-data/exercise_muscle/squat_quadriceps.json +6 -0
  309. package/test-data/exercise_muscle.json +69 -0
  310. package/test-data/exercises/bench_press.json +5 -0
  311. package/test-data/exercises/deadlift.json +5 -0
  312. package/test-data/exercises/squat.json +5 -0
  313. package/test-data/exercises.json +34 -0
  314. package/test-data/muscles/abdominal.json +6 -0
  315. package/test-data/muscles/biceps.json +6 -0
  316. package/test-data/muscles/calves.json +6 -0
  317. package/test-data/muscles/deltoids.json +6 -0
  318. package/test-data/muscles/erector_spinae.json +6 -0
  319. package/test-data/muscles/forearms.json +6 -0
  320. package/test-data/muscles/gluteus_maximus.json +6 -0
  321. package/test-data/muscles/hamstrings.json +6 -0
  322. package/test-data/muscles/latissimus_dorsi.json +6 -0
  323. package/test-data/muscles/obliques.json +6 -0
  324. package/test-data/muscles/pectorals.json +6 -0
  325. package/test-data/muscles/quadriceps.json +6 -0
  326. package/test-data/muscles/trapezius.json +6 -0
  327. package/test-data/muscles/triceps.json +6 -0
  328. package/test-data/muscles.json +50 -0
  329. package/test-data/workouts/2024-06-02-001.json +10 -0
  330. package/test-data/workouts/2024-06-02-002.json +10 -0
  331. package/test-data/workouts/2024-06-02-003.json +10 -0
  332. package/test-data/workouts/2024-06-05-001.json +10 -0
  333. package/test-data/workouts/2024-06-05-002.json +10 -0
  334. package/test-data/workouts/2024-06-05-003.json +10 -0
  335. package/test-data/workouts.json +84 -0
  336. package/tsconfig.json +15 -0
package/MAIN.md ADDED
@@ -0,0 +1,15 @@
1
+ # json-file-db
2
+
3
+ Read and manage data with JSON files - a small query engine that treats a folder of JSON files as a database, with
4
+ a SQL-like query string (`read workouts where date = '2024-06-02'`) instead of a query builder API.
5
+
6
+ ## The modules
7
+
8
+ Each module of the documentation is a folder of `src/data/`:
9
+
10
+ * `introspect`: create, drop and describe a JSON-file "table" (and the policies that validate one).
11
+ * `queries`: parse a query string and run it - reads, inserts, updates, deletes, joins, `where`, `sortBy`, `groupBy`.
12
+ * `utilities`: shared helpers the queries use - retrieving records/files/indexes and merging join results.
13
+
14
+ Note: `src/index.ts` (the package's top-level entry point) is still an empty stub - there is no public
15
+ `require('json-file-db')` API yet, only the individual modules above.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # json-fs-query
2
+
3
+ Read and manage data with JSON files - a small query engine that treats a folder of JSON files as a database, with
4
+ a SQL-like query string (`read workouts where date = '2024-06-02'`) instead of a query builder API.
5
+
6
+ > **Pre-release.** The core engine (schema management plus a full read/insert/update/delete query language) is
7
+ > implemented and tested. Still open: multi-field keys, a browser-safe build, and referential integrity on
8
+ > delete/update (see the repository's issue tracker for details). Expect the public API below to stay stable, but
9
+ > breaking changes are possible before a 1.0 release.
10
+
11
+ ## Install
12
+
13
+ ```shell
14
+ npm install json-fs-query
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```js
20
+ const { create, query, drop } = require('json-fs-query')
21
+
22
+ await create('workouts', [
23
+ { name: '_id', type: 'string', optional: false, autoGenerate: true },
24
+ { name: 'reps', type: 'int', optional: false },
25
+ { name: 'date', type: 'string', optional: false }
26
+ ], [
27
+ { type: 'primary', fields: ['_id'], lookup: 'pk__id.json' }
28
+ ])
29
+
30
+ await query("insert workouts values reps = 10, date = '2024-06-02'")
31
+ const rows = await query("read workouts where date = '2024-06-02'")
32
+ await query("update workouts set reps = 12 where date = '2024-06-02'")
33
+ await query("delete workouts where date = '2024-06-02'")
34
+
35
+ await drop('workouts')
36
+ ```
37
+
38
+ This is a Node-only admin API today - `create`/`drop`/`query` all read and write real files on disk. A
39
+ browser-safe read-only build is planned but not yet built (see the pre-release note above).
40
+
41
+ ## Documentation
42
+
43
+ The reference for every function is in [`docs/`](https://joshuaheagle.com/projects/json-file-db/docs/index.html) (or open `docs/index.html` locally). It is generated from the TypeScript source, and each module is a folder of `src/data/`:
44
+
45
+ | Module | What it holds |
46
+ | --- | --- |
47
+ | `introspect` | Create, drop and describe a JSON-file "table" (and the policies that validate one) |
48
+ | `queries` | Parse a query string and run it - reads, inserts, updates, deletes, joins, `where`, `sortBy`, `groupBy` |
49
+ | `utilities` | Shared helpers the queries use - retrieving records/files/indexes and merging join results |
50
+
51
+ `src/index.ts` is the package's public entry point - it re-exports `query`, `create`, `drop`, `describe`, and the
52
+ schema-definition types (`fieldProperties`, `keyProperties`, etc.) needed to build a `create()` call. Everything else
53
+ under `src/data/` is an internal module, reachable but not part of the supported public API.
54
+
55
+ ## Development
56
+
57
+ ```shell
58
+ npm install
59
+ npm test # the tests
60
+ npm run typecheck # the types
61
+ npm run build # dist/ and docs/
62
+ npm run docs # only the documentation
63
+ ```
@@ -0,0 +1,3 @@
1
+ const babelConfig = require('js-build-tools/babel.config')
2
+ babelConfig.presets.push('@babel/preset-typescript')
3
+ module.exports = babelConfig
@@ -0,0 +1,30 @@
1
+ {
2
+ "browser": {
3
+ "enabled": false,
4
+ "name": "jsonFileDb"
5
+ },
6
+ "dist": {
7
+ "main": "dist/index.js"
8
+ },
9
+ "docs": {
10
+ "enabled": true,
11
+ "from": "src/data",
12
+ "index": "MAIN.md",
13
+ "to": "../joshuaheagle.local/projects/json-file-db/docs"
14
+ },
15
+ "typescript": {
16
+ "config": "tsconfig.json",
17
+ "enabled": true
18
+ },
19
+ "test": {
20
+ "options": {
21
+ "testMatch": [
22
+ "**/?(*.)+(spec|test).js?(x)"
23
+ ]
24
+ },
25
+ "path": "src",
26
+ "watch": "src/**/*.[jt]s"
27
+ },
28
+ "relativePath": "http://joshuaheagle.local/projects/workout-planner",
29
+ "databasePath": "database/"
30
+ }
@@ -0,0 +1,11 @@
1
+ import { recordDefinition } from './definitions/record';
2
+ import { keyProperties } from './definitions/key';
3
+ import { fieldProperties } from './definitions/field';
4
+ /**
5
+ * Create a new record.
6
+ * @param recordName
7
+ * @param definition
8
+ * @param keys
9
+ */
10
+ export declare const create: (recordName: string, definition?: fieldProperties[], keys?: keyProperties[]) => Promise<recordDefinition | null>;
11
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1,45 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.create = void 0
7
+ require('core-js/modules/es.json.stringify.js')
8
+ const _testFilesystem = require('test-filesystem')
9
+ const _record = require('./definitions/record')
10
+ const _registerRecord = require('../utilities/registerRecord')
11
+ /**
12
+ * Create a new record.
13
+ * @param recordName
14
+ * @param definition
15
+ * @param keys
16
+ */
17
+ const create = async (recordName, definition = [], keys = []) => {
18
+ const gulpConfig = require('js-build-tools/gulp.config')
19
+ const {
20
+ writeFile,
21
+ mkdir
22
+ } = require('fs/promises')
23
+ const databasePath = gulpConfig.get('databasePath', 'database/')
24
+ if (recordName === '__RECORDS') {
25
+ return null
26
+ }
27
+ if ((0, _testFilesystem.fileExists)(`${databasePath}${recordName}.json`)) {
28
+ return null
29
+ }
30
+ await mkdir(databasePath, {
31
+ recursive: true
32
+ })
33
+ const recordContent = (0, _record.record)({
34
+ path: recordName,
35
+ definition,
36
+ keys
37
+ })
38
+ await writeFile(`${databasePath}${recordName}.json`, JSON.stringify(recordContent, null, 2))
39
+ await mkdir(`${databasePath}${recordName}`, {
40
+ recursive: true
41
+ })
42
+ await (0, _registerRecord.registerRecord)(recordName)
43
+ return recordContent
44
+ }
45
+ exports.create = create
@@ -0,0 +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;
@@ -0,0 +1,28 @@
1
+ export type fieldName = string;
2
+ export type fieldDefinition = {
3
+ name: fieldName;
4
+ type: string;
5
+ optional: boolean;
6
+ default?: any;
7
+ autoGenerate: boolean;
8
+ };
9
+ export type fieldProperties = {
10
+ name?: string;
11
+ type?: string;
12
+ optional?: boolean;
13
+ useDefault?: boolean;
14
+ defaultValue?: any;
15
+ autoGenerate?: boolean;
16
+ };
17
+ /**
18
+ * Generate a field for a record.
19
+ * @param properties
20
+ * @param properties.name
21
+ * @param properties.type
22
+ * @param properties.optional
23
+ * @param properties.useDefault
24
+ * @param properties.defaultValue
25
+ * @param properties.autoGenerate
26
+ */
27
+ export declare const field: ({ name, type, optional, useDefault, defaultValue, autoGenerate }?: fieldProperties) => fieldDefinition;
28
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1,36 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.field = void 0
7
+ /**
8
+ * Generate a field for a record.
9
+ * @param properties
10
+ * @param properties.name
11
+ * @param properties.type
12
+ * @param properties.optional
13
+ * @param properties.useDefault
14
+ * @param properties.defaultValue
15
+ * @param properties.autoGenerate
16
+ */
17
+ const field = ({
18
+ name = '',
19
+ type = 'string',
20
+ optional = false,
21
+ useDefault = false,
22
+ defaultValue = '',
23
+ autoGenerate = false
24
+ } = {}) => {
25
+ const returnField = {
26
+ name,
27
+ type,
28
+ optional,
29
+ autoGenerate
30
+ }
31
+ if (useDefault) {
32
+ returnField.default = defaultValue
33
+ }
34
+ return returnField
35
+ }
36
+ exports.field = field
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.field=void 0;const field=({name:e="",type:t="string",optional:o=!1,useDefault:a=!1,defaultValue:l="",autoGenerate:n=!1}={})=>{const r={name:e,type:t,optional:o,autoGenerate:n};return a&&(r.default=l),r};exports.field=field;
@@ -0,0 +1,26 @@
1
+ import { reference } from './keyReference';
2
+ import { fieldName } from './field';
3
+ export type indexType = string;
4
+ export type indexLocation = string;
5
+ export type keyDefinition = {
6
+ type: indexType;
7
+ fields: Array<fieldName>;
8
+ lookup: indexLocation;
9
+ references?: Array<reference>;
10
+ };
11
+ export type keyProperties = {
12
+ type?: indexType;
13
+ fields?: Array<fieldName>;
14
+ lookup?: indexLocation;
15
+ references?: Array<reference>;
16
+ };
17
+ /**
18
+ * Create a field key.
19
+ * @param properties
20
+ * @param properties.type
21
+ * @param properties.fields
22
+ * @param properties.lookup
23
+ * @param properties.references
24
+ */
25
+ export declare const key: ({ type, fields, lookup, references }?: keyProperties) => keyDefinition;
26
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1,53 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.key = void 0
7
+ require('core-js/modules/esnext.iterator.constructor.js')
8
+ require('core-js/modules/esnext.iterator.map.js')
9
+ const _keyReference = require('./keyReference')
10
+ /**
11
+ * Create a field key.
12
+ * @param properties
13
+ * @param properties.type
14
+ * @param properties.fields
15
+ * @param properties.lookup
16
+ * @param properties.references
17
+ */
18
+ const key = ({
19
+ type = 'index',
20
+ fields = [],
21
+ lookup = '',
22
+ references = []
23
+ } = {}) => {
24
+ switch (type) {
25
+ case 'primary':
26
+ case 'index':
27
+ case 'unique':
28
+ references = []
29
+ break
30
+ case 'multi':
31
+ if (fields.length < 2) {
32
+ throw new Error('Multi key indicated with less than two fields')
33
+ }
34
+ break
35
+ case 'foreign':
36
+ if (references.length < 1) {
37
+ throw new Error('Foreign key must have one reference to an external record')
38
+ }
39
+ break
40
+ default:
41
+ throw new Error('Unrecognized key type; must be index, primary, unique, multi, or foreign')
42
+ }
43
+ const keyDefinition = {
44
+ type,
45
+ fields,
46
+ lookup
47
+ }
48
+ if (typeof references !== 'undefined' && references.length > 0) {
49
+ keyDefinition.references = references.map(_keyReference.keyReference)
50
+ }
51
+ return keyDefinition
52
+ }
53
+ exports.key = key
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.key=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.map.js");var _keyReference=require("./keyReference");const key=({type:e="index",fields:r=[],lookup:t="",references:o=[]}={})=>{switch(e){case"primary":case"index":case"unique":o=[];break;case"multi":if(r.length<2)throw new Error("Multi key indicated with less than two fields");break;case"foreign":if(o.length<1)throw new Error("Foreign key must have one reference to an external record");break;default:throw new Error("Unrecognized key type; must be index, primary, unique, multi, or foreign")}const n={type:e,fields:r,lookup:t};return void 0!==o&&o.length>0&&(n.references=o.map(_keyReference.keyReference)),n};exports.key=key;
@@ -0,0 +1,18 @@
1
+ import { fieldName } from './field';
2
+ import { recordPath } from './record';
3
+ export type reference = {
4
+ fields: fieldName[];
5
+ lookup: recordPath;
6
+ };
7
+ export type referenceProperties = {
8
+ fields?: fieldName[];
9
+ lookup?: recordPath;
10
+ };
11
+ /**
12
+ * Create a reference to a remote (foreign; existing on another record) key.
13
+ * @param properties
14
+ * @param properties.fields
15
+ * @param properties.lookup
16
+ */
17
+ export declare const keyReference: ({ fields, lookup }?: referenceProperties) => reference;
18
+ //# sourceMappingURL=keyReference.d.ts.map
@@ -0,0 +1,20 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.keyReference = void 0
7
+ /**
8
+ * Create a reference to a remote (foreign; existing on another record) key.
9
+ * @param properties
10
+ * @param properties.fields
11
+ * @param properties.lookup
12
+ */
13
+ const keyReference = ({
14
+ fields = [],
15
+ lookup = ''
16
+ } = {}) => ({
17
+ fields,
18
+ lookup
19
+ })
20
+ exports.keyReference = keyReference
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.keyReference=void 0;const keyReference=({fields:e=[],lookup:o=""}={})=>({fields:e,lookup:o});exports.keyReference=keyReference;
@@ -0,0 +1,26 @@
1
+ import { fieldDefinition, fieldProperties } from './field';
2
+ import { keyDefinition, keyProperties } from './key';
3
+ export type recordPath = string;
4
+ export type entityPath = string;
5
+ export type recordDefinition = {
6
+ path: recordPath;
7
+ definition: fieldDefinition[];
8
+ keys: keyDefinition[];
9
+ entries: entityPath[];
10
+ };
11
+ export type recordProperties = {
12
+ path?: recordPath;
13
+ definition?: fieldProperties[];
14
+ keys?: keyProperties[];
15
+ entries?: entityPath[];
16
+ };
17
+ /**
18
+ *
19
+ * @param properties
20
+ * @param properties.path
21
+ * @param properties.definition
22
+ * @param properties.keys
23
+ * @param properties.entries
24
+ */
25
+ export declare const record: ({ path, definition, keys, entries }?: recordProperties) => recordDefinition;
26
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1,32 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.record = void 0
7
+ require('core-js/modules/esnext.iterator.constructor.js')
8
+ require('core-js/modules/esnext.iterator.map.js')
9
+ const _field = require('./field')
10
+ const _key = require('./key')
11
+ /**
12
+ *
13
+ * @param properties
14
+ * @param properties.path
15
+ * @param properties.definition
16
+ * @param properties.keys
17
+ * @param properties.entries
18
+ */
19
+ const record = ({
20
+ path = '',
21
+ definition = [],
22
+ keys = [],
23
+ entries = []
24
+ } = {}) => {
25
+ return {
26
+ path,
27
+ definition: definition.map(_field.field),
28
+ keys: keys.map(_key.key),
29
+ entries
30
+ }
31
+ }
32
+ exports.record = record
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.record=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.map.js");var _field=require("./field"),_key=require("./key");const record=({path:e="",definition:r=[],keys:t=[],entries:i=[]}={})=>({path:e,definition:r.map(_field.field),keys:t.map(_key.key),entries:i});exports.record=record;
@@ -0,0 +1,2 @@
1
+ export declare const describe: (record?: string) => Promise<any>;
2
+ //# sourceMappingURL=describe.d.ts.map
@@ -0,0 +1,15 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.describe = void 0
7
+ const _retrieveFile = require('../utilities/retrieveFile')
8
+ const describe = async (record = '__RECORDS') => {
9
+ const recordFile = await (0, _retrieveFile.retrieveFile)(`${record}.json`)
10
+ if (record === '__RECORDS') {
11
+ return recordFile.entries
12
+ }
13
+ return recordFile.definition
14
+ }
15
+ exports.describe = describe
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.describe=void 0;var _retrieveFile=require("../utilities/retrieveFile");const describe=async(e="__RECORDS")=>{const i=await(0,_retrieveFile.retrieveFile)(`${e}.json`);return"__RECORDS"===e?i.entries:i.definition};exports.describe=describe;
@@ -0,0 +1,2 @@
1
+ export declare const drop: (record: any) => Promise<any>;
2
+ //# sourceMappingURL=drop.d.ts.map
@@ -0,0 +1,37 @@
1
+ 'use strict'
2
+
3
+ require('core-js/modules/esnext.async-iterator.constructor.js')
4
+ require('core-js/modules/esnext.async-iterator.drop.js')
5
+ require('core-js/modules/esnext.iterator.constructor.js')
6
+ require('core-js/modules/esnext.iterator.drop.js')
7
+ Object.defineProperty(exports, '__esModule', {
8
+ value: true
9
+ })
10
+ exports.drop = void 0
11
+ const _retrieveFile = require('../utilities/retrieveFile')
12
+ const _deregisterRecord = require('../utilities/deregisterRecord')
13
+ const gulpConfig = require('js-build-tools/gulp.config')
14
+ const {
15
+ rm
16
+ } = require('fs/promises')
17
+ const drop = async record => {
18
+ const databasePath = gulpConfig.get('databasePath', 'database/')
19
+ if (record === '__RECORDS') {
20
+ return null
21
+ }
22
+ const recordFile = await (0, _retrieveFile.retrieveFile)(`${record}.json`)
23
+ for (const file of recordFile.entries) {
24
+ await rm(`${databasePath}${recordFile.path}/${file}`)
25
+ }
26
+ await rm(`${databasePath}${recordFile.path}`, {
27
+ recursive: true,
28
+ force: true
29
+ })
30
+ await rm(`${databasePath}__indexes/${recordFile.path}`, {
31
+ recursive: true,
32
+ force: true
33
+ })
34
+ await rm(`${databasePath}${record}.json`)
35
+ await (0, _deregisterRecord.deregisterRecord)(record)
36
+ }
37
+ exports.drop = drop
@@ -0,0 +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;
@@ -0,0 +1,8 @@
1
+ export { create } from './create';
2
+ export { drop } from './drop';
3
+ export { describe } from './describe';
4
+ export { fieldProperties, fieldDefinition, fieldName } from './definitions/field';
5
+ export { keyProperties, keyDefinition, indexType, indexLocation } from './definitions/key';
6
+ export { referenceProperties, reference } from './definitions/keyReference';
7
+ export { recordProperties, recordDefinition, recordPath, entityPath } from './definitions/record';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,30 @@
1
+ 'use strict'
2
+
3
+ require('core-js/modules/esnext.async-iterator.constructor.js')
4
+ require('core-js/modules/esnext.async-iterator.drop.js')
5
+ require('core-js/modules/esnext.iterator.constructor.js')
6
+ require('core-js/modules/esnext.iterator.drop.js')
7
+ Object.defineProperty(exports, '__esModule', {
8
+ value: true
9
+ })
10
+ Object.defineProperty(exports, 'create', {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _create.create
14
+ }
15
+ })
16
+ Object.defineProperty(exports, 'describe', {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _describe.describe
20
+ }
21
+ })
22
+ Object.defineProperty(exports, 'drop', {
23
+ enumerable: true,
24
+ get: function () {
25
+ return _drop.drop
26
+ }
27
+ })
28
+ var _create = require('./create')
29
+ var _drop = require('./drop')
30
+ var _describe = require('./describe')
@@ -0,0 +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}),Object.defineProperty(exports,"create",{enumerable:!0,get:function(){return _create.create}}),Object.defineProperty(exports,"describe",{enumerable:!0,get:function(){return _describe.describe}}),Object.defineProperty(exports,"drop",{enumerable:!0,get:function(){return _drop.drop}});var _create=require("./create"),_drop=require("./drop"),_describe=require("./describe");
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check whether any record in the referenced entity has the given property set to the given
3
+ * value - the mirror image of keyUnique(), which checks that no record already has a value.
4
+ * @param entity
5
+ * @param property
6
+ * @param value
7
+ */
8
+ export declare const foreignKeyExists: (entity: string, property: string, value: any) => Promise<boolean>;
9
+ //# sourceMappingURL=foreignKeyExists.d.ts.map
@@ -0,0 +1,25 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.foreignKeyExists = void 0
7
+ const _retrieveRecords = require('../../utilities/retrieveRecords')
8
+ const _where = require('../../queries/where')
9
+ /**
10
+ * Check whether any record in the referenced entity has the given property set to the given
11
+ * value - the mirror image of keyUnique(), which checks that no record already has a value.
12
+ * @param entity
13
+ * @param property
14
+ * @param value
15
+ */
16
+ const foreignKeyExists = async (entity, property, value) => {
17
+ const records = await (0, _retrieveRecords.retrieveRecords)(entity)
18
+ const found = (0, _where.where)(records, {
19
+ property,
20
+ comparator: '=',
21
+ value
22
+ })
23
+ return found.length > 0
24
+ }
25
+ exports.foreignKeyExists = foreignKeyExists
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.foreignKeyExists=void 0;var _retrieveRecords=require("../../utilities/retrieveRecords"),_where=require("../../queries/where");const foreignKeyExists=async(e,r,t)=>{const s=await(0,_retrieveRecords.retrieveRecords)(e);return(0,_where.where)(s,{property:r,comparator:"=",value:t}).length>0};exports.foreignKeyExists=foreignKeyExists;
@@ -0,0 +1,2 @@
1
+ export declare const keyGenerate: (entity: any, references?: any[]) => Promise<any>;
2
+ //# sourceMappingURL=keyGenerate.d.ts.map
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.keyGenerate = void 0
7
+ const _keyUnique = require('./keyUnique')
8
+ const keyGenerate = async (entity, references = []) => {
9
+ let uuid = null
10
+ let isUnique = false
11
+ while (!isUnique) {
12
+ uuid = crypto.randomUUID()
13
+ isUnique = await (0, _keyUnique.keyUnique)(entity, references, uuid)
14
+ }
15
+ return uuid
16
+ }
17
+ exports.keyGenerate = keyGenerate
@@ -0,0 +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;
@@ -0,0 +1,2 @@
1
+ export declare const keyUnique: (entity: any, references?: any[], checkKey?: any) => Promise<boolean>;
2
+ //# sourceMappingURL=keyUnique.d.ts.map
@@ -0,0 +1,21 @@
1
+ 'use strict'
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ })
6
+ exports.keyUnique = void 0
7
+ const _retrieveRecords = require('../../utilities/retrieveRecords')
8
+ const _where = require('../../queries/where')
9
+ const keyUnique = async (entity, references = [], checkKey = null) => {
10
+ if (references.length !== 1) {
11
+ return false
12
+ }
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
20
+ }
21
+ exports.keyUnique = keyUnique
@@ -0,0 +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;