diff --git a/packages/astro/src/@types/astro.ts b/packages/astro/src/@types/astro.ts index 49d3ab9913..c1f79ab582 100644 --- a/packages/astro/src/@types/astro.ts +++ b/packages/astro/src/@types/astro.ts @@ -1535,6 +1535,9 @@ export interface AstroUserConfig { }; }; + /** ⚠️ WARNING: SUBJECT TO CHANGE */ + db?: Config.Database; + /** * @docs * @kind heading @@ -2743,3 +2746,10 @@ declare global { 'astro-dev-overlay-card': DevToolbarCard; } } + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Config { + type Database = Record; + } +} diff --git a/packages/astro/src/cli/db/index.ts b/packages/astro/src/cli/db/index.ts new file mode 100644 index 0000000000..f16cd21a15 --- /dev/null +++ b/packages/astro/src/cli/db/index.ts @@ -0,0 +1,27 @@ +import type { Arguments } from 'yargs-parser'; +import { createLoggerFromFlags } from '../flags.js'; +import { getPackage } from '../install-package.js'; + +export async function db({ flags }: { flags: Arguments }) { + const logger = createLoggerFromFlags(flags); + const getPackageOpts = { skipAsk: flags.yes || flags.y, cwd: flags.root }; + const dbPackage = await getPackage( + '@astrojs/db', + logger, + getPackageOpts, + [] + ); + + if (!dbPackage) { + logger.error( + 'check', + 'The `@astrojs/db` package is required for this command to work. Please manually install it in your project and try again.' + ); + return; + } + + const { cli } = dbPackage; + + const [command, ...args] = flags._.slice(3).map(v => v.toString()); + await cli(command, args); +} diff --git a/packages/astro/src/cli/index.ts b/packages/astro/src/cli/index.ts index 19347ebecd..a6ca88400d 100644 --- a/packages/astro/src/cli/index.ts +++ b/packages/astro/src/cli/index.ts @@ -11,6 +11,7 @@ type CLICommand = | 'dev' | 'build' | 'preview' + | 'db' | 'sync' | 'check' | 'info' @@ -72,6 +73,7 @@ function resolveCommand(flags: yargs.Arguments): CLICommand { 'preview', 'check', 'docs', + 'db', 'info', ]); if (supportedCommands.has(cmd)) { @@ -143,6 +145,11 @@ async function runCommand(cmd: string, flags: yargs.Arguments) { await add(packages, { flags }); return; } + case 'db': { + const { db } = await import('./db/index.js'); + await db({ flags }); + return; + } case 'dev': { const { dev } = await import('./dev/index.js'); const server = await dev({ flags }); diff --git a/packages/astro/src/core/config/schema.ts b/packages/astro/src/core/config/schema.ts index 655db8ed8f..29c817bce0 100644 --- a/packages/astro/src/core/config/schema.ts +++ b/packages/astro/src/core/config/schema.ts @@ -112,6 +112,7 @@ export const AstroConfigSchema = z.object({ .optional() .default('attribute'), adapter: z.object({ name: z.string(), hooks: z.object({}).passthrough().default({}) }).optional(), + db: z.object({}).passthrough().default({}).optional(), integrations: z.preprocess( // preprocess (val) => (Array.isArray(val) ? val.flat(Infinity).filter(Boolean) : val),