corebasic 1.0.178 → 1.0.180

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/libs/dip.js CHANGED
@@ -2,6 +2,7 @@ import * as Elabase from './elabase.js'
2
2
 
3
3
  export const start = Elabase.start
4
4
 
5
+ export const operation = Elabase.operation
5
6
  export const insert = Elabase.insert
6
7
  export const query = Elabase.query
7
8
  export const update = Elabase.update
package/libs/elabase.js CHANGED
@@ -55,34 +55,38 @@ export function start(dbName) {
55
55
  }
56
56
 
57
57
 
58
- let isTransaction = false
59
- let transactions = []
60
- let stats = false
58
+ let isBranch = false
59
+ let batches = []
61
60
 
62
- export function transactionBegin() {
63
- isTransaction = true
64
- transactions = []
61
+ export function batchBegin() {
62
+ isBranch = true
63
+ batches = []
65
64
  }
66
- export function transactionAbort() {
67
- isTransaction = false
68
- transactions = []
65
+ export function batchAbort() {
66
+ isBranch = false
67
+ batches = []
69
68
  }
70
- export function transactionReset() {
71
- transactionAbort()
69
+ export function batchReset() {
70
+ batchAbort()
72
71
  }
73
- export function transactionCommit(arg) {
74
- let txns = transactions
75
- let mode = transactions.some(txn => txn.insert || txn.update || txn.delete) ? "command" : "query"
76
- isTransaction = false
77
- transactions = []
72
+ export function batchSubmit(arg) {
73
+ let txns = batches
74
+ let mode = batches.some(txn => txn.insert || txn.update || txn.delete) ? "command" : "query"
75
+ isBranch = false
76
+ batches = []
78
77
  return new Promise((resolve, reject) => resolve())
79
- .then(() => execute({ "transaction": txns, mode, stats: arg?.stats ?? false, version: arg?.version, compression: arg?.compression, size: arg?.size }))
78
+ .then(() => execute({ "batch": txns, mode, version: arg?.version, compression: arg?.compression }))
80
79
  .then (result => {
81
- Events.send("Elabase.transactionCommit", { response: result })
80
+ Events.send("Elabase.batchSubmit", { response: result })
82
81
  return result
83
82
  })
84
83
  }
85
84
 
85
+ export const operation = async (name, extras) => {
86
+ return execute({ operation: name, ...extras })
87
+ }
88
+
89
+
86
90
  export const insert = async (meta, collection, value, _id, extras) => {
87
91
  if (typeof collection !== "string") throw {message: "Error: collection type is not string in Dip.insert()"}
88
92
  // Multi Company Support
@@ -111,8 +115,8 @@ export const insert = async (meta, collection, value, _id, extras) => {
111
115
  throw {message: "Error: invalid _id in Dip.insert()"}
112
116
 
113
117
 
114
- if (isTransaction) {
115
- transactions.push(arg)
118
+ if (isBranch) {
119
+ batches.push(arg)
116
120
  return
117
121
  }
118
122
  arg.mode = "command"
@@ -146,8 +150,8 @@ export const query = async (meta, collection, query, options, extras) => {
146
150
  ...(meta.DIP_DB ? {db: meta.DIP_DB} : {}),
147
151
  }
148
152
  arg = Object.assign(arg, extras)
149
- if (isTransaction) {
150
- transactions.push(arg)
153
+ if (isBranch) {
154
+ batches.push(arg)
151
155
  return
152
156
  }
153
157
  arg.mode = "query"
@@ -205,8 +209,8 @@ export const update = async (meta, collection, query, update, options, extras) =
205
209
  ...(meta.DIP_DB ? {db: meta.DIP_DB} : {}),
206
210
  }
207
211
  arg = Object.assign(arg, extras)
208
- if (isTransaction) {
209
- transactions.push(arg)
212
+ if (isBranch) {
213
+ batches.push(arg)
210
214
  return
211
215
  }
212
216
  arg.mode = "command"
@@ -218,7 +222,7 @@ export const update = async (meta, collection, query, update, options, extras) =
218
222
  })
219
223
  }
220
224
 
221
- export const remove = async (meta, collection, query, extras) => {
225
+ export const remove = async (meta, collection, query, options, extras) => {
222
226
  // Multi Company Support
223
227
  if (Utils.isEmpty(meta?.company)) throw {message: "Error: meta argument not provided in Dip.remove()"}
224
228
  if (typeof collection !== "string") throw {message: "Error: collection type is not string in Dip.remove()"}
@@ -226,17 +230,22 @@ export const remove = async (meta, collection, query, extras) => {
226
230
  if (meta.company !== "GLOBAL")
227
231
  query.company = meta.company
228
232
  // ---------------------
233
+ if (Utils.isEmpty(query._id) && !meta.allowDangerousRemove) {
234
+ throw { message: "Error: Dip.remove() without _id blocked by default (Dangerous Operation). Set allowDangerousRemove key if intentional." }
235
+ return
236
+ }
229
237
 
230
238
  var arg = {
231
239
  collection: collection,
232
240
  query: query,
233
241
  delete: true,
242
+ options: options ? options : {},
234
243
  ...(meta.DIP_URL ? {DIP_URL: meta.DIP_URL} : {}),
235
244
  ...(meta.DIP_DB ? {db: meta.DIP_DB} : {}),
236
245
  }
237
246
  arg = Object.assign(arg, extras)
238
- if (isTransaction) {
239
- transactions.push(arg)
247
+ if (isBranch) {
248
+ batches.push(arg)
240
249
  return
241
250
  }
242
251
  arg.mode = "command"
@@ -248,6 +257,11 @@ export const remove = async (meta, collection, query, extras) => {
248
257
  })
249
258
  }
250
259
 
260
+ export const close = async (meta, db) => {
261
+ return query(meta, "-", {}, {}, {db: db ?? root.db, close: true})
262
+ }
263
+
264
+
251
265
  export let config = {
252
266
  useDipper: false
253
267
  }
@@ -268,8 +282,6 @@ function execute(arg) {
268
282
  arg.engine = arg.engine ?? internal.engineName
269
283
  arg.compression = true // Compress all for now
270
284
 
271
- if (stats)
272
- arg.stats = true
273
285
 
274
286
  return config.useDipper ? dipper(arg)
275
287
  : axios
@@ -280,7 +292,9 @@ function execute(arg) {
280
292
  // console.log(JSON.stringify(res.header, null, 4));
281
293
  // console.log(JSON.stringify(res.body, null, 4));
282
294
 
283
- return result.data
295
+ let res = result.data.mode === "query" ? result.data.items : result.data
296
+ res.stats = result.data.mode === "query" ? _ => result.data.stats : res.stats
297
+ return res
284
298
  })
285
299
  // .catch(err => { console.log(err.message); console.log(err.response); return err});
286
300
  }
package/libs/features.js CHANGED
@@ -118,9 +118,10 @@ function getFeaturelessFeature(req) {
118
118
 
119
119
  const apiHandler = async (req, res) => {
120
120
  let method = req.method.toLowerCase()
121
+ let featureless
121
122
  try {
122
123
  let feature = getFeature(req.body?.feature)
123
- let featureless = feature ? undefined : (feature = getFeaturelessFeature(req))
124
+ featureless = feature ? undefined : (feature = getFeaturelessFeature(req))
124
125
 
125
126
  if (!req.body?.feature && !featureless) {
126
127
  console.warn(`Feature: feature not sent by client`)
@@ -150,7 +151,7 @@ const apiHandler = async (req, res) => {
150
151
  await feature.handler({...req, headers: req.headers, body: {...req.body, topic} }, res)
151
152
  } catch (err) {
152
153
  if (process.env.DEBUG_MODE)
153
- console.log('Error: Feature: ', req.body?.feature, err)
154
+ console.log('Error: Feature: ', req.body?.feature ?? (featureless ? `Featureless Api:${featureless.api}` : undefined), err)
154
155
  throw {status: 500, message: "Failed to GET feature", ...err}
155
156
  }
156
157
  } else if (method !== "get" && feature.bypass) {
@@ -158,14 +159,14 @@ const apiHandler = async (req, res) => {
158
159
  await feature.handler(topic, prepareMessage(req), req, res)
159
160
  } catch (err) {
160
161
  if (process.env.DEBUG_MODE)
161
- console.log('Error: Feature: ', req.body?.feature, err)
162
+ console.log('Error: Feature: ', req.body?.feature ?? (featureless ? `Featureless Api:${featureless.api}` : undefined), err)
162
163
  throw {status: 500, message: "Failed to POST feature", ...err}
163
164
  }
164
165
  } else
165
166
  await commandAction(req, res, topic)
166
167
  } catch (err) {
167
168
  if (process.env.DEBUG_MODE)
168
- console.log('Error: Feature: ', req.body?.feature, err)
169
+ console.log('Error: Feature: ', req.body?.feature ?? (featureless ? `Featureless Api:${featureless.api}` : undefined), err)
169
170
  try { // Sometimes error occurs when disconnecting stream from front end
170
171
  res.status(err.status ?? 500).json(err)
171
172
  } catch (_) { }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "corebasic",
3
3
  "type": "module",
4
- "version": "1.0.178",
4
+ "version": "1.0.180",
5
5
  "description": "",
6
6
  "main": "index.js",
7
7
  "scripts": {