@sprucelabs/data-stores 28.3.281 → 28.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.
@@ -8,7 +8,11 @@ export default class DatabaseFactory {
8
8
  private static generateCacheKey;
9
9
  static reset(): void;
10
10
  }
11
- export type DatabaseConstructor = new (connectionString: string, options: DatabaseOptions) => Database;
11
+ export type DatabaseAdapterClass = new (connectionString: string, options: DatabaseOptions) => Database;
12
+ export interface DatabaseAdapterBuilder {
13
+ Database(connectionString: string, options: DatabaseOptions): Database;
14
+ }
15
+ export type DatabaseConstructor = DatabaseAdapterClass | DatabaseAdapterBuilder;
12
16
  interface DatabaseFactoryOptions {
13
17
  dbName?: string;
14
18
  dbConnectionString: string;
@@ -21,8 +21,14 @@ class DatabaseFactory {
21
21
  if (!this.cache[cacheKey]) {
22
22
  for (const [key, Adapter] of Object.entries(this.Adapters)) {
23
23
  if (dbConnectionString.startsWith(key)) {
24
- database = new Adapter(dbConnectionString, { dbName });
25
- break;
24
+ const args = [
25
+ dbConnectionString,
26
+ { dbName },
27
+ ];
28
+ database =
29
+ 'Database' in Adapter
30
+ ? Adapter.Database(...args)
31
+ : new Adapter(...args);
26
32
  }
27
33
  }
28
34
  if (!database) {
@@ -1,14 +1,13 @@
1
1
  import { Database } from '../types/database.types';
2
2
  import { DataStore, StoreMap, StoreName, StoreOptions } from '../types/stores.types';
3
- interface StoreContructor {
4
- Store(o: any): Promise<DataStore> | DataStore;
5
- }
6
3
  export default class StoreFactory {
7
- private storeMap;
8
- private db;
4
+ static Class?: new (db: Database) => StoreFactory;
9
5
  private static initializations;
6
+ protected storeMap: Record<string, StoreContructor>;
7
+ protected databasesByStoreName: Record<string, Database>;
8
+ private db;
10
9
  private stores;
11
- private constructor();
10
+ protected constructor(db: Database);
12
11
  static Factory(db: Database): StoreFactory;
13
12
  Store<Name extends StoreName, Options extends StoreOptions<Name>>(name: Name, options?: Options): Promise<StoreMap[Name]>;
14
13
  getStoreNames(): StoreName[];
@@ -16,5 +15,9 @@ export default class StoreFactory {
16
15
  setStore(name: StoreName, store: DataStore | null): void;
17
16
  getStore<Name extends StoreName>(name: Name): Promise<StoreMap[Name]>;
18
17
  static reset(): void;
18
+ setDatabaseForStore<Name extends StoreName>(name: Name, db: Database): void;
19
+ }
20
+ interface StoreContructor {
21
+ Store(o: any): Promise<DataStore> | DataStore;
19
22
  }
20
23
  export {};
@@ -12,11 +12,13 @@ import SpruceError from '../errors/SpruceError.js';
12
12
  class StoreFactory {
13
13
  constructor(db) {
14
14
  this.storeMap = {};
15
+ this.databasesByStoreName = {};
15
16
  this.stores = {};
16
17
  this.db = db;
17
18
  }
18
19
  static Factory(db) {
19
- return new this(db);
20
+ var _a;
21
+ return new ((_a = this.Class) !== null && _a !== void 0 ? _a : this)(db);
20
22
  }
21
23
  Store(name, options) {
22
24
  return __awaiter(this, void 0, void 0, function* () {
@@ -29,7 +31,8 @@ class StoreFactory {
29
31
  friendlyMessage: `You have to have ${namesUtil.toPascal(name)}.Store(options: UniversalStoreOptions) factory method on your store that returns \`new this(...)\`.`,
30
32
  });
31
33
  }
32
- const instance = yield Store.Store(Object.assign({ db: this.db, storeFactory: this }, options));
34
+ const db = this.databasesByStoreName[name] || this.db;
35
+ const instance = yield Store.Store(Object.assign({ db, storeFactory: this }, options));
33
36
  if (!StoreFactory.initializations[name]) {
34
37
  StoreFactory.initializations[name] = true;
35
38
  yield ((_a = instance.initialize) === null || _a === void 0 ? void 0 : _a.call(instance));
@@ -63,6 +66,9 @@ class StoreFactory {
63
66
  static reset() {
64
67
  this.initializations = {};
65
68
  }
69
+ setDatabaseForStore(name, db) {
70
+ this.databasesByStoreName[name] = db;
71
+ }
66
72
  }
67
73
  StoreFactory.initializations = {};
68
74
  export default StoreFactory;
@@ -4,6 +4,7 @@ export * from './fixtures/DatabaseFixture';
4
4
  export { default as AbstractStore } from './stores/AbstractStore';
5
5
  export { default as StoreFactory } from './factories/StoreFactory';
6
6
  export { default as DatabaseFactory } from './factories/DatabaseFactory';
7
+ export { default as MockStoreFactory } from './stores/MockStoreFactory';
7
8
  export { default as StoreLoader } from './loaders/StoreLoader';
8
9
  export { default as MongoDatabase } from './databases/MongoDatabase';
9
10
  export * from './databases/MongoDatabase';
@@ -4,6 +4,7 @@ export * from './fixtures/DatabaseFixture.js';
4
4
  export { default as AbstractStore } from './stores/AbstractStore.js';
5
5
  export { default as StoreFactory } from './factories/StoreFactory.js';
6
6
  export { default as DatabaseFactory } from './factories/DatabaseFactory.js';
7
+ export { default as MockStoreFactory } from './stores/MockStoreFactory.js';
7
8
  export { default as StoreLoader } from './loaders/StoreLoader.js';
8
9
  export { default as MongoDatabase } from './databases/MongoDatabase.js';
9
10
  export * from './databases/MongoDatabase.js';
@@ -0,0 +1,7 @@
1
+ import StoreFactory from '../factories/StoreFactory';
2
+ import { Database } from '../types/database.types';
3
+ import { StoreName } from '../types/stores.types';
4
+ export default class MockStoreFactory extends StoreFactory {
5
+ constructor(db: Database);
6
+ assertDatabaseForStoreInstanceOf<Name extends StoreName>(name: Name, Class: new (...opts: any[]) => Database): Promise<void>;
7
+ }
@@ -0,0 +1,25 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { assert } from '@sprucelabs/test-utils';
11
+ import StoreFactory from '../factories/StoreFactory.js';
12
+ export default class MockStoreFactory extends StoreFactory {
13
+ constructor(db) {
14
+ super(db);
15
+ }
16
+ assertDatabaseForStoreInstanceOf(name, Class) {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ if (!this.storeMap[name]) {
19
+ assert.fail(`I could not find a store named ${name}. Did you create it with 'spruce create.store'?`);
20
+ }
21
+ const store = yield this.getStore(name);
22
+ assert.isInstanceOf(store.getDb(), Class, `Database for '${name}' store is not set correctly. Try 'stores.setDatabaseForStore(...)`);
23
+ });
24
+ }
25
+ }
@@ -8,7 +8,11 @@ export default class DatabaseFactory {
8
8
  private static generateCacheKey;
9
9
  static reset(): void;
10
10
  }
11
- export type DatabaseConstructor = new (connectionString: string, options: DatabaseOptions) => Database;
11
+ export type DatabaseAdapterClass = new (connectionString: string, options: DatabaseOptions) => Database;
12
+ export interface DatabaseAdapterBuilder {
13
+ Database(connectionString: string, options: DatabaseOptions): Database;
14
+ }
15
+ export type DatabaseConstructor = DatabaseAdapterClass | DatabaseAdapterBuilder;
12
16
  interface DatabaseFactoryOptions {
13
17
  dbName?: string;
14
18
  dbConnectionString: string;
@@ -26,8 +26,14 @@ class DatabaseFactory {
26
26
  if (!this.cache[cacheKey]) {
27
27
  for (const [key, Adapter] of Object.entries(this.Adapters)) {
28
28
  if (dbConnectionString.startsWith(key)) {
29
- database = new Adapter(dbConnectionString, { dbName });
30
- break;
29
+ const args = [
30
+ dbConnectionString,
31
+ { dbName },
32
+ ];
33
+ database =
34
+ 'Database' in Adapter
35
+ ? Adapter.Database(...args)
36
+ : new Adapter(...args);
31
37
  }
32
38
  }
33
39
  if (!database) {
@@ -1,14 +1,13 @@
1
1
  import { Database } from '../types/database.types';
2
2
  import { DataStore, StoreMap, StoreName, StoreOptions } from '../types/stores.types';
3
- interface StoreContructor {
4
- Store(o: any): Promise<DataStore> | DataStore;
5
- }
6
3
  export default class StoreFactory {
7
- private storeMap;
8
- private db;
4
+ static Class?: new (db: Database) => StoreFactory;
9
5
  private static initializations;
6
+ protected storeMap: Record<string, StoreContructor>;
7
+ protected databasesByStoreName: Record<string, Database>;
8
+ private db;
10
9
  private stores;
11
- private constructor();
10
+ protected constructor(db: Database);
12
11
  static Factory(db: Database): StoreFactory;
13
12
  Store<Name extends StoreName, Options extends StoreOptions<Name>>(name: Name, options?: Options): Promise<StoreMap[Name]>;
14
13
  getStoreNames(): StoreName[];
@@ -16,5 +15,9 @@ export default class StoreFactory {
16
15
  setStore(name: StoreName, store: DataStore | null): void;
17
16
  getStore<Name extends StoreName>(name: Name): Promise<StoreMap[Name]>;
18
17
  static reset(): void;
18
+ setDatabaseForStore<Name extends StoreName>(name: Name, db: Database): void;
19
+ }
20
+ interface StoreContructor {
21
+ Store(o: any): Promise<DataStore> | DataStore;
19
22
  }
20
23
  export {};
@@ -8,11 +8,13 @@ const SpruceError_1 = __importDefault(require("../errors/SpruceError"));
8
8
  class StoreFactory {
9
9
  constructor(db) {
10
10
  this.storeMap = {};
11
+ this.databasesByStoreName = {};
11
12
  this.stores = {};
12
13
  this.db = db;
13
14
  }
14
15
  static Factory(db) {
15
- return new this(db);
16
+ var _a;
17
+ return new ((_a = this.Class) !== null && _a !== void 0 ? _a : this)(db);
16
18
  }
17
19
  async Store(name, options) {
18
20
  var _a;
@@ -24,7 +26,8 @@ class StoreFactory {
24
26
  friendlyMessage: `You have to have ${spruce_skill_utils_1.namesUtil.toPascal(name)}.Store(options: UniversalStoreOptions) factory method on your store that returns \`new this(...)\`.`,
25
27
  });
26
28
  }
27
- const instance = await Store.Store(Object.assign({ db: this.db, storeFactory: this }, options));
29
+ const db = this.databasesByStoreName[name] || this.db;
30
+ const instance = await Store.Store(Object.assign({ db, storeFactory: this }, options));
28
31
  if (!StoreFactory.initializations[name]) {
29
32
  StoreFactory.initializations[name] = true;
30
33
  await ((_a = instance.initialize) === null || _a === void 0 ? void 0 : _a.call(instance));
@@ -55,6 +58,9 @@ class StoreFactory {
55
58
  static reset() {
56
59
  this.initializations = {};
57
60
  }
61
+ setDatabaseForStore(name, db) {
62
+ this.databasesByStoreName[name] = db;
63
+ }
58
64
  }
59
65
  StoreFactory.initializations = {};
60
66
  exports.default = StoreFactory;
package/build/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './fixtures/DatabaseFixture';
4
4
  export { default as AbstractStore } from './stores/AbstractStore';
5
5
  export { default as StoreFactory } from './factories/StoreFactory';
6
6
  export { default as DatabaseFactory } from './factories/DatabaseFactory';
7
+ export { default as MockStoreFactory } from './stores/MockStoreFactory';
7
8
  export { default as StoreLoader } from './loaders/StoreLoader';
8
9
  export { default as MongoDatabase } from './databases/MongoDatabase';
9
10
  export * from './databases/MongoDatabase';
package/build/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.BatchArrayCursor = exports.BatchCursorImpl = exports.storePluginAssert = exports.databaseAssert = exports.databaseAssertUtil = exports.DatabaseFieldMapperPlugin = exports.CursorPagerFaker = exports.CursorPager = exports.generateId = exports.DataStoresError = exports.mongoUtil = exports.NeDbDatabase = exports.MongoDatabase = exports.StoreLoader = exports.DatabaseFactory = exports.StoreFactory = exports.AbstractStore = exports.DatabaseFixture = exports.AbstractDatabaseTest = void 0;
20
+ exports.BatchArrayCursor = exports.BatchCursorImpl = exports.storePluginAssert = exports.databaseAssert = exports.databaseAssertUtil = exports.DatabaseFieldMapperPlugin = exports.CursorPagerFaker = exports.CursorPager = exports.generateId = exports.DataStoresError = exports.mongoUtil = exports.NeDbDatabase = exports.MongoDatabase = exports.StoreLoader = exports.MockStoreFactory = exports.DatabaseFactory = exports.StoreFactory = exports.AbstractStore = exports.DatabaseFixture = exports.AbstractDatabaseTest = void 0;
21
21
  var AbstractDatabaseTest_1 = require("./tests/AbstractDatabaseTest");
22
22
  Object.defineProperty(exports, "AbstractDatabaseTest", { enumerable: true, get: function () { return __importDefault(AbstractDatabaseTest_1).default; } });
23
23
  var DatabaseFixture_1 = require("./fixtures/DatabaseFixture");
@@ -29,6 +29,8 @@ var StoreFactory_1 = require("./factories/StoreFactory");
29
29
  Object.defineProperty(exports, "StoreFactory", { enumerable: true, get: function () { return __importDefault(StoreFactory_1).default; } });
30
30
  var DatabaseFactory_1 = require("./factories/DatabaseFactory");
31
31
  Object.defineProperty(exports, "DatabaseFactory", { enumerable: true, get: function () { return __importDefault(DatabaseFactory_1).default; } });
32
+ var MockStoreFactory_1 = require("./stores/MockStoreFactory");
33
+ Object.defineProperty(exports, "MockStoreFactory", { enumerable: true, get: function () { return __importDefault(MockStoreFactory_1).default; } });
32
34
  var StoreLoader_1 = require("./loaders/StoreLoader");
33
35
  Object.defineProperty(exports, "StoreLoader", { enumerable: true, get: function () { return __importDefault(StoreLoader_1).default; } });
34
36
  var MongoDatabase_1 = require("./databases/MongoDatabase");
@@ -0,0 +1,7 @@
1
+ import StoreFactory from '../factories/StoreFactory';
2
+ import { Database } from '../types/database.types';
3
+ import { StoreName } from '../types/stores.types';
4
+ export default class MockStoreFactory extends StoreFactory {
5
+ constructor(db: Database);
6
+ assertDatabaseForStoreInstanceOf<Name extends StoreName>(name: Name, Class: new (...opts: any[]) => Database): Promise<void>;
7
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const test_utils_1 = require("@sprucelabs/test-utils");
7
+ const StoreFactory_1 = __importDefault(require("../factories/StoreFactory"));
8
+ class MockStoreFactory extends StoreFactory_1.default {
9
+ constructor(db) {
10
+ super(db);
11
+ }
12
+ async assertDatabaseForStoreInstanceOf(name, Class) {
13
+ if (!this.storeMap[name]) {
14
+ test_utils_1.assert.fail(`I could not find a store named ${name}. Did you create it with 'spruce create.store'?`);
15
+ }
16
+ const store = await this.getStore(name);
17
+ test_utils_1.assert.isInstanceOf(store.getDb(), Class, `Database for '${name}' store is not set correctly. Try 'stores.setDatabaseForStore(...)`);
18
+ }
19
+ }
20
+ exports.default = MockStoreFactory;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "28.3.281",
6
+ "version": "28.5.0",
7
7
  "files": [
8
8
  "build/**/*",
9
9
  "!build/__tests__",
@@ -67,8 +67,8 @@
67
67
  "@seald-io/nedb": "^4.0.4",
68
68
  "@sprucelabs/error": "^6.0.556",
69
69
  "@sprucelabs/globby": "^2.0.501",
70
- "@sprucelabs/schema": "^31.0.2",
71
- "@sprucelabs/spruce-skill-utils": "^31.1.8",
70
+ "@sprucelabs/schema": "^31.0.3",
71
+ "@sprucelabs/spruce-skill-utils": "^31.1.9",
72
72
  "just-clone": "^6.2.0",
73
73
  "lodash": "^4.17.21",
74
74
  "mongodb": "^6.12.0"