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,87 +1,113 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.runQuery = void 0;
7
- require("core-js/modules/esnext.iterator.constructor.js");
8
- require("core-js/modules/esnext.iterator.reduce.js");
9
- var _deleteEntity = require("../queries/deleteEntity");
10
- var _insertEntity = require("../queries/insertEntity");
11
- var _readEntity = require("../queries/readEntity");
12
- var _updateEntity = require("../queries/updateEntity");
13
- var _joinEntity = require("../queries/joinEntity");
14
- var _mergeJoins = require("../queries/mergeJoins");
15
- var _where = require("../queries/where");
16
- var _sortBy = require("../queries/sortBy");
17
- var _groupBy = require("../queries/groupBy");
18
- var _limitOffset = require("../queries/limitOffset");
19
- var _selectFields = require("../queries/selectFields");
20
- var _retrieveRecord = require("./retrieveRecord");
21
- var _getConditionIndexedList = require("./getConditionIndexedList");
22
- var _getJoinIndexedList = require("./getJoinIndexedList");
23
- const runQuery = async parsed => {
24
- const recordData = {
25
- [parsed.entity]: await (0, _retrieveRecord.retrieveRecord)(parsed.entity)
26
- };
27
- if (typeof parsed.joinEntity !== 'undefined') {
28
- recordData[parsed.joinEntity] = await (0, _retrieveRecord.retrieveRecord)(parsed.joinEntity);
29
- }
30
- let dataSet = {
31
- [parsed.entity]: []
32
- };
33
- // A condition that's indexed but genuinely matches nothing leaves dataSet[entity] at [] - the
34
- // same state it starts in before anything has looked at it at all. readEntity() (below) can't
35
- // tell those two states apart on its own (it reloads whenever the array is empty, regardless of
36
- // why), so capture here, before that ambiguity can happen, whether every condition actually got
37
- // resolved this way - if so, dataSet[entity] is already correct and must not be reloaded.
38
- const hadConditions = parsed.conditions.length > 0;
39
- parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet);
40
- const conditionsFullyIndexed = hadConditions && parsed.conditions.length === 0;
41
- parsed = await (0, _getJoinIndexedList.getJoinIndexedList)(parsed, recordData, dataSet);
42
- // delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
43
- // everything and lets the where-reduce below narrow it down afterward, they never get a second
44
- // pass. So the matching rows have to be fully resolved (indexed conditions already are, via
45
- // getConditionIndexedList above; anything left in parsed.conditions is not) before either runs.
46
- if (parsed.command === 'delete' || parsed.command === 'update') {
47
- if (!conditionsFullyIndexed) {
48
- dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
49
- }
50
- dataSet[parsed.entity] = parsed.conditions.reduce((remainingData, condition) => (0, _where.where)(remainingData, condition), dataSet[parsed.entity]);
51
- }
52
- switch (parsed.command) {
53
- case 'delete':
54
- dataSet = await (0, _deleteEntity.deleteEntity)(parsed.entity, dataSet);
55
- break;
56
- case 'insert':
57
- dataSet = await (0, _insertEntity.insertEntity)(parsed.entity, parsed.insertValues, dataSet);
58
- break;
59
- case 'read':
60
- if (!conditionsFullyIndexed) {
61
- dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
62
- }
63
- break;
64
- case 'update':
65
- dataSet = await (0, _updateEntity.updateEntity)(parsed.entity, parsed.updateValues, dataSet);
66
- break;
67
- default:
68
- throw new Error(`Unknown command: ${parsed.command}`);
69
- }
70
- dataSet = await (0, _joinEntity.joinEntity)(parsed.entity, parsed.joinEntity, dataSet, parsed.joinClauses, conditionsFullyIndexed);
71
- dataSet = await (0, _mergeJoins.mergeJoins)(dataSet, parsed.mergeJoins);
72
- // delete/update already had parsed.conditions applied above, before they ran. Re-applying the
73
- // same conditions here would be wrong, not just redundant, for update specifically: if the
74
- // update just changed the very field a condition filters on, re-checking that condition against
75
- // the now-changed data would filter the just-updated rows back out.
76
- if (parsed.command !== 'delete' && parsed.command !== 'update') {
77
- dataSet[parsed.entity] = parsed.conditions.reduce((remainingData, condition) => {
78
- return (0, _where.where)(remainingData, condition);
79
- }, dataSet[parsed.entity]);
80
- }
81
- dataSet[parsed.entity] = (0, _sortBy.sortBy)(dataSet[parsed.entity], parsed.sortClauses);
82
- dataSet[parsed.entity] = (0, _limitOffset.limitOffset)(dataSet[parsed.entity], parsed.offset, parsed.limit);
83
- dataSet[parsed.entity] = (0, _groupBy.groupBy)(dataSet[parsed.entity], parsed.groupBy);
84
- dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses);
85
- return dataSet;
86
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.runQuery = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.reduce.js");
9
+ var _deleteEntity = require("../queries/deleteEntity");
10
+ var _insertEntity = require("../queries/insertEntity");
11
+ var _readEntity = require("../queries/readEntity");
12
+ var _updateEntity = require("../queries/updateEntity");
13
+ var _joinEntity = require("../queries/joinEntity");
14
+ var _mergeJoins = require("../queries/mergeJoins");
15
+ var _where = require("../queries/where");
16
+ var _sortBy = require("../queries/sortBy");
17
+ var _groupBy = require("../queries/groupBy");
18
+ var _limitOffset = require("../queries/limitOffset");
19
+ var _selectFields = require("../queries/selectFields");
20
+ var _retrieveRecord = require("./retrieveRecord");
21
+ var _getConditionIndexedList = require("./getConditionIndexedList");
22
+ var _getJoinIndexedList = require("./getJoinIndexedList");
23
+ var _isEntityProperty = require("./parsers/isEntityProperty");
24
+ var _splitEntityProperty = require("./parsers/splitEntityProperty");
25
+ var _fieldType = require("./fieldType");
26
+ /**
27
+ * Give each condition its field's declared type, so where compares by it (a joined entity's field
28
+ * is looked up on that entity's record).
29
+ * @param parsed
30
+ * @param recordData
31
+ */
32
+ const typeConditions = async (parsed, recordData) => {
33
+ for (const condition of parsed.conditions) {
34
+ let entity = parsed.entity;
35
+ let property = condition.property;
36
+ if ((0, _isEntityProperty.isEntityProperty)(property)) {
37
+ ({
38
+ entity,
39
+ property
40
+ } = (0, _splitEntityProperty.splitEntityProperty)(property));
41
+ }
42
+ if (!Object.prototype.hasOwnProperty.call(recordData, entity)) {
43
+ recordData[entity] = await (0, _retrieveRecord.retrieveRecord)(entity);
44
+ }
45
+ condition.type = (0, _fieldType.fieldType)(recordData[entity], property);
46
+ }
47
+ };
48
+ const runQuery = async parsed => {
49
+ const recordData = {
50
+ [parsed.entity]: await (0, _retrieveRecord.retrieveRecord)(parsed.entity)
51
+ };
52
+ if (typeof parsed.joinEntity !== 'undefined') {
53
+ recordData[parsed.joinEntity] = await (0, _retrieveRecord.retrieveRecord)(parsed.joinEntity);
54
+ }
55
+ await typeConditions(parsed, recordData);
56
+ let dataSet = {
57
+ [parsed.entity]: []
58
+ };
59
+ // A condition that's indexed but genuinely matches nothing leaves dataSet[entity] at [] - the
60
+ // same state it starts in before anything has looked at it at all. readEntity() (below) can't
61
+ // tell those two states apart on its own (it reloads whenever the array is empty, regardless of
62
+ // why), so capture here, before that ambiguity can happen, whether every condition actually got
63
+ // resolved this way - if so, dataSet[entity] is already correct and must not be reloaded.
64
+ const hadConditions = parsed.conditions.length > 0;
65
+ parsed = await (0, _getConditionIndexedList.getConditionIndexedList)(parsed, recordData, dataSet);
66
+ const conditionsFullyIndexed = hadConditions && parsed.conditions.length === 0;
67
+ parsed = await (0, _getJoinIndexedList.getJoinIndexedList)(parsed, recordData, dataSet);
68
+ // delete/update act on whatever is already in dataSet[entity] - unlike read, which loads
69
+ // everything and lets the where-reduce below narrow it down afterward, they never get a second
70
+ // pass. So the matching rows have to be fully resolved (indexed conditions already are, via
71
+ // getConditionIndexedList above; anything left in parsed.conditions is not) before either runs.
72
+ if (parsed.command === 'delete' || parsed.command === 'update') {
73
+ if (!conditionsFullyIndexed) {
74
+ dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
75
+ }
76
+ dataSet[parsed.entity] = parsed.conditions.reduce((remainingData, condition) => (0, _where.where)(remainingData, condition), dataSet[parsed.entity]);
77
+ }
78
+ switch (parsed.command) {
79
+ case 'delete':
80
+ dataSet = await (0, _deleteEntity.deleteEntity)(parsed.entity, dataSet);
81
+ break;
82
+ case 'insert':
83
+ dataSet = await (0, _insertEntity.insertEntity)(parsed.entity, parsed.insertValues, dataSet);
84
+ break;
85
+ case 'read':
86
+ if (!conditionsFullyIndexed) {
87
+ dataSet = await (0, _readEntity.readEntity)(parsed.entity, dataSet);
88
+ }
89
+ break;
90
+ case 'update':
91
+ dataSet = await (0, _updateEntity.updateEntity)(parsed.entity, parsed.updateValues, dataSet);
92
+ break;
93
+ default:
94
+ throw new Error(`Unknown command: ${parsed.command}`);
95
+ }
96
+ dataSet = await (0, _joinEntity.joinEntity)(parsed.entity, parsed.joinEntity, dataSet, parsed.joinClauses, conditionsFullyIndexed);
97
+ dataSet = await (0, _mergeJoins.mergeJoins)(dataSet, parsed.mergeJoins);
98
+ // delete/update already had parsed.conditions applied above, before they ran. Re-applying the
99
+ // same conditions here would be wrong, not just redundant, for update specifically: if the
100
+ // update just changed the very field a condition filters on, re-checking that condition against
101
+ // the now-changed data would filter the just-updated rows back out.
102
+ if (parsed.command !== 'delete' && parsed.command !== 'update') {
103
+ dataSet[parsed.entity] = parsed.conditions.reduce((remainingData, condition) => {
104
+ return (0, _where.where)(remainingData, condition);
105
+ }, dataSet[parsed.entity]);
106
+ }
107
+ dataSet[parsed.entity] = (0, _sortBy.sortBy)(dataSet[parsed.entity], parsed.sortClauses);
108
+ dataSet[parsed.entity] = (0, _limitOffset.limitOffset)(dataSet[parsed.entity], parsed.offset, parsed.limit);
109
+ dataSet[parsed.entity] = (0, _groupBy.groupBy)(dataSet[parsed.entity], parsed.groupBy);
110
+ dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses);
111
+ return dataSet;
112
+ };
87
113
  exports.runQuery = runQuery;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_getJoinIndexedList=require("./getJoinIndexedList");const runQuery=async e=>{const t={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(t[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity));let i={[e.entity]:[]};const r=e.conditions.length>0;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,t,i);const n=r&&0===e.conditions.length;switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,t,i)).command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),i[e.entity])),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),i[e.entity])),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses),i};exports.runQuery=runQuery;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_getJoinIndexedList=require("./getJoinIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType");const typeConditions=async(e,t)=>{for(const i of e.conditions){let r=e.entity,n=i.property;(0,_isEntityProperty.isEntityProperty)(n)&&({entity:r,property:n}=(0,_splitEntityProperty.splitEntityProperty)(n)),Object.prototype.hasOwnProperty.call(t,r)||(t[r]=await(0,_retrieveRecord.retrieveRecord)(r)),i.type=(0,_fieldType.fieldType)(t[r],n)}},runQuery=async e=>{const t={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(t[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeConditions(e,t);let i={[e.entity]:[]};const r=e.conditions.length>0;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,t,i);const n=r&&0===e.conditions.length;switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,t,i)).command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),i[e.entity])),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),i[e.entity])),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses),i};exports.runQuery=runQuery;
@@ -1,17 +1,18 @@
1
- import { keyDefinition } from '../introspect/definitions/key';
2
- import { recordPath } from '../introspect/definitions/record';
3
- export type indexEntry = {
4
- value: any;
5
- record: string[];
6
- };
7
- /**
8
- * Add a single entry file to the index that backs one of a record's keys, creating the index
9
- * file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
10
- * lookup (multi-field keys are not indexed here) are left untouched.
11
- * @param path
12
- * @param key
13
- * @param value
14
- * @param fileName
15
- */
16
- export declare const updateIndex: (path?: recordPath, key?: keyDefinition, value?: any, fileName?: string) => Promise<indexEntry[] | null>;
1
+ import { keyDefinition } from '../introspect/definitions/key';
2
+ import { recordPath } from '../introspect/definitions/record';
3
+ export type indexEntry = {
4
+ value: any;
5
+ record: string[];
6
+ };
7
+ /**
8
+ * Add a single entry file to the index that backs one of a record's keys, creating the index
9
+ * file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
10
+ * lookup (multi-field keys are not indexed here) are left untouched.
11
+ * @param path
12
+ * @param key
13
+ * @param value
14
+ * @param fileName
15
+ * @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 share one entry.
16
+ */
17
+ export declare const updateIndex: (path?: recordPath, key?: keyDefinition, value?: any, fileName?: string, type?: string) => Promise<indexEntry[] | null>;
17
18
  //# sourceMappingURL=updateIndex.d.ts.map
@@ -1,56 +1,58 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.updateIndex = void 0;
7
- require("core-js/modules/es.array.includes.js");
8
- require("core-js/modules/es.json.stringify.js");
9
- require("core-js/modules/esnext.iterator.constructor.js");
10
- require("core-js/modules/esnext.iterator.find.js");
11
- var _config = require("./config");
12
- const {
13
- readFile,
14
- writeFile,
15
- mkdir
16
- } = require('fs/promises');
17
- /**
18
- * Add a single entry file to the index that backs one of a record's keys, creating the index
19
- * file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
20
- * lookup (multi-field keys are not indexed here) are left untouched.
21
- * @param path
22
- * @param key
23
- * @param value
24
- * @param fileName
25
- */
26
- const updateIndex = async (path = '', key = null, value = undefined, fileName = '') => {
27
- if (!key || !key.lookup) {
28
- return null;
29
- }
30
- const databasePath = (0, _config.getSetting)('databasePath', 'database/');
31
- const indexDir = `${databasePath}__indexes/${path}`;
32
- const indexPath = `${indexDir}/${key.lookup}`;
33
- let index = [];
34
- try {
35
- index = JSON.parse(await readFile(indexPath, 'utf8'));
36
- } catch (err) {
37
- index = [];
38
- }
39
- const existingEntry = index.find(entry => entry.value == value);
40
- if (existingEntry) {
41
- if (!existingEntry.record.includes(fileName)) {
42
- existingEntry.record.push(fileName);
43
- }
44
- } else {
45
- index.push({
46
- value,
47
- record: [fileName]
48
- });
49
- }
50
- await mkdir(indexDir, {
51
- recursive: true
52
- });
53
- await writeFile(indexPath, JSON.stringify(index, null, 2));
54
- return index;
55
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.updateIndex = void 0;
7
+ require("core-js/modules/es.array.includes.js");
8
+ require("core-js/modules/es.json.stringify.js");
9
+ require("core-js/modules/esnext.iterator.constructor.js");
10
+ require("core-js/modules/esnext.iterator.find.js");
11
+ var _config = require("./config");
12
+ var _compareAs = require("./compareAs");
13
+ const {
14
+ readFile,
15
+ writeFile,
16
+ mkdir
17
+ } = require('fs/promises');
18
+ /**
19
+ * Add a single entry file to the index that backs one of a record's keys, creating the index
20
+ * file (and its __indexes/{record} directory) the first time a value is indexed. Keys with no
21
+ * lookup (multi-field keys are not indexed here) are left untouched.
22
+ * @param path
23
+ * @param key
24
+ * @param value
25
+ * @param fileName
26
+ * @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 share one entry.
27
+ */
28
+ const updateIndex = async (path = '', key = null, value = undefined, fileName = '', type = undefined) => {
29
+ if (!key || !key.lookup) {
30
+ return null;
31
+ }
32
+ const databasePath = (0, _config.getSetting)('databasePath', 'database/');
33
+ const indexDir = `${databasePath}__indexes/${path}`;
34
+ const indexPath = `${indexDir}/${key.lookup}`;
35
+ let index = [];
36
+ try {
37
+ index = JSON.parse(await readFile(indexPath, 'utf8'));
38
+ } catch (err) {
39
+ index = [];
40
+ }
41
+ const existingEntry = index.find(entry => (0, _compareAs.sameValue)(type, entry.value, value));
42
+ if (existingEntry) {
43
+ if (!existingEntry.record.includes(fileName)) {
44
+ existingEntry.record.push(fileName);
45
+ }
46
+ } else {
47
+ index.push({
48
+ value,
49
+ record: [fileName]
50
+ });
51
+ }
52
+ await mkdir(indexDir, {
53
+ recursive: true
54
+ });
55
+ await writeFile(indexPath, JSON.stringify(index, null, 2));
56
+ return index;
57
+ };
56
58
  exports.updateIndex = updateIndex;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js");var _config=require("./config");const{readFile:readFile,writeFile:writeFile,mkdir:mkdir}=require("fs/promises"),updateIndex=async(e="",r=null,i=void 0,s="")=>{if(!r||!r.lookup)return null;const t=`${(0,_config.getSetting)("databasePath","database/")}__indexes/${e}`,o=`${t}/${r.lookup}`;let u=[];try{u=JSON.parse(await readFile(o,"utf8"))}catch(e){u=[]}const d=u.find((e=>e.value==i));return d?d.record.includes(s)||d.record.push(s):u.push({value:i,record:[s]}),await mkdir(t,{recursive:!0}),await writeFile(o,JSON.stringify(u,null,2)),u};exports.updateIndex=updateIndex;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.updateIndex=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js");var _config=require("./config"),_compareAs=require("./compareAs");const{readFile:readFile,writeFile:writeFile,mkdir:mkdir}=require("fs/promises"),updateIndex=async(e="",r=null,s=void 0,i="",t=void 0)=>{if(!r||!r.lookup)return null;const o=`${(0,_config.getSetting)("databasePath","database/")}__indexes/${e}`,a=`${o}/${r.lookup}`;let u=[];try{u=JSON.parse(await readFile(a,"utf8"))}catch(e){u=[]}const d=u.find((e=>(0,_compareAs.sameValue)(t,e.value,s)));return d?d.record.includes(i)||d.record.push(i):u.push({value:s,record:[i]}),await mkdir(o,{recursive:!0}),await writeFile(a,JSON.stringify(u,null,2)),u};exports.updateIndex=updateIndex;
@@ -1,51 +1,57 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useJoinClause = void 0;
7
- require("core-js/modules/esnext.iterator.constructor.js");
8
- require("core-js/modules/esnext.iterator.reduce.js");
9
- var _readEntity = require("../queries/readEntity");
10
- var _where = require("../queries/where");
11
- var _splitEntityProperty = require("./parsers/splitEntityProperty");
12
- var _siFunciona = _interopRequireDefault(require("si-funciona"));
13
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- const useJoinClause = async ({
15
- propertyA = null,
16
- comparator = '=',
17
- propertyB = null
18
- } = {}, dataSets = {}, filterJoins = {}) => {
19
- const {
20
- entity: entityA,
21
- property: propA
22
- } = (0, _splitEntityProperty.splitEntityProperty)(propertyA);
23
- const {
24
- entity: entityB,
25
- property: propB
26
- } = (0, _splitEntityProperty.splitEntityProperty)(propertyB);
27
- if (!Object.prototype.hasOwnProperty.call(dataSets, entityA)) {
28
- dataSets = await (0, _readEntity.readEntity)(entityA, dataSets);
29
- }
30
- if (!Object.prototype.hasOwnProperty.call(dataSets, entityB)) {
31
- dataSets = await (0, _readEntity.readEntity)(entityB, dataSets);
32
- }
33
- if (!Object.prototype.hasOwnProperty.call(filterJoins, entityA)) {
34
- filterJoins[entityA] = _siFunciona.default.cloneObject(dataSets[entityA]);
35
- }
36
- if (!Object.prototype.hasOwnProperty.call(filterJoins, entityB)) {
37
- filterJoins[entityB] = _siFunciona.default.cloneObject(dataSets[entityB]);
38
- }
39
- filterJoins[entityA] = filterJoins[entityB].reduce((dataA, dataB) => _siFunciona.default.mergeArrays(dataA, (0, _where.where)(filterJoins[entityA], {
40
- property: propA,
41
- comparator,
42
- value: dataB[propB]
43
- })), []);
44
- filterJoins[entityB] = filterJoins[entityA].reduce((dataB, dataA) => _siFunciona.default.mergeArrays(dataB, (0, _where.where)(filterJoins[entityB], {
45
- property: propB,
46
- comparator,
47
- value: dataA[propA]
48
- })), []);
49
- return filterJoins;
50
- };
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useJoinClause = void 0;
7
+ require("core-js/modules/esnext.iterator.constructor.js");
8
+ require("core-js/modules/esnext.iterator.reduce.js");
9
+ var _readEntity = require("../queries/readEntity");
10
+ var _where = require("../queries/where");
11
+ var _splitEntityProperty = require("./parsers/splitEntityProperty");
12
+ var _siFunciona = _interopRequireDefault(require("si-funciona"));
13
+ var _retrieveRecord = require("./retrieveRecord");
14
+ var _fieldType = require("./fieldType");
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const useJoinClause = async ({
17
+ propertyA = null,
18
+ comparator = '=',
19
+ propertyB = null
20
+ } = {}, dataSets = {}, filterJoins = {}) => {
21
+ const {
22
+ entity: entityA,
23
+ property: propA
24
+ } = (0, _splitEntityProperty.splitEntityProperty)(propertyA);
25
+ const {
26
+ entity: entityB,
27
+ property: propB
28
+ } = (0, _splitEntityProperty.splitEntityProperty)(propertyB);
29
+ if (!Object.prototype.hasOwnProperty.call(dataSets, entityA)) {
30
+ dataSets = await (0, _readEntity.readEntity)(entityA, dataSets);
31
+ }
32
+ if (!Object.prototype.hasOwnProperty.call(dataSets, entityB)) {
33
+ dataSets = await (0, _readEntity.readEntity)(entityB, dataSets);
34
+ }
35
+ if (!Object.prototype.hasOwnProperty.call(filterJoins, entityA)) {
36
+ filterJoins[entityA] = _siFunciona.default.cloneObject(dataSets[entityA]);
37
+ }
38
+ if (!Object.prototype.hasOwnProperty.call(filterJoins, entityB)) {
39
+ filterJoins[entityB] = _siFunciona.default.cloneObject(dataSets[entityB]);
40
+ }
41
+ const typeA = (0, _fieldType.fieldType)(await (0, _retrieveRecord.retrieveRecord)(entityA), propA);
42
+ const typeB = (0, _fieldType.fieldType)(await (0, _retrieveRecord.retrieveRecord)(entityB), propB);
43
+ filterJoins[entityA] = filterJoins[entityB].reduce((dataA, dataB) => _siFunciona.default.mergeArrays(dataA, (0, _where.where)(filterJoins[entityA], {
44
+ property: propA,
45
+ comparator,
46
+ value: dataB[propB],
47
+ type: typeA
48
+ })), []);
49
+ filterJoins[entityB] = filterJoins[entityA].reduce((dataB, dataA) => _siFunciona.default.mergeArrays(dataB, (0, _where.where)(filterJoins[entityB], {
50
+ property: propB,
51
+ comparator,
52
+ value: dataA[propA],
53
+ type: typeB
54
+ })), []);
55
+ return filterJoins;
56
+ };
51
57
  exports.useJoinClause = useJoinClause;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useJoinClause=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _readEntity=require("../queries/readEntity"),_where=require("../queries/where"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_siFunciona=_interopRequireDefault(require("si-funciona"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const useJoinClause=async({propertyA:e=null,comparator:r="=",propertyB:t=null}={},o={},i={})=>{const{entity:a,property:n}=(0,_splitEntityProperty.splitEntityProperty)(e),{entity:s,property:u}=(0,_splitEntityProperty.splitEntityProperty)(t);return Object.prototype.hasOwnProperty.call(o,a)||(o=await(0,_readEntity.readEntity)(a,o)),Object.prototype.hasOwnProperty.call(o,s)||(o=await(0,_readEntity.readEntity)(s,o)),Object.prototype.hasOwnProperty.call(i,a)||(i[a]=_siFunciona.default.cloneObject(o[a])),Object.prototype.hasOwnProperty.call(i,s)||(i[s]=_siFunciona.default.cloneObject(o[s])),i[a]=i[s].reduce(((e,t)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(i[a],{property:n,comparator:r,value:t[u]}))),[]),i[s]=i[a].reduce(((e,t)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(i[s],{property:u,comparator:r,value:t[n]}))),[]),i};exports.useJoinClause=useJoinClause;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useJoinClause=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.reduce.js");var _readEntity=require("../queries/readEntity"),_where=require("../queries/where"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_siFunciona=_interopRequireDefault(require("si-funciona")),_retrieveRecord=require("./retrieveRecord"),_fieldType=require("./fieldType");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const useJoinClause=async({propertyA:e=null,comparator:r="=",propertyB:t=null}={},i={},o={})=>{const{entity:a,property:p}=(0,_splitEntityProperty.splitEntityProperty)(e),{entity:n,property:s}=(0,_splitEntityProperty.splitEntityProperty)(t);Object.prototype.hasOwnProperty.call(i,a)||(i=await(0,_readEntity.readEntity)(a,i)),Object.prototype.hasOwnProperty.call(i,n)||(i=await(0,_readEntity.readEntity)(n,i)),Object.prototype.hasOwnProperty.call(o,a)||(o[a]=_siFunciona.default.cloneObject(i[a])),Object.prototype.hasOwnProperty.call(o,n)||(o[n]=_siFunciona.default.cloneObject(i[n]));const u=(0,_fieldType.fieldType)(await(0,_retrieveRecord.retrieveRecord)(a),p),y=(0,_fieldType.fieldType)(await(0,_retrieveRecord.retrieveRecord)(n),s);return o[a]=o[n].reduce(((e,t)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(o[a],{property:p,comparator:r,value:t[s],type:u}))),[]),o[n]=o[a].reduce(((e,t)=>_siFunciona.default.mergeArrays(e,(0,_where.where)(o[n],{property:s,comparator:r,value:t[p],type:y}))),[]),o};exports.useJoinClause=useJoinClause;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "1.0.6",
3
+ "version": "1.1.0",
4
4
  "description": "Use json files to manage and read data.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -51,5 +51,10 @@
51
51
  "browser-or-node": "^3.0.0",
52
52
  "core-js": "^3.51.0",
53
53
  "si-funciona": "^2.8.0"
54
+ },
55
+ "standard": {
56
+ "env": [
57
+ "jest"
58
+ ]
54
59
  }
55
60
  }