@haibun/web-server-express 1.28.3 → 1.28.10

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.
@@ -0,0 +1,16 @@
1
+ export declare const WEBSERVER = "webserver";
2
+ export declare const CHECK_LISTENER = "CHECK_LISTENER";
3
+ import * as express from 'express';
4
+ export interface IWebServer {
5
+ checkAddStaticFolder(subdir: string, loc: string): undefined | string;
6
+ checkAddIndexFolder(subdir: string, loc: string): undefined | string;
7
+ addKnownStaticFolder(subdir: string, mountAt?: string): undefined | string;
8
+ listen(): Promise<unknown>;
9
+ close(): Promise<void>;
10
+ addRoute(type: TRouteTypes, path: string, route: TRequestHandler): void;
11
+ use(middleware: express.RequestHandler): void;
12
+ }
13
+ export type TRouteTypes = 'get' | 'post';
14
+ export type IRequest = typeof express.request;
15
+ export type IResponse = typeof express.response;
16
+ export type TRequestHandler = (req: IRequest, res: IResponse) => void;
package/build/defs.js ADDED
@@ -0,0 +1,3 @@
1
+ export const WEBSERVER = 'webserver';
2
+ export const CHECK_LISTENER = 'CHECK_LISTENER';
3
+ //# sourceMappingURL=defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.js","sourceRoot":"","sources":["../src/defs.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import http from 'http';
3
+ import { RequestHandler } from 'express';
4
+ import { IWebServer, TRouteTypes } from './defs.js';
5
+ import { ILogger } from '@haibun/core/build/lib/interfaces/logger.js';
6
+ export declare const DEFAULT_PORT = 8123;
7
+ export declare class ServerExpress implements IWebServer {
8
+ logger: ILogger;
9
+ static listening: boolean;
10
+ listener?: http.Server;
11
+ app: import("express-serve-static-core").Express;
12
+ static mounted: {
13
+ get: {};
14
+ post: {};
15
+ };
16
+ base: string;
17
+ port: number;
18
+ constructor(logger: ILogger, base: string, port?: number);
19
+ use(middleware: RequestHandler): void;
20
+ listen(): Promise<unknown>;
21
+ addRoute(type: TRouteTypes, path: string, route: RequestHandler): void;
22
+ private addMounted;
23
+ checkAddStaticFolder(relativeFolder: string, mountAt?: string): string;
24
+ checkAddIndexFolder(relativeFolder: string, mountAt?: string): string;
25
+ addKnownStaticFolder(folder: string, mountAt?: string): string;
26
+ private doAddStaticFolder;
27
+ checkMountBadOrMounted(type: string, loc: string, what: string): string;
28
+ close(): Promise<void>;
29
+ }
@@ -0,0 +1,114 @@
1
+ import { statSync, existsSync } from 'fs';
2
+ import express from 'express';
3
+ import serveIndex from 'serve-index';
4
+ import cookieParser from 'cookie-parser';
5
+ export const DEFAULT_PORT = 8123;
6
+ export class ServerExpress {
7
+ logger;
8
+ static listening = false;
9
+ listener;
10
+ app = express();
11
+ static mounted = { get: {}, post: {} };
12
+ base;
13
+ port;
14
+ constructor(logger, base, port = DEFAULT_PORT) {
15
+ this.logger = logger;
16
+ this.base = base;
17
+ this.port = port;
18
+ this.app.use(cookieParser());
19
+ this.app.use(express.json({ limit: '50mb' }));
20
+ }
21
+ use(middleware) {
22
+ this.app.use(middleware);
23
+ }
24
+ listen() {
25
+ return new Promise((resolve, reject) => {
26
+ if (!ServerExpress.listening) {
27
+ try {
28
+ this.listener = this.app.listen(this.port, () => {
29
+ this.logger.log(`Server listening on port: ${this.port}`);
30
+ ServerExpress.listening = true;
31
+ this.logger.log('express listening');
32
+ resolve('started');
33
+ });
34
+ }
35
+ catch (e) {
36
+ reject(e);
37
+ }
38
+ }
39
+ else {
40
+ this.logger.log('express already listening');
41
+ resolve('already listening');
42
+ }
43
+ });
44
+ }
45
+ addRoute(type, path, route) {
46
+ if (type !== 'get' && type !== 'post') {
47
+ throw Error(`invalid route type ${type}`);
48
+ }
49
+ const bad = this.checkMountBadOrMounted('get', path, route.toString());
50
+ if (bad) {
51
+ throw Error(bad);
52
+ }
53
+ this.logger.log(`adding ${type} route from ${path}`);
54
+ this.app[type](path, route);
55
+ this.addMounted(type, path, route.toString());
56
+ }
57
+ addMounted(type, path, what) {
58
+ ServerExpress.mounted[type][path] = what;
59
+ }
60
+ // add a static folder restricted to relative paths from files
61
+ checkAddStaticFolder(relativeFolder, mountAt = '/') {
62
+ const folder = [this.base, relativeFolder].join('/');
63
+ return this.doAddStaticFolder(folder, mountAt);
64
+ }
65
+ // add a index folder restricted to relative paths from files
66
+ checkAddIndexFolder(relativeFolder, mountAt = '/') {
67
+ const folder = [this.base, relativeFolder].join('/');
68
+ const bad = this.checkMountBadOrMounted('get', folder, mountAt);
69
+ if (bad) {
70
+ return bad;
71
+ }
72
+ console.log('mounting', folder, mountAt);
73
+ this.app.use(mountAt, express.static(folder), serveIndex(folder));
74
+ return;
75
+ }
76
+ // add a static folder at any path
77
+ addKnownStaticFolder(folder, mountAt = '/') {
78
+ return this.doAddStaticFolder(folder, mountAt);
79
+ }
80
+ doAddStaticFolder(folder, mountAt = '/') {
81
+ const bad = this.checkMountBadOrMounted('get', mountAt, folder);
82
+ if (bad) {
83
+ return bad;
84
+ }
85
+ if (!existsSync(folder)) {
86
+ return `"${folder}" doesn't exist`;
87
+ }
88
+ const stat = statSync(folder);
89
+ if (!stat.isDirectory()) {
90
+ return `"${folder}" is not a directory`;
91
+ }
92
+ this.app.use(mountAt, express.static(folder));
93
+ this.addMounted('get', mountAt, folder);
94
+ this.logger.info(`serving files from ${folder} at ${mountAt}`);
95
+ return;
96
+ }
97
+ checkMountBadOrMounted(type, loc, what) {
98
+ if (loc !== loc.replace(/[^a-zA-Z-0-9/\-_]/g, '')) {
99
+ return `mount folder ${loc} has illegal characters`;
100
+ }
101
+ const alreadyMounted = ServerExpress.mounted[type][loc] || Object.keys(ServerExpress.mounted[type]).find((m) => m.startsWith(`${loc}/`));
102
+ if (alreadyMounted) {
103
+ return `cannot mount ${type} ${what} at ${loc}, ${alreadyMounted} is already mounted}`;
104
+ }
105
+ return undefined;
106
+ }
107
+ async close() {
108
+ this.logger.info(`closing server ${this.port}`);
109
+ await this.listener?.close();
110
+ ServerExpress.mounted = { get: {}, post: {} };
111
+ ServerExpress.listening = false;
112
+ }
113
+ }
114
+ //# sourceMappingURL=server-express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-express.js","sourceRoot":"","sources":["../src/server-express.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { ServerExpress } from "./server-express.js";
2
+ import TestLogger from '@haibun/core/build/lib/TestLogger.js';
3
+ describe('mounts', () => {
4
+ it('mounts a route', () => {
5
+ const tl = new TestLogger();
6
+ const se = new ServerExpress(tl, '/', 8999);
7
+ se.listen = async () => 'started';
8
+ expect(() => se.addRoute('get', '/', () => undefined)).not.toThrow();
9
+ });
10
+ it('fails to double mount a route', () => {
11
+ const tl = new TestLogger();
12
+ const se = new ServerExpress(tl, '/', 8999);
13
+ se.listen = async () => 'started';
14
+ expect(async () => await se.addRoute('get', '/', () => undefined)).rejects.toThrow();
15
+ });
16
+ });
17
+ //# sourceMappingURL=server-express.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-express.test.js","sourceRoot":"","sources":["../src/server-express.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,UAAU,MAAM,sCAAsC,CAAC;AAE9D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC3B,MAAM,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"server-express.test.js","sourceRoot":"","sources":["../src/server-express.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,UAAU,MAAM,sCAAsC,CAAC;AAE9D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACtB,MAAM,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAClC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -23,10 +23,6 @@ declare const WebServerStepper: {
23
23
  gwta: string;
24
24
  action: ({ where }: TNamed, vstep: TVStep) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
25
25
  };
26
- webpage: {
27
- gwta: string;
28
- action: ({ name, location }: TNamed, vsteps: TVStep) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
29
- };
30
26
  isListening: {
31
27
  gwta: string;
32
28
  action: () => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
@@ -41,10 +37,20 @@ declare const WebServerStepper: {
41
37
  };
42
38
  serveFiles: {
43
39
  gwta: string;
44
- action: ({ loc }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
40
+ action: ({ loc }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
41
+ };
42
+ indexFiles: {
43
+ gwta: string;
44
+ action: ({ loc }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
45
+ };
46
+ indexFilesAt: {
47
+ gwta: string;
48
+ action: ({ where, loc }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
45
49
  };
46
50
  };
47
- doServeFiles(where: any, loc: any): import("@haibun/core/build/lib/defs.js").TOKActionResult;
51
+ doServeIndex(where: any, loc: any): Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
52
+ doServeFiles(where: any, loc: any): Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
53
+ listen(): Promise<void>;
48
54
  world?: TWorld;
49
55
  endFeature?(): void;
50
56
  onFailure?(result: import("@haibun/core/build/lib/defs.js").TStepResult): void;
@@ -1,5 +1,5 @@
1
- import { OK, AStepper } from '@haibun/core/build/lib/defs.js';
2
- import { getFromRuntime, getStepperOption, intOrError } from '@haibun/core/build/lib/util/index.js';
1
+ import { OK, AStepper, } from '@haibun/core/build/lib/defs.js';
2
+ import { actionNotOK, getFromRuntime, getStepperOption, intOrError } from '@haibun/core/build/lib/util/index.js';
3
3
  import { WEBSERVER, } from './defs.js';
4
4
  import { ServerExpress, DEFAULT_PORT } from './server-express.js';
5
5
  import { WEB_PAGE } from '@haibun/domain-webpage/build/domain-webpage.js';
@@ -27,39 +27,15 @@ const WebServerStepper = class WebServerStepper extends AStepper {
27
27
  action: async ({ where }, vstep) => {
28
28
  const page = vstep.source.name;
29
29
  const webserver = getFromRuntime(this.getWorld().runtime, WEBSERVER);
30
- webserver.addStaticFolder(page, where);
31
- console.debug('added page', page);
30
+ await webserver.checkAddStaticFolder(page, where);
32
31
  return OK;
33
32
  },
34
33
  },
35
34
  /// generator
36
- webpage: {
37
- gwta: `A ${WEB_PAGE} {name} hosted at {location}`,
38
- action: async ({ name, location }, vsteps) => {
39
- const page = vsteps.source.name;
40
- const webserver = getFromRuntime(this.getWorld().runtime, WEBSERVER);
41
- // TODO mount the page
42
- return OK;
43
- },
44
- /*
45
- build: async ({ location }: TNamed, { source }: TVStep, workspace: WorkspaceContext) => {
46
- if (location !== location.replace(/[^a-zA-Z-0-9.]/g, '')) {
47
- throw Error(`${WEB_PAGE} location ${location} has illegal characters`);
48
- }
49
- const subdir = this.getWorld().shared.get('file_location');
50
- if (!subdir) {
51
- throw Error(`must declare a file_location`);
52
- }
53
- const folder = `files/${subdir}`;
54
- workspace.addBuilder(new WebPageBuilder(source.name, this.getWorld().logger, location, folder));
55
- return { ...OK, finalize: this.finalize };
56
- },
57
- */
58
- },
59
35
  isListening: {
60
36
  gwta: 'webserver is listening',
61
37
  action: async () => {
62
- await this.webserver.listen();
38
+ await this.listen();
63
39
  return OK;
64
40
  },
65
41
  },
@@ -74,34 +50,53 @@ const WebServerStepper = class WebServerStepper extends AStepper {
74
50
  serveFilesAt: {
75
51
  gwta: 'serve files at {where} from {loc}',
76
52
  action: async ({ where, loc }) => {
77
- return this.doServeFiles(where, loc);
53
+ await this.doServeFiles(where, loc).catch((e) => actionNotOK(e));
54
+ return OK;
78
55
  },
79
- /*
80
- build: async ({ loc }: TNamed) => {
81
- this.getWorld().shared.set('file_location', loc);
82
- return OK;
83
- }
84
- */
85
56
  },
86
57
  serveFiles: {
87
58
  gwta: 'serve files from {loc}',
88
59
  action: async ({ loc }) => {
89
- return this.doServeFiles('/', loc);
90
- },
91
- /*
92
- build: async ({ loc }: TNamed) => {
93
- this.getWorld().shared.set('file_location', loc);
94
- return OK;
60
+ const r = await this.doServeFiles('/', loc).catch((e) => actionNotOK(e));
61
+ return r;
95
62
  }
96
- */
97
63
  },
64
+ indexFiles: {
65
+ gwta: 'index files from {loc}',
66
+ action: async ({ loc }) => {
67
+ const r = await this.doServeIndex('/', loc).catch((e) => actionNotOK(e));
68
+ return r;
69
+ }
70
+ },
71
+ indexFilesAt: {
72
+ gwta: 'index files at {where} from {loc}',
73
+ action: async ({ where, loc }) => {
74
+ const r = await this.doServeIndex(where, loc).catch((e) => actionNotOK(e));
75
+ return r;
76
+ }
77
+ }
98
78
  };
99
- doServeFiles(where, loc) {
79
+ async doServeIndex(where, loc) {
100
80
  const ws = getFromRuntime(this.getWorld().runtime, WEBSERVER);
101
- ws.addStaticFolder(loc, where);
102
- // this.getWorld().shared.set('file_location', loc);
81
+ const res = ws.checkAddIndexFolder(loc, where);
82
+ if (res) {
83
+ throw Error(`failed to add index folder ${loc} at ${where}`);
84
+ }
85
+ await this.listen();
103
86
  return OK;
104
87
  }
88
+ async doServeFiles(where, loc) {
89
+ const ws = getFromRuntime(this.getWorld().runtime, WEBSERVER);
90
+ const res = ws.checkAddStaticFolder(loc, where);
91
+ if (res) {
92
+ throw Error(`failed to add static folder ${loc} at ${where}`);
93
+ }
94
+ await this.listen();
95
+ return OK;
96
+ }
97
+ async listen() {
98
+ await this.webserver.listen();
99
+ }
105
100
  };
106
101
  export default WebServerStepper;
107
102
  //# sourceMappingURL=web-server-stepper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-server-stepper.js","sourceRoot":"","sources":["../src/web-server-stepper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,EAAE,EAA4B,QAAQ,EAAuB,MAAM,gCAAgC,CAAC;AAC1H,OAAO,EAAe,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEjH,OAAO,EAAc,SAAS,GAAG,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAG1E,MAAM,gBAAgB,GAAG,MAAM,gBAAiB,SAAQ,QAAQ;IAC9D,SAAS,CAA4B;IAErC,OAAO,GAAG;QACR,IAAI,EAAE;YACJ,IAAI,EAAE,+BAA+B,YAAY,EAAE;YACnD,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SAC1C;KACF,CAAC;IAEF,QAAQ,CAAC,KAAa,EAAE,QAAoB;QAC1C,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChC,uEAAuE;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3F,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,GAAG;QACN,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,QAAQ,aAAa;YAChC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAU,EAAE,KAAa,EAAE,EAAE;gBACjD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;gBAE/B,MAAM,SAAS,GAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACjF,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACvC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAElC,OAAO,EAAE,CAAC;YACZ,CAAC;SACF;QACD,aAAa;QACb,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,QAAQ,8BAA8B;YACjD,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAU,EAAE,MAAc,EAAE,EAAE;gBAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAEhC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACrE,sBAAsB;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD;;;;;;;;;;;;;cAaE;SACH;QACD,WAAW,EAAE;YACX,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAC;YACZ,CAAC;SACF;QACD,UAAU,EAAE;YACV,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC;gBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjE,OAAO,EAAE,CAAC;YACZ,CAAC;SACF;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,mCAAmC;YACzC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAU,EAAE,EAAE;gBACvC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;YACD;;;;;cAKE;SACH;QACD,UAAU,EAAE;YACV,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAU,EAAE,EAAE;gBAChC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;YACD;;;;;cAKE;SACH;KACF,CAAC;IACF,YAAY,CAAC,KAAK,EAAE,GAAG;QACrB,MAAM,EAAE,GAAe,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1E,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,oDAAoD;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;CAiBF,CAAC;AACF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"web-server-stepper.js","sourceRoot":"","sources":["../src/web-server-stepper.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import WebHttp from '@haibun/web-http/build/web-http.js';
3
3
  import server from './web-server-stepper.js';
4
4
  describe('static mount', () => {
5
5
  it('serves files', async () => {
6
- const feature = { path: '/features/test.feature', content: `serve files from test\nfetch from http://localhost:8123/testfile is "content"` };
6
+ const feature = { path: '/features/test.feature', content: `serve files from test\nfetch from http://localhost:8123/testfile matches "content"` };
7
7
  const result = await testWithDefaults([feature], [server, WebHttp]);
8
8
  expect(result.ok).toBe(true);
9
9
  });
@@ -15,7 +15,7 @@ describe('static mount', () => {
15
15
  it("doesn't re-mount same static mount", async () => {
16
16
  const feature = { path: '/features/test.feature', content: `serve files from test\nserve files from test\n` };
17
17
  const result = await testWithDefaults([feature], [server]);
18
- expect(result.ok).toBe(true);
18
+ expect(result.ok).toBe(false);
19
19
  });
20
20
  it("doesn't permit different static mount", async () => {
21
21
  const feature = { path: '/features/test.feature', content: `serve files from test\nserve files from fails\n` };
@@ -23,4 +23,17 @@ describe('static mount', () => {
23
23
  expect(result.ok).toBe(false);
24
24
  });
25
25
  });
26
+ describe('index mount', () => {
27
+ it('index files', async () => {
28
+ const feature = { path: '/features/test.feature', content: `index files from test\nfetch from http://localhost:8123/ contains href="/testfile"\nfetch from http://localhost:8123/testfile matches "content"` };
29
+ const result = await testWithDefaults([feature], [server, WebHttp]);
30
+ expect(result.ok).toBe(true);
31
+ });
32
+ it('index files at', async () => {
33
+ const feature = { path: '/features/test.feature', content: `index files at /test from test\nfetch from http://localhost:8123/test/ contains href="/test/testfile"\nfetch from http://localhost:8123/test/testfile matches "content"` };
34
+ const result = await testWithDefaults([feature], [server, WebHttp]);
35
+ console.log('🤑', JSON.stringify(result, null, 2));
36
+ expect(result.ok).toBe(true);
37
+ });
38
+ });
26
39
  //# sourceMappingURL=web-server-stepper.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-server-stepper.test.js","sourceRoot":"","sources":["../src/web-server-stepper.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,OAAO,MAAM,oCAAoC,CAAC;AAEzD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAE7C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,+EAA+E,EAAE,CAAC;QAC7I,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAA;QAEvF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAA;QAC7G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAA;QAC9G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"web-server-stepper.test.js","sourceRoot":"","sources":["../src/web-server-stepper.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@haibun/web-server-express",
3
3
  "type": "module",
4
- "version": "1.28.3",
4
+ "version": "1.28.10",
5
5
  "description": "",
6
6
  "main": "build/web-server-stepper.js",
7
7
  "files": [
@@ -20,13 +20,14 @@
20
20
  "author": "",
21
21
  "license": "ISC",
22
22
  "dependencies": {
23
- "@haibun/core": "1.28.3",
24
- "@haibun/domain-webpage": "1.28.3",
23
+ "@haibun/core": "1.28.10",
24
+ "@haibun/domain-webpage": "1.28.10",
25
25
  "cookie-parser": "^1.4.5",
26
- "express": "^4.17.1"
26
+ "express": "^4.17.1",
27
+ "serve-index": "^1.9.1"
27
28
  },
28
29
  "devDependencies": {
29
- "@haibun/web-http": "1.28.3",
30
+ "@haibun/web-http": "1.28.10",
30
31
  "@types/cookie-parser": "^1.4.2",
31
32
  "@types/express": "^4.17.15"
32
33
  },