@mojojs/core 0.18.0 → 0.19.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/lib/app.d.ts +114 -4
- package/lib/app.js +102 -8
- package/lib/app.js.map +1 -1
- package/lib/body.d.ts +48 -0
- package/lib/body.js +45 -0
- package/lib/body.js.map +1 -1
- package/lib/cli.d.ts +15 -0
- package/lib/cli.js +15 -0
- package/lib/cli.js.map +1 -1
- package/lib/context.d.ts +99 -0
- package/lib/context.js +84 -0
- package/lib/context.js.map +1 -1
- package/lib/mime.d.ts +2 -0
- package/lib/mime.js +27 -9
- package/lib/mime.js.map +1 -1
- package/lib/plugins/default-helpers.d.ts +2 -0
- package/lib/plugins/default-helpers.js +15 -0
- package/lib/plugins/default-helpers.js.map +1 -0
- package/lib/plugins/view-helpers.js +0 -12
- package/lib/plugins/view-helpers.js.map +1 -1
- package/lib/router.d.ts +3 -3
- package/lib/router.js +10 -9
- package/lib/router.js.map +1 -1
- package/lib/server.js +0 -1
- package/lib/server.js.map +1 -1
- package/lib/util.d.ts +1 -1
- package/lib/util.js.map +1 -1
- package/package.json +2 -2
package/lib/cli.js
CHANGED
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import * as util from './util.js';
|
|
2
2
|
import Path from '@mojojs/path';
|
|
3
3
|
import nopt from 'nopt';
|
|
4
|
+
/**
|
|
5
|
+
* Command line interface class.
|
|
6
|
+
*/
|
|
4
7
|
export class CLI {
|
|
5
8
|
constructor(app) {
|
|
9
|
+
/**
|
|
10
|
+
* Paths to search for commands.
|
|
11
|
+
*/
|
|
6
12
|
this.commandPaths = [Path.currentFile().sibling('cli').toString()];
|
|
13
|
+
/**
|
|
14
|
+
* Registered commands.
|
|
15
|
+
*/
|
|
7
16
|
this.commands = {};
|
|
8
17
|
this._loaded = undefined;
|
|
9
18
|
this._app = new WeakRef(app);
|
|
10
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Add a command.
|
|
22
|
+
*/
|
|
11
23
|
addCommand(name, command) {
|
|
12
24
|
this.commands[name] = command;
|
|
13
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Start command line interface.
|
|
28
|
+
*/
|
|
14
29
|
async start(command, ...args) {
|
|
15
30
|
if (this._loaded === undefined)
|
|
16
31
|
await this._loadCommands();
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,OAAO,GAAG;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/lib/context.d.ts
CHANGED
|
@@ -21,14 +21,41 @@ declare interface Context {
|
|
|
21
21
|
on: <T extends keyof ContextEvents>(event: T, listener: ContextEvents[T]) => this;
|
|
22
22
|
emit: <T extends keyof ContextEvents>(event: T, ...args: Parameters<ContextEvents[T]>) => boolean;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Context class.
|
|
26
|
+
*/
|
|
24
27
|
declare class Context extends EventEmitter {
|
|
28
|
+
/**
|
|
29
|
+
* Application this context belongs to.
|
|
30
|
+
*/
|
|
25
31
|
app: App;
|
|
32
|
+
/**
|
|
33
|
+
* Format for HTTP exceptions.
|
|
34
|
+
*/
|
|
26
35
|
exceptionFormat: string;
|
|
36
|
+
/**
|
|
37
|
+
* WebSocket JSON mode.
|
|
38
|
+
*/
|
|
27
39
|
jsonMode: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Logger with request id.
|
|
42
|
+
*/
|
|
28
43
|
log: ChildLogger;
|
|
44
|
+
/**
|
|
45
|
+
* Router dispatch plan.
|
|
46
|
+
*/
|
|
29
47
|
plan: Plan | null;
|
|
48
|
+
/**
|
|
49
|
+
* HTTP request information.
|
|
50
|
+
*/
|
|
30
51
|
req: ServerRequest;
|
|
52
|
+
/**
|
|
53
|
+
* HTTP response information.
|
|
54
|
+
*/
|
|
31
55
|
res: ServerResponse;
|
|
56
|
+
/**
|
|
57
|
+
* Non-persistent data storage and exchange for the current request.
|
|
58
|
+
*/
|
|
32
59
|
stash: Record<string, any>;
|
|
33
60
|
_flash: SessionData | undefined;
|
|
34
61
|
_params: Params | undefined;
|
|
@@ -36,32 +63,104 @@ declare class Context extends EventEmitter {
|
|
|
36
63
|
_ws: WeakRef<WebSocket> | null;
|
|
37
64
|
constructor(app: App, req: http.IncomingMessage, res: http.ServerResponse, options: ServerRequestOptions);
|
|
38
65
|
[EventEmitter.captureRejectionSymbol](error: Error): void;
|
|
66
|
+
/**
|
|
67
|
+
* Select best possible representation for resource.
|
|
68
|
+
*/
|
|
39
69
|
accepts(allowed?: string[]): string[] | null;
|
|
70
|
+
/**
|
|
71
|
+
* Application config shortcut.
|
|
72
|
+
*/
|
|
40
73
|
get config(): Record<string, any>;
|
|
74
|
+
/**
|
|
75
|
+
* Data storage persistent only for the next request.
|
|
76
|
+
*/
|
|
41
77
|
flash(): Promise<Record<string, any>>;
|
|
78
|
+
/**
|
|
79
|
+
* Handle WebSocket upgrade, used by servers.
|
|
80
|
+
*/
|
|
42
81
|
handleUpgrade(ws: WebSocket): void;
|
|
82
|
+
/**
|
|
83
|
+
* Home directory shortcut.
|
|
84
|
+
*/
|
|
43
85
|
get home(): Path;
|
|
86
|
+
/**
|
|
87
|
+
* Check if WebSocket connection has been accepted.
|
|
88
|
+
*/
|
|
44
89
|
get isAccepted(): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Check if WebSocket connection has been established.
|
|
92
|
+
*/
|
|
45
93
|
get isEstablished(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Check if session is active.
|
|
96
|
+
*/
|
|
46
97
|
get isSessionActive(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Check if HTTP request is a WebSocket handshake.
|
|
100
|
+
*/
|
|
47
101
|
get isWebSocket(): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Accept WebSocket connection and activate JSON mode.
|
|
104
|
+
*/
|
|
48
105
|
json(fn: WebSocketHandler): this;
|
|
106
|
+
/**
|
|
107
|
+
* Model shortcut.
|
|
108
|
+
*/
|
|
49
109
|
get models(): Record<string, any>;
|
|
110
|
+
/**
|
|
111
|
+
* GET and POST parameters.
|
|
112
|
+
*/
|
|
50
113
|
params(options?: BusboyConfig): Promise<Params>;
|
|
114
|
+
/**
|
|
115
|
+
* Accept WebSocket connection.
|
|
116
|
+
*/
|
|
51
117
|
plain(fn: WebSocketHandler): this;
|
|
118
|
+
/**
|
|
119
|
+
* Send `302` redirect response.
|
|
120
|
+
*/
|
|
52
121
|
redirectTo(target: string, options?: {
|
|
53
122
|
status?: number;
|
|
54
123
|
values?: Record<string, any>;
|
|
55
124
|
}): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Render dynamic content.
|
|
127
|
+
*/
|
|
56
128
|
render(options?: RenderOptions, stash?: Record<string, any>): Promise<boolean>;
|
|
129
|
+
/**
|
|
130
|
+
* Try to render dynamic content to string.
|
|
131
|
+
*/
|
|
57
132
|
renderToString(options: RenderOptions, stash?: Record<string, any>): Promise<string | null>;
|
|
133
|
+
/**
|
|
134
|
+
* Automatically select best possible representation for resource.
|
|
135
|
+
*/
|
|
58
136
|
respondTo(spec: Record<string, MojoAction>): Promise<void>;
|
|
137
|
+
/**
|
|
138
|
+
* Send static file.
|
|
139
|
+
*/
|
|
59
140
|
sendFile(file: Path): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Get JSON schema for validation.
|
|
143
|
+
*/
|
|
60
144
|
schema(schema: Record<string, any> | string): ValidatorFunction | null;
|
|
145
|
+
/**
|
|
146
|
+
* Persistent data storage for the next few requests.
|
|
147
|
+
*/
|
|
61
148
|
session(): Promise<SessionData>;
|
|
149
|
+
/**
|
|
150
|
+
* HTTP/WebSocket user agent shortcut.
|
|
151
|
+
*/
|
|
62
152
|
get ua(): UserAgent;
|
|
153
|
+
/**
|
|
154
|
+
* Generate URL for route of path.
|
|
155
|
+
*/
|
|
63
156
|
urlFor(target: string | undefined, values?: Record<string, any>): string | null;
|
|
157
|
+
/**
|
|
158
|
+
* Generate URL for static file.
|
|
159
|
+
*/
|
|
64
160
|
urlForFile(path: string): string;
|
|
161
|
+
/**
|
|
162
|
+
* Established WebSocket connection.
|
|
163
|
+
*/
|
|
65
164
|
get ws(): WebSocket | null;
|
|
66
165
|
_urlForPath(path: string, isWebSocket: boolean): string;
|
|
67
166
|
}
|
package/lib/context.js
CHANGED
|
@@ -3,11 +3,23 @@ import { Params } from './body/params.js';
|
|
|
3
3
|
import { ServerRequest } from './server/request.js';
|
|
4
4
|
import { ServerResponse } from './server/response.js';
|
|
5
5
|
const ABSOLUTE = /^[a-zA-Z][a-zA-Z0-9]*:\/\//;
|
|
6
|
+
/**
|
|
7
|
+
* Context class.
|
|
8
|
+
*/
|
|
6
9
|
class Context extends EventEmitter {
|
|
7
10
|
constructor(app, req, res, options) {
|
|
8
11
|
super({ captureRejections: true });
|
|
12
|
+
/**
|
|
13
|
+
* WebSocket JSON mode.
|
|
14
|
+
*/
|
|
9
15
|
this.jsonMode = false;
|
|
16
|
+
/**
|
|
17
|
+
* Router dispatch plan.
|
|
18
|
+
*/
|
|
10
19
|
this.plan = null;
|
|
20
|
+
/**
|
|
21
|
+
* Non-persistent data storage and exchange for the current request.
|
|
22
|
+
*/
|
|
11
23
|
this.stash = {};
|
|
12
24
|
this._flash = undefined;
|
|
13
25
|
this._params = undefined;
|
|
@@ -22,6 +34,9 @@ class Context extends EventEmitter {
|
|
|
22
34
|
[EventEmitter.captureRejectionSymbol](error) {
|
|
23
35
|
this.exception(error);
|
|
24
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Select best possible representation for resource.
|
|
39
|
+
*/
|
|
25
40
|
accepts(allowed) {
|
|
26
41
|
const formats = this.app.mime.detect(this.req.headers.accept ?? '');
|
|
27
42
|
const stash = this.stash;
|
|
@@ -32,9 +47,15 @@ class Context extends EventEmitter {
|
|
|
32
47
|
const results = formats.filter(format => allowed.includes(format));
|
|
33
48
|
return results.length > 0 ? results : null;
|
|
34
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Application config shortcut.
|
|
52
|
+
*/
|
|
35
53
|
get config() {
|
|
36
54
|
return this.app.config;
|
|
37
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Data storage persistent only for the next request.
|
|
58
|
+
*/
|
|
38
59
|
async flash() {
|
|
39
60
|
if (this._flash === undefined) {
|
|
40
61
|
const session = await this.session();
|
|
@@ -54,33 +75,60 @@ class Context extends EventEmitter {
|
|
|
54
75
|
}
|
|
55
76
|
return this._flash;
|
|
56
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Handle WebSocket upgrade, used by servers.
|
|
80
|
+
*/
|
|
57
81
|
handleUpgrade(ws) {
|
|
58
82
|
this._ws = new WeakRef(ws);
|
|
59
83
|
this.emit('connection', ws);
|
|
60
84
|
ws.on('error', error => this.exception(error));
|
|
61
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Home directory shortcut.
|
|
88
|
+
*/
|
|
62
89
|
get home() {
|
|
63
90
|
return this.app.home;
|
|
64
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if WebSocket connection has been accepted.
|
|
94
|
+
*/
|
|
65
95
|
get isAccepted() {
|
|
66
96
|
return this.listenerCount('connection') > 0;
|
|
67
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if WebSocket connection has been established.
|
|
100
|
+
*/
|
|
68
101
|
get isEstablished() {
|
|
69
102
|
return this._ws !== null;
|
|
70
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if session is active.
|
|
106
|
+
*/
|
|
71
107
|
get isSessionActive() {
|
|
72
108
|
return this._session !== undefined;
|
|
73
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if HTTP request is a WebSocket handshake.
|
|
112
|
+
*/
|
|
74
113
|
get isWebSocket() {
|
|
75
114
|
return this.req.isWebSocket;
|
|
76
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Accept WebSocket connection and activate JSON mode.
|
|
118
|
+
*/
|
|
77
119
|
json(fn) {
|
|
78
120
|
this.jsonMode = true;
|
|
79
121
|
return this.on('connection', fn);
|
|
80
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Model shortcut.
|
|
125
|
+
*/
|
|
81
126
|
get models() {
|
|
82
127
|
return this.app.models;
|
|
83
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* GET and POST parameters.
|
|
131
|
+
*/
|
|
84
132
|
async params(options) {
|
|
85
133
|
if (this._params === undefined) {
|
|
86
134
|
const req = this.req;
|
|
@@ -91,15 +139,24 @@ class Context extends EventEmitter {
|
|
|
91
139
|
}
|
|
92
140
|
return this._params;
|
|
93
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Accept WebSocket connection.
|
|
144
|
+
*/
|
|
94
145
|
plain(fn) {
|
|
95
146
|
return this.on('connection', fn);
|
|
96
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Send `302` redirect response.
|
|
150
|
+
*/
|
|
97
151
|
async redirectTo(target, options = {}) {
|
|
98
152
|
await this.res
|
|
99
153
|
.status(options.status ?? 302)
|
|
100
154
|
.set('Location', this.urlFor(target, options.values) ?? '')
|
|
101
155
|
.send();
|
|
102
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Render dynamic content.
|
|
159
|
+
*/
|
|
103
160
|
async render(options = {}, stash) {
|
|
104
161
|
if (typeof options === 'string')
|
|
105
162
|
options = { view: options };
|
|
@@ -114,6 +171,9 @@ class Context extends EventEmitter {
|
|
|
114
171
|
}
|
|
115
172
|
return await app.renderer.respond(this, result, { status: options.status });
|
|
116
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Try to render dynamic content to string.
|
|
176
|
+
*/
|
|
117
177
|
async renderToString(options, stash) {
|
|
118
178
|
if (typeof options === 'string')
|
|
119
179
|
options = { view: options };
|
|
@@ -121,6 +181,9 @@ class Context extends EventEmitter {
|
|
|
121
181
|
const result = await this.app.renderer.render(this, options);
|
|
122
182
|
return result === null ? null : result.output.toString();
|
|
123
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Automatically select best possible representation for resource.
|
|
186
|
+
*/
|
|
124
187
|
async respondTo(spec) {
|
|
125
188
|
const formats = this.accepts() ?? [];
|
|
126
189
|
for (const format of formats) {
|
|
@@ -135,20 +198,35 @@ class Context extends EventEmitter {
|
|
|
135
198
|
}
|
|
136
199
|
await this.res.status(204).send();
|
|
137
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Send static file.
|
|
203
|
+
*/
|
|
138
204
|
async sendFile(file) {
|
|
139
205
|
return await this.app.static.serveFile(this, file);
|
|
140
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Get JSON schema for validation.
|
|
209
|
+
*/
|
|
141
210
|
schema(schema) {
|
|
142
211
|
return this.app.validator.schema(schema);
|
|
143
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Persistent data storage for the next few requests.
|
|
215
|
+
*/
|
|
144
216
|
async session() {
|
|
145
217
|
if (this._session === undefined)
|
|
146
218
|
this._session = (await this.app.session.load(this)) ?? {};
|
|
147
219
|
return this._session;
|
|
148
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* HTTP/WebSocket user agent shortcut.
|
|
223
|
+
*/
|
|
149
224
|
get ua() {
|
|
150
225
|
return this.app.ua;
|
|
151
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Generate URL for route of path.
|
|
229
|
+
*/
|
|
152
230
|
urlFor(target, values) {
|
|
153
231
|
if (target === undefined || target === 'current') {
|
|
154
232
|
if (this.plan === null)
|
|
@@ -165,11 +243,17 @@ class Context extends EventEmitter {
|
|
|
165
243
|
return null;
|
|
166
244
|
return this._urlForPath(route.render(values), route.hasWebSocket());
|
|
167
245
|
}
|
|
246
|
+
/**
|
|
247
|
+
* Generate URL for static file.
|
|
248
|
+
*/
|
|
168
249
|
urlForFile(path) {
|
|
169
250
|
if (ABSOLUTE.test(path))
|
|
170
251
|
return path;
|
|
171
252
|
return this.req.baseURL + this.app.static.filePath(path);
|
|
172
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Established WebSocket connection.
|
|
256
|
+
*/
|
|
173
257
|
get ws() {
|
|
174
258
|
return this._ws?.deref() ?? null;
|
|
175
259
|
}
|
package/lib/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAUA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAapD,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAE9C,MAAM,OAAQ,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/lib/mime.d.ts
CHANGED
package/lib/mime.js
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import mime from 'mime-types';
|
|
2
|
-
const COMMON = {
|
|
3
|
-
html: 'text/html; charset=utf-8',
|
|
4
|
-
json: 'application/json; charset=utf-8',
|
|
5
|
-
txt: 'text/plain; charset=utf-8',
|
|
6
|
-
yaml: 'text/yaml; charset=utf-8'
|
|
7
|
-
};
|
|
8
2
|
export class Mime {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.custom = {
|
|
5
|
+
html: 'text/html; charset=utf-8',
|
|
6
|
+
json: 'application/json; charset=utf-8',
|
|
7
|
+
txt: 'text/plain; charset=utf-8',
|
|
8
|
+
yaml: 'text/yaml; charset=utf-8'
|
|
9
|
+
};
|
|
10
|
+
this._reverseCustom = undefined;
|
|
11
|
+
}
|
|
9
12
|
detect(accepts) {
|
|
13
|
+
if (this._reverseCustom === undefined) {
|
|
14
|
+
this._reverseCustom = {};
|
|
15
|
+
for (const [name, value] of Object.entries(this.custom)) {
|
|
16
|
+
const match = value.match(/^\s*([^,; ]+)/);
|
|
17
|
+
if (match === null)
|
|
18
|
+
continue;
|
|
19
|
+
this._reverseCustom[match[1]] = name;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const reverse = this._reverseCustom;
|
|
10
23
|
const types = {};
|
|
11
24
|
for (const accept of accepts.split(/\s*,\s*/)) {
|
|
12
25
|
const match = accept.match(/^\s*([^,; ]+)(?:\s*;\s*q\s*=\s*(\d+(?:\.\d+)?))?\s*$/i);
|
|
@@ -14,11 +27,16 @@ export class Mime {
|
|
|
14
27
|
continue;
|
|
15
28
|
types[match[1].toLowerCase()] = parseFloat(match[2] ?? 1);
|
|
16
29
|
}
|
|
17
|
-
const
|
|
18
|
-
|
|
30
|
+
const exts = [];
|
|
31
|
+
for (const type of Object.keys(types).sort((a, b) => types[b] - types[a])) {
|
|
32
|
+
const ext = reverse[type] ?? mime.extension(type);
|
|
33
|
+
if (typeof ext === 'string')
|
|
34
|
+
exts.push(ext);
|
|
35
|
+
}
|
|
36
|
+
return exts;
|
|
19
37
|
}
|
|
20
38
|
extType(ext) {
|
|
21
|
-
return
|
|
39
|
+
return this.custom[ext] ?? mime.types[ext] ?? null;
|
|
22
40
|
}
|
|
23
41
|
}
|
|
24
42
|
//# sourceMappingURL=mime.js.map
|
package/lib/mime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,MAAM,
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B,MAAM,OAAO,IAAI;IAAjB;QACE,WAAM,GAA2B;YAC/B,IAAI,EAAE,0BAA0B;YAChC,IAAI,EAAE,iCAAiC;YACvC,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE,0BAA0B;SACjC,CAAC;QACF,mBAAc,GAAuC,SAAS,CAAC;IA+BjE,CAAC;IA7BC,MAAM,CAAC,OAAe;QACpB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAC3C,IAAI,KAAK,KAAK,IAAI;oBAAE,SAAS;gBAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;aACtC;SACF;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QAEpC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACpF,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SAC3D;QAED,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACzE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC7C;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrD,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { inspect } from 'util';
|
|
2
|
+
export default function defaultHelpersPlugin(app) {
|
|
3
|
+
app.addHelper('currentRoute', currentRoute);
|
|
4
|
+
app.decorateContext('inspect', (object, options) => inspect(object, options));
|
|
5
|
+
}
|
|
6
|
+
function currentRoute(ctx) {
|
|
7
|
+
const plan = ctx.plan;
|
|
8
|
+
if (plan === null)
|
|
9
|
+
return null;
|
|
10
|
+
const endpoint = plan.endpoint;
|
|
11
|
+
if (endpoint === undefined)
|
|
12
|
+
return null;
|
|
13
|
+
return endpoint.customName ?? endpoint.defaultName ?? null;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=default-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-helpers.js","sourceRoot":"","sources":["../../src/plugins/default-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,GAAY;IACvD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5C,GAAG,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,MAA2B,EAAE,OAAuB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,YAAY,CAAC,GAAgB;IACpC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC;AAC7D,CAAC"}
|
|
@@ -1,23 +1,11 @@
|
|
|
1
|
-
import { inspect } from 'util';
|
|
2
1
|
import DOM, { SafeString } from '@mojojs/dom';
|
|
3
2
|
export default function viewHelpersPlugin(app) {
|
|
4
|
-
app.addHelper('currentRoute', currentRoute);
|
|
5
|
-
app.decorateContext('inspect', (object, options) => inspect(object, options));
|
|
6
3
|
app.addHelper('include', include);
|
|
7
4
|
app.addHelper('mojoFaviconTag', mojoFaviconTag);
|
|
8
5
|
app.addHelper('scriptTag', scriptTag);
|
|
9
6
|
app.addHelper('styleTag', styleTag);
|
|
10
7
|
app.addHelper('tag', tag);
|
|
11
8
|
}
|
|
12
|
-
function currentRoute(ctx) {
|
|
13
|
-
const plan = ctx.plan;
|
|
14
|
-
if (plan === null)
|
|
15
|
-
return null;
|
|
16
|
-
const endpoint = plan.endpoint;
|
|
17
|
-
if (endpoint === undefined)
|
|
18
|
-
return null;
|
|
19
|
-
return endpoint.customName ?? endpoint.defaultName ?? null;
|
|
20
|
-
}
|
|
21
9
|
async function include(ctx, options, stash) {
|
|
22
10
|
return await ctx.renderToString(options, stash);
|
|
23
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-helpers.js","sourceRoot":"","sources":["../../src/plugins/view-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-helpers.js","sourceRoot":"","sources":["../../src/plugins/view-helpers.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,EAAE,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAY;IACpD,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAElC,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACtC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAgB,EAAE,OAAsB,EAAE,KAA0B;IACzF,OAAO,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,cAAc,CAAC,GAAgB;IACtC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,SAAS,CAAC,GAAgB,EAAE,MAAc;IACjD,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,MAAc;IAChD,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,GAAG,CACV,GAAgB,EAChB,IAAY,EACZ,QAAgC,EAAE,EAClC,UAA+B,EAAE;IAEjC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
package/lib/router.d.ts
CHANGED
|
@@ -22,9 +22,9 @@ export declare class Router extends Route {
|
|
|
22
22
|
addType(name: string, value: PlaceholderType): this;
|
|
23
23
|
dispatch(ctx: MojoContext): Promise<boolean>;
|
|
24
24
|
lookup(name: string): Route | null;
|
|
25
|
-
plot(spec: RouteSpec): Plan | null
|
|
25
|
+
plot(spec: RouteSpec): Promise<Plan | null>;
|
|
26
26
|
warmup(): Promise<void>;
|
|
27
|
-
_getPlan(ctx: MojoContext): Plan | null
|
|
28
|
-
_walk(plan: Plan, route: Route, spec: RouteSpec): boolean
|
|
27
|
+
_getPlan(ctx: MojoContext): Promise<Plan | null>;
|
|
28
|
+
_walk(plan: Plan, route: Route, spec: RouteSpec): Promise<boolean>;
|
|
29
29
|
}
|
|
30
30
|
export {};
|
package/lib/router.js
CHANGED
|
@@ -23,7 +23,7 @@ export class Router extends Route {
|
|
|
23
23
|
return this;
|
|
24
24
|
}
|
|
25
25
|
async dispatch(ctx) {
|
|
26
|
-
const plan = this._getPlan(ctx);
|
|
26
|
+
const plan = await this._getPlan(ctx);
|
|
27
27
|
if (plan === null)
|
|
28
28
|
return false;
|
|
29
29
|
ctx.plan = plan;
|
|
@@ -79,12 +79,12 @@ export class Router extends Route {
|
|
|
79
79
|
}
|
|
80
80
|
return this._lookupIndex[name] === undefined ? null : this._lookupIndex[name];
|
|
81
81
|
}
|
|
82
|
-
plot(spec) {
|
|
82
|
+
async plot(spec) {
|
|
83
83
|
const plan = new Plan();
|
|
84
84
|
const steps = plan.steps;
|
|
85
85
|
const stops = plan.stops;
|
|
86
86
|
for (const child of this.children) {
|
|
87
|
-
if (this._walk(plan, child, spec))
|
|
87
|
+
if (await this._walk(plan, child, spec))
|
|
88
88
|
break;
|
|
89
89
|
steps.pop();
|
|
90
90
|
stops.pop();
|
|
@@ -94,7 +94,7 @@ export class Router extends Route {
|
|
|
94
94
|
async warmup() {
|
|
95
95
|
Object.assign(this.controllers, await util.loadModules(this.controllerPaths));
|
|
96
96
|
}
|
|
97
|
-
_getPlan(ctx) {
|
|
97
|
+
async _getPlan(ctx) {
|
|
98
98
|
const req = ctx.req;
|
|
99
99
|
const realMethod = req.method;
|
|
100
100
|
if (realMethod === null)
|
|
@@ -107,7 +107,7 @@ export class Router extends Route {
|
|
|
107
107
|
ctx.log.trace(`${realMethod} "${path}"`);
|
|
108
108
|
// Cache deactivated
|
|
109
109
|
if (this.cache === null)
|
|
110
|
-
return this.plot({ ctx, method, path, websocket: isWebSocket });
|
|
110
|
+
return await this.plot({ ctx, method, path, websocket: isWebSocket });
|
|
111
111
|
// Cached
|
|
112
112
|
const cacheKey = `${method}:${path}:${isWebSocket.toString()}`;
|
|
113
113
|
const cache = this.cache;
|
|
@@ -115,13 +115,13 @@ export class Router extends Route {
|
|
|
115
115
|
if (cachedPlan !== undefined)
|
|
116
116
|
return cachedPlan;
|
|
117
117
|
// Not yet cached
|
|
118
|
-
const plan = this.plot({ ctx, method, path, websocket: isWebSocket });
|
|
118
|
+
const plan = await this.plot({ ctx, method, path, websocket: isWebSocket });
|
|
119
119
|
if (plan === null)
|
|
120
120
|
return null;
|
|
121
121
|
cache.set(cacheKey, plan);
|
|
122
122
|
return plan;
|
|
123
123
|
}
|
|
124
|
-
_walk(plan, route, spec) {
|
|
124
|
+
async _walk(plan, route, spec) {
|
|
125
125
|
// Path
|
|
126
126
|
const isEndpoint = route.isEndpoint();
|
|
127
127
|
const result = route.pattern.matchPartial(spec.path, { isEndpoint });
|
|
@@ -149,8 +149,9 @@ export class Router extends Route {
|
|
|
149
149
|
return false;
|
|
150
150
|
const conditions = root.conditions;
|
|
151
151
|
for (const value of route.requirements) {
|
|
152
|
-
if (spec.ctx === undefined ||
|
|
152
|
+
if (spec.ctx === undefined || (await conditions[value.condition](spec.ctx, value.requirement)) === false) {
|
|
153
153
|
return false;
|
|
154
|
+
}
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
// Endpoint
|
|
@@ -162,7 +163,7 @@ export class Router extends Route {
|
|
|
162
163
|
for (const child of route.children) {
|
|
163
164
|
const old = spec.path;
|
|
164
165
|
spec.path = result.remainder;
|
|
165
|
-
if (this._walk(plan, child, spec) === true)
|
|
166
|
+
if ((await this._walk(plan, child, spec)) === true)
|
|
166
167
|
return true;
|
|
167
168
|
spec.path = old;
|
|
168
169
|
steps.pop();
|