@furystack/sequelize-store 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/esm/sequelize-store.d.ts +13 -1
- package/esm/sequelize-store.d.ts.map +1 -1
- package/esm/sequelize-store.js +10 -4
- package/esm/sequelize-store.js.map +1 -1
- package/esm/sequelize-store.spec.js +0 -7
- package/esm/sequelize-store.spec.js.map +1 -1
- package/esm/store-manager-helpers.d.ts +1 -1
- package/esm/store-manager-helpers.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/sequelize-store.spec.ts +7 -7
- package/src/sequelize-store.ts +22 -8
package/README.md
CHANGED
package/esm/sequelize-store.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { FindOptions, PhysicalStore, PartialResult, FilterType, WithOptionalId, CreateResult } from '@furystack/core';
|
|
2
2
|
import type { Constructable } from '@furystack/inject';
|
|
3
3
|
import type { Sequelize, ModelStatic, Model } from 'sequelize';
|
|
4
|
+
import { EventHub } from '@furystack/utils';
|
|
4
5
|
export interface SequelizeStoreSettings<T extends object, M extends Model<T>, TPrimaryKey extends keyof T> {
|
|
5
6
|
/**
|
|
6
7
|
* The Model to use
|
|
@@ -26,7 +27,18 @@ export interface SequelizeStoreSettings<T extends object, M extends Model<T>, TP
|
|
|
26
27
|
/**
|
|
27
28
|
* TypeORM Store implementation for FuryStack
|
|
28
29
|
*/
|
|
29
|
-
export declare class SequelizeStore<T extends object, M extends Model<T>, TPrimaryKey extends keyof T, TWriteableData = WithOptionalId<T, TPrimaryKey>>
|
|
30
|
+
export declare class SequelizeStore<T extends object, M extends Model<T>, TPrimaryKey extends keyof T, TWriteableData = WithOptionalId<T, TPrimaryKey>> extends EventHub<{
|
|
31
|
+
onEntityAdded: {
|
|
32
|
+
entity: T;
|
|
33
|
+
};
|
|
34
|
+
onEntityUpdated: {
|
|
35
|
+
id: T[TPrimaryKey];
|
|
36
|
+
change: Partial<T>;
|
|
37
|
+
};
|
|
38
|
+
onEntityRemoved: {
|
|
39
|
+
key: T[TPrimaryKey];
|
|
40
|
+
};
|
|
41
|
+
}> implements PhysicalStore<T, TPrimaryKey, TWriteableData> {
|
|
30
42
|
private readonly options;
|
|
31
43
|
readonly primaryKey: TPrimaryKey;
|
|
32
44
|
readonly model: Constructable<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize-store.d.ts","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,cAAc,EACd,YAAY,EACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAA4B,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"sequelize-store.d.ts","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"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"}
|
package/esm/sequelize-store.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Lock } from 'semaphore-async-await';
|
|
2
|
+
import { EventHub } from '@furystack/utils';
|
|
2
3
|
/**
|
|
3
4
|
* TypeORM Store implementation for FuryStack
|
|
4
5
|
*/
|
|
5
|
-
export class SequelizeStore {
|
|
6
|
+
export class SequelizeStore extends EventHub {
|
|
6
7
|
options;
|
|
7
8
|
primaryKey;
|
|
8
9
|
model;
|
|
@@ -32,6 +33,7 @@ export class SequelizeStore {
|
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
constructor(options) {
|
|
36
|
+
super();
|
|
35
37
|
this.options = options;
|
|
36
38
|
this.primaryKey = options.primaryKey;
|
|
37
39
|
this.model = options.model;
|
|
@@ -39,9 +41,11 @@ export class SequelizeStore {
|
|
|
39
41
|
}
|
|
40
42
|
async add(...entries) {
|
|
41
43
|
const model = await this.getModel();
|
|
42
|
-
const
|
|
44
|
+
const createdModels = await model.bulkCreate(entries);
|
|
45
|
+
const created = createdModels.map((c) => c.toJSON());
|
|
46
|
+
created.forEach((entity) => this.emit('onEntityAdded', { entity }));
|
|
43
47
|
return {
|
|
44
|
-
created
|
|
48
|
+
created,
|
|
45
49
|
};
|
|
46
50
|
}
|
|
47
51
|
async update(id, data) {
|
|
@@ -50,6 +54,7 @@ export class SequelizeStore {
|
|
|
50
54
|
if (result[0] < 1) {
|
|
51
55
|
throw Error('Entity not found');
|
|
52
56
|
}
|
|
57
|
+
this.emit('onEntityUpdated', { id, change: data });
|
|
53
58
|
}
|
|
54
59
|
async count(filter) {
|
|
55
60
|
const model = await this.getModel();
|
|
@@ -81,9 +86,10 @@ export class SequelizeStore {
|
|
|
81
86
|
async remove(...keys) {
|
|
82
87
|
const model = await this.getModel();
|
|
83
88
|
await model.destroy({ where: { [this.primaryKey]: keys } });
|
|
89
|
+
keys.forEach((key) => this.emit('onEntityRemoved', { key }));
|
|
84
90
|
}
|
|
85
91
|
async dispose() {
|
|
86
|
-
|
|
92
|
+
await super.dispose();
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
//# sourceMappingURL=sequelize-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize-store.js","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"sequelize-store.js","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,6 @@ import { Injector } from '@furystack/inject';
|
|
|
7
7
|
import { SequelizeClientFactory } from './sequelize-client-factory.js';
|
|
8
8
|
import { describe, it, expect } from 'vitest';
|
|
9
9
|
class TestSequelizeClass extends Model {
|
|
10
|
-
id;
|
|
11
|
-
stringValue1;
|
|
12
|
-
stringValue2;
|
|
13
|
-
numberValue1;
|
|
14
|
-
numberValue2;
|
|
15
|
-
booleanValue;
|
|
16
|
-
dateValue;
|
|
17
10
|
}
|
|
18
11
|
describe('Sequelize Store', () => {
|
|
19
12
|
createStoreTest({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize-store.spec.js","sourceRoot":"","sources":["../src/sequelize-store.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAEtE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,MAAM,kBAAmB,SAAQ,KAA2B;
|
|
1
|
+
{"version":3,"file":"sequelize-store.spec.js","sourceRoot":"","sources":["../src/sequelize-store.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,6 @@ export declare const useSequelize: <T extends object, M extends ModelStatic<Mode
|
|
|
21
21
|
/**
|
|
22
22
|
* A callback for model initialization
|
|
23
23
|
*/
|
|
24
|
-
initModel?: (
|
|
24
|
+
initModel?: (sequelize: Sequelize) => Promise<void>;
|
|
25
25
|
}) => void;
|
|
26
26
|
//# sourceMappingURL=store-manager-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager-helpers.d.ts","sourceRoot":"","sources":["../src/store-manager-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAIvE,eAAO,MAAM,YAAY;
|
|
1
|
+
{"version":3,"file":"store-manager-helpers.d.ts","sourceRoot":"","sources":["../src/store-manager-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAIvE,eAAO,MAAM,YAAY,oJAOtB;IACD,QAAQ,EAAE,QAAQ,CAAA;IAClB;;OAEG;IACH,KAAK,EAAE,cAAc,CAAC,CAAC,CAAA;IAEvB;;OAEG;IACH,cAAc,EAAE,CAAC,CAAA;IAEjB;;OAEG;IACH,UAAU,EAAE,GAAG,CAAA;IACf;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;OAEG;IAEH,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAA;CACpD,SAUA,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/sequelize-store",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.2",
|
|
4
4
|
"description": "Sequelize-based Store implementation for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -35,17 +35,17 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/furystack/furystack",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@furystack/core": "^14.0.
|
|
39
|
-
"@furystack/inject": "^
|
|
40
|
-
"@furystack/utils": "^
|
|
38
|
+
"@furystack/core": "^14.0.2",
|
|
39
|
+
"@furystack/inject": "^11.0.1",
|
|
40
|
+
"@furystack/utils": "^7.0.0",
|
|
41
41
|
"semaphore-async-await": "^1.5.1",
|
|
42
|
-
"sequelize": "^6.37.
|
|
42
|
+
"sequelize": "^6.37.3"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/node": "^20.
|
|
45
|
+
"@types/node": "^20.12.7",
|
|
46
46
|
"sqlite3": "5.1.7",
|
|
47
|
-
"typescript": "^5.4.
|
|
48
|
-
"vitest": "^1.
|
|
47
|
+
"typescript": "^5.4.5",
|
|
48
|
+
"vitest": "^1.5.0"
|
|
49
49
|
},
|
|
50
50
|
"typings": "./types/index.d.ts"
|
|
51
51
|
}
|
|
@@ -9,13 +9,13 @@ import type { SequelizeStore } from './sequelize-store.js'
|
|
|
9
9
|
import { describe, it, expect } from 'vitest'
|
|
10
10
|
|
|
11
11
|
class TestSequelizeClass extends Model<TestClass, TestClass> implements TestClass {
|
|
12
|
-
id
|
|
13
|
-
stringValue1
|
|
14
|
-
stringValue2
|
|
15
|
-
numberValue1
|
|
16
|
-
numberValue2
|
|
17
|
-
booleanValue
|
|
18
|
-
dateValue
|
|
12
|
+
declare id: number
|
|
13
|
+
declare stringValue1: string
|
|
14
|
+
declare stringValue2: string
|
|
15
|
+
declare numberValue1: number
|
|
16
|
+
declare numberValue2: number
|
|
17
|
+
declare booleanValue: boolean
|
|
18
|
+
declare dateValue: Date
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
describe('Sequelize Store', () => {
|
package/src/sequelize-store.ts
CHANGED
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
import type { Constructable } from '@furystack/inject'
|
|
10
10
|
import type { Sequelize, ModelStatic, Model, WhereOptions, Attributes } from 'sequelize'
|
|
11
11
|
import { Lock } from 'semaphore-async-await'
|
|
12
|
+
import { EventHub } from '@furystack/utils'
|
|
12
13
|
|
|
13
14
|
export interface SequelizeStoreSettings<T extends object, M extends Model<T>, TPrimaryKey extends keyof T> {
|
|
14
15
|
/**
|
|
@@ -38,11 +39,17 @@ export interface SequelizeStoreSettings<T extends object, M extends Model<T>, TP
|
|
|
38
39
|
* TypeORM Store implementation for FuryStack
|
|
39
40
|
*/
|
|
40
41
|
export class SequelizeStore<
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
>
|
|
42
|
+
T extends object,
|
|
43
|
+
M extends Model<T>,
|
|
44
|
+
TPrimaryKey extends keyof T,
|
|
45
|
+
TWriteableData = WithOptionalId<T, TPrimaryKey>,
|
|
46
|
+
>
|
|
47
|
+
extends EventHub<{
|
|
48
|
+
onEntityAdded: { entity: T }
|
|
49
|
+
onEntityUpdated: { id: T[TPrimaryKey]; change: Partial<T> }
|
|
50
|
+
onEntityRemoved: { key: T[TPrimaryKey] }
|
|
51
|
+
}>
|
|
52
|
+
implements PhysicalStore<T, TPrimaryKey, TWriteableData>
|
|
46
53
|
{
|
|
47
54
|
public readonly primaryKey: TPrimaryKey
|
|
48
55
|
|
|
@@ -80,15 +87,20 @@ export class SequelizeStore<
|
|
|
80
87
|
}
|
|
81
88
|
|
|
82
89
|
constructor(private readonly options: SequelizeStoreSettings<T, M, TPrimaryKey>) {
|
|
90
|
+
super()
|
|
83
91
|
this.primaryKey = options.primaryKey
|
|
84
92
|
this.model = options.model
|
|
85
93
|
this.sequelizeModel = options.sequelizeModel
|
|
86
94
|
}
|
|
87
95
|
public async add(...entries: TWriteableData[]): Promise<CreateResult<T>> {
|
|
88
96
|
const model = await this.getModel()
|
|
89
|
-
const
|
|
97
|
+
const createdModels = await model.bulkCreate(entries as any)
|
|
98
|
+
|
|
99
|
+
const created = createdModels.map((c) => c.toJSON() as T)
|
|
100
|
+
|
|
101
|
+
created.forEach((entity) => this.emit('onEntityAdded', { entity }))
|
|
90
102
|
return {
|
|
91
|
-
created
|
|
103
|
+
created,
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
public async update(id: T[TPrimaryKey], data: Partial<T>): Promise<void> {
|
|
@@ -98,6 +110,7 @@ export class SequelizeStore<
|
|
|
98
110
|
if (result[0] < 1) {
|
|
99
111
|
throw Error('Entity not found')
|
|
100
112
|
}
|
|
113
|
+
this.emit('onEntityUpdated', { id, change: data })
|
|
101
114
|
}
|
|
102
115
|
public async count(filter?: FilterType<T>): Promise<number> {
|
|
103
116
|
const model = await this.getModel()
|
|
@@ -134,8 +147,9 @@ export class SequelizeStore<
|
|
|
134
147
|
public async remove(...keys: Array<T[TPrimaryKey]>): Promise<void> {
|
|
135
148
|
const model = await this.getModel()
|
|
136
149
|
await model.destroy({ where: { [this.primaryKey]: keys } } as any)
|
|
150
|
+
keys.forEach((key) => this.emit('onEntityRemoved', { key }))
|
|
137
151
|
}
|
|
138
152
|
public async dispose() {
|
|
139
|
-
|
|
153
|
+
await super.dispose()
|
|
140
154
|
}
|
|
141
155
|
}
|