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'), {