0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-01-27 22:19:04 -05:00

Provide guidance when --remote is omitted (#10579)

* Provide guidance when --remote is omitted

* Only restrict to server mode

* Use an AstroError

* Update code
This commit is contained in:
Matthew Phillips 2024-03-27 15:20:11 -04:00 committed by GitHub
parent bd7effcf72
commit f5df12cfeb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 156 additions and 2 deletions

View file

@ -0,0 +1,7 @@
---
"@astrojs/db": patch
---
Provide guidance when --remote is missing
When running the build `astro build` without the `--remote`, either require a `DATABASE_FILE` variable be defined, which means you are going expert-mode and having your own database, or error suggesting to use the `--remote` flag.

View file

@ -1,7 +1,8 @@
import { existsSync } from 'fs';
import { dirname } from 'path';
import { fileURLToPath } from 'url';
import type { AstroIntegration } from 'astro';
import type { AstroConfig, AstroIntegration } from 'astro';
import { AstroError } from 'astro/errors';
import { mkdir, writeFile } from 'fs/promises';
import { blue, yellow } from 'kleur/colors';
import parseArgs from 'yargs-parser';
@ -13,6 +14,7 @@ import { fileURLIntegration } from './file-url.js';
import { typegenInternal } from './typegen.js';
import { type LateSeedFiles, type LateTables, vitePluginDb } from './vite-plugin-db.js';
import { vitePluginInjectEnvTs } from './vite-plugin-inject-env-ts.js';
import { loadEnv } from 'vite';
function astroDBIntegration(): AstroIntegration {
let connectToStudio = false;
@ -33,12 +35,14 @@ function astroDBIntegration(): AstroIntegration {
},
};
let command: 'dev' | 'build' | 'preview';
let output: AstroConfig['output'] = 'server';
return {
name: 'astro:db',
hooks: {
'astro:config:setup': async ({ updateConfig, config, command: _command, logger }) => {
command = _command;
root = config.root;
output = config.output;
if (command === 'preview') return;
@ -111,6 +115,12 @@ function astroDBIntegration(): AstroIntegration {
});
},
'astro:build:start': async ({ logger }) => {
if(!connectToStudio && !databaseFileEnvDefined() && (output === 'server' || output === 'hybrid')) {
const message = `Attempting to build without the --remote flag or the ASTRO_DATABASE_FILE environment variable defined. You probably want to pass --remote to astro build.`;
const hint = 'Learn more connecting to Studio: https://docs.astro.build/en/guides/astro-db/#connect-to-astro-studio';
throw new AstroError(message, hint);
}
logger.info('database: ' + (connectToStudio ? yellow('remote') : blue('local database.')));
},
'astro:build:done': async ({}) => {
@ -120,6 +130,11 @@ function astroDBIntegration(): AstroIntegration {
};
}
function databaseFileEnvDefined() {
const env = loadEnv('', process.cwd());
return env.ASTRO_DATABASE_FILE != null || process.env.ASTRO_DATABASE_FILE != null;
}
export function integration(): AstroIntegration[] {
return [astroDBIntegration(), fileURLIntegration()];
}

View file

@ -118,7 +118,8 @@ import { asDrizzleTable, createLocalDatabaseClient } from ${RUNTIME_IMPORT};
${shouldSeed ? `import { seedLocal } from ${RUNTIME_IMPORT};` : ''}
${shouldSeed ? integrationSeedImportStatements.join('\n') : ''}
const dbUrl = ${JSON.stringify(dbUrl)};
const dbUrl = import.meta.env.ASTRO_DATABASE_FILE ?? ${JSON.stringify(dbUrl)};
export const db = createLocalDatabaseClient({ dbUrl });
${

View file

@ -183,6 +183,7 @@ describe('astro:db', () => {
});
after(async () => {
process.env.ASTRO_STUDIO_APP_TOKEN = '';
await remoteDbServer?.stop();
});

View file

@ -0,0 +1,10 @@
import db from '@astrojs/db';
import { defineConfig } from 'astro/config';
// https://astro.build/config
export default defineConfig({
integrations: [db()],
devToolbar: {
enabled: false,
},
});

View file

@ -0,0 +1,13 @@
import { column, defineDb, defineTable } from 'astro:db';
const User = defineTable({
columns: {
id: column.text({ primaryKey: true, optional: false }),
username: column.text({ optional: false, unique: true }),
password: column.text({ optional: false }),
},
});
export default defineDb({
tables: { User },
});

View file

@ -0,0 +1,8 @@
import { asDrizzleTable } from '@astrojs/db/utils';
import { User, db } from 'astro:db';
export default async function () {
await db.batch([
db.insert(User).values([{ id: 'mario', username: 'Mario', password: 'itsame' }]),
]);
}

View file

@ -0,0 +1,14 @@
{
"name": "@test/db-local-prod",
"version": "0.0.0",
"private": true,
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview"
},
"dependencies": {
"@astrojs/db": "workspace:*",
"astro": "workspace:*"
}
}

View file

@ -0,0 +1,11 @@
---
/// <reference path="../../.astro/db-types.d.ts" />
import { db, User } from 'astro:db';
const users = await db.select().from(User);
---
<h2>Users</h2>
<ul class="users-list">
{users.map((user) => <li>{user.name}</li>)}
</ul>

View file

@ -0,0 +1,65 @@
import { expect } from 'chai';
import testAdapter from '../../astro/test/test-adapter.js';
import { loadFixture } from '../../astro/test/test-utils.js';
describe('astro:db local database', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/local-prod/', import.meta.url),
output: 'server',
adapter: testAdapter(),
});
});
describe('build (not remote) with DATABASE_FILE env', () => {
const prodDbPath = new URL('./fixtures/basics/dist/astro.db', import.meta.url).toString();
before(async () => {
process.env.ASTRO_DATABASE_FILE = prodDbPath;
await fixture.build();
});
after(async () => {
delete process.env.ASTRO_DATABASE_FILE;
});
it('Can render page', async () => {
const app = await fixture.loadTestAdapterApp();
const request = new Request('http://example.com/');
const response = await app.render(request);
expect(response.status).to.equal(200);
});
});
describe('build (not remote)', () => {
it('should throw during the build for server output', async () => {
delete process.env.ASTRO_DATABASE_FILE;
let buildError = null;
try {
await fixture.build();
} catch(err) {
buildError = err;
}
expect(buildError).to.be.an('Error');
});
it('should throw during the build for hybrid output', async () => {
let fixture2 = await loadFixture({
root: new URL('./fixtures/local-prod/', import.meta.url),
output: 'hybrid',
adapter: testAdapter(),
});
delete process.env.ASTRO_DATABASE_FILE;
let buildError = null;
try {
await fixture2.build();
} catch(err) {
buildError = err;
}
expect(buildError).to.be.an('Error');
});
});
});

9
pnpm-lock.yaml generated
View file

@ -3948,6 +3948,15 @@ importers:
specifier: workspace:*
version: link:../../../../astro
packages/db/test/fixtures/local-prod:
dependencies:
'@astrojs/db':
specifier: workspace:*
version: link:../../..
astro:
specifier: workspace:*
version: link:../../../../astro
packages/db/test/fixtures/no-apptoken:
dependencies:
'@astrojs/db':