From e88bafdcb9fad714167c19cba00a317b4925921e Mon Sep 17 00:00:00 2001 From: bluwy Date: Fri, 1 Dec 2023 17:10:27 +0800 Subject: [PATCH 1/7] Add CLI shortcuts --- .changeset/old-cherries-beg.md | 5 ++++ packages/astro/src/core/dev/restart.ts | 38 ++++++++++++++++++++++---- packages/astro/src/core/logger/core.ts | 1 + packages/astro/src/core/logger/vite.ts | 14 ++++++++-- packages/astro/src/core/messages.ts | 35 ++++++++++++++++-------- 5 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 .changeset/old-cherries-beg.md diff --git a/.changeset/old-cherries-beg.md b/.changeset/old-cherries-beg.md new file mode 100644 index 000000000000..e0b844fcb9a7 --- /dev/null +++ b/.changeset/old-cherries-beg.md @@ -0,0 +1,5 @@ +--- +'astro': minor +--- + +Adds CLI shortcuts for the dev server diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts index 3d77ef0c0cc5..05c39c1c2ce2 100644 --- a/packages/astro/src/core/dev/restart.ts +++ b/packages/astro/src/core/dev/restart.ts @@ -7,7 +7,7 @@ import { createNodeLogger, createSettings, resolveConfig } from '../config/index import { collectErrorMetadata } from '../errors/dev/utils.js'; import { isAstroConfigZodError } from '../errors/errors.js'; import { createSafeError } from '../errors/index.js'; -import { formatErrorMessage } from '../messages.js'; +import { formatErrorMessage, serverUrls } from '../messages.js'; import type { Container } from './container.js'; import { createContainer, startContainer } from './container.js'; @@ -137,7 +137,7 @@ export async function createContainerWithAutomaticRestart({ } else { // Restart success. Add new watches because this is a new container with a new Vite server restart.container = result; - addWatches(); + setupContainer(); resolveRestart(null); } restartComplete = new Promise((resolve) => { @@ -153,8 +153,8 @@ export async function createContainerWithAutomaticRestart({ }; } - // Set up watches - function addWatches() { + // Set up watchers, vite restart API, and shortcuts + function setupContainer() { const watcher = restart.container.viteServer.watcher; watcher.on('change', handleChangeRestart('Configuration file updated.')); watcher.on('unlink', handleChangeRestart('Configuration file removed.')); @@ -163,7 +163,35 @@ export async function createContainerWithAutomaticRestart({ // Restart the Astro dev server instead of Vite's when the API is called by plugins. // Ignore the `forceOptimize` parameter for now. restart.container.viteServer.restart = () => handleServerRestart(); + + // Set up shortcuts, overriding Vite's default shortcuts so it works for Astro + restart.container.viteServer.bindCLIShortcuts({ + customShortcuts: [ + { + key: 'r', + description: 'restart the server', + action: () => handleServerRestart(), + }, + { + key: 'u', + description: 'show server url', + action() { + logger.info( + 'SKIP_FORMAT', + serverUrls({ + resolvedUrls: restart.container.viteServer.resolvedUrls || { + local: [], + network: [], + }, + host: restart.container.settings.config.server.host, + base: restart.container.settings.config.base, + }) + ); + }, + }, + ], + }); } - addWatches(); + setupContainer(); return restart; } diff --git a/packages/astro/src/core/logger/core.ts b/packages/astro/src/core/logger/core.ts index db571d8f14da..d1fd043066b1 100644 --- a/packages/astro/src/core/logger/core.ts +++ b/packages/astro/src/core/logger/core.ts @@ -27,6 +27,7 @@ export type LoggerLabel = | 'middleware' | 'preferences' | 'redirects' + | 'shortcut' // SKIP_FORMAT: A special label that tells the logger not to apply any formatting. // Useful for messages that are already formatted, like the server start message. | 'SKIP_FORMAT'; diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index ac48369a3693..baec8761fab6 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -16,6 +16,10 @@ const vitePageReloadMsg = /page reload (.*)( \(.*\))?/; const viteHmrUpdateMsg = /hmr update (.*)/; // capture "vite v5.0.0 building SSR bundle for production..." and "vite v5.0.0 building for production..." messages const viteBuildMsg = /vite.*building.*for production/; +// capture "\n Shortcuts" messages +const viteShortcutTitleMsg = /.*Shortcuts.*/s; +// capture "press * + enter to ..." messages +const viteShortcutHelpMsg = /press.*\+ enter.*to.*/s; export function createViteLogger( astroLogger: AstroLogger, @@ -42,10 +46,16 @@ export function createViteLogger( if (isAstroSrcFile(m[1])) return; astroLogger.info('watch', m[1]); } - // Don't log Vite build messages - else if (viteBuildMsg.test(stripped)) { + // Don't log Vite build messages and shortcut titles + else if (viteBuildMsg.test(stripped) || viteShortcutTitleMsg.test(stripped)) { // noop } + // Log shortcuts help messages without indent + else if (viteShortcutHelpMsg.test(stripped)) { + // Don't log clear screen shortcut, we don't allow clear screen + if (stripped.includes('c + enter')) return; + astroLogger.info('shortcut', msg.replace(/\s+press/, 'press')); + } // Fallback else { astroLogger.info('vite', msg); diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index b105e985cb05..963f30118906 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -62,6 +62,29 @@ export function serverStart({ }): string { // PACKAGE_VERSION is injected at build-time const version = process.env.PACKAGE_VERSION ?? '0.0.0'; + + const messages = [ + '', + `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( + startupTime + )} ${dim('ms')}`, + '', + serverUrls({ resolvedUrls, host, base }), + `${dim('┃')} Press ${bold('h + enter')} for shortcuts`, + '', + ]; + return messages.filter((msg) => typeof msg === 'string').join('\n'); +} + +export function serverUrls({ + resolvedUrls, + host, + base, +}: { + resolvedUrls: ResolvedServerUrls; + host: string | boolean; + base: string; +}) { const localPrefix = `${dim('┃')} Local `; const networkPrefix = `${dim('┃')} Network `; const emptyPrefix = ' '.repeat(11); @@ -82,17 +105,7 @@ export function serverStart({ } } - const messages = [ - '', - `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( - startupTime - )} ${dim('ms')}`, - '', - ...localUrlMessages, - ...networkUrlMessages, - '', - ]; - return messages.filter((msg) => typeof msg === 'string').join('\n'); + return [...localUrlMessages, ...networkUrlMessages].join('\n'); } export function telemetryNotice() { From 21d7fb3abebe6c93e449b2ee9df515091dfc9173 Mon Sep 17 00:00:00 2001 From: bluwy Date: Fri, 1 Dec 2023 23:56:24 +0800 Subject: [PATCH 2/7] Update changeset --- .changeset/old-cherries-beg.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.changeset/old-cherries-beg.md b/.changeset/old-cherries-beg.md index e0b844fcb9a7..8446b904b948 100644 --- a/.changeset/old-cherries-beg.md +++ b/.changeset/old-cherries-beg.md @@ -2,4 +2,9 @@ 'astro': minor --- -Adds CLI shortcuts for the dev server +Adds CLI shortcuts for the dev server: + +- `r + enter`: restarts the dev server +- `u + enter`: shows the server URLs +- `o + enter`: opens the site in your browser +- `q + enter`: quits the dev server From 6a0a5d55a0d330afebd09c8971bf87baa970c7c6 Mon Sep 17 00:00:00 2001 From: bluwy Date: Sat, 2 Dec 2023 14:09:22 +0800 Subject: [PATCH 3/7] Remove server urls shortcut --- .changeset/old-cherries-beg.md | 1 - packages/astro/src/core/dev/restart.ts | 14 ++--------- packages/astro/src/core/logger/vite.ts | 5 ++-- packages/astro/src/core/messages.ts | 35 ++++++++------------------ 4 files changed, 16 insertions(+), 39 deletions(-) diff --git a/.changeset/old-cherries-beg.md b/.changeset/old-cherries-beg.md index 8446b904b948..b39aa2f1f230 100644 --- a/.changeset/old-cherries-beg.md +++ b/.changeset/old-cherries-beg.md @@ -5,6 +5,5 @@ Adds CLI shortcuts for the dev server: - `r + enter`: restarts the dev server -- `u + enter`: shows the server URLs - `o + enter`: opens the site in your browser - `q + enter`: quits the dev server diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts index 05c39c1c2ce2..714365794d88 100644 --- a/packages/astro/src/core/dev/restart.ts +++ b/packages/astro/src/core/dev/restart.ts @@ -7,7 +7,7 @@ import { createNodeLogger, createSettings, resolveConfig } from '../config/index import { collectErrorMetadata } from '../errors/dev/utils.js'; import { isAstroConfigZodError } from '../errors/errors.js'; import { createSafeError } from '../errors/index.js'; -import { formatErrorMessage, serverUrls } from '../messages.js'; +import { formatErrorMessage } from '../messages.js'; import type { Container } from './container.js'; import { createContainer, startContainer } from './container.js'; @@ -176,17 +176,7 @@ export async function createContainerWithAutomaticRestart({ key: 'u', description: 'show server url', action() { - logger.info( - 'SKIP_FORMAT', - serverUrls({ - resolvedUrls: restart.container.viteServer.resolvedUrls || { - local: [], - network: [], - }, - host: restart.container.settings.config.server.host, - base: restart.container.settings.config.base, - }) - ); + // TODO: show the server urls }, }, ], diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index baec8761fab6..710e35feda45 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -52,8 +52,9 @@ export function createViteLogger( } // Log shortcuts help messages without indent else if (viteShortcutHelpMsg.test(stripped)) { - // Don't log clear screen shortcut, we don't allow clear screen - if (stripped.includes('c + enter')) return; + // Remove Vite's builtin shortcuts we don't support. We can do this cleaner once + // https://github.com/vitejs/vite/pull/15218 lands + if (stripped.includes('c + enter') || stripped.includes('u + enter')) return; astroLogger.info('shortcut', msg.replace(/\s+press/, 'press')); } // Fallback diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 963f30118906..b105e985cb05 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -62,29 +62,6 @@ export function serverStart({ }): string { // PACKAGE_VERSION is injected at build-time const version = process.env.PACKAGE_VERSION ?? '0.0.0'; - - const messages = [ - '', - `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( - startupTime - )} ${dim('ms')}`, - '', - serverUrls({ resolvedUrls, host, base }), - `${dim('┃')} Press ${bold('h + enter')} for shortcuts`, - '', - ]; - return messages.filter((msg) => typeof msg === 'string').join('\n'); -} - -export function serverUrls({ - resolvedUrls, - host, - base, -}: { - resolvedUrls: ResolvedServerUrls; - host: string | boolean; - base: string; -}) { const localPrefix = `${dim('┃')} Local `; const networkPrefix = `${dim('┃')} Network `; const emptyPrefix = ' '.repeat(11); @@ -105,7 +82,17 @@ export function serverUrls({ } } - return [...localUrlMessages, ...networkUrlMessages].join('\n'); + const messages = [ + '', + `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( + startupTime + )} ${dim('ms')}`, + '', + ...localUrlMessages, + ...networkUrlMessages, + '', + ]; + return messages.filter((msg) => typeof msg === 'string').join('\n'); } export function telemetryNotice() { From c188802c668cde1e10668932bd6b70c00d276fb0 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Mon, 18 Dec 2023 17:09:10 -0600 Subject: [PATCH 4/7] feat: improve CLI shortcut formatting --- packages/astro/src/core/logger/vite.ts | 6 ++++-- packages/astro/src/core/messages.ts | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index 710e35feda45..8600a70d63d3 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -3,6 +3,7 @@ import stripAnsi from 'strip-ansi'; import type { Logger as ViteLogger, Rollup, LogLevel } from 'vite'; import { isAstroError } from '../errors/errors.js'; import { isLogLevelEnabled, type Logger as AstroLogger } from './core.js'; +import { serverShortcuts as formatServerShortcuts } from '../messages.js'; const PKG_PREFIX = fileURLToPath(new URL('../../../', import.meta.url)); const E2E_PREFIX = fileURLToPath(new URL('../../../e2e', import.meta.url)); @@ -19,7 +20,7 @@ const viteBuildMsg = /vite.*building.*for production/; // capture "\n Shortcuts" messages const viteShortcutTitleMsg = /.*Shortcuts.*/s; // capture "press * + enter to ..." messages -const viteShortcutHelpMsg = /press.*\+ enter.*to.*/s; +const viteShortcutHelpMsg = /press\s+(.*\+ enter).*to\s+(.*)$/s; export function createViteLogger( astroLogger: AstroLogger, @@ -55,7 +56,8 @@ export function createViteLogger( // Remove Vite's builtin shortcuts we don't support. We can do this cleaner once // https://github.com/vitejs/vite/pull/15218 lands if (stripped.includes('c + enter') || stripped.includes('u + enter')) return; - astroLogger.info('shortcut', msg.replace(/\s+press/, 'press')); + const [, key, label] = viteShortcutHelpMsg.exec(stripped)! as string[]; + astroLogger.info('SKIP_FORMAT', formatServerShortcuts({ key, label })); } // Fallback else { diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index b105e985cb05..29d6ae038a96 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -13,6 +13,7 @@ import { red, underline, yellow, + reset, } from 'kleur/colors'; import type { ResolvedServerUrls } from 'vite'; import type { ZodError } from 'zod'; @@ -83,8 +84,7 @@ export function serverStart({ } const messages = [ - '', - `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( + `${bgGreen(bold(black(` astro `)))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( startupTime )} ${dim('ms')}`, '', @@ -95,6 +95,18 @@ export function serverStart({ return messages.filter((msg) => typeof msg === 'string').join('\n'); } +/** Display custom dev server shortcuts */ +export function serverShortcuts({ + key, + label +}: { + key: string, + label: string, +}): string { + return [dim(' Press'), key, dim('to'), label].join(' '); +} + + export function telemetryNotice() { const headline = blue(`▶ Astro collects anonymous usage data.`); const why = ' This information helps us improve Astro.'; From 9935fa46f2871075d1e3ec4d1fe7c7fd52e874f7 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Mon, 18 Dec 2023 17:16:49 -0600 Subject: [PATCH 5/7] chore: remove unused import --- packages/astro/src/core/messages.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 29d6ae038a96..3183d935edc3 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -13,7 +13,6 @@ import { red, underline, yellow, - reset, } from 'kleur/colors'; import type { ResolvedServerUrls } from 'vite'; import type { ZodError } from 'zod'; From bdb4c67663a374faf3afca5b275179ec178f85fa Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 22 Jan 2024 20:37:36 +0800 Subject: [PATCH 6/7] Cleanup --- packages/astro/src/core/dev/restart.ts | 10 +++------- packages/astro/src/core/logger/vite.ts | 3 --- packages/astro/src/core/messages.ts | 12 +++--------- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts index 714365794d88..0942fe3967c5 100644 --- a/packages/astro/src/core/dev/restart.ts +++ b/packages/astro/src/core/dev/restart.ts @@ -172,13 +172,9 @@ export async function createContainerWithAutomaticRestart({ description: 'restart the server', action: () => handleServerRestart(), }, - { - key: 'u', - description: 'show server url', - action() { - // TODO: show the server urls - }, - }, + // Disable Vite's builtin "u" (print server urls) and "c" (clear console) shortcuts + { key: 'u', description: '' }, + { key: 'c', description: '' }, ], }); } diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index 8600a70d63d3..235481cec98e 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -53,9 +53,6 @@ export function createViteLogger( } // Log shortcuts help messages without indent else if (viteShortcutHelpMsg.test(stripped)) { - // Remove Vite's builtin shortcuts we don't support. We can do this cleaner once - // https://github.com/vitejs/vite/pull/15218 lands - if (stripped.includes('c + enter') || stripped.includes('u + enter')) return; const [, key, label] = viteShortcutHelpMsg.exec(stripped)! as string[]; astroLogger.info('SKIP_FORMAT', formatServerShortcuts({ key, label })); } diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 3183d935edc3..5b424944feda 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -83,7 +83,8 @@ export function serverStart({ } const messages = [ - `${bgGreen(bold(black(` astro `)))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( + '', + `${bgGreen(bold(` astro `))} ${green(`v${version}`)} ${dim(`ready in`)} ${Math.round( startupTime )} ${dim('ms')}`, '', @@ -95,17 +96,10 @@ export function serverStart({ } /** Display custom dev server shortcuts */ -export function serverShortcuts({ - key, - label -}: { - key: string, - label: string, -}): string { +export function serverShortcuts({ key, label }: { key: string; label: string }): string { return [dim(' Press'), key, dim('to'), label].join(' '); } - export function telemetryNotice() { const headline = blue(`▶ Astro collects anonymous usage data.`); const why = ' This information helps us improve Astro.'; From 2f596f901449c4570e3ecd5149936093c8b1b94c Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 30 Jan 2024 17:08:00 +0800 Subject: [PATCH 7/7] Cleanup --- .changeset/old-cherries-beg.md | 4 ++-- packages/astro/src/core/dev/restart.ts | 8 ++------ packages/astro/src/core/logger/vite.ts | 4 ++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.changeset/old-cherries-beg.md b/.changeset/old-cherries-beg.md index b39aa2f1f230..cf074297e7ab 100644 --- a/.changeset/old-cherries-beg.md +++ b/.changeset/old-cherries-beg.md @@ -2,8 +2,8 @@ 'astro': minor --- -Adds CLI shortcuts for the dev server: +Adds CLI shortcuts as an easter egg for the dev server: -- `r + enter`: restarts the dev server - `o + enter`: opens the site in your browser - `q + enter`: quits the dev server +- `h + enter`: prints all available shortcuts diff --git a/packages/astro/src/core/dev/restart.ts b/packages/astro/src/core/dev/restart.ts index 0942fe3967c5..23e6af369abc 100644 --- a/packages/astro/src/core/dev/restart.ts +++ b/packages/astro/src/core/dev/restart.ts @@ -167,12 +167,8 @@ export async function createContainerWithAutomaticRestart({ // Set up shortcuts, overriding Vite's default shortcuts so it works for Astro restart.container.viteServer.bindCLIShortcuts({ customShortcuts: [ - { - key: 'r', - description: 'restart the server', - action: () => handleServerRestart(), - }, - // Disable Vite's builtin "u" (print server urls) and "c" (clear console) shortcuts + // Disable Vite's builtin "r" (restart server), "u" (print server urls) and "c" (clear console) shortcuts + { key: 'r', description: '' }, { key: 'u', description: '' }, { key: 'c', description: '' }, ], diff --git a/packages/astro/src/core/logger/vite.ts b/packages/astro/src/core/logger/vite.ts index aa423fafbe81..9604a68f05d0 100644 --- a/packages/astro/src/core/logger/vite.ts +++ b/packages/astro/src/core/logger/vite.ts @@ -18,9 +18,9 @@ const viteHmrUpdateMsg = /hmr update (.*)/; // capture "vite v5.0.0 building SSR bundle for production..." and "vite v5.0.0 building for production..." messages const viteBuildMsg = /vite.*building.*for production/; // capture "\n Shortcuts" messages -const viteShortcutTitleMsg = /.*Shortcuts.*/s; +const viteShortcutTitleMsg = /^\s*Shortcuts\s*$/s; // capture "press * + enter to ..." messages -const viteShortcutHelpMsg = /press\s+(.*\+ enter).*to\s+(.*)$/s; +const viteShortcutHelpMsg = /press\s+(.*?)\s+to\s+(.*)$/s; export function createViteLogger( astroLogger: AstroLogger,