better code
Massimo Melina committed
Dec 28, 2021 at 12:14 UTC
1ce2a4e1c3ae5019b320f6415a8493fbe751abf3
2 files changed
+19
-12
src/vfs.ts
+13
-10
@@ -1,7 +1,7 @@
1
import fs from 'fs/promises'
2
import { basename } from 'path'
3
import { isMatch } from 'micromatch'
4
-import { complySlashes, enforceFinal, prefix } from './misc'
4
+import { complySlashes, enforceFinal, prefix, wantArray } from './misc'
5
import { getCurrentUsernameExpanded } from './perm'
6
import Koa from 'koa'
7
import glob from 'fast-glob'
@@ -15,7 +15,7 @@ export enum VfsNodeType {
15
16
export interface VfsNode {
17
type?: VfsNodeType,
18
- name?: string,
18
+ name: string,
19
source?: string,
20
children?: VfsNode[],
21
hide?: string | string[],
@@ -29,16 +29,12 @@ export interface VfsNode {
29
30
type SinglePerm = 'r' | 'w'
31
32
-const EMPTY = { type: VfsNodeType.root }
32
+const EMPTY = { name:'', type: VfsNodeType.root }
33
34
export const MIME_AUTO = 'auto'
35
36
export class Vfs {
37
- root: VfsNode = EMPTY
38
-
39
- constructor() {
40
- this.reset()
41
- }
37
+ root: VfsNode = { ...EMPTY }
38
39
reset(){
40
this.root = { ...EMPTY }
@@ -62,8 +58,15 @@ export class Vfs {
58
const relativeSource = piece + prefix('/', rest.join('/'))
59
const baseSource = run.source+ '/'
60
const source = baseSource + relativeSource
65
- const removed = isMatch(source, [run.remove].flat().map(x => baseSource + x))
66
- return removed || !await fs.stat(source) ? undefined : { source, mime: run.mime || (run.default && MIME_AUTO) }
61
+ if (isMatch(source, wantArray(run.remove).map(x => baseSource + x)))
62
+ return
63
+ try { await fs.stat(source) } // check existence
64
+ catch(e){ return }
65
+ return {
66
+ source,
67
+ name: basename(source),
68
+ mime: run.mime || (run.default && MIME_AUTO)
69
+ }
70
}
71
return run
72
}
tests/test.ts
+6
-2
@@ -7,6 +7,10 @@ process.chdir('..')
7
const appStarted = new Promise(resolve =>
8
srv.on( 'app_started', resolve) )
9
*/
10
+
11
+const user = 'rejetto'
12
+const password = 'password'
13
+
14
describe('basics', () => {
15
//before(async () => appStarted)
16
it('frontend', req('/', s => s.includes('<body>')))
@@ -24,14 +28,14 @@ describe('basics', () => {
28
it('missing perm', req('/for-admins/', 404))
29
it('proxy', req('/proxy', s => s.includes('github')))
30
it('login', req('/~/api/login', 200, {
27
- data: { user:'rejetto', password:'password' }
31
+ data: { user, password }
32
}))
33
})
34
35
let cookie:any
36
describe('after-login', () => {
37
before(req('/~/api/login', (data, res) => Boolean(cookie = res.headers['set-cookie']), {
34
- data: { user: 'rejetto', password: 'password' }
38
+ data: { user, password }
39
}))
40
it('list protected', done => // defer execution of req() to have cookie set
41
req('/~/api/file_list', data => inList(data, 'alfa.txt'), {