json-fs-query 1.0.6 → 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 (42) hide show
  1. package/browser/jsonFsQuery.js +518 -361
  2. package/browser/jsonFsQuery.min.js +1 -1
  3. package/dist/data/introspect/policies/foreignKeyExists.js +28 -24
  4. package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
  5. package/dist/data/introspect/policies/hasDependents.js +53 -51
  6. package/dist/data/introspect/policies/hasDependents.min.js +1 -1
  7. package/dist/data/introspect/policies/keyUnique.js +34 -30
  8. package/dist/data/introspect/policies/keyUnique.min.js +1 -1
  9. package/dist/data/queries/deleteEntity.js +100 -99
  10. package/dist/data/queries/deleteEntity.min.js +1 -1
  11. package/dist/data/queries/insertEntity.js +117 -116
  12. package/dist/data/queries/insertEntity.min.js +1 -1
  13. package/dist/data/queries/sortBy.js +27 -24
  14. package/dist/data/queries/updateEntity.js +193 -189
  15. package/dist/data/queries/updateEntity.min.js +1 -1
  16. package/dist/data/queries/where.d.ts +7 -6
  17. package/dist/data/queries/where.js +67 -55
  18. package/dist/data/queries/where.min.js +1 -1
  19. package/dist/data/utilities/compareAs.d.ts +20 -0
  20. package/dist/data/utilities/compareAs.js +58 -0
  21. package/dist/data/utilities/compareAs.min.js +1 -0
  22. package/dist/data/utilities/fieldType.d.ts +16 -0
  23. package/dist/data/utilities/fieldType.js +23 -0
  24. package/dist/data/utilities/fieldType.min.js +1 -0
  25. package/dist/data/utilities/getConditionIndexedList.js +47 -46
  26. package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
  27. package/dist/data/utilities/matchIndexedJoins.js +62 -60
  28. package/dist/data/utilities/matchIndexedJoins.min.js +1 -1
  29. package/dist/data/utilities/mergeJoin.js +47 -43
  30. package/dist/data/utilities/mergeJoin.min.js +1 -1
  31. package/dist/data/utilities/parsers/findConditions.d.ts +15 -14
  32. package/dist/data/utilities/removeFromIndex.d.ts +14 -13
  33. package/dist/data/utilities/removeFromIndex.js +45 -43
  34. package/dist/data/utilities/removeFromIndex.min.js +1 -1
  35. package/dist/data/utilities/runQuery.js +112 -86
  36. package/dist/data/utilities/runQuery.min.js +1 -1
  37. package/dist/data/utilities/updateIndex.d.ts +17 -16
  38. package/dist/data/utilities/updateIndex.js +57 -55
  39. package/dist/data/utilities/updateIndex.min.js +1 -1
  40. package/dist/data/utilities/useJoinClause.js +56 -50
  41. package/dist/data/utilities/useJoinClause.min.js +1 -1
  42. package/package.json +6 -1
@@ -1,117 +1,118 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.insertEntity = void 0;
7
- require("core-js/modules/es.json.stringify.js");
8
- require("core-js/modules/esnext.iterator.constructor.js");
9
- require("core-js/modules/esnext.iterator.find.js");
10
- require("core-js/modules/esnext.iterator.map.js");
11
- var _retrieveRecord = require("../utilities/retrieveRecord");
12
- var _updateIndex = require("../utilities/updateIndex");
13
- var _keyGenerate = require("../introspect/policies/keyGenerate");
14
- var _keyUnique = require("../introspect/policies/keyUnique");
15
- var _useDefault = require("../introspect/policies/useDefault");
16
- var _typeCheck = require("../introspect/policies/typeCheck");
17
- var _foreignKeyExists = require("../introspect/policies/foreignKeyExists");
18
- var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
19
- var _computeKeyValue = require("../utilities/computeKeyValue");
20
- var _config = require("../utilities/config");
21
- const {
22
- writeFile
23
- } = require('fs/promises');
24
- /**
25
- * Build one entity's stored values from the raw input values, generating any autoGenerate
26
- * fields and applying field defaults, then throw if a required field still has no value.
27
- * @param entity
28
- * @param record
29
- * @param rowValues
30
- */
31
- const buildEntityValues = async (entity, record, rowValues = {}) => {
32
- const entityValues = {};
33
- for (const field of record.definition) {
34
- let value = rowValues[field.name];
35
- if (field.autoGenerate) {
36
- value = await (0, _keyGenerate.keyGenerate)(entity, [field.name]);
37
- } else if (Object.prototype.hasOwnProperty.call(field, 'default')) {
38
- value = (0, _useDefault.useDefault)(field['default'], value);
39
- }
40
- if (typeof value === 'undefined') {
41
- if (!field.optional) {
42
- throw new Error(`Missing required field "${field.name}" for ${entity}`);
43
- }
44
- continue;
45
- }
46
- entityValues[field.name] = (0, _typeCheck.typeCheck)(field.type, value);
47
- }
48
- return entityValues;
49
- };
50
- /**
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.
53
- * @param entity
54
- * @param record
55
- * @param entityValues
56
- */
57
- const assertUnique = async (entity, record, entityValues) => {
58
- for (const key of record.keys) {
59
- if (key.type !== 'primary' && key.type !== 'unique') {
60
- continue;
61
- }
62
- const checkKeys = key.fields.map(field => entityValues[field]);
63
- const isUnique = await (0, _keyUnique.keyUnique)(entity, key.fields, checkKeys);
64
- if (!isUnique) {
65
- throw new Error(`Duplicate value for ${key.type} key "${key.fields.join(', ')}" on ${entity}`);
66
- }
67
- }
68
- };
69
- /**
70
- * Reject the insert if a single-field foreign key's value doesn't exist in the record it
71
- * references.
72
- * @param entity
73
- * @param record
74
- * @param entityValues
75
- */
76
- const assertForeignKeys = async (entity, record, entityValues) => {
77
- for (const key of record.keys) {
78
- if (key.type !== 'foreign' || key.fields.length !== 1 || !key.references || key.references.length !== 1) {
79
- continue;
80
- }
81
- const field = key.fields[0];
82
- if (!Object.prototype.hasOwnProperty.call(entityValues, field)) {
83
- continue;
84
- }
85
- const {
86
- entity: refEntity,
87
- property: refProperty
88
- } = (0, _splitEntityProperty.splitEntityProperty)(key.references[0].fields[0]);
89
- const exists = await (0, _foreignKeyExists.foreignKeyExists)(refEntity, refProperty, entityValues[field]);
90
- if (!exists) {
91
- throw new Error(`Foreign key "${field}" on ${entity} references a nonexistent ${refEntity}.${refProperty} = ${entityValues[field]}`);
92
- }
93
- }
94
- };
95
- const insertEntity = async (entity = '', values = [], dataSet = {}) => {
96
- const databasePath = (0, _config.getSetting)('databasePath', 'database/');
97
- const record = await (0, _retrieveRecord.retrieveRecord)(entity);
98
- const primaryKey = record.keys.find(key => key.type === 'primary' && key.fields.length === 1);
99
- if (!Object.prototype.hasOwnProperty.call(dataSet, entity)) {
100
- dataSet[entity] = [];
101
- }
102
- for (const rowValues of values) {
103
- const entityValues = await buildEntityValues(entity, record, rowValues);
104
- await assertUnique(entity, record, entityValues);
105
- await assertForeignKeys(entity, record, entityValues);
106
- const fileName = `${primaryKey ? entityValues[primaryKey.fields[0]] : crypto.randomUUID()}.json`;
107
- await writeFile(`${databasePath}${record.path}/${fileName}`, JSON.stringify(entityValues, null, 2));
108
- record.entries.push(fileName);
109
- await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
110
- for (const key of record.keys) {
111
- await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName);
112
- }
113
- dataSet[entity].push(entityValues);
114
- }
115
- return dataSet;
116
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.insertEntity = void 0;
7
+ require("core-js/modules/es.json.stringify.js");
8
+ require("core-js/modules/esnext.iterator.constructor.js");
9
+ require("core-js/modules/esnext.iterator.find.js");
10
+ require("core-js/modules/esnext.iterator.map.js");
11
+ var _retrieveRecord = require("../utilities/retrieveRecord");
12
+ var _updateIndex = require("../utilities/updateIndex");
13
+ var _keyGenerate = require("../introspect/policies/keyGenerate");
14
+ var _keyUnique = require("../introspect/policies/keyUnique");
15
+ var _useDefault = require("../introspect/policies/useDefault");
16
+ var _typeCheck = require("../introspect/policies/typeCheck");
17
+ var _foreignKeyExists = require("../introspect/policies/foreignKeyExists");
18
+ var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
19
+ var _computeKeyValue = require("../utilities/computeKeyValue");
20
+ var _fieldType = require("../utilities/fieldType");
21
+ var _config = require("../utilities/config");
22
+ const {
23
+ writeFile
24
+ } = require('fs/promises');
25
+ /**
26
+ * Build one entity's stored values from the raw input values, generating any autoGenerate
27
+ * fields and applying field defaults, then throw if a required field still has no value.
28
+ * @param entity
29
+ * @param record
30
+ * @param rowValues
31
+ */
32
+ const buildEntityValues = async (entity, record, rowValues = {}) => {
33
+ const entityValues = {};
34
+ for (const field of record.definition) {
35
+ let value = rowValues[field.name];
36
+ if (field.autoGenerate) {
37
+ value = await (0, _keyGenerate.keyGenerate)(entity, [field.name]);
38
+ } else if (Object.prototype.hasOwnProperty.call(field, 'default')) {
39
+ value = (0, _useDefault.useDefault)(field['default'], value);
40
+ }
41
+ if (typeof value === 'undefined') {
42
+ if (!field.optional) {
43
+ throw new Error(`Missing required field "${field.name}" for ${entity}`);
44
+ }
45
+ continue;
46
+ }
47
+ entityValues[field.name] = (0, _typeCheck.typeCheck)(field.type, value);
48
+ }
49
+ return entityValues;
50
+ };
51
+ /**
52
+ * Reject the insert if it collides with an existing primary or unique key value - a single field,
53
+ * or a composite of several for a multi-field key.
54
+ * @param entity
55
+ * @param record
56
+ * @param entityValues
57
+ */
58
+ const assertUnique = async (entity, record, entityValues) => {
59
+ for (const key of record.keys) {
60
+ if (key.type !== 'primary' && key.type !== 'unique') {
61
+ continue;
62
+ }
63
+ const checkKeys = key.fields.map(field => entityValues[field]);
64
+ const isUnique = await (0, _keyUnique.keyUnique)(entity, key.fields, checkKeys);
65
+ if (!isUnique) {
66
+ throw new Error(`Duplicate value for ${key.type} key "${key.fields.join(', ')}" on ${entity}`);
67
+ }
68
+ }
69
+ };
70
+ /**
71
+ * Reject the insert if a single-field foreign key's value doesn't exist in the record it
72
+ * references.
73
+ * @param entity
74
+ * @param record
75
+ * @param entityValues
76
+ */
77
+ const assertForeignKeys = async (entity, record, entityValues) => {
78
+ for (const key of record.keys) {
79
+ if (key.type !== 'foreign' || key.fields.length !== 1 || !key.references || key.references.length !== 1) {
80
+ continue;
81
+ }
82
+ const field = key.fields[0];
83
+ if (!Object.prototype.hasOwnProperty.call(entityValues, field)) {
84
+ continue;
85
+ }
86
+ const {
87
+ entity: refEntity,
88
+ property: refProperty
89
+ } = (0, _splitEntityProperty.splitEntityProperty)(key.references[0].fields[0]);
90
+ const exists = await (0, _foreignKeyExists.foreignKeyExists)(refEntity, refProperty, entityValues[field]);
91
+ if (!exists) {
92
+ throw new Error(`Foreign key "${field}" on ${entity} references a nonexistent ${refEntity}.${refProperty} = ${entityValues[field]}`);
93
+ }
94
+ }
95
+ };
96
+ const insertEntity = async (entity = '', values = [], dataSet = {}) => {
97
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/');
98
+ const record = await (0, _retrieveRecord.retrieveRecord)(entity);
99
+ const primaryKey = record.keys.find(key => key.type === 'primary' && key.fields.length === 1);
100
+ if (!Object.prototype.hasOwnProperty.call(dataSet, entity)) {
101
+ dataSet[entity] = [];
102
+ }
103
+ for (const rowValues of values) {
104
+ const entityValues = await buildEntityValues(entity, record, rowValues);
105
+ await assertUnique(entity, record, entityValues);
106
+ await assertForeignKeys(entity, record, entityValues);
107
+ const fileName = `${primaryKey ? entityValues[primaryKey.fields[0]] : crypto.randomUUID()}.json`;
108
+ await writeFile(`${databasePath}${record.path}/${fileName}`, JSON.stringify(entityValues, null, 2));
109
+ record.entries.push(fileName);
110
+ await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
111
+ for (const key of record.keys) {
112
+ await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName, (0, _fieldType.keyValueType)(record, key));
113
+ }
114
+ dataSet[entity].push(entityValues);
115
+ }
116
+ return dataSet;
117
+ };
117
118
  exports.insertEntity = insertEntity;
@@ -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,25 +1,28 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.sortBy = void 0;
7
- const sortBy = (dataSet = [], sortClauses = []) => {
8
- if (!sortClauses.length) {
9
- return dataSet;
10
- }
11
- dataSet.sort((a, b) => {
12
- for (const sortClause of sortClauses) {
13
- const property = sortClause.property;
14
- const direction = sortClause.direction;
15
- if (a[property] == b[property]) {
16
- continue;
17
- }
18
- const result = a[property] < b[property] ? -1 : 1;
19
- return direction === 'asc' ? result : result * -1;
20
- }
21
- return 0;
22
- });
23
- return dataSet;
24
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.sortBy = void 0;
7
+ const sortBy = (dataSet = [], sortClauses = []) => {
8
+ if (!sortClauses.length) {
9
+ return dataSet;
10
+ }
11
+ dataSet.sort((a, b) => {
12
+ for (const sortClause of sortClauses) {
13
+ const property = sortClause.property;
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
18
+ if (a[property] == b[property]) {
19
+ continue;
20
+ }
21
+ const result = a[property] < b[property] ? -1 : 1;
22
+ return direction === 'asc' ? result : result * -1;
23
+ }
24
+ return 0;
25
+ });
26
+ return dataSet;
27
+ };
25
28
  exports.sortBy = sortBy;