json-fs-query 3.1.0 → 3.1.2

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.
@@ -12,6 +12,7 @@ require("core-js/modules/esnext.iterator.some.js");
12
12
  var _record = require("./definitions/record");
13
13
  var _registerRecord = require("../utilities/registerRecord");
14
14
  var _config = require("../utilities/config");
15
+ var _requireNode = require("../utilities/requireNode");
15
16
  var _typeCheck = require("./policies/typeCheck");
16
17
  const knownKeyProperties = ['type', 'fields', 'lookup', 'references'];
17
18
  /**
@@ -73,6 +74,7 @@ const assertValidDefinition = (recordName, recordContent) => {
73
74
  * @param keys
74
75
  */
75
76
  const create = async (recordName, definition = [], keys = []) => {
77
+ (0, _requireNode.requireNode)('create()');
76
78
  const {
77
79
  writeFile,
78
80
  mkdir
@@ -1 +1 @@
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;
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"),_requireNode=require("../utilities/requireNode"),_typeCheck=require("./policies/typeCheck");const knownKeyProperties=["type","fields","lookup","references"],assertKnownKeyProperties=(e,r)=>{for(const i of r)for(const r of Object.keys(i))if(!knownKeyProperties.includes(r))throw new Error(`Unknown property "${r}" on ${i.type??"index"} key of ${e}; must be ${knownKeyProperties.join(", ")}`)},assertValidDefinition=(e,r)=>{for(const i of r.definition)if(Object.prototype.hasOwnProperty.call(i,"default"))try{(0,_typeCheck.typeCheck)(i.type,i.default,i.nullable)}catch(r){throw new Error(`Invalid default for field "${i.name}" of ${e}: ${r.message}`)}for(const i of r.keys){if(i.fields.length<1)throw new Error(`The ${i.type} key of ${e} must have at least one field`);for(const t of i.fields)if(!r.definition.some((e=>e.name===t)))throw new Error(`The ${i.type} key of ${e} names field "${t}", which isn't in the definition`)}const i=r.keys.find((e=>"primary"===e.type));for(const t of i?i.fields:[])if(r.definition.some((e=>e.name===t&&e.nullable)))throw new Error(`Primary key field "${t}" of ${e} can't be nullable`)},create=async(e,r=[],i=[])=>{(0,_requireNode.requireNode)("create()");const{writeFile:t,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,i);const a=(0,_record.record)({path:e,definition:r,keys:i});return assertValidDefinition(e,a),await o(n,{recursive:!0}),await t(`${n}${e}.json`,JSON.stringify(a,null,2)),await o(`${n}${e}`,{recursive:!0}),await(0,_registerRecord.registerRecord)(e),a};exports.create=create;
@@ -11,10 +11,12 @@ exports.drop = void 0;
11
11
  var _retrieveFile = require("../utilities/retrieveFile");
12
12
  var _deregisterRecord = require("../utilities/deregisterRecord");
13
13
  var _config = require("../utilities/config");
14
+ var _requireNode = require("../utilities/requireNode");
14
15
  const {
15
16
  rm
16
17
  } = require('fs/promises');
17
18
  const drop = async record => {
19
+ (0, _requireNode.requireNode)('drop()');
18
20
  const databasePath = (0, _config.getSetting)('databasePath', 'database/');
19
21
  if (record === '__RECORDS') {
20
22
  return null;
@@ -1 +1 @@
1
- "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord"),_config=require("../utilities/config");const{rm:rm}=require("fs/promises"),drop=async e=>{const r=(0,_config.getSetting)("databasePath","database/");if("__RECORDS"===e)return null;const t=await(0,_retrieveFile.retrieveFile)(`${e}.json`);for(const e of t.entries)await rm(`${r}${t.path}/${e}`);await rm(`${r}${t.path}`,{recursive:!0,force:!0}),await rm(`${r}__indexes/${t.path}`,{recursive:!0,force:!0}),await rm(`${r}${e}.json`),await(0,_deregisterRecord.deregisterRecord)(e)};exports.drop=drop;
1
+ "use strict";require("core-js/modules/esnext.async-iterator.constructor.js"),require("core-js/modules/esnext.async-iterator.drop.js"),require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.drop.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord"),_config=require("../utilities/config"),_requireNode=require("../utilities/requireNode");const{rm:rm}=require("fs/promises"),drop=async e=>{(0,_requireNode.requireNode)("drop()");const r=(0,_config.getSetting)("databasePath","database/");if("__RECORDS"===e)return null;const i=await(0,_retrieveFile.retrieveFile)(`${e}.json`);for(const e of i.entries)await rm(`${r}${i.path}/${e}`);await rm(`${r}${i.path}`,{recursive:!0,force:!0}),await rm(`${r}__indexes/${i.path}`,{recursive:!0,force:!0}),await rm(`${r}${e}.json`),await(0,_deregisterRecord.deregisterRecord)(e)};exports.drop=drop;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Throw a clear error when `action` is attempted outside Node. In a browser json-fs-query reads the database over
3
+ * fetch(), and nothing can be written: without this check a write reached the missing `fs` functions and failed with
4
+ * an unhelpful "... is not a function".
5
+ * @param action What was attempted, for the message (for example "insert" or "create()").
6
+ * @throws {Error} Outside Node.
7
+ */
8
+ export declare const requireNode: (action: string) => void;
9
+ //# sourceMappingURL=requireNode.d.ts.map
@@ -0,0 +1,23 @@
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.requireNode = void 0;
8
+ var jsEnv = _interopRequireWildcard(require("browser-or-node"));
9
+ var e;
10
+ 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
+ * Throw a clear error when `action` is attempted outside Node. In a browser json-fs-query reads the database over
13
+ * fetch(), and nothing can be written: without this check a write reached the missing `fs` functions and failed with
14
+ * an unhelpful "... is not a function".
15
+ * @param action What was attempted, for the message (for example "insert" or "create()").
16
+ * @throws {Error} Outside Node.
17
+ */
18
+ const requireNode = action => {
19
+ if (!jsEnv.isNode) {
20
+ throw new Error(`${action} only works in Node: in a browser, json-fs-query can only read the database (over fetch())`);
21
+ }
22
+ };
23
+ exports.requireNode = requireNode;
@@ -0,0 +1 @@
1
+ "use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.requireNode=void 0;var e,jsEnv=_interopRequireWildcard(require("browser-or-node"));function _interopRequireWildcard(r,o){if(!o&&r&&r.__esModule)return r;var t,n,i=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(n in r)"default"!==n&&{}.hasOwnProperty.call(r,n)&&((t=i&&Object.getOwnPropertyDescriptor(r,n))&&(t.get||t.set)?i(s,n,t):s[n]=r[n]);return s}const requireNode=e=>{if(!jsEnv.isNode)throw new Error(`${e} only works in Node: in a browser, json-fs-query can only read the database (over fetch())`)};exports.requireNode=requireNode;
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.runQuery = void 0;
7
+ require("core-js/modules/es.array.includes.js");
7
8
  require("core-js/modules/esnext.set.add-all.js");
8
9
  require("core-js/modules/esnext.set.delete-all.js");
9
10
  require("core-js/modules/esnext.set.difference.js");
@@ -43,6 +44,7 @@ var _splitEntityProperty = require("./parsers/splitEntityProperty");
43
44
  var _fieldType = require("./fieldType");
44
45
  var _conditionTree = require("./conditionTree");
45
46
  var _conditionEntities = require("./conditionEntities");
47
+ var _requireNode = require("./requireNode");
46
48
  /**
47
49
  * Give each condition and sort clause its field's declared type, so where and sortBy compare by it
48
50
  * (a joined entity's field is looked up on that entity's record).
@@ -68,6 +70,10 @@ const typeClauses = async (parsed, recordData) => {
68
70
  const runQuery = async parsed => {
69
71
  // Checked before anything is read: which entity each condition is on, and whether it needs per-pair evaluation
70
72
  const perPair = typeof parsed.where !== 'undefined' && (0, _conditionEntities.conditionEntities)(parsed);
73
+ // Writes and schema changes need the filesystem; say so plainly in a browser
74
+ if (['insert', 'update', 'delete', 'create', 'drop'].includes(parsed.command)) {
75
+ (0, _requireNode.requireNode)(`"${parsed.command}"`);
76
+ }
71
77
  // Schema statements act on the database, not on entries (for create there is no record to read yet)
72
78
  switch (parsed.command) {
73
79
  case 'create':
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,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 _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_getJoinIndexedList=require("./getJoinIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities");const typeClauses=async(e,t)=>{for(const r of[...(0,_conditionTree.conditionsOf)(e.where),...e.sortClauses]){let i=e.entity,s=r.property;(0,_isEntityProperty.isEntityProperty)(s)&&({entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(s)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],s)}},runQuery=async e=>{const t=void 0!==e.where&&(0,_conditionEntities.conditionEntities)(e);switch(e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}const r={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(r[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeClauses(e,r);let i={[e.entity]:[]};const s=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,r,i,s);const n=s.has(e.entity);switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,r,i)).command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where)),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n,s.has(e.joinEntity)),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where,t?e.joinEntity:void 0)),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses,Boolean(e.groupBy?.length)),i};exports.runQuery=runQuery;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.runQuery=void 0,require("core-js/modules/es.array.includes.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 _deleteEntity=require("../queries/deleteEntity"),_insertEntity=require("../queries/insertEntity"),_readEntity=require("../queries/readEntity"),_updateEntity=require("../queries/updateEntity"),_createRecord=require("../queries/createRecord"),_dropRecord=require("../queries/dropRecord"),_describeRecord=require("../queries/describeRecord"),_showRecords=require("../queries/showRecords"),_joinEntity=require("../queries/joinEntity"),_mergeJoins=require("../queries/mergeJoins"),_where=require("../queries/where"),_sortBy=require("../queries/sortBy"),_groupBy=require("../queries/groupBy"),_limitOffset=require("../queries/limitOffset"),_selectFields=require("../queries/selectFields"),_retrieveRecord=require("./retrieveRecord"),_getConditionIndexedList=require("./getConditionIndexedList"),_getJoinIndexedList=require("./getJoinIndexedList"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities"),_requireNode=require("./requireNode");const typeClauses=async(e,t)=>{for(const r of[...(0,_conditionTree.conditionsOf)(e.where),...e.sortClauses]){let i=e.entity,s=r.property;(0,_isEntityProperty.isEntityProperty)(s)&&({entity:i,property:s}=(0,_splitEntityProperty.splitEntityProperty)(s)),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=await(0,_retrieveRecord.retrieveRecord)(i)),r.type=(0,_fieldType.fieldType)(t[i],s)}},runQuery=async e=>{const t=void 0!==e.where&&(0,_conditionEntities.conditionEntities)(e);switch(["insert","update","delete","create","drop"].includes(e.command)&&(0,_requireNode.requireNode)(`"${e.command}"`),e.command){case"create":return{[e.entity]:await(0,_createRecord.createRecord)(e.entity,e.create)};case"drop":return{[e.entity]:await(0,_dropRecord.dropRecord)(e.entity,e.ifExists)};case"describe":return{[e.entity]:await(0,_describeRecord.describeRecord)(e.entity)};case"show":return{[e.entity]:await(0,_showRecords.showRecords)()}}const r={[e.entity]:await(0,_retrieveRecord.retrieveRecord)(e.entity)};void 0!==e.joinEntity&&(r[e.joinEntity]=await(0,_retrieveRecord.retrieveRecord)(e.joinEntity)),await typeClauses(e,r);let i={[e.entity]:[]};const s=new Set;e=await(0,_getConditionIndexedList.getConditionIndexedList)(e,r,i,s);const n=s.has(e.entity);switch("delete"!==(e=await(0,_getJoinIndexedList.getJoinIndexedList)(e,r,i)).command&&"update"!==e.command||(n||(i=await(0,_readEntity.readEntity)(e.entity,i)),i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where)),e.command){case"delete":i=await(0,_deleteEntity.deleteEntity)(e.entity,i);break;case"insert":i=await(0,_insertEntity.insertEntity)(e.entity,e.insertValues,i);break;case"read":n||(i=await(0,_readEntity.readEntity)(e.entity,i));break;case"update":i=await(0,_updateEntity.updateEntity)(e.entity,e.updateValues,i);break;default:throw new Error(`Unknown command: ${e.command}`)}return i=await(0,_joinEntity.joinEntity)(e.entity,e.joinEntity,i,e.joinClauses,n,s.has(e.joinEntity)),i=await(0,_mergeJoins.mergeJoins)(i,e.mergeJoins),"delete"!==e.command&&"update"!==e.command&&(i[e.entity]=(0,_where.whereTree)(i[e.entity],e.where,t?e.joinEntity:void 0)),i[e.entity]=(0,_sortBy.sortBy)(i[e.entity],e.sortClauses),i[e.entity]=(0,_groupBy.groupBy)(i[e.entity],e.groupBy),i[e.entity]=(0,_limitOffset.limitOffset)(i[e.entity],e.offset,e.limit),i[e.entity]=(0,_selectFields.selectFields)(i[e.entity],e.selectClauses,Boolean(e.groupBy?.length)),i};exports.runQuery=runQuery;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "3.1.0",
3
+ "version": "3.1.2",
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-file-db.git"
31
+ "url": "git+https://github.com/jheagle/json-fs-query.git"
32
32
  },
33
33
  "keywords": [
34
34
  "database",
@@ -39,9 +39,9 @@
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-file-db/issues"
42
+ "url": "https://github.com/jheagle/json-fs-query/issues"
43
43
  },
44
- "homepage": "https://github.com/jheagle/json-file-db#readme",
44
+ "homepage": "https://github.com/jheagle/json-fs-query#readme",
45
45
  "devDependencies": {
46
46
  "@babel/core": "^8.1.0",
47
47
  "gulp": "^5.0.1",