@signaldb/core 1.4.0 → 1.5.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.
@@ -163,7 +163,7 @@
163
163
  "src": "src/utils/isEqual.ts"
164
164
  },
165
165
  "src/utils/isFieldExpression.ts": {
166
- "file": "index.cjs29.js",
166
+ "file": "index.cjs27.js",
167
167
  "name": "utils/isFieldExpression",
168
168
  "src": "src/utils/isFieldExpression.ts"
169
169
  },
@@ -197,7 +197,7 @@
197
197
  "src": "src/utils/serializeValue.ts"
198
198
  },
199
199
  "src/utils/set.ts": {
200
- "file": "index.cjs27.js",
200
+ "file": "index.cjs28.js",
201
201
  "name": "utils/set",
202
202
  "src": "src/utils/set.ts"
203
203
  },
@@ -210,7 +210,7 @@
210
210
  ]
211
211
  },
212
212
  "src/utils/uniqueBy.ts": {
213
- "file": "index.cjs28.js",
213
+ "file": "index.cjs29.js",
214
214
  "name": "utils/uniqueBy",
215
215
  "src": "src/utils/uniqueBy.ts"
216
216
  }
@@ -44,6 +44,7 @@ interface CollectionEvents<T extends BaseItem, U = T> {
44
44
  'replaceOne': (selector: Selector<T>, item: Omit<T, 'id'> & Partial<Pick<T, 'id'>>) => void;
45
45
  'removeOne': (selector: Selector<T>) => void;
46
46
  'removeMany': (selector: Selector<T>) => void;
47
+ 'validate': (item: T) => void;
47
48
  '_debug.getItems': (callstack: string, selector: Selector<T> | undefined, measuredTime: number) => void;
48
49
  '_debug.find': <O extends FindOptions<T>>(callstack: string, selector: Selector<T> | undefined, options: O | undefined, cursor: Cursor<T, U>) => void;
49
50
  '_debug.findOne': <O extends FindOptions<T>>(callstack: string, selector: Selector<T>, options: O | undefined, item: U | undefined) => void;
@@ -530,6 +530,7 @@ const _Collection = class _Collection extends EventEmitter {
530
530
  if (!item)
531
531
  throw new Error("Invalid item");
532
532
  const newItem = { id: randomId(), ...item };
533
+ this.emit("validate", newItem);
533
534
  if (this.idIndex.has(serializeValue(newItem.id)))
534
535
  throw new Error("Item with same id already exists");
535
536
  this.memory().push(newItem);
@@ -600,6 +601,7 @@ const _Collection = class _Collection extends EventEmitter {
600
601
  if (item.id !== modifiedItem.id && this.getItemAndIndex({ id: modifiedItem.id }).item != null) {
601
602
  throw new Error("Item with same id already exists");
602
603
  }
604
+ this.emit("validate", modifiedItem);
603
605
  this.memory().splice(index, 1, modifiedItem);
604
606
  this.rebuildIndices();
605
607
  this.emit("changed", modifiedItem, restModifier);
@@ -649,6 +651,7 @@ const _Collection = class _Collection extends EventEmitter {
649
651
  if (item.id !== modifiedItem.id && this.getItemAndIndex({ id: modifiedItem.id }).item != null) {
650
652
  throw new Error(`Item with same id '${modifiedItem.id}' already exists`);
651
653
  }
654
+ this.emit("validate", modifiedItem);
652
655
  return {
653
656
  item: modifiedItem,
654
657
  index
@@ -692,6 +695,7 @@ const _Collection = class _Collection extends EventEmitter {
692
695
  throw new Error("Item with same id already exists");
693
696
  }
694
697
  const modifiedItem = { id: item.id, ...replacement };
698
+ this.emit("validate", modifiedItem);
695
699
  this.memory().splice(index, 1, modifiedItem);
696
700
  this.rebuildIndices();
697
701
  this.emit("changed", modifiedItem, replacement);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  const get = require("./index.cjs25.js");
3
- const set = require("./index.cjs27.js");
3
+ const set = require("./index.cjs28.js");
4
4
  function project(item, fields) {
5
5
  const allFieldsDeactivated = Object.values(fields).every((value) => value === 0);
6
6
  if (allFieldsDeactivated) {
@@ -3,7 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  const isEqual = require("./index.cjs9.js");
6
- const uniqueBy = require("./index.cjs28.js");
6
+ const uniqueBy = require("./index.cjs29.js");
7
7
  class Observer {
8
8
  /**
9
9
  * Creates a new instance of the `Observer` class.
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const isFieldExpression = require("./index.cjs29.js");
2
+ const isFieldExpression = require("./index.cjs27.js");
3
3
  const serializeValue = require("./index.cjs16.js");
4
4
  function getMatchingKeys(field, selector) {
5
5
  const result = { include: null, exclude: null };
@@ -1,29 +1,42 @@
1
1
  "use strict";
2
- function set(object, path, value, deleteIfUndefined = false) {
3
- if (object == null)
4
- return object;
5
- const segments = path.split(/[.[\]]/g);
6
- if (segments[0] === "")
7
- segments.shift();
8
- if (segments.at(-1) === "")
9
- segments.pop();
10
- const apply = (node) => {
11
- if (segments.length > 1) {
12
- const key = segments.shift();
13
- const nextIsNumber = !Number.isNaN(Number.parseInt(segments[0], 10));
14
- if (node[key] === void 0) {
15
- node[key] = nextIsNumber ? [] : {};
16
- }
17
- apply(node[key]);
18
- } else {
19
- if (deleteIfUndefined && value === void 0) {
20
- delete node[segments[0]];
21
- return;
22
- }
23
- node[segments[0]] = value;
24
- }
25
- };
26
- apply(object);
27
- return object;
2
+ const expressionKeys = /* @__PURE__ */ new Set([
3
+ "$eq",
4
+ "$gt",
5
+ "$gte",
6
+ "$lt",
7
+ "$lte",
8
+ "$in",
9
+ "$nin",
10
+ "$ne",
11
+ "$exists",
12
+ "$not",
13
+ "$expr",
14
+ "$jsonSchema",
15
+ "$mod",
16
+ "$regex",
17
+ "$options",
18
+ "$text",
19
+ "$where",
20
+ "$all",
21
+ "$elemMatch",
22
+ "$size",
23
+ "$bitsAllClear",
24
+ "$bitsAllSet",
25
+ "$bitsAnyClear",
26
+ "$bitsAnySet"
27
+ ]);
28
+ function isFieldExpression(expression) {
29
+ if (typeof expression !== "object" || expression == null) {
30
+ return false;
31
+ }
32
+ const keys = Object.keys(expression);
33
+ if (keys.length === 0) {
34
+ return false;
35
+ }
36
+ const hasInvalidKeys = keys.some((key) => !expressionKeys.has(key));
37
+ if (hasInvalidKeys)
38
+ return false;
39
+ const hasValidKeys = keys.every((key) => expressionKeys.has(key));
40
+ return hasValidKeys;
28
41
  }
29
- module.exports = set;
42
+ module.exports = isFieldExpression;
@@ -1,9 +1,29 @@
1
1
  "use strict";
2
- function uniqueBy(array, fn) {
3
- const set = /* @__PURE__ */ new Set();
4
- return array.filter((element) => {
5
- const value = typeof fn === "function" ? fn(element) : element[fn];
6
- return !set.has(value) && set.add(value);
7
- });
2
+ function set(object, path, value, deleteIfUndefined = false) {
3
+ if (object == null)
4
+ return object;
5
+ const segments = path.split(/[.[\]]/g);
6
+ if (segments[0] === "")
7
+ segments.shift();
8
+ if (segments.at(-1) === "")
9
+ segments.pop();
10
+ const apply = (node) => {
11
+ if (segments.length > 1) {
12
+ const key = segments.shift();
13
+ const nextIsNumber = !Number.isNaN(Number.parseInt(segments[0], 10));
14
+ if (node[key] === void 0) {
15
+ node[key] = nextIsNumber ? [] : {};
16
+ }
17
+ apply(node[key]);
18
+ } else {
19
+ if (deleteIfUndefined && value === void 0) {
20
+ delete node[segments[0]];
21
+ return;
22
+ }
23
+ node[segments[0]] = value;
24
+ }
25
+ };
26
+ apply(object);
27
+ return object;
8
28
  }
9
- module.exports = uniqueBy;
29
+ module.exports = set;
@@ -1,42 +1,9 @@
1
1
  "use strict";
2
- const expressionKeys = /* @__PURE__ */ new Set([
3
- "$eq",
4
- "$gt",
5
- "$gte",
6
- "$lt",
7
- "$lte",
8
- "$in",
9
- "$nin",
10
- "$ne",
11
- "$exists",
12
- "$not",
13
- "$expr",
14
- "$jsonSchema",
15
- "$mod",
16
- "$regex",
17
- "$options",
18
- "$text",
19
- "$where",
20
- "$all",
21
- "$elemMatch",
22
- "$size",
23
- "$bitsAllClear",
24
- "$bitsAllSet",
25
- "$bitsAnyClear",
26
- "$bitsAnySet"
27
- ]);
28
- function isFieldExpression(expression) {
29
- if (typeof expression !== "object" || expression == null) {
30
- return false;
31
- }
32
- const keys = Object.keys(expression);
33
- if (keys.length === 0) {
34
- return false;
35
- }
36
- const hasInvalidKeys = keys.some((key) => !expressionKeys.has(key));
37
- if (hasInvalidKeys)
38
- return false;
39
- const hasValidKeys = keys.every((key) => expressionKeys.has(key));
40
- return hasValidKeys;
2
+ function uniqueBy(array, fn) {
3
+ const set = /* @__PURE__ */ new Set();
4
+ return array.filter((element) => {
5
+ const value = typeof fn === "function" ? fn(element) : element[fn];
6
+ return !set.has(value) && set.add(value);
7
+ });
41
8
  }
42
- module.exports = isFieldExpression;
9
+ module.exports = uniqueBy;
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export type { default as MemoryAdapter } from './types/MemoryAdapter';
3
3
  export type { default as PersistenceAdapter, Changeset, LoadResponse, } from './types/PersistenceAdapter';
4
4
  export type { default as Selector } from './types/Selector';
5
5
  export type { default as Modifier } from './types/Modifier';
6
- export type { BaseItem, ObserveCallbacks, CursorOptions, Transform, SortSpecifier, FieldSpecifier, FindOptions, } from './Collection';
6
+ export type { BaseItem, ObserveCallbacks, CursorOptions, Transform, SortSpecifier, FieldSpecifier, FindOptions, CollectionOptions, } from './Collection';
7
7
  export { default as Collection, createIndex } from './Collection';
8
8
  export { default as AutoFetchCollection } from './AutoFetchCollection';
9
9
  export { default as combinePersistenceAdapters } from './persistence/combinePersistenceAdapters';
package/dist/index2.mjs CHANGED
@@ -529,6 +529,7 @@ const _Collection = class _Collection extends EventEmitter {
529
529
  if (!item)
530
530
  throw new Error("Invalid item");
531
531
  const newItem = { id: randomId(), ...item };
532
+ this.emit("validate", newItem);
532
533
  if (this.idIndex.has(serializeValue(newItem.id)))
533
534
  throw new Error("Item with same id already exists");
534
535
  this.memory().push(newItem);
@@ -599,6 +600,7 @@ const _Collection = class _Collection extends EventEmitter {
599
600
  if (item.id !== modifiedItem.id && this.getItemAndIndex({ id: modifiedItem.id }).item != null) {
600
601
  throw new Error("Item with same id already exists");
601
602
  }
603
+ this.emit("validate", modifiedItem);
602
604
  this.memory().splice(index, 1, modifiedItem);
603
605
  this.rebuildIndices();
604
606
  this.emit("changed", modifiedItem, restModifier);
@@ -648,6 +650,7 @@ const _Collection = class _Collection extends EventEmitter {
648
650
  if (item.id !== modifiedItem.id && this.getItemAndIndex({ id: modifiedItem.id }).item != null) {
649
651
  throw new Error(`Item with same id '${modifiedItem.id}' already exists`);
650
652
  }
653
+ this.emit("validate", modifiedItem);
651
654
  return {
652
655
  item: modifiedItem,
653
656
  index
@@ -691,6 +694,7 @@ const _Collection = class _Collection extends EventEmitter {
691
694
  throw new Error("Item with same id already exists");
692
695
  }
693
696
  const modifiedItem = { id: item.id, ...replacement };
697
+ this.emit("validate", modifiedItem);
694
698
  this.memory().splice(index, 1, modifiedItem);
695
699
  this.rebuildIndices();
696
700
  this.emit("changed", modifiedItem, replacement);
package/dist/index22.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import get from "./index25.mjs";
2
- import set from "./index27.mjs";
2
+ import set from "./index28.mjs";
3
3
  function project(item, fields) {
4
4
  const allFieldsDeactivated = Object.values(fields).every((value) => value === 0);
5
5
  if (allFieldsDeactivated) {
package/dist/index23.mjs CHANGED
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import isEqual from "./index9.mjs";
5
- import uniqueBy from "./index28.mjs";
5
+ import uniqueBy from "./index29.mjs";
6
6
  class Observer {
7
7
  /**
8
8
  * Creates a new instance of the `Observer` class.
package/dist/index26.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import isFieldExpression from "./index29.mjs";
1
+ import isFieldExpression from "./index27.mjs";
2
2
  import serializeValue from "./index16.mjs";
3
3
  function getMatchingKeys(field, selector) {
4
4
  const result = { include: null, exclude: null };
package/dist/index27.mjs CHANGED
@@ -1,30 +1,43 @@
1
- function set(object, path, value, deleteIfUndefined = false) {
2
- if (object == null)
3
- return object;
4
- const segments = path.split(/[.[\]]/g);
5
- if (segments[0] === "")
6
- segments.shift();
7
- if (segments.at(-1) === "")
8
- segments.pop();
9
- const apply = (node) => {
10
- if (segments.length > 1) {
11
- const key = segments.shift();
12
- const nextIsNumber = !Number.isNaN(Number.parseInt(segments[0], 10));
13
- if (node[key] === void 0) {
14
- node[key] = nextIsNumber ? [] : {};
15
- }
16
- apply(node[key]);
17
- } else {
18
- if (deleteIfUndefined && value === void 0) {
19
- delete node[segments[0]];
20
- return;
21
- }
22
- node[segments[0]] = value;
23
- }
24
- };
25
- apply(object);
26
- return object;
1
+ const expressionKeys = /* @__PURE__ */ new Set([
2
+ "$eq",
3
+ "$gt",
4
+ "$gte",
5
+ "$lt",
6
+ "$lte",
7
+ "$in",
8
+ "$nin",
9
+ "$ne",
10
+ "$exists",
11
+ "$not",
12
+ "$expr",
13
+ "$jsonSchema",
14
+ "$mod",
15
+ "$regex",
16
+ "$options",
17
+ "$text",
18
+ "$where",
19
+ "$all",
20
+ "$elemMatch",
21
+ "$size",
22
+ "$bitsAllClear",
23
+ "$bitsAllSet",
24
+ "$bitsAnyClear",
25
+ "$bitsAnySet"
26
+ ]);
27
+ function isFieldExpression(expression) {
28
+ if (typeof expression !== "object" || expression == null) {
29
+ return false;
30
+ }
31
+ const keys = Object.keys(expression);
32
+ if (keys.length === 0) {
33
+ return false;
34
+ }
35
+ const hasInvalidKeys = keys.some((key) => !expressionKeys.has(key));
36
+ if (hasInvalidKeys)
37
+ return false;
38
+ const hasValidKeys = keys.every((key) => expressionKeys.has(key));
39
+ return hasValidKeys;
27
40
  }
28
41
  export {
29
- set as default
42
+ isFieldExpression as default
30
43
  };
package/dist/index28.mjs CHANGED
@@ -1,10 +1,30 @@
1
- function uniqueBy(array, fn) {
2
- const set = /* @__PURE__ */ new Set();
3
- return array.filter((element) => {
4
- const value = typeof fn === "function" ? fn(element) : element[fn];
5
- return !set.has(value) && set.add(value);
6
- });
1
+ function set(object, path, value, deleteIfUndefined = false) {
2
+ if (object == null)
3
+ return object;
4
+ const segments = path.split(/[.[\]]/g);
5
+ if (segments[0] === "")
6
+ segments.shift();
7
+ if (segments.at(-1) === "")
8
+ segments.pop();
9
+ const apply = (node) => {
10
+ if (segments.length > 1) {
11
+ const key = segments.shift();
12
+ const nextIsNumber = !Number.isNaN(Number.parseInt(segments[0], 10));
13
+ if (node[key] === void 0) {
14
+ node[key] = nextIsNumber ? [] : {};
15
+ }
16
+ apply(node[key]);
17
+ } else {
18
+ if (deleteIfUndefined && value === void 0) {
19
+ delete node[segments[0]];
20
+ return;
21
+ }
22
+ node[segments[0]] = value;
23
+ }
24
+ };
25
+ apply(object);
26
+ return object;
7
27
  }
8
28
  export {
9
- uniqueBy as default
29
+ set as default
10
30
  };
package/dist/index29.mjs CHANGED
@@ -1,43 +1,10 @@
1
- const expressionKeys = /* @__PURE__ */ new Set([
2
- "$eq",
3
- "$gt",
4
- "$gte",
5
- "$lt",
6
- "$lte",
7
- "$in",
8
- "$nin",
9
- "$ne",
10
- "$exists",
11
- "$not",
12
- "$expr",
13
- "$jsonSchema",
14
- "$mod",
15
- "$regex",
16
- "$options",
17
- "$text",
18
- "$where",
19
- "$all",
20
- "$elemMatch",
21
- "$size",
22
- "$bitsAllClear",
23
- "$bitsAllSet",
24
- "$bitsAnyClear",
25
- "$bitsAnySet"
26
- ]);
27
- function isFieldExpression(expression) {
28
- if (typeof expression !== "object" || expression == null) {
29
- return false;
30
- }
31
- const keys = Object.keys(expression);
32
- if (keys.length === 0) {
33
- return false;
34
- }
35
- const hasInvalidKeys = keys.some((key) => !expressionKeys.has(key));
36
- if (hasInvalidKeys)
37
- return false;
38
- const hasValidKeys = keys.every((key) => expressionKeys.has(key));
39
- return hasValidKeys;
1
+ function uniqueBy(array, fn) {
2
+ const set = /* @__PURE__ */ new Set();
3
+ return array.filter((element) => {
4
+ const value = typeof fn === "function" ? fn(element) : element[fn];
5
+ return !set.has(value) && set.add(value);
6
+ });
40
7
  }
41
8
  export {
42
- isFieldExpression as default
9
+ uniqueBy as default
43
10
  };
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@signaldb/core",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "SignalDB is a client-side database that provides a simple MongoDB-like interface to the data with first-class typescript support to achieve an optimistic UI. Data persistence can be achieved by using storage providers that store the data through a JSON interface to places such as localStorage.",
5
5
  "scripts": {
6
- "build": "rimraf dist && vite build"
6
+ "build": "rimraf dist && vite build",
7
+ "test": "vitest"
7
8
  },
8
9
  "repository": {
9
10
  "type": "git",
@@ -54,5 +55,8 @@
54
55
  "dependencies": {
55
56
  "fast-sort": "^3.4.1",
56
57
  "mingo": "^6.5.1"
58
+ },
59
+ "devDependencies": {
60
+ "zod": "^3.24.2"
57
61
  }
58
62
  }