+
- {type === "documentation" ? (
-
- ) : null}
- {type}
-
-
- {trueHeading}
+ />
+
+
+ Docs
+
+ {version ? (
+ // Nudged up so the smaller baseline-aligned text does not sag next to the mark
+
+ {version}
+
+ ) : null}
-
-
- Better Auth.
-
-
-
-
+ {section ? (
+
- github.com/better-auth/better-auth
-
+ {section}
+
+ ) : null}
+
+ {trimmedHeading}
@@ -185,24 +174,15 @@ export async function GET(req: Request) {
{
width: 1200,
height: 630,
- fonts: [
- {
- name: "Geist",
- data: geist,
- weight: 400,
- style: "normal",
- },
- {
- name: "GeistMono",
- data: geistMono,
- weight: 700,
- style: "normal",
- },
- ],
+ fonts: [{ name: "Geist", data: geist, weight: 400, style: "normal" }],
+ headers: {
+ "Cache-Control":
+ "public, max-age=86400, s-maxage=31536000, immutable",
+ },
},
);
} catch (err) {
console.log({ err });
- return new Response("Failed to generate the og image", { status: 500 });
+ return new Response("Failed to generate the OG image", { status: 500 });
}
}
diff --git a/docs/app/blog/layout.tsx b/docs/app/blog/layout.tsx
index 6d8f0334d0..f6c96ece3a 100644
--- a/docs/app/blog/layout.tsx
+++ b/docs/app/blog/layout.tsx
@@ -11,10 +11,10 @@ export const metadata: Metadata = createMetadata({
url: "/blog",
title: "Blog - Better Auth",
description,
- images: ["/api/og-release?heading=Better%20Auth%20Blog"],
+ images: ["/api/og-blog?title=Better%20Auth%20Blog"],
},
twitter: {
- images: ["/api/og-release?heading=Better%20Auth%20Blog"],
+ images: ["/api/og-blog?title=Better%20Auth%20Blog"],
title: "Blog - Better Auth",
description,
},
diff --git a/docs/app/docs/[[...slug]]/page.tsx b/docs/app/docs/[[...slug]]/page.tsx
index 56296918cf..bbaf10b071 100644
--- a/docs/app/docs/[[...slug]]/page.tsx
+++ b/docs/app/docs/[[...slug]]/page.tsx
@@ -1,3 +1,4 @@
+import { getBreadcrumbItems } from "fumadocs-core/breadcrumb";
import { Accordion, Accordions } from "fumadocs-ui/components/accordion";
import { File, Files, Folder } from "fumadocs-ui/components/files";
import { Step, Steps } from "fumadocs-ui/components/steps";
@@ -227,10 +228,13 @@ export async function generateMetadata({
? `${version.label} - ${page.data.title}`
: page.data.title;
+ const [section] = getBreadcrumbItems(page.url, src.getPageTree());
const ogSearchParams = new URLSearchParams();
- ogSearchParams.set("heading", title);
- ogSearchParams.set("type", "documentation");
- ogSearchParams.set("mode", "dark");
+ ogSearchParams.set("heading", page.data.title);
+ if (typeof section?.name === "string") {
+ ogSearchParams.set("section", section.name);
+ }
+ if (version.id !== "latest") ogSearchParams.set("version", version.label);
const ogUrl = `/api/og?${ogSearchParams.toString()}`;
diff --git a/docs/content/docs/integrations/hono.mdx b/docs/content/docs/integrations/hono.mdx
index 507296e516..acdb976e00 100644
--- a/docs/content/docs/integrations/hono.mdx
+++ b/docs/content/docs/integrations/hono.mdx
@@ -44,8 +44,8 @@ If you're using another runtime, keep your existing entry point and add the same
The resulting Hono route must match your Better Auth `basePath`, which
- defaults to `/api/auth`. If your app already uses `new
- Hono().basePath("/api")`, mount Better Auth at `/auth/*`:
+ defaults to `/api/auth`. If your app already uses
+ `new Hono().basePath("/api")`, mount Better Auth at `/auth/*`:
```ts
const app = new Hono().basePath("/api");
diff --git a/docs/lib/community-plugins-data.ts b/docs/lib/community-plugins-data.ts
index 193b47ae6e..4b540659d7 100644
--- a/docs/lib/community-plugins-data.ts
+++ b/docs/lib/community-plugins-data.ts
@@ -434,7 +434,7 @@ export const communityPlugins: CommunityPlugin[] = [
name: "good-webhooks",
url: "https://github.com/pplytas/good-webhooks",
description:
- "Authenticated webhook endpoint management with typed client APIs, scoped permissions, signing-secret rotation, and optional self-hosted delivery. Currently in beta with a frozen public API.",
+ "Authenticated webhook endpoint management with typed client APIs, scoped permissions, signing-secret rotation, and optional self-hosted delivery.",
author: {
name: "Panagiotis Plytas",
github: "pplytas",
diff --git a/docs/lib/rss.ts b/docs/lib/rss.ts
index 0673e4d0b2..488ed0ffb3 100644
--- a/docs/lib/rss.ts
+++ b/docs/lib/rss.ts
@@ -10,7 +10,7 @@ export function getRSS() {
id: `${baseUrl}blog`,
link: `${baseUrl}blog`,
language: "en",
- image: `${baseUrl}release-og/blogs.png`,
+ image: `${baseUrl}og.png`,
favicon: `${baseUrl}favicon/favicon-32x32.png`,
copyright: `All rights reserved ${new Date().getFullYear()}, Better Auth Inc.`,
});
diff --git a/e2e/integration/nextjs-demo/e2e/scim-demo.spec.ts b/e2e/integration/nextjs-demo/e2e/scim-demo.spec.ts
index f97eff750b..659d1c673f 100644
--- a/e2e/integration/nextjs-demo/e2e/scim-demo.spec.ts
+++ b/e2e/integration/nextjs-demo/e2e/scim-demo.spec.ts
@@ -43,9 +43,9 @@ async function getAvailablePort(): Promise {
async function stopProcess(
child: ChildProcessWithoutNullStreams | undefined,
): Promise {
- if (!child?.pid || child.exitCode !== null) return;
+ if (!child) return;
const { terminate } = await import("@better-auth-test/test-utils/playwright");
- await terminate(child.pid);
+ await terminate(child);
}
async function startNextDemoRuntime(): Promise {
@@ -108,7 +108,7 @@ async function startNextDemoRuntime(): Promise {
["dev", "--hostname", "127.0.0.1", "--port", String(port)],
{
cwd: demoDirectory,
- detached: true,
+ detached: process.platform !== "win32",
env: environment,
stdio: "pipe",
},
diff --git a/e2e/integration/solid-vinxi/e2e/utils.ts b/e2e/integration/solid-vinxi/e2e/utils.ts
index bf605a3a11..a83c56ebfa 100644
--- a/e2e/integration/solid-vinxi/e2e/utils.ts
+++ b/e2e/integration/solid-vinxi/e2e/utils.ts
@@ -25,6 +25,7 @@ export function setup() {
ref,
start: async () => {
clientChild = spawn("pnpm", ["run", "dev"], {
+ detached: process.platform !== "win32",
cwd: root,
stdio: "pipe",
env: {
@@ -58,7 +59,7 @@ export function setup() {
]);
},
clean: async () => {
- await terminate(clientChild.pid!);
+ await terminate(clientChild);
},
};
}
diff --git a/e2e/integration/sveltekit/e2e/sveltekit.spec.ts b/e2e/integration/sveltekit/e2e/sveltekit.spec.ts
index c6cb336620..4eecc0ba47 100644
--- a/e2e/integration/sveltekit/e2e/sveltekit.spec.ts
+++ b/e2e/integration/sveltekit/e2e/sveltekit.spec.ts
@@ -11,6 +11,7 @@ let baseURL: string;
test.beforeAll(async () => {
server = spawn("pnpm", ["run", "dev"], {
+ detached: process.platform !== "win32",
cwd: root,
stdio: "pipe",
env: { ...process.env, NO_COLOR: "1" },
@@ -28,7 +29,7 @@ test.beforeAll(async () => {
});
test.afterAll(async () => {
- if (server?.pid) await terminate(server.pid);
+ if (server) await terminate(server);
});
/**
diff --git a/e2e/integration/test-utils/package.json b/e2e/integration/test-utils/package.json
index 94118399b8..ca9b8b9132 100644
--- a/e2e/integration/test-utils/package.json
+++ b/e2e/integration/test-utils/package.json
@@ -4,8 +4,5 @@
"exports": {
"./playwright": "./src/playwright.ts"
},
- "private": true,
- "devDependencies": {
- "terminate": "^2.8.0"
- }
+ "private": true
}
diff --git a/e2e/integration/test-utils/src/playwright.ts b/e2e/integration/test-utils/src/playwright.ts
index 0e2e61a128..2528b1b54b 100644
--- a/e2e/integration/test-utils/src/playwright.ts
+++ b/e2e/integration/test-utils/src/playwright.ts
@@ -1,8 +1,46 @@
-import { createRequire } from "node:module";
+import type { ChildProcess } from "node:child_process";
+import { execFile } from "node:child_process";
+import { once } from "node:events";
+import { promisify } from "node:util";
-export const terminate = createRequire(import.meta.url)(
- // use terminate instead of cp.kill,
- // because cp.kill will not kill the child process of the child process
- // to avoid the zombie process
- "terminate/promise",
-) as (pid: number) => Promise;
+// Spawn with detached: true on Unix so the child owns its process group.
+export async function terminate(child: ChildProcess): Promise {
+ const pid = child.pid;
+ if (pid === undefined) return;
+
+ const exited = child.exitCode !== null || child.signalCode !== null;
+ if (process.platform === "win32" && exited) {
+ return;
+ }
+
+ const closed = exited
+ ? Promise.resolve()
+ : once(child, "close", { signal: AbortSignal.timeout(5000) });
+ const killing = Promise.resolve().then(async () => {
+ if (process.platform === "win32") {
+ try {
+ await promisify(execFile)(
+ "taskkill",
+ ["/pid", String(pid), "/T", "/F"],
+ {
+ timeout: 5000,
+ windowsHide: true,
+ },
+ );
+ } catch (error) {
+ if (child.exitCode === null && child.signalCode === null) throw error;
+ }
+ } else {
+ try {
+ process.kill(-pid, "SIGKILL");
+ } catch (error) {
+ if (
+ !(error instanceof Error && "code" in error && error.code === "ESRCH")
+ ) {
+ throw error;
+ }
+ }
+ }
+ });
+ await Promise.all([closed, killing]);
+}
diff --git a/e2e/integration/test-utils/tsconfig.json b/e2e/integration/test-utils/tsconfig.json
new file mode 100644
index 0000000000..858dc5c45a
--- /dev/null
+++ b/e2e/integration/test-utils/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"]
+}
diff --git a/e2e/integration/vanilla-node/e2e/utils.ts b/e2e/integration/vanilla-node/e2e/utils.ts
index c1218f60a2..2c8831098e 100644
--- a/e2e/integration/vanilla-node/e2e/utils.ts
+++ b/e2e/integration/vanilla-node/e2e/utils.ts
@@ -62,6 +62,7 @@ export function setup(overrides?: Partial) {
start: async () => {
server = await createAuthServer(undefined, overrides);
clientChild = spawn("pnpm", ["run", "start:client"], {
+ detached: process.platform !== "win32",
cwd: root,
stdio: "pipe",
});
@@ -101,8 +102,11 @@ export function setup(overrides?: Partial) {
]);
},
clean: async () => {
- await terminate(clientChild.pid!);
- server.close();
+ try {
+ await terminate(clientChild);
+ } finally {
+ server.close();
+ }
},
};
}
diff --git a/e2e/smoke/test/cloudflare.spec.ts b/e2e/smoke/test/cloudflare.spec.ts
index d7ca77ad86..bc9fc7643f 100644
--- a/e2e/smoke/test/cloudflare.spec.ts
+++ b/e2e/smoke/test/cloudflare.spec.ts
@@ -29,20 +29,26 @@ describe("(cloudflare) simple server", () => {
*/
it("builds and runs the Worker", async (t) => {
const cp = spawn("pnpm", ["run", "e2e:smoke"], {
+ detached: process.platform !== "win32",
cwd: join(fixturesDir, "cloudflare"),
stdio: "pipe",
});
- const stopProcessTree = async () => {
- if (
- cp.pid === undefined ||
- cp.exitCode !== null ||
- cp.signalCode !== null
- ) {
- return;
- }
- await terminate(cp.pid);
+ const stopProcessTree = () => terminate(cp);
+ const stopOnSignal = (signal: NodeJS.Signals) => {
+ const exitWithSignal = () => {
+ process.off("SIGINT", stopOnSignal);
+ process.off("SIGTERM", stopOnSignal);
+ process.kill(process.pid, signal);
+ };
+ void stopProcessTree().then(exitWithSignal, exitWithSignal);
};
+ process.on("SIGINT", stopOnSignal);
+ process.on("SIGTERM", stopOnSignal);
+ cp.once("close", () => {
+ process.off("SIGINT", stopOnSignal);
+ process.off("SIGTERM", stopOnSignal);
+ });
t.after(stopProcessTree);
const unexpectedWarnings = new Set(["node:sqlite", "node:async_hooks"]);
diff --git a/packages/core/package.json b/packages/core/package.json
index 901ce2a6b3..4f8f65b3b6 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -164,7 +164,6 @@
}
},
"dependencies": {
- "@opentelemetry/semantic-conventions": "^1.41.1",
"@standard-schema/spec": "^1.1.0",
"zod": "catalog:"
},
@@ -175,6 +174,7 @@
"@opentelemetry/api": "^1.9.1",
"@opentelemetry/sdk-trace-base": "^2.10.0",
"@opentelemetry/sdk-trace-node": "^2.10.0",
+ "@opentelemetry/semantic-conventions": "^1.41.1",
"better-call": "catalog:",
"jose": "^6.2.3",
"kysely": "catalog:",
diff --git a/packages/core/src/instrumentation/attributes.test.ts b/packages/core/src/instrumentation/attributes.test.ts
new file mode 100644
index 0000000000..2d9754c6bf
--- /dev/null
+++ b/packages/core/src/instrumentation/attributes.test.ts
@@ -0,0 +1,36 @@
+import { readdirSync, readFileSync } from "node:fs";
+import { join } from "node:path";
+import { fileURLToPath } from "node:url";
+import * as semanticConventions from "@opentelemetry/semantic-conventions";
+import { describe, expect, it } from "vitest";
+import * as attributes from "./attributes";
+
+const SEMANTIC_CONVENTIONS = "@opentelemetry/semantic-conventions";
+
+/**
+ * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/db/
+ * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/http/
+ */
+describe("instrumentation attributes", () => {
+ it.for([
+ "ATTR_DB_COLLECTION_NAME",
+ "ATTR_DB_OPERATION_NAME",
+ "ATTR_HTTP_RESPONSE_STATUS_CODE",
+ "ATTR_HTTP_ROUTE",
+ ] as const)("%s matches the OpenTelemetry semantic convention", (name) => {
+ expect(attributes[name]).toBe(semanticConventions[name]);
+ });
+
+ it("keeps the semantic conventions package out of production source", () => {
+ const srcDir = fileURLToPath(new URL("..", import.meta.url));
+ const importers = readdirSync(srcDir, { recursive: true, encoding: "utf8" })
+ .filter((file) => file.endsWith(".ts") && !file.endsWith(".test.ts"))
+ .filter((file) =>
+ readFileSync(join(srcDir, file), "utf8").includes(
+ `"${SEMANTIC_CONVENTIONS}"`,
+ ),
+ );
+
+ expect(importers).toEqual([]);
+ });
+});
diff --git a/packages/core/src/instrumentation/attributes.ts b/packages/core/src/instrumentation/attributes.ts
index 10bc1fdd89..de4d179622 100644
--- a/packages/core/src/instrumentation/attributes.ts
+++ b/packages/core/src/instrumentation/attributes.ts
@@ -1,16 +1,18 @@
-import {
- ATTR_DB_COLLECTION_NAME,
- ATTR_DB_OPERATION_NAME,
- ATTR_HTTP_RESPONSE_STATUS_CODE,
- ATTR_HTTP_ROUTE,
-} from "@opentelemetry/semantic-conventions";
+// Keep these stable OpenTelemetry keys local to avoid installing the full
+// semantic conventions registry just for four string constants.
-export {
- ATTR_DB_COLLECTION_NAME,
- ATTR_DB_OPERATION_NAME,
- ATTR_HTTP_RESPONSE_STATUS_CODE,
- ATTR_HTTP_ROUTE,
-};
+/** Database collection accessed by the operation. */
+export const ATTR_DB_COLLECTION_NAME = "db.collection.name" as const;
+
+/** Database operation performed by the span. */
+export const ATTR_DB_OPERATION_NAME = "db.operation.name" as const;
+
+/** HTTP response status code. */
+export const ATTR_HTTP_RESPONSE_STATUS_CODE =
+ "http.response.status_code" as const;
+
+/** Matched HTTP route template. */
+export const ATTR_HTTP_ROUTE = "http.route" as const;
/** Operation identifier (e.g. getSession, signUpWithEmailAndPassword). Uses endpoint operationId when set, otherwise the endpoint key. */
export const ATTR_OPERATION_ID = "better_auth.operation_id" as const;
diff --git a/packages/expo/src/client.ts b/packages/expo/src/client.ts
index 696d9ced6c..ac21d78da2 100644
--- a/packages/expo/src/client.ts
+++ b/packages/expo/src/client.ts
@@ -308,8 +308,9 @@ export const expoClient = (opts: ExpoClientOptions) => {
const rawScheme =
opts?.scheme || Constants.expoConfig?.scheme || Constants.platform?.scheme;
const scheme = Array.isArray(rawScheme) ? rawScheme[0] : rawScheme;
+ const nativeScheme = isWeb ? undefined : scheme;
- if (!scheme && !isWeb) {
+ if (!nativeScheme && !isWeb) {
throw new Error(
"Scheme not found in app.json. Please provide a scheme in the options.",
);
@@ -443,7 +444,7 @@ export const expoClient = (opts: ExpoClientOptions) => {
},
},
async init(url, options) {
- if (isWeb) {
+ if (!nativeScheme) {
return {
url,
options: options as ClientFetchOption,
@@ -469,7 +470,9 @@ export const expoClient = (opts: ExpoClientOptions) => {
options.headers = {
...options.headers,
...(cookie ? { cookie } : {}),
- ...(isLinkSocial ? { "expo-origin": getOrigin(scheme!) } : {}),
+ ...(isLinkSocial
+ ? { "expo-origin": getOrigin(nativeScheme) }
+ : {}),
"x-skip-oauth-proxy": "true",
};
} else {
@@ -478,7 +481,7 @@ export const expoClient = (opts: ExpoClientOptions) => {
options.headers = {
...options.headers,
...(cookie ? { cookie } : {}),
- "expo-origin": getOrigin(scheme!),
+ "expo-origin": getOrigin(nativeScheme),
"x-skip-oauth-proxy": "true",
};
if (options.body?.callbackURL) {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bede79117e..53d75f2c35 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -811,11 +811,7 @@ importers:
specifier: 8.2.0
version: 8.2.0(@types/node@25.9.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.9.0)
- e2e/integration/test-utils:
- devDependencies:
- terminate:
- specifier: ^2.8.0
- version: 2.8.0
+ e2e/integration/test-utils: {}
e2e/integration/vanilla-node:
dependencies:
@@ -1335,9 +1331,6 @@ importers:
packages/core:
dependencies:
- '@opentelemetry/semantic-conventions':
- specifier: ^1.41.1
- version: 1.41.1
'@standard-schema/spec':
specifier: ^1.1.0
version: 1.1.0
@@ -1363,6 +1356,9 @@ importers:
'@opentelemetry/sdk-trace-node':
specifier: ^2.10.0
version: 2.10.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions':
+ specifier: ^1.41.1
+ version: 1.41.1
better-call:
specifier: 'catalog:'
version: 1.4.2(zod@4.5.4)
@@ -9902,9 +9898,6 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
- event-stream@3.3.4:
- resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
-
event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
@@ -10288,9 +10281,6 @@ packages:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
- from@0.1.7:
- resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
-
fromentries@1.3.2:
resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==}
@@ -11699,9 +11689,6 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
- map-stream@0.1.0:
- resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
-
mariadb@3.4.5:
resolution: {integrity: sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==}
engines: {node: '>= 14'}
@@ -12807,9 +12794,6 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
- pause-stream@0.0.11:
- resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
-
perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
@@ -13299,11 +13283,6 @@ packages:
resolution: {integrity: sha512-lxMEoIL/BQlk2KunFzxwUPwMvjFH7x7cmvzSLsSHpyMXl9FFfLUlfKrYwFc4wx/ZaIxxuXC4n8rjQ1CX/tkXVQ==}
engines: {node: '>=20'}
- ps-tree@1.2.0:
- resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
- engines: {node: '>= 0.10'}
- hasBin: true
-
publint@0.3.21:
resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==}
engines: {node: '>=18'}
@@ -14210,9 +14189,6 @@ packages:
resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
engines: {node: '>= 10.x'}
- split@0.3.3:
- resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
-
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
@@ -14277,9 +14253,6 @@ packages:
resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==}
engines: {node: '>= 0.10.0'}
- stream-combiner@0.0.4:
- resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
-
streamx@2.23.0:
resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==}
@@ -14540,10 +14513,6 @@ packages:
resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
engines: {node: '>=8'}
- terminate@2.8.0:
- resolution: {integrity: sha512-bcbjJEg0wY5nuJXvGxxHfmoEPkyHLCctUKO6suwtxy7jVSgGcgPeGwpbLDLELFhIaxCGRr3dPvyNg1yuz2V0eg==}
- engines: {node: '>=12'}
-
terracotta@1.1.0:
resolution: {integrity: sha512-kfQciWUBUBgYkXu7gh3CK3FAJng/iqZslAaY08C+k1Hdx17aVEpcFFb/WPaysxAfcupNH3y53s/pc53xxZauww==}
engines: {node: '>=10'}
@@ -14585,9 +14554,6 @@ packages:
resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==}
engines: {node: '>=18'}
- through@2.3.8:
- resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
-
tiny-inflate@1.0.3:
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
@@ -25980,16 +25946,6 @@ snapshots:
etag@1.8.1: {}
- event-stream@3.3.4:
- dependencies:
- duplexer: 0.1.2
- from: 0.1.7
- map-stream: 0.1.0
- pause-stream: 0.0.11
- split: 0.3.3
- stream-combiner: 0.0.4
- through: 2.3.8
-
event-target-shim@5.0.1: {}
eventemitter3@4.0.7: {}
@@ -26511,8 +26467,6 @@ snapshots:
fresh@2.0.0: {}
- from@0.1.7: {}
-
fromentries@1.3.2: {}
fs-constants@1.0.0: {}
@@ -27911,8 +27865,6 @@ snapshots:
dependencies:
tmpl: 1.0.5
- map-stream@0.1.0: {}
-
mariadb@3.4.5:
dependencies:
'@types/geojson': 7946.0.16
@@ -30235,10 +30187,6 @@ snapshots:
pathe@2.0.3: {}
- pause-stream@0.0.11:
- dependencies:
- through: 2.3.8
-
perfect-debounce@1.0.0: {}
perfect-debounce@2.1.0: {}
@@ -30702,10 +30650,6 @@ snapshots:
ps-list@9.0.0: {}
- ps-tree@1.2.0:
- dependencies:
- event-stream: 3.3.4
-
publint@0.3.21:
dependencies:
'@publint/pack': 0.1.4
@@ -32160,10 +32104,6 @@ snapshots:
split2@4.2.0: {}
- split@0.3.3:
- dependencies:
- through: 2.3.8
-
sprintf-js@1.0.3: {}
sprintf-js@1.1.3: {}
@@ -32205,10 +32145,6 @@ snapshots:
stream-buffers@2.2.0: {}
- stream-combiner@0.0.4:
- dependencies:
- duplexer: 0.1.2
-
streamx@2.23.0:
dependencies:
events-universal: 1.0.1
@@ -32526,10 +32462,6 @@ snapshots:
ansi-escapes: 4.3.2
supports-hyperlinks: 2.3.0
- terminate@2.8.0:
- dependencies:
- ps-tree: 1.2.0
-
terracotta@1.1.0(solid-js@1.9.11):
dependencies:
solid-js: 1.9.11
@@ -32572,8 +32504,6 @@ snapshots:
throttleit@2.1.0: {}
- through@2.3.8: {}
-
tiny-inflate@1.0.3: {}
tiny-invariant@1.3.3: {}
diff --git a/tsconfig.json b/tsconfig.json
index a9ad1f99a6..d246b4e24c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -84,6 +84,9 @@
{
"path": "./e2e/adapter/tsconfig.json"
},
+ {
+ "path": "./e2e/integration/test-utils/tsconfig.json"
+ },
{
"path": "./test/tsconfig.json"
}