@furystack/filesystem-store 6.0.1 → 6.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.
|
@@ -3,10 +3,22 @@
|
|
|
3
3
|
import { promises } from 'fs';
|
|
4
4
|
import type { Constructable } from '@furystack/inject';
|
|
5
5
|
import type { PhysicalStore, FindOptions, FilterType } from '@furystack/core';
|
|
6
|
+
import { EventHub } from '@furystack/utils';
|
|
6
7
|
/**
|
|
7
8
|
* Store implementation that stores info in a simple JSON file
|
|
8
9
|
*/
|
|
9
|
-
export declare class FileSystemStore<T, TPrimaryKey extends keyof T>
|
|
10
|
+
export declare class FileSystemStore<T, TPrimaryKey extends keyof T> extends EventHub<{
|
|
11
|
+
onEntityAdded: {
|
|
12
|
+
entity: T;
|
|
13
|
+
};
|
|
14
|
+
onEntityUpdated: {
|
|
15
|
+
id: T[TPrimaryKey];
|
|
16
|
+
change: Partial<T>;
|
|
17
|
+
};
|
|
18
|
+
onEntityRemoved: {
|
|
19
|
+
key: T[TPrimaryKey];
|
|
20
|
+
};
|
|
21
|
+
}> implements PhysicalStore<T, TPrimaryKey, T> {
|
|
10
22
|
private readonly options;
|
|
11
23
|
private readonly watcher?;
|
|
12
24
|
readonly model: Constructable<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-store.d.ts","sourceRoot":"","sources":["../src/filesystem-store.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,QAAQ,EAAS,MAAM,IAAI,CAAA;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"filesystem-store.d.ts","sourceRoot":"","sources":["../src/filesystem-store.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,QAAQ,EAAS,MAAM,IAAI,CAAA;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,CACzD,SAAQ,QAAQ,CAAC;IACf,aAAa,EAAE;QAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAA;IAC5B,eAAe,EAAE;QAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CAAA;IAC3D,eAAe,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;KAAE,CAAA;CACzC,CACD,YAAW,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAuGzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IArG1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAW;IAEpC,SAAgB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IAEvC,SAAgB,UAAU,EAAE,WAAW,CAAA;IAEvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAE7D,OAAO,KAAK,KAAK,GAEhB;IAEY,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAA;IACpC,UAAU,UAAQ;IACZ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAMhD,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE;IAQnB,IAAI,CAAC,OAAO,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IAMpE,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAMzC,OAAO,CAAC,QAAQ,CAAa;IAChB,WAAW;IAiBX,OAAO;IAMP,UAAU;IAmBV,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC;IAOxC,QAAQ,2BAAoB;IAC5B,SAAS,4BAAqB;gBAGlB,OAAO,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,WAAW,CAAA;QACvB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;KACxB;CA2BJ"}
|
package/esm/filesystem-store.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { promises, watch } from 'fs';
|
|
2
2
|
import { Lock } from 'semaphore-async-await';
|
|
3
3
|
import { InMemoryStore } from '@furystack/core';
|
|
4
|
+
import { EventHub } from '@furystack/utils';
|
|
4
5
|
/**
|
|
5
6
|
* Store implementation that stores info in a simple JSON file
|
|
6
7
|
*/
|
|
7
|
-
export class FileSystemStore {
|
|
8
|
+
export class FileSystemStore extends EventHub {
|
|
8
9
|
options;
|
|
9
10
|
watcher;
|
|
10
11
|
model;
|
|
@@ -95,11 +96,21 @@ export class FileSystemStore {
|
|
|
95
96
|
readFile = promises.readFile;
|
|
96
97
|
writeFile = promises.writeFile;
|
|
97
98
|
constructor(options) {
|
|
99
|
+
super();
|
|
98
100
|
this.options = options;
|
|
99
101
|
this.primaryKey = options.primaryKey;
|
|
100
102
|
this.model = options.model;
|
|
101
103
|
this.inMemoryStore = new InMemoryStore({ model: this.model, primaryKey: this.primaryKey });
|
|
102
104
|
this.tick = setInterval(() => this.saveChanges(), this.options.tickMs || 3000);
|
|
105
|
+
this.inMemoryStore.subscribe('onEntityAdded', ({ entity }) => {
|
|
106
|
+
this.emit('onEntityAdded', { entity });
|
|
107
|
+
});
|
|
108
|
+
this.inMemoryStore.subscribe('onEntityUpdated', ({ id, change }) => {
|
|
109
|
+
this.emit('onEntityUpdated', { id, change });
|
|
110
|
+
});
|
|
111
|
+
this.inMemoryStore.subscribe('onEntityRemoved', ({ key }) => {
|
|
112
|
+
this.emit('onEntityRemoved', { key });
|
|
113
|
+
});
|
|
103
114
|
try {
|
|
104
115
|
this.reloadData();
|
|
105
116
|
this.watcher = watch(this.options.fileName, { encoding: 'buffer' }, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem-store.js","sourceRoot":"","sources":["../src/filesystem-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,IAAI,CAAA;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"filesystem-store.js","sourceRoot":"","sources":["../src/filesystem-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/filesystem-store",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.2",
|
|
4
4
|
"description": "Simple File System store implementation for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -37,15 +37,15 @@
|
|
|
37
37
|
},
|
|
38
38
|
"homepage": "https://github.com/furystack/furystack",
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@furystack/core": "^14.0.
|
|
41
|
-
"@furystack/inject": "^11.0.
|
|
42
|
-
"@furystack/utils": "^
|
|
40
|
+
"@furystack/core": "^14.0.2",
|
|
41
|
+
"@furystack/inject": "^11.0.1",
|
|
42
|
+
"@furystack/utils": "^7.0.0",
|
|
43
43
|
"semaphore-async-await": "^1.5.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/node": "^20.
|
|
47
|
-
"typescript": "^5.4.
|
|
48
|
-
"vitest": "^1.
|
|
46
|
+
"@types/node": "^20.12.7",
|
|
47
|
+
"typescript": "^5.4.5",
|
|
48
|
+
"vitest": "^1.5.0"
|
|
49
49
|
},
|
|
50
50
|
"gitHead": "1045d854bfd8c475b7035471d130d401417a2321"
|
|
51
51
|
}
|
package/src/filesystem-store.ts
CHANGED
|
@@ -4,11 +4,19 @@ import type { Constructable } from '@furystack/inject'
|
|
|
4
4
|
import { Lock } from 'semaphore-async-await'
|
|
5
5
|
import type { PhysicalStore, FindOptions, FilterType } from '@furystack/core'
|
|
6
6
|
import { InMemoryStore } from '@furystack/core'
|
|
7
|
+
import { EventHub } from '@furystack/utils'
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Store implementation that stores info in a simple JSON file
|
|
10
11
|
*/
|
|
11
|
-
export class FileSystemStore<T, TPrimaryKey extends keyof T>
|
|
12
|
+
export class FileSystemStore<T, TPrimaryKey extends keyof T>
|
|
13
|
+
extends EventHub<{
|
|
14
|
+
onEntityAdded: { entity: T }
|
|
15
|
+
onEntityUpdated: { id: T[TPrimaryKey]; change: Partial<T> }
|
|
16
|
+
onEntityRemoved: { key: T[TPrimaryKey] }
|
|
17
|
+
}>
|
|
18
|
+
implements PhysicalStore<T, TPrimaryKey, T>
|
|
19
|
+
{
|
|
12
20
|
private readonly watcher?: FSWatcher
|
|
13
21
|
|
|
14
22
|
public readonly model: Constructable<T>
|
|
@@ -117,11 +125,22 @@ export class FileSystemStore<T, TPrimaryKey extends keyof T> implements Physical
|
|
|
117
125
|
model: Constructable<T>
|
|
118
126
|
},
|
|
119
127
|
) {
|
|
128
|
+
super()
|
|
120
129
|
this.primaryKey = options.primaryKey
|
|
121
130
|
this.model = options.model
|
|
122
131
|
this.inMemoryStore = new InMemoryStore({ model: this.model, primaryKey: this.primaryKey })
|
|
123
132
|
this.tick = setInterval(() => this.saveChanges(), this.options.tickMs || 3000)
|
|
124
133
|
|
|
134
|
+
this.inMemoryStore.subscribe('onEntityAdded', ({ entity }) => {
|
|
135
|
+
this.emit('onEntityAdded', { entity })
|
|
136
|
+
})
|
|
137
|
+
this.inMemoryStore.subscribe('onEntityUpdated', ({ id, change }) => {
|
|
138
|
+
this.emit('onEntityUpdated', { id, change })
|
|
139
|
+
})
|
|
140
|
+
this.inMemoryStore.subscribe('onEntityRemoved', ({ key }) => {
|
|
141
|
+
this.emit('onEntityRemoved', { key })
|
|
142
|
+
})
|
|
143
|
+
|
|
125
144
|
try {
|
|
126
145
|
this.reloadData()
|
|
127
146
|
this.watcher = watch(this.options.fileName, { encoding: 'buffer' }, () => {
|