{"_id":"@adinvadim/convex-vue","_rev":"7-72b1a81609d8abab0f3402998c3c2ac2","name":"@adinvadim/convex-vue","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.1":{"name":"@adinvadim/convex-vue","version":"1.0.1","keywords":["convex","vue"],"author":{"name":"adinvadim"},"license":"MIT","_id":"@adinvadim/convex-vue@1.0.1","maintainers":[{"name":"adinvadim","email":"adin.vadim@gmail.com"}],"homepage":"https://github.com/adinvadim/convex-vue","bugs":{"url":"https://github.com/adinvadim/convex-vue/issues"},"dist":{"shasum":"6e74f16df3cbf5860fc823fba920856b566cf4c5","tarball":"https://registry.npmjs.org/@adinvadim/convex-vue/-/convex-vue-1.0.1.tgz","fileCount":5,"integrity":"sha512-6VaTxo7bwL6ubJIIiMlaKtIY78YugX+EI2tVosnqkVN+8mg2QXeSL2jYjX4MuxeXRmzWmxMVUiJYe68IcxuOWA==","signatures":[{"sig":"MEQCIEuixgdwAjN2/QheOXecgtgZakWUWljVPtYibarT5YcRAiAeW6PMi872/1IuBRSKPsX/g0rBugnfchaXQmNqMsU3ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51067},"main":"./dist/convex-vue.umd.cjs","type":"module","_from":"file:adinvadim-convex-vue-1.0.1.tgz","module":"./dist/convex-vue.js","exports":{".":{"import":"./dist/convex-vue.js","require":"./dist/convex-vue.umd.cjs"}},"scripts":{"dev":"npm-run-all --parallel dev:server dev:client","build":"vue-tsc && vite build","preview":"vite preview","dev:client":"vite","dev:server":"convex dev"},"typings":"./dist/convex-vue.d.ts","_npmUser":{"name":"adinvadim","email":"adin.vadim@gmail.com"},"_resolved":"/private/var/folders/_r/j96zpbbn4h5bfb3n3mb4vw5h0000gn/T/00d4635cd2c2fd383ce7ba40165ad517/adinvadim-convex-vue-1.0.1.tgz","_integrity":"sha512-6VaTxo7bwL6ubJIIiMlaKtIY78YugX+EI2tVosnqkVN+8mg2QXeSL2jYjX4MuxeXRmzWmxMVUiJYe68IcxuOWA==","repository":{"url":"git+https://github.com/adinvadim/convex-vue.git","type":"git","directory":"packages/convex-vue"},"_npmVersion":"10.9.2","description":"Vue integration for Convex","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.3.11","convex":"^1.7.1","vue-router":"^4.2.5","@vueuse/core":"^10.7.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.8","vue-tsc":"^1.8.25","prettier":"^3.1.1","open-props":"^1.6.17","typescript":"~5.2.2","npm-run-all":"^4.1.5","vite-plugin-dts":"^3.7.2","@auth0/auth0-vue":"^2.3.3","@vitejs/plugin-vue":"^4.5.2","unplugin-vue-router":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/convex-vue_1.0.1_1753757990857_0.08974748868840332","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@adinvadim/convex-vue","version":"1.1.0","keywords":["convex","vue"],"author":{"name":"adinvadim"},"license":"MIT","_id":"@adinvadim/convex-vue@1.1.0","maintainers":[{"name":"adinvadim","email":"adin.vadim@gmail.com"}],"homepage":"https://github.com/adinvadim/convex-vue","bugs":{"url":"https://github.com/adinvadim/convex-vue/issues"},"dist":{"shasum":"c07356f6fd27a443227a990deadf0f3e0ef0ed77","tarball":"https://registry.npmjs.org/@adinvadim/convex-vue/-/convex-vue-1.1.0.tgz","fileCount":5,"integrity":"sha512-MPRkHqV9xPjvBNIE/nOnVk2dpWja32FgG55dg9gZhp0W2cEgpbW6Cu413GS30d/3VD4ZNNr+MSn0V6ofXco3tQ==","signatures":[{"sig":"MEUCIQCrKm9tXBNtKYWZaX+gZgxVr401njWu7MVcshlXLuvtIQIgKZOGotpukAIDljcvpp87uaC0ZipQE3J0HeM+cLToluI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64737},"main":"./dist/convex-vue.umd.cjs","type":"module","_from":"file:adinvadim-convex-vue-1.1.0.tgz","module":"./dist/convex-vue.js","exports":{".":{"import":"./dist/convex-vue.js","require":"./dist/convex-vue.umd.cjs"}},"scripts":{"dev":"npm-run-all --parallel dev:server dev:client","build":"vue-tsc && vite build","preview":"vite preview","dev:client":"vite","dev:server":"convex dev"},"typings":"./dist/convex-vue.d.ts","_npmUser":{"name":"adinvadim","email":"adin.vadim@gmail.com"},"_resolved":"/private/var/folders/_r/j96zpbbn4h5bfb3n3mb4vw5h0000gn/T/5eec04019943f551ec8cc6e182441e1a/adinvadim-convex-vue-1.1.0.tgz","_integrity":"sha512-MPRkHqV9xPjvBNIE/nOnVk2dpWja32FgG55dg9gZhp0W2cEgpbW6Cu413GS30d/3VD4ZNNr+MSn0V6ofXco3tQ==","repository":{"url":"git+https://github.com/adinvadim/convex-vue.git","type":"git","directory":"packages/convex-vue"},"_npmVersion":"10.9.2","description":"Vue integration for Convex","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.3.11","convex":"^1.7.1","devalue":"^4.3.3","vue-router":"^4.2.5","@vueuse/core":"^10.7.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.8","vue-tsc":"^1.8.25","prettier":"^3.1.1","open-props":"^1.6.17","typescript":"~5.2.2","npm-run-all":"^4.1.5","vite-plugin-dts":"^3.7.2","@auth0/auth0-vue":"^2.3.3","@vitejs/plugin-vue":"^4.5.2","unplugin-vue-router":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/convex-vue_1.1.0_1753764419190_0.05093012214117465","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@adinvadim/convex-vue","version":"1.2.0","keywords":["convex","vue"],"author":{"name":"adinvadim"},"license":"MIT","_id":"@adinvadim/convex-vue@1.2.0","maintainers":[{"name":"adinvadim","email":"adin.vadim@gmail.com"}],"homepage":"https://github.com/adinvadim/convex-vue","bugs":{"url":"https://github.com/adinvadim/convex-vue/issues"},"dist":{"shasum":"91cfcc4ff25aea61f31ffeac6d86571ea9f37a7d","tarball":"https://registry.npmjs.org/@adinvadim/convex-vue/-/convex-vue-1.2.0.tgz","fileCount":5,"integrity":"sha512-38aycRsmNoSj36iwy1mb2WuiIdxfam/CFAAs6n9Xg0Sek6PGwqMWCya5H1NnOoxGXCVBXNhFjyEnegVSq/1yTw==","signatures":[{"sig":"MEYCIQCbvIAdumcV+WFD3JUWkOI20L9me2m7S1srJS51j8n5zQIhAJl2XC9KY37M6XOUCcYPkxq6ttrnpMr3qiP4zocnY21K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54731},"main":"./dist/convex-vue.umd.cjs","type":"module","_from":"file:adinvadim-convex-vue-1.2.0.tgz","module":"./dist/convex-vue.js","exports":{".":{"import":"./dist/convex-vue.js","require":"./dist/convex-vue.umd.cjs"}},"scripts":{"dev":"npm-run-all --parallel dev:server dev:client","build":"vue-tsc && vite build","preview":"vite preview","dev:client":"vite","dev:server":"convex dev"},"typings":"./dist/convex-vue.d.ts","_npmUser":{"name":"adinvadim","email":"adin.vadim@gmail.com"},"_resolved":"/private/var/folders/_r/j96zpbbn4h5bfb3n3mb4vw5h0000gn/T/347f49d305111a4d7b8c2ee46cd4e12a/adinvadim-convex-vue-1.2.0.tgz","_integrity":"sha512-38aycRsmNoSj36iwy1mb2WuiIdxfam/CFAAs6n9Xg0Sek6PGwqMWCya5H1NnOoxGXCVBXNhFjyEnegVSq/1yTw==","repository":{"url":"git+https://github.com/adinvadim/convex-vue.git","type":"git","directory":"packages/convex-vue"},"_npmVersion":"10.9.2","description":"Vue integration for Convex","directories":{},"_nodeVersion":"22.14.0","dependencies":{"vue":"^3.3.11","convex":"^1.7.1","devalue":"^4.3.3","vue-router":"^4.2.5","@vueuse/core":"^10.7.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.0.8","vue-tsc":"^1.8.25","prettier":"^3.1.1","open-props":"^1.6.17","typescript":"~5.2.2","npm-run-all":"^4.1.5","vite-plugin-dts":"^3.7.2","@auth0/auth0-vue":"^2.3.3","@vitejs/plugin-vue":"^4.5.2","unplugin-vue-router":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/convex-vue_1.2.0_1753795913639_0.1868341860477969","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@adinvadim/convex-vue","version":"1.3.0","description":"Vue integration for Convex","keywords":["convex","vue"],"homepage":"https://github.com/adinvadim/convex-vue","license":"MIT","type":"module","repository":{"type":"git","url":"git+https://github.com/adinvadim/convex-vue.git","directory":"packages/convex-vue"},"main":"./dist/convex-vue.umd.cjs","module":"./dist/convex-vue.js","typings":"./dist/convex-vue.d.ts","exports":{".":{"import":"./dist/convex-vue.js","require":"./dist/convex-vue.umd.cjs"}},"dependencies":{"@vueuse/core":"^10.7.1","convex":"^1.7.1","devalue":"^4.3.3","vue":"^3.3.11","vue-router":"^4.2.5"},"devDependencies":{"@auth0/auth0-vue":"^2.3.3","@vitejs/plugin-vue":"^4.5.2","npm-run-all":"^4.1.5","open-props":"^1.6.17","prettier":"^3.1.1","typescript":"~5.2.2","unplugin-vue-router":"^0.7.0","vite":"^5.0.8","vite-plugin-dts":"^3.7.2","vue-tsc":"^1.8.25"},"author":{"name":"adinvadim"},"bugs":{"url":"https://github.com/adinvadim/convex-vue/issues"},"scripts":{"dev":"npm-run-all --parallel dev:server dev:client","dev:server":"convex dev","dev:client":"vite","build":"vue-tsc && vite build","lint":"eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore","preview":"vite preview"},"_id":"@adinvadim/convex-vue@1.3.0","_integrity":"sha512-z3Sn4cMZ71AZT/Z8+dahvktQa1iN44TAdVqCUZ1Mr6WUj/zp/ud7RVKZ+ZZ3nvc32XXI58hEXH0ZyTqfSSj5aA==","_resolved":"/private/var/folders/rf/fz4rzhz52s748l3hd8whnyy40000gn/T/6842cff742b42a3342c3db7c1fa22155/adinvadim-convex-vue-1.3.0.tgz","_from":"file:adinvadim-convex-vue-1.3.0.tgz","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-z3Sn4cMZ71AZT/Z8+dahvktQa1iN44TAdVqCUZ1Mr6WUj/zp/ud7RVKZ+ZZ3nvc32XXI58hEXH0ZyTqfSSj5aA==","shasum":"01b7ca823a11f27462938ab4f3df54908597e73d","tarball":"https://registry.npmjs.org/@adinvadim/convex-vue/-/convex-vue-1.3.0.tgz","fileCount":5,"unpackedSize":54883,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID46hm4ka1U6Y3QVcFNPaITU5fv8scH8kMNG9HYxx5AMAiAmjyOcu/49TdLo3jsqTYX6gsS3F8ZVaOBoYLUSX+HaQw=="}]},"_npmUser":{"name":"adinvadim","email":"adin.vadim@gmail.com"},"directories":{},"maintainers":[{"name":"adinvadim","email":"adin.vadim@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/convex-vue_1.3.0_1754186493185_0.5417122391894629"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-29T02:59:50.781Z","modified":"2025-08-03T02:01:33.585Z","1.0.0":"2025-07-29T02:40:15.524Z","1.0.1":"2025-07-29T02:59:51.026Z","1.1.0":"2025-07-29T04:46:59.411Z","1.2.0":"2025-07-29T13:31:53.881Z","1.3.0":"2025-08-03T02:01:33.393Z"},"bugs":{"url":"https://github.com/adinvadim/convex-vue/issues"},"author":{"name":"adinvadim"},"license":"MIT","homepage":"https://github.com/adinvadim/convex-vue","keywords":["convex","vue"],"repository":{"type":"git","url":"git+https://github.com/adinvadim/convex-vue.git","directory":"packages/convex-vue"},"description":"Vue integration for Convex","maintainers":[{"name":"adinvadim","email":"adin.vadim@gmail.com"}],"readme":"# Convex Vue\n\nVue.js integration for [Convex](https://convex.dev) - the fullstack TypeScript development platform.\n\n## Features\n\n- 🚀 **SSR Support** - Full server-side rendering compatibility\n- 🔐 **Authentication** - Built-in auth support for server-side requests\n- ⚡ **Reactive Queries** - Vue-native composables with reactive data binding\n- 🔄 **Real-time Updates** - Automatic UI updates when data changes\n- 📦 **TypeScript** - Full type safety with Convex schema inference\n\n## Quick Start\n\n```bash\n# ✨ Auto-detect\nnpx nypm install @adinvadim/convex-vue\n\n# npm\nnpm install @adinvadim/convex-vue\n\n# yarn\nyarn add @adinvadim/convex-vue\n\n# pnpm\npnpm install @adinvadim/convex-vue\n```\n\n```typescript\n// main.ts\nimport { createApp } from 'vue';\nimport { createConvexVue } from '@adinvadim/convex-vue';\nimport App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(\n  createConvexVue({\n    convexUrl: process.env.VITE_CONVEX_URL!\n  })\n);\n\napp.mount('#app');\n```\n\n```vue\n<!-- Component.vue -->\n<script setup lang=\"ts\">\nimport { ref } from 'vue';\nimport {\n  useConvexQuery,\n  useConvexMutation,\n  useConvexAction\n} from '@adinvadim/convex-vue';\nimport { api } from './convex/_generated/api';\n\n// Query\nconst { data: messages, isLoading } = useConvexQuery(api.messages.getMessages, {});\n\n// Mutation\nconst { mutate: sendMessage, isLoading: isSending } = useConvexMutation(\n  api.messages.send\n);\n\n// Action\nconst { mutate: generateSummary, isLoading: isGenerating } = useConvexAction(\n  api.messages.generateSummary\n);\n\nconst newMessage = ref('');\n\nasync function handleSend() {\n  if (newMessage.value.trim()) {\n    await sendMessage({ text: newMessage.value });\n    newMessage.value = '';\n  }\n}\n\nasync function handleGenerateSummary() {\n  await generateSummary({});\n}\n</script>\n\n<template>\n  <div v-if=\"isLoading\">Loading...</div>\n  <div v-else>\n    <div v-for=\"message in messages\" :key=\"message._id\">\n      {{ message.text }}\n    </div>\n\n    <form @submit.prevent=\"handleSend\">\n      <input v-model=\"newMessage\" placeholder=\"Type a message...\" />\n      <button type=\"submit\" :disabled=\"isSending\">\n        {{ isSending ? 'Sending...' : 'Send' }}\n      </button>\n    </form>\n\n    <button @click=\"handleGenerateSummary\" :disabled=\"isGenerating\">\n      {{ isGenerating ? 'Generating...' : 'Generate Summary' }}\n    </button>\n  </div>\n</template>\n```\n\n## Nuxt Integration\n\nFor Nuxt applications, create a plugin to integrate Convex with Clerk authentication:\n\n```typescript\n// plugins/convex.ts\nimport { createConvexVue } from '@adinvadim/convex-vue';\n\nexport default defineNuxtPlugin(nuxtApp => {\n  const config = useRuntimeConfig();\n\n  if (!config.public.convexUrl) {\n    console.error('Convex URL is not configured. Please add it to your nuxt.config.ts');\n    throw new Error('Missing Convex URL configuration');\n  }\n\n  const { userId, isLoaded, getToken } = useAuth();\n\n  const event = useRequestEvent();\n  const convex = createConvexVue({\n    convexUrl: config.public.convexUrl,\n    auth: {\n      isAuthenticated: computed(() => !!userId.value),\n      isLoading: computed(() => !isLoaded.value),\n      getToken: async opts => {\n        try {\n          if (import.meta.server && event) {\n            return await event.context.auth().getToken({\n              template: 'convex'\n            });\n          }\n\n          return await getToken.value({\n            template: 'convex',\n            skipCache: opts.forceRefreshToken\n          });\n        } catch (error) {\n          return null;\n        }\n      }\n    }\n  });\n\n  nuxtApp.vueApp.use(convex);\n});\n```\n\n## API Reference\n\n### Composables\n\n#### `useConvex`\n\nReturns the [`ConvexClient`](https://docs.convex.dev/api/classes/browser.ConvexClient) instance for one-off queries and custom functionality.\n\n```typescript\nimport { useConvex } from '@adinvadim/convex-vue';\n\nconst convex = useConvex();\nconst data = await convex.query(api.todos.list, {});\n```\n\n#### `useConvexQuery`\n\nSubscribes to a [Convex Query](https://docs.convex.dev/functions/query-functions) with reactive data binding and SSR support.\n\n```typescript\nconst { data, isLoading, error, suspense } = useConvexQuery(\n  api.todos.list,\n  { completed: true }, // reactive arguments\n  { enabled: true } // options\n);\n\nawait suspense(); // for <Suspense /> boundary\n```\n\n#### `useConvexPaginatedQuery`\n\nSubscribes to a [Convex Paginated Query](https://docs.convex.dev/database/pagination).\n\n```typescript\nconst {\n  data,\n  lastPage,\n  isLoading,\n  isLoadingMore,\n  isDone,\n  loadMore,\n  reset,\n  pages,\n  error,\n  suspense\n} = useConvexPaginatedQuery(api.todos.list, { completed: true }, { numItems: 50 });\n```\n\n#### `useConvexMutation`\n\nHandles [Convex Mutations](https://docs.convex.dev/functions/mutation-functions) with optimistic updates support.\n\n```typescript\nconst {\n  isLoading,\n  error,\n  mutate: addTodo\n} = useConvexMutation(api.todos.add, {\n  onSuccess() {\n    todo.value = '';\n  },\n  onError(err) {\n    console.error(err);\n  },\n  optimisticUpdate(ctx) {\n    const current = ctx.getQuery(api.todos.list, {});\n    if (!current) return;\n\n    ctx.setQuery(api.todos.list, {}, [\n      {\n        _creationTime: Date.now(),\n        _id: 'optimistic_id' as Id<'todos'>,\n        completed: false,\n        text: todo.text\n      },\n      ...current\n    ]);\n  }\n});\n```\n\n#### `useConvexAction`\n\nHandles [Convex Actions](https://docs.convex.dev/functions/actions).\n\n```typescript\nconst { isLoading, error, mutate } = useConvexAction(api.some.action, {\n  onSuccess(result) {\n    console.log(result);\n  },\n  onError(err) {\n    console.error(err);\n  }\n});\n```\n\n### Components\n\n#### `<ConvexQuery />`\n\nTemplate component for queries with loading, error, and empty states.\n\n```vue\n<ConvexQuery :query=\"api.todos.list\" :args=\"{}\">\n  <template #loading>Loading todos...</template>\n  <template #error=\"{ error }\">{{ error }}</template>\n  <template #empty>No todos yet.</template>\n  <template #default=\"{ data: todos }\">\n    <ul>\n      <li v-for=\"todo in todos\" :key=\"todo._id\">\n        <Todo :todo=\"todo\" />\n      </li>\n    </ul>\n  </template>\n</ConvexQuery>\n```\n\n#### `<ConvexPaginatedQuery />`\n\nTemplate component for paginated queries.\n\n```vue\n<ConvexPaginatedQuery\n  :query=\"api.todos.paginatedList\"\n  :args=\"{}\"\n  :options=\"{ numItems: 5 }\"\n>\n  <template #loading>Loading todos...</template>\n  <template #error=\"{ error, reset }\">\n    <p>{{ error }}</p>\n    <button @click=\"reset\">Retry</button>\n  </template>\n  <template #default=\"{ data: todos, isDone, loadMore, isLoadingMore, reset }\">\n    <ul>\n      <li v-for=\"todo in todos\" :key=\"todo._id\">\n        <Todo :todo=\"todo\" />\n      </li>\n    </ul>\n    <Spinner v-if=\"isLoadingMore\" />\n    <footer>\n      <button :disabled=\"isDone\" @click=\"loadMore\">Load more</button>\n      <button @click=\"reset\">Reset</button>\n    </footer>\n  </template>\n</ConvexPaginatedQuery>\n```\n\n## Authentication Examples\n\n### Clerk\n\n```typescript\nimport { createConvexVue } from '@adinvadim/convex-vue';\nimport { clerkPlugin } from 'vue-clerk/plugin';\n\nconst app = createApp(App).use(clerkPlugin, {\n  publishableKey: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY\n});\n\nconst authState = {\n  isLoading: ref(true),\n  session: ref(undefined)\n};\n\napp.config.globalProperties.$clerk.addListener(arg => {\n  authState.isLoading.value = false;\n  authState.session.value = arg.session;\n});\n\nconst convexVue = createConvexVue({\n  convexUrl: import.meta.env.VITE_CONVEX_URL,\n  auth: {\n    isAuthenticated: computed(() => !!authState.session.value),\n    isLoading: authState.isLoading,\n    getToken: async ({ forceRefreshToken }) => {\n      try {\n        return await authState.session.value?.getToken({\n          template: 'convex',\n          skipCache: forceRefreshToken\n        });\n      } catch (error) {\n        return null;\n      }\n    }\n  }\n});\n\napp.use(convexVue);\n```\n\n### Auth0\n\n```typescript\nimport { createConvexVue } from '@adinvadim/convex-vue';\nimport { createAuth0 } from '@auth0/auth0-vue';\n\nconst auth = createAuth0({\n  domain: import.meta.env.VITE_AUTH0_DOMAIN,\n  clientId: import.meta.env.VITE_AUTH0_CLIENTID,\n  authorizationParams: {\n    redirect_uri: window.location.origin\n  }\n});\n\nconst convexVue = createConvexVue({\n  convexUrl: import.meta.env.VITE_CONVEX_URL,\n  auth: {\n    isAuthenticated: auth.isAuthenticated,\n    isLoading: auth.isLoading,\n    getToken: async ({ forceRefreshToken }) => {\n      try {\n        const response = await auth.getAccessTokenSilently({\n          detailedResponse: true,\n          cacheMode: forceRefreshToken ? 'off' : 'on'\n        });\n        return response.id_token;\n      } catch (error) {\n        return null;\n      }\n    },\n    installNavigationGuard: true,\n    needsAuth: to => to.meta.needsAuth,\n    redirectTo: () => ({ name: 'Login' })\n  }\n});\n\napp.use(convexVue);\n```\n\n## Packages\n\n- `@adinvadim/convex-vue` - Core Vue.js integration with composables and plugin\n","readmeFilename":"README.md"}