json-fs-query 3.0.0 → 3.1.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 +3 -2
- package/browser/jsonFsQuery.js +12659 -13393
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/create.js +30 -1
- package/dist/data/introspect/create.min.js +1 -1
- package/dist/data/utilities/databaseLock.js +2 -1
- package/dist/data/utilities/databaseLock.min.js +1 -1
- package/dist/data/utilities/retrieveFile.js +2 -1
- package/dist/data/utilities/retrieveFile.min.js +1 -1
- package/package.json +8 -6
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.create = void 0;
|
|
7
|
+
require("core-js/modules/es.array.includes.js");
|
|
7
8
|
require("core-js/modules/es.json.stringify.js");
|
|
8
9
|
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
10
|
require("core-js/modules/esnext.iterator.find.js");
|
|
@@ -12,11 +13,28 @@ var _record = require("./definitions/record");
|
|
|
12
13
|
var _registerRecord = require("../utilities/registerRecord");
|
|
13
14
|
var _config = require("../utilities/config");
|
|
14
15
|
var _typeCheck = require("./policies/typeCheck");
|
|
16
|
+
const knownKeyProperties = ['type', 'fields', 'lookup', 'references'];
|
|
17
|
+
/**
|
|
18
|
+
* Reject a key with a property key() would ignore (a typo such as `keys` for `fields`), which has to be
|
|
19
|
+
* checked on the keys as given, before key() drops it.
|
|
20
|
+
* @param recordName
|
|
21
|
+
* @param keys
|
|
22
|
+
*/
|
|
23
|
+
const assertKnownKeyProperties = (recordName, keys) => {
|
|
24
|
+
for (const key of keys) {
|
|
25
|
+
for (const property of Object.keys(key)) {
|
|
26
|
+
if (!knownKeyProperties.includes(property)) {
|
|
27
|
+
throw new Error(`Unknown property "${property}" on ${key.type ?? 'index'} key of ${recordName}; must be ${knownKeyProperties.join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
15
32
|
/**
|
|
16
33
|
* Reject a definition that could never be written correctly, before anything is created: a
|
|
17
34
|
* default that fails its field's type check (otherwise every insert leaving that field out would
|
|
18
35
|
* fail instead), including a null default on a field that isn't nullable, and a nullable field in
|
|
19
|
-
* the primary key (an entry's file name comes from its primary key value).
|
|
36
|
+
* the primary key (an entry's file name comes from its primary key value). Also a key with no fields,
|
|
37
|
+
* or with a field that isn't in the definition.
|
|
20
38
|
* @param recordName
|
|
21
39
|
* @param recordContent
|
|
22
40
|
*/
|
|
@@ -31,6 +49,16 @@ const assertValidDefinition = (recordName, recordContent) => {
|
|
|
31
49
|
throw new Error(`Invalid default for field "${field.name}" of ${recordName}: ${err.message}`);
|
|
32
50
|
}
|
|
33
51
|
}
|
|
52
|
+
for (const key of recordContent.keys) {
|
|
53
|
+
if (key.fields.length < 1) {
|
|
54
|
+
throw new Error(`The ${key.type} key of ${recordName} must have at least one field`);
|
|
55
|
+
}
|
|
56
|
+
for (const fieldName of key.fields) {
|
|
57
|
+
if (!recordContent.definition.some(field => field.name === fieldName)) {
|
|
58
|
+
throw new Error(`The ${key.type} key of ${recordName} names field "${fieldName}", which isn't in the definition`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
34
62
|
const primaryKey = recordContent.keys.find(key => key.type === 'primary');
|
|
35
63
|
for (const fieldName of primaryKey ? primaryKey.fields : []) {
|
|
36
64
|
if (recordContent.definition.some(field => field.name === fieldName && field.nullable)) {
|
|
@@ -59,6 +87,7 @@ const create = async (recordName, definition = [], keys = []) => {
|
|
|
59
87
|
if (existsSync(`${databasePath}${recordName}.json`)) {
|
|
60
88
|
return null;
|
|
61
89
|
}
|
|
90
|
+
assertKnownKeyProperties(recordName, keys);
|
|
62
91
|
const recordContent = (0, _record.record)({
|
|
63
92
|
path: recordName,
|
|
64
93
|
definition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=void 0,require("core-js/modules/es.json.stringify.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.find.js"),require("core-js/modules/esnext.iterator.some.js");var _record=require("./definitions/record"),_registerRecord=require("../utilities/registerRecord"),_config=require("../utilities/config"),_typeCheck=require("./policies/typeCheck");const 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}`)}const t=r.keys.find((e=>"primary"===e.type));for(const i of t?t.fields:[])if(r.definition.some((e=>e.name===i&&e.nullable)))throw new Error(`Primary key field "${i}" of ${e} can't be nullable`)},create=async(e,r=[],t=[])=>{const{writeFile:i,mkdir:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.create=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"),require("core-js/modules/esnext.iterator.some.js");var _record=require("./definitions/record"),_registerRecord=require("../utilities/registerRecord"),_config=require("../utilities/config"),_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 i of t.fields)if(!r.definition.some((e=>e.name===i)))throw new Error(`The ${t.type} key of ${e} names field "${i}", which isn't in the definition`)}const t=r.keys.find((e=>"primary"===e.type));for(const i of t?t.fields:[])if(r.definition.some((e=>e.name===i&&e.nullable)))throw new Error(`Primary key field "${i}" of ${e} can't be nullable`)},create=async(e,r=[],t=[])=>{const{writeFile:i,mkdir:o}=require("fs/promises"),{existsSync:s}=require("fs"),n=(0,_config.getSetting)("databasePath","database/");if("__RECORDS"===e)return null;if(s(`${n}${e}.json`))return null;assertKnownKeyProperties(e,t);const a=(0,_record.record)({path:e,definition:r,keys:t});return assertValidDefinition(e,a),await o(n,{recursive:!0}),await i(`${n}${e}.json`,JSON.stringify(a,null,2)),await o(`${n}${e}`,{recursive:!0}),await(0,_registerRecord.registerRecord)(e),a};exports.create=create;
|
|
@@ -20,7 +20,8 @@ require("core-js/modules/esnext.map.some.js");
|
|
|
20
20
|
require("core-js/modules/esnext.map.update.js");
|
|
21
21
|
var jsEnv = _interopRequireWildcard(require("browser-or-node"));
|
|
22
22
|
var _config = require("./config");
|
|
23
|
-
|
|
23
|
+
var e;
|
|
24
|
+
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; }
|
|
24
25
|
const queues = new Map();
|
|
25
26
|
/**
|
|
26
27
|
* Run `task` once every earlier task on the same database (the configured databasePath) has finished, so that calls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.withDatabaseLock=void 0,require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js");var jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("./config");function _interopRequireWildcard(
|
|
1
|
+
"use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.withDatabaseLock=void 0,require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js");var e,jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("./config");function _interopRequireWildcard(s,r){if(!r&&s&&s.__esModule)return s;var t,a,o=Object.defineProperty,u={__proto__:null,default:s};if(Object(s)!==s)return u;if(e||"function"!=typeof WeakMap||(e=new WeakMap),e){if(e.has(s))return e.get(s);e.set(s,u)}for(a in s)"default"!==a&&{}.hasOwnProperty.call(s,a)&&((t=o&&Object.getOwnPropertyDescriptor(s,a))&&(t.get||t.set)?o(u,a,t):u[a]=s[a]);return u}const queues=new Map,withDatabaseLock=async e=>{if(!jsEnv.isNode)return e();const s=(0,_config.resolveDatabasePath)((0,_config.getSetting)("databasePath","database/")),r=(0,_config.trackDatabaseCall)(),t=queues.get(s)||Promise.resolve();let a;const o=new Promise((e=>{a=e})),u=t.then((()=>o));queues.set(s,u),await t;try{return await e()}finally{r(),a(),queues.get(s)===u&&queues.delete(s)}};exports.withDatabaseLock=withDatabaseLock;
|
|
@@ -7,7 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.retrieveFile = void 0;
|
|
8
8
|
var jsEnv = _interopRequireWildcard(require("browser-or-node"));
|
|
9
9
|
var _config = require("./config");
|
|
10
|
-
|
|
10
|
+
var e;
|
|
11
|
+
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; }
|
|
11
12
|
const retrieveFile = async path => {
|
|
12
13
|
let retrieveFn = url => fetch(url).then(res => res.json());
|
|
13
14
|
const relativePath = jsEnv.isBrowser ? (0, _config.getSetting)('relativePath', '') : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFile=void 0;var jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("./config");function _interopRequireWildcard(
|
|
1
|
+
"use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFile=void 0;var e,jsEnv=_interopRequireWildcard(require("browser-or-node")),_config=require("./config");function _interopRequireWildcard(r,t){if(!t&&r&&r.__esModule)return r;var i,o,n=Object.defineProperty,s={__proto__:null,default:r};if(Object(r)!==r)return s;if(e||"function"!=typeof WeakMap||(e=new WeakMap),e){if(e.has(r))return e.get(r);e.set(r,s)}for(o in r)"default"!==o&&{}.hasOwnProperty.call(r,o)&&((i=n&&Object.getOwnPropertyDescriptor(r,o))&&(i.get||i.set)?n(s,o,i):s[o]=r[o]);return s}const retrieveFile=async e=>{let r=e=>fetch(e).then((e=>e.json()));const t=jsEnv.isBrowser?(0,_config.getSetting)("relativePath",""):"";if(jsEnv.isNode){const{readFile:e}=require("fs/promises");r=r=>e(r).then((e=>JSON.parse(e)))}const i=`${t}${(0,_config.getSetting)("databasePath","database/")}${e}`,o=await r(i).catch((e=>console.error(e)));if(!o)throw new Error(`Could not read ${e}`);return o};exports.retrieveFile=retrieveFile;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-fs-query",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Use json files to manage and read data.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
|
31
|
-
"url": "git+https://github.com/jheagle/json-
|
|
31
|
+
"url": "git+https://github.com/jheagle/json-fs-query.git"
|
|
32
32
|
},
|
|
33
33
|
"keywords": [
|
|
34
34
|
"database",
|
|
@@ -39,12 +39,13 @@
|
|
|
39
39
|
"author": "Joshua Heagle <joshuaheagle@gmail.com>",
|
|
40
40
|
"license": "GPL-3.0-or-later",
|
|
41
41
|
"bugs": {
|
|
42
|
-
"url": "https://github.com/jheagle/json-
|
|
42
|
+
"url": "https://github.com/jheagle/json-fs-query/issues"
|
|
43
43
|
},
|
|
44
|
-
"homepage": "https://github.com/jheagle/json-
|
|
44
|
+
"homepage": "https://github.com/jheagle/json-fs-query#readme",
|
|
45
45
|
"devDependencies": {
|
|
46
|
+
"@babel/core": "^8.1.0",
|
|
46
47
|
"gulp": "^5.0.1",
|
|
47
|
-
"js-build-tools": "^
|
|
48
|
+
"js-build-tools": "^8.0.0",
|
|
48
49
|
"release-it": "^21.1.1",
|
|
49
50
|
"test-filesystem": "^2.0.2",
|
|
50
51
|
"typedoc": "^0.28.20"
|
|
@@ -63,6 +64,7 @@
|
|
|
63
64
|
"core-js": false,
|
|
64
65
|
"core-js-pure": false,
|
|
65
66
|
"@parcel/watcher": false,
|
|
66
|
-
"unrs-resolver": false
|
|
67
|
+
"unrs-resolver": false,
|
|
68
|
+
"esbuild": false
|
|
67
69
|
}
|
|
68
70
|
}
|