json-fs-query 1.0.5 → 1.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 (94) hide show
  1. package/browser/jsonFsQuery.js +520 -363
  2. package/browser/jsonFsQuery.min.js +1 -1
  3. package/dist/data/introspect/create.js +46 -46
  4. package/dist/data/introspect/definitions/field.js +35 -35
  5. package/dist/data/introspect/definitions/key.js +52 -52
  6. package/dist/data/introspect/definitions/keyReference.js +19 -19
  7. package/dist/data/introspect/definitions/record.js +31 -31
  8. package/dist/data/introspect/describe.js +14 -14
  9. package/dist/data/introspect/drop.js +36 -36
  10. package/dist/data/introspect/index.js +29 -29
  11. package/dist/data/introspect/policies/foreignKeyExists.js +5 -1
  12. package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
  13. package/dist/data/introspect/policies/hasDependents.js +3 -1
  14. package/dist/data/introspect/policies/hasDependents.min.js +1 -1
  15. package/dist/data/introspect/policies/keyGenerate.js +16 -16
  16. package/dist/data/introspect/policies/keyUnique.js +5 -1
  17. package/dist/data/introspect/policies/keyUnique.min.js +1 -1
  18. package/dist/data/introspect/policies/typeCheck.js +56 -56
  19. package/dist/data/introspect/policies/typeEnum.js +13 -13
  20. package/dist/data/introspect/policies/useDefault.js +12 -12
  21. package/dist/data/queries/deleteEntity.js +2 -1
  22. package/dist/data/queries/deleteEntity.min.js +1 -1
  23. package/dist/data/queries/groupBy.js +21 -21
  24. package/dist/data/queries/insertEntity.js +2 -1
  25. package/dist/data/queries/insertEntity.min.js +1 -1
  26. package/dist/data/queries/joinEntity.js +31 -31
  27. package/dist/data/queries/limitOffset.js +20 -20
  28. package/dist/data/queries/mergeJoins.js +18 -18
  29. package/dist/data/queries/parser.js +29 -29
  30. package/dist/data/queries/query.js +17 -17
  31. package/dist/data/queries/readEntity.js +13 -13
  32. package/dist/data/queries/selectFields.js +35 -35
  33. package/dist/data/queries/sortBy.js +3 -0
  34. package/dist/data/queries/updateEntity.js +14 -10
  35. package/dist/data/queries/updateEntity.min.js +1 -1
  36. package/dist/data/queries/where.d.ts +7 -6
  37. package/dist/data/queries/where.js +18 -6
  38. package/dist/data/queries/where.min.js +1 -1
  39. package/dist/data/utilities/compareAs.d.ts +20 -0
  40. package/dist/data/utilities/compareAs.js +58 -0
  41. package/dist/data/utilities/compareAs.min.js +1 -0
  42. package/dist/data/utilities/computeKeyValue.js +25 -25
  43. package/dist/data/utilities/config.js +44 -44
  44. package/dist/data/utilities/deregisterRecord.js +33 -33
  45. package/dist/data/utilities/fieldType.d.ts +16 -0
  46. package/dist/data/utilities/fieldType.js +23 -0
  47. package/dist/data/utilities/fieldType.min.js +1 -0
  48. package/dist/data/utilities/getConditionIndexedList.js +2 -1
  49. package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
  50. package/dist/data/utilities/getJoinIndexedList.js +75 -75
  51. package/dist/data/utilities/getMatchingIndexes.js +27 -27
  52. package/dist/data/utilities/matchIndexedJoins.js +3 -1
  53. package/dist/data/utilities/matchIndexedJoins.min.js +1 -1
  54. package/dist/data/utilities/mergeJoin.js +5 -1
  55. package/dist/data/utilities/mergeJoin.min.js +1 -1
  56. package/dist/data/utilities/parsers/findCommand.js +24 -24
  57. package/dist/data/utilities/parsers/findConditions.d.ts +15 -14
  58. package/dist/data/utilities/parsers/findConditions.js +27 -27
  59. package/dist/data/utilities/parsers/findGroupBy.js +21 -21
  60. package/dist/data/utilities/parsers/findInsertValues.js +33 -33
  61. package/dist/data/utilities/parsers/findJoinClauses.js +26 -26
  62. package/dist/data/utilities/parsers/findJoinEntity.js +21 -21
  63. package/dist/data/utilities/parsers/findLimit.js +21 -21
  64. package/dist/data/utilities/parsers/findMergeJoins.js +25 -25
  65. package/dist/data/utilities/parsers/findOffset.js +21 -21
  66. package/dist/data/utilities/parsers/findSelects.js +29 -29
  67. package/dist/data/utilities/parsers/findSortClauses.js +29 -29
  68. package/dist/data/utilities/parsers/findUpdateValues.js +33 -33
  69. package/dist/data/utilities/parsers/isEntityProperty.js +7 -7
  70. package/dist/data/utilities/parsers/parseLiteralValue.js +33 -33
  71. package/dist/data/utilities/parsers/parseQuery.js +50 -50
  72. package/dist/data/utilities/parsers/removeFromQuery.js +7 -7
  73. package/dist/data/utilities/parsers/splitEntityProperty.js +22 -22
  74. package/dist/data/utilities/parsers/splitQueries.js +10 -10
  75. package/dist/data/utilities/reconcileJoin.js +25 -25
  76. package/dist/data/utilities/reconcileJoins.js +25 -25
  77. package/dist/data/utilities/registerRecord.js +66 -66
  78. package/dist/data/utilities/removeFromIndex.d.ts +14 -13
  79. package/dist/data/utilities/removeFromIndex.js +4 -2
  80. package/dist/data/utilities/removeFromIndex.min.js +1 -1
  81. package/dist/data/utilities/restrictIndexedList.js +44 -44
  82. package/dist/data/utilities/retrieveFile.js +27 -27
  83. package/dist/data/utilities/retrieveIndexes.js +23 -23
  84. package/dist/data/utilities/retrieveRecord.js +8 -8
  85. package/dist/data/utilities/retrieveRecords.js +20 -20
  86. package/dist/data/utilities/runQuery.js +26 -0
  87. package/dist/data/utilities/runQuery.min.js +1 -1
  88. package/dist/data/utilities/updateIndex.d.ts +17 -16
  89. package/dist/data/utilities/updateIndex.js +4 -2
  90. package/dist/data/utilities/updateIndex.min.js +1 -1
  91. package/dist/data/utilities/useJoinClause.js +8 -2
  92. package/dist/data/utilities/useJoinClause.min.js +1 -1
  93. package/dist/index.js +41 -41
  94. package/package.json +14 -5
@@ -1,57 +1,57 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.typeCheck = void 0;
7
- /**
8
- * Validate (and where sensible, coerce) a value against a field's declared type. Runs only
9
- * against values being written by insertEntity/updateEntity - it never re-validates data already
10
- * on disk, so a field whose declared type doesn't match its already-stored values (which can
11
- * happen, since nothing enforced this before) is left alone until something actually updates it.
12
- * An unrecognized type name is treated as unconstrained rather than rejected, so a typo in a
13
- * schema's field type can't silently block every write to that field.
14
- * @param type
15
- * @param value
16
- */
17
- const typeCheck = (type = 'string', value = undefined) => {
18
- if (typeof value === 'undefined') {
19
- return value;
20
- }
21
- switch (type) {
22
- case 'string':
23
- return typeof value === 'string' ? value : String(value);
24
- case 'int':
25
- {
26
- const coerced = Number(value);
27
- if (Number.isNaN(coerced) || !Number.isInteger(coerced)) {
28
- throw new Error(`Value "${value}" is not a valid int`);
29
- }
30
- return coerced;
31
- }
32
- case 'boolean':
33
- if (typeof value === 'boolean') {
34
- return value;
35
- }
36
- if (value === 'true') {
37
- return true;
38
- }
39
- if (value === 'false') {
40
- return false;
41
- }
42
- throw new Error(`Value "${value}" is not a valid boolean`);
43
- case 'object':
44
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
45
- throw new Error(`Value "${value}" is not a valid object`);
46
- }
47
- return value;
48
- case 'array':
49
- if (!Array.isArray(value)) {
50
- throw new Error(`Value "${value}" is not a valid array`);
51
- }
52
- return value;
53
- default:
54
- return value;
55
- }
56
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.typeCheck = void 0;
7
+ /**
8
+ * Validate (and where sensible, coerce) a value against a field's declared type. Runs only
9
+ * against values being written by insertEntity/updateEntity - it never re-validates data already
10
+ * on disk, so a field whose declared type doesn't match its already-stored values (which can
11
+ * happen, since nothing enforced this before) is left alone until something actually updates it.
12
+ * An unrecognized type name is treated as unconstrained rather than rejected, so a typo in a
13
+ * schema's field type can't silently block every write to that field.
14
+ * @param type
15
+ * @param value
16
+ */
17
+ const typeCheck = (type = 'string', value = undefined) => {
18
+ if (typeof value === 'undefined') {
19
+ return value;
20
+ }
21
+ switch (type) {
22
+ case 'string':
23
+ return typeof value === 'string' ? value : String(value);
24
+ case 'int':
25
+ {
26
+ const coerced = Number(value);
27
+ if (Number.isNaN(coerced) || !Number.isInteger(coerced)) {
28
+ throw new Error(`Value "${value}" is not a valid int`);
29
+ }
30
+ return coerced;
31
+ }
32
+ case 'boolean':
33
+ if (typeof value === 'boolean') {
34
+ return value;
35
+ }
36
+ if (value === 'true') {
37
+ return true;
38
+ }
39
+ if (value === 'false') {
40
+ return false;
41
+ }
42
+ throw new Error(`Value "${value}" is not a valid boolean`);
43
+ case 'object':
44
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
45
+ throw new Error(`Value "${value}" is not a valid object`);
46
+ }
47
+ return value;
48
+ case 'array':
49
+ if (!Array.isArray(value)) {
50
+ throw new Error(`Value "${value}" is not a valid array`);
51
+ }
52
+ return value;
53
+ default:
54
+ return value;
55
+ }
56
+ };
57
57
  exports.typeCheck = typeCheck;
@@ -1,14 +1,14 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.typeEnum = void 0;
7
- require("core-js/modules/es.array.includes.js");
8
- const typeEnum = (values = [], value = '', optional = false) => {
9
- if (values.includes(value)) {
10
- return true;
11
- }
12
- return typeof value === 'undefined' && optional;
13
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.typeEnum = void 0;
7
+ require("core-js/modules/es.array.includes.js");
8
+ const typeEnum = (values = [], value = '', optional = false) => {
9
+ if (values.includes(value)) {
10
+ return true;
11
+ }
12
+ return typeof value === 'undefined' && optional;
13
+ };
14
14
  exports.typeEnum = typeEnum;
@@ -1,13 +1,13 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useDefault = void 0;
7
- const useDefault = (defaultValue = '', value = undefined) => {
8
- if (typeof value === 'undefined') {
9
- return defaultValue;
10
- }
11
- return value;
12
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useDefault = void 0;
7
+ const useDefault = (defaultValue = '', value = undefined) => {
8
+ if (typeof value === 'undefined') {
9
+ return defaultValue;
10
+ }
11
+ return value;
12
+ };
13
13
  exports.useDefault = useDefault;
@@ -28,6 +28,7 @@ var _retrieveRecord = require("../utilities/retrieveRecord");
28
28
  var _retrieveFile = require("../utilities/retrieveFile");
29
29
  var _removeFromIndex = require("../utilities/removeFromIndex");
30
30
  var _computeKeyValue = require("../utilities/computeKeyValue");
31
+ var _fieldType = require("../utilities/fieldType");
31
32
  var _hasDependents = require("../introspect/policies/hasDependents");
32
33
  var _config = require("../utilities/config");
33
34
  const {
@@ -75,7 +76,7 @@ const removeMatchingEntries = async (entity, record, primaryKey, deletedValues)
75
76
  }
76
77
  await rm(`${databasePath}${record.path}/${fileName}`);
77
78
  for (const key of record.keys) {
78
- await (0, _removeFromIndex.removeFromIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, data), fileName);
79
+ await (0, _removeFromIndex.removeFromIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, data), fileName, (0, _fieldType.keyValueType)(record, key));
79
80
  }
80
81
  }
81
82
  return remainingEntries;
@@ -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"),_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
+ "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"),_fieldType=require("../utilities/fieldType"),_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,(0,_fieldType.keyValueType)(r,s))}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 (!Object.prototype.hasOwnProperty.call(groupedData, property)) {
16
- groupedData[property] = [];
17
- }
18
- groupedData[property].push(data);
19
- return groupedData;
20
- }, {});
21
- };
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
22
  exports.groupBy = groupBy;
@@ -17,6 +17,7 @@ var _typeCheck = require("../introspect/policies/typeCheck");
17
17
  var _foreignKeyExists = require("../introspect/policies/foreignKeyExists");
18
18
  var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
19
19
  var _computeKeyValue = require("../utilities/computeKeyValue");
20
+ var _fieldType = require("../utilities/fieldType");
20
21
  var _config = require("../utilities/config");
21
22
  const {
22
23
  writeFile
@@ -108,7 +109,7 @@ const insertEntity = async (entity = '', values = [], dataSet = {}) => {
108
109
  record.entries.push(fileName);
109
110
  await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
110
111
  for (const key of record.keys) {
111
- await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName);
112
+ await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName, (0, _fieldType.keyValueType)(record, key));
112
113
  }
113
114
  dataSet[entity].push(entityValues);
114
115
  }
@@ -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"),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;
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"),_fieldType=require("../utilities/fieldType"),_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,(0,_fieldType.keyValueType)(s,e));i[e].push(t)}return i};exports.insertEntity=insertEntity;
@@ -1,32 +1,32 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.joinEntity = void 0;
7
- var _siFunciona = _interopRequireDefault(require("si-funciona"));
8
- var _readEntity = require("./readEntity");
9
- var _useJoinClause = require("../utilities/useJoinClause");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
- const joinEntity = async (entity, joinEntity, dataSets = {}, joinClauses = [], entityAlreadyResolved = false) => {
12
- // Same ambiguity readEntity() always has (can't tell "never loaded" from "loaded, zero rows
13
- // matched") - runQuery already resolved entity's rows via an indexed condition in that second
14
- // case, so entityAlreadyResolved tells this call not to reload and silently discard that result.
15
- if (!entityAlreadyResolved) {
16
- dataSets = await (0, _readEntity.readEntity)(entity, dataSets);
17
- }
18
- if (!joinClauses.length) {
19
- return dataSets;
20
- }
21
- dataSets = await (0, _readEntity.readEntity)(joinEntity, dataSets);
22
- for (const anEntity in dataSets[entity]) {
23
- let filterJoins = _siFunciona.default.cloneObject(dataSets);
24
- filterJoins[entity] = [dataSets[entity][anEntity]];
25
- for (const joinClause of joinClauses) {
26
- filterJoins = await (0, _useJoinClause.useJoinClause)(joinClause, dataSets, filterJoins);
27
- }
28
- dataSets[entity][anEntity][joinEntity] = filterJoins[joinEntity];
29
- }
30
- return dataSets;
31
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.joinEntity = void 0;
7
+ var _siFunciona = _interopRequireDefault(require("si-funciona"));
8
+ var _readEntity = require("./readEntity");
9
+ var _useJoinClause = require("../utilities/useJoinClause");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const joinEntity = async (entity, joinEntity, dataSets = {}, joinClauses = [], entityAlreadyResolved = false) => {
12
+ // Same ambiguity readEntity() always has (can't tell "never loaded" from "loaded, zero rows
13
+ // matched") - runQuery already resolved entity's rows via an indexed condition in that second
14
+ // case, so entityAlreadyResolved tells this call not to reload and silently discard that result.
15
+ if (!entityAlreadyResolved) {
16
+ dataSets = await (0, _readEntity.readEntity)(entity, dataSets);
17
+ }
18
+ if (!joinClauses.length) {
19
+ return dataSets;
20
+ }
21
+ dataSets = await (0, _readEntity.readEntity)(joinEntity, dataSets);
22
+ for (const anEntity in dataSets[entity]) {
23
+ let filterJoins = _siFunciona.default.cloneObject(dataSets);
24
+ filterJoins[entity] = [dataSets[entity][anEntity]];
25
+ for (const joinClause of joinClauses) {
26
+ filterJoins = await (0, _useJoinClause.useJoinClause)(joinClause, dataSets, filterJoins);
27
+ }
28
+ dataSets[entity][anEntity][joinEntity] = filterJoins[joinEntity];
29
+ }
30
+ return dataSets;
31
+ };
32
32
  exports.joinEntity = joinEntity;
@@ -1,21 +1,21 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.limitOffset = void 0;
7
- /**
8
- * Slice a dataSet down to at most `limit` rows, starting after the first `offset` of them.
9
- * @param dataSet
10
- * @param offset
11
- * @param limit
12
- */
13
- const limitOffset = (dataSet = [], offset, limit) => {
14
- if (typeof offset === 'undefined' && typeof limit === 'undefined') {
15
- return dataSet;
16
- }
17
- const start = offset ?? 0;
18
- const end = typeof limit === 'number' ? start + limit : undefined;
19
- return dataSet.slice(start, end);
20
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.limitOffset = void 0;
7
+ /**
8
+ * Slice a dataSet down to at most `limit` rows, starting after the first `offset` of them.
9
+ * @param dataSet
10
+ * @param offset
11
+ * @param limit
12
+ */
13
+ const limitOffset = (dataSet = [], offset, limit) => {
14
+ if (typeof offset === 'undefined' && typeof limit === 'undefined') {
15
+ return dataSet;
16
+ }
17
+ const start = offset ?? 0;
18
+ const end = typeof limit === 'number' ? start + limit : undefined;
19
+ return dataSet.slice(start, end);
20
+ };
21
21
  exports.limitOffset = limitOffset;
@@ -1,19 +1,19 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.mergeJoins = void 0;
7
- var _mergeJoin = require("../utilities/mergeJoin");
8
- var _reconcileJoins = require("../utilities/reconcileJoins");
9
- const mergeJoins = async (dataSet = {}, merges = []) => {
10
- if (!merges.length) {
11
- return dataSet;
12
- }
13
- for (const merge of merges) {
14
- dataSet = await (0, _mergeJoin.mergeJoin)(merge.propertyA, merge.propertyB, dataSet);
15
- dataSet = (0, _reconcileJoins.reconcileJoins)(merge.propertyA, merge.propertyB, dataSet);
16
- }
17
- return dataSet;
18
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mergeJoins = void 0;
7
+ var _mergeJoin = require("../utilities/mergeJoin");
8
+ var _reconcileJoins = require("../utilities/reconcileJoins");
9
+ const mergeJoins = async (dataSet = {}, merges = []) => {
10
+ if (!merges.length) {
11
+ return dataSet;
12
+ }
13
+ for (const merge of merges) {
14
+ dataSet = await (0, _mergeJoin.mergeJoin)(merge.propertyA, merge.propertyB, dataSet);
15
+ dataSet = (0, _reconcileJoins.reconcileJoins)(merge.propertyA, merge.propertyB, dataSet);
16
+ }
17
+ return dataSet;
18
+ };
19
19
  exports.mergeJoins = mergeJoins;
@@ -1,30 +1,30 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.parser = void 0;
7
- var _splitQueries = require("../utilities/parsers/splitQueries");
8
- var _parseQuery = require("../utilities/parsers/parseQuery");
9
- const parser = (queries = '') => {
10
- const queryArray = (0, _splitQueries.splitQueries)(queries);
11
- const parsedQueries = [];
12
- let mergeQuery = '';
13
- for (const query of queryArray) {
14
- mergeQuery = mergeQuery ? `${mergeQuery}${query}` : query;
15
- let parsedQuery = {};
16
- try {
17
- parsedQuery = (0, _parseQuery.parseQuery)(mergeQuery);
18
- mergeQuery = '';
19
- } catch (e) {
20
- // attempt to combine queries to fix bad splits
21
- continue;
22
- }
23
- parsedQueries.push(parsedQuery);
24
- }
25
- if (mergeQuery) {
26
- throw new Error(`Failed to interpret: ${mergeQuery}`);
27
- }
28
- return parsedQueries;
29
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parser = void 0;
7
+ var _splitQueries = require("../utilities/parsers/splitQueries");
8
+ var _parseQuery = require("../utilities/parsers/parseQuery");
9
+ const parser = (queries = '') => {
10
+ const queryArray = (0, _splitQueries.splitQueries)(queries);
11
+ const parsedQueries = [];
12
+ let mergeQuery = '';
13
+ for (const query of queryArray) {
14
+ mergeQuery = mergeQuery ? `${mergeQuery}${query}` : query;
15
+ let parsedQuery = {};
16
+ try {
17
+ parsedQuery = (0, _parseQuery.parseQuery)(mergeQuery);
18
+ mergeQuery = '';
19
+ } catch (e) {
20
+ // attempt to combine queries to fix bad splits
21
+ continue;
22
+ }
23
+ parsedQueries.push(parsedQuery);
24
+ }
25
+ if (mergeQuery) {
26
+ throw new Error(`Failed to interpret: ${mergeQuery}`);
27
+ }
28
+ return parsedQueries;
29
+ };
30
30
  exports.parser = parser;
@@ -1,18 +1,18 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.query = void 0;
7
- var _parser = require("./parser");
8
- var _runQuery = require("../utilities/runQuery");
9
- const query = async (queryString = '') => {
10
- const parsedQueries = (0, _parser.parser)(queryString);
11
- const queryResults = [];
12
- for (const parsed of parsedQueries) {
13
- const dataSet = await (0, _runQuery.runQuery)(parsed);
14
- queryResults.push(dataSet[parsed.entity]);
15
- }
16
- return queryResults;
17
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.query = void 0;
7
+ var _parser = require("./parser");
8
+ var _runQuery = require("../utilities/runQuery");
9
+ const query = async (queryString = '') => {
10
+ const parsedQueries = (0, _parser.parser)(queryString);
11
+ const queryResults = [];
12
+ for (const parsed of parsedQueries) {
13
+ const dataSet = await (0, _runQuery.runQuery)(parsed);
14
+ queryResults.push(dataSet[parsed.entity]);
15
+ }
16
+ return queryResults;
17
+ };
18
18
  exports.query = query;
@@ -1,14 +1,14 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.readEntity = void 0;
7
- var _retrieveRecords = require("../utilities/retrieveRecords");
8
- const readEntity = async (entity = '', dataSet = {}) => {
9
- if (!Object.prototype.hasOwnProperty.call(dataSet, entity) || !dataSet[entity].length) {
10
- dataSet[entity] = await (0, _retrieveRecords.retrieveRecords)(entity);
11
- }
12
- return dataSet;
13
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.readEntity = void 0;
7
+ var _retrieveRecords = require("../utilities/retrieveRecords");
8
+ const readEntity = async (entity = '', dataSet = {}) => {
9
+ if (!Object.prototype.hasOwnProperty.call(dataSet, entity) || !dataSet[entity].length) {
10
+ dataSet[entity] = await (0, _retrieveRecords.retrieveRecords)(entity);
11
+ }
12
+ return dataSet;
13
+ };
14
14
  exports.readEntity = readEntity;
@@ -1,36 +1,36 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.selectFields = void 0;
7
- require("core-js/modules/esnext.iterator.constructor.js");
8
- require("core-js/modules/esnext.iterator.map.js");
9
- require("core-js/modules/esnext.iterator.reduce.js");
10
- const shapeRow = (row, selectClauses) => selectClauses.reduce((shaped, {
11
- property,
12
- alias
13
- }) => {
14
- shaped[alias || property] = row[property];
15
- return shaped;
16
- }, {});
17
- /**
18
- * Shape each row down to only the selected properties (aliased, when given). dataSet is either a plain array of
19
- * rows, or (once groupBy has run) a plain object keyed by group value, each value an array of rows - both are
20
- * shaped the same way, row by row.
21
- * @param dataSet
22
- * @param selectClauses
23
- */
24
- const selectFields = (dataSet = [], selectClauses = []) => {
25
- if (!selectClauses.length) {
26
- return dataSet;
27
- }
28
- if (Array.isArray(dataSet)) {
29
- return dataSet.map(row => shapeRow(row, selectClauses));
30
- }
31
- return Object.keys(dataSet).reduce((shaped, key) => {
32
- shaped[key] = dataSet[key].map(row => shapeRow(row, selectClauses));
33
- return shaped;
34
- }, {});
35
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectFields = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.map.js");
9
+ require("core-js/modules/esnext.iterator.reduce.js");
10
+ const shapeRow = (row, selectClauses) => selectClauses.reduce((shaped, {
11
+ property,
12
+ alias
13
+ }) => {
14
+ shaped[alias || property] = row[property];
15
+ return shaped;
16
+ }, {});
17
+ /**
18
+ * Shape each row down to only the selected properties (aliased, when given). dataSet is either a plain array of
19
+ * rows, or (once groupBy has run) a plain object keyed by group value, each value an array of rows - both are
20
+ * shaped the same way, row by row.
21
+ * @param dataSet
22
+ * @param selectClauses
23
+ */
24
+ const selectFields = (dataSet = [], selectClauses = []) => {
25
+ if (!selectClauses.length) {
26
+ return dataSet;
27
+ }
28
+ if (Array.isArray(dataSet)) {
29
+ return dataSet.map(row => shapeRow(row, selectClauses));
30
+ }
31
+ return Object.keys(dataSet).reduce((shaped, key) => {
32
+ shaped[key] = dataSet[key].map(row => shapeRow(row, selectClauses));
33
+ return shaped;
34
+ }, {});
35
+ };
36
36
  exports.selectFields = selectFields;
@@ -12,6 +12,9 @@ const sortBy = (dataSet = [], sortClauses = []) => {
12
12
  for (const sortClause of sortClauses) {
13
13
  const property = sortClause.property;
14
14
  const direction = sortClause.direction;
15
+ // Ordering compares the raw stored values, not by declared type (that's only for equality, see where), so
16
+ // numeric ids in a string field still sort numerically. Loose so '3' and 3 still tie.
17
+ // eslint-disable-next-line eqeqeq
15
18
  if (a[property] == b[property]) {
16
19
  continue;
17
20
  }