0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2024-12-16 21:46:22 -05:00

🐛 Fix isDbError()-guard does not work (#12416)

* isDbError() does not work
Fixes #12400

* lint&format

* Update packages/db/src/runtime/virtual.ts

Co-authored-by: Bjorn Lu <bjornlu.dev@gmail.com>

* use isDbError instead of "instanceof LibsqlError"

* unused imports

* mv isDbError to utils

* Update .changeset/breezy-radios-grab.md

---------

Co-authored-by: Bjorn Lu <bjornlu.dev@gmail.com>
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com>
This commit is contained in:
Anton Begehr 2024-12-11 13:23:53 +01:00 committed by GitHub
parent 929ce28325
commit 618de283f5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 20 additions and 17 deletions

View file

@ -0,0 +1,5 @@
---
'@astrojs/db': patch
---
Fixes `isDbError()` guard for `LibsqlError`

View file

@ -1,5 +1,4 @@
import { existsSync } from 'node:fs'; import { existsSync } from 'node:fs';
import { LibsqlError } from '@libsql/client';
import type { AstroConfig } from 'astro'; import type { AstroConfig } from 'astro';
import { green } from 'kleur/colors'; import { green } from 'kleur/colors';
import type { Arguments } from 'yargs-parser'; import type { Arguments } from 'yargs-parser';
@ -16,6 +15,7 @@ import {
import { bundleFile, importBundledFile } from '../../../load-file.js'; import { bundleFile, importBundledFile } from '../../../load-file.js';
import type { DBConfig } from '../../../types.js'; import type { DBConfig } from '../../../types.js';
import { getManagedRemoteToken } from '../../../utils.js'; import { getManagedRemoteToken } from '../../../utils.js';
import { isDbError } from '../../../../runtime/utils.js';
export async function cmd({ export async function cmd({
astroConfig, astroConfig,
@ -64,9 +64,7 @@ export async function cmd({
await mod.default(); await mod.default();
console.info(`${green('✔')} File run successfully.`); console.info(`${green('✔')} File run successfully.`);
} catch (e) { } catch (e) {
if (e instanceof LibsqlError) { if (isDbError(e)) throw new Error(EXEC_ERROR(e.message));
throw new Error(EXEC_ERROR(e.message)); else throw e;
}
throw e;
} }
} }

View file

@ -1,5 +1,4 @@
import { stripVTControlCharacters } from 'node:util'; import { stripVTControlCharacters } from 'node:util';
import { LibsqlError } from '@libsql/client';
import deepDiff from 'deep-diff'; import deepDiff from 'deep-diff';
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core'; import { SQLiteAsyncDialect } from 'drizzle-orm/sqlite-core';
@ -8,7 +7,7 @@ import { customAlphabet } from 'nanoid';
import { hasPrimaryKey } from '../../runtime/index.js'; import { hasPrimaryKey } from '../../runtime/index.js';
import { createRemoteDatabaseClient } from '../../runtime/index.js'; import { createRemoteDatabaseClient } from '../../runtime/index.js';
import { isSerializedSQL } from '../../runtime/types.js'; import { isSerializedSQL } from '../../runtime/types.js';
import { safeFetch } from '../../runtime/utils.js'; import { isDbError, safeFetch } from '../../runtime/utils.js';
import { MIGRATION_VERSION } from '../consts.js'; import { MIGRATION_VERSION } from '../consts.js';
import { RENAME_COLUMN_ERROR, RENAME_TABLE_ERROR } from '../errors.js'; import { RENAME_COLUMN_ERROR, RENAME_TABLE_ERROR } from '../errors.js';
import { import {
@ -454,7 +453,7 @@ async function getDbCurrentSnapshot(
} catch (error) { } catch (error) {
// Don't handle errors that are not from libSQL // Don't handle errors that are not from libSQL
if ( if (
error instanceof LibsqlError && isDbError(error) &&
// If the schema was never pushed to the database yet the table won't exist. // If the schema was never pushed to the database yet the table won't exist.
// Treat a missing snapshot table as an empty table. // Treat a missing snapshot table as an empty table.

View file

@ -3,7 +3,6 @@ import { mkdir, writeFile } from 'node:fs/promises';
import { dirname } from 'node:path'; import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
import type { ManagedAppToken } from '@astrojs/studio'; import type { ManagedAppToken } from '@astrojs/studio';
import { LibsqlError } from '@libsql/client';
import type { AstroIntegration } from 'astro'; import type { AstroIntegration } from 'astro';
import { blue, yellow } from 'kleur/colors'; import { blue, yellow } from 'kleur/colors';
import { import {
@ -15,7 +14,7 @@ import {
mergeConfig, mergeConfig,
} from 'vite'; } from 'vite';
import parseArgs from 'yargs-parser'; import parseArgs from 'yargs-parser';
import { AstroDbError } from '../../runtime/utils.js'; import { AstroDbError, isDbError } from '../../runtime/utils.js';
import { CONFIG_FILE_NAMES, DB_PATH, VIRTUAL_MODULE_ID } from '../consts.js'; import { CONFIG_FILE_NAMES, DB_PATH, VIRTUAL_MODULE_ID } from '../consts.js';
import { EXEC_DEFAULT_EXPORT_ERROR, EXEC_ERROR } from '../errors.js'; import { EXEC_DEFAULT_EXPORT_ERROR, EXEC_ERROR } from '../errors.js';
import { resolveDbConfig } from '../load-file.js'; import { resolveDbConfig } from '../load-file.js';
@ -206,7 +205,7 @@ async function executeSeedFile({
try { try {
await mod.default(); await mod.default();
} catch (e) { } catch (e) {
if (e instanceof LibsqlError) { if (isDbError(e)) {
throw new AstroDbError(EXEC_ERROR(e.message)); throw new AstroDbError(EXEC_ERROR(e.message));
} }
throw e; throw e;

View file

@ -42,6 +42,10 @@ export class DetailedLibsqlError extends LibsqlError {
} }
} }
export function isDbError(err: unknown): err is LibsqlError {
return err instanceof LibsqlError || (err instanceof Error && (err as any).libsqlError === true)
}
function slash(path: string) { function slash(path: string) {
const isExtendedLengthPath = path.startsWith('\\\\?\\'); const isExtendedLengthPath = path.startsWith('\\\\?\\');

View file

@ -21,10 +21,6 @@ function createColumn<S extends string, T extends Record<string, unknown>>(type:
}; };
} }
export function isDbError(err: unknown): err is LibsqlError {
return err instanceof LibsqlError;
}
export const column = { export const column = {
number: <T extends NumberColumnOpts>(opts: T = {} as T) => { number: <T extends NumberColumnOpts>(opts: T = {} as T) => {
return createColumn('number', opts) satisfies { type: 'number' }; return createColumn('number', opts) satisfies { type: 'number' };
@ -90,3 +86,4 @@ export {
} from 'drizzle-orm'; } from 'drizzle-orm';
export { alias } from 'drizzle-orm/sqlite-core'; export { alias } from 'drizzle-orm/sqlite-core';
export { isDbError } from './utils.js';

View file

@ -1,9 +1,10 @@
import { createServer } from 'node:http'; import { createServer } from 'node:http';
import { LibsqlError, createClient } from '@libsql/client'; import { createClient } from '@libsql/client';
import { z } from 'zod'; import { z } from 'zod';
import { cli } from '../dist/core/cli/index.js'; import { cli } from '../dist/core/cli/index.js';
import { resolveDbConfig } from '../dist/core/load-file.js'; import { resolveDbConfig } from '../dist/core/load-file.js';
import { getCreateIndexQueries, getCreateTableQuery } from '../dist/core/queries.js'; import { getCreateIndexQueries, getCreateTableQuery } from '../dist/core/queries.js';
import { isDbError } from '../dist/runtime/utils.js';
const singleQuerySchema = z.object({ const singleQuerySchema = z.object({
sql: z.string(), sql: z.string(),
@ -142,7 +143,7 @@ function createRemoteDbServer() {
JSON.stringify({ JSON.stringify({
success: false, success: false,
error: { error: {
code: e instanceof LibsqlError ? e.code : 'SQLITE_QUERY_FAILED', code: isDbError(e) ? e.code : 'SQLITE_QUERY_FAILED',
details: e.message, details: e.message,
}, },
}), }),