@davidsouther/jiffies 1.1.0 → 2.0.0
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/{build → lib/cjs}/assert.d.ts +23 -23
- package/lib/cjs/assert.js +40 -0
- package/{build → lib/cjs}/case.d.ts +1 -1
- package/lib/cjs/case.js +9 -0
- package/{build → lib/cjs}/components/button_bar.d.ts +8 -8
- package/lib/cjs/components/button_bar.js +29 -0
- package/{build → lib/cjs}/components/inline_edit.d.ts +12 -12
- package/lib/cjs/components/inline_edit.js +51 -0
- package/{build → lib/cjs}/components/logger.d.ts +6 -6
- package/lib/cjs/components/logger.js +27 -0
- package/lib/cjs/components/select.d.ts +10 -0
- package/lib/cjs/components/select.js +6 -0
- package/lib/cjs/components/test.d.ts +1 -0
- package/lib/cjs/components/test.js +7 -0
- package/{build → lib/cjs}/components/virtual_scroll.d.ts +40 -40
- package/lib/cjs/components/virtual_scroll.js +102 -0
- package/{build → lib/cjs}/components/virtual_scroll.test.d.ts +1 -1
- package/lib/cjs/components/virtual_scroll.test.js +22 -0
- package/{build → lib/cjs}/context.d.ts +15 -15
- package/lib/cjs/context.js +48 -0
- package/{build → lib/cjs}/context.test.d.ts +1 -1
- package/lib/cjs/context.test.js +48 -0
- package/{build → lib/cjs}/debounce.d.ts +1 -1
- package/lib/cjs/debounce.js +11 -0
- package/lib/cjs/diff.d.ts +15 -0
- package/lib/cjs/diff.js +58 -0
- package/{build/components/test.d.ts → lib/cjs/diff.test.d.ts} +1 -1
- package/lib/cjs/diff.test.js +41 -0
- package/{build → lib/cjs}/display.d.ts +5 -5
- package/lib/cjs/display.js +16 -0
- package/{build → lib/cjs}/dom/css/border.d.ts +11 -11
- package/lib/cjs/dom/css/border.js +33 -0
- package/{build → lib/cjs}/dom/css/constants.d.ts +31 -31
- package/lib/cjs/dom/css/constants.js +31 -0
- package/{build → lib/cjs}/dom/css/core.d.ts +5 -5
- package/lib/cjs/dom/css/core.js +31 -0
- package/{build → lib/cjs}/dom/css/fstyle.d.ts +5 -5
- package/lib/cjs/dom/css/fstyle.js +36 -0
- package/{build → lib/cjs}/dom/css/sizing.d.ts +5 -5
- package/lib/cjs/dom/css/sizing.js +14 -0
- package/{build → lib/cjs}/dom/dom.d.ts +27 -26
- package/lib/cjs/dom/dom.js +110 -0
- package/{build → lib/cjs}/dom/fc.d.ts +14 -14
- package/lib/cjs/dom/fc.js +39 -0
- package/{build → lib/cjs}/dom/fc.test.d.ts +1 -1
- package/lib/cjs/dom/fc.test.js +23 -0
- package/{build → lib/cjs}/dom/form/form.app.d.ts +1 -1
- package/lib/cjs/dom/form/form.app.js +27 -0
- package/{build → lib/cjs}/dom/form/form.d.ts +26 -26
- package/lib/cjs/dom/form/form.js +49 -0
- package/{build → lib/cjs}/dom/form/form.test.d.ts +0 -0
- package/{build → lib/cjs}/dom/form/form.test.js +1 -1
- package/{build → lib/cjs}/dom/html.d.ts +113 -113
- package/lib/cjs/dom/html.js +119 -0
- package/{build → lib/cjs}/dom/html.test.d.ts +1 -1
- package/lib/cjs/dom/html.test.js +60 -0
- package/lib/cjs/dom/observable.d.ts +2 -0
- package/lib/cjs/dom/observable.js +10 -0
- package/{build/observable → lib/cjs/dom}/observable.test.d.ts +1 -1
- package/lib/cjs/dom/observable.test.js +35 -0
- package/{build → lib/cjs}/dom/provide.d.ts +3 -3
- package/lib/cjs/dom/provide.js +12 -0
- package/{build → lib/cjs}/dom/router/link.d.ts +6 -6
- package/lib/cjs/dom/router/link.js +7 -0
- package/{build → lib/cjs}/dom/router/router.d.ts +12 -12
- package/lib/cjs/dom/router/router.js +52 -0
- package/{build → lib/cjs}/dom/svg.d.ts +64 -64
- package/lib/cjs/dom/svg.js +69 -0
- package/lib/cjs/dom/test.d.ts +1 -0
- package/lib/cjs/dom/test.js +13 -0
- package/{build → lib/cjs}/dom/types/css.d.ts +6612 -6612
- package/lib/cjs/dom/types/css.js +24 -0
- package/{build → lib/cjs}/dom/types/dom.d.ts +0 -0
- package/{build → lib/cjs}/dom/types/dom.js +1 -1
- package/{build → lib/cjs}/dom/types/html.d.ts +616 -616
- package/lib/cjs/dom/types/html.js +2 -0
- package/{build → lib/cjs}/dom/xml.d.ts +1 -1
- package/lib/cjs/dom/xml.js +8 -0
- package/{build → lib/cjs}/equal.d.ts +5 -5
- package/lib/cjs/equal.js +43 -0
- package/{build → lib/cjs}/equal.test.d.ts +1 -1
- package/lib/cjs/equal.test.js +22 -0
- package/{build → lib/cjs}/flags.d.ts +7 -7
- package/lib/cjs/flags.js +52 -0
- package/{build → lib/cjs}/flags.test.d.ts +1 -1
- package/lib/cjs/flags.test.js +37 -0
- package/{build → lib/cjs}/fs.d.ts +48 -48
- package/lib/cjs/fs.js +151 -0
- package/{build → lib/cjs}/fs.test.d.ts +1 -1
- package/lib/cjs/fs.test.js +45 -0
- package/{build → lib/cjs}/generator.d.ts +1 -1
- package/lib/cjs/generator.js +14 -0
- package/{build → lib/cjs}/generator.test.d.ts +1 -1
- package/lib/cjs/generator.test.js +26 -0
- package/{build → lib/cjs}/is_browser.d.ts +1 -1
- package/lib/cjs/is_browser.js +4 -0
- package/{build → lib/cjs}/loader.d.mts +22 -22
- package/lib/cjs/loader.mjs +40 -0
- package/{build → lib/cjs}/lock.d.ts +1 -1
- package/lib/cjs/lock.js +27 -0
- package/{build → lib/cjs}/lock.test.d.ts +1 -1
- package/lib/cjs/lock.test.js +18 -0
- package/{build → lib/cjs}/log.d.ts +26 -26
- package/lib/cjs/log.js +54 -0
- package/lib/cjs/observable/event.d.ts +35 -0
- package/lib/cjs/observable/event.js +61 -0
- package/lib/cjs/observable/observable.d.ts +132 -0
- package/lib/cjs/observable/observable.js +363 -0
- package/lib/cjs/observable/observable.test.d.ts +1 -0
- package/lib/cjs/observable/observable.test.js +65 -0
- package/{build → lib/cjs}/range.d.ts +1 -1
- package/lib/cjs/range.js +11 -0
- package/{build → lib/cjs}/result.d.ts +31 -31
- package/lib/cjs/result.js +80 -0
- package/{build → lib/cjs}/result.test.d.ts +1 -1
- package/lib/cjs/result.test.js +73 -0
- package/{build → lib/cjs}/safe.d.ts +1 -1
- package/lib/cjs/safe.js +14 -0
- package/{build → lib/cjs}/scope/describe.d.ts +18 -18
- package/lib/cjs/scope/describe.js +73 -0
- package/{build → lib/cjs}/scope/display/console.d.ts +2 -2
- package/lib/cjs/scope/display/console.js +25 -0
- package/{build → lib/cjs}/scope/display/dom.d.ts +3 -3
- package/lib/cjs/scope/display/dom.js +30 -0
- package/{build → lib/cjs}/scope/display/junit.d.ts +2 -2
- package/lib/cjs/scope/display/junit.js +21 -0
- package/{build → lib/cjs}/scope/execute.d.ts +12 -12
- package/lib/cjs/scope/execute.js +91 -0
- package/{build → lib/cjs}/scope/expect.d.ts +23 -23
- package/lib/cjs/scope/expect.js +114 -0
- package/{build → lib/cjs}/scope/fix.d.ts +4 -4
- package/lib/cjs/scope/fix.js +26 -0
- package/{build → lib/cjs}/scope/index.d.ts +3 -3
- package/lib/cjs/scope/index.js +15 -0
- package/{build → lib/cjs}/scope/scope.d.ts +17 -17
- package/lib/cjs/scope/scope.js +2 -0
- package/lib/cjs/scope/state.d.ts +1 -0
- package/lib/cjs/scope/state.js +11 -0
- package/{build → lib/cjs}/server/http/apps.d.ts +5 -5
- package/lib/cjs/server/http/apps.js +27 -0
- package/{build → lib/cjs}/server/http/css.d.ts +5 -5
- package/lib/cjs/server/http/css.js +54 -0
- package/{build → lib/cjs}/server/http/index.d.ts +21 -21
- package/lib/cjs/server/http/index.js +77 -0
- package/{build → lib/cjs}/server/http/response.d.ts +4 -4
- package/lib/cjs/server/http/response.js +45 -0
- package/{build → lib/cjs}/server/http/sitemap.d.ts +2 -2
- package/lib/cjs/server/http/sitemap.js +46 -0
- package/{build → lib/cjs}/server/http/static.d.ts +2 -2
- package/lib/cjs/server/http/static.js +25 -0
- package/{build → lib/cjs}/server/http/typescript.d.ts +5 -5
- package/lib/cjs/server/http/typescript.js +44 -0
- package/{build → lib/cjs}/server/main.d.ts +2 -2
- package/lib/cjs/server/main.js +14 -0
- package/{build → lib/cjs}/test.d.mts +2 -2
- package/lib/cjs/test.mjs +28 -0
- package/{build → lib/cjs}/test_all.d.ts +9 -7
- package/lib/cjs/test_all.js +30 -0
- package/{build → lib/cjs}/transpile.d.mts +3 -3
- package/lib/cjs/transpile.mjs +22 -0
- package/lib/cjs/tsconfig.tsbuildinfo +1 -0
- package/lib/esm/assert.d.ts +23 -0
- package/{build → lib/esm}/assert.js +33 -33
- package/lib/esm/case.d.ts +1 -0
- package/{build → lib/esm}/case.js +5 -5
- package/lib/esm/components/button_bar.d.ts +8 -0
- package/{build → lib/esm}/components/button_bar.js +27 -27
- package/lib/esm/components/inline_edit.d.ts +12 -0
- package/{build → lib/esm}/components/inline_edit.js +48 -48
- package/lib/esm/components/logger.d.ts +6 -0
- package/{build → lib/esm}/components/logger.js +22 -22
- package/lib/esm/components/select.d.ts +10 -0
- package/{build → lib/esm}/components/select.js +3 -3
- package/lib/esm/components/test.d.ts +1 -0
- package/lib/esm/components/test.js +3 -0
- package/lib/esm/components/virtual_scroll.d.ts +40 -0
- package/{build → lib/esm}/components/virtual_scroll.js +94 -94
- package/lib/esm/components/virtual_scroll.test.d.ts +1 -0
- package/{build → lib/esm}/components/virtual_scroll.test.js +20 -21
- package/lib/esm/context.d.ts +15 -0
- package/{build → lib/esm}/context.js +43 -43
- package/lib/esm/context.test.d.ts +1 -0
- package/{build → lib/esm}/context.test.js +46 -46
- package/lib/esm/debounce.d.ts +1 -0
- package/{build → lib/esm}/debounce.js +7 -7
- package/lib/esm/diff.d.ts +15 -0
- package/lib/esm/diff.js +54 -0
- package/lib/esm/diff.test.d.ts +1 -0
- package/lib/esm/diff.test.js +39 -0
- package/lib/esm/display.d.ts +5 -0
- package/{build → lib/esm}/display.js +11 -11
- package/lib/esm/dom/css/border.d.ts +11 -0
- package/{build → lib/esm}/dom/css/border.js +27 -27
- package/lib/esm/dom/css/constants.d.ts +31 -0
- package/{build → lib/esm}/dom/css/constants.js +28 -28
- package/lib/esm/dom/css/core.d.ts +5 -0
- package/{build → lib/esm}/dom/css/core.js +24 -24
- package/lib/esm/dom/css/fstyle.d.ts +5 -0
- package/{build → lib/esm}/dom/css/fstyle.js +32 -32
- package/lib/esm/dom/css/sizing.d.ts +5 -0
- package/{build → lib/esm}/dom/css/sizing.js +10 -10
- package/lib/esm/dom/dom.d.ts +27 -0
- package/{build → lib/esm}/dom/dom.js +104 -95
- package/lib/esm/dom/fc.d.ts +14 -0
- package/{build → lib/esm}/dom/fc.js +35 -36
- package/lib/esm/dom/fc.test.d.ts +1 -0
- package/{build → lib/esm}/dom/fc.test.js +21 -21
- package/lib/esm/dom/form/form.app.d.ts +1 -0
- package/{build → lib/esm}/dom/form/form.app.js +23 -23
- package/lib/esm/dom/form/form.d.ts +26 -0
- package/{build → lib/esm}/dom/form/form.js +34 -34
- package/lib/esm/dom/form/form.test.d.ts +0 -0
- package/lib/esm/dom/form/form.test.js +1 -0
- package/lib/esm/dom/html.d.ts +113 -0
- package/{build → lib/esm}/dom/html.js +114 -114
- package/lib/esm/dom/html.test.d.ts +1 -0
- package/{build → lib/esm}/dom/html.test.js +58 -58
- package/lib/esm/dom/observable.d.ts +2 -0
- package/lib/esm/dom/observable.js +6 -0
- package/lib/esm/dom/observable.test.d.ts +1 -0
- package/lib/esm/dom/observable.test.js +33 -0
- package/lib/esm/dom/provide.d.ts +3 -0
- package/{build → lib/esm}/dom/provide.js +7 -7
- package/lib/esm/dom/router/link.d.ts +6 -0
- package/{build → lib/esm}/dom/router/link.js +3 -3
- package/lib/esm/dom/router/router.d.ts +12 -0
- package/{build → lib/esm}/dom/router/router.js +49 -49
- package/lib/esm/dom/svg.d.ts +64 -0
- package/{build → lib/esm}/dom/svg.js +65 -65
- package/lib/esm/dom/test.d.ts +1 -0
- package/lib/esm/dom/test.js +9 -0
- package/lib/esm/dom/types/css.d.ts +6612 -0
- package/{build → lib/esm}/dom/types/css.js +23 -23
- package/lib/esm/dom/types/dom.d.ts +0 -0
- package/lib/esm/dom/types/dom.js +1 -0
- package/lib/esm/dom/types/html.d.ts +616 -0
- package/{build → lib/esm}/dom/types/html.js +1 -1
- package/lib/esm/dom/xml.d.ts +1 -0
- package/{build → lib/esm}/dom/xml.js +4 -4
- package/lib/esm/equal.d.ts +5 -0
- package/{build → lib/esm}/equal.js +37 -37
- package/lib/esm/equal.test.d.ts +1 -0
- package/{build → lib/esm}/equal.test.js +20 -20
- package/lib/esm/flags.d.ts +7 -0
- package/{build → lib/esm}/flags.js +48 -48
- package/lib/esm/flags.test.d.ts +1 -0
- package/{build → lib/esm}/flags.test.js +35 -35
- package/lib/esm/fs.d.ts +48 -0
- package/{build → lib/esm}/fs.js +144 -144
- package/lib/esm/fs.test.d.ts +1 -0
- package/{build → lib/esm}/fs.test.js +43 -43
- package/lib/esm/generator.d.ts +1 -0
- package/{build → lib/esm}/generator.js +10 -10
- package/lib/esm/generator.test.d.ts +1 -0
- package/{build → lib/esm}/generator.test.js +24 -24
- package/lib/esm/is_browser.d.ts +1 -0
- package/{build → lib/esm}/is_browser.js +1 -1
- package/lib/esm/loader.d.mts +22 -0
- package/{build → lib/esm}/loader.mjs +35 -35
- package/lib/esm/lock.d.ts +1 -0
- package/{build → lib/esm}/lock.js +23 -23
- package/lib/esm/lock.test.d.ts +1 -0
- package/{build → lib/esm}/lock.test.js +16 -16
- package/lib/esm/log.d.ts +26 -0
- package/{build → lib/esm}/log.js +46 -46
- package/lib/esm/observable/event.d.ts +35 -0
- package/lib/esm/observable/event.js +46 -0
- package/lib/esm/observable/observable.d.ts +132 -0
- package/lib/esm/observable/observable.js +343 -0
- package/lib/esm/observable/observable.test.d.ts +1 -0
- package/lib/esm/observable/observable.test.js +63 -0
- package/lib/esm/range.d.ts +1 -0
- package/{build → lib/esm}/range.js +7 -7
- package/lib/esm/result.d.ts +31 -0
- package/{build → lib/esm}/result.js +65 -65
- package/lib/esm/result.test.d.ts +1 -0
- package/{build → lib/esm}/result.test.js +71 -71
- package/lib/esm/safe.d.ts +1 -0
- package/{build → lib/esm}/safe.js +10 -10
- package/lib/esm/scope/describe.d.ts +18 -0
- package/{build → lib/esm}/scope/describe.js +60 -61
- package/lib/esm/scope/display/console.d.ts +2 -0
- package/{build → lib/esm}/scope/display/console.js +21 -21
- package/lib/esm/scope/display/dom.d.ts +3 -0
- package/{build → lib/esm}/scope/display/dom.js +26 -26
- package/lib/esm/scope/display/junit.d.ts +2 -0
- package/{build → lib/esm}/scope/display/junit.js +17 -17
- package/lib/esm/scope/execute.d.ts +12 -0
- package/{build → lib/esm}/scope/execute.js +85 -85
- package/lib/esm/scope/expect.d.ts +23 -0
- package/{build → lib/esm}/scope/expect.js +108 -108
- package/lib/esm/scope/fix.d.ts +4 -0
- package/{build → lib/esm}/scope/fix.js +22 -22
- package/lib/esm/scope/index.d.ts +3 -0
- package/{build → lib/esm}/scope/index.js +3 -3
- package/lib/esm/scope/scope.d.ts +17 -0
- package/{build → lib/esm}/scope/scope.js +1 -1
- package/lib/esm/scope/state.d.ts +1 -0
- package/lib/esm/scope/state.js +7 -0
- package/lib/esm/server/http/apps.d.ts +5 -0
- package/{build → lib/esm}/server/http/apps.js +23 -23
- package/lib/esm/server/http/css.d.ts +5 -0
- package/{build → lib/esm}/server/http/css.js +50 -50
- package/lib/esm/server/http/index.d.ts +21 -0
- package/{build → lib/esm}/server/http/index.js +73 -73
- package/lib/esm/server/http/response.d.ts +4 -0
- package/{build → lib/esm}/server/http/response.js +40 -40
- package/lib/esm/server/http/sitemap.d.ts +2 -0
- package/{build → lib/esm}/server/http/sitemap.js +42 -42
- package/lib/esm/server/http/static.d.ts +2 -0
- package/{build → lib/esm}/server/http/static.js +21 -21
- package/lib/esm/server/http/typescript.d.ts +5 -0
- package/{build → lib/esm}/server/http/typescript.js +40 -40
- package/lib/esm/server/main.d.ts +2 -0
- package/{build → lib/esm}/server/main.js +12 -9
- package/lib/esm/test.d.mts +2 -0
- package/lib/esm/test.mjs +26 -0
- package/lib/esm/test_all.d.ts +9 -0
- package/{build → lib/esm}/test_all.js +28 -18
- package/lib/esm/transpile.d.mts +3 -0
- package/{build → lib/esm}/transpile.mjs +18 -18
- package/lib/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +13 -14
- package/src/assert.ts +1 -1
- package/src/components/button_bar.ts +3 -3
- package/src/components/inline_edit.ts +3 -3
- package/src/components/logger.ts +3 -3
- package/src/components/select.ts +3 -3
- package/src/components/test.js +3 -2
- package/src/context.ts +3 -3
- package/src/diff.ts +2 -2
- package/src/dom/css/border.ts +3 -3
- package/src/dom/css/core.ts +1 -1
- package/src/dom/css/fstyle.ts +2 -2
- package/src/dom/css/sizing.ts +1 -1
- package/src/dom/dom.ts +1 -1
- package/src/dom/fc.test.ts +3 -3
- package/src/dom/fc.ts +1 -1
- package/src/dom/form/form.app.ts +2 -2
- package/src/dom/form/form.ts +3 -3
- package/src/dom/html.test.ts +3 -3
- package/src/dom/html.ts +1 -1
- package/src/dom/observable.test.ts +6 -6
- package/src/dom/observable.ts +1 -1
- package/src/dom/provide.ts +1 -1
- package/src/dom/router/link.ts +2 -2
- package/src/dom/router/router.ts +2 -2
- package/src/dom/svg.ts +1 -1
- package/src/dom/test.ts +8 -6
- package/src/dom/types/html.ts +1 -1
- package/src/equal.ts +1 -1
- package/src/flags.ts +1 -1
- package/src/fs.ts +4 -4
- package/src/index.html +6 -6
- package/src/observable/event.ts +2 -2
- package/src/observable/observable.test.ts +2 -2
- package/src/observable/observable.ts +72 -12
- package/src/pico/_variables.scss +1 -1
- package/src/pico/layout/_sectioning.scss +2 -0
- package/src/result.ts +1 -1
- package/src/scope/describe.ts +2 -5
- package/src/scope/display/console.ts +4 -4
- package/src/scope/display/dom.ts +6 -6
- package/src/scope/display/junit.ts +3 -3
- package/src/scope/execute.ts +2 -2
- package/src/scope/expect.ts +3 -3
- package/src/scope/state.ts +10 -0
- package/src/server/http/sitemap.ts +1 -1
- package/src/server/main.ts +9 -2
- package/src/test.mjs +22 -18
- package/src/test_all.ts +10 -0
- package/build/components/select.d.ts +0 -13
- package/build/components/test.js +0 -2
- package/build/dom/test.d.ts +0 -1
- package/build/dom/test.js +0 -2
- package/build/observable/observable.d.ts +0 -83
- package/build/observable/observable.js +0 -148
- package/build/observable/observable.test.js +0 -21
- package/build/test.mjs +0 -23
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
import { afterall, aftereach, beforeall, beforeeach, rootCases, } from "./describe.js";
|
|
2
|
-
export async function execute(
|
|
3
|
-
const beforeallfn = cases[beforeall] ?? (() => { });
|
|
4
|
-
const beforeeachfn = cases[beforeeach] ?? (() => { });
|
|
5
|
-
const afterallfn = cases[afterall] ?? (() => { });
|
|
6
|
-
const aftereachfn = cases[aftereach] ?? (() => { });
|
|
7
|
-
const result = { executed: 0, passed: 0, failed: 0, total: 0 };
|
|
8
|
-
try {
|
|
9
|
-
await beforeallfn();
|
|
10
|
-
}
|
|
11
|
-
catch (e) {
|
|
12
|
-
result["_beforeAll"] = { error: e };
|
|
13
|
-
return result;
|
|
14
|
-
}
|
|
15
|
-
for (const [title, block] of Object.entries(cases)) {
|
|
16
|
-
if (typeof title === "symbol") {
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (block instanceof Function) {
|
|
20
|
-
try {
|
|
21
|
-
result.executed += 1;
|
|
22
|
-
await beforeeachfn();
|
|
23
|
-
await block();
|
|
24
|
-
await aftereachfn();
|
|
25
|
-
result.passed += 1;
|
|
26
|
-
result[title] = { passed: true };
|
|
27
|
-
}
|
|
28
|
-
catch (e) {
|
|
29
|
-
result.failed += 1;
|
|
30
|
-
result[title] = { error: /** @type Error */ e };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
else if (block) {
|
|
34
|
-
const run = await execute(
|
|
35
|
-
result.executed += run.executed;
|
|
36
|
-
result.passed += run.passed;
|
|
37
|
-
result.failed += run.failed;
|
|
38
|
-
result[title] = run;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
await afterallfn();
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
result["_afterAll"] = { error: e };
|
|
46
|
-
}
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
export function getError({ error }) {
|
|
50
|
-
if (typeof error == "string") {
|
|
51
|
-
return error;
|
|
52
|
-
}
|
|
53
|
-
else if (error.message) {
|
|
54
|
-
return error.stack;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return "unknown error";
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function makeResult(test, result) {
|
|
61
|
-
if (result.error)
|
|
62
|
-
return [
|
|
63
|
-
{
|
|
64
|
-
test,
|
|
65
|
-
stack: getError(result),
|
|
66
|
-
stats: { executed: 1, failed: 1 },
|
|
67
|
-
},
|
|
68
|
-
];
|
|
69
|
-
if (result.passed === true) {
|
|
70
|
-
return [{ test, stats: { executed: 1, failed: 0 } }];
|
|
71
|
-
}
|
|
72
|
-
return flattenResults(result, test);
|
|
73
|
-
}
|
|
74
|
-
export function flattenResults(results, prefix = "") {
|
|
75
|
-
const arrow = prefix == "" ? "" : " -> ";
|
|
76
|
-
let errorList = [];
|
|
77
|
-
for (const [title, result] of Object.entries(results).filter(([key]) => !["executed", "passed", "failed"].includes(key))) {
|
|
78
|
-
const test = `${prefix}${arrow}${title}`;
|
|
79
|
-
if (typeof result == "number")
|
|
80
|
-
continue;
|
|
81
|
-
const flatResult = makeResult(test, result);
|
|
82
|
-
errorList = errorList.concat(flatResult);
|
|
83
|
-
}
|
|
84
|
-
return errorList;
|
|
85
|
-
}
|
|
1
|
+
import { afterall, aftereach, beforeall, beforeeach, rootCases, } from "./describe.js";
|
|
2
|
+
export async function execute(cases = rootCases()) {
|
|
3
|
+
const beforeallfn = cases[beforeall] ?? (() => { });
|
|
4
|
+
const beforeeachfn = cases[beforeeach] ?? (() => { });
|
|
5
|
+
const afterallfn = cases[afterall] ?? (() => { });
|
|
6
|
+
const aftereachfn = cases[aftereach] ?? (() => { });
|
|
7
|
+
const result = { executed: 0, passed: 0, failed: 0, total: 0 };
|
|
8
|
+
try {
|
|
9
|
+
await beforeallfn();
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
result["_beforeAll"] = { error: e };
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
for (const [title, block] of Object.entries(cases)) {
|
|
16
|
+
if (typeof title === "symbol") {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (block instanceof Function) {
|
|
20
|
+
try {
|
|
21
|
+
result.executed += 1;
|
|
22
|
+
await beforeeachfn();
|
|
23
|
+
await block();
|
|
24
|
+
await aftereachfn();
|
|
25
|
+
result.passed += 1;
|
|
26
|
+
result[title] = { passed: true };
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
result.failed += 1;
|
|
30
|
+
result[title] = { error: /** @type Error */ e };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (block) {
|
|
34
|
+
const run = await execute(block);
|
|
35
|
+
result.executed += run.executed;
|
|
36
|
+
result.passed += run.passed;
|
|
37
|
+
result.failed += run.failed;
|
|
38
|
+
result[title] = run;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await afterallfn();
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
result["_afterAll"] = { error: e };
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
export function getError({ error }) {
|
|
50
|
+
if (typeof error == "string") {
|
|
51
|
+
return error;
|
|
52
|
+
}
|
|
53
|
+
else if (error.message) {
|
|
54
|
+
return error.stack;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
return "unknown error";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function makeResult(test, result) {
|
|
61
|
+
if (result.error)
|
|
62
|
+
return [
|
|
63
|
+
{
|
|
64
|
+
test,
|
|
65
|
+
stack: getError(result),
|
|
66
|
+
stats: { executed: 1, failed: 1 },
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
if (result.passed === true) {
|
|
70
|
+
return [{ test, stats: { executed: 1, failed: 0 } }];
|
|
71
|
+
}
|
|
72
|
+
return flattenResults(result, test);
|
|
73
|
+
}
|
|
74
|
+
export function flattenResults(results, prefix = "") {
|
|
75
|
+
const arrow = prefix == "" ? "" : " -> ";
|
|
76
|
+
let errorList = [];
|
|
77
|
+
for (const [title, result] of Object.entries(results).filter(([key]) => !["executed", "passed", "failed"].includes(key))) {
|
|
78
|
+
const test = `${prefix}${arrow}${title}`;
|
|
79
|
+
if (typeof result == "number")
|
|
80
|
+
continue;
|
|
81
|
+
const flatResult = makeResult(test, result);
|
|
82
|
+
errorList = errorList.concat(flatResult);
|
|
83
|
+
}
|
|
84
|
+
return errorList;
|
|
85
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class Matcher<T> {
|
|
2
|
+
actual: T;
|
|
3
|
+
constructor(actual: T);
|
|
4
|
+
get not(): Matcher<T>;
|
|
5
|
+
toBe(expected: T): void;
|
|
6
|
+
toEqual(expected: T, partial?: boolean): void;
|
|
7
|
+
toMatch(expected: RegExp | string): void;
|
|
8
|
+
toMatchObject(expected: Partial<T>): void;
|
|
9
|
+
toBeNull(): void;
|
|
10
|
+
toThrow(message?: string): void;
|
|
11
|
+
}
|
|
12
|
+
export declare class NotMatcher<T> {
|
|
13
|
+
actual: T;
|
|
14
|
+
constructor(actual: T);
|
|
15
|
+
get not(): Matcher<T>;
|
|
16
|
+
toBe(expected: T): void;
|
|
17
|
+
toEqual(expected: T): void;
|
|
18
|
+
toMatch(expected: RegExp | string): void;
|
|
19
|
+
toMatchObject(expected: Partial<T>): void;
|
|
20
|
+
toBeNull(): void;
|
|
21
|
+
toThrow(message?: string): void;
|
|
22
|
+
}
|
|
23
|
+
export declare function expect<T>(t: T): Matcher<T>;
|
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
import { assert } from "../assert.js";
|
|
2
|
-
import { display } from "../display.js";
|
|
3
|
-
import { equals } from "../equal.js";
|
|
4
|
-
export class Matcher {
|
|
5
|
-
actual;
|
|
6
|
-
constructor(actual) {
|
|
7
|
-
this.actual = actual;
|
|
8
|
-
}
|
|
9
|
-
get not() {
|
|
10
|
-
return new NotMatcher(this.actual);
|
|
11
|
-
}
|
|
12
|
-
toBe(expected) {
|
|
13
|
-
assert(this.actual === expected, () => `${this.actual} !== ${expected}`);
|
|
14
|
-
}
|
|
15
|
-
toEqual(expected, partial = false) {
|
|
16
|
-
assert(equals(this.actual, expected, partial), () => `Objects are not equivalent: ${display(this.actual)}, ${display(expected)}`);
|
|
17
|
-
}
|
|
18
|
-
toMatch(expected) {
|
|
19
|
-
assert(typeof this.actual === "string", () => "Must have string for regexp match");
|
|
20
|
-
// @ts-expect-error
|
|
21
|
-
const actual = this.actual;
|
|
22
|
-
if (typeof expected === "string") {
|
|
23
|
-
assert(actual.includes(expected), () => `${actual} does not include ${expected}`);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
assert(expected.test(actual), () => `${actual} does not match ${expected}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
toMatchObject(expected) {
|
|
30
|
-
for (const [k, v] of Object.entries(expected)) {
|
|
31
|
-
// @ts-expect-error
|
|
32
|
-
const actual = this.actual[k];
|
|
33
|
-
assert(equals(actual, v, true), () => `Comparing ${k}, properties not equal: ${display(actual)}, ${display(v)}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
toBeNull() {
|
|
37
|
-
assert(this.actual === null, () => `Expected null, got ${JSON.stringify(this.actual)}`);
|
|
38
|
-
}
|
|
39
|
-
toThrow(message = "") {
|
|
40
|
-
let didThrow = false;
|
|
41
|
-
let result = undefined;
|
|
42
|
-
try {
|
|
43
|
-
// @ts-expect-error
|
|
44
|
-
result = this.actual();
|
|
45
|
-
}
|
|
46
|
-
catch ({ message: e }) {
|
|
47
|
-
assert(
|
|
48
|
-
// @ts-expect-error
|
|
49
|
-
(e ?? "").match(message), () => `Expected thrown message to match ${message}, got ${e}`);
|
|
50
|
-
didThrow = true;
|
|
51
|
-
}
|
|
52
|
-
assert(didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export class NotMatcher {
|
|
56
|
-
actual;
|
|
57
|
-
constructor(actual) {
|
|
58
|
-
this.actual = actual;
|
|
59
|
-
}
|
|
60
|
-
get not() {
|
|
61
|
-
return new Matcher(this.actual);
|
|
62
|
-
}
|
|
63
|
-
toBe(expected) {
|
|
64
|
-
assert(this.actual !== expected, () => `${this.actual} === ${expected}`);
|
|
65
|
-
}
|
|
66
|
-
toEqual(expected) {
|
|
67
|
-
assert(!equals(this.actual, expected), () => `Objects are equivalent: ${JSON.stringify(this.actual)}, ${JSON.stringify(expected)}`);
|
|
68
|
-
}
|
|
69
|
-
toMatch(expected) {
|
|
70
|
-
assert(typeof this.actual === "string", () => "Must have string for regexp match");
|
|
71
|
-
// @ts-expect-error
|
|
72
|
-
const actual = this.actual;
|
|
73
|
-
if (typeof expected === "string") {
|
|
74
|
-
assert(!actual.includes(expected), () => `${actual} includes ${expected}`);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
assert(!expected.test(actual), () => `${actual} matches ${expected}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
toMatchObject(expected) {
|
|
81
|
-
for (const [k, v] of Object.entries(expected)) {
|
|
82
|
-
// @ts-expect-error
|
|
83
|
-
const actual = this.actual[k];
|
|
84
|
-
assert(!equals(actual, v), () => `Comparing ${k}, properties equal: ${JSON.stringify(actual)}, ${JSON.stringify(v)}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
toBeNull() {
|
|
88
|
-
assert(this.actual !== null, () => `Expected not null`);
|
|
89
|
-
}
|
|
90
|
-
toThrow(message = "") {
|
|
91
|
-
let didThrow = false;
|
|
92
|
-
let result = undefined;
|
|
93
|
-
try {
|
|
94
|
-
// @ts-expect-error
|
|
95
|
-
result = this.actual();
|
|
96
|
-
}
|
|
97
|
-
catch ({ message: e }) {
|
|
98
|
-
assert(
|
|
99
|
-
// @ts-expect-error
|
|
100
|
-
(e ?? "").match(message), () => `Expected thrown message to match ${message}, got ${e}`);
|
|
101
|
-
didThrow = true;
|
|
102
|
-
}
|
|
103
|
-
assert(!didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
export function expect(t) {
|
|
107
|
-
return new Matcher(t);
|
|
108
|
-
}
|
|
1
|
+
import { assert } from "../assert.js";
|
|
2
|
+
import { display } from "../display.js";
|
|
3
|
+
import { equals } from "../equal.js";
|
|
4
|
+
export class Matcher {
|
|
5
|
+
actual;
|
|
6
|
+
constructor(actual) {
|
|
7
|
+
this.actual = actual;
|
|
8
|
+
}
|
|
9
|
+
get not() {
|
|
10
|
+
return new NotMatcher(this.actual);
|
|
11
|
+
}
|
|
12
|
+
toBe(expected) {
|
|
13
|
+
assert(this.actual === expected, () => `${this.actual} !== ${expected}`);
|
|
14
|
+
}
|
|
15
|
+
toEqual(expected, partial = false) {
|
|
16
|
+
assert(equals(this.actual, expected, partial), () => `Objects are not equivalent: ${display(this.actual)}, ${display(expected)}`);
|
|
17
|
+
}
|
|
18
|
+
toMatch(expected) {
|
|
19
|
+
assert(typeof this.actual === "string", () => "Must have string for regexp match");
|
|
20
|
+
// @ts-expect-error
|
|
21
|
+
const actual = this.actual;
|
|
22
|
+
if (typeof expected === "string") {
|
|
23
|
+
assert(actual.includes(expected), () => `${actual} does not include ${expected}`);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
assert(expected.test(actual), () => `${actual} does not match ${expected}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
toMatchObject(expected) {
|
|
30
|
+
for (const [k, v] of Object.entries(expected)) {
|
|
31
|
+
// @ts-expect-error
|
|
32
|
+
const actual = this.actual[k];
|
|
33
|
+
assert(equals(actual, v, true), () => `Comparing ${k}, properties not equal: ${display(actual)}, ${display(v)}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
toBeNull() {
|
|
37
|
+
assert(this.actual === null, () => `Expected null, got ${JSON.stringify(this.actual)}`);
|
|
38
|
+
}
|
|
39
|
+
toThrow(message = "") {
|
|
40
|
+
let didThrow = false;
|
|
41
|
+
let result = undefined;
|
|
42
|
+
try {
|
|
43
|
+
// @ts-expect-error
|
|
44
|
+
result = this.actual();
|
|
45
|
+
}
|
|
46
|
+
catch ({ message: e }) {
|
|
47
|
+
assert(
|
|
48
|
+
// @ts-expect-error
|
|
49
|
+
(e ?? "").match(message), () => `Expected thrown message to match ${message}, got ${e}`);
|
|
50
|
+
didThrow = true;
|
|
51
|
+
}
|
|
52
|
+
assert(didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class NotMatcher {
|
|
56
|
+
actual;
|
|
57
|
+
constructor(actual) {
|
|
58
|
+
this.actual = actual;
|
|
59
|
+
}
|
|
60
|
+
get not() {
|
|
61
|
+
return new Matcher(this.actual);
|
|
62
|
+
}
|
|
63
|
+
toBe(expected) {
|
|
64
|
+
assert(this.actual !== expected, () => `${this.actual} === ${expected}`);
|
|
65
|
+
}
|
|
66
|
+
toEqual(expected) {
|
|
67
|
+
assert(!equals(this.actual, expected), () => `Objects are equivalent: ${JSON.stringify(this.actual)}, ${JSON.stringify(expected)}`);
|
|
68
|
+
}
|
|
69
|
+
toMatch(expected) {
|
|
70
|
+
assert(typeof this.actual === "string", () => "Must have string for regexp match");
|
|
71
|
+
// @ts-expect-error
|
|
72
|
+
const actual = this.actual;
|
|
73
|
+
if (typeof expected === "string") {
|
|
74
|
+
assert(!actual.includes(expected), () => `${actual} includes ${expected}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
assert(!expected.test(actual), () => `${actual} matches ${expected}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
toMatchObject(expected) {
|
|
81
|
+
for (const [k, v] of Object.entries(expected)) {
|
|
82
|
+
// @ts-expect-error
|
|
83
|
+
const actual = this.actual[k];
|
|
84
|
+
assert(!equals(actual, v), () => `Comparing ${k}, properties equal: ${JSON.stringify(actual)}, ${JSON.stringify(v)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
toBeNull() {
|
|
88
|
+
assert(this.actual !== null, () => `Expected not null`);
|
|
89
|
+
}
|
|
90
|
+
toThrow(message = "") {
|
|
91
|
+
let didThrow = false;
|
|
92
|
+
let result = undefined;
|
|
93
|
+
try {
|
|
94
|
+
// @ts-expect-error
|
|
95
|
+
result = this.actual();
|
|
96
|
+
}
|
|
97
|
+
catch ({ message: e }) {
|
|
98
|
+
assert(
|
|
99
|
+
// @ts-expect-error
|
|
100
|
+
(e ?? "").match(message), () => `Expected thrown message to match ${message}, got ${e}`);
|
|
101
|
+
didThrow = true;
|
|
102
|
+
}
|
|
103
|
+
assert(!didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function expect(t) {
|
|
107
|
+
return new Matcher(t);
|
|
108
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Given a value with numbers, attempt to fix all numbers to 1 decimal point.
|
|
3
|
-
*/
|
|
4
|
-
export function fix(n) {
|
|
5
|
-
if (typeof n === "number") {
|
|
6
|
-
// @ts-ignore
|
|
7
|
-
return +n.toFixed(1);
|
|
8
|
-
}
|
|
9
|
-
if (n !== Object(n)) {
|
|
10
|
-
// A primitive
|
|
11
|
-
return n;
|
|
12
|
-
}
|
|
13
|
-
if (n instanceof Array) {
|
|
14
|
-
// @ts-ignore
|
|
15
|
-
return n.map(fix);
|
|
16
|
-
}
|
|
17
|
-
// @ts-ignore
|
|
18
|
-
return mapreduce(fix, n);
|
|
19
|
-
}
|
|
20
|
-
function mapreduce(fn, iter) {
|
|
21
|
-
return Object.entries(iter).reduce((acc, [k, v]) => ((acc[k] = fn(v)), acc), {});
|
|
22
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Given a value with numbers, attempt to fix all numbers to 1 decimal point.
|
|
3
|
+
*/
|
|
4
|
+
export function fix(n) {
|
|
5
|
+
if (typeof n === "number") {
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
return +n.toFixed(1);
|
|
8
|
+
}
|
|
9
|
+
if (n !== Object(n)) {
|
|
10
|
+
// A primitive
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
if (n instanceof Array) {
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
return n.map(fix);
|
|
16
|
+
}
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
return mapreduce(fix, n);
|
|
19
|
+
}
|
|
20
|
+
function mapreduce(fn, iter) {
|
|
21
|
+
return Object.entries(iter).reduce((acc, [k, v]) => ((acc[k] = fn(v)), acc), {});
|
|
22
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { expect } from "./expect.js";
|
|
2
|
-
export { fix } from "./fix.js";
|
|
3
|
-
export { afterAll, afterEach, beforeAll, beforeEach, cleanState, describe, it, } from "./describe.js";
|
|
1
|
+
export { expect } from "./expect.js";
|
|
2
|
+
export { fix } from "./fix.js";
|
|
3
|
+
export { afterAll, afterEach, beforeAll, beforeEach, cleanState, describe, it, } from "./describe.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TestCase {
|
|
2
|
+
[k: string]: Function | TestCase;
|
|
3
|
+
[k: symbol]: Function;
|
|
4
|
+
}
|
|
5
|
+
export interface TestResult {
|
|
6
|
+
executed: number;
|
|
7
|
+
passed: number;
|
|
8
|
+
failed: number;
|
|
9
|
+
[k: string]: TestResult | TestSummary | number;
|
|
10
|
+
}
|
|
11
|
+
export declare type TestSummary = TestFailed | TestPassed;
|
|
12
|
+
export interface TestFailed {
|
|
13
|
+
error: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface TestPassed {
|
|
16
|
+
passed: true;
|
|
17
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function cleanState<State extends {}>(init: () => State, runner: (action: () => void) => void): State;
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import * as fs from "fs/promises";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { fileResponse } from "./response.js";
|
|
4
|
-
/**
|
|
5
|
-
* Searches up the request path until the first index is found.
|
|
6
|
-
*/
|
|
7
|
-
export const findIndex = async ({ root }) => async (req) => {
|
|
8
|
-
let filename = path.join(root, req.url ?? "");
|
|
9
|
-
if (path.basename(filename).match(/\.[a-z]{1,3}$/)) {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
while (filename.startsWith(root)) {
|
|
13
|
-
const index = path.join(filename, "index.html");
|
|
14
|
-
try {
|
|
15
|
-
const stat = await fs.stat(index);
|
|
16
|
-
return fileResponse(index, stat);
|
|
17
|
-
}
|
|
18
|
-
catch (e) {
|
|
19
|
-
filename = path.dirname(filename);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return undefined;
|
|
23
|
-
};
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { fileResponse } from "./response.js";
|
|
4
|
+
/**
|
|
5
|
+
* Searches up the request path until the first index is found.
|
|
6
|
+
*/
|
|
7
|
+
export const findIndex = async ({ root }) => async (req) => {
|
|
8
|
+
let filename = path.join(root, req.url ?? "");
|
|
9
|
+
if (path.basename(filename).match(/\.[a-z]{1,3}$/)) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
while (filename.startsWith(root)) {
|
|
13
|
+
const index = path.join(filename, "index.html");
|
|
14
|
+
try {
|
|
15
|
+
const stat = await fs.stat(index);
|
|
16
|
+
return fileResponse(index, stat);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
filename = path.dirname(filename);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
};
|