json-fs-query 3.3.0 → 3.4.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 +15 -3
- package/browser/jsonFsQuery.js +781 -3849
- package/browser/jsonFsQuery.min.js +1 -1
- package/dist/data/introspect/alter.js +0 -5
- package/dist/data/introspect/alter.min.js +1 -1
- package/dist/data/introspect/create.js +6 -5
- 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/drop.js +0 -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 +6 -37
- 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/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.d.ts +12 -0
- package/dist/data/utilities/reconcileJoin.js +28 -12
- 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 +4 -4
|
@@ -6,11 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.alter = void 0;
|
|
7
7
|
require("core-js/modules/es.array.includes.js");
|
|
8
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
9
|
var _field = require("./definitions/field");
|
|
15
10
|
var _create = require("./create");
|
|
16
11
|
var _parseCreate = require("../utilities/parsers/parseCreate");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.alter=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.alter=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js");var _field=require("./definitions/field"),_create=require("./create"),_parseCreate=require("../utilities/parsers/parseCreate"),_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,i)=>({fileName:e.entries[i],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 i=[];for(const r of await(0,_showRecords.showRecords)()){const a=await(0,_retrieveRecord.retrieveRecord)(r);for(const n of a.keys)"foreign"===n.type&&(n.references||[]).some((i=>i.fields.includes(`${e}.${t}`)))&&i.push({entity:r,record:a,key:n})}return i},writeRecord=async(e,t)=>{(0,_create.assertValidDefinition)(e,t),await(0,_storage.writeJson)(`${e}.json`,t)},setField=async(e,t,i,r,a)=>{if(i.length)if(await(0,_packedTable.discardPacked)(t.path),keysUsing(t,r).length&&"function"!=typeof a){if(!t.keys.some((e=>"primary"===e.type)))throw new Error(`Can't change "${r}" 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,{[r]:void 0===a?null:a},{[e]:i.map((e=>e.data))})}else for(const e of i){const i=Object.assign({},e.data),n="function"==typeof a?a(e):a;void 0===n?delete i[r]:i[r]=n,await(0,_storage.writeJson)(`${t.path}/${e.fileName}`,i)}},addField=async(e,t,i)=>{if(t.definition.some((e=>e.name===i.name)))throw new Error(`Field "${i.name}" already exists on ${e}`);const r={...t,definition:[...t.definition,i]},a=await rowsOf(t);for(const t of a.filter((e=>has(e.data,i.name))))try{(0,_typeCheck.typeCheck)(i.type,t.data[i.name],i.nullable)}catch(r){throw new Error(`Can't add "${i.name}" to ${e}: row ${t.fileName} already holds a value for it that doesn't fit (${r.message})`)}const n=a.filter((e=>!has(e.data,i.name))),o=has(i,"default");if(n.length&&!i.optional&&!o&&!i.autoGenerate)throw new Error(`Can't add required field "${i.name}" to ${e}: its ${n.length} row(s) have no value for it (give it a default, or make it optional)`);return await writeRecord(e,r),i.autoGenerate?await setField(e,r,n,i.name,(()=>crypto.randomUUID())):o&&await setField(e,r,n,i.name,i.default),r},dropField=async(e,t,i)=>{(0,_knownFields.assertFieldsDefined)(e,t,[i],"alter");const r=keysUsing(t,i)[0];if(r)throw new Error(`Can't drop "${i}" from ${e}: its ${describeKey(r)} uses it`);const a=(await referencesTo(e,i))[0];if(a)throw new Error(`Can't drop "${i}" from ${e}: ${a.entity}'s foreign key "${a.key.fields[0]}" references it`);const n={...t,definition:t.definition.filter((e=>e.name!==i))};return await writeRecord(e,n),await setField(e,n,(await rowsOf(t)).filter((e=>has(e.data,i))),i,void 0),n},renameField=async(e,t,i,r)=>{if((0,_knownFields.assertFieldsDefined)(e,t,[i],"alter"),t.definition.some((e=>e.name===r)))throw new Error(`Can't rename "${i}" on ${e} to "${r}": a field of that name already exists`);const a=await referencesTo(e,i),n=t.keys.map((e=>{if(!e.fields.includes(i))return e;const t=e.fields.map((e=>e===i?r:e)),a=e.lookup&&e.lookup===(0,_parseCreate.keyLookup)(e.type,e.fields)?(0,_parseCreate.keyLookup)(e.type,t):e.lookup;return{...e,fields:t,lookup:a}})),o=t=>"foreign"!==t.type?t:{...t,references:(t.references||[]).map((t=>({...t,fields:t.fields.map((t=>t===`${e}.${i}`?`${e}.${r}`:t))})))},s={...t,definition:t.definition.map((e=>e.name===i?{...e,name:r}:e)),keys:n.map(o)};for(const[e,i]of t.keys.entries()){const r=n[e].lookup;i.lookup&&r!==i.lookup&&(0,_storage.fileExists)(`__indexes/${t.path}/${i.lookup}`)&&(await(0,_storage.writeJson)(`__indexes/${t.path}/${r}`,await(0,_storage.readJson)(`__indexes/${t.path}/${i.lookup}`)),await(0,_storage.removeFile)(`__indexes/${t.path}/${i.lookup}`))}await writeRecord(e,s);for(const t of a.filter((t=>t.entity!==e)))await(0,_storage.writeJson)(`${t.entity}.json`,{...t.record,keys:t.record.keys.map(o)});const d=(await rowsOf(t)).filter((e=>has(e.data,i)));d.length&&await(0,_packedTable.discardPacked)(t.path);for(const e of d){const a=Object.assign({},e.data);a[r]=a[i],delete a[i],await(0,_storage.writeJson)(`${t.path}/${e.fileName}`,a)}return s},modifyField=async(e,t,i)=>{(0,_knownFields.assertFieldsDefined)(e,t,[i.name],"alter");const r=t.definition.find((e=>e.name===i.name));if(r.type!==i.type)throw new Error(`Can't change the type of "${i.name}" on ${e} (${r.type} to ${i.type}): only optional, null and default can change`);if(Boolean(r.autoGenerate)!==Boolean(i.autoGenerate))throw new Error(`Can't change whether "${i.name}" on ${e} is auto: only optional, null and default can change`);const a={...t,definition:t.definition.map((e=>e.name===i.name?i:e))},n=await rowsOf(t),o=has(i,"default"),s=i.nullable?[]:n.filter((e=>null===e.data[i.name])),d=i.optional?[]:n.filter((e=>!has(e.data,i.name))),l=i.optional?[]:s;if((d.length||l.length)&&!o)throw d.length?new Error(`Can't make "${i.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 "${i.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,a),o&&await setField(e,a,[...d,...l],i.name,i.default),i.optional&&s.length&&await setField(e,a,s,i.name,void 0),a},alter=async(e,t)=>{if((0,_requireNode.requireNode)("alter"),"__RECORDS"===e)throw new Error("__RECORDS is reserved for the list of records");const i=[e,..."field"in t?[t.field?.name]:[],..."name"in t?[t.name]:[],..."to"in t?[t.to]:[]],r=i.findIndex((e=>"string"!=typeof e||!_parseCreate.nameMatch.test(e)));if(-1!==r)throw new Error(`Invalid name ${JSON.stringify(i[r])??"undefined"} in alter: names use letters, digits, _ and - only`);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,6 @@ 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("core-js/modules/esnext.iterator.constructor.js");
|
|
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");
|
|
12
8
|
var _record = require("./definitions/record");
|
|
13
9
|
var _registerRecord = require("../utilities/registerRecord");
|
|
14
10
|
var _storage = require("../storage");
|
|
@@ -62,9 +58,14 @@ const assertValidDefinition = (recordName, recordContent) => {
|
|
|
62
58
|
}
|
|
63
59
|
const primaryKey = recordContent.keys.find(key => key.type === 'primary');
|
|
64
60
|
for (const fieldName of primaryKey ? primaryKey.fields : []) {
|
|
65
|
-
|
|
61
|
+
const field = recordContent.definition.find(defined => defined.name === fieldName);
|
|
62
|
+
if (field && field.nullable) {
|
|
66
63
|
throw new Error(`Primary key field "${fieldName}" of ${recordName} can't be nullable`);
|
|
67
64
|
}
|
|
65
|
+
// A row without its primary key can't be stored (its file is named by it): an auto field always gets a value
|
|
66
|
+
if (field && field.optional && !field.autoGenerate) {
|
|
67
|
+
throw new Error(`Primary key field "${fieldName}" of ${recordName} can't be optional`);
|
|
68
|
+
}
|
|
68
69
|
}
|
|
69
70
|
};
|
|
70
71
|
/**
|
|
@@ -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 _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 o of r)for(const r of Object.keys(o))if(!knownKeyProperties.includes(r))throw new Error(`Unknown property "${r}" on ${o.type??"index"} key of ${e}; must be ${knownKeyProperties.join(", ")}`)},assertValidDefinition=(e,r)=>{for(const o of r.definition)if(Object.prototype.hasOwnProperty.call(o,"default"))try{(0,_typeCheck.typeCheck)(o.type,o.default,o.nullable)}catch(r){throw new Error(`Invalid default for field "${o.name}" of ${e}: ${r.message}`)}for(const o of r.keys){if(o.fields.length<1)throw new Error(`The ${o.type} key of ${e} must have at least one field`);for(const t of o.fields)if(!r.definition.some((e=>e.name===t)))throw new Error(`The ${o.type} key of ${e} names field "${t}", which isn't in the definition`)}const o=r.keys.find((e=>"primary"===e.type));for(const t of o?o.fields:[]){const o=r.definition.find((e=>e.name===t));if(o&&o.nullable)throw new Error(`Primary key field "${t}" of ${e} can't be nullable`);if(o&&o.optional&&!o.autoGenerate)throw new Error(`Primary key field "${t}" of ${e} can't be optional`)}};exports.assertValidDefinition=assertValidDefinition;const create=async(e,r=[],o=[])=>{if((0,_requireNode.requireNode)("create()"),"__RECORDS"===e)return null;if((0,_storage.fileExists)(`${e}.json`))return null;assertKnownKeyProperties(e,o);const t=(0,_record.record)({path:e,definition:r,keys:o});assertValidDefinition(e,t),await(0,_storage.makeDirectory)(),await(0,_storage.writeJson)(`${e}.json`,t),await(0,_storage.makeDirectory)(e);const i=t.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),t};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;
|
|
@@ -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.drop=void 0;var _retrieveFile=require("../utilities/retrieveFile"),_deregisterRecord=require("../utilities/deregisterRecord"),_requireNode=require("../utilities/requireNode"),_storage=require("../storage"),_packedTable=require("../utilities/packedTable");const drop=async e=>{if((0,_requireNode.requireNode)("drop()"),"__RECORDS"===e)return null;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;
|
|
@@ -6,41 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.insertEntity = void 0;
|
|
7
7
|
require("core-js/modules/es.array.includes.js");
|
|
8
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.every.js");
|
|
11
|
-
require("core-js/modules/esnext.iterator.find.js");
|
|
12
|
-
require("core-js/modules/esnext.iterator.for-each.js");
|
|
13
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
14
|
-
require("core-js/modules/esnext.iterator.some.js");
|
|
15
|
-
require("core-js/modules/esnext.map.delete-all.js");
|
|
16
|
-
require("core-js/modules/esnext.map.every.js");
|
|
17
|
-
require("core-js/modules/esnext.map.filter.js");
|
|
18
|
-
require("core-js/modules/esnext.map.find.js");
|
|
19
|
-
require("core-js/modules/esnext.map.find-key.js");
|
|
20
|
-
require("core-js/modules/esnext.map.includes.js");
|
|
21
|
-
require("core-js/modules/esnext.map.key-of.js");
|
|
22
|
-
require("core-js/modules/esnext.map.map-keys.js");
|
|
23
|
-
require("core-js/modules/esnext.map.map-values.js");
|
|
24
|
-
require("core-js/modules/esnext.map.merge.js");
|
|
25
|
-
require("core-js/modules/esnext.map.reduce.js");
|
|
26
|
-
require("core-js/modules/esnext.map.some.js");
|
|
27
|
-
require("core-js/modules/esnext.map.update.js");
|
|
28
|
-
require("core-js/modules/esnext.set.add-all.js");
|
|
29
|
-
require("core-js/modules/esnext.set.delete-all.js");
|
|
30
|
-
require("core-js/modules/esnext.set.difference.js");
|
|
31
|
-
require("core-js/modules/esnext.set.every.js");
|
|
32
|
-
require("core-js/modules/esnext.set.filter.js");
|
|
33
|
-
require("core-js/modules/esnext.set.find.js");
|
|
34
|
-
require("core-js/modules/esnext.set.intersection.js");
|
|
35
|
-
require("core-js/modules/esnext.set.is-disjoint-from.js");
|
|
36
|
-
require("core-js/modules/esnext.set.is-subset-of.js");
|
|
37
|
-
require("core-js/modules/esnext.set.is-superset-of.js");
|
|
38
|
-
require("core-js/modules/esnext.set.join.js");
|
|
39
|
-
require("core-js/modules/esnext.set.map.js");
|
|
40
|
-
require("core-js/modules/esnext.set.reduce.js");
|
|
41
|
-
require("core-js/modules/esnext.set.some.js");
|
|
42
|
-
require("core-js/modules/esnext.set.symmetric-difference.js");
|
|
43
|
-
require("core-js/modules/esnext.set.union.js");
|
|
44
9
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
45
10
|
var _keyUnique = require("../introspect/policies/keyUnique");
|
|
46
11
|
var _useDefault = require("../introspect/policies/useDefault");
|
|
@@ -312,7 +277,7 @@ const generateKey = async (statement, field) => {
|
|
|
312
277
|
};
|
|
313
278
|
/**
|
|
314
279
|
* Build one entity's stored values from the raw input values, generating any autoGenerate
|
|
315
|
-
*
|
|
280
|
+
* field the row leaves out (a value given for one is kept) and applying field defaults, then throw if a required field still has no value. A null
|
|
316
281
|
* in an optional field that isn't nullable means the same as leaving it out (the field can't
|
|
317
282
|
* hold null, so nothing is lost): it isn't stored, and a default fills it in as for a field left out.
|
|
318
283
|
* @param statement
|
|
@@ -326,7 +291,11 @@ const buildEntityValues = async (statement, rowValues = {}) => {
|
|
|
326
291
|
value = undefined;
|
|
327
292
|
}
|
|
328
293
|
if (field.autoGenerate) {
|
|
329
|
-
value
|
|
294
|
+
// As MySQL does with AUTO_INCREMENT, a value given for the field is kept (the key checks still apply), and only
|
|
295
|
+
// a row that leaves it out, or gives null, gets a new one
|
|
296
|
+
if (value === undefined || value === null) {
|
|
297
|
+
value = await generateKey(statement, field.name);
|
|
298
|
+
}
|
|
330
299
|
} else if (Object.prototype.hasOwnProperty.call(field, 'default')) {
|
|
331
300
|
value = (0, _useDefault.useDefault)(field['default'], value);
|
|
332
301
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.insertEntity=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js")
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.insertEntity=void 0,require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.json.stringify.js");var _retrieveRecord=require("../utilities/retrieveRecord"),_keyUnique=require("../introspect/policies/keyUnique"),_useDefault=require("../introspect/policies/useDefault"),_typeCheck=require("../introspect/policies/typeCheck"),_foreignKeyExists=require("../introspect/policies/foreignKeyExists"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty"),_computeKeyValue=require("../utilities/computeKeyValue"),_fieldType=require("../utilities/fieldType"),_compareAs=require("../utilities/compareAs"),_retrieveRecords=require("../utilities/retrieveRecords"),_isSingleFieldKey=require("../utilities/isSingleFieldKey"),_indexBuffer=require("../utilities/indexBuffer"),_storage=require("../storage"),_packedTable=require("../utilities/packedTable"),_knownFields=require("../utilities/knownFields");class RowValues{constructor(e,t){this.seen=new Set,this.fields=t,this.types=t.map((t=>(0,_fieldType.fieldType)(e,t)))}static usable(e,t){return t.every((t=>_compareAs.comparableTypes.includes((0,_fieldType.fieldType)(e,t))))}keyOf(e){const t=[];for(let i=0;i<this.fields.length;i++){const s=e[this.fields[i]];if(null==s)return;const r=(0,_compareAs.compareAs)(this.types[i],s);if("object"==typeof r)return;t.push([typeof r,r])}return JSON.stringify(t)}add(e){const t=this.keyOf(e);void 0!==t&&this.seen.add(t)}has(e){const t=this.keyOf(e);return void 0!==t&&this.seen.has(t)}}class InsertStatement{constructor(e,t){this.rows=[],this.buffers=new Map,this.unreadable=new Set,this.otherLookups=new Map,this.scans=new Map,this.entity=e,this.record=t,this.hadEntries=(t.entries||[]).length>0}async load(){for(const e of this.record.keys){if(!e.lookup)continue;let t=[];try{t=await(0,_storage.readJson)(`__indexes/${this.record.path}/${e.lookup}`)}catch(t){this.unreadable.add(e)}this.buffers.set(e,new _indexBuffer.IndexBuffer(Array.isArray(t)?t:[],(0,_fieldType.keyValueType)(this.record,e)))}}ownLookup(e){const t=this.record.keys.find((t=>(0,_isSingleFieldKey.isSingleFieldKey)(t,e)&&t.lookup));if(!t||this.unreadable.has(t))return()=>{};const i=this.buffers.get(t);return e=>(this.hadEntries||this.rows.length>0)&&i.has(e)}otherLookup(e,t){const i=`${e}\0${t}`;return this.otherLookups.has(i)||this.otherLookups.set(i,(async()=>{const i=await(0,_retrieveRecord.retrieveRecord)(e),s=i.keys.find((e=>(0,_isSingleFieldKey.isSingleFieldKey)(e,t)&&e.lookup));if(!s)return()=>{};if(!(i.entries||[]).length)return()=>!1;let r;try{r=await(0,_storage.readJson)(`__indexes/${i.path}/${s.lookup}`)}catch(e){return()=>{}}const n=new _indexBuffer.IndexBuffer(Array.isArray(r)?r:[],(0,_fieldType.fieldType)(i,t));return e=>n.has(e)})()),this.otherLookups.get(i)}scan(e,t){const i=`${e}\0${t.join("\0")}`;return this.scans.has(i)||this.scans.set(i,(async()=>{const i=e===this.entity?this.record:await(0,_retrieveRecord.retrieveRecord)(e);if(!RowValues.usable(i,t))return;const s=new RowValues(i,t);for(const t of await(0,_retrieveRecords.retrieveRecords)(e))s.add(t);return e===this.entity&&this.rows.forEach((e=>s.add(e))),s})()),this.scans.get(i)}claimed(e,t){return this.rows.some((i=>e.every((e=>null!==i[e]&&void 0!==i[e]&&(0,_compareAs.sameValue)((0,_fieldType.fieldType)(this.record,e),i[e],t[e])))))}async isUnique(e,t){if(1===e.length){const i=this.ownLookup(e[0])(t[e[0]]);if(void 0!==i)return!i}const i=await this.scan(this.entity,e);return i?!i.has(t):await(0,_keyUnique.keyUnique)(this.entity,e,e.map((e=>t[e])))&&!this.claimed(e,t)}async exists(e,t,i){const s=e===this.entity,r=s?this.ownLookup(t)(i):(await this.otherLookup(e,t))(i);if(void 0!==r)return r;const n=await this.scan(e,[t]);return n?n.has({[t]:i}):await(0,_foreignKeyExists.foreignKeyExists)(e,t,i)||s&&this.claimed([t],{[t]:i})}async add(e,t){this.rows.push(e);for(const[t,i]of this.scans)t.startsWith(`${this.entity}\0`)&&(await i)?.add(e);this.record.entries.push(t);for(const[i,s]of this.buffers)s.add((0,_computeKeyValue.computeKeyValue)(i.fields,e),t)}async write(){await(0,_storage.writeJson)(`${this.record.path}.json`,this.record),this.buffers.size&&await(0,_storage.makeDirectory)(`__indexes/${this.record.path}`);for(const[e,t]of this.buffers)await(0,_storage.writeJson)(`__indexes/${this.record.path}/${e.lookup}`,t.entries)}}const generateKey=async(e,t)=>{let i;do{i=crypto.randomUUID()}while(!await e.isUnique([t],{[t]:i}));return i},buildEntityValues=async(e,t={})=>{const i={};for(const s of e.record.definition){let r=t[s.name];if(null===r&&s.optional&&!s.nullable&&(r=void 0),s.autoGenerate?null==r&&(r=await generateKey(e,s.name)):Object.prototype.hasOwnProperty.call(s,"default")&&(r=(0,_useDefault.useDefault)(s.default,r)),void 0!==r)i[s.name]=(0,_typeCheck.typeCheck)(s.type,r,s.nullable);else if(!s.optional)throw new Error(`Missing required field "${s.name}" for ${e.entity}`)}return i},assertUnique=async(e,t)=>{for(const i of e.record.keys)if(!("primary"!==i.type&&"unique"!==i.type||i.fields.some((e=>null===t[e]))||await e.isUnique(i.fields,t)))throw new Error(`Duplicate value for ${i.type} key "${i.fields.join(", ")}" on ${e.entity}`)},assertForeignKeys=async(e,t)=>{for(const i of e.record.keys){if("foreign"!==i.type||1!==i.fields.length||!i.references||1!==i.references.length)continue;const s=i.fields[0];if(!Object.prototype.hasOwnProperty.call(t,s)||null===t[s])continue;const{entity:r,property:n}=(0,_splitEntityProperty.splitEntityProperty)(i.references[0].fields[0]);if(!await e.exists(r,n,t[s]))throw new Error(`Foreign key "${s}" on ${e.entity} references a nonexistent ${r}.${n} = ${t[s]}`)}},insertEntity=async(e="",t=[],i={})=>{const s=await(0,_retrieveRecord.retrieveRecord)(e),r=s.keys.find((e=>"primary"===e.type&&1===e.fields.length));if(Object.prototype.hasOwnProperty.call(i,e)||(i[e]=[]),await(0,_storage.makeDirectory)(s.path),!t.length)return i;for(const i of t)(0,_knownFields.assertFieldsDefined)(e,s,Object.keys(i||{}),"insert");await(0,_packedTable.discardPacked)(s.path);const n=new InsertStatement(e,s);await n.load();for(const o of t){const t=await buildEntityValues(n,o);await assertUnique(n,t),await assertForeignKeys(n,t);const a=`${r?t[r.fields[0]]:crypto.randomUUID()}.json`;await(0,_storage.writeJson)(`${s.path}/${a}`,t),await n.add(t,a),i[e].push(t)}return await n.write(),i};exports.insertEntity=insertEntity;
|
|
@@ -4,21 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.joinEntity = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
|
-
require("core-js/modules/esnext.map.delete-all.js");
|
|
10
|
-
require("core-js/modules/esnext.map.every.js");
|
|
11
|
-
require("core-js/modules/esnext.map.filter.js");
|
|
12
|
-
require("core-js/modules/esnext.map.find.js");
|
|
13
|
-
require("core-js/modules/esnext.map.find-key.js");
|
|
14
|
-
require("core-js/modules/esnext.map.includes.js");
|
|
15
|
-
require("core-js/modules/esnext.map.key-of.js");
|
|
16
|
-
require("core-js/modules/esnext.map.map-keys.js");
|
|
17
|
-
require("core-js/modules/esnext.map.map-values.js");
|
|
18
|
-
require("core-js/modules/esnext.map.merge.js");
|
|
19
|
-
require("core-js/modules/esnext.map.reduce.js");
|
|
20
|
-
require("core-js/modules/esnext.map.some.js");
|
|
21
|
-
require("core-js/modules/esnext.map.update.js");
|
|
22
7
|
var _readEntity = require("./readEntity");
|
|
23
8
|
var _retrieveRecord = require("../utilities/retrieveRecord");
|
|
24
9
|
var _splitEntityProperty = require("../utilities/parsers/splitEntityProperty");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinEntity=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.joinEntity=void 0;var _readEntity=require("./readEntity"),_retrieveRecord=require("../utilities/retrieveRecord"),_splitEntityProperty=require("../utilities/parsers/splitEntityProperty"),_fieldType=require("../utilities/fieldType"),_semiJoin=require("../utilities/semiJoin"),_joinBases=require("../utilities/joinBases");const joinSteps=async t=>{const e=[];for(const{propertyA:r,comparator:i,propertyB:o}of t){const{entity:t,property:n}=(0,_splitEntityProperty.splitEntityProperty)(r),{entity:s,property:p}=(0,_splitEntityProperty.splitEntityProperty)(o);e.push({entityA:t,propertyA:n,typeA:(0,_fieldType.fieldType)(await(0,_retrieveRecord.retrieveRecord)(t),n),comparator:i,entityB:s,propertyB:p,typeB:(0,_fieldType.fieldType)(await(0,_retrieveRecord.retrieveRecord)(s),p)})}return e},joinedRows=t=>t.map((t=>structuredClone(t))),joinEntity=async(t,e,r={},i=[],o=!1,n=!1)=>{if(o||(r=await(0,_readEntity.readEntity)(t,r)),!i.length)return r;const s=await joinSteps(i);if(!r[t].length)return r;const p=await(0,_joinBases.joinBases)(t,e,r,s,n);for(const i of r[t]){const r=new Map(p);r.set(t,{rows:[i]});for(const t of s)r.set(t.entityA,{rows:(0,_semiJoin.semiJoin)(r.get(t.entityA),r.get(t.entityB),t.propertyA,t.propertyB,t.comparator,t.typeA)}),r.set(t.entityB,{rows:(0,_semiJoin.semiJoin)(r.get(t.entityB),r.get(t.entityA),t.propertyB,t.propertyA,t.comparator,t.typeB)});i[e]=joinedRows(r.get(e).rows)}return r};exports.joinEntity=joinEntity;
|
|
@@ -4,8 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.parser = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
7
|
var _splitQueries = require("../utilities/parsers/splitQueries");
|
|
10
8
|
var _parseQuery = require("../utilities/parsers/parseQuery");
|
|
11
9
|
const parser = (queries = '') => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parser=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parser=void 0;var _splitQueries=require("../utilities/parsers/splitQueries"),_parseQuery=require("../utilities/parsers/parseQuery");const parser=(e="")=>{const r=(0,_splitQueries.splitQueries)(e);return r.map(((e,s)=>{try{return(0,_parseQuery.parseQuery)(e)}catch(t){const i=r.length>1?` query ${s+1} of ${r.length}`:"";throw new Error(`Failed to interpret${i}: ${e} (${t.message})`)}}))};exports.parser=parser;
|
|
@@ -4,9 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.selectFields = void 0;
|
|
7
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
|
-
require("core-js/modules/esnext.iterator.reduce.js");
|
|
10
7
|
/**
|
|
11
8
|
* The value a select name picks from a row: the row's own key (a field, a merged record's `<record>.<field>`, or a
|
|
12
9
|
* joined record's rows), or for `<queried record>.<field>`, the row's own field.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.selectFields=void 0
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.selectFields=void 0;const pick=(e,s,p)=>Object.prototype.hasOwnProperty.call(e,s)||void 0===p||!s.startsWith(`${p}.`)?e[s]:e[s.slice(p.length+1)],shapeRow=(e,s,p)=>s.reduce(((s,{property:o,alias:t})=>(s[t||o]=pick(e,o,p),s)),{}),shapeGroup=(e,s,p)=>e.groups?{...e,groups:e.groups.map((e=>shapeGroup(e,s,p)))}:{...e,rows:e.rows.map((e=>shapeRow(e,s,p)))},selectFields=(e=[],s=[],p=!1,o)=>s.length?p?e.map((e=>shapeGroup(e,s,o))):e.map((e=>shapeRow(e,s,o))):e;exports.selectFields=selectFields;
|