Skip to content
This repository was archived by the owner on Jul 6, 2025. It is now read-only.

Commit 7c7657d

Browse files
committed
Improve commands
1 parent 31f377d commit 7c7657d

File tree

14 files changed

+160
-249
lines changed

14 files changed

+160
-249
lines changed

cli.ts

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { bold } from "https://deno.land/[email protected]/fmt/colors.ts";
1+
import { parse } from "https://deno.land/[email protected]/flags/mod.ts";
22
import { readLines } from "https://deno.land/[email protected]/io/mod.ts";
33
import { writeAll } from "https://deno.land/[email protected]/streams/conversion.ts";
44
import { basename, resolve } from "https://deno.land/[email protected]/path/mod.ts";
55
import { readImportMap } from "./server/config.ts";
6-
import { parse } from "./lib/flags.ts";
76
import { findFile } from "./lib/fs.ts";
8-
import log, { stripColor } from "./lib/log.ts";
7+
import log, { bold, dim, stripColor } from "./lib/log.ts";
98
import { serveDir } from "./lib/serve.ts";
109
import util from "./lib/util.ts";
1110
import { VERSION } from "./version.ts";
@@ -33,12 +32,13 @@ Commands:
3332
}
3433
3534
Options:
36-
-v, --version Prints version number
37-
-h, --help Prints help message
35+
-L, --log-level <log-level> Set log level [possible values: debug, info]
36+
-v, --version Prints version number
37+
-h, --help Prints help message
3838
`;
3939

4040
async function main() {
41-
const { args, options } = parse();
41+
const { _: args, ...options } = parse(Deno.args);
4242

4343
// prints aleph.js version
4444
if (options.v) {
@@ -58,23 +58,14 @@ async function main() {
5858
Deno.exit(0);
5959
}
6060

61-
// prints help message when the command not found
62-
if (!(args.length > 0 && args[0] in commands)) {
61+
// prints help message
62+
if (options.h || options.help || !(args.length > 0 && args[0] in commands)) {
6363
console.log(helpMessage);
6464
Deno.exit(0);
6565
}
6666

6767
const command = String(args.shift()) as keyof typeof commands;
68-
69-
// prints command help message
70-
if (options.h || options.help) {
71-
const { helpMessage: cmdHelpMessage } = await import(
72-
`./commands/${command}.ts`
73-
);
74-
console.log(commands[command]);
75-
console.log(cmdHelpMessage);
76-
Deno.exit(0);
77-
}
68+
const runOptions: RunOptions = {};
7869

7970
// invoke `init` command
8071
if (command === "init") {
@@ -96,15 +87,13 @@ async function main() {
9687
}
9788
p.close();
9889

99-
const runOptions: RunOptions = {};
100-
10190
if (Deno.env.get("ALEPH_DEV")) {
10291
runOptions.denoConfigFile = resolve("./deno.json");
10392
runOptions.importMapFile = resolve("./import_map.json");
10493
Deno.env.set("ALEPH_DEV_ROOT", Deno.cwd());
10594
Deno.env.set("ALEPH_DEV_PORT", "2020");
10695
serveDir({ cwd: Deno.cwd(), port: 2020 });
107-
log.debug(`Proxy https://deno.land/x/aleph on http://localhost:2020`);
96+
console.debug(dim("DEBUG"), `Proxy https://deno.land/x/aleph on http://localhost:2020`);
10897
} else {
10998
runOptions.denoConfigFile = await findFile(["deno.jsonc", "deno.json", "tsconfig.json"]);
11099
runOptions.importMapFile = await findFile(

commands/build.ts

Lines changed: 17 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,46 @@
11
import { basename } from "https://deno.land/[email protected]/path/mod.ts";
2-
import { getFlag, parse } from "../lib/flags.ts";
32
import { findFile } from "../lib/fs.ts";
43
import { builtinModuleExts } from "../lib/helpers.ts";
5-
import log, { blue } from "../lib/log.ts";
6-
import util from "../lib/util.ts";
4+
import log, { blue, bold } from "../lib/log.ts";
75
import { initModuleLoaders, loadImportMap } from "../server/config.ts";
8-
import { build, type BuildPlatform, supportedPlatforms } from "../server/build.ts";
6+
import { build } from "../server/build.ts";
97
import { serve } from "../server/mod.ts";
10-
import { serveAppModules } from "../server/serve_modules.ts";
11-
12-
export const helpMessage = `
13-
Usage:
14-
deno run -A https://deno.land/x/aleph/cli.ts build [...options]
15-
16-
Options:
17-
-P, --platform <platform> Set deploy platform [possible values: deno, cf-worker, vercel]
18-
-L, --log-level <log-level> Set log level [possible values: debug, info]
19-
-h, --help Prints help message
20-
`;
8+
import { proxyModules } from "../server/proxy_modules.ts";
219

2210
if (import.meta.main) {
23-
const { options } = parse();
11+
// add envs
12+
Deno.env.set("ALEPH_CLI", "true");
13+
Deno.env.set("ALEPH_ENV", "prouduction");
2414

25-
let platform = getFlag(options, ["P", "platform"])?.toLowerCase() as BuildPlatform | undefined;
26-
if (platform) {
27-
if (!(platform in supportedPlatforms)) {
28-
log.fatal(`Unsupported platform: ${platform}`);
29-
}
30-
} else {
31-
const platforms: BuildPlatform[] = ["deno-deploy", "cf-worker", "vercel"];
32-
Deno.stdout.write(
33-
util.utf8TextEncoder.encode([
34-
"Deploy to:",
35-
"",
36-
...platforms.map((id, index) => ` ${index + 1}. ${supportedPlatforms[id]}`),
37-
"",
38-
"",
39-
].join("\n")),
40-
);
41-
while (true) {
42-
const p = prompt("Select a platform:");
43-
const n = parseInt(p || "");
44-
if (util.isInt(n) && n > 0 && n <= platforms.length) {
45-
platform = platforms[n - 1];
46-
break;
47-
}
48-
}
49-
}
15+
// set log level from flags `--log-level=[debug|info]`
16+
log.setLevelFromFlag();
5017

5118
// serve app modules
5219
const importMap = await loadImportMap();
5320
const moduleLoaders = await initModuleLoaders(importMap);
54-
serveAppModules(6060, { importMap, moduleLoaders });
21+
proxyModules(6060, { importMap, moduleLoaders });
5522

5623
let serverEntry = await findFile(builtinModuleExts.map((ext) => `server.${ext}`));
5724
if (serverEntry) {
5825
await import(
59-
`http://localhost:${Deno.env.get("ALEPH_APP_MODULES_PORT")}/${basename(serverEntry)}?t=${Date.now().toString(16)}`
26+
`http://localhost:${Deno.env.get("ALEPH_MODULES_PROXY_PORT")}/${basename(serverEntry)}?t=${
27+
Date.now().toString(16)
28+
}`
6029
);
61-
log.info(`Server handler imported from ${blue(basename(serverEntry))}`);
30+
log.info(`Build server from ${blue(basename(serverEntry))}`);
6231
}
6332

6433
// make the default handler
65-
if (!Reflect.has(globalThis, "__ALEPH_SERVER_HANDLER")) {
34+
if (!Reflect.has(globalThis, "__ALEPH_SERVER")) {
6635
serverEntry = undefined;
6736
serve();
6837
}
6938

70-
log.info(`Building for ${supportedPlatforms[platform]}...`);
71-
7239
const start = performance.now();
73-
const { clientModules } = await build(platform as unknown as "deno-deploy", serverEntry);
40+
const { clientModules, routeFiles } = await build(serverEntry);
7441

75-
log.info(`${clientModules.size} client modules built`);
42+
log.info(`${bold(routeFiles.length.toString(10))} routes found`);
43+
log.info(`${bold(clientModules.size.toString(10))} client modules built`);
7644
log.info(`Done in ${(performance.now() - start)}ms`);
7745
Deno.exit(0);
7846
}

commands/dev.ts

Lines changed: 25 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { basename, relative } from "https://deno.land/[email protected]/path/mod.ts";
22
import { serve as stdServe, serveTls } from "https://deno.land/[email protected]/http/server.ts";
33
import mitt, { Emitter } from "https://esm.sh/[email protected]";
4-
import { getFlag, parse, parsePortNumber } from "../lib/flags.ts";
54
import { findFile, watchFs } from "../lib/fs.ts";
65
import { builtinModuleExts } from "../lib/helpers.ts";
76
import log, { blue } from "../lib/log.ts";
@@ -10,22 +9,9 @@ import { initModuleLoaders, loadImportMap } from "../server/config.ts";
109
import { serve } from "../server/mod.ts";
1110
import { initRoutes, toRouteRegExp } from "../server/routing.ts";
1211
import type { DependencyGraph } from "../server/graph.ts";
13-
import { serveAppModules } from "../server/serve_modules.ts";
12+
import { proxyModules } from "../server/proxy_modules.ts";
1413
import type { AlephConfig } from "../server/types.ts";
1514

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-
2915
type FsEvents = {
3016
[key in "create" | "remove" | `modify:${string}` | `hotUpdate:${string}`]: { specifier: string };
3117
};
@@ -52,7 +38,7 @@ const handleHMRSocket = (req: Request): Response => {
5238
};
5339
socket.addEventListener("open", () => {
5440
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");
5642
if (config && config.routeFiles) {
5743
const reg = toRouteRegExp(config.routeFiles);
5844
const routePattern = reg.exec(specifier);
@@ -87,25 +73,17 @@ const handleHMRSocket = (req: Request): Response => {
8773
};
8874

8975
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");
10378
Deno.env.set("ALEPH_ENV", "development");
10479

80+
// set log level from flags `--log-level=[debug|info]`
81+
log.setLevelFromFlag();
82+
10583
// serve app modules
10684
const importMap = await loadImportMap();
10785
const moduleLoaders = await initModuleLoaders(importMap);
108-
serveAppModules(6060, { importMap, moduleLoaders });
86+
proxyModules(6060, { importMap, moduleLoaders });
10987

11088
log.info(`Watching files for changes...`);
11189
const cwd = Deno.cwd();
@@ -148,38 +126,42 @@ if (import.meta.main) {
148126
findFile(["import_map", "import-map", "importmap", "importMap"].map((v) => `${v}.json`)),
149127
findFile(builtinModuleExts.map((ext) => `server.${ext}`)),
150128
]);
151-
const importServerHandler = async (): Promise<void> => {
129+
const importServerHandler = async (reloaded?: boolean): Promise<void> => {
152130
if (serverEntry) {
153131
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=${
155133
Date.now().toString(16)
156134
}`
157135
);
158-
log.info(`Server handler imported from ${blue(basename(serverEntry))}`);
136+
if (reloaded) {
137+
log.info(`Reload ${blue(basename(serverEntry))}...`);
138+
}
159139
}
160140
};
161141
if (serverEntry) {
162-
emitter.on(`modify:./${basename(serverEntry)}`, importServerHandler);
142+
emitter.on(`hotUpdate:./${basename(serverEntry)}`, () => importServerHandler(true));
163143
if (denoConfigFile) {
164-
emitter.on(`modify:./${basename(denoConfigFile)}`, importServerHandler);
144+
emitter.on(`modify:./${basename(denoConfigFile)}`, () => importServerHandler(true));
165145
}
166146
if (importMapFile) {
167147
emitter.on(`modify:./${basename(importMapFile)}`, async () => {
148+
// update import maps for `proxyModules`
168149
Object.assign(importMap, await loadImportMap());
169-
importServerHandler();
150+
importServerHandler(true);
170151
});
171152
}
172153
await importServerHandler();
154+
log.info(`Bootstrap server from ${blue(basename(serverEntry))}...`);
173155
}
174156

175157
// make the default handler
176-
if (!Reflect.has(globalThis, "__ALEPH_SERVER_HANDLER")) {
158+
if (!Reflect.has(globalThis, "__ALEPH_SERVER")) {
177159
serve();
178160
}
179161

180162
// update routes when fs change
181163
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");
183165
if (config && config.routeFiles) {
184166
const reg = toRouteRegExp(config.routeFiles);
185167
if (reg.test(specifier)) {
@@ -190,22 +172,22 @@ if (import.meta.main) {
190172
emitter.on("create", updateRoutes);
191173
emitter.on("remove", updateRoutes);
192174

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) => {
195177
const { pathname } = new URL(req.url);
196178

197179
// handle HMR sockets
198180
if (pathname === "/-/hmr") {
199181
return handleHMRSocket(req);
200182
}
201183

202-
return Reflect.get(globalThis, "__ALEPH_SERVER_HANDLER")?.(req);
184+
return handler?.(req);
203185
};
204186

205187
log.info(`Server ready on http://localhost:${port}`);
206188
if (certFile && keyFile) {
207-
await serveTls(handler, { port, hostname, certFile, keyFile });
189+
await serveTls(devHandler, { port, hostname, certFile, keyFile });
208190
} else {
209-
await stdServe(handler, { port, hostname });
191+
await stdServe(devHandler, { port, hostname });
210192
}
211193
}

commands/init.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ export default async function (nameArg: string | undefined, template = "react")
169169
"",
170170
green("Aleph.js is ready to go!"),
171171
`${dim("▲")} cd ${name}`,
172-
`${dim("▲")} aleph dev ${dim("# start the app in `development` mode")}`,
173-
`${dim("▲")} aleph start ${dim("# start the app in `production` mode")}`,
174-
`${dim("▲")} aleph build ${dim("# build the app into a worker for serverless platforms like Deno Deploy")}`,
172+
`${dim("▲")} deno task dev ${dim("# start the app in `development` mode")}`,
173+
`${dim("▲")} deno task start ${dim("# start the app in `production` mode")}`,
174+
`${dim("▲")} deno task build ${dim("# build the app into a worker for serverless platforms like Deno Deploy")}`,
175175
"",
176176
`Docs: ${cyan("https://alephjs.org/docs")}`,
177177
`Bugs: ${cyan("https://alephjs.org.com/alephjs/aleph.js/issues")}`,

0 commit comments

Comments
 (0)