json-fs-query 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -674
- package/README.md +295 -98
- package/browser/jsonFsQuery.js +12733 -10934
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/create.d.ts +1 -1
- package/dist/data/introspect/create.js +35 -4
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/definitions/field.d.ts +6 -2
- package/dist/data/introspect/definitions/field.js +7 -1
- package/dist/data/introspect/definitions/field.min.js +1 -1
- package/dist/data/introspect/index.d.ts +6 -3
- package/dist/data/introspect/index.js +10 -19
- package/dist/data/introspect/index.min.js +1 -1
- package/dist/data/introspect/policies/foreignKeyExists.js +28 -28
- package/dist/data/introspect/policies/hasDependents.js +53 -53
- package/dist/data/introspect/policies/keyUnique.js +34 -34
- package/dist/data/introspect/policies/typeCheck.d.ts +9 -1
- package/dist/data/introspect/policies/typeCheck.js +16 -2
- package/dist/data/introspect/policies/typeCheck.min.js +1 -1
- package/dist/data/queries/createRecord.d.ts +11 -0
- package/dist/data/queries/createRecord.js +58 -0
- package/dist/data/queries/createRecord.min.js +1 -0
- package/dist/data/queries/deleteEntity.js +100 -100
- package/dist/data/queries/describeRecord.d.ts +9 -0
- package/dist/data/queries/describeRecord.js +29 -0
- package/dist/data/queries/describeRecord.min.js +1 -0
- package/dist/data/queries/dropRecord.d.ts +9 -0
- package/dist/data/queries/dropRecord.js +61 -0
- package/dist/data/queries/dropRecord.min.js +1 -0
- package/dist/data/queries/insertEntity.js +122 -117
- package/dist/data/queries/insertEntity.min.js +1 -1
- package/dist/data/queries/parser.d.ts +1 -1
- package/dist/data/queries/parser.js +7 -15
- package/dist/data/queries/parser.min.js +1 -1
- package/dist/data/queries/query.d.ts +6 -0
- package/dist/data/queries/query.js +15 -6
- package/dist/data/queries/query.min.js +1 -1
- package/dist/data/queries/queryStatus.d.ts +15 -0
- package/dist/data/queries/queryStatus.js +52 -0
- package/dist/data/queries/queryStatus.min.js +1 -0
- package/dist/data/queries/quote.d.ts +11 -0
- package/dist/data/queries/quote.js +17 -0
- package/dist/data/queries/quote.min.js +1 -0
- package/dist/data/queries/showRecords.d.ts +6 -0
- package/dist/data/queries/showRecords.js +21 -0
- package/dist/data/queries/showRecords.min.js +1 -0
- package/dist/data/queries/sortBy.js +27 -27
- package/dist/data/queries/updateEntity.js +245 -193
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/queries/where.d.ts +7 -7
- package/dist/data/queries/where.js +67 -67
- package/dist/data/utilities/compareAs.d.ts +19 -19
- package/dist/data/utilities/compareAs.js +57 -57
- package/dist/data/utilities/config.d.ts +15 -0
- package/dist/data/utilities/config.js +31 -1
- package/dist/data/utilities/config.min.js +1 -1
- package/dist/data/utilities/databaseLock.d.ts +16 -0
- package/dist/data/utilities/databaseLock.js +63 -0
- package/dist/data/utilities/databaseLock.min.js +1 -0
- package/dist/data/utilities/fieldType.d.ts +15 -15
- package/dist/data/utilities/fieldType.js +22 -22
- package/dist/data/utilities/getConditionIndexedList.js +47 -47
- package/dist/data/utilities/matchIndexedJoins.js +62 -62
- package/dist/data/utilities/mergeJoin.js +47 -47
- package/dist/data/utilities/parsers/findConditions.d.ts +18 -15
- package/dist/data/utilities/parsers/findConditions.js +15 -6
- package/dist/data/utilities/parsers/findConditions.min.js +1 -1
- package/dist/data/utilities/parsers/findInsertValues.js +3 -2
- package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
- package/dist/data/utilities/parsers/findSelects.js +6 -3
- package/dist/data/utilities/parsers/findSelects.min.js +1 -1
- package/dist/data/utilities/parsers/findSortClauses.js +5 -2
- package/dist/data/utilities/parsers/findSortClauses.min.js +1 -1
- package/dist/data/utilities/parsers/findUpdateValues.js +3 -2
- package/dist/data/utilities/parsers/findUpdateValues.min.js +1 -1
- package/dist/data/utilities/parsers/maskStrings.d.ts +39 -0
- package/dist/data/utilities/parsers/maskStrings.js +123 -0
- package/dist/data/utilities/parsers/maskStrings.min.js +1 -0
- package/dist/data/utilities/parsers/parseCreate.d.ts +20 -0
- package/dist/data/utilities/parsers/parseCreate.js +330 -0
- package/dist/data/utilities/parsers/parseCreate.min.js +1 -0
- package/dist/data/utilities/parsers/parseLiteralValue.d.ts +2 -1
- package/dist/data/utilities/parsers/parseLiteralValue.js +6 -3
- package/dist/data/utilities/parsers/parseLiteralValue.min.js +1 -1
- package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
- package/dist/data/utilities/parsers/parseQuery.js +28 -2
- package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
- package/dist/data/utilities/parsers/parseSchemaStatement.d.ts +13 -0
- package/dist/data/utilities/parsers/parseSchemaStatement.js +82 -0
- package/dist/data/utilities/parsers/parseSchemaStatement.min.js +1 -0
- package/dist/data/utilities/parsers/scanQuery.d.ts +52 -0
- package/dist/data/utilities/parsers/scanQuery.js +158 -0
- package/dist/data/utilities/parsers/scanQuery.min.js +1 -0
- package/dist/data/utilities/parsers/splitQueries.d.ts +6 -0
- package/dist/data/utilities/parsers/splitQueries.js +20 -2
- package/dist/data/utilities/parsers/splitQueries.min.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.d.ts +5 -0
- package/dist/data/utilities/parsers/startsQuery.js +10 -0
- package/dist/data/utilities/parsers/startsQuery.min.js +1 -0
- package/dist/data/utilities/recordExists.d.ts +6 -0
- package/dist/data/utilities/recordExists.js +18 -0
- package/dist/data/utilities/recordExists.min.js +1 -0
- package/dist/data/utilities/removeFromIndex.d.ts +14 -14
- package/dist/data/utilities/removeFromIndex.js +45 -45
- package/dist/data/utilities/runQuery.js +135 -112
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/data/utilities/updateIndex.d.ts +17 -17
- package/dist/data/utilities/updateIndex.js +57 -57
- package/dist/data/utilities/useJoinClause.js +56 -56
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/index.min.js +1 -1
- package/package.json +68 -60
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.deleteEntity = 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
|
-
require("core-js/modules/esnext.set.add-all.js");
|
|
12
|
-
require("core-js/modules/esnext.set.delete-all.js");
|
|
13
|
-
require("core-js/modules/esnext.set.difference.js");
|
|
14
|
-
require("core-js/modules/esnext.set.every.js");
|
|
15
|
-
require("core-js/modules/esnext.set.filter.js");
|
|
16
|
-
require("core-js/modules/esnext.set.find.js");
|
|
17
|
-
require("core-js/modules/esnext.set.intersection.js");
|
|
18
|
-
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
19
|
-
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
20
|
-
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
21
|
-
require("core-js/modules/esnext.set.join.js");
|
|
22
|
-
require("core-js/modules/esnext.set.map.js");
|
|
23
|
-
require("core-js/modules/esnext.set.reduce.js");
|
|
24
|
-
require("core-js/modules/esnext.set.some.js");
|
|
25
|
-
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
26
|
-
require("core-js/modules/esnext.set.union.js");
|
|
27
|
-
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
28
|
-
var _retrieveFile = require("../utilities/retrieveFile");
|
|
29
|
-
var _removeFromIndex = require("../utilities/removeFromIndex");
|
|
30
|
-
var _computeKeyValue = require("../utilities/computeKeyValue");
|
|
31
|
-
var _fieldType = require("../utilities/fieldType");
|
|
32
|
-
var _hasDependents = require("../introspect/policies/hasDependents");
|
|
33
|
-
var _config = require("../utilities/config");
|
|
34
|
-
const {
|
|
35
|
-
rm,
|
|
36
|
-
writeFile
|
|
37
|
-
} = require('fs/promises');
|
|
38
|
-
/**
|
|
39
|
-
* RESTRICT: reject the whole delete (before removing anything) if any row being deleted is still
|
|
40
|
-
* referenced by a single-field foreign key elsewhere. Only meaningful for a single-field primary
|
|
41
|
-
* key, since foreign key support itself is single-field only - a composite primary key can't be
|
|
42
|
-
* the target of one yet, so there's nothing to check.
|
|
43
|
-
* @param entity
|
|
44
|
-
* @param primaryKey
|
|
45
|
-
* @param toDelete
|
|
46
|
-
*/
|
|
47
|
-
const assertNoDependents = async (entity, primaryKey, toDelete) => {
|
|
48
|
-
if (!(0, _config.getSetting)('enforceForeignKeys', true) || primaryKey.fields.length !== 1) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const property = primaryKey.fields[0];
|
|
52
|
-
for (const row of toDelete) {
|
|
53
|
-
if (await (0, _hasDependents.hasDependents)(entity, property, row[property])) {
|
|
54
|
-
throw new Error(`Cannot delete from "${entity}" where "${property}" = ${row[property]} - other records still reference it`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* A record object carries no memory of which entry file it was read from, and files are not
|
|
60
|
-
* guaranteed to be named after any field's value, so the only reliable way to find a record's
|
|
61
|
-
* file is to re-scan every entry and match it by its primary key value(s) - a single field, or a
|
|
62
|
-
* composite of several for a multi-field primary key.
|
|
63
|
-
* @param entity
|
|
64
|
-
* @param record
|
|
65
|
-
* @param primaryKey
|
|
66
|
-
* @param deletedValues
|
|
67
|
-
*/
|
|
68
|
-
const removeMatchingEntries = async (entity, record, primaryKey, deletedValues) => {
|
|
69
|
-
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
70
|
-
const remainingEntries = [];
|
|
71
|
-
for (const fileName of record.entries) {
|
|
72
|
-
const data = await (0, _retrieveFile.retrieveFile)(`${record.path}/${fileName}`);
|
|
73
|
-
if (!deletedValues.has((0, _computeKeyValue.computeKeyValue)(primaryKey.fields, data))) {
|
|
74
|
-
remainingEntries.push(fileName);
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
await rm(`${databasePath}${record.path}/${fileName}`);
|
|
78
|
-
for (const key of record.keys) {
|
|
79
|
-
await (0, _removeFromIndex.removeFromIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, data), fileName, (0, _fieldType.keyValueType)(record, key));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return remainingEntries;
|
|
83
|
-
};
|
|
84
|
-
const deleteEntity = async (entity = '', dataSet = {}) => {
|
|
85
|
-
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
86
|
-
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
87
|
-
const primaryKey = record.keys.find(key => key.type === 'primary');
|
|
88
|
-
if (!primaryKey) {
|
|
89
|
-
throw new Error(`Cannot delete from "${entity}" without a primary key`);
|
|
90
|
-
}
|
|
91
|
-
const toDelete = dataSet[entity] || [];
|
|
92
|
-
if (!toDelete.length) {
|
|
93
|
-
return dataSet;
|
|
94
|
-
}
|
|
95
|
-
await assertNoDependents(entity, primaryKey, toDelete);
|
|
96
|
-
const deletedValues = new Set(toDelete.map(row => (0, _computeKeyValue.computeKeyValue)(primaryKey.fields, row)));
|
|
97
|
-
record.entries = await removeMatchingEntries(entity, record, primaryKey, deletedValues);
|
|
98
|
-
await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
|
|
99
|
-
return dataSet;
|
|
100
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.deleteEntity = 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
|
+
require("core-js/modules/esnext.set.add-all.js");
|
|
12
|
+
require("core-js/modules/esnext.set.delete-all.js");
|
|
13
|
+
require("core-js/modules/esnext.set.difference.js");
|
|
14
|
+
require("core-js/modules/esnext.set.every.js");
|
|
15
|
+
require("core-js/modules/esnext.set.filter.js");
|
|
16
|
+
require("core-js/modules/esnext.set.find.js");
|
|
17
|
+
require("core-js/modules/esnext.set.intersection.js");
|
|
18
|
+
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
19
|
+
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
20
|
+
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
21
|
+
require("core-js/modules/esnext.set.join.js");
|
|
22
|
+
require("core-js/modules/esnext.set.map.js");
|
|
23
|
+
require("core-js/modules/esnext.set.reduce.js");
|
|
24
|
+
require("core-js/modules/esnext.set.some.js");
|
|
25
|
+
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
26
|
+
require("core-js/modules/esnext.set.union.js");
|
|
27
|
+
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
28
|
+
var _retrieveFile = require("../utilities/retrieveFile");
|
|
29
|
+
var _removeFromIndex = require("../utilities/removeFromIndex");
|
|
30
|
+
var _computeKeyValue = require("../utilities/computeKeyValue");
|
|
31
|
+
var _fieldType = require("../utilities/fieldType");
|
|
32
|
+
var _hasDependents = require("../introspect/policies/hasDependents");
|
|
33
|
+
var _config = require("../utilities/config");
|
|
34
|
+
const {
|
|
35
|
+
rm,
|
|
36
|
+
writeFile
|
|
37
|
+
} = require('fs/promises');
|
|
38
|
+
/**
|
|
39
|
+
* RESTRICT: reject the whole delete (before removing anything) if any row being deleted is still
|
|
40
|
+
* referenced by a single-field foreign key elsewhere. Only meaningful for a single-field primary
|
|
41
|
+
* key, since foreign key support itself is single-field only - a composite primary key can't be
|
|
42
|
+
* the target of one yet, so there's nothing to check.
|
|
43
|
+
* @param entity
|
|
44
|
+
* @param primaryKey
|
|
45
|
+
* @param toDelete
|
|
46
|
+
*/
|
|
47
|
+
const assertNoDependents = async (entity, primaryKey, toDelete) => {
|
|
48
|
+
if (!(0, _config.getSetting)('enforceForeignKeys', true) || primaryKey.fields.length !== 1) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const property = primaryKey.fields[0];
|
|
52
|
+
for (const row of toDelete) {
|
|
53
|
+
if (await (0, _hasDependents.hasDependents)(entity, property, row[property])) {
|
|
54
|
+
throw new Error(`Cannot delete from "${entity}" where "${property}" = ${row[property]} - other records still reference it`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* A record object carries no memory of which entry file it was read from, and files are not
|
|
60
|
+
* guaranteed to be named after any field's value, so the only reliable way to find a record's
|
|
61
|
+
* file is to re-scan every entry and match it by its primary key value(s) - a single field, or a
|
|
62
|
+
* composite of several for a multi-field primary key.
|
|
63
|
+
* @param entity
|
|
64
|
+
* @param record
|
|
65
|
+
* @param primaryKey
|
|
66
|
+
* @param deletedValues
|
|
67
|
+
*/
|
|
68
|
+
const removeMatchingEntries = async (entity, record, primaryKey, deletedValues) => {
|
|
69
|
+
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
70
|
+
const remainingEntries = [];
|
|
71
|
+
for (const fileName of record.entries) {
|
|
72
|
+
const data = await (0, _retrieveFile.retrieveFile)(`${record.path}/${fileName}`);
|
|
73
|
+
if (!deletedValues.has((0, _computeKeyValue.computeKeyValue)(primaryKey.fields, data))) {
|
|
74
|
+
remainingEntries.push(fileName);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
await rm(`${databasePath}${record.path}/${fileName}`);
|
|
78
|
+
for (const key of record.keys) {
|
|
79
|
+
await (0, _removeFromIndex.removeFromIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, data), fileName, (0, _fieldType.keyValueType)(record, key));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return remainingEntries;
|
|
83
|
+
};
|
|
84
|
+
const deleteEntity = async (entity = '', dataSet = {}) => {
|
|
85
|
+
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
86
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
87
|
+
const primaryKey = record.keys.find(key => key.type === 'primary');
|
|
88
|
+
if (!primaryKey) {
|
|
89
|
+
throw new Error(`Cannot delete from "${entity}" without a primary key`);
|
|
90
|
+
}
|
|
91
|
+
const toDelete = dataSet[entity] || [];
|
|
92
|
+
if (!toDelete.length) {
|
|
93
|
+
return dataSet;
|
|
94
|
+
}
|
|
95
|
+
await assertNoDependents(entity, primaryKey, toDelete);
|
|
96
|
+
const deletedValues = new Set(toDelete.map(row => (0, _computeKeyValue.computeKeyValue)(primaryKey.fields, row)));
|
|
97
|
+
record.entries = await removeMatchingEntries(entity, record, primaryKey, deletedValues);
|
|
98
|
+
await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
|
|
99
|
+
return dataSet;
|
|
100
|
+
};
|
|
101
101
|
exports.deleteEntity = deleteEntity;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { recordDefinition } from '../introspect/definitions/record';
|
|
2
|
+
export type recordDescription = Pick<recordDefinition, 'path' | 'definition' | 'keys'>;
|
|
3
|
+
/**
|
|
4
|
+
* Run a parsed describe statement: the record's fields and keys (describe() in JS gives only the fields). An error
|
|
5
|
+
* if the record doesn't exist.
|
|
6
|
+
* @param entity
|
|
7
|
+
*/
|
|
8
|
+
export declare const describeRecord: (entity: string) => Promise<recordDescription>;
|
|
9
|
+
//# sourceMappingURL=describeRecord.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.describeRecord = void 0;
|
|
7
|
+
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
8
|
+
var _recordExists = require("../utilities/recordExists");
|
|
9
|
+
/**
|
|
10
|
+
* Run a parsed describe statement: the record's fields and keys (describe() in JS gives only the fields). An error
|
|
11
|
+
* if the record doesn't exist.
|
|
12
|
+
* @param entity
|
|
13
|
+
*/
|
|
14
|
+
const describeRecord = async entity => {
|
|
15
|
+
if (!(0, _recordExists.recordExists)(entity)) {
|
|
16
|
+
throw new Error(`Record "${entity}" doesn't exist`);
|
|
17
|
+
}
|
|
18
|
+
const {
|
|
19
|
+
path,
|
|
20
|
+
definition,
|
|
21
|
+
keys
|
|
22
|
+
} = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
23
|
+
return {
|
|
24
|
+
path,
|
|
25
|
+
definition,
|
|
26
|
+
keys
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
exports.describeRecord = describeRecord;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.describeRecord=void 0;var _retrieveRecord=require("../utilities/retrieveRecord"),_recordExists=require("../utilities/recordExists");const describeRecord=async e=>{if(!(0,_recordExists.recordExists)(e))throw new Error(`Record "${e}" doesn't exist`);const{path:r,definition:i,keys:t}=await(0,_retrieveRecord.retrieveRecord)(e);return{path:r,definition:i,keys:t}};exports.describeRecord=describeRecord;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { recordDefinition } from '../introspect/definitions/record';
|
|
2
|
+
/**
|
|
3
|
+
* Run a parsed drop statement: an error if the record doesn't exist, unless the statement says `if exists` (then
|
|
4
|
+
* nothing happens and the result is null). Otherwise drop() it and resolve to the definition it had.
|
|
5
|
+
* @param entity
|
|
6
|
+
* @param ifExists
|
|
7
|
+
*/
|
|
8
|
+
export declare const dropRecord: (entity: string, ifExists: boolean) => Promise<recordDefinition | null>;
|
|
9
|
+
//# sourceMappingURL=dropRecord.d.ts.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/esnext.async-iterator.constructor.js");
|
|
4
|
+
require("core-js/modules/esnext.async-iterator.drop.js");
|
|
5
|
+
require("core-js/modules/esnext.iterator.drop.js");
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.dropRecord = void 0;
|
|
10
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
11
|
+
require("core-js/modules/esnext.iterator.some.js");
|
|
12
|
+
var _drop = require("../introspect/drop");
|
|
13
|
+
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
14
|
+
var _recordExists = require("../utilities/recordExists");
|
|
15
|
+
var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
|
|
16
|
+
var _config = require("../utilities/config");
|
|
17
|
+
/**
|
|
18
|
+
* RESTRICT, as MySQL does for a referenced table: reject dropping a record while another record has a foreign key
|
|
19
|
+
* referencing it, since every write to that record would then fail looking for the dropped one. A record referencing
|
|
20
|
+
* itself doesn't count. Off with enforceForeignKeys, like the row-level checks.
|
|
21
|
+
* @param entity
|
|
22
|
+
*/
|
|
23
|
+
const assertNotReferenced = async entity => {
|
|
24
|
+
if (!(0, _config.getSetting)('enforceForeignKeys', true) || !(0, _recordExists.recordExists)('__RECORDS')) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const registry = await (0, _retrieveRecord.retrieveRecord)('__RECORDS');
|
|
28
|
+
for (const fileName of registry.entries) {
|
|
29
|
+
const other = fileName.replace(/\.json$/, '');
|
|
30
|
+
if (other === entity || !(0, _recordExists.recordExists)(other)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
for (const key of (await (0, _retrieveRecord.retrieveRecord)(other)).keys) {
|
|
34
|
+
if (key.type !== 'foreign' || !key.references) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (key.references.some(reference => (0, _splitEntityProperty.splitEntityProperty)(reference.fields[0]).entity === entity)) {
|
|
38
|
+
throw new Error(`Cannot drop "${entity}": ${other}.${key.fields.join(', ')} references it`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Run a parsed drop statement: an error if the record doesn't exist, unless the statement says `if exists` (then
|
|
45
|
+
* nothing happens and the result is null). Otherwise drop() it and resolve to the definition it had.
|
|
46
|
+
* @param entity
|
|
47
|
+
* @param ifExists
|
|
48
|
+
*/
|
|
49
|
+
const dropRecord = async (entity, ifExists) => {
|
|
50
|
+
if (!(0, _recordExists.recordExists)(entity)) {
|
|
51
|
+
if (ifExists) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Record "${entity}" doesn't exist`);
|
|
55
|
+
}
|
|
56
|
+
await assertNotReferenced(entity);
|
|
57
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
58
|
+
await (0, _drop.drop)(entity);
|
|
59
|
+
return record;
|
|
60
|
+
};
|
|
61
|
+
exports.dropRecord = dropRecord;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.dropRecord=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.some.js");var _drop=require("../introspect/drop"),_retrieveRecord=require("../utilities/retrieveRecord"),_recordExists=require("../utilities/recordExists"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty"),_config=require("../utilities/config");const assertNotReferenced=async e=>{if(!(0,_config.getSetting)("enforceForeignKeys",!0)||!(0,_recordExists.recordExists)("__RECORDS"))return;const r=await(0,_retrieveRecord.retrieveRecord)("__RECORDS");for(const t of r.entries){const r=t.replace(/\.json$/,"");if(r!==e&&(0,_recordExists.recordExists)(r))for(const t of(await(0,_retrieveRecord.retrieveRecord)(r)).keys)if("foreign"===t.type&&t.references&&t.references.some((r=>(0,_splitEntityProperty.splitEntityProperty)(r.fields[0]).entity===e)))throw new Error(`Cannot drop "${e}": ${r}.${t.fields.join(", ")} references it`)}},dropRecord=async(e,r)=>{if(!(0,_recordExists.recordExists)(e)){if(r)return null;throw new Error(`Record "${e}" doesn't exist`)}await assertNotReferenced(e);const t=await(0,_retrieveRecord.retrieveRecord)(e);return await(0,_drop.drop)(e),t};exports.dropRecord=dropRecord;
|
|
@@ -1,118 +1,123 @@
|
|
|
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
|
-
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* @param
|
|
30
|
-
* @param
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
* or
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* @param
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
record
|
|
110
|
-
await
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
+
require("core-js/modules/esnext.iterator.some.js");
|
|
12
|
+
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
13
|
+
var _updateIndex = require("../utilities/updateIndex");
|
|
14
|
+
var _keyGenerate = require("../introspect/policies/keyGenerate");
|
|
15
|
+
var _keyUnique = require("../introspect/policies/keyUnique");
|
|
16
|
+
var _useDefault = require("../introspect/policies/useDefault");
|
|
17
|
+
var _typeCheck = require("../introspect/policies/typeCheck");
|
|
18
|
+
var _foreignKeyExists = require("../introspect/policies/foreignKeyExists");
|
|
19
|
+
var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
|
|
20
|
+
var _computeKeyValue = require("../utilities/computeKeyValue");
|
|
21
|
+
var _fieldType = require("../utilities/fieldType");
|
|
22
|
+
var _config = require("../utilities/config");
|
|
23
|
+
const {
|
|
24
|
+
writeFile
|
|
25
|
+
} = require('fs/promises');
|
|
26
|
+
/**
|
|
27
|
+
* Build one entity's stored values from the raw input values, generating any autoGenerate
|
|
28
|
+
* fields and applying field defaults, then throw if a required field still has no value.
|
|
29
|
+
* @param entity
|
|
30
|
+
* @param record
|
|
31
|
+
* @param rowValues
|
|
32
|
+
*/
|
|
33
|
+
const buildEntityValues = async (entity, record, rowValues = {}) => {
|
|
34
|
+
const entityValues = {};
|
|
35
|
+
for (const field of record.definition) {
|
|
36
|
+
let value = rowValues[field.name];
|
|
37
|
+
if (field.autoGenerate) {
|
|
38
|
+
value = await (0, _keyGenerate.keyGenerate)(entity, [field.name]);
|
|
39
|
+
} else if (Object.prototype.hasOwnProperty.call(field, 'default')) {
|
|
40
|
+
value = (0, _useDefault.useDefault)(field['default'], value);
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === 'undefined') {
|
|
43
|
+
if (!field.optional) {
|
|
44
|
+
throw new Error(`Missing required field "${field.name}" for ${entity}`);
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
entityValues[field.name] = (0, _typeCheck.typeCheck)(field.type, value, field.nullable);
|
|
49
|
+
}
|
|
50
|
+
return entityValues;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Reject the insert if it collides with an existing primary or unique key value - a single field,
|
|
54
|
+
* or a composite of several for a multi-field key. As in SQL, a value with a null in it is never a
|
|
55
|
+
* duplicate, so a nullable unique field can hold null in any number of rows.
|
|
56
|
+
* @param entity
|
|
57
|
+
* @param record
|
|
58
|
+
* @param entityValues
|
|
59
|
+
*/
|
|
60
|
+
const assertUnique = async (entity, record, entityValues) => {
|
|
61
|
+
for (const key of record.keys) {
|
|
62
|
+
if (key.type !== 'primary' && key.type !== 'unique') {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const checkKeys = key.fields.map(field => entityValues[field]);
|
|
66
|
+
if (checkKeys.some(value => value === null)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const isUnique = await (0, _keyUnique.keyUnique)(entity, key.fields, checkKeys);
|
|
70
|
+
if (!isUnique) {
|
|
71
|
+
throw new Error(`Duplicate value for ${key.type} key "${key.fields.join(', ')}" on ${entity}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Reject the insert if a single-field foreign key's value doesn't exist in the record it
|
|
77
|
+
* references. A null references nothing, so it isn't checked (as in SQL).
|
|
78
|
+
* @param entity
|
|
79
|
+
* @param record
|
|
80
|
+
* @param entityValues
|
|
81
|
+
*/
|
|
82
|
+
const assertForeignKeys = async (entity, record, entityValues) => {
|
|
83
|
+
for (const key of record.keys) {
|
|
84
|
+
if (key.type !== 'foreign' || key.fields.length !== 1 || !key.references || key.references.length !== 1) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const field = key.fields[0];
|
|
88
|
+
if (!Object.prototype.hasOwnProperty.call(entityValues, field) || entityValues[field] === null) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const {
|
|
92
|
+
entity: refEntity,
|
|
93
|
+
property: refProperty
|
|
94
|
+
} = (0, _splitEntityProperty.splitEntityProperty)(key.references[0].fields[0]);
|
|
95
|
+
const exists = await (0, _foreignKeyExists.foreignKeyExists)(refEntity, refProperty, entityValues[field]);
|
|
96
|
+
if (!exists) {
|
|
97
|
+
throw new Error(`Foreign key "${field}" on ${entity} references a nonexistent ${refEntity}.${refProperty} = ${entityValues[field]}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const insertEntity = async (entity = '', values = [], dataSet = {}) => {
|
|
102
|
+
const databasePath = (0, _config.getSetting)('databasePath', 'database/');
|
|
103
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
104
|
+
const primaryKey = record.keys.find(key => key.type === 'primary' && key.fields.length === 1);
|
|
105
|
+
if (!Object.prototype.hasOwnProperty.call(dataSet, entity)) {
|
|
106
|
+
dataSet[entity] = [];
|
|
107
|
+
}
|
|
108
|
+
for (const rowValues of values) {
|
|
109
|
+
const entityValues = await buildEntityValues(entity, record, rowValues);
|
|
110
|
+
await assertUnique(entity, record, entityValues);
|
|
111
|
+
await assertForeignKeys(entity, record, entityValues);
|
|
112
|
+
const fileName = `${primaryKey ? entityValues[primaryKey.fields[0]] : crypto.randomUUID()}.json`;
|
|
113
|
+
await writeFile(`${databasePath}${record.path}/${fileName}`, JSON.stringify(entityValues, null, 2));
|
|
114
|
+
record.entries.push(fileName);
|
|
115
|
+
await writeFile(`${databasePath}${record.path}.json`, JSON.stringify(record, null, 2));
|
|
116
|
+
for (const key of record.keys) {
|
|
117
|
+
await (0, _updateIndex.updateIndex)(record.path, key, (0, _computeKeyValue.computeKeyValue)(key.fields, entityValues), fileName, (0, _fieldType.keyValueType)(record, key));
|
|
118
|
+
}
|
|
119
|
+
dataSet[entity].push(entityValues);
|
|
120
|
+
}
|
|
121
|
+
return dataSet;
|
|
122
|
+
};
|
|
118
123
|
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"),_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
|
+
"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"),require("core-js/modules/esnext.iterator.some.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,s.nullable);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(t.some((e=>null===e)))continue;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)||null===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,2 +1,2 @@
|
|
|
1
|
-
export declare const parser: (queries?: string) =>
|
|
1
|
+
export declare const parser: (queries?: string) => import("../utilities/parsers/parseQuery").ParsedQuery[];
|
|
2
2
|
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -4,27 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.parser = void 0;
|
|
7
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.map.js");
|
|
7
9
|
var _splitQueries = require("../utilities/parsers/splitQueries");
|
|
8
10
|
var _parseQuery = require("../utilities/parsers/parseQuery");
|
|
9
11
|
const parser = (queries = '') => {
|
|
10
12
|
const queryArray = (0, _splitQueries.splitQueries)(queries);
|
|
11
|
-
|
|
12
|
-
let mergeQuery = '';
|
|
13
|
-
for (const query of queryArray) {
|
|
14
|
-
mergeQuery = mergeQuery ? `${mergeQuery}${query}` : query;
|
|
15
|
-
let parsedQuery = {};
|
|
13
|
+
return queryArray.map((query, index) => {
|
|
16
14
|
try {
|
|
17
|
-
|
|
18
|
-
mergeQuery = '';
|
|
15
|
+
return (0, _parseQuery.parseQuery)(query);
|
|
19
16
|
} catch (e) {
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const which = queryArray.length > 1 ? ` query ${index + 1} of ${queryArray.length}` : '';
|
|
18
|
+
throw new Error(`Failed to interpret${which}: ${query} (${e.message})`);
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
if (mergeQuery) {
|
|
26
|
-
throw new Error(`Failed to interpret: ${mergeQuery}`);
|
|
27
|
-
}
|
|
28
|
-
return parsedQueries;
|
|
20
|
+
});
|
|
29
21
|
};
|
|
30
22
|
exports.parser = parser;
|