json-fs-query 1.0.6 → 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 -10777
- 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 +5 -1
- package/dist/data/introspect/policies/foreignKeyExists.min.js +1 -1
- package/dist/data/introspect/policies/hasDependents.js +3 -1
- package/dist/data/introspect/policies/hasDependents.min.js +1 -1
- package/dist/data/introspect/policies/keyUnique.js +5 -1
- package/dist/data/introspect/policies/keyUnique.min.js +1 -1
- 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 +2 -1
- package/dist/data/queries/deleteEntity.min.js +1 -1
- 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 +11 -5
- 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 +3 -0
- package/dist/data/queries/updateEntity.js +74 -18
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/queries/where.d.ts +2 -1
- package/dist/data/queries/where.js +18 -6
- package/dist/data/queries/where.min.js +1 -1
- package/dist/data/utilities/compareAs.d.ts +20 -0
- package/dist/data/utilities/compareAs.js +58 -0
- package/dist/data/utilities/compareAs.min.js +1 -0
- 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 +16 -0
- package/dist/data/utilities/fieldType.js +23 -0
- package/dist/data/utilities/fieldType.min.js +1 -0
- package/dist/data/utilities/getConditionIndexedList.js +2 -1
- package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
- package/dist/data/utilities/matchIndexedJoins.js +3 -1
- package/dist/data/utilities/matchIndexedJoins.min.js +1 -1
- package/dist/data/utilities/mergeJoin.js +5 -1
- package/dist/data/utilities/mergeJoin.min.js +1 -1
- package/dist/data/utilities/parsers/findConditions.d.ts +5 -1
- 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 +2 -1
- package/dist/data/utilities/removeFromIndex.js +4 -2
- package/dist/data/utilities/removeFromIndex.min.js +1 -1
- package/dist/data/utilities/runQuery.js +49 -0
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/data/utilities/updateIndex.d.ts +2 -1
- package/dist/data/utilities/updateIndex.js +4 -2
- package/dist/data/utilities/updateIndex.min.js +1 -1
- package/dist/data/utilities/useJoinClause.js +8 -2
- package/dist/data/utilities/useJoinClause.min.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/index.min.js +1 -1
- package/package.json +68 -55
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.schemaStatementMatch = exports.parseSchemaStatement = void 0;
|
|
7
|
+
var _maskStrings = require("./maskStrings");
|
|
8
|
+
var _startsQuery = require("./startsQuery");
|
|
9
|
+
const schemaStatementMatch = exports.schemaStatementMatch = /^\s*(drop|describe|show)(?![a-z0-9_-])/i;
|
|
10
|
+
const dropMatch = /^\s*drop\s+(if\s+exists\s+)?([a-z0-9_-]+)/i;
|
|
11
|
+
const describeMatch = /^\s*describe\s+([a-z0-9_-]+)/i;
|
|
12
|
+
const showMatch = /^\s*show\s+records(?![a-z0-9_-])/i;
|
|
13
|
+
/**
|
|
14
|
+
* Throw for anything left after a statement: "Missing ; before" when it is another query.
|
|
15
|
+
* @param rest
|
|
16
|
+
*/
|
|
17
|
+
const assertNothingAfter = rest => {
|
|
18
|
+
const after = rest.trim();
|
|
19
|
+
if (!after) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const shown = (0, _maskStrings.unmaskStrings)(after, '\'');
|
|
23
|
+
if (_startsQuery.startsQueryMatch.test(after)) {
|
|
24
|
+
throw new Error(`Missing ; before: ${shown}`);
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Unrecognized query value: ${shown}`);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Throw for the registry's own name, which the schema statements don't act on.
|
|
30
|
+
* @param entity
|
|
31
|
+
*/
|
|
32
|
+
const assertNotRegistry = entity => {
|
|
33
|
+
if (entity === '__RECORDS') {
|
|
34
|
+
throw new Error('__RECORDS is reserved for the list of records (use: show records)');
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Parse `drop [if exists] <name>`, `describe <name>` or `show records` (strings and arrays already masked). `show`
|
|
39
|
+
* resolves to the registry, so its entity is `__RECORDS`.
|
|
40
|
+
* @param query
|
|
41
|
+
*/
|
|
42
|
+
const parseSchemaStatement = query => {
|
|
43
|
+
const command = query.match(schemaStatementMatch)[1].toLowerCase();
|
|
44
|
+
if (command === 'drop') {
|
|
45
|
+
const found = query.match(dropMatch);
|
|
46
|
+
// `drop if exists` with no name would otherwise read `if` as the name
|
|
47
|
+
if (!found || /^\s*drop\s+if\s+exists\s*$/i.test(query)) {
|
|
48
|
+
throw new Error('Expected: drop [if exists] <name>');
|
|
49
|
+
}
|
|
50
|
+
assertNotRegistry(found[2]);
|
|
51
|
+
assertNothingAfter(query.slice(found[0].length));
|
|
52
|
+
return {
|
|
53
|
+
command: 'drop',
|
|
54
|
+
entity: found[2],
|
|
55
|
+
ifExists: Boolean(found[1])
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (command === 'describe') {
|
|
59
|
+
const found = query.match(describeMatch);
|
|
60
|
+
if (!found) {
|
|
61
|
+
throw new Error('Expected: describe <name>');
|
|
62
|
+
}
|
|
63
|
+
assertNotRegistry(found[1]);
|
|
64
|
+
assertNothingAfter(query.slice(found[0].length));
|
|
65
|
+
return {
|
|
66
|
+
command: 'describe',
|
|
67
|
+
entity: found[1],
|
|
68
|
+
ifExists: false
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const found = query.match(showMatch);
|
|
72
|
+
if (!found) {
|
|
73
|
+
throw new Error('Expected: show records (the only thing that can be shown so far)');
|
|
74
|
+
}
|
|
75
|
+
assertNothingAfter(query.slice(found[0].length));
|
|
76
|
+
return {
|
|
77
|
+
command: 'show',
|
|
78
|
+
entity: '__RECORDS',
|
|
79
|
+
ifExists: false
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
exports.parseSchemaStatement = parseSchemaStatement;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.schemaStatementMatch=exports.parseSchemaStatement=void 0;var _maskStrings=require("./maskStrings"),_startsQuery=require("./startsQuery");const schemaStatementMatch=exports.schemaStatementMatch=/^\s*(drop|describe|show)(?![a-z0-9_-])/i,dropMatch=/^\s*drop\s+(if\s+exists\s+)?([a-z0-9_-]+)/i,describeMatch=/^\s*describe\s+([a-z0-9_-]+)/i,showMatch=/^\s*show\s+records(?![a-z0-9_-])/i,assertNothingAfter=e=>{const t=e.trim();if(!t)return;const s=(0,_maskStrings.unmaskStrings)(t,"'");if(_startsQuery.startsQueryMatch.test(t))throw new Error(`Missing ; before: ${s}`);throw new Error(`Unrecognized query value: ${s}`)},assertNotRegistry=e=>{if("__RECORDS"===e)throw new Error("__RECORDS is reserved for the list of records (use: show records)")},parseSchemaStatement=e=>{const t=e.match(schemaStatementMatch)[1].toLowerCase();if("drop"===t){const t=e.match(dropMatch);if(!t||/^\s*drop\s+if\s+exists\s*$/i.test(e))throw new Error("Expected: drop [if exists] <name>");return assertNotRegistry(t[2]),assertNothingAfter(e.slice(t[0].length)),{command:"drop",entity:t[2],ifExists:Boolean(t[1])}}if("describe"===t){const t=e.match(describeMatch);if(!t)throw new Error("Expected: describe <name>");return assertNotRegistry(t[1]),assertNothingAfter(e.slice(t[0].length)),{command:"describe",entity:t[1],ifExists:!1}}const s=e.match(showMatch);if(!s)throw new Error("Expected: show records (the only thing that can be shown so far)");return assertNothingAfter(e.slice(s[0].length)),{command:"show",entity:"__RECORDS",ifExists:!1}};exports.parseSchemaStatement=parseSchemaStatement;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type QuoteChar = '\'' | '"';
|
|
2
|
+
export type BracketChar = '[' | '(';
|
|
3
|
+
export type ScannedString = {
|
|
4
|
+
start: number;
|
|
5
|
+
end: number;
|
|
6
|
+
quote: QuoteChar;
|
|
7
|
+
value: string;
|
|
8
|
+
};
|
|
9
|
+
export type ScannedComment = {
|
|
10
|
+
start: number;
|
|
11
|
+
end: number;
|
|
12
|
+
kind: 'line' | 'block';
|
|
13
|
+
};
|
|
14
|
+
export type ScanState = {
|
|
15
|
+
quote: QuoteChar | undefined;
|
|
16
|
+
escape: boolean;
|
|
17
|
+
blockComment: boolean;
|
|
18
|
+
brackets: BracketChar[];
|
|
19
|
+
strayCloser: {
|
|
20
|
+
char: string;
|
|
21
|
+
index: number;
|
|
22
|
+
} | undefined;
|
|
23
|
+
};
|
|
24
|
+
export type ScannedQuery = {
|
|
25
|
+
strings: ScannedString[];
|
|
26
|
+
comments: ScannedComment[];
|
|
27
|
+
semicolons: number[];
|
|
28
|
+
end: ScanState;
|
|
29
|
+
closed: boolean;
|
|
30
|
+
terminated: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Walk a query once, left to right, finding its strings, comments and the `;` between statements.
|
|
34
|
+
*
|
|
35
|
+
* Strings use `'` or `"` and close only with the quote they opened with. Inside a string a backslash escapes the
|
|
36
|
+
* next character: `\n` and `\t` are a newline and a tab, any other `\x` is `x` (so `\'`, `\"` and `\\` are a quote
|
|
37
|
+
* and a backslash). Outside strings a backslash has no meaning. Comments run from `--` to the end of the line, or
|
|
38
|
+
* from `/*` to `*\/`; anything inside a comment is ignored, and comment markers inside a string are just text. A `--`
|
|
39
|
+
* starts a comment only at the start of the text or after whitespace or a `;`, since names can contain `-`
|
|
40
|
+
* (`my--table` is a name). A `;` inside brackets does not end a query.
|
|
41
|
+
*
|
|
42
|
+
* Never throws: whatever is left open is reported in `end`, for a prompt which asks for more input. Use
|
|
43
|
+
* assertClosed to turn it into an error.
|
|
44
|
+
* @param text
|
|
45
|
+
*/
|
|
46
|
+
export declare const scanQuery: (text?: string) => ScannedQuery;
|
|
47
|
+
/**
|
|
48
|
+
* Throw a clear error for anything scanQuery found left open or unmatched: a string, a block comment or a bracket.
|
|
49
|
+
* @param scanned
|
|
50
|
+
*/
|
|
51
|
+
export declare const assertClosed: (scanned: ScannedQuery) => ScannedQuery;
|
|
52
|
+
//# sourceMappingURL=scanQuery.d.ts.map
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.scanQuery = exports.assertClosed = void 0;
|
|
7
|
+
const escapes = {
|
|
8
|
+
n: '\n',
|
|
9
|
+
t: '\t'
|
|
10
|
+
};
|
|
11
|
+
const closers = {
|
|
12
|
+
']': '[',
|
|
13
|
+
')': '('
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Walk a query once, left to right, finding its strings, comments and the `;` between statements.
|
|
17
|
+
*
|
|
18
|
+
* Strings use `'` or `"` and close only with the quote they opened with. Inside a string a backslash escapes the
|
|
19
|
+
* next character: `\n` and `\t` are a newline and a tab, any other `\x` is `x` (so `\'`, `\"` and `\\` are a quote
|
|
20
|
+
* and a backslash). Outside strings a backslash has no meaning. Comments run from `--` to the end of the line, or
|
|
21
|
+
* from `/*` to `*\/`; anything inside a comment is ignored, and comment markers inside a string are just text. A `--`
|
|
22
|
+
* starts a comment only at the start of the text or after whitespace or a `;`, since names can contain `-`
|
|
23
|
+
* (`my--table` is a name). A `;` inside brackets does not end a query.
|
|
24
|
+
*
|
|
25
|
+
* Never throws: whatever is left open is reported in `end`, for a prompt which asks for more input. Use
|
|
26
|
+
* assertClosed to turn it into an error.
|
|
27
|
+
* @param text
|
|
28
|
+
*/
|
|
29
|
+
const scanQuery = (text = '') => {
|
|
30
|
+
const strings = [];
|
|
31
|
+
const comments = [];
|
|
32
|
+
const semicolons = [];
|
|
33
|
+
const brackets = [];
|
|
34
|
+
let strayCloser;
|
|
35
|
+
let openQuote;
|
|
36
|
+
let escape = false;
|
|
37
|
+
let blockComment = false;
|
|
38
|
+
let lastCode = -1;
|
|
39
|
+
let index = 0;
|
|
40
|
+
while (index < text.length) {
|
|
41
|
+
const char = text[index];
|
|
42
|
+
const next = text[index + 1];
|
|
43
|
+
if (char === '\'' || char === '"') {
|
|
44
|
+
const start = index;
|
|
45
|
+
let value = '';
|
|
46
|
+
index++;
|
|
47
|
+
while (index < text.length && text[index] !== char) {
|
|
48
|
+
if (text[index] === '\\') {
|
|
49
|
+
if (index + 1 === text.length) {
|
|
50
|
+
escape = true;
|
|
51
|
+
index++;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
value += escapes[text[index + 1]] ?? text[index + 1];
|
|
55
|
+
index += 2;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
value += text[index];
|
|
59
|
+
index++;
|
|
60
|
+
}
|
|
61
|
+
if (index < text.length) {
|
|
62
|
+
index++;
|
|
63
|
+
} else {
|
|
64
|
+
openQuote = char;
|
|
65
|
+
}
|
|
66
|
+
strings.push({
|
|
67
|
+
start,
|
|
68
|
+
end: index,
|
|
69
|
+
quote: char,
|
|
70
|
+
value
|
|
71
|
+
});
|
|
72
|
+
lastCode = start;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (char === '-' && next === '-' && (index === 0 || /[\s;]/.test(text[index - 1]))) {
|
|
76
|
+
const newline = text.indexOf('\n', index + 2);
|
|
77
|
+
const end = newline === -1 ? text.length : newline + 1;
|
|
78
|
+
comments.push({
|
|
79
|
+
start: index,
|
|
80
|
+
end,
|
|
81
|
+
kind: 'line'
|
|
82
|
+
});
|
|
83
|
+
index = end;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === '/' && next === '*') {
|
|
87
|
+
const close = text.indexOf('*/', index + 2);
|
|
88
|
+
const end = close === -1 ? text.length : close + 2;
|
|
89
|
+
blockComment = close === -1;
|
|
90
|
+
comments.push({
|
|
91
|
+
start: index,
|
|
92
|
+
end,
|
|
93
|
+
kind: 'block'
|
|
94
|
+
});
|
|
95
|
+
index = end;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (char === '[' || char === '(') {
|
|
99
|
+
brackets.push(char);
|
|
100
|
+
} else if (closers[char]) {
|
|
101
|
+
if (brackets[brackets.length - 1] === closers[char]) {
|
|
102
|
+
brackets.pop();
|
|
103
|
+
} else if (!strayCloser) {
|
|
104
|
+
strayCloser = {
|
|
105
|
+
char,
|
|
106
|
+
index
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
} else if (char === ';' && brackets.length === 0) {
|
|
110
|
+
semicolons.push(index);
|
|
111
|
+
}
|
|
112
|
+
if (!/\s/.test(char)) {
|
|
113
|
+
lastCode = index;
|
|
114
|
+
}
|
|
115
|
+
index++;
|
|
116
|
+
}
|
|
117
|
+
const end = {
|
|
118
|
+
quote: openQuote,
|
|
119
|
+
escape,
|
|
120
|
+
blockComment,
|
|
121
|
+
brackets,
|
|
122
|
+
strayCloser
|
|
123
|
+
};
|
|
124
|
+
const closed = !end.quote && !end.blockComment && brackets.length === 0;
|
|
125
|
+
return {
|
|
126
|
+
strings,
|
|
127
|
+
comments,
|
|
128
|
+
semicolons,
|
|
129
|
+
end,
|
|
130
|
+
closed,
|
|
131
|
+
terminated: closed && semicolons.length > 0 && semicolons[semicolons.length - 1] === lastCode
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Throw a clear error for anything scanQuery found left open or unmatched: a string, a block comment or a bracket.
|
|
136
|
+
* @param scanned
|
|
137
|
+
*/
|
|
138
|
+
exports.scanQuery = scanQuery;
|
|
139
|
+
const assertClosed = scanned => {
|
|
140
|
+
const {
|
|
141
|
+
end
|
|
142
|
+
} = scanned;
|
|
143
|
+
if (end.quote) {
|
|
144
|
+
const open = scanned.strings[scanned.strings.length - 1];
|
|
145
|
+
throw new Error(`Unclosed string: the ${end.quote} at position ${open.start} is never closed`);
|
|
146
|
+
}
|
|
147
|
+
if (end.blockComment) {
|
|
148
|
+
throw new Error(`Unclosed comment: the /* at position ${scanned.comments[scanned.comments.length - 1].start} is never closed`);
|
|
149
|
+
}
|
|
150
|
+
if (end.strayCloser) {
|
|
151
|
+
throw new Error(`Unexpected ${end.strayCloser.char} at position ${end.strayCloser.index}: there is nothing to close`);
|
|
152
|
+
}
|
|
153
|
+
if (end.brackets.length > 0) {
|
|
154
|
+
throw new Error(`Unclosed bracket: ${end.brackets.join(' ')} never closed`);
|
|
155
|
+
}
|
|
156
|
+
return scanned;
|
|
157
|
+
};
|
|
158
|
+
exports.assertClosed = assertClosed;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.scanQuery=exports.assertClosed=void 0;const escapes={n:"\n",t:"\t"},closers={"]":"[",")":"("},scanQuery=(e="")=>{const s=[],t=[],n=[],o=[];let r,l,c=!1,i=!1,a=-1,h=0;for(;h<e.length;){const d=e[h],p=e[h+1];if("'"!==d&&'"'!==d)if("-"!==d||"-"!==p||0!==h&&!/[\s;]/.test(e[h-1]))if("/"!==d||"*"!==p)"["===d||"("===d?o.push(d):closers[d]?o[o.length-1]===closers[d]?o.pop():r||(r={char:d,index:h}):";"===d&&0===o.length&&n.push(h),/\s/.test(d)||(a=h),h++;else{const s=e.indexOf("*/",h+2),n=-1===s?e.length:s+2;i=-1===s,t.push({start:h,end:n,kind:"block"}),h=n}else{const s=e.indexOf("\n",h+2),n=-1===s?e.length:s+1;t.push({start:h,end:n,kind:"line"}),h=n}else{const t=h;let n="";for(h++;h<e.length&&e[h]!==d;)if("\\"!==e[h])n+=e[h],h++;else{if(h+1===e.length){c=!0,h++;break}n+=escapes[e[h+1]]??e[h+1],h+=2}h<e.length?h++:l=d,s.push({start:t,end:h,quote:d,value:n}),a=t}}const d={quote:l,escape:c,blockComment:i,brackets:o,strayCloser:r},p=!d.quote&&!d.blockComment&&0===o.length;return{strings:s,comments:t,semicolons:n,end:d,closed:p,terminated:p&&n.length>0&&n[n.length-1]===a}};exports.scanQuery=scanQuery;const assertClosed=e=>{const{end:s}=e;if(s.quote){const t=e.strings[e.strings.length-1];throw new Error(`Unclosed string: the ${s.quote} at position ${t.start} is never closed`)}if(s.blockComment)throw new Error(`Unclosed comment: the /* at position ${e.comments[e.comments.length-1].start} is never closed`);if(s.strayCloser)throw new Error(`Unexpected ${s.strayCloser.char} at position ${s.strayCloser.index}: there is nothing to close`);if(s.brackets.length>0)throw new Error(`Unclosed bracket: ${s.brackets.join(" ")} never closed`);return e};exports.assertClosed=assertClosed;
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split a string of queries into one query each, on the `;` between them. A `;` inside a string or a comment does
|
|
3
|
+
* not count, comments are removed, and the `;` after the last query is optional.
|
|
4
|
+
* @param queries
|
|
5
|
+
* @throws {Error} For an unclosed string, block comment or bracket.
|
|
6
|
+
*/
|
|
1
7
|
export declare const splitQueries: (queries?: string) => string[];
|
|
2
8
|
//# sourceMappingURL=splitQueries.d.ts.map
|
|
@@ -6,6 +6,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.splitQueries = void 0;
|
|
7
7
|
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
8
|
require("core-js/modules/esnext.iterator.filter.js");
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
require("core-js/modules/esnext.iterator.reduce.js");
|
|
10
|
+
var _scanQuery = require("./scanQuery");
|
|
11
|
+
/**
|
|
12
|
+
* Split a string of queries into one query each, on the `;` between them. A `;` inside a string or a comment does
|
|
13
|
+
* not count, comments are removed, and the `;` after the last query is optional.
|
|
14
|
+
* @param queries
|
|
15
|
+
* @throws {Error} For an unclosed string, block comment or bracket.
|
|
16
|
+
*/
|
|
17
|
+
const splitQueries = (queries = '') => {
|
|
18
|
+
const {
|
|
19
|
+
comments,
|
|
20
|
+
semicolons
|
|
21
|
+
} = (0, _scanQuery.assertClosed)((0, _scanQuery.scanQuery)(queries));
|
|
22
|
+
// Blank each comment out with spaces, so the positions of the ; stay the same and the words either side stay apart
|
|
23
|
+
const uncommented = comments.reduce((text, {
|
|
24
|
+
start,
|
|
25
|
+
end
|
|
26
|
+
}) => `${text.slice(0, start)}${' '.repeat(end - start)}${text.slice(end)}`, queries);
|
|
27
|
+
return [...semicolons, uncommented.length].map((end, index) => uncommented.slice(index === 0 ? 0 : semicolons[index - 1] + 1, end).trim()).filter(query => query.length > 0);
|
|
28
|
+
};
|
|
11
29
|
exports.splitQueries = splitQueries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.splitQueries=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js");const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.splitQueries=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.reduce.js");var _scanQuery=require("./scanQuery");const splitQueries=(e="")=>{const{comments:r,semicolons:s}=(0,_scanQuery.assertClosed)((0,_scanQuery.scanQuery)(e)),t=r.reduce(((e,{start:r,end:s})=>`${e.slice(0,r)}${" ".repeat(s-r)}${e.slice(s)}`),e);return[...s,t.length].map(((e,r)=>t.slice(0===r?0:s[r-1]+1,e).trim())).filter((e=>e.length>0))};exports.splitQueries=splitQueries;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.startsQueryMatch = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Matches text that starts with a command word, for the "Missing ; before" error when a query runs on into the next.
|
|
9
|
+
*/
|
|
10
|
+
const startsQueryMatch = exports.startsQueryMatch = /^\s*(create|delete|describe|drop|insert|read|show|update)(?![a-z0-9_-])/i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.startsQueryMatch=void 0;const startsQueryMatch=exports.startsQueryMatch=/^\s*(create|delete|describe|drop|insert|read|show|update)(?![a-z0-9_-])/i;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.recordExists = void 0;
|
|
7
|
+
var _config = require("./config");
|
|
8
|
+
/**
|
|
9
|
+
* Whether a record (its `<name>.json` file) exists in the database. Node only, like the schema statements that use it.
|
|
10
|
+
* @param entity
|
|
11
|
+
*/
|
|
12
|
+
const recordExists = entity => {
|
|
13
|
+
const {
|
|
14
|
+
existsSync
|
|
15
|
+
} = require('fs');
|
|
16
|
+
return existsSync(`${(0, _config.getSetting)('databasePath', 'database/')}${entity}.json`);
|
|
17
|
+
};
|
|
18
|
+
exports.recordExists = recordExists;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.recordExists=void 0;var _config=require("./config");const recordExists=e=>{const{existsSync:s}=require("fs");return s(`${(0,_config.getSetting)("databasePath","database/")}${e}.json`)};exports.recordExists=recordExists;
|
|
@@ -9,6 +9,7 @@ import { indexEntry } from './updateIndex';
|
|
|
9
9
|
* @param key
|
|
10
10
|
* @param value
|
|
11
11
|
* @param fileName
|
|
12
|
+
* @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 are one entry.
|
|
12
13
|
*/
|
|
13
|
-
export declare const removeFromIndex: (path?: recordPath, key?: keyDefinition, value?: any, fileName?: string) => Promise<indexEntry[] | null>;
|
|
14
|
+
export declare const removeFromIndex: (path?: recordPath, key?: keyDefinition, value?: any, fileName?: string, type?: string) => Promise<indexEntry[] | null>;
|
|
14
15
|
//# sourceMappingURL=removeFromIndex.d.ts.map
|
|
@@ -9,6 +9,7 @@ require("core-js/modules/esnext.iterator.constructor.js");
|
|
|
9
9
|
require("core-js/modules/esnext.iterator.filter.js");
|
|
10
10
|
require("core-js/modules/esnext.iterator.map.js");
|
|
11
11
|
var _config = require("./config");
|
|
12
|
+
var _compareAs = require("./compareAs");
|
|
12
13
|
const {
|
|
13
14
|
readFile,
|
|
14
15
|
writeFile
|
|
@@ -21,8 +22,9 @@ const {
|
|
|
21
22
|
* @param key
|
|
22
23
|
* @param value
|
|
23
24
|
* @param fileName
|
|
25
|
+
* @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 are one entry.
|
|
24
26
|
*/
|
|
25
|
-
const removeFromIndex = async (path = '', key = null, value = undefined, fileName = '') => {
|
|
27
|
+
const removeFromIndex = async (path = '', key = null, value = undefined, fileName = '', type = undefined) => {
|
|
26
28
|
if (!key || !key.lookup) {
|
|
27
29
|
return null;
|
|
28
30
|
}
|
|
@@ -34,7 +36,7 @@ const removeFromIndex = async (path = '', key = null, value = undefined, fileNam
|
|
|
34
36
|
} catch (err) {
|
|
35
37
|
return null;
|
|
36
38
|
}
|
|
37
|
-
index = index.map(entry => entry.value
|
|
39
|
+
index = index.map(entry => (0, _compareAs.sameValue)(type, entry.value, value) ? {
|
|
38
40
|
value: entry.value,
|
|
39
41
|
record: entry.record.filter(record => record !== fileName)
|
|
40
42
|
} : entry).filter(entry => entry.record.length);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeFromIndex=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.map.js");var _config=require("./config");const{readFile:readFile,writeFile:writeFile}=require("fs/promises"),removeFromIndex=async(e="",r=null,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeFromIndex=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.map.js");var _config=require("./config"),_compareAs=require("./compareAs");const{readFile:readFile,writeFile:writeFile}=require("fs/promises"),removeFromIndex=async(e="",r=null,o=void 0,t="",i=void 0)=>{if(!r||!r.lookup)return null;const s=`${(0,_config.getSetting)("databasePath","database/")}__indexes/${e}/${r.lookup}`;let a=[];try{a=JSON.parse(await readFile(s,"utf8"))}catch(e){return null}return a=a.map((e=>(0,_compareAs.sameValue)(i,e.value,o)?{value:e.value,record:e.record.filter((e=>e!==t))}:e)).filter((e=>e.record.length)),await writeFile(s,JSON.stringify(a,null,2)),a};exports.removeFromIndex=removeFromIndex;
|
|
@@ -10,6 +10,10 @@ var _deleteEntity = require("../queries/deleteEntity");
|
|
|
10
10
|
var _insertEntity = require("../queries/insertEntity");
|
|
11
11
|
var _readEntity = require("../queries/readEntity");
|
|
12
12
|
var _updateEntity = require("../queries/updateEntity");
|
|
13
|
+
var _createRecord = require("../queries/createRecord");
|
|
14
|
+
var _dropRecord = require("../queries/dropRecord");
|
|
15
|
+
var _describeRecord = require("../queries/describeRecord");
|
|
16
|
+
var _showRecords = require("../queries/showRecords");
|
|
13
17
|
var _joinEntity = require("../queries/joinEntity");
|
|
14
18
|
var _mergeJoins = require("../queries/mergeJoins");
|
|
15
19
|
var _where = require("../queries/where");
|
|
@@ -20,13 +24,58 @@ var _selectFields = require("../queries/selectFields");
|
|
|
20
24
|
var _retrieveRecord = require("./retrieveRecord");
|
|
21
25
|
var _getConditionIndexedList = require("./getConditionIndexedList");
|
|
22
26
|
var _getJoinIndexedList = require("./getJoinIndexedList");
|
|
27
|
+
var _isEntityProperty = require("./parsers/isEntityProperty");
|
|
28
|
+
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
29
|
+
var _fieldType = require("./fieldType");
|
|
30
|
+
/**
|
|
31
|
+
* Give each condition its field's declared type, so where compares by it (a joined entity's field
|
|
32
|
+
* is looked up on that entity's record).
|
|
33
|
+
* @param parsed
|
|
34
|
+
* @param recordData
|
|
35
|
+
*/
|
|
36
|
+
const typeConditions = async (parsed, recordData) => {
|
|
37
|
+
for (const condition of parsed.conditions) {
|
|
38
|
+
let entity = parsed.entity;
|
|
39
|
+
let property = condition.property;
|
|
40
|
+
if ((0, _isEntityProperty.isEntityProperty)(property)) {
|
|
41
|
+
({
|
|
42
|
+
entity,
|
|
43
|
+
property
|
|
44
|
+
} = (0, _splitEntityProperty.splitEntityProperty)(property));
|
|
45
|
+
}
|
|
46
|
+
if (!Object.prototype.hasOwnProperty.call(recordData, entity)) {
|
|
47
|
+
recordData[entity] = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
48
|
+
}
|
|
49
|
+
condition.type = (0, _fieldType.fieldType)(recordData[entity], property);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
23
52
|
const runQuery = async parsed => {
|
|
53
|
+
// Schema statements act on the database, not on entries (for create there is no record to read yet)
|
|
54
|
+
switch (parsed.command) {
|
|
55
|
+
case 'create':
|
|
56
|
+
return {
|
|
57
|
+
[parsed.entity]: await (0, _createRecord.createRecord)(parsed.entity, parsed.create)
|
|
58
|
+
};
|
|
59
|
+
case 'drop':
|
|
60
|
+
return {
|
|
61
|
+
[parsed.entity]: await (0, _dropRecord.dropRecord)(parsed.entity, parsed.ifExists)
|
|
62
|
+
};
|
|
63
|
+
case 'describe':
|
|
64
|
+
return {
|
|
65
|
+
[parsed.entity]: await (0, _describeRecord.describeRecord)(parsed.entity)
|
|
66
|
+
};
|
|
67
|
+
case 'show':
|
|
68
|
+
return {
|
|
69
|
+
[parsed.entity]: await (0, _showRecords.showRecords)()
|
|
70
|
+
};
|
|
71
|
+
}
|
|
24
72
|
const recordData = {
|
|
25
73
|
[parsed.entity]: await (0, _retrieveRecord.retrieveRecord)(parsed.entity)
|
|
26
74
|
};
|
|
27
75
|
if (typeof parsed.joinEntity !== 'undefined') {
|
|
28
76
|
recordData[parsed.joinEntity] = await (0, _retrieveRecord.retrieveRecord)(parsed.joinEntity);
|
|
29
77
|
}
|
|
78
|
+
await typeConditions(parsed, recordData);
|
|
30
79
|
let dataSet = {
|
|
31
80
|
[parsed.entity]: []
|
|
32
81
|
};
|
|
@@ -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
|
|
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"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_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 r of e.conditions){let i=e.entity,n=r.property;(0,_isEntityProperty.isEntityProperty)(n)&&({entity:i,property:n}=(0,_splitEntityProperty.splitEntityProperty)(n)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],n)}},runQuery=async e=>{switch(e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}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 r={[e.entity]:[]};const i=e.conditions.length>0;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,t,r);const n=i&&0===e.conditions.length;switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,t,r)).command&&"update"!==e.command||(n||(r=await(0,_readEntity.readEntity)(e.entity,r)),r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),e.command){case"delete":r=await(0,_deleteEntity.deleteEntity)(e.entity,r);break;case"insert":r=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,r);break;case"read":n||(r=await(0,_readEntity.readEntity)(e.entity,r));break;case"update":r=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,r);break;default:throw new Error(`Unknown command: ${e.command}`)}return r=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,r,e.joinClauses,n),r=await(0,_mergeJoins.mergeJoins)(r,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(r[e.entity]=e.conditions.reduce(((e,t)=>(0,_where.where)(e,t)),r[e.entity])),r[e.entity]=(0,_sortBy.sortBy)(r[e.entity],e.sortClauses),r[e.entity]=(0,_limitOffset.limitOffset)(r[e.entity],e.offset,e.limit),r[e.entity]=(0,_groupBy.groupBy)(r[e.entity],e.groupBy),r[e.entity]=(0,_selectFields.selectFields)(r[e.entity],e.selectClauses),r};exports.runQuery=runQuery;
|
|
@@ -12,6 +12,7 @@ export type indexEntry = {
|
|
|
12
12
|
* @param key
|
|
13
13
|
* @param value
|
|
14
14
|
* @param fileName
|
|
15
|
+
* @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 share one entry.
|
|
15
16
|
*/
|
|
16
|
-
export declare const updateIndex: (path?: recordPath, key?: keyDefinition, value?: any, fileName?: string) => Promise<indexEntry[] | null>;
|
|
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
|
|
@@ -9,6 +9,7 @@ require("core-js/modules/es.json.stringify.js");
|
|
|
9
9
|
require("core-js/modules/esnext.iterator.constructor.js");
|
|
10
10
|
require("core-js/modules/esnext.iterator.find.js");
|
|
11
11
|
var _config = require("./config");
|
|
12
|
+
var _compareAs = require("./compareAs");
|
|
12
13
|
const {
|
|
13
14
|
readFile,
|
|
14
15
|
writeFile,
|
|
@@ -22,8 +23,9 @@ const {
|
|
|
22
23
|
* @param key
|
|
23
24
|
* @param value
|
|
24
25
|
* @param fileName
|
|
26
|
+
* @param type - The declared type of the indexed value (see keyValueType), so '3' and 3 share one entry.
|
|
25
27
|
*/
|
|
26
|
-
const updateIndex = async (path = '', key = null, value = undefined, fileName = '') => {
|
|
28
|
+
const updateIndex = async (path = '', key = null, value = undefined, fileName = '', type = undefined) => {
|
|
27
29
|
if (!key || !key.lookup) {
|
|
28
30
|
return null;
|
|
29
31
|
}
|
|
@@ -36,7 +38,7 @@ const updateIndex = async (path = '', key = null, value = undefined, fileName =
|
|
|
36
38
|
} catch (err) {
|
|
37
39
|
index = [];
|
|
38
40
|
}
|
|
39
|
-
const existingEntry = index.find(entry => entry.value
|
|
41
|
+
const existingEntry = index.find(entry => (0, _compareAs.sameValue)(type, entry.value, value));
|
|
40
42
|
if (existingEntry) {
|
|
41
43
|
if (!existingEntry.record.includes(fileName)) {
|
|
42
44
|
existingEntry.record.push(fileName);
|
|
@@ -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,
|
|
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;
|
|
@@ -10,6 +10,8 @@ var _readEntity = require("../queries/readEntity");
|
|
|
10
10
|
var _where = require("../queries/where");
|
|
11
11
|
var _splitEntityProperty = require("./parsers/splitEntityProperty");
|
|
12
12
|
var _siFunciona = _interopRequireDefault(require("si-funciona"));
|
|
13
|
+
var _retrieveRecord = require("./retrieveRecord");
|
|
14
|
+
var _fieldType = require("./fieldType");
|
|
13
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
16
|
const useJoinClause = async ({
|
|
15
17
|
propertyA = null,
|
|
@@ -36,15 +38,19 @@ const useJoinClause = async ({
|
|
|
36
38
|
if (!Object.prototype.hasOwnProperty.call(filterJoins, entityB)) {
|
|
37
39
|
filterJoins[entityB] = _siFunciona.default.cloneObject(dataSets[entityB]);
|
|
38
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);
|
|
39
43
|
filterJoins[entityA] = filterJoins[entityB].reduce((dataA, dataB) => _siFunciona.default.mergeArrays(dataA, (0, _where.where)(filterJoins[entityA], {
|
|
40
44
|
property: propA,
|
|
41
45
|
comparator,
|
|
42
|
-
value: dataB[propB]
|
|
46
|
+
value: dataB[propB],
|
|
47
|
+
type: typeA
|
|
43
48
|
})), []);
|
|
44
49
|
filterJoins[entityB] = filterJoins[entityA].reduce((dataB, dataA) => _siFunciona.default.mergeArrays(dataB, (0, _where.where)(filterJoins[entityB], {
|
|
45
50
|
property: propB,
|
|
46
51
|
comparator,
|
|
47
|
-
value: dataA[propA]
|
|
52
|
+
value: dataA[propA],
|
|
53
|
+
type: typeB
|
|
48
54
|
})), []);
|
|
49
55
|
return filterJoins;
|
|
50
56
|
};
|
|
@@ -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}={},
|
|
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/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { query } from './data/queries/query';
|
|
2
|
+
export { quote } from './data/queries/quote';
|
|
3
|
+
export { queryStatus, QueryStatus } from './data/queries/queryStatus';
|
|
2
4
|
export { create, drop, describe } from './data/introspect';
|
|
3
5
|
export { configure } from './data/utilities/config';
|
|
4
6
|
export { fieldProperties, fieldDefinition, fieldName, keyProperties, keyDefinition, indexType, indexLocation, referenceProperties, reference, recordProperties, recordDefinition, recordPath, entityPath } from './data/introspect';
|