aboutsummaryrefslogtreecommitdiff
path: root/packages/db/src/runtime/utils.ts
blob: 64301c39ee2d08b7001ddba9f16dff2b9f1cef87 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { LibsqlError } from '@libsql/client';
import { AstroError } from 'astro/errors';

const isWindows = process?.platform === 'win32';

/**
 * Small wrapper around fetch that throws an error if the response is not OK. Allows for custom error handling as well through the onNotOK callback.
 */
export async function safeFetch(
	url: Parameters<typeof fetch>[0],
	options: Parameters<typeof fetch>[1] = {},
	onNotOK: (response: Response) => void | Promise<void> = () => {
		throw new Error(`Request to ${url} returned a non-OK status code.`);
	},
): Promise<Response> {
	const response = await fetch(url, options);

	if (!response.ok) {
		await onNotOK(response);
	}

	return response;
}

export class AstroDbError extends AstroError {
	name = 'Astro DB Error';
}

export class DetailedLibsqlError extends LibsqlError {
	name = 'Astro DB Error';
	hint?: string;

	constructor({
		message,
		code,
		hint,
		rawCode,
		cause,
	}: { message: string; code: string; hint?: string; rawCode?: number; cause?: Error }) {
		super(message, code, rawCode, cause);
		this.hint = hint;
	}
}

function slash(path: string) {
	const isExtendedLengthPath = path.startsWith('\\\\?\\');

	if (isExtendedLengthPath) {
		return path;
	}

	return path.replace(/\\/g, '/');
}

export function pathToFileURL(path: string): URL {
	if (isWindows) {
		let slashed = slash(path);
		// Windows like C:/foo/bar
		if (!slashed.startsWith('/')) {
			slashed = '/' + slashed;
		}
		return new URL('file://' + slashed);
	}

	// Unix is easy
	return new URL('file://' + path);
}