better-convex-nuxt 0.2.1 → 0.2.3

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/README.md CHANGED
@@ -32,14 +32,6 @@ Install the module:
32
32
  pnpm add better-convex-nuxt
33
33
  ```
34
34
 
35
- Add your Convex URL to `.env`:
36
-
37
- ```bash
38
- CONVEX_URL=https://your-project.convex.cloud
39
- ```
40
-
41
- That's it! Start using Convex in your Nuxt app.
42
-
43
35
  ## Usage
44
36
 
45
37
  ### Queries
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.0.0"
6
6
  },
7
- "version": "0.2.1",
7
+ "version": "0.2.3",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -193,7 +193,7 @@ export {}
193
193
  }
194
194
  });
195
195
  function setupDevTools(nuxt, resolver) {
196
- const devtoolsOutputPath = resolver.resolve("./runtime/devtools/.output/public");
196
+ const devtoolsOutputPath = resolver.resolve("./runtime/devtools/ui/dist");
197
197
  nuxt.options.runtimeConfig.convexDevtoolsPath = devtoolsOutputPath;
198
198
  nuxt.hook("devtools:customTabs", (tabs) => {
199
199
  tabs.push({
@@ -45,9 +45,11 @@ const formattedJson = computed(() => {
45
45
  </script>
46
46
 
47
47
  <template>
48
+ <!-- eslint-disable vue/no-v-html -- Safe: all dynamic content is escaped via escapeHtml() -->
48
49
  <div
49
50
  class="json-viewer"
50
51
  :style="{ maxHeight: maxHeight || '200px' }"
51
52
  v-html="formattedJson"
52
53
  />
54
+ <!-- eslint-enable vue/no-v-html -->
53
55
  </template>
@@ -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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"ed68c5ea-0511-4166-9328-de64627268f7",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768309769044,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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"2402f38c-d12f-4c0b-846f-2ad2f104951f",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768333345265,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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"ed68c5ea-0511-4166-9328-de64627268f7",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768309769045,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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"2402f38c-d12f-4c0b-846f-2ad2f104951f",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768333345266,false]</script></body></html>
@@ -1 +1 @@
1
- {"id":"ed68c5ea-0511-4166-9328-de64627268f7","timestamp":1768309766642}
1
+ {"id":"2402f38c-d12f-4c0b-846f-2ad2f104951f","timestamp":1768333343049}
@@ -0,0 +1 @@
1
+ {"id":"2402f38c-d12f-4c0b-846f-2ad2f104951f","timestamp":1768333343049,"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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"ed68c5ea-0511-4166-9328-de64627268f7",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768309769045,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.CXPHzcHp.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__convex_devtools__/_nuxt/DRR5kXdS.js"><script type="module" src="/__convex_devtools__/_nuxt/DRR5kXdS.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:"2402f38c-d12f-4c0b-846f-2ad2f104951f",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1768333345266,false]</script></body></html>
@@ -61,7 +61,9 @@ export default defineNuxtPlugin((nuxtApp) => {
61
61
  fetchOptions: { credentials: "include" }
62
62
  });
63
63
  let lastTokenValidation = Date.now();
64
+ let lastNullTokenCheck = 0;
64
65
  const TOKEN_CACHE_MS = 1e4;
66
+ const NULL_TOKEN_CACHE_MS = 5e3;
65
67
  const skipRoutes = config.public.convex?.skipAuthRoutes || [];
66
68
  const router = useRouter();
67
69
  const fetchToken = async ({ forceRefreshToken }) => {
@@ -84,11 +86,15 @@ export default defineNuxtPlugin((nuxtApp) => {
84
86
  if (wasServerRendered && !convexToken.value && !convexUser.value) {
85
87
  return null;
86
88
  }
89
+ if (!convexToken.value && Date.now() - lastNullTokenCheck < NULL_TOKEN_CACHE_MS) {
90
+ return null;
91
+ }
87
92
  try {
88
93
  const response = await authClient.convex.token();
89
94
  if (response.error || !response.data?.token) {
90
95
  convexToken.value = null;
91
96
  convexUser.value = null;
97
+ lastNullTokenCheck = Date.now();
92
98
  return null;
93
99
  }
94
100
  const token = response.data.token;
@@ -101,6 +107,7 @@ export default defineNuxtPlugin((nuxtApp) => {
101
107
  } catch {
102
108
  convexToken.value = null;
103
109
  convexUser.value = null;
110
+ lastNullTokenCheck = Date.now();
104
111
  return null;
105
112
  }
106
113
  };
@@ -3,6 +3,7 @@ import { createModuleLogger, getLoggingOptions, createTimer } from "./utils/logg
3
3
  import { getCachedAuthToken, setCachedAuthToken } from "./server/utils/auth-cache.js";
4
4
  import { getCookie } from "./utils/shared-helpers.js";
5
5
  const SESSION_COOKIE_NAME = "better-auth.session_token";
6
+ const SECURE_SESSION_COOKIE_NAME = "__Secure-better-auth.session_token";
6
7
  function buildPhase(name, startTime, waterfallStart, result, details) {
7
8
  const end = Date.now();
8
9
  return {
@@ -70,7 +71,7 @@ export default defineNuxtPlugin(async () => {
70
71
  let cacheHit = false;
71
72
  const sessionCheckStart = Date.now();
72
73
  const cookieHeader = event.headers.get("cookie");
73
- const sessionToken = getCookie(cookieHeader, SESSION_COOKIE_NAME);
74
+ const sessionToken = getCookie(cookieHeader, SECURE_SESSION_COOKIE_NAME) || getCookie(cookieHeader, SESSION_COOKIE_NAME);
74
75
  if (!cookieHeader || !sessionToken) {
75
76
  phases.push(buildPhase("session-check", sessionCheckStart, waterfallStart, "miss", "No session cookie"));
76
77
  convexAuthWaterfall.value = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-convex-nuxt",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
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":"ed68c5ea-0511-4166-9328-de64627268f7","timestamp":1768309766642,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}