@furystack/sequelize-store 6.0.35 → 6.0.37
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/CHANGELOG.md +24 -0
- package/esm/sequelize-store.d.ts +2 -1
- package/esm/sequelize-store.d.ts.map +1 -1
- package/esm/sequelize-store.js +10 -8
- package/esm/sequelize-store.js.map +1 -1
- package/package.json +6 -7
- package/src/sequelize-store.ts +11 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [6.0.37] - 2026-02-11
|
|
4
|
+
|
|
5
|
+
### 🐛 Bug Fixes
|
|
6
|
+
|
|
7
|
+
- Fixed `getModel()` returning `this.sequelizeModel` (the unsynced static model) instead of the synced `model` instance after initialization
|
|
8
|
+
|
|
9
|
+
### ♻️ Refactoring
|
|
10
|
+
|
|
11
|
+
- Replaced semaphore-based initialization lock with promise deduplication for Sequelize model setup. Concurrent calls to `getModel()` now reuse a single in-flight initialization promise instead of queuing behind a semaphore. On initialization failure, the promise is reset to allow retry.
|
|
12
|
+
|
|
13
|
+
### ⬆️ Dependencies
|
|
14
|
+
|
|
15
|
+
- Bump `vitest` from `^4.0.17` to `^4.0.18`
|
|
16
|
+
- Bump `@types/node` from `^25.0.10` to `^25.2.3`
|
|
17
|
+
- Removed `semaphore-async-await` dependency
|
|
18
|
+
- Updated internal dependencies
|
|
19
|
+
|
|
20
|
+
## [6.0.36] - 2026-02-09
|
|
21
|
+
|
|
22
|
+
### ⬆️ Dependencies
|
|
23
|
+
|
|
24
|
+
- Updated `@furystack/core` dependency
|
|
25
|
+
- Updated `@furystack/*` dependencies
|
|
26
|
+
|
|
3
27
|
## [6.0.35] - 2026-01-26
|
|
4
28
|
|
|
5
29
|
### 🔧 Chores
|
package/esm/sequelize-store.d.ts
CHANGED
|
@@ -43,9 +43,10 @@ export declare class SequelizeStore<T extends object, M extends Model<T>, TPrima
|
|
|
43
43
|
readonly primaryKey: TPrimaryKey;
|
|
44
44
|
readonly model: Constructable<T>;
|
|
45
45
|
readonly sequelizeModel: ModelStatic<M>;
|
|
46
|
-
private
|
|
46
|
+
private initPromise;
|
|
47
47
|
private initializedModel?;
|
|
48
48
|
getModel(): Promise<ModelStatic<M>>;
|
|
49
|
+
private initializeModel;
|
|
49
50
|
constructor(options: SequelizeStoreSettings<T, M, TPrimaryKey>);
|
|
50
51
|
add(...entries: TWriteableData[]): Promise<CreateResult<T>>;
|
|
51
52
|
update(id: T[TPrimaryKey], data: Partial<T>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize-store.d.ts","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,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,5 +1,4 @@
|
|
|
1
1
|
import { EventHub } from '@furystack/utils';
|
|
2
|
-
import { Lock } from 'semaphore-async-await';
|
|
3
2
|
/**
|
|
4
3
|
* Sequelize Store implementation for FuryStack
|
|
5
4
|
*/
|
|
@@ -8,16 +7,18 @@ export class SequelizeStore extends EventHub {
|
|
|
8
7
|
primaryKey;
|
|
9
8
|
model;
|
|
10
9
|
sequelizeModel;
|
|
11
|
-
|
|
10
|
+
initPromise = null;
|
|
12
11
|
initializedModel;
|
|
13
12
|
async getModel() {
|
|
14
13
|
if (this.initializedModel) {
|
|
15
14
|
return this.initializedModel;
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return this.initializedModel;
|
|
16
|
+
if (!this.initPromise) {
|
|
17
|
+
this.initPromise = this.initializeModel();
|
|
20
18
|
}
|
|
19
|
+
return this.initPromise;
|
|
20
|
+
}
|
|
21
|
+
async initializeModel() {
|
|
21
22
|
try {
|
|
22
23
|
const client = this.options.getSequelizeClient();
|
|
23
24
|
if (this.options.initModel) {
|
|
@@ -25,11 +26,12 @@ export class SequelizeStore extends EventHub {
|
|
|
25
26
|
await client.sync();
|
|
26
27
|
}
|
|
27
28
|
const model = client.model(this.options.sequelizeModel.name);
|
|
28
|
-
this.initializedModel =
|
|
29
|
+
this.initializedModel = model;
|
|
29
30
|
return model;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
this.
|
|
32
|
+
catch (error) {
|
|
33
|
+
this.initPromise = null;
|
|
34
|
+
throw error;
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
constructor(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequelize-store.js","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"sequelize-store.js","sourceRoot":"","sources":["../src/sequelize-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/sequelize-store",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.37",
|
|
4
4
|
"description": "Sequelize-based Store implementation for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -38,17 +38,16 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/furystack/furystack",
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@furystack/core": "^15.0.
|
|
42
|
-
"@furystack/inject": "^12.0.
|
|
43
|
-
"@furystack/utils": "^8.1.
|
|
44
|
-
"semaphore-async-await": "^1.5.1",
|
|
41
|
+
"@furystack/core": "^15.0.36",
|
|
42
|
+
"@furystack/inject": "^12.0.30",
|
|
43
|
+
"@furystack/utils": "^8.1.10",
|
|
45
44
|
"sequelize": "^6.37.7"
|
|
46
45
|
},
|
|
47
46
|
"devDependencies": {
|
|
48
|
-
"@types/node": "^25.
|
|
47
|
+
"@types/node": "^25.2.3",
|
|
49
48
|
"sqlite3": "5.1.7",
|
|
50
49
|
"typescript": "^5.9.3",
|
|
51
|
-
"vitest": "^4.0.
|
|
50
|
+
"vitest": "^4.0.18"
|
|
52
51
|
},
|
|
53
52
|
"engines": {
|
|
54
53
|
"node": ">=22.0.0"
|
package/src/sequelize-store.ts
CHANGED
|
@@ -8,7 +8,6 @@ import type {
|
|
|
8
8
|
} from '@furystack/core'
|
|
9
9
|
import type { Constructable } from '@furystack/inject'
|
|
10
10
|
import { EventHub } from '@furystack/utils'
|
|
11
|
-
import { Lock } from 'semaphore-async-await'
|
|
12
11
|
import type { FindAttributeOptions, Identifier, Model, ModelStatic, Sequelize, WhereOptions } from 'sequelize'
|
|
13
12
|
|
|
14
13
|
export interface SequelizeStoreSettings<T extends object, M extends Model<T>, TPrimaryKey extends keyof T> {
|
|
@@ -57,7 +56,7 @@ export class SequelizeStore<
|
|
|
57
56
|
|
|
58
57
|
public readonly sequelizeModel: ModelStatic<M>
|
|
59
58
|
|
|
60
|
-
private
|
|
59
|
+
private initPromise: Promise<ModelStatic<M>> | null = null
|
|
61
60
|
|
|
62
61
|
private initializedModel?: ModelStatic<M>
|
|
63
62
|
|
|
@@ -65,10 +64,13 @@ export class SequelizeStore<
|
|
|
65
64
|
if (this.initializedModel) {
|
|
66
65
|
return this.initializedModel
|
|
67
66
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return this.initializedModel
|
|
67
|
+
if (!this.initPromise) {
|
|
68
|
+
this.initPromise = this.initializeModel()
|
|
71
69
|
}
|
|
70
|
+
return this.initPromise
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private async initializeModel(): Promise<ModelStatic<M>> {
|
|
72
74
|
try {
|
|
73
75
|
const client = this.options.getSequelizeClient()
|
|
74
76
|
|
|
@@ -79,10 +81,11 @@ export class SequelizeStore<
|
|
|
79
81
|
|
|
80
82
|
const model = client.model(this.options.sequelizeModel.name) as ModelStatic<M>
|
|
81
83
|
|
|
82
|
-
this.initializedModel =
|
|
84
|
+
this.initializedModel = model
|
|
83
85
|
return model
|
|
84
|
-
}
|
|
85
|
-
this.
|
|
86
|
+
} catch (error) {
|
|
87
|
+
this.initPromise = null
|
|
88
|
+
throw error
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
91
|
|