json-fs-query 3.2.0 → 3.3.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.
Files changed (121) hide show
  1. package/README.md +257 -15
  2. package/browser/jsonFsQuery.js +2253 -293
  3. package/browser/jsonFsQuery.min.js +1 -1
  4. package/dist/data/introspect/alter.d.ts +12 -0
  5. package/dist/data/introspect/alter.js +304 -0
  6. package/dist/data/introspect/alter.min.js +1 -0
  7. package/dist/data/introspect/create.d.ts +10 -0
  8. package/dist/data/introspect/create.js +2 -1
  9. package/dist/data/introspect/create.min.js +1 -1
  10. package/dist/data/introspect/drop.js +2 -0
  11. package/dist/data/introspect/drop.min.js +1 -1
  12. package/dist/data/introspect/formatDatabase.d.ts +17 -0
  13. package/dist/data/introspect/formatDatabase.js +56 -0
  14. package/dist/data/introspect/formatDatabase.min.js +1 -0
  15. package/dist/data/introspect/index.d.ts +9 -0
  16. package/dist/data/introspect/index.js +18 -5
  17. package/dist/data/introspect/index.min.js +1 -1
  18. package/dist/data/introspect/packDatabase.d.ts +27 -0
  19. package/dist/data/introspect/packDatabase.js +113 -0
  20. package/dist/data/introspect/packDatabase.min.js +1 -0
  21. package/dist/data/queries/databaseStatements.d.ts +31 -0
  22. package/dist/data/queries/databaseStatements.js +97 -0
  23. package/dist/data/queries/databaseStatements.min.js +1 -0
  24. package/dist/data/queries/deleteEntity.js +6 -1
  25. package/dist/data/queries/deleteEntity.min.js +1 -1
  26. package/dist/data/queries/insertEntity.d.ts +8 -0
  27. package/dist/data/queries/insertEntity.js +338 -33
  28. package/dist/data/queries/insertEntity.min.js +1 -1
  29. package/dist/data/queries/query.d.ts +2 -1
  30. package/dist/data/queries/query.js +5 -2
  31. package/dist/data/queries/query.min.js +1 -1
  32. package/dist/data/queries/selectFields.d.ts +5 -4
  33. package/dist/data/queries/selectFields.js +25 -11
  34. package/dist/data/queries/selectFields.min.js +1 -1
  35. package/dist/data/queries/updateEntity.js +39 -5
  36. package/dist/data/queries/updateEntity.min.js +1 -1
  37. package/dist/data/storage/databases.d.ts +32 -0
  38. package/dist/data/storage/databases.js +93 -0
  39. package/dist/data/storage/databases.min.js +1 -0
  40. package/dist/data/storage/fileExists.d.ts +2 -1
  41. package/dist/data/storage/fileExists.js +9 -2
  42. package/dist/data/storage/fileExists.min.js +1 -1
  43. package/dist/data/storage/index.d.ts +5 -2
  44. package/dist/data/storage/index.js +64 -1
  45. package/dist/data/storage/index.min.js +1 -1
  46. package/dist/data/storage/listFiles.d.ts +8 -0
  47. package/dist/data/storage/listFiles.js +52 -0
  48. package/dist/data/storage/listFiles.min.js +1 -0
  49. package/dist/data/storage/makeDirectory.d.ts +2 -1
  50. package/dist/data/storage/makeDirectory.js +8 -2
  51. package/dist/data/storage/makeDirectory.min.js +1 -1
  52. package/dist/data/storage/readJson.d.ts +9 -1
  53. package/dist/data/storage/readJson.js +20 -7
  54. package/dist/data/storage/readJson.min.js +1 -1
  55. package/dist/data/storage/removeDirectory.d.ts +3 -1
  56. package/dist/data/storage/removeDirectory.js +7 -1
  57. package/dist/data/storage/removeDirectory.min.js +1 -1
  58. package/dist/data/storage/removeFile.d.ts +2 -1
  59. package/dist/data/storage/removeFile.js +10 -1
  60. package/dist/data/storage/removeFile.min.js +1 -1
  61. package/dist/data/storage/storagePath.js +1 -1
  62. package/dist/data/storage/storagePath.min.js +1 -1
  63. package/dist/data/storage/writeJson.d.ts +12 -3
  64. package/dist/data/storage/writeJson.js +21 -7
  65. package/dist/data/storage/writeJson.min.js +1 -1
  66. package/dist/data/storage/writeSet.d.ts +64 -0
  67. package/dist/data/storage/writeSet.js +306 -0
  68. package/dist/data/storage/writeSet.min.js +1 -0
  69. package/dist/data/utilities/config.d.ts +37 -0
  70. package/dist/data/utilities/config.js +77 -5
  71. package/dist/data/utilities/config.min.js +1 -1
  72. package/dist/data/utilities/databaseLock.d.ts +5 -0
  73. package/dist/data/utilities/databaseLock.js +15 -3
  74. package/dist/data/utilities/databaseLock.min.js +1 -1
  75. package/dist/data/utilities/getConditionIndexedList.js +3 -4
  76. package/dist/data/utilities/getConditionIndexedList.min.js +1 -1
  77. package/dist/data/utilities/indexBuffer.d.ts +35 -0
  78. package/dist/data/utilities/indexBuffer.js +139 -0
  79. package/dist/data/utilities/indexBuffer.min.js +1 -0
  80. package/dist/data/utilities/joinBases.js +2 -10
  81. package/dist/data/utilities/joinBases.min.js +1 -1
  82. package/dist/data/utilities/knownFields.d.ts +26 -0
  83. package/dist/data/utilities/knownFields.js +128 -0
  84. package/dist/data/utilities/knownFields.min.js +1 -0
  85. package/dist/data/utilities/packedTable.d.ts +34 -0
  86. package/dist/data/utilities/packedTable.js +60 -0
  87. package/dist/data/utilities/packedTable.min.js +1 -0
  88. package/dist/data/utilities/parsers/findInsertValues.d.ts +3 -3
  89. package/dist/data/utilities/parsers/findInsertValues.js +28 -12
  90. package/dist/data/utilities/parsers/findInsertValues.min.js +1 -1
  91. package/dist/data/utilities/parsers/maskStrings.js +11 -2
  92. package/dist/data/utilities/parsers/maskStrings.min.js +1 -1
  93. package/dist/data/utilities/parsers/parseAlter.d.ts +33 -0
  94. package/dist/data/utilities/parsers/parseAlter.js +84 -0
  95. package/dist/data/utilities/parsers/parseAlter.min.js +1 -0
  96. package/dist/data/utilities/parsers/parseCreate.d.ts +14 -0
  97. package/dist/data/utilities/parsers/parseCreate.js +13 -5
  98. package/dist/data/utilities/parsers/parseCreate.min.js +1 -1
  99. package/dist/data/utilities/parsers/parseDatabaseStatement.d.ts +17 -0
  100. package/dist/data/utilities/parsers/parseDatabaseStatement.js +82 -0
  101. package/dist/data/utilities/parsers/parseDatabaseStatement.min.js +1 -0
  102. package/dist/data/utilities/parsers/parseQuery.d.ts +3 -0
  103. package/dist/data/utilities/parsers/parseQuery.js +24 -0
  104. package/dist/data/utilities/parsers/parseQuery.min.js +1 -1
  105. package/dist/data/utilities/parsers/startsQuery.js +1 -1
  106. package/dist/data/utilities/parsers/startsQuery.min.js +1 -1
  107. package/dist/data/utilities/retrieveFiles.d.ts +15 -0
  108. package/dist/data/utilities/retrieveFiles.js +48 -0
  109. package/dist/data/utilities/retrieveFiles.min.js +1 -0
  110. package/dist/data/utilities/retrieveRecord.d.ts +6 -0
  111. package/dist/data/utilities/retrieveRecord.js +24 -1
  112. package/dist/data/utilities/retrieveRecord.min.js +1 -1
  113. package/dist/data/utilities/retrieveRecords.d.ts +22 -0
  114. package/dist/data/utilities/retrieveRecords.js +60 -10
  115. package/dist/data/utilities/retrieveRecords.min.js +1 -1
  116. package/dist/data/utilities/runQuery.js +27 -2
  117. package/dist/data/utilities/runQuery.min.js +1 -1
  118. package/dist/index.d.ts +1 -1
  119. package/dist/index.js +24 -0
  120. package/dist/index.min.js +1 -1
  121. package/package.json +7 -3
@@ -20,6 +20,8 @@ var _findOffset = require("./findOffset");
20
20
  var _maskStrings = require("./maskStrings");
21
21
  var _parseCreate = require("./parseCreate");
22
22
  var _parseSchemaStatement = require("./parseSchemaStatement");
23
+ var _parseAlter = require("./parseAlter");
24
+ var _parseDatabaseStatement = require("./parseDatabaseStatement");
23
25
  var _splitClauses = require("./splitClauses");
24
26
  var _startsQuery = require("./startsQuery");
25
27
  // Each clause's own step, and what its body must start with (for the error when it doesn't)
@@ -101,6 +103,11 @@ const parseQuery = query => {
101
103
  };
102
104
  // No find* step may see inside a string or an array: each one becomes a placeholder holding its value
103
105
  query = (0, _maskStrings.maskArrays)((0, _maskStrings.maskStrings)(query));
106
+ // Statements about databases (create / drop database, use, show databases) come first: they share their first words
107
+ // with the record statements
108
+ if (_parseDatabaseStatement.databaseStatementMatch.test(query)) {
109
+ return Object.assign(parsedQuery, (0, _parseDatabaseStatement.parseDatabaseStatement)(query));
110
+ }
104
111
  // A create statement has its own shape (a bracketed list of fields and keys), so it gets its own parser
105
112
  if (_parseCreate.createMatch.test(query)) {
106
113
  const {
@@ -116,6 +123,18 @@ const parseQuery = query => {
116
123
  if (_parseSchemaStatement.schemaStatementMatch.test(query)) {
117
124
  return Object.assign(parsedQuery, (0, _parseSchemaStatement.parseSchemaStatement)(query));
118
125
  }
126
+ // So does alter: one change to a record's fields
127
+ if (_parseAlter.alterMatch.test(query)) {
128
+ const {
129
+ entity,
130
+ alter
131
+ } = (0, _parseAlter.parseAlter)(query);
132
+ return Object.assign(parsedQuery, {
133
+ command: 'alter',
134
+ entity,
135
+ alter
136
+ });
137
+ }
119
138
  // Clauses come at most once each, in a fixed order (see clauseOrder); each step reads only its own clause's body
120
139
  const split = (0, _splitClauses.splitClauses)(query);
121
140
  if (!split) {
@@ -146,6 +165,11 @@ const parseQuery = query => {
146
165
  throw leftoverError(rest, `${keyword} ${body.slice(0, body.length - rest.length).trim()}`);
147
166
  }
148
167
  }
168
+ // `on` joins the record named after the queried one: without it there's nothing to join (this used to fail later,
169
+ // reading a record with no name, as "Could not read .json")
170
+ if ((parsedQuery.joinClauses || []).length && !parsedQuery.joinEntity) {
171
+ throw new Error(`"on" needs the record to join, after the one read: ${parsedQuery.command} ${parsedQuery.entity}.<record> on ...`);
172
+ }
149
173
  return parsedQuery;
150
174
  };
151
175
  exports.parseQuery = parseQuery;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseQuery=void 0;var _findCommand=require("./findCommand"),_findInsertValues=require("./findInsertValues"),_findUpdateValues=require("./findUpdateValues"),_findJoinEntity=require("./findJoinEntity"),_findSelects=require("./findSelects"),_findConditions=require("./findConditions"),_conditionTree=require("../conditionTree"),_findJoinClauses=require("./findJoinClauses"),_findMergeJoins=require("./findMergeJoins"),_findSortClauses=require("./findSortClauses"),_findGroupBy=require("./findGroupBy"),_findLimit=require("./findLimit"),_findOffset=require("./findOffset"),_maskStrings=require("./maskStrings"),_parseCreate=require("./parseCreate"),_parseSchemaStatement=require("./parseSchemaStatement"),_splitClauses=require("./splitClauses"),_startsQuery=require("./startsQuery");const clauseSteps={values:{step:_findInsertValues.findInsertValues,expected:"an assignment (field = value)"},set:{step:_findUpdateValues.findUpdateValues,expected:"an assignment (field = value)"},select:{step:_findSelects.findSelects,expected:"a field"},on:{step:_findJoinClauses.findJoinClauses,expected:"a join condition (a.x = b.y)"},merge:{step:_findMergeJoins.findMergeJoins,expected:"a merge (a.x with b.y)"},where:{step:_findConditions.findConditions,expected:"a condition"},"group by":{step:_findGroupBy.findGroupBy,expected:"a field"},sort:{step:_findSortClauses.findSortClauses,expected:"a field"},limit:{step:_findLimit.findLimit,expected:"a whole number"},offset:{step:_findOffset.findOffset,expected:"a whole number"}},leftoverError=(e,t)=>{const i=e=>(0,_maskStrings.unmaskStrings)(e,"'");return _startsQuery.startsQueryMatch.test(e)?new Error(`Missing ; before: ${i(e)}`):new Error(`Unexpected "${i(e)}" after "${i(t)}"`)},parseQuery=e=>{const t={command:void 0,entity:void 0,joinEntity:void 0,selectClauses:[],insertValues:[],updateValues:{},where:void 0,joinClauses:[],mergeJoins:[],sortClauses:[],groupBy:void 0,limit:void 0,offset:void 0,create:void 0,ifExists:void 0};if(e=(0,_maskStrings.maskArrays)((0,_maskStrings.maskStrings)(e)),_parseCreate.createMatch.test(e)){const{entity:i,create:r}=(0,_parseCreate.parseCreate)(e);return Object.assign(t,{command:"create",entity:i,create:r})}if(_parseSchemaStatement.schemaStatementMatch.test(e))return Object.assign(t,(0,_parseSchemaStatement.parseSchemaStatement)(e));const i=(0,_splitClauses.splitClauses)(e);if(!i){if(e=e.trim(),_startsQuery.startsQueryMatch.test(e))throw new Error(`Missing ; before: ${(0,_maskStrings.unmaskStrings)(e,"'")}`);throw new Error(`Unrecognized query value: ${(0,_maskStrings.unmaskStrings)(e,"'")}`)}if((0,_findJoinEntity.findJoinEntity)(t,(0,_findCommand.findCommand)(t,i.head)),t.where=(0,_conditionTree.allOf)([]),i.leading)throw leftoverError(i.leading,i.head);for(const{keyword:e,body:r}of i.clauses){const{step:i,expected:s}=clauseSteps[e],n=i(t,r);if(n===r)throw new Error(`Missing ${s} after ${e}${r?`: ${(0,_maskStrings.unmaskStrings)(r,"'")}`:""}`);if(n)throw leftoverError(n,`${e} ${r.slice(0,r.length-n.length).trim()}`)}return t};exports.parseQuery=parseQuery;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseQuery=void 0;var _findCommand=require("./findCommand"),_findInsertValues=require("./findInsertValues"),_findUpdateValues=require("./findUpdateValues"),_findJoinEntity=require("./findJoinEntity"),_findSelects=require("./findSelects"),_findConditions=require("./findConditions"),_conditionTree=require("../conditionTree"),_findJoinClauses=require("./findJoinClauses"),_findMergeJoins=require("./findMergeJoins"),_findSortClauses=require("./findSortClauses"),_findGroupBy=require("./findGroupBy"),_findLimit=require("./findLimit"),_findOffset=require("./findOffset"),_maskStrings=require("./maskStrings"),_parseCreate=require("./parseCreate"),_parseSchemaStatement=require("./parseSchemaStatement"),_parseAlter=require("./parseAlter"),_parseDatabaseStatement=require("./parseDatabaseStatement"),_splitClauses=require("./splitClauses"),_startsQuery=require("./startsQuery");const clauseSteps={values:{step:_findInsertValues.findInsertValues,expected:"an assignment (field = value)"},set:{step:_findUpdateValues.findUpdateValues,expected:"an assignment (field = value)"},select:{step:_findSelects.findSelects,expected:"a field"},on:{step:_findJoinClauses.findJoinClauses,expected:"a join condition (a.x = b.y)"},merge:{step:_findMergeJoins.findMergeJoins,expected:"a merge (a.x with b.y)"},where:{step:_findConditions.findConditions,expected:"a condition"},"group by":{step:_findGroupBy.findGroupBy,expected:"a field"},sort:{step:_findSortClauses.findSortClauses,expected:"a field"},limit:{step:_findLimit.findLimit,expected:"a whole number"},offset:{step:_findOffset.findOffset,expected:"a whole number"}},leftoverError=(e,t)=>{const r=e=>(0,_maskStrings.unmaskStrings)(e,"'");return _startsQuery.startsQueryMatch.test(e)?new Error(`Missing ; before: ${r(e)}`):new Error(`Unexpected "${r(e)}" after "${r(t)}"`)},parseQuery=e=>{const t={command:void 0,entity:void 0,joinEntity:void 0,selectClauses:[],insertValues:[],updateValues:{},where:void 0,joinClauses:[],mergeJoins:[],sortClauses:[],groupBy:void 0,limit:void 0,offset:void 0,create:void 0,ifExists:void 0};if(e=(0,_maskStrings.maskArrays)((0,_maskStrings.maskStrings)(e)),_parseDatabaseStatement.databaseStatementMatch.test(e))return Object.assign(t,(0,_parseDatabaseStatement.parseDatabaseStatement)(e));if(_parseCreate.createMatch.test(e)){const{entity:r,create:s}=(0,_parseCreate.parseCreate)(e);return Object.assign(t,{command:"create",entity:r,create:s})}if(_parseSchemaStatement.schemaStatementMatch.test(e))return Object.assign(t,(0,_parseSchemaStatement.parseSchemaStatement)(e));if(_parseAlter.alterMatch.test(e)){const{entity:r,alter:s}=(0,_parseAlter.parseAlter)(e);return Object.assign(t,{command:"alter",entity:r,alter:s})}const r=(0,_splitClauses.splitClauses)(e);if(!r){if(e=e.trim(),_startsQuery.startsQueryMatch.test(e))throw new Error(`Missing ; before: ${(0,_maskStrings.unmaskStrings)(e,"'")}`);throw new Error(`Unrecognized query value: ${(0,_maskStrings.unmaskStrings)(e,"'")}`)}if((0,_findJoinEntity.findJoinEntity)(t,(0,_findCommand.findCommand)(t,r.head)),t.where=(0,_conditionTree.allOf)([]),r.leading)throw leftoverError(r.leading,r.head);for(const{keyword:e,body:s}of r.clauses){const{step:r,expected:i}=clauseSteps[e],n=r(t,s);if(n===s)throw new Error(`Missing ${i} after ${e}${s?`: ${(0,_maskStrings.unmaskStrings)(s,"'")}`:""}`);if(n)throw leftoverError(n,`${e} ${s.slice(0,s.length-n.length).trim()}`)}if((t.joinClauses||[]).length&&!t.joinEntity)throw new Error(`"on" needs the record to join, after the one read: ${t.command} ${t.entity}.<record> on ...`);return t};exports.parseQuery=parseQuery;
@@ -7,4 +7,4 @@ exports.startsQueryMatch = void 0;
7
7
  /**
8
8
  * Matches text that starts with a command word, for the "Missing ; before" error when a query runs on into the next.
9
9
  */
10
- const startsQueryMatch = exports.startsQueryMatch = /^\s*(create|delete|describe|drop|insert|read|show|update)(?![a-z0-9_-])/i;
10
+ const startsQueryMatch = exports.startsQueryMatch = /^\s*(alter|create|delete|describe|drop|insert|read|show|update|use)(?![a-z0-9_-])/i;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.startsQueryMatch=void 0;const startsQueryMatch=exports.startsQueryMatch=/^\s*(create|delete|describe|drop|insert|read|show|update)(?![a-z0-9_-])/i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.startsQueryMatch=void 0;const startsQueryMatch=exports.startsQueryMatch=/^\s*(alter|create|delete|describe|drop|insert|read|show|update|use)(?![a-z0-9_-])/i;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Read several files of the database at once and resolve to their contents in the order of `paths`. Up to
3
+ * `readConcurrency` reads (see configure) are in flight together: in a browser each file is an HTTP request, so a full
4
+ * read of 1,000 rows no longer waits for 1,000 requests one after another.
5
+ *
6
+ * Fails as reading them one at a time would: with the error of the first file (in `paths` order) that can't be read.
7
+ * Once a read fails no new ones start; the ones already started are awaited, so none is left running after this
8
+ * returns, and since reads start in order, every file before the first failure was read.
9
+ * @param paths - Paths inside the database, such as `users/1.json`.
10
+ * @param read - Reads one path (default retrieveFile); callers with their own error message for a missing file pass it
11
+ * here.
12
+ * @throws {Error} The error of the first file that couldn't be read.
13
+ */
14
+ export declare const retrieveFiles: (paths: string[], read?: (path: string) => Promise<any>) => Promise<any[]>;
15
+ //# sourceMappingURL=retrieveFiles.d.ts.map
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.retrieveFiles = void 0;
7
+ var _retrieveFile = require("./retrieveFile");
8
+ var _config = require("./config");
9
+ /**
10
+ * Read several files of the database at once and resolve to their contents in the order of `paths`. Up to
11
+ * `readConcurrency` reads (see configure) are in flight together: in a browser each file is an HTTP request, so a full
12
+ * read of 1,000 rows no longer waits for 1,000 requests one after another.
13
+ *
14
+ * Fails as reading them one at a time would: with the error of the first file (in `paths` order) that can't be read.
15
+ * Once a read fails no new ones start; the ones already started are awaited, so none is left running after this
16
+ * returns, and since reads start in order, every file before the first failure was read.
17
+ * @param paths - Paths inside the database, such as `users/1.json`.
18
+ * @param read - Reads one path (default retrieveFile); callers with their own error message for a missing file pass it
19
+ * here.
20
+ * @throws {Error} The error of the first file that couldn't be read.
21
+ */
22
+ const retrieveFiles = async (paths, read = _retrieveFile.retrieveFile) => {
23
+ const limit = Math.max(1, Math.floor((0, _config.getSetting)('readConcurrency', 16)) || 1);
24
+ const contents = new Array(paths.length);
25
+ const failures = [];
26
+ let next = 0;
27
+ const worker = async () => {
28
+ while (next < paths.length && !failures.length) {
29
+ const position = next++;
30
+ try {
31
+ contents[position] = await read(paths[position]);
32
+ } catch (error) {
33
+ failures.push({
34
+ position,
35
+ error
36
+ });
37
+ }
38
+ }
39
+ };
40
+ await Promise.all(Array.from({
41
+ length: Math.min(limit, paths.length)
42
+ }, worker));
43
+ if (failures.length) {
44
+ throw failures.reduce((first, failure) => failure.position < first.position ? failure : first).error;
45
+ }
46
+ return contents;
47
+ };
48
+ exports.retrieveFiles = retrieveFiles;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveFiles=void 0;var _retrieveFile=require("./retrieveFile"),_config=require("./config");const retrieveFiles=async(e,r=_retrieveFile.retrieveFile)=>{const t=Math.max(1,Math.floor((0,_config.getSetting)("readConcurrency",16))||1),i=new Array(e.length),o=[];let n=0;if(await Promise.all(Array.from({length:Math.min(t,e.length)},(async()=>{for(;n<e.length&&!o.length;){const t=n++;try{i[t]=await r(e[t])}catch(e){o.push({position:t,error:e})}}}))),o.length)throw o.reduce(((e,r)=>r.position<e.position?r:e)).error;return i};exports.retrieveFiles=retrieveFiles;
@@ -1,2 +1,8 @@
1
+ /**
2
+ * A record's definition (its fields, keys and entries), from `<entity>.json`.
3
+ * @param entity
4
+ * @throws {Error} `Record "<entity>" doesn't exist` when it doesn't (in Node, checked before reading; in a browser,
5
+ * where that can't be checked without reading, when the file can't be read).
6
+ */
1
7
  export declare const retrieveRecord: (entity?: string) => Promise<any>;
2
8
  //# sourceMappingURL=retrieveRecord.d.ts.map
@@ -1,9 +1,32 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/esnext.weak-map.delete-all.js");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.retrieveRecord = void 0;
8
+ var jsEnv = _interopRequireWildcard(require("browser-or-node"));
7
9
  var _retrieveFile = require("./retrieveFile");
8
- const retrieveRecord = async (entity = '') => await (0, _retrieveFile.retrieveFile)(`${entity}.json`);
10
+ var _recordExists = require("./recordExists");
11
+ var e;
12
+ 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; }
13
+ /**
14
+ * A record's definition (its fields, keys and entries), from `<entity>.json`.
15
+ * @param entity
16
+ * @throws {Error} `Record "<entity>" doesn't exist` when it doesn't (in Node, checked before reading; in a browser,
17
+ * where that can't be checked without reading, when the file can't be read).
18
+ */
19
+ const retrieveRecord = async (entity = '') => {
20
+ if (jsEnv.isNode && !(0, _recordExists.recordExists)(entity)) {
21
+ throw new Error(`Record "${entity}" doesn't exist`);
22
+ }
23
+ try {
24
+ return await (0, _retrieveFile.retrieveFile)(`${entity}.json`);
25
+ } catch (error) {
26
+ if (!jsEnv.isNode) {
27
+ throw new Error(`Record "${entity}" doesn't exist, or ${entity}.json can't be read`);
28
+ }
29
+ throw error;
30
+ }
31
+ };
9
32
  exports.retrieveRecord = retrieveRecord;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveRecord=void 0;var _retrieveFile=require("./retrieveFile");const retrieveRecord=async(e="")=>await(0,_retrieveFile.retrieveFile)(`${e}.json`);exports.retrieveRecord=retrieveRecord;
1
+ "use strict";require("core-js/modules/esnext.weak-map.delete-all.js"),Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveRecord=void 0;var e,jsEnv=_interopRequireWildcard(require("browser-or-node")),_retrieveFile=require("./retrieveFile"),_recordExists=require("./recordExists");function _interopRequireWildcard(r,t){if(!t&&r&&r.__esModule)return r;var o,i,s=Object.defineProperty,n={__proto__:null,default:r};if(Object(r)!==r)return n;if(e||"function"!=typeof WeakMap||(e=new WeakMap),e){if(e.has(r))return e.get(r);e.set(r,n)}for(i in r)"default"!==i&&{}.hasOwnProperty.call(r,i)&&((o=s&&Object.getOwnPropertyDescriptor(r,i))&&(o.get||o.set)?s(n,i,o):n[i]=r[i]);return n}const retrieveRecord=async(e="")=>{if(jsEnv.isNode&&!(0,_recordExists.recordExists)(e))throw new Error(`Record "${e}" doesn't exist`);try{return await(0,_retrieveFile.retrieveFile)(`${e}.json`)}catch(r){if(!jsEnv.isNode)throw new Error(`Record "${e}" doesn't exist, or ${e}.json can't be read`);throw r}};exports.retrieveRecord=retrieveRecord;
@@ -1,2 +1,24 @@
1
+ import { recordDefinition } from '../introspect/definitions/record';
2
+ /**
3
+ * Read one entry file, failing with the message a missing entry has always had.
4
+ * @param path - The entry's path inside the database, such as `users/1.json`.
5
+ */
6
+ export declare const retrieveEntry: (path: string) => Promise<any>;
7
+ /**
8
+ * The rows of some of a record's entry files, in the order of `files`. When they're more than one round of reads
9
+ * (`readConcurrency`, see retrieveFiles) and the record has a packed file that matches it (see retrievePacked), they
10
+ * come from the packed file in one read; otherwise, and for any file the packed file doesn't hold (an index can list a
11
+ * file the record doesn't), from the entry files, several at a time. So a lookup of a few rows never downloads a whole
12
+ * record, and a record of a few rows is never asked for a packed file.
13
+ * @param record
14
+ * @param files - Entry file names, such as `1.json`.
15
+ * @param read - Reads one entry file (default retrieveEntry).
16
+ */
17
+ export declare const retrieveEntryRows: (record: recordDefinition, files: string[], read?: (path: string) => Promise<any>) => Promise<any[]>;
18
+ /**
19
+ * Every row of a record, in the record's order: from its packed file when there's one that matches (see
20
+ * retrievePacked), otherwise from its entry files, several at a time (see retrieveFiles).
21
+ * @param entity
22
+ */
1
23
  export declare const retrieveRecords: (entity?: string) => Promise<any[]>;
2
24
  //# sourceMappingURL=retrieveRecords.d.ts.map
@@ -3,19 +3,69 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.retrieveRecords = void 0;
6
+ exports.retrieveRecords = exports.retrieveEntryRows = exports.retrieveEntry = 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.map.js");
10
+ require("core-js/modules/esnext.map.delete-all.js");
11
+ require("core-js/modules/esnext.map.every.js");
12
+ require("core-js/modules/esnext.map.filter.js");
13
+ require("core-js/modules/esnext.map.find.js");
14
+ require("core-js/modules/esnext.map.find-key.js");
15
+ require("core-js/modules/esnext.map.includes.js");
16
+ require("core-js/modules/esnext.map.key-of.js");
17
+ require("core-js/modules/esnext.map.map-keys.js");
18
+ require("core-js/modules/esnext.map.map-values.js");
19
+ require("core-js/modules/esnext.map.merge.js");
20
+ require("core-js/modules/esnext.map.reduce.js");
21
+ require("core-js/modules/esnext.map.some.js");
22
+ require("core-js/modules/esnext.map.update.js");
7
23
  var _retrieveFile = require("./retrieveFile");
8
24
  var _retrieveRecord = require("./retrieveRecord");
25
+ var _retrieveFiles = require("./retrieveFiles");
26
+ var _packedTable = require("./packedTable");
27
+ var _config = require("./config");
28
+ /**
29
+ * Read one entry file, failing with the message a missing entry has always had.
30
+ * @param path - The entry's path inside the database, such as `users/1.json`.
31
+ */
32
+ const retrieveEntry = async path => {
33
+ const data = await (0, _retrieveFile.retrieveFile)(path).catch(err => console.error(err));
34
+ if (!data) {
35
+ throw new Error(`Could not read entity ${path.slice(path.lastIndexOf('/') + 1)}`);
36
+ }
37
+ return data;
38
+ };
39
+ /**
40
+ * The rows of some of a record's entry files, in the order of `files`. When they're more than one round of reads
41
+ * (`readConcurrency`, see retrieveFiles) and the record has a packed file that matches it (see retrievePacked), they
42
+ * come from the packed file in one read; otherwise, and for any file the packed file doesn't hold (an index can list a
43
+ * file the record doesn't), from the entry files, several at a time. So a lookup of a few rows never downloads a whole
44
+ * record, and a record of a few rows is never asked for a packed file.
45
+ * @param record
46
+ * @param files - Entry file names, such as `1.json`.
47
+ * @param read - Reads one entry file (default retrieveEntry).
48
+ */
49
+ exports.retrieveEntry = retrieveEntry;
50
+ const retrieveEntryRows = async (record, files, read = retrieveEntry) => {
51
+ const packed = files.length > (0, _config.getSetting)('readConcurrency', 16) ? await (0, _packedTable.retrievePacked)(record) : undefined;
52
+ if (!packed) {
53
+ return (0, _retrieveFiles.retrieveFiles)(files.map(file => `${record.path}/${file}`), read);
54
+ }
55
+ const positions = new Map(packed.entries.map((entry, position) => [entry, position]));
56
+ const unpacked = files.filter(file => !positions.has(file));
57
+ const readRows = unpacked.length ? await (0, _retrieveFiles.retrieveFiles)(unpacked.map(file => `${record.path}/${file}`), read) : [];
58
+ const fromFiles = new Map(unpacked.map((file, position) => [file, readRows[position]]));
59
+ return files.map(file => positions.has(file) ? packed.rows[positions.get(file)] : fromFiles.get(file));
60
+ };
61
+ /**
62
+ * Every row of a record, in the record's order: from its packed file when there's one that matches (see
63
+ * retrievePacked), otherwise from its entry files, several at a time (see retrieveFiles).
64
+ * @param entity
65
+ */
66
+ exports.retrieveEntryRows = retrieveEntryRows;
9
67
  const retrieveRecords = async (entity = '') => {
10
68
  const recordFile = await (0, _retrieveRecord.retrieveRecord)(entity);
11
- const dataSet = [];
12
- for (const file of recordFile.entries) {
13
- const data = await (0, _retrieveFile.retrieveFile)(`${recordFile.path}/${file}`).catch(err => console.error(err));
14
- if (!data) {
15
- throw new Error(`Could not read entity ${file}`);
16
- }
17
- dataSet.push(data);
18
- }
19
- return dataSet;
69
+ return retrieveEntryRows(recordFile, recordFile.entries);
20
70
  };
21
71
  exports.retrieveRecords = retrieveRecords;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveRecords=void 0;var _retrieveFile=require("./retrieveFile"),_retrieveRecord=require("./retrieveRecord");const retrieveRecords=async(e="")=>{const r=await(0,_retrieveRecord.retrieveRecord)(e),t=[];for(const e of r.entries){const o=await(0,_retrieveFile.retrieveFile)(`${r.path}/${e}`).catch((e=>console.error(e)));if(!o)throw new Error(`Could not read entity ${e}`);t.push(o)}return t};exports.retrieveRecords=retrieveRecords;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.retrieveRecords=exports.retrieveEntryRows=exports.retrieveEntry=void 0,require("core-js/modules/esnext.iterator.constructor.js"),require("core-js/modules/esnext.iterator.filter.js"),require("core-js/modules/esnext.iterator.map.js"),require("core-js/modules/esnext.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 _retrieveFile=require("./retrieveFile"),_retrieveRecord=require("./retrieveRecord"),_retrieveFiles=require("./retrieveFiles"),_packedTable=require("./packedTable"),_config=require("./config");const retrieveEntry=async e=>{const r=await(0,_retrieveFile.retrieveFile)(e).catch((e=>console.error(e)));if(!r)throw new Error(`Could not read entity ${e.slice(e.lastIndexOf("/")+1)}`);return r};exports.retrieveEntry=retrieveEntry;const retrieveEntryRows=async(e,r,s=retrieveEntry)=>{const t=r.length>(0,_config.getSetting)("readConcurrency",16)?await(0,_packedTable.retrievePacked)(e):void 0;if(!t)return(0,_retrieveFiles.retrieveFiles)(r.map((r=>`${e.path}/${r}`)),s);const i=new Map(t.entries.map(((e,r)=>[e,r]))),o=r.filter((e=>!i.has(e))),n=o.length?await(0,_retrieveFiles.retrieveFiles)(o.map((r=>`${e.path}/${r}`)),s):[],a=new Map(o.map(((e,r)=>[e,n[r]])));return r.map((e=>i.has(e)?t.rows[i.get(e)]:a.get(e)))};exports.retrieveEntryRows=retrieveEntryRows;const retrieveRecords=async(e="")=>{const r=await(0,_retrieveRecord.retrieveRecord)(e);return retrieveEntryRows(r,r.entries)};exports.retrieveRecords=retrieveRecords;
@@ -28,6 +28,8 @@ var _updateEntity = require("../queries/updateEntity");
28
28
  var _createRecord = require("../queries/createRecord");
29
29
  var _dropRecord = require("../queries/dropRecord");
30
30
  var _describeRecord = require("../queries/describeRecord");
31
+ var _alter = require("../introspect/alter");
32
+ var _databaseStatements = require("../queries/databaseStatements");
31
33
  var _showRecords = require("../queries/showRecords");
32
34
  var _joinEntity = require("../queries/joinEntity");
33
35
  var _mergeJoins = require("../queries/mergeJoins");
@@ -44,6 +46,7 @@ var _fieldType = require("./fieldType");
44
46
  var _conditionTree = require("./conditionTree");
45
47
  var _conditionEntities = require("./conditionEntities");
46
48
  var _requireNode = require("./requireNode");
49
+ var _knownFields = require("./knownFields");
47
50
  /**
48
51
  * Give each condition and sort clause its field's declared type, so where and sortBy compare by it
49
52
  * (a joined entity's field is looked up on that entity's record).
@@ -70,7 +73,7 @@ const runQuery = async parsed => {
70
73
  // Checked before anything is read: which entity each condition is on, and whether it needs per-pair evaluation
71
74
  const perPair = typeof parsed.where !== 'undefined' && (0, _conditionEntities.conditionEntities)(parsed);
72
75
  // Writes and schema changes need the filesystem; say so plainly in a browser
73
- if (['insert', 'update', 'delete', 'create', 'drop'].includes(parsed.command)) {
76
+ if (['insert', 'update', 'delete', 'create', 'drop', 'alter'].includes(parsed.command)) {
74
77
  (0, _requireNode.requireNode)(`"${parsed.command}"`);
75
78
  }
76
79
  // Schema statements act on the database, not on entries (for create there is no record to read yet)
@@ -87,6 +90,26 @@ const runQuery = async parsed => {
87
90
  return {
88
91
  [parsed.entity]: await (0, _describeRecord.describeRecord)(parsed.entity)
89
92
  };
93
+ case 'alter':
94
+ return {
95
+ [parsed.entity]: await (0, _alter.alter)(parsed.entity, parsed.alter)
96
+ };
97
+ case 'create database':
98
+ return {
99
+ [parsed.entity]: await (0, _databaseStatements.createDatabase)(parsed.entity, parsed.ifNotExists)
100
+ };
101
+ case 'drop database':
102
+ return {
103
+ [parsed.entity]: await (0, _databaseStatements.dropDatabase)(parsed.entity, parsed.ifExists)
104
+ };
105
+ case 'use':
106
+ return {
107
+ [parsed.entity]: await (0, _databaseStatements.useDatabase)(parsed.entity)
108
+ };
109
+ case 'show databases':
110
+ return {
111
+ [parsed.entity]: await (0, _databaseStatements.showDatabases)()
112
+ };
90
113
  case 'show':
91
114
  return {
92
115
  [parsed.entity]: await (0, _showRecords.showRecords)()
@@ -98,6 +121,8 @@ const runQuery = async parsed => {
98
121
  if (typeof parsed.joinEntity !== 'undefined') {
99
122
  recordData[parsed.joinEntity] = await (0, _retrieveRecord.retrieveRecord)(parsed.joinEntity);
100
123
  }
124
+ // Every field the query names must be one its record defines: a misspelled one would otherwise match nothing
125
+ await (0, _knownFields.assertKnownFields)(parsed, recordData);
101
126
  await typeClauses(parsed, recordData);
102
127
  let dataSet = {
103
128
  [parsed.entity]: []
@@ -153,7 +178,7 @@ const runQuery = async parsed => {
153
178
  dataSet[parsed.entity] = (0, _sortBy.sortBy)(dataSet[parsed.entity], parsed.sortClauses);
154
179
  dataSet[parsed.entity] = (0, _groupBy.groupBy)(dataSet[parsed.entity], parsed.groupBy);
155
180
  dataSet[parsed.entity] = (0, _limitOffset.limitOffset)(dataSet[parsed.entity], parsed.offset, parsed.limit);
156
- dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses, Boolean(parsed.groupBy?.length));
181
+ dataSet[parsed.entity] = (0, _selectFields.selectFields)(dataSet[parsed.entity], parsed.selectClauses, Boolean(parsed.groupBy?.length), parsed.entity);
157
182
  return dataSet;
158
183
  };
159
184
  exports.runQuery = runQuery;
@@ -1 +1 @@
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"),_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.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"),_alter=require("../introspect/alter"),_databaseStatements=require("../queries/databaseStatements"),_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"),_isEntityProperty=require("./parsers/isEntityProperty"),_splitEntityProperty=require("./parsers/splitEntityProperty"),_fieldType=require("./fieldType"),_conditionTree=require("./conditionTree"),_conditionEntities=require("./conditionEntities"),_requireNode=require("./requireNode"),_knownFields=require("./knownFields");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","alter"].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"alter":return{[e.entity]:await(0,_alter.alter)(e.entity,e.alter)};case"create database":return{[e.entity]:await(0,_databaseStatements.createDatabase)(e.entity,e.ifNotExists)};case"drop database":return{[e.entity]:await(0,_databaseStatements.dropDatabase)(e.entity,e.ifExists)};case"use":return{[e.entity]:await(0,_databaseStatements.useDatabase)(e.entity)};case"show databases":return{[e.entity]:await(0,_databaseStatements.showDatabases)()};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(0,_knownFields.assertKnownFields)(e,r),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.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),e.entity),i};exports.runQuery=runQuery;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { query } from './data/queries/query';
2
2
  export { quote } from './data/queries/quote';
3
3
  export { queryStatus, QueryStatus } from './data/queries/queryStatus';
4
- export { create, drop, describe } from './data/introspect';
4
+ export { create, drop, alter, describe, formatDatabase, packDatabase, checkPacked } from './data/introspect';
5
5
  export { configure } from './data/utilities/config';
6
6
  export { fieldProperties, fieldDefinition, fieldName, keyProperties, keyDefinition, indexType, indexLocation, referenceProperties, reference, recordProperties, recordDefinition, recordPath, entityPath } from './data/introspect';
7
7
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -7,6 +7,18 @@ require("core-js/modules/esnext.iterator.drop.js");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
+ Object.defineProperty(exports, "alter", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _introspect.alter;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "checkPacked", {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _introspect.checkPacked;
20
+ }
21
+ });
10
22
  Object.defineProperty(exports, "configure", {
11
23
  enumerable: true,
12
24
  get: function () {
@@ -31,6 +43,18 @@ Object.defineProperty(exports, "drop", {
31
43
  return _introspect.drop;
32
44
  }
33
45
  });
46
+ Object.defineProperty(exports, "formatDatabase", {
47
+ enumerable: true,
48
+ get: function () {
49
+ return _introspect.formatDatabase;
50
+ }
51
+ });
52
+ Object.defineProperty(exports, "packDatabase", {
53
+ enumerable: true,
54
+ get: function () {
55
+ return _introspect.packDatabase;
56
+ }
57
+ });
34
58
  Object.defineProperty(exports, "query", {
35
59
  enumerable: true,
36
60
  get: function () {
package/dist/index.min.js CHANGED
@@ -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}),Object.defineProperty(exports,"configure",{enumerable:!0,get:function(){return _config.configure}}),Object.defineProperty(exports,"create",{enumerable:!0,get:function(){return _introspect.create}}),Object.defineProperty(exports,"describe",{enumerable:!0,get:function(){return _introspect.describe}}),Object.defineProperty(exports,"drop",{enumerable:!0,get:function(){return _introspect.drop}}),Object.defineProperty(exports,"query",{enumerable:!0,get:function(){return _query.query}}),Object.defineProperty(exports,"queryStatus",{enumerable:!0,get:function(){return _queryStatus.queryStatus}}),Object.defineProperty(exports,"quote",{enumerable:!0,get:function(){return _quote.quote}});var _query=require("./data/queries/query"),_quote=require("./data/queries/quote"),_queryStatus=require("./data/queries/queryStatus"),_introspect=require("./data/introspect"),_config=require("./data/utilities/config");
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}),Object.defineProperty(exports,"alter",{enumerable:!0,get:function(){return _introspect.alter}}),Object.defineProperty(exports,"checkPacked",{enumerable:!0,get:function(){return _introspect.checkPacked}}),Object.defineProperty(exports,"configure",{enumerable:!0,get:function(){return _config.configure}}),Object.defineProperty(exports,"create",{enumerable:!0,get:function(){return _introspect.create}}),Object.defineProperty(exports,"describe",{enumerable:!0,get:function(){return _introspect.describe}}),Object.defineProperty(exports,"drop",{enumerable:!0,get:function(){return _introspect.drop}}),Object.defineProperty(exports,"formatDatabase",{enumerable:!0,get:function(){return _introspect.formatDatabase}}),Object.defineProperty(exports,"packDatabase",{enumerable:!0,get:function(){return _introspect.packDatabase}}),Object.defineProperty(exports,"query",{enumerable:!0,get:function(){return _query.query}}),Object.defineProperty(exports,"queryStatus",{enumerable:!0,get:function(){return _queryStatus.queryStatus}}),Object.defineProperty(exports,"quote",{enumerable:!0,get:function(){return _quote.quote}});var _query=require("./data/queries/query"),_quote=require("./data/queries/quote"),_queryStatus=require("./data/queries/queryStatus"),_introspect=require("./data/introspect"),_config=require("./data/utilities/config");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "json-fs-query",
3
- "version": "3.2.0",
4
- "description": "Use json files to manage and read data.",
3
+ "version": "3.3.0",
4
+ "description": "A git-native JSON data store for static sites: JSON files with a schema, enforced keys and a SQL-like query language, read straight from static hosting.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "unpkg": "browser/jsonFsQuery.min.js",
@@ -35,7 +35,11 @@
35
35
  "database",
36
36
  "filesystem",
37
37
  "json",
38
- "data"
38
+ "data",
39
+ "static-site",
40
+ "git",
41
+ "query",
42
+ "sql"
39
43
  ],
40
44
  "author": "Joshua Heagle <joshuaheagle@gmail.com>",
41
45
  "license": "GPL-3.0-or-later",