@live-change/filesystem-plugin 0.1.1 → 0.1.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 +1 -1
- package/index.js +42 -28
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
#
|
|
1
|
+
# filesystem-plugin
|
package/index.js
CHANGED
|
@@ -77,41 +77,47 @@ async function getContent(filename) {
|
|
|
77
77
|
return fs.promises.readFile(filename, { encoding: 'utf8' })
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
async function observableContent(filename) {
|
|
81
|
-
return observableFile(filename,
|
|
80
|
+
async function observableContent(filename, decoder = x=>x) {
|
|
81
|
+
return observableFile(filename,
|
|
82
|
+
(name, stat) => fs.promises.readFile(name, { encoding: 'utf8' })
|
|
83
|
+
.then(result => decoder(result))
|
|
84
|
+
)
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
const entryCompare = (a,b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0
|
|
85
88
|
|
|
86
|
-
async function getList(dir, filter) {
|
|
89
|
+
async function getList(dir, filter, mapper) {
|
|
87
90
|
const list = await fs.promises.readdir(dir, { withFileTypes: true })
|
|
88
|
-
|
|
91
|
+
let entries = await Promise.all(list.map(async entry => ({
|
|
89
92
|
name: entry.name,
|
|
90
93
|
isDirectory: entry.isDirectory(),
|
|
91
94
|
stat: await fs.promises.stat(path.resolve(dir, entry.name))
|
|
92
95
|
})))
|
|
93
|
-
|
|
96
|
+
if(mapper) entries = await Promise.all(entries.map(entry => mapper(entry)))
|
|
97
|
+
if(filter) entries = entries.filter(filter)
|
|
98
|
+
return entries.sort(entryCompare)
|
|
94
99
|
}
|
|
95
100
|
|
|
96
|
-
async function observableList(dir, filter) {
|
|
101
|
+
async function observableList(dir, filter, mapper) {
|
|
97
102
|
const observable = new Dao.ObservableList()
|
|
98
103
|
let watcher
|
|
99
104
|
const oldDispose = observable.dispose
|
|
100
105
|
const oldRespawn = observable.respawn
|
|
101
106
|
const watch = async () => {
|
|
102
107
|
if(watcher) watcher.close()
|
|
103
|
-
const list = await getList(dir, filter)
|
|
108
|
+
const list = await getList(dir, filter, mapper)
|
|
104
109
|
observable.set(list)
|
|
105
110
|
watcher = chokidar.watch(dir, { depth: 0, alwaysStat: true })
|
|
106
111
|
watcher.on('add', async (name, stat) => {
|
|
107
112
|
if(path.dirname(name) != dir) return
|
|
108
113
|
name = path.relative(dir, name)
|
|
109
|
-
|
|
114
|
+
let entry = {
|
|
110
115
|
name,
|
|
111
116
|
isDirectory: false,
|
|
112
117
|
stat
|
|
113
118
|
}
|
|
114
|
-
if(
|
|
119
|
+
if(mapper) entry = await mapper(entry)
|
|
120
|
+
if(filter && filter(entry)) observable.putByField('name', name, entry)
|
|
115
121
|
})
|
|
116
122
|
watcher.on('change', async (name, stat) => {
|
|
117
123
|
if(path.dirname(name) != dir) return
|
|
@@ -121,7 +127,8 @@ async function observableList(dir, filter) {
|
|
|
121
127
|
isDirectory: false,
|
|
122
128
|
stat
|
|
123
129
|
}
|
|
124
|
-
if(
|
|
130
|
+
if(mapper) entry = await mapper(entry)
|
|
131
|
+
if(filter && fitler(entry)) observable.putByField('name', name, entry)
|
|
125
132
|
})
|
|
126
133
|
watcher.on('unlink', async (name) => {
|
|
127
134
|
if(path.dirname(name) != dir) return
|
|
@@ -131,12 +138,13 @@ async function observableList(dir, filter) {
|
|
|
131
138
|
watcher.on('addDir', async (name, stat) => {
|
|
132
139
|
if(path.dirname(name) != dir) return
|
|
133
140
|
name = path.relative(dir, name)
|
|
134
|
-
|
|
141
|
+
let entry = {
|
|
135
142
|
name,
|
|
136
143
|
isDirectory: true,
|
|
137
144
|
stat
|
|
138
145
|
}
|
|
139
|
-
if(
|
|
146
|
+
if(mapper) entry = await mapper(entry)
|
|
147
|
+
if(filter && filter(entry)) observable.putByField('name', name, entry)
|
|
140
148
|
})
|
|
141
149
|
watcher.on('unlinkDir', async (name, stat) => {
|
|
142
150
|
if(path.dirname(name) != dir) return
|
|
@@ -157,7 +165,7 @@ async function observableList(dir, filter) {
|
|
|
157
165
|
return observable
|
|
158
166
|
}
|
|
159
167
|
|
|
160
|
-
async function getTree(dir, prefix = '', filter) {
|
|
168
|
+
async function getTree(dir, prefix = '', filter, mapper) {
|
|
161
169
|
const list = await fs.promises.readdir(dir, { withFileTypes: true })
|
|
162
170
|
const entriesLists = await Promise.all(list.map(async entry => {
|
|
163
171
|
if(entry.isDirectory()) {
|
|
@@ -175,38 +183,43 @@ async function getTree(dir, prefix = '', filter) {
|
|
|
175
183
|
}
|
|
176
184
|
}
|
|
177
185
|
}))
|
|
178
|
-
|
|
186
|
+
let entries = entriesLists.flat()
|
|
187
|
+
if(mapper) entries = await Promise.all(entries.map(entry => mapper(entry)))
|
|
188
|
+
if(filter) entries = entries.filter(filter)
|
|
189
|
+
return entries.sort(entryCompare)
|
|
179
190
|
}
|
|
180
191
|
|
|
181
|
-
async function observableTree(dir, filter) {
|
|
192
|
+
async function observableTree(dir, filter, mapper) {
|
|
182
193
|
const observable = new Dao.ObservableList()
|
|
183
194
|
let watcher
|
|
184
195
|
const oldDispose = observable.dispose
|
|
185
196
|
const oldRespawn = observable.respawn
|
|
186
197
|
const watch = async () => {
|
|
187
198
|
if(watcher) watcher.close()
|
|
188
|
-
const list = await getTree(dir, filter)
|
|
199
|
+
const list = await getTree(dir, filter, mapper)
|
|
189
200
|
observable.set(list)
|
|
190
201
|
watcher = chokidar.watch(dir, { depth: 99, alwaysStat: true })
|
|
191
202
|
watcher.on('add', async (name, stat) => {
|
|
192
203
|
if(path.dirname(name) != dir) return
|
|
193
204
|
name = path.relative(dir, name)
|
|
194
|
-
|
|
205
|
+
let entry = {
|
|
195
206
|
name,
|
|
196
207
|
isDirectory: false,
|
|
197
208
|
stat
|
|
198
209
|
}
|
|
199
|
-
if(
|
|
210
|
+
if(mapper) entry = await mapper(entry)
|
|
211
|
+
if(filter && filter(entry)) observable.putByField('name', name, entry)
|
|
200
212
|
})
|
|
201
213
|
watcher.on('change', async (name, stat) => {
|
|
202
214
|
if(path.dirname(name) != dir) return
|
|
203
215
|
name = path.relative(dir, name)
|
|
204
|
-
|
|
216
|
+
let entry = {
|
|
205
217
|
name,
|
|
206
218
|
isDirectory: false,
|
|
207
219
|
stat
|
|
208
220
|
}
|
|
209
|
-
if(
|
|
221
|
+
if(mapper) entry = await mapper(entry)
|
|
222
|
+
if(filter && filter(entry)) observable.putByField('name', name, entry)
|
|
210
223
|
})
|
|
211
224
|
watcher.on('unlink', async (name) => {
|
|
212
225
|
if(path.dirname(name) != dir) return
|
|
@@ -216,12 +229,13 @@ async function observableTree(dir, filter) {
|
|
|
216
229
|
watcher.on('addDir', async (name, stat) => {
|
|
217
230
|
if(path.dirname(name) != dir) return
|
|
218
231
|
name = path.relative(dir, name)
|
|
219
|
-
|
|
232
|
+
let entry = {
|
|
220
233
|
name,
|
|
221
234
|
isDir: true,
|
|
222
235
|
stat
|
|
223
236
|
}
|
|
224
|
-
if(
|
|
237
|
+
if(mapper) entry = await mapper(entry)
|
|
238
|
+
if(filter && filter(entry)) observable.putByField('name', name, entry)
|
|
225
239
|
})
|
|
226
240
|
watcher.on('unlinkDir', async (name, stat) => {
|
|
227
241
|
if(path.dirname(name) != dir) return
|
|
@@ -249,16 +263,16 @@ const filesystemDao = new Dao.SimpleDao({
|
|
|
249
263
|
observable: (filename) => observableStat(filename)
|
|
250
264
|
},
|
|
251
265
|
content: {
|
|
252
|
-
get: (filename) => getContent(filename),
|
|
253
|
-
observable: (filename) => observableContent(filename)
|
|
266
|
+
get: (filename, decoder = x=>x ) => getContent(filename, decoder),
|
|
267
|
+
observable: (filename, decoder = x=>x ) => observableContent(filename, decoder)
|
|
254
268
|
},
|
|
255
269
|
list: {
|
|
256
|
-
get: (dir, filterSpec) => getList(dir, createFilter(filterSpec)),
|
|
257
|
-
observable: (dir, filterSpec) => observableList(dir, createFilter(filterSpec))
|
|
270
|
+
get: (dir, filterSpec, mapper) => getList(dir, createFilter(filterSpec), mapper),
|
|
271
|
+
observable: (dir, filterSpec, mapper) => observableList(dir, createFilter(filterSpec), mapper)
|
|
258
272
|
},
|
|
259
273
|
tree: {
|
|
260
|
-
get: (dir, filterSpec) => getTree(dir, '', createFilter(filterSpec)),
|
|
261
|
-
observable: (dir, filterSpec) => observableTree(dir, createFilter(filterSpec))
|
|
274
|
+
get: (dir, filterSpec, mapper) => getTree(dir, '', createFilter(filterSpec), mapper),
|
|
275
|
+
observable: (dir, filterSpec, mapper) => observableTree(dir, createFilter(filterSpec), mapper)
|
|
262
276
|
}
|
|
263
277
|
},
|
|
264
278
|
methods: {}
|