1
1
import { basename , relative } from "https://deno.land/[email protected] /path/mod.ts" ;
2
2
import { serve as stdServe , serveTls } from "https://deno.land/[email protected] /http/server.ts" ;
3
3
import mitt , { Emitter } from "https://esm.sh/[email protected] " ;
4
- import { getFlag , parse , parsePortNumber } from "../lib/flags.ts" ;
5
4
import { findFile , watchFs } from "../lib/fs.ts" ;
6
5
import { builtinModuleExts } from "../lib/helpers.ts" ;
7
6
import log , { blue } from "../lib/log.ts" ;
@@ -10,22 +9,9 @@ import { initModuleLoaders, loadImportMap } from "../server/config.ts";
10
9
import { serve } from "../server/mod.ts" ;
11
10
import { initRoutes , toRouteRegExp } from "../server/routing.ts" ;
12
11
import type { DependencyGraph } from "../server/graph.ts" ;
13
- import { serveAppModules } from "../server/serve_modules .ts" ;
12
+ import { proxyModules } from "../server/proxy_modules .ts" ;
14
13
import type { AlephConfig } from "../server/types.ts" ;
15
14
16
- export const helpMessage = `
17
- Usage:
18
- deno run -A https://deno.land/x/aleph/cli.ts dev [...options]
19
-
20
- Options:
21
- -p, --port <port> A port number to start the Aleph.js app, default is 8080
22
- --hostname <hostname> The address at which the server is to be started
23
- --tls-cert <cert-file> The server certificate file
24
- --tls-key <key-file> The server public key file
25
- -L, --log-level <log-level> Set log level [possible values: debug, info]
26
- -h, --help Prints help message
27
- ` ;
28
-
29
15
type FsEvents = {
30
16
[ key in "create" | "remove" | `modify:${string } ` | `hotUpdate:${string } `] : { specifier : string } ;
31
17
} ;
@@ -52,7 +38,7 @@ const handleHMRSocket = (req: Request): Response => {
52
38
} ;
53
39
socket . addEventListener ( "open" , ( ) => {
54
40
emitter . on ( "create" , ( { specifier } ) => {
55
- const config : AlephConfig | undefined = Reflect . get ( globalThis , "__ALEPH_SERVER_CONFIG " ) ;
41
+ const config : AlephConfig | undefined = Reflect . get ( globalThis , "__ALEPH_CONFIG " ) ;
56
42
if ( config && config . routeFiles ) {
57
43
const reg = toRouteRegExp ( config . routeFiles ) ;
58
44
const routePattern = reg . exec ( specifier ) ;
@@ -87,25 +73,17 @@ const handleHMRSocket = (req: Request): Response => {
87
73
} ;
88
74
89
75
if ( import . meta. main ) {
90
- const { options } = parse ( ) ;
91
- const port = parsePortNumber ( getFlag ( options , [ "p" , "port" ] , "8080" ) ) ;
92
- const hostname = getFlag ( options , [ "hostname" ] ) ;
93
- const certFile = getFlag ( options , [ "tls-cert" ] ) ;
94
- const keyFile = getFlag ( options , [ "tls-key" ] ) ;
95
-
96
- if ( keyFile !== undefined && certFile === undefined ) {
97
- log . fatal ( "missing `--tls-cert` option" ) ;
98
- } else if ( certFile !== undefined && keyFile === undefined ) {
99
- log . fatal ( "missing `--tls-key` option" ) ;
100
- }
101
-
102
- // development mode
76
+ // add envs
77
+ Deno . env . set ( "ALEPH_CLI" , "true" ) ;
103
78
Deno . env . set ( "ALEPH_ENV" , "development" ) ;
104
79
80
+ // set log level from flags `--log-level=[debug|info]`
81
+ log . setLevelFromFlag ( ) ;
82
+
105
83
// serve app modules
106
84
const importMap = await loadImportMap ( ) ;
107
85
const moduleLoaders = await initModuleLoaders ( importMap ) ;
108
- serveAppModules ( 6060 , { importMap, moduleLoaders } ) ;
86
+ proxyModules ( 6060 , { importMap, moduleLoaders } ) ;
109
87
110
88
log . info ( `Watching files for changes...` ) ;
111
89
const cwd = Deno . cwd ( ) ;
@@ -148,38 +126,42 @@ if (import.meta.main) {
148
126
findFile ( [ "import_map" , "import-map" , "importmap" , "importMap" ] . map ( ( v ) => `${ v } .json` ) ) ,
149
127
findFile ( builtinModuleExts . map ( ( ext ) => `server.${ ext } ` ) ) ,
150
128
] ) ;
151
- const importServerHandler = async ( ) : Promise < void > => {
129
+ const importServerHandler = async ( reloaded ?: boolean ) : Promise < void > => {
152
130
if ( serverEntry ) {
153
131
await import (
154
- `http://localhost:${ Deno . env . get ( "ALEPH_APP_MODULES_PORT " ) } /${ basename ( serverEntry ) } ?t=${
132
+ `http://localhost:${ Deno . env . get ( "ALEPH_MODULES_PROXY_PORT " ) } /${ basename ( serverEntry ) } ?t=${
155
133
Date . now ( ) . toString ( 16 )
156
134
} `
157
135
) ;
158
- log . info ( `Server handler imported from ${ blue ( basename ( serverEntry ) ) } ` ) ;
136
+ if ( reloaded ) {
137
+ log . info ( `Reload ${ blue ( basename ( serverEntry ) ) } ...` ) ;
138
+ }
159
139
}
160
140
} ;
161
141
if ( serverEntry ) {
162
- emitter . on ( `modify :./${ basename ( serverEntry ) } ` , importServerHandler ) ;
142
+ emitter . on ( `hotUpdate :./${ basename ( serverEntry ) } ` , ( ) => importServerHandler ( true ) ) ;
163
143
if ( denoConfigFile ) {
164
- emitter . on ( `modify:./${ basename ( denoConfigFile ) } ` , importServerHandler ) ;
144
+ emitter . on ( `modify:./${ basename ( denoConfigFile ) } ` , ( ) => importServerHandler ( true ) ) ;
165
145
}
166
146
if ( importMapFile ) {
167
147
emitter . on ( `modify:./${ basename ( importMapFile ) } ` , async ( ) => {
148
+ // update import maps for `proxyModules`
168
149
Object . assign ( importMap , await loadImportMap ( ) ) ;
169
- importServerHandler ( ) ;
150
+ importServerHandler ( true ) ;
170
151
} ) ;
171
152
}
172
153
await importServerHandler ( ) ;
154
+ log . info ( `Bootstrap server from ${ blue ( basename ( serverEntry ) ) } ...` ) ;
173
155
}
174
156
175
157
// make the default handler
176
- if ( ! Reflect . has ( globalThis , "__ALEPH_SERVER_HANDLER " ) ) {
158
+ if ( ! Reflect . has ( globalThis , "__ALEPH_SERVER " ) ) {
177
159
serve ( ) ;
178
160
}
179
161
180
162
// update routes when fs change
181
163
const updateRoutes = ( { specifier } : { specifier : string } ) => {
182
- const config : AlephConfig | undefined = Reflect . get ( globalThis , "__ALEPH_SERVER_CONFIG " ) ;
164
+ const config : AlephConfig | undefined = Reflect . get ( globalThis , "__ALEPH_CONFIG " ) ;
183
165
if ( config && config . routeFiles ) {
184
166
const reg = toRouteRegExp ( config . routeFiles ) ;
185
167
if ( reg . test ( specifier ) ) {
@@ -190,22 +172,22 @@ if (import.meta.main) {
190
172
emitter . on ( "create" , updateRoutes ) ;
191
173
emitter . on ( "remove" , updateRoutes ) ;
192
174
193
- // final server handler
194
- const handler = ( req : Request ) => {
175
+ const { hostname , port = 8080 , certFile , keyFile , handler } = Reflect . get ( globalThis , "__ALEPH_SERVER" ) || { } ;
176
+ const devHandler = ( req : Request ) => {
195
177
const { pathname } = new URL ( req . url ) ;
196
178
197
179
// handle HMR sockets
198
180
if ( pathname === "/-/hmr" ) {
199
181
return handleHMRSocket ( req ) ;
200
182
}
201
183
202
- return Reflect . get ( globalThis , "__ALEPH_SERVER_HANDLER" ) ?.( req ) ;
184
+ return handler ?.( req ) ;
203
185
} ;
204
186
205
187
log . info ( `Server ready on http://localhost:${ port } ` ) ;
206
188
if ( certFile && keyFile ) {
207
- await serveTls ( handler , { port, hostname, certFile, keyFile } ) ;
189
+ await serveTls ( devHandler , { port, hostname, certFile, keyFile } ) ;
208
190
} else {
209
- await stdServe ( handler , { port, hostname } ) ;
191
+ await stdServe ( devHandler , { port, hostname } ) ;
210
192
}
211
193
}
0 commit comments