better-convex-nuxt 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/module.d.mts CHANGED
@@ -71,7 +71,8 @@ interface ModuleOptions {
71
71
  authRoute?: string;
72
72
  /**
73
73
  * Additional trusted origins for CORS validation on the auth proxy.
74
- * By default, only requests from the origin matching siteUrl are allowed.
74
+ * Same-origin requests are always allowed automatically.
75
+ * Use this for cross-origin scenarios like iframes or separate frontend domains.
75
76
  * Supports wildcards for preview deployments (e.g., 'https://preview-*.vercel.app').
76
77
  * @default []
77
78
  */
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.0.0"
6
6
  },
7
- "version": "0.2.6",
7
+ "version": "0.2.7",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"ed8d70b7-40e1-4de1-88fa-bfcb37bd15e0",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768699827928,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"bb1b6fab-3dad-4ebb-bedd-8a7e8492b357",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1769017710929,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"ed8d70b7-40e1-4de1-88fa-bfcb37bd15e0",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768699827929,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"bb1b6fab-3dad-4ebb-bedd-8a7e8492b357",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1769017710929,false]</script></body></html>
@@ -1 +1 @@
1
- {"id":"ed8d70b7-40e1-4de1-88fa-bfcb37bd15e0","timestamp":1768699825754}
1
+ {"id":"bb1b6fab-3dad-4ebb-bedd-8a7e8492b357","timestamp":1769017708682}
@@ -0,0 +1 @@
1
+ {"id":"bb1b6fab-3dad-4ebb-bedd-8a7e8492b357","timestamp":1769017708682,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"ed8d70b7-40e1-4de1-88fa-bfcb37bd15e0",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768699827929,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Convex DevTools</title><link rel="stylesheet" href="/__convex_devtools__/_nuxt/entry.BiOLMZBG.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/BhO0ov6K.js"><script type="module" src="/__convex_devtools__/_nuxt/BhO0ov6K.js" crossorigin></script><script id="unhead:payload" type="application/json">{"title":"Convex DevTools"}</script></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__convex_devtools__",buildId:"bb1b6fab-3dad-4ebb-bedd-8a7e8492b357",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1769017710929,false]</script></body></html>
@@ -139,15 +139,13 @@ export default defineNuxtPlugin((nuxtApp) => {
139
139
  if (authClient) {
140
140
  nuxtApp.provide("auth", authClient);
141
141
  }
142
- if (typeof window !== "undefined") {
142
+ if (typeof window !== "undefined" && import.meta.dev) {
143
143
  ;
144
144
  window.__convex_client__ = client;
145
145
  if (authClient) window.__auth_client__ = authClient;
146
- if (import.meta.dev) {
147
- import("./devtools/bridge-setup.js").then(({ setupDevToolsBridge }) => {
148
- setupDevToolsBridge(client, convexToken, convexUser, convexAuthWaterfall);
149
- });
150
- }
146
+ import("./devtools/bridge-setup.js").then(({ setupDevToolsBridge }) => {
147
+ setupDevToolsBridge(client, convexToken, convexUser, convexAuthWaterfall);
148
+ });
151
149
  }
152
150
  endInit();
153
151
  if (convexToken.value) {
@@ -9,13 +9,11 @@ import {
9
9
  } from "h3";
10
10
  import { useRuntimeConfig } from "#imports";
11
11
  import { recordAuthProxyRequest } from "../../../devtools/auth-proxy-registry.js";
12
- function isOriginAllowed(origin, siteUrl, trustedOrigins) {
13
- if (siteUrl) {
14
- try {
15
- const siteOrigin = new URL(siteUrl).origin;
16
- if (origin === siteOrigin) return true;
17
- } catch {
18
- }
12
+ function isOriginAllowed(origin, requestHost, trustedOrigins) {
13
+ try {
14
+ const originUrl = new URL(origin);
15
+ if (originUrl.host === requestHost) return true;
16
+ } catch {
19
17
  }
20
18
  for (const trusted of trustedOrigins) {
21
19
  if (trusted.includes("*")) {
@@ -29,9 +27,10 @@ function isOriginAllowed(origin, siteUrl, trustedOrigins) {
29
27
  }
30
28
  export default defineEventHandler(async (event) => {
31
29
  const config = useRuntimeConfig();
32
- const siteUrl = config.public.convex?.siteUrl;
33
- const trustedOrigins = config.public.convex?.trustedOrigins ?? [];
34
- const rawAuthRoute = config.public.convex?.authRoute || "/api/auth";
30
+ const convexConfig = config.public.convex;
31
+ const siteUrl = convexConfig?.siteUrl;
32
+ const trustedOrigins = convexConfig?.trustedOrigins ?? [];
33
+ const rawAuthRoute = convexConfig?.authRoute || "/api/auth";
35
34
  const authRoute = (rawAuthRoute.startsWith("/") ? rawAuthRoute : `/${rawAuthRoute}`).replace(/\/+$/, "");
36
35
  const startTime = import.meta.dev ? Date.now() : 0;
37
36
  const requestId = import.meta.dev ? crypto.randomUUID() : "";
@@ -48,7 +47,7 @@ export default defineEventHandler(async (event) => {
48
47
  const target = `${siteUrl}/api/auth${normalizedPath}${requestUrl.search}`;
49
48
  if (event.method === "OPTIONS") {
50
49
  const origin2 = event.headers.get("origin");
51
- if (!origin2 || !isOriginAllowed(origin2, siteUrl, trustedOrigins)) {
50
+ if (!origin2 || !isOriginAllowed(origin2, requestUrl.host, trustedOrigins)) {
52
51
  setResponseStatus(event, 403);
53
52
  return null;
54
53
  }
@@ -63,13 +62,18 @@ export default defineEventHandler(async (event) => {
63
62
  return null;
64
63
  }
65
64
  const origin = event.headers.get("origin");
66
- if (origin && isOriginAllowed(origin, siteUrl, trustedOrigins)) {
65
+ const isAllowedOrigin = origin ? isOriginAllowed(origin, requestUrl.host, trustedOrigins) : true;
66
+ if (origin && isAllowedOrigin) {
67
67
  setHeaders(event, {
68
68
  "Access-Control-Allow-Origin": origin,
69
69
  "Access-Control-Allow-Credentials": "true",
70
70
  "Access-Control-Expose-Headers": "Set-Cookie"
71
71
  });
72
72
  }
73
+ if (origin && !isAllowedOrigin) {
74
+ setResponseStatus(event, 403);
75
+ return null;
76
+ }
73
77
  try {
74
78
  const originalHost = event.headers.get("host") || requestUrl.host;
75
79
  const originalProto = requestUrl.protocol.replace(":", "");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-convex-nuxt",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "Full-featured Convex integration for Nuxt with SSR, real-time subscriptions, authentication, and permissions",
5
5
  "keywords": [
6
6
  "authentication",
@@ -1 +0,0 @@
1
- {"id":"ed8d70b7-40e1-4de1-88fa-bfcb37bd15e0","timestamp":1768699825754,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}