diff --git a/.changeset/stupid-colts-post.md b/.changeset/stupid-colts-post.md new file mode 100644 index 000000000000..01d72b33929d --- /dev/null +++ b/.changeset/stupid-colts-post.md @@ -0,0 +1,8 @@ +--- +'@astrojs/mdx': patch +'@astrojs/rss': patch +'astro': patch +'@astrojs/db': patch +--- + +Reduces terminal text styling dependency size by switching from `kleur` to `picocolors` diff --git a/packages/astro-rss/package.json b/packages/astro-rss/package.json index 14444b773047..d31e110e88cb 100644 --- a/packages/astro-rss/package.json +++ b/packages/astro-rss/package.json @@ -34,6 +34,6 @@ }, "dependencies": { "fast-xml-parser": "^5.3.0", - "kleur": "^4.1.5" + "picocolors": "^1.1.1" } } diff --git a/packages/astro-rss/src/index.ts b/packages/astro-rss/src/index.ts index 5ce459a3c245..38dc8ba26590 100644 --- a/packages/astro-rss/src/index.ts +++ b/packages/astro-rss/src/index.ts @@ -1,6 +1,6 @@ import { z } from 'astro/zod'; import { XMLBuilder, XMLParser } from 'fast-xml-parser'; -import { yellow } from 'kleur/colors'; +import colors from 'picocolors'; import { rssSchema } from './schema.js'; import { createCanonicalURL, errorMap, isValidURL } from './util.js'; @@ -71,7 +71,7 @@ const rssOptionsValidator = z.object({ .transform((items) => { if (!Array.isArray(items)) { console.warn( - yellow( + colors.yellow( '[RSS] Passing a glob result directly has been deprecated. Please migrate to the `pagesGlobToRssItems()` helper: https://docs.astro.build/en/guides/rss/', ), ); diff --git a/packages/astro/package.json b/packages/astro/package.json index 25a528cea637..8a185fdc0ccc 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -138,7 +138,6 @@ "http-cache-semantics": "^4.2.0", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.0", - "kleur": "^4.1.5", "magic-string": "^0.30.18", "magicast": "^0.3.5", "mrmime": "^2.0.1", @@ -146,6 +145,7 @@ "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.3.0", + "picocolors": "^1.1.1", "picomatch": "^4.0.3", "prompts": "^2.4.2", "rehype": "^13.0.2", diff --git a/packages/astro/performance/content-benchmark.mjs b/packages/astro/performance/content-benchmark.mjs index c4081a9e9a7a..2764b629ca31 100644 --- a/packages/astro/performance/content-benchmark.mjs +++ b/packages/astro/performance/content-benchmark.mjs @@ -1,6 +1,6 @@ import { fileURLToPath } from 'node:url'; import { parseArgs } from 'node:util'; -import { bold, cyan, dim } from 'kleur/colors'; +import colors from 'picocolors'; import { loadFixture } from '../test/test-utils.js'; import { generatePosts } from './scripts/generate-posts.mjs'; @@ -31,7 +31,9 @@ async function benchmark({ fixtures, templates, numPosts }) { const now = performance.now(); console.info(`[${fixture}] Building...`); await build(); - console.info(cyan(`[${fixture}] Built in ${bold(getTimeStat(now, performance.now()))}.`)); + console.info( + colors.cyan(`[${fixture}] Built in ${colors.bold(getTimeStat(now, performance.now()))}.`), + ); } } @@ -56,7 +58,7 @@ async function benchmark({ fixtures, templates, numPosts }) { if (test.includes('simple')) { const fixtures = formats; console.info( - `\n${bold('Simple')} ${dim(`${numPosts} posts (${formatsToString(fixtures)})`)}`, + `\n${colors.bold('Simple')} ${colors.dim(`${numPosts} posts (${formatsToString(fixtures)})`)}`, ); process.env.ASTRO_PERFORMANCE_TEST_NAME = 'simple'; await benchmark({ @@ -73,7 +75,7 @@ async function benchmark({ fixtures, templates, numPosts }) { if (test.includes('with-astro-components')) { const fixtures = formats.filter((format) => format !== 'md'); console.info( - `\n${bold('With Astro components')} ${dim( + `\n${colors.bold('With Astro components')} ${colors.dim( `${numPosts} posts (${formatsToString(fixtures)})`, )}`, ); @@ -91,7 +93,7 @@ async function benchmark({ fixtures, templates, numPosts }) { if (test.includes('with-react-components')) { const fixtures = formats.filter((format) => format !== 'md'); console.info( - `\n${bold('With React components')} ${dim( + `\n${colors.bold('With React components')} ${colors.dim( `${numPosts} posts (${formatsToString(fixtures)})`, )}`, ); diff --git a/packages/astro/performance/package.json b/packages/astro/performance/package.json index 36d62528176b..3eba2bff08a1 100644 --- a/packages/astro/performance/package.json +++ b/packages/astro/performance/package.json @@ -10,7 +10,7 @@ "keywords": [], "author": "", "license": "ISC", - "devDependencies": { - "kleur": "^4.1.5" + "dependencies": { + "picocolors": "^1.1.1" } } diff --git a/packages/astro/src/assets/build/generate.ts b/packages/astro/src/assets/build/generate.ts index 14a4b00d1b95..9ba0bd933134 100644 --- a/packages/astro/src/assets/build/generate.ts +++ b/packages/astro/src/assets/build/generate.ts @@ -1,6 +1,6 @@ import fs, { readFileSync } from 'node:fs'; import { basename } from 'node:path/posix'; -import { dim, green } from 'kleur/colors'; +import colors from 'picocolors'; import { getOutDirWithinCwd } from '../../core/build/common.js'; import type { BuildPipeline } from '../../core/build/pipeline.js'; import { getTimeStat } from '../../core/build/util.js'; @@ -143,7 +143,7 @@ export async function generateImagesForPath( const count = `(${env.count.current}/${env.count.total})`; env.logger.info( null, - ` ${green('▶')} ${filepath} ${dim(statsText)} ${dim(timeIncrease)} ${dim(count)}`, + ` ${colors.green('▶')} ${filepath} ${colors.dim(statsText)} ${colors.dim(timeIncrease)} ${colors.dim(count)}`, ); env.count.current++; } diff --git a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts index e4d54c76a09c..b3969bfef564 100644 --- a/packages/astro/src/assets/fonts/vite-plugin-fonts.ts +++ b/packages/astro/src/assets/fonts/vite-plugin-fonts.ts @@ -2,7 +2,7 @@ import { mkdirSync, writeFileSync } from 'node:fs'; import { readFile } from 'node:fs/promises'; import { isAbsolute } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import type { Plugin } from 'vite'; import { getAlgorithm, shouldTrackCspHashes } from '../../core/csp/common.js'; import { generateCspDigest } from '../../core/encryption.js'; @@ -185,7 +185,7 @@ export function fontsPlugin({ settings, sync, logger }: Options): Plugin { }); }, defaults: DEFAULTS, - bold, + bold: colors.bold, stringMatcher, }); // We initialize shared variables here and reset them in buildEnd diff --git a/packages/astro/src/cli/add/index.ts b/packages/astro/src/cli/add/index.ts index fbdbfef18b7a..05950632e0aa 100644 --- a/packages/astro/src/cli/add/index.ts +++ b/packages/astro/src/cli/add/index.ts @@ -3,10 +3,10 @@ import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import boxen from 'boxen'; import { diffWords } from 'diff'; -import { bold, cyan, dim, green, magenta, red, yellow } from 'kleur/colors'; import { type ASTNode, builders, generateCode, loadFile, type ProxifiedModule } from 'magicast'; import { getDefaultExportOptions } from 'magicast/helpers'; import { detect, resolveCommand } from 'package-manager-detector'; +import colors from 'picocolors'; import prompts from 'prompts'; import maxSatisfying from 'semver/ranges/max-satisfying.js'; import type yargsParser from 'yargs-parser'; @@ -34,6 +34,8 @@ import { exec } from '../exec.js'; import { createLoggerFromFlags, type Flags, flagsToAstroInlineConfig } from '../flags.js'; import { fetchPackageJson, fetchPackageVersions } from '../install-package.js'; +const { bold, cyan, dim, green, magenta, red, yellow } = colors; + interface AddOptions { flags: Flags; } diff --git a/packages/astro/src/cli/dev/index.ts b/packages/astro/src/cli/dev/index.ts index 1ff7bbdeae3d..4dc91ea16eec 100644 --- a/packages/astro/src/cli/dev/index.ts +++ b/packages/astro/src/cli/dev/index.ts @@ -1,4 +1,4 @@ -import { cyan } from 'kleur/colors'; +import colors from 'picocolors'; import devServer from '../../core/dev/index.js'; import { printHelp } from '../../core/messages.js'; import { type Flags, flagsToAstroInlineConfig } from '../flags.js'; @@ -27,7 +27,7 @@ export async function dev({ flags }: DevOptions) { ['--help (-h)', 'See all available flags.'], ], }, - description: `Check ${cyan( + description: `Check ${colors.cyan( 'https://docs.astro.build/en/reference/cli-reference/#astro-dev', )} for more information.`, }); diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts index e41b000bf9a8..b0731cb5cfd0 100644 --- a/packages/astro/src/cli/index.ts +++ b/packages/astro/src/cli/index.ts @@ -1,4 +1,4 @@ -import * as colors from 'kleur/colors'; +import colors from 'picocolors'; import yargs from 'yargs-parser'; import { ASTRO_VERSION } from '../core/constants.js'; @@ -62,19 +62,19 @@ function resolveCommand(flags: yargs.Arguments): CLICommand { async function runCommand(cmd: string, flags: yargs.Arguments) { const [ { createLoggerFromFlags }, - { createKleurTextStyler }, + { createPicocolorsTextStyler }, { createBuildTimeAstroVersionProvider }, { createLoggerHelpDisplay }, { createCliCommandRunner }, ] = await Promise.all([ import('./flags.js'), - import('./infra/kleur-text-styler.js'), + import('./infra/picocolors-text-styler.js'), import('./infra/build-time-astro-version-provider.js'), import('./infra/logger-help-display.js'), import('./infra/cli-command-runner.js'), ]); const logger = createLoggerFromFlags(flags); - const textStyler = createKleurTextStyler(); + const textStyler = createPicocolorsTextStyler(); const astroVersionProvider = createBuildTimeAstroVersionProvider(); const helpDisplay = createLoggerHelpDisplay({ logger, diff --git a/packages/astro/src/cli/info/index.ts b/packages/astro/src/cli/info/index.ts index 50476df4221f..b9f0b081b6fa 100644 --- a/packages/astro/src/cli/info/index.ts +++ b/packages/astro/src/cli/info/index.ts @@ -1,6 +1,6 @@ import { spawn, spawnSync } from 'node:child_process'; import { arch, platform } from 'node:os'; -import * as colors from 'kleur/colors'; +import colors from 'picocolors'; import prompts from 'prompts'; import { resolveConfig } from '../../core/config/index.js'; import { ASTRO_VERSION } from '../../core/constants.js'; diff --git a/packages/astro/src/cli/infra/kleur-text-styler.ts b/packages/astro/src/cli/infra/kleur-text-styler.ts deleted file mode 100644 index 4988f2fc22a6..000000000000 --- a/packages/astro/src/cli/infra/kleur-text-styler.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as colors from 'kleur/colors'; -import type { TextStyler } from '../definitions.js'; - -export function createKleurTextStyler(): TextStyler { - return colors; -} diff --git a/packages/astro/src/cli/infra/picocolors-text-styler.ts b/packages/astro/src/cli/infra/picocolors-text-styler.ts new file mode 100644 index 000000000000..09facf6ce0b2 --- /dev/null +++ b/packages/astro/src/cli/infra/picocolors-text-styler.ts @@ -0,0 +1,6 @@ +import colors from 'picocolors'; +import type { TextStyler } from '../definitions.js'; + +export function createPicocolorsTextStyler(): TextStyler { + return colors; +} diff --git a/packages/astro/src/cli/install-package.ts b/packages/astro/src/cli/install-package.ts index 3c931b3e1849..8568b29b5fd9 100644 --- a/packages/astro/src/cli/install-package.ts +++ b/packages/astro/src/cli/install-package.ts @@ -1,14 +1,15 @@ import { createRequire } from 'node:module'; import boxen from 'boxen'; import ci from 'ci-info'; -import { bold, cyan, dim, magenta } from 'kleur/colors'; import { detect, resolveCommand } from 'package-manager-detector'; +import colors from 'picocolors'; import prompts from 'prompts'; import yoctoSpinner from 'yocto-spinner'; import type { Logger } from '../core/logger/core.js'; import { exec } from './exec.js'; const require = createRequire(import.meta.url); +const { bold, cyan, dim, magenta } = colors; type GetPackageOptions = { skipAsk?: boolean; diff --git a/packages/astro/src/cli/preferences/index.ts b/packages/astro/src/cli/preferences/index.ts index 8a22802a3f6c..1dfdb45368f5 100644 --- a/packages/astro/src/cli/preferences/index.ts +++ b/packages/astro/src/cli/preferences/index.ts @@ -2,7 +2,7 @@ import { fileURLToPath } from 'node:url'; import { formatWithOptions } from 'node:util'; import dlv from 'dlv'; import { flattie } from 'flattie'; -import { bgGreen, black, bold, dim, yellow } from 'kleur/colors'; +import colors from 'picocolors'; import { resolveConfig } from '../../core/config/config.js'; import { createSettings } from '../../core/config/settings.js'; import { collectErrorMetadata } from '../../core/errors/dev/utils.js'; @@ -13,6 +13,8 @@ import { coerce, isValidKey, type PreferenceKey } from '../../preferences/index. import type { AstroSettings } from '../../types/astro.js'; import { createLoggerFromFlags, type Flags, flagsToAstroInlineConfig } from '../flags.js'; +const { bgGreen, black, bold, dim, yellow } = colors; + interface PreferencesOptions { flags: Flags; } @@ -323,9 +325,11 @@ function annotatedFormat(mv: AnnotatedValue) { // this is the real formatting for annotated values function formatAnnotated( mv: AnnotatedValue, - style: (value: string | number | boolean) => string = (v) => v.toString(), + style: (value: string) => string = (v) => v.toString(), ) { - return mv.annotation ? `${style(mv.value)} ${dim(mv.annotation)}` : style(mv.value); + return mv.annotation + ? `${style(String(mv.value))} ${dim(mv.annotation)}` + : style(String(mv.value)); } function formatTable(object: Record, columnLabels: [string, string]) { const [colA, colB] = columnLabels; @@ -335,7 +339,7 @@ function formatTable(object: Record, columnLabels: [stri _i: number, a: string, b: AnnotatedValue, - style: (value: string | number | boolean) => string = (v) => v.toString(), + style: (value: string) => string = (v) => v.toString(), ): string { return `${dim(chars.v)} ${style(a)} ${space(colALength - a.length - 2)} ${dim( chars.v, diff --git a/packages/astro/src/cli/preview/index.ts b/packages/astro/src/cli/preview/index.ts index b7af0ea1a373..bfb7e56f36b0 100644 --- a/packages/astro/src/cli/preview/index.ts +++ b/packages/astro/src/cli/preview/index.ts @@ -1,4 +1,4 @@ -import { cyan } from 'kleur/colors'; +import colors from 'picocolors'; import { printHelp } from '../../core/messages.js'; import previewServer from '../../core/preview/index.js'; import { type Flags, flagsToAstroInlineConfig } from '../flags.js'; @@ -25,7 +25,7 @@ export async function preview({ flags }: PreviewOptions) { ['--help (-h)', 'See all available flags.'], ], }, - description: `Starts a local server to serve your static dist/ directory. Check ${cyan( + description: `Starts a local server to serve your static dist/ directory. Check ${colors.cyan( 'https://docs.astro.build/en/reference/cli-reference/#astro-preview', )} for more information.`, }); diff --git a/packages/astro/src/content/loaders/glob.ts b/packages/astro/src/content/loaders/glob.ts index ab78f2a76425..8054cb2587c8 100644 --- a/packages/astro/src/content/loaders/glob.ts +++ b/packages/astro/src/content/loaders/glob.ts @@ -1,8 +1,8 @@ import { existsSync, promises as fs } from 'node:fs'; import { relative } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { bold, green } from 'kleur/colors'; import pLimit from 'p-limit'; +import colors from 'picocolors'; import picomatch from 'picomatch'; import { glob as tinyglobby } from 'tinyglobby'; import type { ContentEntryRenderFunction, ContentEntryType } from '../../types/public/content.js'; @@ -300,15 +300,15 @@ export function glob(globOptions: GlobOptions): Loader { : globOptions.pattern; logger.warn( - `The glob() loader cannot be used for files in ${bold('src/content')} when legacy mode is enabled.`, + `The glob() loader cannot be used for files in ${colors.bold('src/content')} when legacy mode is enabled.`, ); if (skipCount > 10) { logger.warn( - `Skipped ${green(skippedFiles.length)} files that matched ${green(patternList)}.`, + `Skipped ${colors.green(skippedFiles.length)} files that matched ${colors.green(patternList)}.`, ); } else { - logger.warn(`Skipped the following files that matched ${green(patternList)}:`); - skippedFiles.forEach((file) => logger.warn(`• ${green(file)}`)); + logger.warn(`Skipped the following files that matched ${colors.green(patternList)}:`); + skippedFiles.forEach((file) => logger.warn(`• ${colors.green(file)}`)); } } @@ -335,7 +335,7 @@ export function glob(globOptions: GlobOptions): Loader { const baseUrl = pathToFileURL(basePath); const oldId = fileToIdMap.get(changedPath); await syncData(entry, baseUrl, entryType, oldId); - logger.info(`Reloaded data from ${green(entry)}`); + logger.info(`Reloaded data from ${colors.green(entry)}`); } watcher.on('change', onChange); diff --git a/packages/astro/src/content/server-listeners.ts b/packages/astro/src/content/server-listeners.ts index 492a5a5160cf..297e1ba01ba8 100644 --- a/packages/astro/src/content/server-listeners.ts +++ b/packages/astro/src/content/server-listeners.ts @@ -1,7 +1,7 @@ import type fsMod from 'node:fs'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { bold, cyan, underline } from 'kleur/colors'; +import colors from 'picocolors'; import type { ViteDevServer } from 'vite'; import { loadTSConfig } from '../core/config/tsconfig.js'; import type { Logger } from '../core/logger/core.js'; @@ -29,7 +29,7 @@ export async function attachContentServerListeners({ } else if (fs.existsSync(contentPaths.contentDir)) { logger.debug( 'content', - `Watching ${cyan( + `Watching ${colors.cyan( contentPaths.contentDir.href.replace(settings.config.root.href, ''), )} for changes`, ); @@ -87,12 +87,12 @@ function warnAllowJsIsFalse({ }) { logger.warn( 'content', - `Make sure you have the ${bold('allowJs')} compiler option set to ${bold( + `Make sure you have the ${colors.bold('allowJs')} compiler option set to ${colors.bold( 'true', - )} in your ${bold(tsConfigFileName)} file to have autocompletion in your ${bold( + )} in your ${colors.bold(tsConfigFileName)} file to have autocompletion in your ${colors.bold( contentConfigFileName, - )} file. See ${underline( - cyan('https://www.typescriptlang.org/tsconfig#allowJs'), + )} file. See ${colors.underline( + colors.cyan('https://www.typescriptlang.org/tsconfig#allowJs'), )} for more information.`, ); } diff --git a/packages/astro/src/content/types-generator.ts b/packages/astro/src/content/types-generator.ts index ac6d1c51e64d..365de725dcc2 100644 --- a/packages/astro/src/content/types-generator.ts +++ b/packages/astro/src/content/types-generator.ts @@ -1,7 +1,7 @@ import type fsMod from 'node:fs'; import * as path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; -import { bold, cyan } from 'kleur/colors'; +import colors from 'picocolors'; import { glob } from 'tinyglobby'; import { normalizePath, type ViteDevServer } from 'vite'; import { type ZodSchema, z } from 'zod'; @@ -133,7 +133,7 @@ export async function createContentTypesGenerator({ type: 'unknown', entries: {}, }; - logger.debug('content', `${cyan(collection)} collection added`); + logger.debug('content', `${colors.cyan(collection)} collection added`); break; case 'unlinkDir': delete collectionEntryMap[collectionKey]; @@ -162,11 +162,11 @@ export async function createContentTypesGenerator({ if (collection === undefined) { logger.warn( 'content', - `${bold( + `${colors.bold( normalizePath( path.relative(fileURLToPath(contentPaths.contentDir), fileURLToPath(event.entry)), ), - )} must live in a ${bold('content/...')} collection subdirectory.`, + )} must live in a ${colors.bold('content/...')} collection subdirectory.`, ); return { shouldGenerateTypes: false }; } diff --git a/packages/astro/src/content/utils.ts b/packages/astro/src/content/utils.ts index d3f416df406d..9114dd2eeac3 100644 --- a/packages/astro/src/content/utils.ts +++ b/packages/astro/src/content/utils.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { parseFrontmatter } from '@astrojs/markdown-remark'; import { slug as githubSlug } from 'github-slugger'; -import { green, red } from 'kleur/colors'; +import colors from 'picocolors'; import type { PluginContext } from 'rollup'; import type { ViteDevServer } from 'vite'; import xxhash from 'xxhash-wasm'; @@ -556,10 +556,10 @@ async function loadContentConfig({ return { ...config.data, digest }; } else { const message = config.error.issues - .map((issue) => ` → ${green(issue.path.join('.'))}: ${red(issue.message)}`) + .map((issue) => ` → ${colors.green(issue.path.join('.'))}: ${colors.red(issue.message)}`) .join('\n'); console.error( - `${green('[content]')} There was a problem with your content config:\n\n${message}\n`, + `${colors.green('[content]')} There was a problem with your content config:\n\n${message}\n`, ); if (settings.config.experimental.liveContentCollections) { const liveCollections = Object.entries(unparsedConfig.collections ?? {}).filter( @@ -665,7 +665,7 @@ async function autogenerateCollections({ Auto-generating collections for folders in "src/content/" that are not defined as collections. This is deprecated, so you should define these collections yourself in "src/content.config.ts". The following collections have been auto-generated: ${orphanedCollections - .map((name) => green(name)) + .map((name) => colors.green(name)) .join(', ')}\n`, ); } diff --git a/packages/astro/src/core/build/generate.ts b/packages/astro/src/core/build/generate.ts index 0e18441bc058..36197100f0ff 100644 --- a/packages/astro/src/core/build/generate.ts +++ b/packages/astro/src/core/build/generate.ts @@ -1,8 +1,8 @@ import fs from 'node:fs'; import os from 'node:os'; -import { bgGreen, black, blue, bold, dim, green, magenta, red, yellow } from 'kleur/colors'; import PLimit from 'p-limit'; import PQueue from 'p-queue'; +import colors from 'picocolors'; import { NOOP_ACTIONS_MOD } from '../../actions/noop-actions.js'; import { generateImagesForPath, @@ -64,6 +64,8 @@ import type { } from './types.js'; import { getTimeStat, shouldAppendForwardSlash } from './util.js'; +const { bgGreen, black, blue, bold, dim, green, magenta, red, yellow } = colors; + export async function generatePages(options: StaticBuildOptions, internals: BuildInternals) { const generatePagesTimer = performance.now(); const ssr = options.settings.buildOutput === 'server'; diff --git a/packages/astro/src/core/build/index.ts b/packages/astro/src/core/build/index.ts index 30030dcc94be..b0fbcbbe3737 100644 --- a/packages/astro/src/core/build/index.ts +++ b/packages/astro/src/core/build/index.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import { performance } from 'node:perf_hooks'; import { fileURLToPath } from 'node:url'; -import { blue, bold, green } from 'kleur/colors'; +import colors from 'picocolors'; import type * as vite from 'vite'; import { telemetry } from '../../events/index.js'; import { eventCliSession } from '../../events/session.js'; @@ -174,11 +174,14 @@ class AstroBuilder { await runHookBuildStart({ config: this.settings.config, logger: this.logger }); this.validateConfig(); - this.logger.info('build', `output: ${blue('"' + this.settings.config.output + '"')}`); - this.logger.info('build', `mode: ${blue('"' + this.settings.buildOutput + '"')}`); - this.logger.info('build', `directory: ${blue(fileURLToPath(this.settings.config.outDir))}`); + this.logger.info('build', `output: ${colors.blue('"' + this.settings.config.output + '"')}`); + this.logger.info('build', `mode: ${colors.blue('"' + this.settings.buildOutput + '"')}`); + this.logger.info( + 'build', + `directory: ${colors.blue(fileURLToPath(this.settings.config.outDir))}`, + ); if (this.settings.adapter) { - this.logger.info('build', `adapter: ${green(this.settings.adapter.name)}`); + this.logger.info('build', `adapter: ${colors.green(this.settings.adapter.name)}`); } this.logger.info('build', 'Collecting build info...'); this.timer.loadStart = performance.now(); @@ -198,7 +201,7 @@ class AstroBuilder { this.timer.buildStart = performance.now(); this.logger.info( 'build', - green(`✓ Completed in ${getTimeStat(this.timer.init, performance.now())}.`), + colors.green(`✓ Completed in ${getTimeStat(this.timer.init, performance.now())}.`), ); const hasKey = hasEnvironmentKey(); @@ -302,12 +305,12 @@ class AstroBuilder { let messages: string[] = []; if (buildMode === 'static') { - messages = [`${pageCount} page(s) built in`, bold(total)]; + messages = [`${pageCount} page(s) built in`, colors.bold(total)]; } else { - messages = ['Server built in', bold(total)]; + messages = ['Server built in', colors.bold(total)]; } logger.info('build', messages.join(' ')); - logger.info('build', `${bold('Complete!')}`); + logger.info('build', `${colors.bold('Complete!')}`); } } diff --git a/packages/astro/src/core/build/page-data.ts b/packages/astro/src/core/build/page-data.ts index 3c7ba93ec4a9..b6da2155c98f 100644 --- a/packages/astro/src/core/build/page-data.ts +++ b/packages/astro/src/core/build/page-data.ts @@ -1,4 +1,4 @@ -import * as colors from 'kleur/colors'; +import colors from 'picocolors'; import type { AstroSettings, RoutesList } from '../../types/astro.js'; import type { Logger } from '../logger/core.js'; import { debug } from '../logger/core.js'; diff --git a/packages/astro/src/core/build/static-build.ts b/packages/astro/src/core/build/static-build.ts index 955acf7d8eba..8f313fc79669 100644 --- a/packages/astro/src/core/build/static-build.ts +++ b/packages/astro/src/core/build/static-build.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { teardown } from '@astrojs/compiler'; -import { bgGreen, black, green } from 'kleur/colors'; +import colors from 'picocolors'; import { glob } from 'tinyglobby'; import * as vite from 'vite'; import { type BuildInternals, createBuildInternals } from '../../core/build/internal.js'; @@ -65,7 +65,10 @@ export async function viteBuild(opts: StaticBuildOptions) { const ssrTime = performance.now(); opts.logger.info('build', `Building ${settings.buildOutput} entrypoints...`); const ssrOutput = await ssrBuild(opts, internals, pageInput, container); - opts.logger.info('build', green(`✓ Completed in ${getTimeStat(ssrTime, performance.now())}.`)); + opts.logger.info( + 'build', + colors.green(`✓ Completed in ${getTimeStat(ssrTime, performance.now())}.`), + ); settings.timer.end('SSR build'); @@ -255,7 +258,7 @@ async function clientBuild( } const { lastVitePlugins, vitePlugins } = await container.runBeforeHook('client', input); - opts.logger.info('SKIP_FORMAT', `\n${bgGreen(black(' building client (vite) '))}`); + opts.logger.info('SKIP_FORMAT', `\n${colors.bgGreen(colors.black(' building client (vite) '))}`); const viteBuildConfig: vite.InlineConfig = { ...viteConfig, diff --git a/packages/astro/src/core/config/config.ts b/packages/astro/src/core/config/config.ts index 9a371e994db2..a71cf390d342 100644 --- a/packages/astro/src/core/config/config.ts +++ b/packages/astro/src/core/config/config.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import * as colors from 'kleur/colors'; +import colors from 'picocolors'; import { ZodError } from 'zod'; import { eventConfigError, telemetry } from '../../events/index.js'; import type { diff --git a/packages/astro/src/core/dev/dev.ts b/packages/astro/src/core/dev/dev.ts index 4dfdfc1ec2e3..36b7906fb13d 100644 --- a/packages/astro/src/core/dev/dev.ts +++ b/packages/astro/src/core/dev/dev.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import type http from 'node:http'; import type { AddressInfo } from 'node:net'; import { performance } from 'node:perf_hooks'; -import { green } from 'kleur/colors'; +import colors from 'picocolors'; import { gt, major, minor, patch } from 'semver'; import type * as vite from 'vite'; import { getDataStoreFile, globalContentLayer } from '../../content/content-layer.js'; @@ -134,7 +134,7 @@ export default async function dev(inlineConfig: AstroInlineConfig): Promise$1'); } else { return markdown - .replace(linkRegex, (_, m1, m2) => `${bold(m1)} ${underline(m2)}`) - .replace(urlRegex, (fullMatch) => ` ${underline(fullMatch.trim())}`) - .replace(boldRegex, (_, m1) => `${bold(m1)}`); + .replace(linkRegex, (_, m1, m2) => `${colors.bold(m1)} ${colors.underline(m2)}`) + .replace(urlRegex, (fullMatch) => ` ${colors.underline(fullMatch.trim())}`) + .replace(boldRegex, (_, m1) => `${colors.bold(m1)}`); } } diff --git a/packages/astro/src/core/logger/core.ts b/packages/astro/src/core/logger/core.ts index 76a0f29d7011..814cf11e4731 100644 --- a/packages/astro/src/core/logger/core.ts +++ b/packages/astro/src/core/logger/core.ts @@ -1,4 +1,4 @@ -import { blue, bold, dim, red, yellow } from 'kleur/colors'; +import colors from 'picocolors'; export interface LogWritable { write: (chunk: T) => boolean; @@ -135,7 +135,7 @@ export function getEventPrefix({ level, label }: LogMessage) { const timestamp = `${dateTimeFormat.format(new Date())}`; const prefix = []; if (level === 'error' || level === 'warn') { - prefix.push(bold(timestamp)); + prefix.push(colors.bold(timestamp)); prefix.push(`[${level.toUpperCase()}]`); } else { prefix.push(timestamp); @@ -144,15 +144,15 @@ export function getEventPrefix({ level, label }: LogMessage) { prefix.push(`[${label}]`); } if (level === 'error') { - return red(prefix.join(' ')); + return colors.red(prefix.join(' ')); } if (level === 'warn') { - return yellow(prefix.join(' ')); + return colors.yellow(prefix.join(' ')); } if (prefix.length === 1) { - return dim(prefix[0]); + return colors.dim(prefix[0]); } - return dim(prefix[0]) + ' ' + blue(prefix.splice(1).join(' ')); + return colors.dim(prefix[0]) + ' ' + colors.blue(prefix.splice(1).join(' ')); } /** Print out a timer message for debug() */ @@ -160,7 +160,7 @@ export function timerMessage(message: string, startTime: number = Date.now()) { let timeDiff = Date.now() - startTime; let timeDisplay = timeDiff < 750 ? `${Math.round(timeDiff)}ms` : `${(timeDiff / 1000).toFixed(1)}s`; - return `${message} ${dim(timeDisplay)}`; + return `${message} ${colors.dim(timeDisplay)}`; } export class Logger { diff --git a/packages/astro/src/core/messages.ts b/packages/astro/src/core/messages.ts index 7a2746de02da..8404a7adb9e5 100644 --- a/packages/astro/src/core/messages.ts +++ b/packages/astro/src/core/messages.ts @@ -1,8 +1,21 @@ +import { detect, resolveCommand } from 'package-manager-detector'; +import colors from 'picocolors'; +import type { ResolvedServerUrls } from 'vite'; +import type { ZodError } from 'zod'; +import { getDocsForError, renderErrorMarkdown } from './errors/dev/utils.js'; import { - bgCyan, + AstroError, + AstroUserError, + CompilerError, + type ErrorWithMetadata, +} from './errors/index.js'; +import { padMultilineString } from './util.js'; + +const { bgGreen, - bgWhite, bgYellow, + bgCyan, + bgWhite, black, blue, bold, @@ -12,18 +25,7 @@ import { red, underline, yellow, -} from 'kleur/colors'; -import { detect, resolveCommand } from 'package-manager-detector'; -import type { ResolvedServerUrls } from 'vite'; -import type { ZodError } from 'zod'; -import { getDocsForError, renderErrorMarkdown } from './errors/dev/utils.js'; -import { - AstroError, - AstroUserError, - CompilerError, - type ErrorWithMetadata, -} from './errors/index.js'; -import { padMultilineString } from './util.js'; +} = colors; /** * Prestyled messages for the CLI. Used by astro CLI commands. diff --git a/packages/astro/src/core/render-context.ts b/packages/astro/src/core/render-context.ts index 67f6070b9a75..48469f80c3d0 100644 --- a/packages/astro/src/core/render-context.ts +++ b/packages/astro/src/core/render-context.ts @@ -1,4 +1,4 @@ -import { green } from 'kleur/colors'; +import colors from 'picocolors'; import { getActionContext } from '../actions/runtime/server.js'; import { deserializeActionResult } from '../actions/runtime/shared.js'; import type { ActionAPIContext } from '../actions/runtime/utils.js'; @@ -429,14 +429,14 @@ export class RenderContext { if (this.isPrerendered) { pipeline.logger.warn( 'session', - `context.session was used when rendering the route ${green(this.routePattern)}, but it is not available on prerendered routes. If you need access to sessions, make sure that the route is server-rendered using \`export const prerender = false;\` or by setting \`output\` to \`"server"\` in your Astro config to make all your routes server-rendered by default. For more information, see https://docs.astro.build/en/guides/sessions/`, + `context.session was used when rendering the route ${colors.green(this.routePattern)}, but it is not available on prerendered routes. If you need access to sessions, make sure that the route is server-rendered using \`export const prerender = false;\` or by setting \`output\` to \`"server"\` in your Astro config to make all your routes server-rendered by default. For more information, see https://docs.astro.build/en/guides/sessions/`, ); return undefined; } if (!renderContext.session) { pipeline.logger.warn( 'session', - `context.session was used when rendering the route ${green(this.routePattern)}, but no storage configuration was provided. Either configure the storage manually or use an adapter that provides session storage. For more information, see https://docs.astro.build/en/guides/sessions/`, + `context.session was used when rendering the route ${colors.green(this.routePattern)}, but no storage configuration was provided. Either configure the storage manually or use an adapter that provides session storage. For more information, see https://docs.astro.build/en/guides/sessions/`, ); return undefined; } @@ -671,14 +671,14 @@ export class RenderContext { if (this.isPrerendered) { pipeline.logger.warn( 'session', - `Astro.session was used when rendering the route ${green(this.routePattern)}, but it is not available on prerendered pages. If you need access to sessions, make sure that the page is server-rendered using \`export const prerender = false;\` or by setting \`output\` to \`"server"\` in your Astro config to make all your pages server-rendered by default. For more information, see https://docs.astro.build/en/guides/sessions/`, + `Astro.session was used when rendering the route ${colors.green(this.routePattern)}, but it is not available on prerendered pages. If you need access to sessions, make sure that the page is server-rendered using \`export const prerender = false;\` or by setting \`output\` to \`"server"\` in your Astro config to make all your pages server-rendered by default. For more information, see https://docs.astro.build/en/guides/sessions/`, ); return undefined; } if (!renderContext.session) { pipeline.logger.warn( 'session', - `Astro.session was used when rendering the route ${green(this.routePattern)}, but no storage configuration was provided. Either configure the storage manually or use an adapter that provides session storage. For more information, see https://docs.astro.build/en/guides/sessions/`, + `Astro.session was used when rendering the route ${colors.green(this.routePattern)}, but no storage configuration was provided. Either configure the storage manually or use an adapter that provides session storage. For more information, see https://docs.astro.build/en/guides/sessions/`, ); return undefined; } diff --git a/packages/astro/src/core/routing/manifest/create.ts b/packages/astro/src/core/routing/manifest/create.ts index 032be21aee2b..2f32bb3b72be 100644 --- a/packages/astro/src/core/routing/manifest/create.ts +++ b/packages/astro/src/core/routing/manifest/create.ts @@ -2,8 +2,8 @@ import nodeFs from 'node:fs'; import { createRequire } from 'node:module'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import { bold } from 'kleur/colors'; import pLimit from 'p-limit'; +import colors from 'picocolors'; import { injectImageEndpoint } from '../../../assets/endpoint/config.js'; import { toRoutingStrategy } from '../../../i18n/utils.js'; import { runHookRoutesResolved } from '../../../integrations/hooks.js'; @@ -148,7 +148,7 @@ function createFileBasedRoutes( if (!isDir && !validPageExtensions.has(ext) && !validEndpointExtensions.has(ext)) { logger.warn( null, - `Unsupported file type ${bold( + `Unsupported file type ${colors.bold( resolved, )} found. Prefix filename with an underscore (\`_\`) to ignore.`, ); diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index deab6e6e3db6..2bac3623c1c5 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -2,7 +2,7 @@ import fsMod from 'node:fs'; import { dirname, relative } from 'node:path'; import { performance } from 'node:perf_hooks'; import { fileURLToPath } from 'node:url'; -import { dim } from 'kleur/colors'; +import colors from 'picocolors'; import { createServer, type FSWatcher, type HMRPayload } from 'vite'; import { syncFonts } from '../../assets/fonts/sync.js'; import { CONTENT_TYPES_FILE } from '../../content/consts.js'; @@ -186,7 +186,7 @@ export async function syncInternal({ syncFonts(settings); writeInjectedTypes(settings, fs); - logger.info('types', `Generated ${dim(getTimeStat(timerStart, performance.now()))}`); + logger.info('types', `Generated ${colors.dim(getTimeStat(timerStart, performance.now()))}`); } function getTsReference(type: 'path' | 'types', value: string) { diff --git a/packages/astro/src/integrations/hooks.ts b/packages/astro/src/integrations/hooks.ts index 7e28a782d7d6..222da91018b2 100644 --- a/packages/astro/src/integrations/hooks.ts +++ b/packages/astro/src/integrations/hooks.ts @@ -1,7 +1,7 @@ import fsMod from 'node:fs'; import type { AddressInfo } from 'node:net'; import { fileURLToPath } from 'node:url'; -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import type { InlineConfig, ViteDevServer } from 'vite'; import { mergeConfig as mergeViteConfig } from 'vite'; import astroIntegrationActionsRouteHandler from '../actions/integration.js'; @@ -53,7 +53,7 @@ async function withTakingALongTimeMsg({ const timeout = setTimeout(() => { logger.info( 'build', - `Waiting for integration ${bold(JSON.stringify(name))}, hook ${bold( + `Waiting for integration ${colors.bold(JSON.stringify(name))}, hook ${colors.bold( JSON.stringify(hookName), )}...`, ); @@ -62,7 +62,7 @@ async function withTakingALongTimeMsg({ return await hookFn(); } catch (err) { integrationLogger.error( - `An unhandled error occurred while running the ${bold(JSON.stringify(hookName))} hook`, + `An unhandled error occurred while running the ${colors.bold(JSON.stringify(hookName))} hook`, ); throw err; } finally { @@ -158,7 +158,7 @@ export function normalizeCodegenDir(integrationName: string): string { export function normalizeInjectedTypeFilename(filename: string, integrationName: string): string { if (!filename.endsWith('.d.ts')) { throw new Error( - `Integration ${bold(integrationName)} is injecting a type that does not end with "${bold('.d.ts')}"`, + `Integration ${colors.bold(integrationName)} is injecting a type that does not end with "${colors.bold('.d.ts')}"`, ); } return `${normalizeCodegenDir(integrationName)}${filename.replace(SAFE_CHARS_RE, '_')}`; @@ -223,12 +223,14 @@ export async function runHookConfigSetup({ isRestart, addRenderer(renderer: AstroRenderer) { if (!renderer.name) { - throw new Error(`Integration ${bold(integration.name)} has an unnamed renderer.`); + throw new Error( + `Integration ${colors.bold(integration.name)} has an unnamed renderer.`, + ); } if (!renderer.serverEntrypoint) { throw new Error( - `Renderer ${bold(renderer.name)} does not provide a serverEntrypoint.`, + `Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.`, ); } diff --git a/packages/astro/src/runtime/server/endpoint.ts b/packages/astro/src/runtime/server/endpoint.ts index ae4062436c42..a86d4ab5190a 100644 --- a/packages/astro/src/runtime/server/endpoint.ts +++ b/packages/astro/src/runtime/server/endpoint.ts @@ -1,4 +1,4 @@ -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import { REROUTABLE_STATUS_CODES, REROUTE_DIRECTIVE_HEADER } from '../../core/constants.js'; import { AstroError } from '../../core/errors/errors.js'; import { EndpointDidNotReturnAResponse } from '../../core/errors/errors-data.js'; @@ -27,7 +27,7 @@ export async function renderEndpoint( if (isPrerendered && !['GET', 'HEAD'].includes(method)) { logger.warn( 'router', - `${url.pathname} ${bold( + `${url.pathname} ${colors.bold( method, )} requests are not available in static endpoints. Mark this page as server-rendered (\`export const prerender = false;\`) or update your config to \`output: 'server'\` to make all your pages server-rendered by default.`, ); diff --git a/packages/astro/src/vite-plugin-astro-server/base.ts b/packages/astro/src/vite-plugin-astro-server/base.ts index 1a9b06464ba4..0f12375f28db 100644 --- a/packages/astro/src/vite-plugin-astro-server/base.ts +++ b/packages/astro/src/vite-plugin-astro-server/base.ts @@ -1,7 +1,7 @@ import * as fs from 'node:fs'; import path from 'node:path'; import { appendForwardSlash } from '@astrojs/internal-helpers/path'; -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import type * as vite from 'vite'; import type { Logger } from '../core/logger/core.js'; import { notFoundTemplate, subpathNotUsedTemplate } from '../template/4xx.js'; @@ -54,7 +54,7 @@ export function baseMiddleware( logger.error( 'router', - `Request URLs for ${bold( + `Request URLs for ${colors.bold( publicDir, )} assets must also include your base. "${expectedLocation}" expected, but received "${url}".`, ); diff --git a/packages/astro/src/vite-plugin-scanner/index.ts b/packages/astro/src/vite-plugin-scanner/index.ts index 5059320e5d58..ce8276d7f207 100644 --- a/packages/astro/src/vite-plugin-scanner/index.ts +++ b/packages/astro/src/vite-plugin-scanner/index.ts @@ -1,6 +1,6 @@ import { extname } from 'node:path'; import { fileURLToPath } from 'node:url'; -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import type { Plugin as VitePlugin } from 'vite'; import { warnMissingAdapter } from '../core/dev/adapter-validation.js'; import type { Logger } from '../core/logger/core.js'; @@ -62,7 +62,7 @@ export default function astroScannerPlugin({ ) { logger.warn( 'router', - `getStaticPaths() ignored in dynamic page ${bold( + `getStaticPaths() ignored in dynamic page ${colors.bold( rootRelativePath(settings.config.root, fileURL, true), )}. Add \`export const prerender = true;\` to prerender the page as static HTML during the build process.`, ); diff --git a/packages/astro/test/test-utils.js b/packages/astro/test/test-utils.js index 1178c4ceb602..32e575caccc0 100644 --- a/packages/astro/test/test-utils.js +++ b/packages/astro/test/test-utils.js @@ -4,7 +4,6 @@ import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { stripVTControlCharacters } from 'node:util'; import { execa } from 'execa'; -import * as kleur from 'kleur/colors'; import { glob } from 'tinyglobby'; import { Agent } from 'undici'; import { check } from '../dist/cli/check/index.js'; @@ -18,9 +17,6 @@ import sync from '../dist/core/sync/index.js'; // Disable telemetry when running tests process.env.ASTRO_TELEMETRY_DISABLED = true; -// Disable colors when running tests -kleur.$.enabled = false; - /** * @typedef {import('../src/core/dev/dev').DevServer} DevServer * @typedef {import('../src/types/public/config.js').AstroInlineConfig & { root?: string | URL }} AstroInlineConfig diff --git a/packages/db/package.json b/packages/db/package.json index d1eabd4950a6..c3305e1d4b7d 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -75,8 +75,8 @@ "@libsql/client": "^0.15.15", "deep-diff": "^1.0.2", "drizzle-orm": "^0.42.0", - "kleur": "^4.1.5", "nanoid": "^5.1.6", + "picocolors": "^1.1.1", "prompts": "^2.4.2", "yargs-parser": "^21.1.1", "zod": "^3.25.76" diff --git a/packages/db/src/core/cli/commands/execute/index.ts b/packages/db/src/core/cli/commands/execute/index.ts index 0664e642d602..d97b79798b76 100644 --- a/packages/db/src/core/cli/commands/execute/index.ts +++ b/packages/db/src/core/cli/commands/execute/index.ts @@ -1,6 +1,6 @@ import { existsSync } from 'node:fs'; import type { AstroConfig } from 'astro'; -import { green } from 'kleur/colors'; +import colors from 'picocolors'; import type { Arguments } from 'yargs-parser'; import { isDbError } from '../../../../runtime/utils.js'; import { @@ -64,7 +64,7 @@ export async function cmd({ } try { await mod.default(); - console.info(`${green('✔')} File run successfully.`); + console.info(`${colors.green('✔')} File run successfully.`); } catch (e) { if (isDbError(e)) throw new Error(EXEC_ERROR(e.message)); else throw e; diff --git a/packages/db/src/core/cli/migration-queries.ts b/packages/db/src/core/cli/migration-queries.ts index 5b662a3f3d22..02f108c32b63 100644 --- a/packages/db/src/core/cli/migration-queries.ts +++ b/packages/db/src/core/cli/migration-queries.ts @@ -2,8 +2,8 @@ import { stripVTControlCharacters } from 'node:util'; import deepDiff from 'deep-diff'; import { sql } from 'drizzle-orm'; import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core'; -import * as color from 'kleur/colors'; import { customAlphabet } from 'nanoid'; +import color from 'picocolors'; import { isSerializedSQL } from '../../runtime/types.js'; import { hasPrimaryKey, isDbError } from '../../runtime/utils.js'; import { MIGRATION_VERSION } from '../consts.js'; diff --git a/packages/db/src/core/cli/print-help.ts b/packages/db/src/core/cli/print-help.ts index 4082380b2d86..90a62cae0e27 100644 --- a/packages/db/src/core/cli/print-help.ts +++ b/packages/db/src/core/cli/print-help.ts @@ -1,4 +1,4 @@ -import { bgGreen, bgWhite, black, bold, dim, green } from 'kleur/colors'; +import colors from 'picocolors'; /** * Uses implementation from Astro core @@ -18,7 +18,7 @@ export function printHelp({ description?: string; }) { const linebreak = () => ''; - const title = (label: string) => ` ${bgWhite(black(` ${label} `))}`; + const title = (label: string) => ` ${colors.bgWhite(colors.black(` ${label} `))}`; const table = (rows: [string, string][], { padding }: { padding: number }) => { const split = process.stdout.columns < 60; let raw = ''; @@ -29,7 +29,7 @@ export function printHelp({ } else { raw += `${`${row[0]}`.padStart(padding)}`; } - raw += ' ' + dim(row[1]) + '\n'; + raw += ' ' + colors.dim(row[1]) + '\n'; } return raw.slice(0, -1); // remove latest \n @@ -40,14 +40,14 @@ export function printHelp({ if (headline) { message.push( linebreak(), - ` ${bgGreen(black(` ${commandName} `))} ${green( + ` ${colors.bgGreen(colors.black(` ${commandName} `))} ${colors.green( `v${process.env.PACKAGE_VERSION ?? ''}`, )} ${headline}`, ); } if (usage) { - message.push(linebreak(), ` ${green(commandName)} ${bold(usage)}`); + message.push(linebreak(), ` ${colors.green(commandName)} ${colors.bold(usage)}`); } if (tables) { diff --git a/packages/db/src/core/errors.ts b/packages/db/src/core/errors.ts index 5272fd3c2051..e81d27ab9ab2 100644 --- a/packages/db/src/core/errors.ts +++ b/packages/db/src/core/errors.ts @@ -1,12 +1,12 @@ -import { bold, cyan, red } from 'kleur/colors'; +import colors from 'picocolors'; -export const MISSING_EXECUTE_PATH_ERROR = `${red( +export const MISSING_EXECUTE_PATH_ERROR = `${colors.red( '▶ No file path provided.', -)} Provide a path by running ${cyan('astro db execute ')}\n`; +)} Provide a path by running ${colors.cyan('astro db execute ')}\n`; export const RENAME_TABLE_ERROR = (oldTable: string, newTable: string) => { return ( - red('\u25B6 Potential table rename detected: ' + oldTable + ' -> ' + newTable) + + colors.red('\u25B6 Potential table rename detected: ' + oldTable + ' -> ' + newTable) + ` You cannot add and remove tables in the same schema update batch. @@ -19,24 +19,25 @@ export const RENAME_TABLE_ERROR = (oldTable: string, newTable: string) => { export const RENAME_COLUMN_ERROR = (oldSelector: string, newSelector: string) => { return ( - red('▶ Potential column rename detected: ' + oldSelector + ', ' + newSelector) + + colors.red('▶ Potential column rename detected: ' + oldSelector + ', ' + newSelector) + `\n You cannot add and remove columns in the same table.` + `\n To resolve, add a 'deprecated: true' flag to '${oldSelector}' instead.` ); }; -export const FILE_NOT_FOUND_ERROR = (path: string) => `${red('▶ File not found:')} ${bold(path)}\n`; +export const FILE_NOT_FOUND_ERROR = (path: string) => + `${colors.red('▶ File not found:')} ${colors.bold(path)}\n`; -export const SHELL_QUERY_MISSING_ERROR = `${red( +export const SHELL_QUERY_MISSING_ERROR = `${colors.red( '▶ Please provide a query to execute using the --query flag.', )}\n`; export const EXEC_ERROR = (error: string) => { - return `${red(`Error while executing file:`)}\n\n${error}`; + return `${colors.red(`Error while executing file:`)}\n\n${error}`; }; export const EXEC_DEFAULT_EXPORT_ERROR = (fileName: string) => { - return EXEC_ERROR(`Missing default function export in ${bold(fileName)}`); + return EXEC_ERROR(`Missing default function export in ${colors.bold(fileName)}`); }; export const INTEGRATION_TABLE_CONFLICT_ERROR = ( @@ -44,7 +45,8 @@ export const INTEGRATION_TABLE_CONFLICT_ERROR = ( tableName: string, isUserConflict: boolean, ) => { - return red('▶ Conflicting table name in integration ' + bold(integrationName)) + isUserConflict - ? `\n A user-defined table named ${bold(tableName)} already exists` - : `\n Another integration already added a table named ${bold(tableName)}`; + return colors.red('▶ Conflicting table name in integration ' + colors.bold(integrationName)) + + isUserConflict + ? `\n A user-defined table named ${colors.bold(tableName)} already exists` + : `\n Another integration already added a table named ${colors.bold(tableName)}`; }; diff --git a/packages/db/src/core/integration/index.ts b/packages/db/src/core/integration/index.ts index 2947a9650de3..db1bd5168078 100644 --- a/packages/db/src/core/integration/index.ts +++ b/packages/db/src/core/integration/index.ts @@ -3,7 +3,7 @@ import { mkdir, writeFile } from 'node:fs/promises'; import { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import type { AstroIntegration, HookParameters } from 'astro'; -import { blue, yellow } from 'kleur/colors'; +import colors from 'picocolors'; import { createServer, type HMRPayload, @@ -189,7 +189,10 @@ function astroDBIntegration(options?: AstroDBConfig): AstroIntegration { throw new AstroDbError(message, hint); } - logger.info('database: ' + (connectToRemote ? yellow('remote') : blue('local database.'))); + logger.info( + 'database: ' + + (connectToRemote ? colors.yellow('remote') : colors.blue('local database.')), + ); }, 'astro:build:setup': async ({ vite }) => { tempViteServer = await getTempViteServer({ viteConfig: vite }); diff --git a/packages/db/src/core/queries.ts b/packages/db/src/core/queries.ts index f772f802501e..9b227f7e51c1 100644 --- a/packages/db/src/core/queries.ts +++ b/packages/db/src/core/queries.ts @@ -1,6 +1,6 @@ import type { SQL } from 'drizzle-orm'; import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core'; -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; import { FOREIGN_KEY_DNE_ERROR, FOREIGN_KEY_REFERENCES_EMPTY_ERROR, @@ -193,7 +193,7 @@ function getDefaultValueSql(columnName: string, column: DBColumnWithDefault): st } catch { // biome-ignore lint/suspicious/noConsole: allowed console.log( - `Invalid default value for column ${bold( + `Invalid default value for column ${colors.bold( columnName, )}. Defaults must be valid JSON when using the \`json()\` type.`, ); diff --git a/packages/db/src/runtime/errors.ts b/packages/db/src/runtime/errors.ts index 67961b1b563c..d22fe7a29a89 100644 --- a/packages/db/src/runtime/errors.ts +++ b/packages/db/src/runtime/errors.ts @@ -1,25 +1,25 @@ -import { bold } from 'kleur/colors'; +import colors from 'picocolors'; export const FOREIGN_KEY_DNE_ERROR = (tableName: string) => { - return `Table ${bold( + return `Table ${colors.bold( tableName, )} references a table that does not exist. Did you apply the referenced table to the \`tables\` object in your db config?`; }; export const FOREIGN_KEY_REFERENCES_LENGTH_ERROR = (tableName: string) => { - return `Foreign key on ${bold( + return `Foreign key on ${colors.bold( tableName, )} is misconfigured. \`columns\` and \`references\` must be the same length.`; }; export const FOREIGN_KEY_REFERENCES_EMPTY_ERROR = (tableName: string) => { - return `Foreign key on ${bold( + return `Foreign key on ${colors.bold( tableName, )} is misconfigured. \`references\` array cannot be empty.`; }; export const REFERENCE_DNE_ERROR = (columnName: string) => { - return `Column ${bold( + return `Column ${colors.bold( columnName, )} references a table that does not exist. Did you apply the referenced table to the \`tables\` object in your db config?`; }; diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 919c6a23e12c..e334ee53725b 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -40,7 +40,7 @@ "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", - "kleur": "^4.1.5", + "picocolors": "^1.1.1", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", diff --git a/packages/integrations/mdx/src/utils.ts b/packages/integrations/mdx/src/utils.ts index 7dcd4a14cacf..84aafc9d5e42 100644 --- a/packages/integrations/mdx/src/utils.ts +++ b/packages/integrations/mdx/src/utils.ts @@ -2,8 +2,8 @@ import { parseFrontmatter } from '@astrojs/markdown-remark'; import type { Options as AcornOpts } from 'acorn'; import { parse } from 'acorn'; import type { AstroConfig, AstroIntegrationLogger, SSRError } from 'astro'; -import { bold } from 'kleur/colors'; import type { MdxjsEsm } from 'mdast-util-mdx'; +import colors from 'picocolors'; import type { PluggableList } from 'unified'; function appendForwardSlash(path: string) { @@ -90,10 +90,10 @@ export function ignoreStringPlugins(plugins: any[], logger: AstroIntegrationLogg let hasInvalidPlugin = false; for (const plugin of plugins) { if (typeof plugin === 'string') { - logger.warn(`${bold(plugin)} not applied.`); + logger.warn(`${colors.bold(plugin)} not applied.`); hasInvalidPlugin = true; } else if (Array.isArray(plugin) && typeof plugin[0] === 'string') { - logger.warn(`${bold(plugin[0])} not applied.`); + logger.warn(`${colors.bold(plugin[0])} not applied.`); hasInvalidPlugin = true; } else { validPlugins.push(plugin); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ecdc06563b91..dd248e571d86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -566,9 +566,6 @@ importers: js-yaml: specifier: ^4.1.0 version: 4.1.0 - kleur: - specifier: ^4.1.5 - version: 4.1.5 magic-string: specifier: ^0.30.18 version: 0.30.19 @@ -590,6 +587,9 @@ importers: package-manager-detector: specifier: ^1.3.0 version: 1.4.1 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 picomatch: specifier: ^4.0.3 version: 4.0.3 @@ -788,9 +788,9 @@ importers: fast-xml-parser: specifier: ^5.3.0 version: 5.3.0 - kleur: - specifier: ^4.1.5 - version: 4.1.5 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 devDependencies: '@types/xml2js': specifier: ^0.4.14 @@ -1677,10 +1677,10 @@ importers: version: 3.5.22(typescript@5.9.3) packages/astro/performance: - devDependencies: - kleur: - specifier: ^4.1.5 - version: 4.1.5 + dependencies: + picocolors: + specifier: ^1.1.1 + version: 1.1.1 packages/astro/performance/fixtures/md: dependencies: @@ -4558,12 +4558,12 @@ importers: drizzle-orm: specifier: ^0.42.0 version: 0.42.0(@cloudflare/workers-types@4.20251011.0)(@libsql/client@0.15.15) - kleur: - specifier: ^4.1.5 - version: 4.1.5 nanoid: specifier: ^5.1.6 version: 5.1.6 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 prompts: specifier: ^2.4.2 version: 2.4.2 @@ -5221,9 +5221,9 @@ importers: hast-util-to-html: specifier: ^9.0.5 version: 9.0.5 - kleur: - specifier: ^4.1.5 - version: 4.1.5 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 rehype-raw: specifier: ^7.0.0 version: 7.0.0 @@ -6502,15 +6502,15 @@ importers: esbuild: specifier: ^0.25.0 version: 0.25.5 - kleur: - specifier: ^4.1.5 - version: 4.1.5 marked: specifier: ^16.4.0 version: 16.4.0 p-limit: specifier: ^6.2.0 version: 6.2.0 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 tinyglobby: specifier: ^0.2.15 version: 0.2.15 diff --git a/scripts/cmd/build.js b/scripts/cmd/build.js index 3eb982e105f0..06d5df33e1fc 100644 --- a/scripts/cmd/build.js +++ b/scripts/cmd/build.js @@ -1,6 +1,6 @@ import fs from 'node:fs/promises'; import esbuild from 'esbuild'; -import { dim, green, red, yellow } from 'kleur/colors'; +import colors from 'picocolors'; import { glob } from 'tinyglobby'; import prebuild from './prebuild.js'; @@ -88,14 +88,15 @@ export default async function build(...args) { } const date = dt.format(new Date()); if (result && result.errors.length) { - console.error(dim(`[${date}] `) + red(error || result.errors.join('\n'))); + console.error(colors.dim(`[${date}] `) + colors.red(error || result.errors.join('\n'))); } else { if (result.warnings.length) { console.info( - dim(`[${date}] `) + yellow('! updated with warnings:\n' + result.warnings.join('\n')), + colors.dim(`[${date}] `) + + colors.yellow('! updated with warnings:\n' + result.warnings.join('\n')), ); } - console.info(dim(`[${date}] `) + green('√ updated')); + console.info(colors.dim(`[${date}] `) + colors.green('√ updated')); } }); }, diff --git a/scripts/cmd/prebuild.js b/scripts/cmd/prebuild.js index 68a3a4f91386..29cba2220017 100644 --- a/scripts/cmd/prebuild.js +++ b/scripts/cmd/prebuild.js @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import esbuild from 'esbuild'; -import { red } from 'kleur/colors'; +import colors from 'picocolors'; import { glob } from 'tinyglobby'; function escapeTemplateLiterals(str) { @@ -54,7 +54,7 @@ export default async function prebuild(...args) { ); if (newTscode === tscode) { console.error( - red( + colors.red( `${filepath} doesn't follow the \`export default xxxDirective\` convention. The prebuilt output may be wrong. ` + `For more information, check out ${fileURLToPath(import.meta.url)}`, ), diff --git a/scripts/package.json b/scripts/package.json index 2b3f31b60ad1..f6900e2502bd 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -12,9 +12,9 @@ }, "dependencies": { "esbuild": "^0.25.0", - "kleur": "^4.1.5", "marked": "^16.4.0", "p-limit": "^6.2.0", + "picocolors": "^1.1.1", "tinyglobby": "^0.2.15", "tsconfck": "^3.1.6" }