json-fs-query 3.3.1 → 3.5.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/README.md +104 -2
- package/browser/jsonFsQuery.js +810 -3845
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/cli/chooseDatabase.d.ts +13 -0
- package/dist/cli/chooseDatabase.js +37 -0
- package/dist/cli/chooseDatabase.min.js +1 -0
- package/dist/cli/formatCsv.d.ts +9 -0
- package/dist/cli/formatCsv.js +53 -0
- package/dist/cli/formatCsv.min.js +1 -0
- package/dist/cli/formatResult.d.ts +30 -0
- package/dist/cli/formatResult.js +139 -0
- package/dist/cli/formatResult.min.js +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +52 -0
- package/dist/cli/index.min.js +2 -0
- package/dist/cli/interactive.d.ts +15 -0
- package/dist/cli/interactive.js +257 -0
- package/dist/cli/interactive.min.js +1 -0
- package/dist/cli/output.d.ts +31 -0
- package/dist/cli/output.js +64 -0
- package/dist/cli/output.min.js +1 -0
- package/dist/cli/runDirect.d.ts +11 -0
- package/dist/cli/runDirect.js +28 -0
- package/dist/cli/runDirect.min.js +1 -0
- package/dist/data/introspect/alter.js +2 -10
- package/dist/data/introspect/alter.min.js +1 -1
- package/dist/data/introspect/create.js +15 -4
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/definitions/key.js +0 -2
- package/dist/data/introspect/definitions/key.min.js +1 -1
- package/dist/data/introspect/definitions/record.js +0 -2
- package/dist/data/introspect/definitions/record.min.js +1 -1
- package/dist/data/introspect/describe.js +2 -0
- package/dist/data/introspect/describe.min.js +1 -1
- package/dist/data/introspect/drop.js +3 -4
- package/dist/data/introspect/drop.min.js +1 -1
- package/dist/data/introspect/formatDatabase.js +0 -2
- package/dist/data/introspect/formatDatabase.min.js +1 -1
- package/dist/data/introspect/index.js +0 -4
- package/dist/data/introspect/index.min.js +1 -1
- package/dist/data/introspect/packDatabase.js +0 -19
- package/dist/data/introspect/packDatabase.min.js +1 -1
- package/dist/data/queries/createRecord.js +0 -2
- package/dist/data/queries/createRecord.min.js +1 -1
- package/dist/data/queries/databaseStatements.js +0 -3
- package/dist/data/queries/databaseStatements.min.js +1 -1
- package/dist/data/queries/deleteEntity.js +0 -20
- package/dist/data/queries/deleteEntity.min.js +1 -1
- package/dist/data/queries/dropRecord.js +0 -5
- package/dist/data/queries/dropRecord.min.js +1 -1
- package/dist/data/queries/groupBy.js +0 -16
- package/dist/data/queries/groupBy.min.js +1 -1
- package/dist/data/queries/insertEntity.js +0 -35
- package/dist/data/queries/insertEntity.min.js +1 -1
- package/dist/data/queries/joinEntity.js +0 -15
- package/dist/data/queries/joinEntity.min.js +1 -1
- package/dist/data/queries/parser.js +0 -2
- package/dist/data/queries/parser.min.js +1 -1
- package/dist/data/queries/selectFields.js +0 -3
- package/dist/data/queries/selectFields.min.js +1 -1
- package/dist/data/queries/showRecords.js +0 -2
- package/dist/data/queries/showRecords.min.js +1 -1
- package/dist/data/queries/updateEntity.js +0 -4
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/queries/where.js +0 -4
- package/dist/data/queries/where.min.js +1 -1
- package/dist/data/storage/databases.js +1 -2
- package/dist/data/storage/databases.min.js +1 -1
- package/dist/data/storage/listFiles.js +0 -2
- package/dist/data/storage/listFiles.min.js +1 -1
- package/dist/data/storage/readCache.js +0 -13
- package/dist/data/storage/readCache.min.js +1 -1
- package/dist/data/storage/readJson.js +2 -2
- package/dist/data/storage/readJson.min.js +1 -1
- package/dist/data/storage/storagePath.js +0 -1
- package/dist/data/storage/storagePath.min.js +1 -1
- package/dist/data/storage/writeSet.js +0 -32
- package/dist/data/storage/writeSet.min.js +1 -1
- package/dist/data/utilities/assertValidName.d.ts +14 -0
- package/dist/data/utilities/assertValidName.js +34 -0
- package/dist/data/utilities/assertValidName.min.js +1 -0
- package/dist/data/utilities/computeKeyValue.js +0 -2
- package/dist/data/utilities/computeKeyValue.min.js +1 -1
- package/dist/data/utilities/conditionEntities.js +0 -20
- package/dist/data/utilities/conditionEntities.min.js +1 -1
- package/dist/data/utilities/conditionTree.js +0 -3
- package/dist/data/utilities/conditionTree.min.js +1 -1
- package/dist/data/utilities/config.d.ts +11 -0
- package/dist/data/utilities/config.js +15 -1
- package/dist/data/utilities/config.min.js +1 -1
- package/dist/data/utilities/databaseLock.js +0 -14
- package/dist/data/utilities/databaseLock.min.js +1 -1
- package/dist/data/utilities/deregisterRecord.js +0 -2
- package/dist/data/utilities/deregisterRecord.min.js +1 -1
- package/dist/data/utilities/fieldType.js +0 -2
- package/dist/data/utilities/fieldType.min.js +1 -1
- package/dist/data/utilities/getConditionIndexedList.js +0 -20
- package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
- package/dist/data/utilities/indexBuffer.js +0 -33
- package/dist/data/utilities/indexBuffer.min.js +1 -1
- package/dist/data/utilities/indexHas.js +0 -3
- package/dist/data/utilities/indexHas.min.js +1 -1
- package/dist/data/utilities/joinBases.js +0 -33
- package/dist/data/utilities/joinBases.min.js +1 -1
- package/dist/data/utilities/keyIndexFiles.js +0 -19
- package/dist/data/utilities/keyIndexFiles.min.js +1 -1
- package/dist/data/utilities/knownFields.js +0 -21
- package/dist/data/utilities/knownFields.min.js +1 -1
- package/dist/data/utilities/mergeJoin.js +0 -2
- package/dist/data/utilities/mergeJoin.min.js +1 -1
- package/dist/data/utilities/packedTable.js +0 -3
- package/dist/data/utilities/packedTable.min.js +1 -1
- package/dist/data/utilities/parsers/findConditions.js +0 -2
- package/dist/data/utilities/parsers/findConditions.min.js +1 -1
- package/dist/data/utilities/parsers/findGroupBy.js +0 -2
- package/dist/data/utilities/parsers/findGroupBy.min.js +1 -1
- package/dist/data/utilities/parsers/maskStrings.js +0 -3
- package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
- package/dist/data/utilities/parsers/parseCreate.js +0 -21
- package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
- package/dist/data/utilities/parsers/splitClauses.js +0 -16
- package/dist/data/utilities/parsers/splitClauses.min.js +1 -1
- package/dist/data/utilities/parsers/splitQueries.js +0 -3
- package/dist/data/utilities/parsers/splitQueries.min.js +1 -1
- package/dist/data/utilities/reconcileJoin.js +0 -4
- package/dist/data/utilities/reconcileJoin.min.js +1 -1
- package/dist/data/utilities/removeFromIndex.js +0 -3
- package/dist/data/utilities/removeFromIndex.min.js +1 -1
- package/dist/data/utilities/requireNode.js +0 -1
- package/dist/data/utilities/requireNode.min.js +1 -1
- package/dist/data/utilities/retrieveRecord.js +0 -1
- package/dist/data/utilities/retrieveRecord.min.js +1 -1
- package/dist/data/utilities/retrieveRecords.js +0 -16
- package/dist/data/utilities/retrieveRecords.min.js +1 -1
- package/dist/data/utilities/rowLookup.js +0 -15
- package/dist/data/utilities/rowLookup.min.js +1 -1
- package/dist/data/utilities/runQuery.js +0 -16
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/data/utilities/semiJoin.js +0 -19
- package/dist/data/utilities/semiJoin.min.js +1 -1
- package/dist/data/utilities/updateIndex.js +0 -2
- package/dist/data/utilities/updateIndex.min.js +1 -1
- package/dist/index.js +0 -4
- package/dist/index.min.js +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Markers } from './formatResult';
|
|
2
|
+
export declare const outputFormats: readonly ["table", "json", "csv", "dump"];
|
|
3
|
+
export type OutputFormat = typeof outputFormats[number];
|
|
4
|
+
/**
|
|
5
|
+
* How results print: the format (-o / /output), and the table's markers for missing and null (--missing, --null, or
|
|
6
|
+
* /missing and /null at the prompt). The prompt changes these during a session, so one object is shared.
|
|
7
|
+
*/
|
|
8
|
+
export type OutputSettings = {
|
|
9
|
+
format: OutputFormat;
|
|
10
|
+
markers: Partial<Markers>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Refuse a format that can't print yet, before the query runs (so `-o dump -q "insert ..."` doesn't insert and then
|
|
14
|
+
* fail to show it).
|
|
15
|
+
* @param settings
|
|
16
|
+
* @throws {Error} For dump, which needs the record's name and query() results don't carry it.
|
|
17
|
+
*/
|
|
18
|
+
export declare const assertPrintable: (settings: OutputSettings) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Print each query's result in the chosen format, each followed by a blank line (as psql does) so results stay apart
|
|
21
|
+
* when several print in a row. Several JSON results are one JSON value each, which jq reads as a stream.
|
|
22
|
+
* @param {Array<*>} results One result per query
|
|
23
|
+
* @param settings
|
|
24
|
+
*/
|
|
25
|
+
export declare const printResults: (results: Array<unknown>, settings: OutputSettings) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Print an error in red, without its stack.
|
|
28
|
+
* @param {*} error
|
|
29
|
+
*/
|
|
30
|
+
export declare const printError: (error: unknown) => void;
|
|
31
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.printResults = exports.printError = exports.outputFormats = exports.assertPrintable = void 0;
|
|
7
|
+
require("core-js/modules/es.json.stringify.js");
|
|
8
|
+
var _util = require("util");
|
|
9
|
+
var _formatCsv = require("./formatCsv");
|
|
10
|
+
var _formatResult = require("./formatResult");
|
|
11
|
+
const outputFormats = exports.outputFormats = ['table', 'json', 'csv', 'dump'];
|
|
12
|
+
// Dim the markers only on a terminal, and never with NO_COLOR set (https://no-color.org)
|
|
13
|
+
const color = () => Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
|
|
14
|
+
/**
|
|
15
|
+
* Refuse a format that can't print yet, before the query runs (so `-o dump -q "insert ..."` doesn't insert and then
|
|
16
|
+
* fail to show it).
|
|
17
|
+
* @param settings
|
|
18
|
+
* @throws {Error} For dump, which needs the record's name and query() results don't carry it.
|
|
19
|
+
*/
|
|
20
|
+
const assertPrintable = settings => {
|
|
21
|
+
if (settings.format === 'dump') {
|
|
22
|
+
throw new Error('dump output isn\'t available yet (it needs the record\'s name, which results don\'t carry): use table, json or csv');
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Format one result in the chosen format.
|
|
27
|
+
* @param result
|
|
28
|
+
* @param settings
|
|
29
|
+
* @returns {string}
|
|
30
|
+
*/
|
|
31
|
+
exports.assertPrintable = assertPrintable;
|
|
32
|
+
const format = (result, settings) => {
|
|
33
|
+
switch (settings.format) {
|
|
34
|
+
case 'json':
|
|
35
|
+
return JSON.stringify(result, null, 2);
|
|
36
|
+
case 'csv':
|
|
37
|
+
return (0, _formatCsv.formatCsv)(result);
|
|
38
|
+
default:
|
|
39
|
+
return (0, _formatResult.formatResult)(result, {
|
|
40
|
+
color: color(),
|
|
41
|
+
markers: settings.markers
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Print each query's result in the chosen format, each followed by a blank line (as psql does) so results stay apart
|
|
47
|
+
* when several print in a row. Several JSON results are one JSON value each, which jq reads as a stream.
|
|
48
|
+
* @param {Array<*>} results One result per query
|
|
49
|
+
* @param settings
|
|
50
|
+
*/
|
|
51
|
+
const printResults = (results, settings) => {
|
|
52
|
+
for (const result of results) {
|
|
53
|
+
console.log(`${format(result, settings)}\n`);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Print an error in red, without its stack.
|
|
58
|
+
* @param {*} error
|
|
59
|
+
*/
|
|
60
|
+
exports.printResults = printResults;
|
|
61
|
+
const printError = error => {
|
|
62
|
+
console.error((0, _util.styleText)('red', `Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
63
|
+
};
|
|
64
|
+
exports.printError = printError;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.printResults=exports.printError=exports.outputFormats=exports.assertPrintable=void 0,require("core-js/modules/es.json.stringify.js");var _util=require("util"),_formatCsv=require("./formatCsv"),_formatResult=require("./formatResult");const outputFormats=exports.outputFormats=["table","json","csv","dump"],color=()=>Boolean(process.stdout.isTTY)&&!process.env.NO_COLOR,assertPrintable=r=>{if("dump"===r.format)throw new Error("dump output isn't available yet (it needs the record's name, which results don't carry): use table, json or csv")};exports.assertPrintable=assertPrintable;const format=(r,t)=>{switch(t.format){case"json":return JSON.stringify(r,null,2);case"csv":return(0,_formatCsv.formatCsv)(r);default:return(0,_formatResult.formatResult)(r,{color:color(),markers:t.markers})}},printResults=(r,t)=>{for(const s of r)console.log(`${format(s,t)}\n`)};exports.printResults=printResults;const printError=r=>{console.error((0,_util.styleText)("red",`Error: ${r instanceof Error?r.message:String(r)}`))};exports.printError=printError;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DatabaseOptions } from './chooseDatabase';
|
|
2
|
+
import { OutputSettings } from './output';
|
|
3
|
+
/**
|
|
4
|
+
* Run one query string (one or more queries) without opening the prompt: print each result, or the error.
|
|
5
|
+
* @param queryString What `-q` / `--query` was given
|
|
6
|
+
* @param options The database options
|
|
7
|
+
* @param settings The output format and markers
|
|
8
|
+
* @returns {Promise<number>} The exit code: 0, or 1 when choosing the database or the query failed.
|
|
9
|
+
*/
|
|
10
|
+
export declare const runDirect: (queryString: string, options: DatabaseOptions, settings: OutputSettings) => Promise<number>;
|
|
11
|
+
//# sourceMappingURL=runDirect.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.runDirect = void 0;
|
|
7
|
+
var _query = require("../data/queries/query");
|
|
8
|
+
var _chooseDatabase = require("./chooseDatabase");
|
|
9
|
+
var _output = require("./output");
|
|
10
|
+
/**
|
|
11
|
+
* Run one query string (one or more queries) without opening the prompt: print each result, or the error.
|
|
12
|
+
* @param queryString What `-q` / `--query` was given
|
|
13
|
+
* @param options The database options
|
|
14
|
+
* @param settings The output format and markers
|
|
15
|
+
* @returns {Promise<number>} The exit code: 0, or 1 when choosing the database or the query failed.
|
|
16
|
+
*/
|
|
17
|
+
const runDirect = async (queryString, options, settings) => {
|
|
18
|
+
try {
|
|
19
|
+
(0, _output.assertPrintable)(settings);
|
|
20
|
+
await (0, _chooseDatabase.chooseDatabase)(options);
|
|
21
|
+
(0, _output.printResults)(await (0, _query.query)(queryString), settings);
|
|
22
|
+
return 0;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
(0, _output.printError)(error);
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.runDirect = runDirect;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runDirect=void 0;var _query=require("../data/queries/query"),_chooseDatabase=require("./chooseDatabase"),_output=require("./output");const runDirect=async(e,r,t)=>{try{return(0,_output.assertPrintable)(t),await(0,_chooseDatabase.chooseDatabase)(r),(0,_output.printResults)(await(0,_query.query)(e),t),0}catch(e){return(0,_output.printError)(e),1}};exports.runDirect=runDirect;
|
|
@@ -5,15 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.alter = void 0;
|
|
7
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.filter.js");
|
|
11
|
-
require("core-js/modules/esnext.iterator.find.js");
|
|
12
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
13
|
-
require("core-js/modules/esnext.iterator.some.js");
|
|
14
8
|
var _field = require("./definitions/field");
|
|
15
9
|
var _create = require("./create");
|
|
16
10
|
var _parseCreate = require("../utilities/parsers/parseCreate");
|
|
11
|
+
var _assertValidName = require("../utilities/assertValidName");
|
|
17
12
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
18
13
|
var _retrieveFiles = require("../utilities/retrieveFiles");
|
|
19
14
|
var _retrieveRecords = require("../utilities/retrieveRecords");
|
|
@@ -283,10 +278,7 @@ const alter = async (entity, change) => {
|
|
|
283
278
|
// The same names the query language allows: a name becomes a key in every row and part of index file paths, so
|
|
284
279
|
// one like `../x` from a direct call must not get that far
|
|
285
280
|
const names = [entity, ...('field' in change ? [change.field?.name] : []), ...('name' in change ? [change.name] : []), ...('to' in change ? [change.to] : [])];
|
|
286
|
-
|
|
287
|
-
if (invalid !== -1) {
|
|
288
|
-
throw new Error(`Invalid name ${JSON.stringify(names[invalid]) ?? 'undefined'} in alter: names use letters, digits, _ and - only`);
|
|
289
|
-
}
|
|
281
|
+
names.forEach(name => (0, _assertValidName.assertValidName)(name, 'alter'));
|
|
290
282
|
const record = await (0, _retrieveRecord.retrieveRecord)(entity);
|
|
291
283
|
switch (change.action) {
|
|
292
284
|
case 'add':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.alter=void 0,require("core-js/modules/es.array.includes.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.alter=void 0,require("core-js/modules/es.array.includes.js");var _field=require("./definitions/field"),_create=require("./create"),_parseCreate=require("../utilities/parsers/parseCreate"),_assertValidName=require("../utilities/assertValidName"),_retrieveRecord=require("../utilities/retrieveRecord"),_retrieveFiles=require("../utilities/retrieveFiles"),_retrieveRecords=require("../utilities/retrieveRecords"),_knownFields=require("../utilities/knownFields"),_packedTable=require("../utilities/packedTable"),_requireNode=require("../utilities/requireNode"),_showRecords=require("../queries/showRecords"),_updateEntity=require("../queries/updateEntity"),_typeCheck=require("./policies/typeCheck"),_storage=require("../storage");const rowsOf=async e=>(await(0,_retrieveFiles.retrieveFiles)(e.entries.map((t=>`${e.path}/${t}`)),_retrieveRecords.retrieveEntry)).map(((t,a)=>({fileName:e.entries[a],data:t}))),has=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),keysUsing=(e,t)=>e.keys.filter((e=>e.fields.includes(t))),describeKey=e=>`${e.type} key (${e.fields.join(", ")})`,referencesTo=async(e,t)=>{const a=[];for(const i of await(0,_showRecords.showRecords)()){const r=await(0,_retrieveRecord.retrieveRecord)(i);for(const o of r.keys)"foreign"===o.type&&(o.references||[]).some((a=>a.fields.includes(`${e}.${t}`)))&&a.push({entity:i,record:r,key:o})}return a},writeRecord=async(e,t)=>{(0,_create.assertValidDefinition)(e,t),await(0,_storage.writeJson)(`${e}.json`,t)},setField=async(e,t,a,i,r)=>{if(a.length)if(await(0,_packedTable.discardPacked)(t.path),keysUsing(t,i).length&&"function"!=typeof r){if(!t.keys.some((e=>"primary"===e.type)))throw new Error(`Can't change "${i}" on ${e}'s rows: a key uses it, and rows are found by the primary key, which ${e} doesn't have`);await(0,_updateEntity.updateEntity)(e,{[i]:void 0===r?null:r},{[e]:a.map((e=>e.data))})}else for(const e of a){const a=Object.assign({},e.data),o="function"==typeof r?r(e):r;void 0===o?delete a[i]:a[i]=o,await(0,_storage.writeJson)(`${t.path}/${e.fileName}`,a)}},addField=async(e,t,a)=>{if(t.definition.some((e=>e.name===a.name)))throw new Error(`Field "${a.name}" already exists on ${e}`);const i={...t,definition:[...t.definition,a]},r=await rowsOf(t);for(const t of r.filter((e=>has(e.data,a.name))))try{(0,_typeCheck.typeCheck)(a.type,t.data[a.name],a.nullable)}catch(i){throw new Error(`Can't add "${a.name}" to ${e}: row ${t.fileName} already holds a value for it that doesn't fit (${i.message})`)}const o=r.filter((e=>!has(e.data,a.name))),n=has(a,"default");if(o.length&&!a.optional&&!n&&!a.autoGenerate)throw new Error(`Can't add required field "${a.name}" to ${e}: its ${o.length} row(s) have no value for it (give it a default, or make it optional)`);return await writeRecord(e,i),a.autoGenerate?await setField(e,i,o,a.name,(()=>crypto.randomUUID())):n&&await setField(e,i,o,a.name,a.default),i},dropField=async(e,t,a)=>{(0,_knownFields.assertFieldsDefined)(e,t,[a],"alter");const i=keysUsing(t,a)[0];if(i)throw new Error(`Can't drop "${a}" from ${e}: its ${describeKey(i)} uses it`);const r=(await referencesTo(e,a))[0];if(r)throw new Error(`Can't drop "${a}" from ${e}: ${r.entity}'s foreign key "${r.key.fields[0]}" references it`);const o={...t,definition:t.definition.filter((e=>e.name!==a))};return await writeRecord(e,o),await setField(e,o,(await rowsOf(t)).filter((e=>has(e.data,a))),a,void 0),o},renameField=async(e,t,a,i)=>{if((0,_knownFields.assertFieldsDefined)(e,t,[a],"alter"),t.definition.some((e=>e.name===i)))throw new Error(`Can't rename "${a}" on ${e} to "${i}": a field of that name already exists`);const r=await referencesTo(e,a),o=t.keys.map((e=>{if(!e.fields.includes(a))return e;const t=e.fields.map((e=>e===a?i:e)),r=e.lookup&&e.lookup===(0,_parseCreate.keyLookup)(e.type,e.fields)?(0,_parseCreate.keyLookup)(e.type,t):e.lookup;return{...e,fields:t,lookup:r}})),n=t=>"foreign"!==t.type?t:{...t,references:(t.references||[]).map((t=>({...t,fields:t.fields.map((t=>t===`${e}.${a}`?`${e}.${i}`:t))})))},s={...t,definition:t.definition.map((e=>e.name===a?{...e,name:i}:e)),keys:o.map(n)};for(const[e,a]of t.keys.entries()){const i=o[e].lookup;a.lookup&&i!==a.lookup&&(0,_storage.fileExists)(`__indexes/${t.path}/${a.lookup}`)&&(await(0,_storage.writeJson)(`__indexes/${t.path}/${i}`,await(0,_storage.readJson)(`__indexes/${t.path}/${a.lookup}`)),await(0,_storage.removeFile)(`__indexes/${t.path}/${a.lookup}`))}await writeRecord(e,s);for(const t of r.filter((t=>t.entity!==e)))await(0,_storage.writeJson)(`${t.entity}.json`,{...t.record,keys:t.record.keys.map(n)});const d=(await rowsOf(t)).filter((e=>has(e.data,a)));d.length&&await(0,_packedTable.discardPacked)(t.path);for(const e of d){const r=Object.assign({},e.data);r[i]=r[a],delete r[a],await(0,_storage.writeJson)(`${t.path}/${e.fileName}`,r)}return s},modifyField=async(e,t,a)=>{(0,_knownFields.assertFieldsDefined)(e,t,[a.name],"alter");const i=t.definition.find((e=>e.name===a.name));if(i.type!==a.type)throw new Error(`Can't change the type of "${a.name}" on ${e} (${i.type} to ${a.type}): only optional, null and default can change`);if(Boolean(i.autoGenerate)!==Boolean(a.autoGenerate))throw new Error(`Can't change whether "${a.name}" on ${e} is auto: only optional, null and default can change`);const r={...t,definition:t.definition.map((e=>e.name===a.name?a:e))},o=await rowsOf(t),n=has(a,"default"),s=a.nullable?[]:o.filter((e=>null===e.data[a.name])),d=a.optional?[]:o.filter((e=>!has(e.data,a.name))),l=a.optional?[]:s;if((d.length||l.length)&&!n)throw d.length?new Error(`Can't make "${a.name}" required on ${e}: ${d.length} row(s) have no value for it (give it a default to fill them in)`):new Error(`Can't make "${a.name}" not null on ${e}: ${l.length} row(s) hold null (give it a default to fill them in, or make it optional)`);return await writeRecord(e,r),n&&await setField(e,r,[...d,...l],a.name,a.default),a.optional&&s.length&&await setField(e,r,s,a.name,void 0),r},alter=async(e,t)=>{if((0,_requireNode.requireNode)("alter"),"__RECORDS"===e)throw new Error("__RECORDS is reserved for the list of records");[e,..."field"in t?[t.field?.name]:[],..."name"in t?[t.name]:[],..."to"in t?[t.to]:[]].forEach((e=>(0,_assertValidName.assertValidName)(e,"alter")));const a=await(0,_retrieveRecord.retrieveRecord)(e);switch(t.action){case"add":return(await addField(e,a,(0,_field.field)(t.field))).definition;case"drop":return(await dropField(e,a,t.name)).definition;case"rename":return(await renameField(e,a,t.name,t.to)).definition;case"modify":return(await modifyField(e,a,(0,_field.field)(t.field))).definition;default:throw new Error(`Unknown alter action: ${t.action}`)}};exports.alter=alter;
|
|
@@ -5,10 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.create = exports.assertValidDefinition = void 0;
|
|
7
7
|
require("core-js/modules/es.array.includes.js");
|
|
8
|
-
require("
|
|
9
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
10
|
-
require("core-js/modules/esnext.iterator.find.js");
|
|
11
|
-
require("core-js/modules/esnext.iterator.some.js");
|
|
8
|
+
var _assertValidName = require("../utilities/assertValidName");
|
|
12
9
|
var _record = require("./definitions/record");
|
|
13
10
|
var _registerRecord = require("../utilities/registerRecord");
|
|
14
11
|
var _storage = require("../storage");
|
|
@@ -84,6 +81,20 @@ const create = async (recordName, definition = [], keys = []) => {
|
|
|
84
81
|
if (recordName === '__RECORDS') {
|
|
85
82
|
return null;
|
|
86
83
|
}
|
|
84
|
+
// Names become file paths and row keys: refuse what the query language would (e.g. `../x` from a direct call)
|
|
85
|
+
(0, _assertValidName.assertValidName)(recordName, 'create()');
|
|
86
|
+
for (const field of definition) {
|
|
87
|
+
(0, _assertValidName.assertValidName)(field?.name, `create() of ${recordName}`);
|
|
88
|
+
}
|
|
89
|
+
for (const key of keys) {
|
|
90
|
+
(key?.fields ?? []).forEach(name => (0, _assertValidName.assertValidName)(name, `create() of ${recordName}`));
|
|
91
|
+
(0, _assertValidName.assertValidLookup)(key?.lookup, `create() of ${recordName}`);
|
|
92
|
+
for (const reference of key?.references ?? []) {
|
|
93
|
+
// A reference names the other record's file (`people.json`) and its fields as `people._id`
|
|
94
|
+
(0, _assertValidName.assertValidLookup)(reference?.lookup ?? null, `create() of ${recordName}`);
|
|
95
|
+
(reference?.fields ?? []).forEach(name => String(name).split('.').forEach(part => (0, _assertValidName.assertValidName)(part, `create() of ${recordName}`)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
87
98
|
if ((0, _storage.fileExists)(`${recordName}.json`)) {
|
|
88
99
|
return null;
|
|
89
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=exports.assertValidDefinition=void 0,require("core-js/modules/es.array.includes.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=exports.assertValidDefinition=void 0,require("core-js/modules/es.array.includes.js");var _assertValidName=require("../utilities/assertValidName"),_record=require("./definitions/record"),_registerRecord=require("../utilities/registerRecord"),_storage=require("../storage"),_requireNode=require("../utilities/requireNode"),_typeCheck=require("./policies/typeCheck");const knownKeyProperties=["type","fields","lookup","references"],assertKnownKeyProperties=(e,r)=>{for(const t of r)for(const r of Object.keys(t))if(!knownKeyProperties.includes(r))throw new Error(`Unknown property "${r}" on ${t.type??"index"} key of ${e}; must be ${knownKeyProperties.join(", ")}`)},assertValidDefinition=(e,r)=>{for(const t of r.definition)if(Object.prototype.hasOwnProperty.call(t,"default"))try{(0,_typeCheck.typeCheck)(t.type,t.default,t.nullable)}catch(r){throw new Error(`Invalid default for field "${t.name}" of ${e}: ${r.message}`)}for(const t of r.keys){if(t.fields.length<1)throw new Error(`The ${t.type} key of ${e} must have at least one field`);for(const o of t.fields)if(!r.definition.some((e=>e.name===o)))throw new Error(`The ${t.type} key of ${e} names field "${o}", which isn't in the definition`)}const t=r.keys.find((e=>"primary"===e.type));for(const o of t?t.fields:[]){const t=r.definition.find((e=>e.name===o));if(t&&t.nullable)throw new Error(`Primary key field "${o}" of ${e} can't be nullable`);if(t&&t.optional&&!t.autoGenerate)throw new Error(`Primary key field "${o}" of ${e} can't be optional`)}};exports.assertValidDefinition=assertValidDefinition;const create=async(e,r=[],t=[])=>{if((0,_requireNode.requireNode)("create()"),"__RECORDS"===e)return null;(0,_assertValidName.assertValidName)(e,"create()");for(const t of r)(0,_assertValidName.assertValidName)(t?.name,`create() of ${e}`);for(const r of t){(r?.fields??[]).forEach((r=>(0,_assertValidName.assertValidName)(r,`create() of ${e}`))),(0,_assertValidName.assertValidLookup)(r?.lookup,`create() of ${e}`);for(const t of r?.references??[])(0,_assertValidName.assertValidLookup)(t?.lookup??null,`create() of ${e}`),(t?.fields??[]).forEach((r=>String(r).split(".").forEach((r=>(0,_assertValidName.assertValidName)(r,`create() of ${e}`)))))}if((0,_storage.fileExists)(`${e}.json`))return null;assertKnownKeyProperties(e,t);const o=(0,_record.record)({path:e,definition:r,keys:t});assertValidDefinition(e,o),await(0,_storage.makeDirectory)(),await(0,_storage.writeJson)(`${e}.json`,o),await(0,_storage.makeDirectory)(e);const i=o.keys.filter((e=>e.lookup));if(i.length){await(0,_storage.makeDirectory)(`__indexes/${e}`);for(const r of i)await(0,_storage.writeJson)(`__indexes/${e}/${r.lookup}`,[])}return await(0,_registerRecord.registerRecord)(e),o};exports.create=create;
|
|
@@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.key = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
7
|
var _keyReference = require("./keyReference");
|
|
10
8
|
/**
|
|
11
9
|
* Create a field key.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.key=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.key=void 0;var _keyReference=require("./keyReference");const key=({type:e="index",fields:r=[],lookup:n="",references:t=[]}={})=>{switch(e){case"primary":case"index":case"unique":t=[];break;case"multi":if(r.length<2)throw new Error("Multi key indicated with less than two fields");break;case"foreign":if(t.length<1)throw new Error("Foreign key must have one reference to an external record");break;default:throw new Error("Unrecognized key type; must be index, primary, unique, multi, or foreign")}const i={type:e,fields:r,lookup:n};return void 0!==t&&t.length>0&&(i.references=t.map(_keyReference.keyReference)),i};exports.key=key;
|
|
@@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.record = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
7
|
var _field = require("./field");
|
|
10
8
|
var _key = require("./key");
|
|
11
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.record=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.record=void 0;var _field=require("./field"),_key=require("./key");const record=({path:e="",definition:r=[],keys:i=[],entries:t=[]}={})=>({path:e,definition:r.map(_field.field),keys:i.map(_key.key),entries:t});exports.record=record;
|
|
@@ -5,7 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.describe = void 0;
|
|
7
7
|
var _retrieveFile = require("../utilities/retrieveFile");
|
|
8
|
+
var _assertValidName = require("../utilities/assertValidName");
|
|
8
9
|
const describe = async (record = '__RECORDS') => {
|
|
10
|
+
(0, _assertValidName.assertValidName)(record, 'describe()');
|
|
9
11
|
const recordFile = await (0, _retrieveFile.retrieveFile)(`${record}.json`);
|
|
10
12
|
if (record === '__RECORDS') {
|
|
11
13
|
return recordFile.entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.describe=void 0;var _retrieveFile=require("../utilities/retrieveFile");const describe=async(e="__RECORDS")=>{const i=await(0,_retrieveFile.retrieveFile)(`${e}.json`);return"__RECORDS"===e?i.entries:i.definition};exports.describe=describe;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.describe=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_assertValidName=require("../utilities/assertValidName");const describe=async(e="__RECORDS")=>{(0,_assertValidName.assertValidName)(e,"describe()");const i=await(0,_retrieveFile.retrieveFile)(`${e}.json`);return"__RECORDS"===e?i.entries:i.definition};exports.describe=describe;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
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.constructor.js");
|
|
6
|
-
require("core-js/modules/esnext.iterator.drop.js");
|
|
7
3
|
Object.defineProperty(exports, "__esModule", {
|
|
8
4
|
value: true
|
|
9
5
|
});
|
|
@@ -13,11 +9,14 @@ var _deregisterRecord = require("../utilities/deregisterRecord");
|
|
|
13
9
|
var _requireNode = require("../utilities/requireNode");
|
|
14
10
|
var _storage = require("../storage");
|
|
15
11
|
var _packedTable = require("../utilities/packedTable");
|
|
12
|
+
var _assertValidName = require("../utilities/assertValidName");
|
|
16
13
|
const drop = async record => {
|
|
17
14
|
(0, _requireNode.requireNode)('drop()');
|
|
18
15
|
if (record === '__RECORDS') {
|
|
19
16
|
return null;
|
|
20
17
|
}
|
|
18
|
+
// drop() removes files: a name like `../x` from a direct call must never reach storage
|
|
19
|
+
(0, _assertValidName.assertValidName)(record, 'drop()');
|
|
21
20
|
const recordFile = await (0, _retrieveFile.retrieveFile)(`${record}.json`);
|
|
22
21
|
for (const file of recordFile.entries) {
|
|
23
22
|
await (0, _storage.removeFile)(`${recordFile.path}/${file}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord"),_requireNode=require("../utilities/requireNode"),_storage=require("../storage"),_packedTable=require("../utilities/packedTable"),_assertValidName=require("../utilities/assertValidName");const drop=async e=>{if((0,_requireNode.requireNode)("drop()"),"__RECORDS"===e)return null;(0,_assertValidName.assertValidName)(e,"drop()");const r=await(0,_retrieveFile.retrieveFile)(`${e}.json`);for(const e of r.entries)await(0,_storage.removeFile)(`${r.path}/${e}`);await(0,_storage.removeDirectory)(r.path),await(0,_storage.removeDirectory)(`__indexes/${r.path}`),await(0,_packedTable.discardPacked)(r.path),await(0,_storage.removeFile)(`${e}.json`),await(0,_deregisterRecord.deregisterRecord)(e)};exports.drop=drop;
|
|
@@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.formatDatabase = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
9
7
|
var _storage = require("../storage");
|
|
10
8
|
var _config = require("../utilities/config");
|
|
11
9
|
var _requireNode = require("../utilities/requireNode");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatDatabase=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatDatabase=void 0;var _storage=require("../storage"),_config=require("../utilities/config"),_requireNode=require("../utilities/requireNode");const formatDatabase=async(t=(0,_config.getSetting)("format","compact"))=>{if((0,_requireNode.requireNode)("formatDatabase"),"compact"!==t&&"pretty"!==t)throw new Error(`Unknown format "${t}": use 'compact' or 'pretty'`);const e=(await(0,_storage.listFiles)()).filter((t=>t.endsWith(".json"))),r=[];for(const o of e){const e=await(0,_storage.readText)(o);let a;try{a=JSON.parse(e)}catch(t){throw new Error(`Could not format ${o}: ${t.message}`)}(0,_storage.jsonText)(a,t)!==e&&r.push({path:o,content:a})}for(const{path:e,content:o}of r)await(0,_storage.writeJson)(e,o,t);return{files:e.length,rewritten:r.length}};exports.formatDatabase=formatDatabase;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
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.constructor.js");
|
|
6
|
-
require("core-js/modules/esnext.iterator.drop.js");
|
|
7
3
|
Object.defineProperty(exports, "__esModule", {
|
|
8
4
|
value: true
|
|
9
5
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.packDatabase=exports.formatDatabase=exports.drop=exports.describe=exports.create=exports.checkPacked=exports.alter=void 0;var _create=require("./create"),_drop=require("./drop"),_describe=require("./describe"),_formatDatabase=require("./formatDatabase"),_alter=require("./alter"),_packDatabase=require("./packDatabase"),_databaseLock=require("../utilities/databaseLock"),_storage=require("../storage");const create=(...a)=>(0,_databaseLock.withDatabaseLock)((()=>(0,_storage.withWriteSet)((()=>(0,_create.create)(...a)))));exports.create=create;const drop=(...a)=>(0,_databaseLock.withDatabaseLock)((()=>(0,_storage.withWriteSet)((()=>(0,_drop.drop)(...a)))));exports.drop=drop;const alter=(...a)=>(0,_databaseLock.withDatabaseLock)((()=>(0,_storage.withWriteSet)((()=>(0,_alter.alter)(...a)))));exports.alter=alter;const describe=(...a)=>(0,_databaseLock.withDatabaseLock)((()=>(0,_describe.describe)(...a)));exports.describe=describe;const formatDatabase=(...a)=>(0,_databaseLock.withDatabaseLock)((()=>(0,_storage.withWriteSet)((()=>(0,_formatDatabase.formatDatabase)(...a)))));exports.formatDatabase=formatDatabase;const packDatabase=()=>(0,_databaseLock.withDatabaseLock)((()=>(0,_storage.withWriteSet)((()=>(0,_packDatabase.packDatabase)()))));exports.packDatabase=packDatabase;const checkPacked=()=>(0,_databaseLock.withDatabaseLock)((()=>(0,_packDatabase.checkPacked)()));exports.checkPacked=checkPacked;
|
|
@@ -5,25 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.packDatabase = exports.checkPacked = void 0;
|
|
7
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.filter.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
8
|
var _storage = require("../storage");
|
|
28
9
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
29
10
|
var _retrieveFiles = require("../utilities/retrieveFiles");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.packDatabase=exports.checkPacked=void 0,require("core-js/modules/es.json.stringify.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.packDatabase=exports.checkPacked=void 0,require("core-js/modules/es.json.stringify.js");var _storage=require("../storage"),_retrieveRecord=require("../utilities/retrieveRecord"),_retrieveFiles=require("../utilities/retrieveFiles"),_retrieveRecords=require("../utilities/retrieveRecords"),_packedTable=require("../utilities/packedTable"),_showRecords=require("../queries/showRecords"),_requireNode=require("../utilities/requireNode");const packedText=async e=>{const r=await(0,_retrieveRecord.retrieveRecord)(e),t=r.entries||[],a=await(0,_retrieveFiles.retrieveFiles)(t.map((e=>`${r.path}/${e}`)),_retrieveRecords.retrieveEntry),s={entries:t,rows:a};return{path:(0,_packedTable.packedPath)(r.path),text:(0,_storage.jsonText)(s,"compact"),rows:t.length}},orphanedPacks=async e=>{const r=new Set(e.map((e=>(0,_packedTable.packedPath)(e))));return(await(0,_storage.listFiles)("__packed")).filter((e=>!r.has(e)))},packDatabase=async()=>{(0,_requireNode.requireNode)("packDatabase");const e=await(0,_showRecords.showRecords)();let r=0;for(const t of e){const e=await packedText(t);await(0,_storage.makeDirectory)(e.path.slice(0,e.path.lastIndexOf("/"))),await(0,_storage.writeJson)(e.path,JSON.parse(e.text),"compact"),r+=e.rows}for(const r of await orphanedPacks(e))await(0,_storage.removeFile)(r);return{records:e.length,rows:r}};exports.packDatabase=packDatabase;const checkPacked=async()=>{(0,_requireNode.requireNode)("checkPacked");const e=await(0,_showRecords.showRecords)(),r=[];for(const t of e){const e=await packedText(t),a=(0,_storage.fileExists)(e.path)?await(0,_storage.readText)(e.path).catch((()=>{})):void 0;void 0!==a&&JSON.stringify(JSON.parse(a))===e.text||r.push(t)}return{stale:r,orphaned:await orphanedPacks(e)}};exports.checkPacked=checkPacked;
|
|
@@ -5,8 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.createRecord = void 0;
|
|
7
7
|
require("core-js/modules/es.array.includes.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
10
8
|
var _create = require("../introspect/create");
|
|
11
9
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
12
10
|
var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createRecord=void 0,require("core-js/modules/es.array.includes.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createRecord=void 0,require("core-js/modules/es.array.includes.js");var _create=require("../introspect/create"),_retrieveRecord=require("../utilities/retrieveRecord"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty"),_recordExists=require("../utilities/recordExists");const assertReferencesExist=async(e,r)=>{for(const t of r.keys){if("foreign"!==t.type)continue;const{entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(t.references[0].fields[0]);let o=r.definition.map((e=>e.name));if(i!==e){if(!(0,_recordExists.recordExists)(i))throw new Error(`Foreign key "${t.fields[0]}" references "${i}", which doesn't exist`);o=(await(0,_retrieveRecord.retrieveRecord)(i)).definition.map((e=>e.name))}if(!o.includes(s))throw new Error(`Foreign key "${t.fields[0]}" references "${i}.${s}", which is not a field`)}},createRecord=async(e,r)=>{if((0,_recordExists.recordExists)(e)){if(r.ifNotExists)return null;throw new Error(`Record "${e}" already exists`)}return await assertReferencesExist(e,r),(0,_create.create)(e,r.definition,r.keys)};exports.createRecord=createRecord;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.useDatabase = exports.showDatabases = exports.dropDatabase = exports.createDatabase = void 0;
|
|
8
7
|
require("core-js/modules/es.array.includes.js");
|
|
9
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
10
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
11
8
|
var jsEnv = _interopRequireWildcard(require("browser-or-node"));
|
|
12
9
|
var _config = require("../utilities/config");
|
|
13
10
|
var _requireNode = require("../utilities/requireNode");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useDatabase=exports.showDatabases=exports.dropDatabase=exports.createDatabase=void 0,require("core-js/modules/es.array.includes.js");var e,jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("../utilities/config"),_requireNode=require("../utilities/requireNode"),_databaseLock=require("../utilities/databaseLock"),_storage=require("../storage");function _interopRequireWildcard(a,t){if(!t&&a&&a.__esModule)return a;var s,r,i=Object.defineProperty,o={__proto__:null,default:a};if(Object(a)!==a)return o;if(e||"function"!=typeof WeakMap||(e=new WeakMap),e){if(e.has(a))return e.get(a);e.set(a,o)}for(r in a)"default"!==r&&{}.hasOwnProperty.call(a,r)&&((s=i&&Object.getOwnPropertyDescriptor(a,r))&&(s.get||s.set)?i(o,r,s):o[r]=a[r]);return o}const databaseExists=async e=>(await(0,_storage.readDatabaseList)()).includes(e)||jsEnv.isNode&&(0,_storage.databaseFolderExists)(e),createDatabase=async(e,a=!1)=>{(0,_requireNode.requireNode)('"create database"');const t=await(0,_storage.readDatabaseList)();if(t.includes(e)||(0,_storage.databaseFolderExists)(e)){if(!a)throw new Error(t.includes(e)?`Database "${e}" already exists`:`Database "${e}" already exists as a folder that isn't listed: create database if not exists ${e} lists it`);return t.includes(e)||await(0,_storage.writeDatabaseList)([...t,e]),null}return await(0,_storage.writeDatabaseList)([...t,e]),await(0,_storage.makeDatabaseFolder)(e),e};exports.createDatabase=createDatabase;const dropDatabase=async(e,a=!1)=>{if((0,_requireNode.requireNode)('"drop database"'),!await databaseExists(e)){if(a)return null;throw new Error(`Database "${e}" doesn't exist`)}if((0,_config.getSetting)("database",void 0)===e)throw new Error(`Can't drop the database in use ("${e}"): use another one first`);return await(0,_storage.writeDatabaseList)((await(0,_storage.readDatabaseList)()).filter((a=>a!==e))),await(0,_storage.removeDatabaseFolder)(e),e};exports.dropDatabase=dropDatabase;const useDatabase=async e=>{if(!jsEnv.isNode&&(0,_databaseLock.browserCallsRunning)()>1)throw new Error(`Can't use "${e}" while other calls are running in this page: await them first, or pick the database with configure({ database }) between calls`);if(!await databaseExists(e))throw new Error(`Database "${e}" doesn't exist${jsEnv.isNode?"":" (or isn't listed in __DATABASES.json)"}`);return(0,_config.switchDatabase)(e),e};exports.useDatabase=useDatabase;const showDatabases=async()=>(0,_storage.readDatabaseList)();exports.showDatabases=showDatabases;
|
|
@@ -4,26 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.deleteEntity = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.filter.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
7
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
28
8
|
var _retrieveFile = require("../utilities/retrieveFile");
|
|
29
9
|
var _removeFromIndex = require("../utilities/removeFromIndex");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0;var _retrieveRecord=require("../utilities/retrieveRecord"),_retrieveFile=require("../utilities/retrieveFile"),_removeFromIndex=require("../utilities/removeFromIndex"),_computeKeyValue=require("../utilities/computeKeyValue"),_fieldType=require("../utilities/fieldType"),_hasDependents=require("../introspect/policies/hasDependents"),_config=require("../utilities/config"),_keyIndexFiles=require("../utilities/keyIndexFiles"),_storage=require("../storage"),_packedTable=require("../utilities/packedTable");const assertNoDependents=async(e,t,i)=>{if(!(0,_config.getSetting)("enforceForeignKeys",!0)||1!==t.fields.length)return;const r=t.fields[0];for(const t of i)if(await(0,_hasDependents.hasDependents)(e,r,t[r]))throw new Error(`Cannot delete from "${e}" where "${r}" = ${t[r]} - other records still reference it`)},removeMatchingEntries=async(e,t,i,r)=>{const s=new Set,a=new Set,n=async e=>{const n=await(0,_retrieveFile.retrieveFile)(`${t.path}/${e}`),o=(0,_computeKeyValue.computeKeyValue)(i.fields,n);if(r.has(o)){await(0,_storage.removeFile)(`${t.path}/${e}`);for(const i of t.keys)await(0,_removeFromIndex.removeFromIndex)(t.path,i,(0,_computeKeyValue.computeKeyValue)(i.fields,n),e,(0,_fieldType.keyValueType)(t,i));s.add(e),a.add(o)}};for(const e of await(0,_keyIndexFiles.keyIndexFiles)(t,i,(e=>r.has(e)))??[])await n(e);if(a.size<r.size)for(const e of t.entries.filter((e=>!s.has(e))))await n(e);return t.entries.filter((e=>!s.has(e)))},deleteEntity=async(e="",t={})=>{const i=await(0,_retrieveRecord.retrieveRecord)(e),r=i.keys.find((e=>"primary"===e.type));if(!r)throw new Error(`Cannot delete from "${e}" without a primary key`);const s=t[e]||[];if(!s.length)return t;await assertNoDependents(e,r,s);const a=new Set(s.map((e=>(0,_computeKeyValue.computeKeyValue)(r.fields,e)))),n=await removeMatchingEntries(0,i,r,a);return n.length!==i.entries.length&&await(0,_packedTable.discardPacked)(i.path),i.entries=n,await(0,_storage.writeJson)(`${i.path}.json`,i),t};exports.deleteEntity=deleteEntity;
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
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
3
|
Object.defineProperty(exports, "__esModule", {
|
|
7
4
|
value: true
|
|
8
5
|
});
|
|
9
6
|
exports.dropRecord = void 0;
|
|
10
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
11
|
-
require("core-js/modules/esnext.iterator.some.js");
|
|
12
7
|
var _drop = require("../introspect/drop");
|
|
13
8
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
14
9
|
var _recordExists = require("../utilities/recordExists");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.dropRecord=void 0;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;
|
|
@@ -5,22 +5,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.groupBy = void 0;
|
|
7
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.map.js");
|
|
10
|
-
require("core-js/modules/esnext.iterator.reduce.js");
|
|
11
|
-
require("core-js/modules/esnext.map.delete-all.js");
|
|
12
|
-
require("core-js/modules/esnext.map.every.js");
|
|
13
|
-
require("core-js/modules/esnext.map.filter.js");
|
|
14
|
-
require("core-js/modules/esnext.map.find.js");
|
|
15
|
-
require("core-js/modules/esnext.map.find-key.js");
|
|
16
|
-
require("core-js/modules/esnext.map.includes.js");
|
|
17
|
-
require("core-js/modules/esnext.map.key-of.js");
|
|
18
|
-
require("core-js/modules/esnext.map.map-keys.js");
|
|
19
|
-
require("core-js/modules/esnext.map.map-values.js");
|
|
20
|
-
require("core-js/modules/esnext.map.merge.js");
|
|
21
|
-
require("core-js/modules/esnext.map.reduce.js");
|
|
22
|
-
require("core-js/modules/esnext.map.some.js");
|
|
23
|
-
require("core-js/modules/esnext.map.update.js");
|
|
24
8
|
// An object's keys in sorted order, at any depth, so { a, b } and { b, a } are the same value; arrays keep their order
|
|
25
9
|
const sortedKeys = value => {
|
|
26
10
|
if (Array.isArray(value)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupBy=void 0,require("core-js/modules/es.json.stringify.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.groupBy=void 0,require("core-js/modules/es.json.stringify.js");const sortedKeys=e=>Array.isArray(e)?e.map(sortedKeys):null!==e&&"object"==typeof e?Object.keys(e).sort().reduce(((r,s)=>(r[s]=sortedKeys(e[s]),r)),{}):e,groupKey=(e,r)=>{if(!Object.prototype.hasOwnProperty.call(e,r))return"missing";const s=e[r];return null!==s&&"object"==typeof s?`json:${JSON.stringify(sortedKeys(s))}`:`${typeof s}:${String(s)}`},groupBy=(e=[],r=[])=>{if(!r.length)return e;const[s,...o]=r,t=new Map;for(const r of e){const e=groupKey(r,s);t.has(e)||t.set(e,"missing"===e?{field:s,missing:!0,rows:[]}:{field:s,value:r[s],rows:[]}),t.get(e).rows.push(r)}return[...t.values()].map((({rows:e,...r})=>o.length?{...r,groups:groupBy(e,o)}:{...r,rows:e}))};exports.groupBy=groupBy;
|