json-fs-query 3.2.0 → 3.3.1
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 +265 -17
- package/browser/jsonFsQuery.js +2274 -305
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/alter.d.ts +12 -0
- package/dist/data/introspect/alter.js +304 -0
- package/dist/data/introspect/alter.min.js +1 -0
- package/dist/data/introspect/create.d.ts +10 -0
- package/dist/data/introspect/create.js +8 -2
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/introspect/drop.js +2 -0
- package/dist/data/introspect/drop.min.js +1 -1
- package/dist/data/introspect/formatDatabase.d.ts +17 -0
- package/dist/data/introspect/formatDatabase.js +56 -0
- package/dist/data/introspect/formatDatabase.min.js +1 -0
- package/dist/data/introspect/index.d.ts +9 -0
- package/dist/data/introspect/index.js +18 -5
- package/dist/data/introspect/index.min.js +1 -1
- package/dist/data/introspect/packDatabase.d.ts +27 -0
- package/dist/data/introspect/packDatabase.js +113 -0
- package/dist/data/introspect/packDatabase.min.js +1 -0
- package/dist/data/queries/databaseStatements.d.ts +31 -0
- package/dist/data/queries/databaseStatements.js +97 -0
- package/dist/data/queries/databaseStatements.min.js +1 -0
- package/dist/data/queries/deleteEntity.js +6 -1
- package/dist/data/queries/deleteEntity.min.js +1 -1
- package/dist/data/queries/insertEntity.d.ts +8 -0
- package/dist/data/queries/insertEntity.js +342 -33
- package/dist/data/queries/insertEntity.min.js +1 -1
- package/dist/data/queries/query.d.ts +2 -1
- package/dist/data/queries/query.js +5 -2
- package/dist/data/queries/query.min.js +1 -1
- package/dist/data/queries/selectFields.d.ts +5 -4
- package/dist/data/queries/selectFields.js +25 -11
- package/dist/data/queries/selectFields.min.js +1 -1
- package/dist/data/queries/updateEntity.js +39 -5
- package/dist/data/queries/updateEntity.min.js +1 -1
- package/dist/data/storage/databases.d.ts +32 -0
- package/dist/data/storage/databases.js +93 -0
- package/dist/data/storage/databases.min.js +1 -0
- package/dist/data/storage/fileExists.d.ts +2 -1
- package/dist/data/storage/fileExists.js +9 -2
- package/dist/data/storage/fileExists.min.js +1 -1
- package/dist/data/storage/index.d.ts +5 -2
- package/dist/data/storage/index.js +64 -1
- package/dist/data/storage/index.min.js +1 -1
- package/dist/data/storage/listFiles.d.ts +8 -0
- package/dist/data/storage/listFiles.js +52 -0
- package/dist/data/storage/listFiles.min.js +1 -0
- package/dist/data/storage/makeDirectory.d.ts +2 -1
- package/dist/data/storage/makeDirectory.js +8 -2
- package/dist/data/storage/makeDirectory.min.js +1 -1
- package/dist/data/storage/readJson.d.ts +9 -1
- package/dist/data/storage/readJson.js +20 -7
- package/dist/data/storage/readJson.min.js +1 -1
- package/dist/data/storage/removeDirectory.d.ts +3 -1
- package/dist/data/storage/removeDirectory.js +7 -1
- package/dist/data/storage/removeDirectory.min.js +1 -1
- package/dist/data/storage/removeFile.d.ts +2 -1
- package/dist/data/storage/removeFile.js +10 -1
- package/dist/data/storage/removeFile.min.js +1 -1
- package/dist/data/storage/storagePath.js +1 -1
- package/dist/data/storage/storagePath.min.js +1 -1
- package/dist/data/storage/writeJson.d.ts +12 -3
- package/dist/data/storage/writeJson.js +21 -7
- package/dist/data/storage/writeJson.min.js +1 -1
- package/dist/data/storage/writeSet.d.ts +64 -0
- package/dist/data/storage/writeSet.js +306 -0
- package/dist/data/storage/writeSet.min.js +1 -0
- package/dist/data/utilities/config.d.ts +37 -0
- package/dist/data/utilities/config.js +77 -5
- package/dist/data/utilities/config.min.js +1 -1
- package/dist/data/utilities/databaseLock.d.ts +5 -0
- package/dist/data/utilities/databaseLock.js +15 -3
- package/dist/data/utilities/databaseLock.min.js +1 -1
- package/dist/data/utilities/getConditionIndexedList.js +3 -4
- package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
- package/dist/data/utilities/indexBuffer.d.ts +35 -0
- package/dist/data/utilities/indexBuffer.js +139 -0
- package/dist/data/utilities/indexBuffer.min.js +1 -0
- package/dist/data/utilities/joinBases.js +2 -10
- package/dist/data/utilities/joinBases.min.js +1 -1
- package/dist/data/utilities/knownFields.d.ts +26 -0
- package/dist/data/utilities/knownFields.js +128 -0
- package/dist/data/utilities/knownFields.min.js +1 -0
- package/dist/data/utilities/packedTable.d.ts +34 -0
- package/dist/data/utilities/packedTable.js +60 -0
- package/dist/data/utilities/packedTable.min.js +1 -0
- package/dist/data/utilities/parsers/findInsertValues.d.ts +3 -3
- package/dist/data/utilities/parsers/findInsertValues.js +28 -12
- package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
- package/dist/data/utilities/parsers/maskStrings.js +11 -2
- package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
- package/dist/data/utilities/parsers/parseAlter.d.ts +33 -0
- package/dist/data/utilities/parsers/parseAlter.js +84 -0
- package/dist/data/utilities/parsers/parseAlter.min.js +1 -0
- package/dist/data/utilities/parsers/parseCreate.d.ts +14 -0
- package/dist/data/utilities/parsers/parseCreate.js +13 -5
- package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
- package/dist/data/utilities/parsers/parseDatabaseStatement.d.ts +17 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.js +82 -0
- package/dist/data/utilities/parsers/parseDatabaseStatement.min.js +1 -0
- package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
- package/dist/data/utilities/parsers/parseQuery.js +24 -0
- package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.js +1 -1
- package/dist/data/utilities/parsers/startsQuery.min.js +1 -1
- package/dist/data/utilities/reconcileJoin.d.ts +12 -0
- package/dist/data/utilities/reconcileJoin.js +30 -10
- package/dist/data/utilities/reconcileJoin.min.js +1 -1
- package/dist/data/utilities/retrieveFiles.d.ts +15 -0
- package/dist/data/utilities/retrieveFiles.js +48 -0
- package/dist/data/utilities/retrieveFiles.min.js +1 -0
- package/dist/data/utilities/retrieveRecord.d.ts +6 -0
- package/dist/data/utilities/retrieveRecord.js +24 -1
- package/dist/data/utilities/retrieveRecord.min.js +1 -1
- package/dist/data/utilities/retrieveRecords.d.ts +22 -0
- package/dist/data/utilities/retrieveRecords.js +60 -10
- package/dist/data/utilities/retrieveRecords.min.js +1 -1
- package/dist/data/utilities/runQuery.js +27 -2
- package/dist/data/utilities/runQuery.min.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +24 -0
- package/dist/index.min.js +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.packDatabase = exports.checkPacked = void 0;
|
|
7
|
+
require("core-js/modules/es.json.stringify.js");
|
|
8
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
|
+
require("core-js/modules/esnext.iterator.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
|
+
var _storage = require("../storage");
|
|
28
|
+
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
29
|
+
var _retrieveFiles = require("../utilities/retrieveFiles");
|
|
30
|
+
var _retrieveRecords = require("../utilities/retrieveRecords");
|
|
31
|
+
var _packedTable = require("../utilities/packedTable");
|
|
32
|
+
var _showRecords = require("../queries/showRecords");
|
|
33
|
+
var _requireNode = require("../utilities/requireNode");
|
|
34
|
+
/**
|
|
35
|
+
* The packed file a record should have, read from its entry files (never from a packed file), as the compact
|
|
36
|
+
* text packDatabase writes.
|
|
37
|
+
* @param name - The record's name.
|
|
38
|
+
*/
|
|
39
|
+
const packedText = async name => {
|
|
40
|
+
const record = await (0, _retrieveRecord.retrieveRecord)(name);
|
|
41
|
+
const entries = record.entries || [];
|
|
42
|
+
const rows = await (0, _retrieveFiles.retrieveFiles)(entries.map(file => `${record.path}/${file}`), _retrieveRecords.retrieveEntry);
|
|
43
|
+
const packed = {
|
|
44
|
+
entries,
|
|
45
|
+
rows
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
path: (0, _packedTable.packedPath)(record.path),
|
|
49
|
+
text: (0, _storage.jsonText)(packed, 'compact'),
|
|
50
|
+
rows: entries.length
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The packed files under `__packed/` that belong to no record (left by a record dropped outside json-fs-query, or
|
|
55
|
+
* renamed by hand).
|
|
56
|
+
* @param names - The records' names.
|
|
57
|
+
*/
|
|
58
|
+
const orphanedPacks = async names => {
|
|
59
|
+
const expected = new Set(names.map(name => (0, _packedTable.packedPath)(name)));
|
|
60
|
+
return (await (0, _storage.listFiles)('__packed')).filter(path => !expected.has(path));
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Write every record of the configured database into one packed file (`__packed/<record>.json`, compact JSON): its
|
|
64
|
+
* rows in the record's order. A browser then reads a record in one request instead of one per row when it needs more
|
|
65
|
+
* rows than one round of requests (see packedReads in configure); a static site runs this as a build step, after its data changes. The entry files
|
|
66
|
+
* stay the copy that's edited and reviewed; any insert, update or delete through json-fs-query removes the record's
|
|
67
|
+
* packed file, and reads only use one that matches its record, so a packed file is never read in place of a change
|
|
68
|
+
* made through json-fs-query. Packed files of records that no longer exist are removed.
|
|
69
|
+
*
|
|
70
|
+
* Runs as one statement (the public version, see withWriteSet): a row that can't be read fails it and nothing is
|
|
71
|
+
* written. Node only.
|
|
72
|
+
*/
|
|
73
|
+
const packDatabase = async () => {
|
|
74
|
+
(0, _requireNode.requireNode)('packDatabase');
|
|
75
|
+
const names = await (0, _showRecords.showRecords)();
|
|
76
|
+
let rows = 0;
|
|
77
|
+
for (const name of names) {
|
|
78
|
+
const packed = await packedText(name);
|
|
79
|
+
await (0, _storage.makeDirectory)(packed.path.slice(0, packed.path.lastIndexOf('/')));
|
|
80
|
+
await (0, _storage.writeJson)(packed.path, JSON.parse(packed.text), 'compact');
|
|
81
|
+
rows += packed.rows;
|
|
82
|
+
}
|
|
83
|
+
for (const path of await orphanedPacks(names)) {
|
|
84
|
+
await (0, _storage.removeFile)(path);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
records: names.length,
|
|
88
|
+
rows
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Which records' packed files don't match their entry files (missing, or packed before a change made by
|
|
93
|
+
* hand), and which packed files belong to no record, without changing anything: for a build or test to check that
|
|
94
|
+
* packDatabase has run since the data last changed. Node only.
|
|
95
|
+
*/
|
|
96
|
+
exports.packDatabase = packDatabase;
|
|
97
|
+
const checkPacked = async () => {
|
|
98
|
+
(0, _requireNode.requireNode)('checkPacked');
|
|
99
|
+
const names = await (0, _showRecords.showRecords)();
|
|
100
|
+
const stale = [];
|
|
101
|
+
for (const name of names) {
|
|
102
|
+
const packed = await packedText(name);
|
|
103
|
+
const current = (0, _storage.fileExists)(packed.path) ? await (0, _storage.readText)(packed.path).catch(() => undefined) : undefined;
|
|
104
|
+
if (typeof current === 'undefined' || JSON.stringify(JSON.parse(current)) !== packed.text) {
|
|
105
|
+
stale.push(name);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
stale,
|
|
110
|
+
orphaned: await orphanedPacks(names)
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
exports.checkPacked = checkPacked;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.packDatabase=exports.checkPacked=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"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.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 s=await(0,_retrieveRecord.retrieveRecord)(e),r=s.entries||[],t=await(0,_retrieveFiles.retrieveFiles)(r.map((e=>`${s.path}/${e}`)),_retrieveRecords.retrieveEntry),o={entries:r,rows:t};return{path:(0,_packedTable.packedPath)(s.path),text:(0,_storage.jsonText)(o,"compact"),rows:r.length}},orphanedPacks=async e=>{const s=new Set(e.map((e=>(0,_packedTable.packedPath)(e))));return(await(0,_storage.listFiles)("__packed")).filter((e=>!s.has(e)))},packDatabase=async()=>{(0,_requireNode.requireNode)("packDatabase");const e=await(0,_showRecords.showRecords)();let s=0;for(const r of e){const e=await packedText(r);await(0,_storage.makeDirectory)(e.path.slice(0,e.path.lastIndexOf("/"))),await(0,_storage.writeJson)(e.path,JSON.parse(e.text),"compact"),s+=e.rows}for(const s of await orphanedPacks(e))await(0,_storage.removeFile)(s);return{records:e.length,rows:s}};exports.packDatabase=packDatabase;const checkPacked=async()=>{(0,_requireNode.requireNode)("checkPacked");const e=await(0,_showRecords.showRecords)(),s=[];for(const r of e){const e=await packedText(r),t=(0,_storage.fileExists)(e.path)?await(0,_storage.readText)(e.path).catch((()=>{})):void 0;void 0!==t&&JSON.stringify(JSON.parse(t))===e.text||s.push(r)}return{stale:s,orphaned:await orphanedPacks(e)}};exports.checkPacked=checkPacked;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `create database [if not exists] <name>`: a new, empty database in the folder holding them (databasesPath). It
|
|
3
|
+
* doesn't switch to it (see use). The name is listed before the folder is made, so a stop part way leaves a listed
|
|
4
|
+
* database whose folder appears with its first record, never a folder no list names. A folder that's there but not
|
|
5
|
+
* listed (copied in by hand, or left by an older version) is listed by `if not exists`. Node only.
|
|
6
|
+
* @param name
|
|
7
|
+
* @param ifNotExists
|
|
8
|
+
* @returns The name, or null when it existed and `if not exists` was given.
|
|
9
|
+
*/
|
|
10
|
+
export declare const createDatabase: (name: string, ifNotExists?: boolean) => Promise<string | null>;
|
|
11
|
+
/**
|
|
12
|
+
* `drop database [if exists] <name>`: delete a database, its records and every row in them. The database in use can't
|
|
13
|
+
* be dropped (use another one first). Node only.
|
|
14
|
+
* @param name
|
|
15
|
+
* @param ifExists
|
|
16
|
+
* @returns The name, or null when it didn't exist and `if exists` was given.
|
|
17
|
+
*/
|
|
18
|
+
export declare const dropDatabase: (name: string, ifExists?: boolean) => Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* `use <name>`: switch to another database in the folder holding them, for the rest of the call and the calls after it
|
|
21
|
+
* (as configure({ database }) does). Works in a browser too (reading only), for a database listed in
|
|
22
|
+
* `__DATABASES.json`, while no other call is running in the page.
|
|
23
|
+
* @param name
|
|
24
|
+
* @returns The name.
|
|
25
|
+
*/
|
|
26
|
+
export declare const useDatabase: (name: string) => Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* `show databases`: the databases' names, in the order they were created.
|
|
29
|
+
*/
|
|
30
|
+
export declare const showDatabases: () => Promise<string[]>;
|
|
31
|
+
//# sourceMappingURL=databaseStatements.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.useDatabase = exports.showDatabases = exports.dropDatabase = exports.createDatabase = void 0;
|
|
8
|
+
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
|
+
var jsEnv = _interopRequireWildcard(require("browser-or-node"));
|
|
12
|
+
var _config = require("../utilities/config");
|
|
13
|
+
var _requireNode = require("../utilities/requireNode");
|
|
14
|
+
var _databaseLock = require("../utilities/databaseLock");
|
|
15
|
+
var _storage = require("../storage");
|
|
16
|
+
var e;
|
|
17
|
+
function _interopRequireWildcard(t, r) { if (!r && t && t.__esModule) return t; var n, a, o = Object.defineProperty, f = { __proto__: null, default: t }; if (Object(t) !== t) return f; if (e || "function" != typeof WeakMap || (e = new WeakMap()), e) { if (e.has(t)) return e.get(t); e.set(t, f); } for (a in t) "default" !== a && {}.hasOwnProperty.call(t, a) && ((n = o && Object.getOwnPropertyDescriptor(t, a)) && (n.get || n.set) ? o(f, a, n) : f[a] = t[a]); return f; }
|
|
18
|
+
/**
|
|
19
|
+
* Whether a database exists: listed in `__DATABASES.json`, or (in Node) a folder of that name is there.
|
|
20
|
+
* @param name
|
|
21
|
+
*/
|
|
22
|
+
const databaseExists = async name => (await (0, _storage.readDatabaseList)()).includes(name) || jsEnv.isNode && (0, _storage.databaseFolderExists)(name);
|
|
23
|
+
/**
|
|
24
|
+
* `create database [if not exists] <name>`: a new, empty database in the folder holding them (databasesPath). It
|
|
25
|
+
* doesn't switch to it (see use). The name is listed before the folder is made, so a stop part way leaves a listed
|
|
26
|
+
* database whose folder appears with its first record, never a folder no list names. A folder that's there but not
|
|
27
|
+
* listed (copied in by hand, or left by an older version) is listed by `if not exists`. Node only.
|
|
28
|
+
* @param name
|
|
29
|
+
* @param ifNotExists
|
|
30
|
+
* @returns The name, or null when it existed and `if not exists` was given.
|
|
31
|
+
*/
|
|
32
|
+
const createDatabase = async (name, ifNotExists = false) => {
|
|
33
|
+
(0, _requireNode.requireNode)('"create database"');
|
|
34
|
+
const listed = await (0, _storage.readDatabaseList)();
|
|
35
|
+
if (listed.includes(name) || (0, _storage.databaseFolderExists)(name)) {
|
|
36
|
+
if (!ifNotExists) {
|
|
37
|
+
throw new Error(listed.includes(name) ? `Database "${name}" already exists` : `Database "${name}" already exists as a folder that isn't listed: create database if not exists ${name} lists it`);
|
|
38
|
+
}
|
|
39
|
+
if (!listed.includes(name)) {
|
|
40
|
+
await (0, _storage.writeDatabaseList)([...listed, name]);
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
await (0, _storage.writeDatabaseList)([...listed, name]);
|
|
45
|
+
await (0, _storage.makeDatabaseFolder)(name);
|
|
46
|
+
return name;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* `drop database [if exists] <name>`: delete a database, its records and every row in them. The database in use can't
|
|
50
|
+
* be dropped (use another one first). Node only.
|
|
51
|
+
* @param name
|
|
52
|
+
* @param ifExists
|
|
53
|
+
* @returns The name, or null when it didn't exist and `if exists` was given.
|
|
54
|
+
*/
|
|
55
|
+
exports.createDatabase = createDatabase;
|
|
56
|
+
const dropDatabase = async (name, ifExists = false) => {
|
|
57
|
+
(0, _requireNode.requireNode)('"drop database"');
|
|
58
|
+
if (!(await databaseExists(name))) {
|
|
59
|
+
if (ifExists) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Database "${name}" doesn't exist`);
|
|
63
|
+
}
|
|
64
|
+
if ((0, _config.getSetting)('database', undefined) === name) {
|
|
65
|
+
throw new Error(`Can't drop the database in use ("${name}"): use another one first`);
|
|
66
|
+
}
|
|
67
|
+
// Unlisted first: a stop part way leaves a folder no list names, never a listed database with no folder
|
|
68
|
+
await (0, _storage.writeDatabaseList)((await (0, _storage.readDatabaseList)()).filter(listed => listed !== name));
|
|
69
|
+
await (0, _storage.removeDatabaseFolder)(name);
|
|
70
|
+
return name;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* `use <name>`: switch to another database in the folder holding them, for the rest of the call and the calls after it
|
|
74
|
+
* (as configure({ database }) does). Works in a browser too (reading only), for a database listed in
|
|
75
|
+
* `__DATABASES.json`, while no other call is running in the page.
|
|
76
|
+
* @param name
|
|
77
|
+
* @returns The name.
|
|
78
|
+
*/
|
|
79
|
+
exports.dropDatabase = dropDatabase;
|
|
80
|
+
const useDatabase = async name => {
|
|
81
|
+
// A browser runs calls side by side (see withDatabaseLock), and there's one database in use for the page: switching
|
|
82
|
+
// now would move the other calls to it part way
|
|
83
|
+
if (!jsEnv.isNode && (0, _databaseLock.browserCallsRunning)() > 1) {
|
|
84
|
+
throw new Error(`Can't use "${name}" while other calls are running in this page: await them first, or pick the database with configure({ database }) between calls`);
|
|
85
|
+
}
|
|
86
|
+
if (!(await databaseExists(name))) {
|
|
87
|
+
throw new Error(`Database "${name}" doesn't exist${jsEnv.isNode ? '' : ' (or isn\'t listed in __DATABASES.json)'}`);
|
|
88
|
+
}
|
|
89
|
+
(0, _config.switchDatabase)(name);
|
|
90
|
+
return name;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* `show databases`: the databases' names, in the order they were created.
|
|
94
|
+
*/
|
|
95
|
+
exports.useDatabase = useDatabase;
|
|
96
|
+
const showDatabases = async () => (0, _storage.readDatabaseList)();
|
|
97
|
+
exports.showDatabases = showDatabases;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.useDatabase=exports.showDatabases=exports.dropDatabase=exports.createDatabase=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.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;
|
|
@@ -33,6 +33,7 @@ var _hasDependents = require("../introspect/policies/hasDependents");
|
|
|
33
33
|
var _config = require("../utilities/config");
|
|
34
34
|
var _keyIndexFiles = require("../utilities/keyIndexFiles");
|
|
35
35
|
var _storage = require("../storage");
|
|
36
|
+
var _packedTable = require("../utilities/packedTable");
|
|
36
37
|
/**
|
|
37
38
|
* RESTRICT: reject the whole delete (before removing anything) if any row being deleted is still
|
|
38
39
|
* referenced by a single-field foreign key elsewhere. Only meaningful for a single-field primary
|
|
@@ -105,7 +106,11 @@ const deleteEntity = async (entity = '', dataSet = {}) => {
|
|
|
105
106
|
}
|
|
106
107
|
await assertNoDependents(entity, primaryKey, toDelete);
|
|
107
108
|
const deletedValues = new Set(toDelete.map(row => (0, _computeKeyValue.computeKeyValue)(primaryKey.fields, row)));
|
|
108
|
-
|
|
109
|
+
const remaining = await removeMatchingEntries(entity, record, primaryKey, deletedValues);
|
|
110
|
+
if (remaining.length !== record.entries.length) {
|
|
111
|
+
await (0, _packedTable.discardPacked)(record.path);
|
|
112
|
+
}
|
|
113
|
+
record.entries = remaining;
|
|
109
114
|
await (0, _storage.writeJson)(`${record.path}.json`, record);
|
|
110
115
|
return dataSet;
|
|
111
116
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");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");const assertNoDependents=async(e,r,s)=>{if(!(0,_config.getSetting)("enforceForeignKeys",!0)||1!==r.fields.length)return;const t=r.fields[0];for(const r of s)if(await(0,_hasDependents.hasDependents)(e,t,r[t]))throw new Error(`Cannot delete from "${e}" where "${t}" = ${r[t]} - other records still reference it`)},removeMatchingEntries=async(e,r,s,t)=>{const i=new Set,o=new Set,n=async e=>{const n=await(0,_retrieveFile.retrieveFile)(`${r.path}/${e}`),u=(0,_computeKeyValue.computeKeyValue)(s.fields,n);if(t.has(u)){await(0,_storage.removeFile)(`${r.path}/${e}`);for(const s of r.keys)await(0,_removeFromIndex.removeFromIndex)(r.path,s,(0,_computeKeyValue.computeKeyValue)(s.fields,n),e,(0,_fieldType.keyValueType)(r,s));i.add(e),o.add(u)}};for(const e of await(0,_keyIndexFiles.keyIndexFiles)(r,s,(e=>t.has(e)))??[])await n(e);if(o.size<t.size)for(const e of r.entries.filter((e=>!i.has(e))))await n(e);return r.entries.filter((e=>!i.has(e)))},deleteEntity=async(e="",r={})=>{const s=await(0,_retrieveRecord.retrieveRecord)(e),t=s.keys.find((e=>"primary"===e.type));if(!t)throw new Error(`Cannot delete from "${e}" without a primary key`);const i=r[e]||[];if(!i.length)return r;await assertNoDependents(e,t,i);const o=new Set(i.map((e=>(0,_computeKeyValue.computeKeyValue)(t.fields,e))))
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.deleteEntity=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js");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,r,s)=>{if(!(0,_config.getSetting)("enforceForeignKeys",!0)||1!==r.fields.length)return;const t=r.fields[0];for(const r of s)if(await(0,_hasDependents.hasDependents)(e,t,r[t]))throw new Error(`Cannot delete from "${e}" where "${t}" = ${r[t]} - other records still reference it`)},removeMatchingEntries=async(e,r,s,t)=>{const i=new Set,o=new Set,n=async e=>{const n=await(0,_retrieveFile.retrieveFile)(`${r.path}/${e}`),u=(0,_computeKeyValue.computeKeyValue)(s.fields,n);if(t.has(u)){await(0,_storage.removeFile)(`${r.path}/${e}`);for(const s of r.keys)await(0,_removeFromIndex.removeFromIndex)(r.path,s,(0,_computeKeyValue.computeKeyValue)(s.fields,n),e,(0,_fieldType.keyValueType)(r,s));i.add(e),o.add(u)}};for(const e of await(0,_keyIndexFiles.keyIndexFiles)(r,s,(e=>t.has(e)))??[])await n(e);if(o.size<t.size)for(const e of r.entries.filter((e=>!i.has(e))))await n(e);return r.entries.filter((e=>!i.has(e)))},deleteEntity=async(e="",r={})=>{const s=await(0,_retrieveRecord.retrieveRecord)(e),t=s.keys.find((e=>"primary"===e.type));if(!t)throw new Error(`Cannot delete from "${e}" without a primary key`);const i=r[e]||[];if(!i.length)return r;await assertNoDependents(e,t,i);const o=new Set(i.map((e=>(0,_computeKeyValue.computeKeyValue)(t.fields,e)))),n=await removeMatchingEntries(0,s,t,o);return n.length!==s.entries.length&&await(0,_packedTable.discardPacked)(s.path),s.entries=n,await(0,_storage.writeJson)(`${s.path}.json`,s),r};exports.deleteEntity=deleteEntity;
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insert rows into a record, all in one statement: every row is checked (against the rows in storage and the rows
|
|
3
|
+
* before it in the statement) and its entry file written, then the record file and each index are written once.
|
|
4
|
+
* Inside a write set (as every query runs, see withWriteSet) a row that fails leaves none of them written.
|
|
5
|
+
* @param entity
|
|
6
|
+
* @param values - The rows, as field -> value.
|
|
7
|
+
* @param dataSet
|
|
8
|
+
*/
|
|
1
9
|
export declare const insertEntity: (entity?: string, values?: Object[], dataSet?: Object) => Promise<Object>;
|
|
2
10
|
//# sourceMappingURL=insertEntity.d.ts.map
|