nuxt-convex-module 0.0.0
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/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/chunks/index.mjs +64 -0
- package/dist/devtools-client/200.html +1 -0
- package/dist/devtools-client/404.html +1 -0
- package/dist/devtools-client/_nuxt/B29GGJ5n.js +1 -0
- package/dist/devtools-client/_nuxt/BSDEpQet.js +1 -0
- package/dist/devtools-client/_nuxt/BY23OQOo.js +1 -0
- package/dist/devtools-client/_nuxt/BZYRaL-G.js +1 -0
- package/dist/devtools-client/_nuxt/Byw6FxnC.js +1 -0
- package/dist/devtools-client/_nuxt/CJJ_hcZN.js +1 -0
- package/dist/devtools-client/_nuxt/CS6WMFOx.js +2 -0
- package/dist/devtools-client/_nuxt/CZbAGcNC.js +1 -0
- package/dist/devtools-client/_nuxt/Cr6_aklh.js +2 -0
- package/dist/devtools-client/_nuxt/DNfpyBVU.js +3 -0
- package/dist/devtools-client/_nuxt/DPWXUmcI.js +1 -0
- package/dist/devtools-client/_nuxt/builds/latest.json +1 -0
- package/dist/devtools-client/_nuxt/builds/meta/a7708498-bd09-4de2-b5ab-19b380293c77.json +1 -0
- package/dist/devtools-client/_nuxt/dy_xXcv9.js +1 -0
- package/dist/devtools-client/_nuxt/entry.DbTJhkHT.css +1 -0
- package/dist/devtools-client/_nuxt/error-404.CwGGO2Kz.css +1 -0
- package/dist/devtools-client/_nuxt/error-500.8ZJqCQm8.css +1 -0
- package/dist/devtools-client/_nuxt/ncgEdbEt.js +1 -0
- package/dist/devtools-client/_nuxt/queries.CE_dtt9-.css +1 -0
- package/dist/devtools-client/auth/index.html +1 -0
- package/dist/devtools-client/icon.svg +6 -0
- package/dist/devtools-client/index.html +1 -0
- package/dist/devtools-client/logs/index.html +1 -0
- package/dist/devtools-client/queries/index.html +1 -0
- package/dist/module.d.ts +189 -0
- package/dist/module.js +489 -0
- package/dist/module.json +13 -0
- package/dist/runtime/auth0/vue/index.d.ts +58 -0
- package/dist/runtime/auth0/vue/index.js +33 -0
- package/dist/runtime/better-auth/nuxt/middleware.d.ts +14 -0
- package/dist/runtime/better-auth/nuxt/middleware.js +39 -0
- package/dist/runtime/better-auth/nuxt/proxy.d.ts +6 -0
- package/dist/runtime/better-auth/nuxt/proxy.js +11 -0
- package/dist/runtime/better-auth/nuxt/server.d.ts +106 -0
- package/dist/runtime/better-auth/nuxt/server.js +123 -0
- package/dist/runtime/better-auth/vue/auth-boundary.d.ts +131 -0
- package/dist/runtime/better-auth/vue/auth-boundary.js +78 -0
- package/dist/runtime/better-auth/vue/client.d.ts +358 -0
- package/dist/runtime/better-auth/vue/client.js +5 -0
- package/dist/runtime/better-auth/vue/cross-domain.d.ts +39 -0
- package/dist/runtime/better-auth/vue/cross-domain.js +45 -0
- package/dist/runtime/better-auth/vue/hydration.d.ts +20 -0
- package/dist/runtime/better-auth/vue/hydration.js +52 -0
- package/dist/runtime/better-auth/vue/index.d.ts +12 -0
- package/dist/runtime/better-auth/vue/index.js +6 -0
- package/dist/runtime/better-auth/vue/plugin.client.d.ts +6 -0
- package/dist/runtime/better-auth/vue/plugin.client.js +32 -0
- package/dist/runtime/better-auth/vue/plugin.server.d.ts +24 -0
- package/dist/runtime/better-auth/vue/plugin.server.js +42 -0
- package/dist/runtime/better-auth/vue/use-auth.d.ts +92 -0
- package/dist/runtime/better-auth/vue/use-auth.js +82 -0
- package/dist/runtime/clerk/vue/index.d.ts +81 -0
- package/dist/runtime/clerk/vue/index.js +49 -0
- package/dist/runtime/devtools/bridge.d.ts +12 -0
- package/dist/runtime/devtools/bridge.js +191 -0
- package/dist/runtime/devtools/plugin.client.d.ts +8 -0
- package/dist/runtime/devtools/plugin.client.js +34 -0
- package/dist/runtime/devtools/types.d.ts +78 -0
- package/dist/runtime/devtools/types.js +0 -0
- package/dist/runtime/nuxt/composables/use-async-query.d.ts +144 -0
- package/dist/runtime/nuxt/composables/use-async-query.js +104 -0
- package/dist/runtime/nuxt/config.d.ts +7 -0
- package/dist/runtime/nuxt/config.js +12 -0
- package/dist/runtime/nuxt/index.d.ts +136 -0
- package/dist/runtime/nuxt/index.js +91 -0
- package/dist/runtime/polar/vue/components.d.ts +184 -0
- package/dist/runtime/polar/vue/components.js +115 -0
- package/dist/runtime/vue/auth/helpers.d.ts +67 -0
- package/dist/runtime/vue/auth/helpers.js +50 -0
- package/dist/runtime/vue/auth/index.d.ts +125 -0
- package/dist/runtime/vue/auth/index.js +97 -0
- package/dist/runtime/vue/client.d.ts +305 -0
- package/dist/runtime/vue/client.js +382 -0
- package/dist/runtime/vue/composables/use-action.d.ts +62 -0
- package/dist/runtime/vue/composables/use-action.js +13 -0
- package/dist/runtime/vue/composables/use-connection-state.d.ts +30 -0
- package/dist/runtime/vue/composables/use-connection-state.js +14 -0
- package/dist/runtime/vue/composables/use-mutation.d.ts +76 -0
- package/dist/runtime/vue/composables/use-mutation.js +34 -0
- package/dist/runtime/vue/composables/use-paginated-query.d.ts +132 -0
- package/dist/runtime/vue/composables/use-paginated-query.js +513 -0
- package/dist/runtime/vue/composables/use-queries.d.ts +62 -0
- package/dist/runtime/vue/composables/use-queries.js +37 -0
- package/dist/runtime/vue/composables/use-query.d.ts +87 -0
- package/dist/runtime/vue/composables/use-query.js +53 -0
- package/dist/runtime/vue/composables/use-storage-url.d.ts +46 -0
- package/dist/runtime/vue/composables/use-storage-url.js +9 -0
- package/dist/runtime/vue/composables/use-subscription.d.ts +15 -0
- package/dist/runtime/vue/composables/use-subscription.js +33 -0
- package/dist/runtime/vue/composables/use-upload-queue.d.ts +117 -0
- package/dist/runtime/vue/composables/use-upload-queue.js +115 -0
- package/dist/runtime/vue/composables/use-upload.d.ts +134 -0
- package/dist/runtime/vue/composables/use-upload.js +114 -0
- package/dist/runtime/vue/hydration.d.ts +66 -0
- package/dist/runtime/vue/hydration.js +46 -0
- package/dist/runtime/vue/index.d.ts +94 -0
- package/dist/runtime/vue/index.js +42 -0
- package/dist/runtime/vue/plugin.d.ts +18 -0
- package/dist/runtime/vue/plugin.js +16 -0
- package/dist/runtime/vue/provide.d.ts +39 -0
- package/dist/runtime/vue/provide.js +15 -0
- package/dist/runtime/vue/queries-observer.d.ts +41 -0
- package/dist/runtime/vue/queries-observer.js +126 -0
- package/dist/types.d.ts +3 -0
- package/package.json +233 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 razum@qruto.to
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# nuxt-convex-module
|
|
2
|
+
|
|
3
|
+
[![npm version][npm-version-src]][npm-version-href]
|
|
4
|
+
[![npm downloads][npm-downloads-src]][npm-downloads-href]
|
|
5
|
+
[![Tests][tests-src]][tests-href]
|
|
6
|
+
[![Coverage][coverage-src]][coverage-href]
|
|
7
|
+
[![License][license-src]][license-href]
|
|
8
|
+
[![Nuxt][nuxt-src]][nuxt-href]
|
|
9
|
+
|
|
10
|
+
[Convex](https://convex.dev) for [Vue](https://vuejs.org) & [Nuxt](https://nuxt.com) — a faithful Vue/Nuxt port of Convex's official React/Next integration.
|
|
11
|
+
|
|
12
|
+
`nuxt-convex-module` mirrors the upstream `convex/react` + `convex/nextjs` surface composable-for-hook: reactive live queries, mutations, actions, cursor pagination, file storage, connection state, and SSR preloading — adapted to Vue with [VueUse](https://vueuse.org) conventions (`MaybeRefOrGetter` inputs, `ComputedRef`/`ShallowRef` returns). Authentication is **provider-agnostic** like upstream: the core ships the generic `ConvexProviderWithAuth` equivalent (`provideConvexAuth`) plus Vue ports of Convex's [Clerk](https://clerk.com) and [Auth0](https://auth0.com) adapters, while [Better Auth](https://www.better-auth.com) and [Polar](https://polar.sh) are **opt-in** sub-modules — mirroring how `@convex-dev/better-auth` and `@convex-dev/polar` are separate packages upstream.
|
|
13
|
+
|
|
14
|
+
> 📖 **Full documentation:** the **[docs site](./website)** (homepage · docs · playground, one Nuxt app) covers installation, the integration guide, every composable and server helper, and the complete API reference.
|
|
15
|
+
|
|
16
|
+
## Supported official packages
|
|
17
|
+
|
|
18
|
+
Every supported upstream package is ported or wired with the **same public API**, adapted to Vue. Core Convex is always on; the rest light up when their package is installed.
|
|
19
|
+
|
|
20
|
+
| Official package | What this gives you | Enable | Subpath | Baseline |
|
|
21
|
+
|---|---|---|---|---|
|
|
22
|
+
| [`convex`](https://npmjs.com/package/convex) — `/react` + `/nextjs` | The whole data layer: composables, `ConvexVueClient`, auth helpers, SSR preload + server (Nitro) utils | **always on** | `…/vue`, `…/server` | `1.42` |
|
|
23
|
+
| `convex` — [`/react-clerk`](https://docs.convex.dev/auth/clerk) | [Clerk](https://clerk.com) auth: `provideConvexAuthFromClerk()` · `<ConvexProviderWithClerk>` | `npm i @clerk/vue` | `…/clerk/vue` | `1.42` |
|
|
24
|
+
| `convex` — [`/react-auth0`](https://docs.convex.dev/auth/auth0) | [Auth0](https://auth0.com) auth: `provideConvexAuthFromAuth0()` · `<ConvexProviderWithAuth0>` | `npm i @auth0/auth0-vue` | `…/auth0/vue` | `1.42` |
|
|
25
|
+
| [`@convex-dev/better-auth`](https://github.com/get-convex/better-auth) | [Better Auth](https://better-auth.com): `useAuth`, `/api/auth/**` proxy, SSR prefetch, `auth` middleware, `<AuthBoundary>`, `convexAuth` | `npm i @convex-dev/better-auth` | `…/better-auth/vue` | `0.12` |
|
|
26
|
+
| [`@convex-dev/polar`](https://github.com/get-convex/polar) | [Polar](https://polar.sh) billing: `<CheckoutLink>` · `<CustomerPortalLink>` | `npm i @convex-dev/polar` | `…/polar/vue` | `0.9` |
|
|
27
|
+
| [`@convex-dev/resend`](https://github.com/get-convex/resend) | **Server-only** — no client port needed; call its functions with `useMutation` / `useAction` | (use in your Convex deployment) | — | — |
|
|
28
|
+
|
|
29
|
+
Subpath = `nuxt-convex-module/<subpath>`. Pinned baselines and the file-by-file map: [`PARITY.md`](./PARITY.md).
|
|
30
|
+
|
|
31
|
+
## How it plugs into Nuxt
|
|
32
|
+
|
|
33
|
+
Listing `nuxt-convex-module` in your `modules` array wires Convex into every layer of the app — through the same `@nuxt/kit` integration points any module uses. Everything below is registered for you; nothing needs importing or manual wiring.
|
|
34
|
+
|
|
35
|
+
### Auto-imported composables · `addImports`
|
|
36
|
+
|
|
37
|
+
**Data**
|
|
38
|
+
- `useQuery` / `useConvexQuery` — reactive live query (plus `useQuery_experimental`, the 1.39 result/error split)
|
|
39
|
+
- `useAsyncQuery` / `useConvexAsyncQuery` — SSR-fetched, payload-hydrated live query with Nuxt's `{ data, error, status, refresh }` shape
|
|
40
|
+
- `useQueries` / `useConvexQueries` — several live queries over one subscription
|
|
41
|
+
- `useMutation` / `useConvexMutation` — call a Convex mutation
|
|
42
|
+
- `useAction` / `useConvexAction` — call a Convex action
|
|
43
|
+
- `usePaginatedQuery` — cursor pagination (plus `usePaginatedQuery_experimental`, dual-overload)
|
|
44
|
+
- `useConvexConnectionState` — live WebSocket connection status
|
|
45
|
+
- `useConvex` — the underlying Convex client
|
|
46
|
+
|
|
47
|
+
**Files**
|
|
48
|
+
- `useUpload` / `useConvexUpload` / `uploadFile` — upload to Convex storage
|
|
49
|
+
- `useUploadQueue` / `useConvexUploadQueue` — multi-file upload queue
|
|
50
|
+
- `useStorageUrl` / `useConvexStorageUrl` — resolve a stored file's URL
|
|
51
|
+
|
|
52
|
+
**Auth (provider-agnostic)**
|
|
53
|
+
- `useConvexAuth` / `provideConvexAuth` — Convex auth state
|
|
54
|
+
- `usePreloadedQuery` — hydrate an SSR-preloaded query on the client
|
|
55
|
+
|
|
56
|
+
**App API wiring**
|
|
57
|
+
- `provideConvexApi` / `useConvexApi` / `useConvexNamespace` — provide and consume the generated `api`
|
|
58
|
+
|
|
59
|
+
### Auto-imported components · `addComponent`
|
|
60
|
+
|
|
61
|
+
- `<Authenticated>` / `<Unauthenticated>` / `<AuthLoading>` / `<AuthRefreshing>` — render by auth state
|
|
62
|
+
|
|
63
|
+
> Integration-specific composables and components auto-import too **when their package is installed** — `useAuth` + `<AuthBoundary>` (Better Auth), `provideConvexAuthFromClerk` + `<ConvexProviderWithClerk>` (Clerk), `provideConvexAuthFromAuth0` + `<ConvexProviderWithAuth0>` (Auth0), `<CheckoutLink>` + `<CustomerPortalLink>` (Polar). See [Supported official packages](#supported-official-packages).
|
|
64
|
+
|
|
65
|
+
### Server (Nitro) auto-imports · `addServerImports`
|
|
66
|
+
|
|
67
|
+
- `fetchQuery` / `fetchMutation` / `fetchAction` — one-shot Convex calls
|
|
68
|
+
- `preloadQuery` / `preloadedQueryResult` — SSR preload and the client hydration handoff
|
|
69
|
+
- `convexAuth` — request-scoped authenticated server client (Better Auth only)
|
|
70
|
+
|
|
71
|
+
### Plugins, middleware & dev wiring
|
|
72
|
+
|
|
73
|
+
- **Base client plugin** · `addPlugin` — provides a `ConvexVueClient` (server + client) so the data layer works on its own; Better Auth supplies its own client plugin instead when installed.
|
|
74
|
+
- **Provide-api plugin** · `addPluginTemplate` — wires the generated `api` app-wide; fs-guarded to a no-op until `convex dev` has run, and **re-rendered live** the moment codegen appears (`builder:watch`).
|
|
75
|
+
- **Server handler + route rule** · `addServerHandler` / `extendRouteRules` — the same-origin `/api/auth/**` proxy, marked uncacheable (Better Auth only).
|
|
76
|
+
- **Route middleware** · `addRouteMiddleware` — the opt-in `auth` page guard (Better Auth only).
|
|
77
|
+
- **Nuxt DevTools tab** · `addCustomTab` + devtools RPC — a **Convex panel** (dev only): live connection state, active query subscriptions with results and per-query server logs, auth state, the client log stream, and open-in-editor for Convex functions. Disable with `convex.devtools: false`.
|
|
78
|
+
|
|
79
|
+
### Runtime config & import aliases
|
|
80
|
+
|
|
81
|
+
- **Runtime config** (`convex` key, via `updateRuntimeConfig`): public `convex.url` / `convex.siteUrl`
|
|
82
|
+
- **Aliases** (Vite + Nitro): `#convex`, `#convex/api`, `#convex/server`, `#convex/dataModel`, `#convex/_generated`
|
|
83
|
+
|
|
84
|
+
### Module dependency · `moduleDependencies`
|
|
85
|
+
|
|
86
|
+
- Installs and configures [`nuxt-security`](https://nuxt-security.vercel.app), applying a Convex-aware CSP in production — `connect-src`, `img-src`, and `media-src` scoped to your deployment.
|
|
87
|
+
|
|
88
|
+
### Manual imports · subpath exports
|
|
89
|
+
|
|
90
|
+
Everything above is auto-imported in Nuxt, but each surface is also a real **subpath export** — reach for these for explicit/type-only imports. Entries follow **client/server** naming. The self-contained client entries also work in a **plain Vue** (non-Nuxt) app and carry a `/vue` alias for that use; `/better-auth/client` and `/server` rely on Nuxt-provided aliases/runtime config and need Nuxt:
|
|
91
|
+
|
|
92
|
+
| Import path | Contents |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `nuxt-convex-module` | the Nuxt module (for `modules: []`) |
|
|
95
|
+
| `nuxt-convex-module/client` (alias `/vue`) | `ConvexVueClient`, `ConvexClientKey`, every composable (`useQuery`, `useMutation`, `useAction`, pagination, upload, …), auth (`provideConvexAuth`, `useConvexAuth`, `<Authenticated>` …), `usePreloadedQuery`, and all public types |
|
|
96
|
+
| `nuxt-convex-module/server` | Nitro/server: `fetchQuery`, `fetchMutation`, `fetchAction`, `preloadQuery`, `preloadedQueryResult` |
|
|
97
|
+
| `nuxt-convex-module/clerk/client` (alias `/clerk/vue`) | `provideConvexAuthFromClerk`, `<ConvexProviderWithClerk>` |
|
|
98
|
+
| `nuxt-convex-module/auth0/client` (alias `/auth0/vue`) | `provideConvexAuthFromAuth0`, `<ConvexProviderWithAuth0>` |
|
|
99
|
+
| `nuxt-convex-module/better-auth/client` | `useAuth`, `authClient`, `usePreloadedAuthQuery`, `consumeCrossDomainOneTimeToken`, `<AuthBoundary>`, and the `convexClient` / `crossDomainClient` client plugins (re-exported from `@convex-dev/better-auth/client/plugins`) |
|
|
100
|
+
| `nuxt-convex-module/better-auth/server` | Nitro/server: `convexAuth(event)` (auto-imported in server code; import explicitly for the `ConvexAuthOptions` / `ConvexAuthService` types) |
|
|
101
|
+
| `nuxt-convex-module/polar/client` (alias `/polar/vue`) | `<CheckoutLink>`, `<CustomerPortalLink>` |
|
|
102
|
+
|
|
103
|
+
## Integrations (auto-detected)
|
|
104
|
+
|
|
105
|
+
You only ever add **one** module. Better Auth and Polar light up automatically when their packages are installed — no extra `modules` entries, no config:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# add auth → it's wired on next dev
|
|
109
|
+
npm i @convex-dev/better-auth better-auth
|
|
110
|
+
# add billing components → registered automatically
|
|
111
|
+
npm i @convex-dev/polar @polar-sh/checkout
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
// nuxt.config.ts — still just one module
|
|
116
|
+
export default defineNuxtConfig({
|
|
117
|
+
modules: ['nuxt-convex-module'],
|
|
118
|
+
|
|
119
|
+
// Everything below is optional. Integrations auto-enable when installed;
|
|
120
|
+
// override only if you want to force one on/off or change the auth route.
|
|
121
|
+
convex: {
|
|
122
|
+
// betterAuth: false,
|
|
123
|
+
// betterAuth: { authClient: './app/convex-auth-client' }, // bring your own client
|
|
124
|
+
// betterAuth: { crossDomainCallbackRoute: '/auth/callback' }, // login-CSRF guard for crossDomainClient()
|
|
125
|
+
// polar: false,
|
|
126
|
+
// authRoute: '/api/auth',
|
|
127
|
+
},
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
- **Better Auth** (when `@convex-dev/better-auth` is installed) — a Vue/Nuxt port of its `react` + `nextjs` integration: `useAuth` (session, sign-in/out), the same-origin `/api/auth/**` proxy, SSR token prefetch, the opt-in `auth` route middleware, the `<AuthBoundary>` component, and `convexAuth(event)` for request-scoped server calls. Imported directly via `nuxt-convex-module/better-auth/client`. Bring your own auth client (to choose plugins — e.g. `emailOTPClient()`, `passkeyClient()`, or `crossDomainClient()` for cross-domain auth) by pointing `convex.betterAuth.authClient` at a module that exports `authClient`; otherwise a minimal bundled default (`convexClient()` only) is used.
|
|
132
|
+
- **Clerk** (when `@clerk/vue` is installed) — a Vue port of `convex/react-clerk`: `provideConvexAuthFromClerk()` and `<ConvexProviderWithClerk>`. Types via `nuxt-convex-module/clerk/client`.
|
|
133
|
+
- **Auth0** (when `@auth0/auth0-vue` is installed) — a Vue port of `convex/react-auth0`: `provideConvexAuthFromAuth0()` and `<ConvexProviderWithAuth0>`. Types via `nuxt-convex-module/auth0/client`.
|
|
134
|
+
- **Polar** (when `@convex-dev/polar` is installed) — a Vue port of `@convex-dev/polar/react`'s `<CheckoutLink>` and `<CustomerPortalLink>`. Types via `nuxt-convex-module/polar/client`.
|
|
135
|
+
|
|
136
|
+
Pure Convex with no auth? Install none of them — you get just the data layer (the module provides a base client on its own), and nothing drags an auth provider or Polar into your bundle.
|
|
137
|
+
|
|
138
|
+
## Quick start
|
|
139
|
+
|
|
140
|
+
### 1. Install
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npx nuxi@latest module add nuxt-convex-module
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
> Using **strict** pnpm? Add `public-hoist-pattern[]=@convex-dev/*` to `.npmrc` (or set `node-linker=hoisted`) so Convex can resolve component definitions.
|
|
147
|
+
|
|
148
|
+
### 2. Add the module
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
// nuxt.config.ts
|
|
152
|
+
export default defineNuxtConfig({
|
|
153
|
+
modules: ['nuxt-convex-module'],
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 3. Configure environment
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# .env.local (Nuxt app)
|
|
161
|
+
NUXT_PUBLIC_CONVEX_URL=https://your-deployment.convex.cloud
|
|
162
|
+
NUXT_PUBLIC_CONVEX_SITE_URL=https://your-deployment.convex.site
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 4. Start the app, then Convex
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm run dev
|
|
169
|
+
npx convex dev
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## A taste
|
|
173
|
+
|
|
174
|
+
```vue
|
|
175
|
+
<script setup lang="ts">
|
|
176
|
+
import { api } from '#convex/api'
|
|
177
|
+
|
|
178
|
+
// SSR-rendered AND live-updating — Nuxt's { data, status, error } shape:
|
|
179
|
+
const { data: messages } = useAsyncQuery(api.messages.list, {})
|
|
180
|
+
const send = useMutation(api.messages.send)
|
|
181
|
+
</script>
|
|
182
|
+
|
|
183
|
+
<template>
|
|
184
|
+
<ul><li v-for="m in messages" :key="m._id">{{ m.body }}</li></ul>
|
|
185
|
+
<button @click="send({ body: 'hi' })">Send</button>
|
|
186
|
+
</template>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
A runnable version lives in [`examples/minimal`](examples/minimal) — or open it directly in [StackBlitz](https://stackblitz.com/github/qruto/nuxt-convex-module/tree/main/examples/minimal).
|
|
190
|
+
|
|
191
|
+
## Relationship to upstream
|
|
192
|
+
|
|
193
|
+
This package is intentionally kept **diffable against the upstream React/Next sources** so it can track new Convex / Better Auth / Polar releases. Each file mirrors its origin:
|
|
194
|
+
|
|
195
|
+
| This package | Upstream |
|
|
196
|
+
|---|---|
|
|
197
|
+
| `src/runtime/vue/**` | `convex/src/react/**` |
|
|
198
|
+
| `src/runtime/nuxt/**` | `convex/src/nextjs/**` |
|
|
199
|
+
| `src/runtime/clerk/**` | `convex/src/react-clerk/**` |
|
|
200
|
+
| `src/runtime/auth0/**` | `convex/src/react-auth0/**` |
|
|
201
|
+
| `src/runtime/better-auth/**` | `@convex-dev/better-auth/src/{react,nextjs}/**` |
|
|
202
|
+
| `src/runtime/polar/**` | `@convex-dev/polar/src/react/**` |
|
|
203
|
+
|
|
204
|
+
The authoritative file-by-file map, pinned upstream baseline versions, and out-of-scope list live in [`PARITY.md`](./PARITY.md); the React→Vue translation rules an automated sync agent follows are in [`AGENTS.md`](./AGENTS.md).
|
|
205
|
+
|
|
206
|
+
## Contributing
|
|
207
|
+
|
|
208
|
+
1. Clone this repository
|
|
209
|
+
2. Install dependencies using `pnpm install`
|
|
210
|
+
3. Prepare for development using `pnpm dev:prepare`
|
|
211
|
+
4. Start the development server (the docs/playground app) using `pnpm dev` — or `pnpm start`
|
|
212
|
+
|
|
213
|
+
`pnpm dev` runs the playground through [portless](https://portless.sh), so it is served at a stable, named HTTPS URL — **https://nuxt-convex-module.localhost** — instead of a shifting `localhost:<port>`. portless generates and trusts a local CA on first run (auto-elevating to bind port 443); pass `--no-tls` for plain HTTP, or run `nuxt dev website` directly to bypass portless entirely.
|
|
214
|
+
|
|
215
|
+
We follow conventional commits. See [CONTRIBUTING.md](./CONTRIBUTING.md) and [RELEASING.md](./RELEASING.md).
|
|
216
|
+
|
|
217
|
+
## Security
|
|
218
|
+
|
|
219
|
+
Found a vulnerability? Report it privately via [GitHub Security Advisories](https://github.com/qruto/nuxt-convex-module/security/advisories/new) — not in a public issue. See [SECURITY.md](./SECURITY.md).
|
|
220
|
+
|
|
221
|
+
## License
|
|
222
|
+
|
|
223
|
+
[MIT](./LICENSE)
|
|
224
|
+
|
|
225
|
+
<!-- Badges -->
|
|
226
|
+
[npm-version-src]: https://img.shields.io/npm/v/nuxt-convex-module/latest.svg?style=plastic&colorA=020420&colorB=00DC82
|
|
227
|
+
[npm-version-href]: https://npmjs.com/package/nuxt-convex-module
|
|
228
|
+
|
|
229
|
+
[npm-downloads-src]: https://img.shields.io/npm/dm/nuxt-convex-module.svg?style=plastic&colorA=020420&colorB=00DC82
|
|
230
|
+
[npm-downloads-href]: https://npm.chart.dev/nuxt-convex-module
|
|
231
|
+
|
|
232
|
+
[license-src]: https://img.shields.io/npm/l/nuxt-convex-module.svg?style=plastic&colorA=020420&colorB=00DC82
|
|
233
|
+
[license-href]: https://npmjs.com/package/nuxt-convex-module
|
|
234
|
+
|
|
235
|
+
[tests-src]: https://img.shields.io/github/actions/workflow/status/qruto/nuxt-convex-module/ci.yml?branch=main&style=plastic&colorA=020420&label=tests
|
|
236
|
+
[tests-href]: https://github.com/qruto/nuxt-convex-module/actions/workflows/ci.yml
|
|
237
|
+
|
|
238
|
+
[coverage-src]: https://img.shields.io/codecov/c/github/qruto/nuxt-convex-module?style=plastic&colorA=020420&label=coverage
|
|
239
|
+
[coverage-href]: https://codecov.io/gh/qruto/nuxt-convex-module
|
|
240
|
+
|
|
241
|
+
[nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt&style=plastic
|
|
242
|
+
[nuxt-href]: https://nuxt.com
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { onDevToolsInitialized, extendServerRpc, addCustomTab } from '@nuxt/devtools-kit';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
|
|
5
|
+
const RPC_NAMESPACE = "nuxt-convex-module";
|
|
6
|
+
const DEVTOOLS_UI_ROUTE = "/__nuxt-convex-module";
|
|
7
|
+
const DEVTOOLS_UI_LOCAL_PORT = 3630;
|
|
8
|
+
|
|
9
|
+
const EXTENSIONS = ["ts", "tsx", "js", "jsx", "mts", "mjs"];
|
|
10
|
+
function resolveFunctionSource(rootDir, functionsDir, udfPath) {
|
|
11
|
+
const modulePath = udfPath.split(":")[0];
|
|
12
|
+
if (!modulePath || modulePath.split("/").some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
const base = join(rootDir, functionsDir);
|
|
16
|
+
for (const candidate of [modulePath, `${modulePath}/index`]) {
|
|
17
|
+
for (const ext of EXTENSIONS) {
|
|
18
|
+
const filepath = join(base, `${candidate}.${ext}`);
|
|
19
|
+
if (existsSync(filepath)) {
|
|
20
|
+
return { filepath };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function setupDevtools(resolver, nuxt, info) {
|
|
28
|
+
const devtoolsClientPath = resolver.resolve("./devtools-client");
|
|
29
|
+
if (existsSync(devtoolsClientPath)) {
|
|
30
|
+
nuxt.hook("vite:serverCreated", async (server) => {
|
|
31
|
+
const sirv = (await import('sirv')).default;
|
|
32
|
+
server.middlewares.use(DEVTOOLS_UI_ROUTE, sirv(devtoolsClientPath, { dev: true, single: true }));
|
|
33
|
+
});
|
|
34
|
+
} else {
|
|
35
|
+
nuxt.hook("vite:extendConfig", (config) => {
|
|
36
|
+
const mutable = config;
|
|
37
|
+
mutable.server ||= {};
|
|
38
|
+
mutable.server.proxy ||= {};
|
|
39
|
+
mutable.server.proxy[DEVTOOLS_UI_ROUTE] = {
|
|
40
|
+
target: `http://localhost:${DEVTOOLS_UI_LOCAL_PORT}${DEVTOOLS_UI_ROUTE}`,
|
|
41
|
+
changeOrigin: true,
|
|
42
|
+
followRedirects: true,
|
|
43
|
+
rewrite: (path) => path.replace(DEVTOOLS_UI_ROUTE, "")
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
onDevToolsInitialized(() => {
|
|
48
|
+
extendServerRpc(RPC_NAMESPACE, {
|
|
49
|
+
getInfo: () => info,
|
|
50
|
+
resolveFunctionSource: (udfPath) => resolveFunctionSource(info.rootDir, info.functionsDir, udfPath)
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
addCustomTab({
|
|
54
|
+
name: "nuxt-convex-module",
|
|
55
|
+
title: "Convex",
|
|
56
|
+
icon: `${DEVTOOLS_UI_ROUTE}/icon.svg`,
|
|
57
|
+
view: {
|
|
58
|
+
type: "iframe",
|
|
59
|
+
src: DEVTOOLS_UI_ROUTE
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { setupDevtools };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-convex-module/_nuxt/Cr6_aklh.js"}}</script><link rel="stylesheet" href="/__nuxt-convex-module/_nuxt/entry.DbTJhkHT.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/Cr6_aklh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/dy_xXcv9.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/DNfpyBVU.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/B29GGJ5n.js"><script type="module" src="/__nuxt-convex-module/_nuxt/Cr6_aklh.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/__nuxt-convex-module/_nuxt/error-500.8ZJqCQm8.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/BY23OQOo.js"><link rel="prefetch" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/BSDEpQet.js"></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-convex-module",buildId:"a7708498-bd09-4de2-b5ab-19b380293c77",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1785709851876,false]</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-convex-module/_nuxt/Cr6_aklh.js"}}</script><link rel="stylesheet" href="/__nuxt-convex-module/_nuxt/entry.DbTJhkHT.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/Cr6_aklh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/dy_xXcv9.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/DNfpyBVU.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/B29GGJ5n.js"><script type="module" src="/__nuxt-convex-module/_nuxt/Cr6_aklh.js" crossorigin></script><link rel="prefetch" as="style" crossorigin href="/__nuxt-convex-module/_nuxt/error-500.8ZJqCQm8.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/BY23OQOo.js"><link rel="prefetch" as="script" crossorigin href="/__nuxt-convex-module/_nuxt/BSDEpQet.js"></head><body><div id="__nuxt"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-convex-module",buildId:"a7708498-bd09-4de2-b5ab-19b380293c77",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1785709851876,false]</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as e}from"./dy_xXcv9.js";import{C as t,S as n}from"./DNfpyBVU.js";var r=new Set([`link`,`style`,`script`,`noscript`]),i=new Set([`title`,`titleTemplate`,`script`,`style`,`noscript`]),a=new Set([`base`,`meta`,`link`,`style`,`script`,`noscript`]),o=new Set([`title`,`base`,`htmlAttrs`,`bodyAttrs`,`meta`,`link`,`style`,`script`,`noscript`]),s=new Set([`base`,`title`,`titleTemplate`,`bodyAttrs`,`htmlAttrs`,`templateParams`]),c=new Set([`key`,`tagPosition`,`tagPriority`,`tagDuplicateStrategy`,`innerHTML`,`textContent`,`processTemplateParams`]),l=new Set([`templateParams`,`htmlAttrs`,`bodyAttrs`]),u=new Set([`theme-color`,`google-site-verification`,`og`,`article`,`book`,`profile`,`twitter`,`author`]),d={critical:-8,high:-1,low:2};function f(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function p(t){let n=new e;for(let e in t||{})n.hook(e,t[e]);return n}function m(e,t,n){if(e.hooks?._hooks?.[t]?.length)return e.hooks?.callHook(t,n)}var h=/^(?:viewport|description|keywords|robots)$/,g=[`name`,`property`,`http-equiv`];function _(e){let t=e.indexOf(`:`);if(t===-1)return!1;let n=e.indexOf(`:`,t+1);return u.has(e.slice(t+1,n===-1?e.length:n))}function v(e){let{props:t,tag:n,key:r}=e;if(s.has(n))return n;if(n===`link`){if(t.rel===`canonical`)return`canonical`;if(t.rel===`alternate`&&t.hreflang)return`alternate:${t.hreflang}`}if(t.charset)return`charset`;if(n===`meta`)for(let e of g){let n=t[e];if(n!==void 0)return`meta:${n}${(typeof n!=`string`||!n.includes(`:`))&&!h.test(n)&&r?`:key:${r}`:``}`}return r?`${n}:key:${r}`:t.id?`${n}:id:${t.id}`:n===`link`&&t.rel&&t.href?`link:${t.rel}:${t.href}`:i.has(n)&&(e.textContent||e.innerHTML)?`${n}:content:${e.textContent||e.innerHTML}`:void 0}function y(e){let t=e._h||e._d||e.textContent||e.innerHTML;if(t)return t;let n=Object.keys(e.props).sort(),r=`${e.tag}:`,i=``;for(let t of n)r+=`${i}${t}:${String(e.props[t])}`,i=`,`;return r}function b(e,t,n){if(n===`_resolver`)return e;typeof e==`function`&&(!n||n!==`titleTemplate`&&!n.startsWith(`on`))&&(e=e());let r=t?t(n,e):e;if(Array.isArray(r)){let e;for(let n=0;n<r.length;n++){let i=b(r[n],t);e?e[n]=i:i!==r[n]&&(e=r.slice(0,n),e[n]=i)}return e||r}if(r?.constructor===Object){let e;for(let n in r){let i=f(n),a=i?void 0:b(r[n],t,n);if(!e&&(i||a!==r[n])){e={};for(let t in r){if(t===n)break;e[t]=r[t]}}e&&!i&&(e[n]=a)}return e||r}return r}var x=/[\s"'<>/=\x00-\x1F\x7F]/;function S(e,t){let n=e===`style`,r=n?new Map:new Set,i=e=>{if(e)if(n){let t=e.indexOf(`:`);t>0&&r.set(e.slice(0,t).trim(),e.slice(t+1).trim())}else e.split(` `).forEach(e=>e&&r.add(e))};if(typeof t==`string`)(n?t.split(`;`):[t]).forEach(i);else if(Array.isArray(t))t.forEach(i);else if(t&&typeof t==`object`)for(let e in t){let a=t[e];a&&a!==`false`&&(n?r.set(e.trim(),String(a)):i(e))}return r}function C(e,t){if(e.props=e.props||{},!t)return e;if(e.tag===`templateParams`)return e.props=t,e;let n=a.has(e.tag)||e.tag===`htmlAttrs`||e.tag===`bodyAttrs`;for(let r in t){if(f(r))continue;let i=r.startsWith(`data-`),a=n&&!c.has(r),o=a&&!i?r.toLowerCase():r;if(a&&(!o||x.test(o)))continue;let s=t[r];if(s===null)e.props[o]=null;else if(r===`class`||r===`style`)e.props[r]=S(r,s);else if(c.has(r))if((r===`textContent`||r===`innerHTML`)&&typeof s==`object`){let n=t.type||`application/json`;(n.endsWith(`json`)||n===`speculationrules`||n===`importmap`)&&(e.props.type=t.type=n,e[r]=JSON.stringify(s))}else e[r]=s;else if(s!==void 0){let t=String(s),n=e.tag===`meta`&&o===`content`;e.props[o]=t===`true`||t===``?i||n?t:!0:!s&&i&&t===`false`?`false`:s}}return e}function w(e,t){let n;return t.length&&(n=(e,n)=>{for(let r=0;r<t.length;r++)n=t[r](e,n);return n},e=n(void 0,e)),b(e,n)}function T(e,t){let n=C({tag:e,props:{}},typeof t==`object`&&typeof t!=`function`?t:{[e===`script`||e===`noscript`||e===`style`?`innerHTML`:`textContent`]:t});if(n.key&&r.has(n.tag)&&(n.props[`data-hid`]=n._h=n.key),n.tag===`script`&&typeof n.innerHTML==`object`&&(n.innerHTML=JSON.stringify(n.innerHTML),n.props.type=n.props.type||`application/json`),Array.isArray(n.props.content)){let e=[];for(let t of n.props.content)e.push({...n,props:{...n.props,content:t}});return e}return n}function E(e,t){if(Array.isArray(t))for(let n of t)e.push(n);else e.push(t)}function D(e,t){if(!e)return[];typeof e==`function`&&(e=e()),e=w(e,t);let n=[];for(let t in e){let r=e[t];if(r!==void 0)if(Array.isArray(r))for(let e of r)E(n,T(t,e));else E(n,T(t,r))}return n}var O=/</g,k=/<\/script/g,A=(e,t)=>e._w===t._w?e._p-t._p:e._w-t._w,j=()=>100;function M(e){for(let t in e)return!1;return!0}var N=/^tags:|:render/;function P(e,t){let n=(t[`entries:resolve`]?.length||0)+(t[`entries:normalize`]?.length||0);if(e._h!==n){e._h=n;for(let t of e.entries.values())delete t._tags}}function F(e){for(let t=0;t<e.length;t++){let n=e[t],r={...n.props};r.class instanceof Set&&(r.class=new Set(r.class)),r.style instanceof Map&&(r.style=new Map(r.style)),e[t]={...n,props:r}}}function I(e,t){let n=e.tags,r=0;for(let t of e.tagMap.values())if(Array.isArray(t))for(let e of t)n[r++]=e;else n[r++]=t;n.length=r,t&&n.sort(A)}function L(e){let t=!1;for(let n of e.tags.sort(A)){let r=n._d||y(n);if(!r)continue;let i=e.tagMap.get(r);if(!i){e.tagMap.set(r,n);continue}if((n.tagDuplicateStrategy||(l.has(n.tag)?`merge`:null)||(n.key&&n.key===i.key?`merge`:null))===`merge`){let t={...i.props};for(let e in n.props)t[e]=e===`style`?new Map([...i.props.style||new Map,...n.props[e]]):e===`class`?new Set([...i.props.class||[],...n.props[e]]):n.props[e];e.tagMap.set(r,{...n,props:t})}else n._p>>10==i._p>>10&&n.tag===`meta`&&_(r)?(e.tagMap.set(r,Object.assign([...Array.isArray(i)?i:[i],n],n)),t=!0):(n._w===i._w?n._p>i._p:n._w<i._w)&&e.tagMap.set(r,n)}return t}function R(e,t){let n=e.tagMap.get(`title`),r=e.tagMap.get(`titleTemplate`);if(t._title=n?.textContent,!r)return;let i=r.textContent;if(t._titleTemplate=i,!i)return;let a=typeof i==`function`?i(n?.textContent):i;typeof a==`string`&&!t.plugins.has(`template-params`)&&(a=a.replace(`%s`,n?.textContent||``)),n?a===null?e.tagMap.delete(`title`):e.tagMap.set(`title`,{...n,textContent:a}):e.tagMap.set(`titleTemplate`,{...r,tag:`title`,textContent:a})}function z(e){let t=0;for(let n of e){let{innerHTML:r,tag:i,props:a}=n;if(!(!o.has(i)||M(a)&&!r&&!n.textContent)&&!(i===`meta`&&!a.content&&!a[`http-equiv`]&&!a.charset)){if(i===`script`&&(r||n.textContent)){let e=String(a.type),t=e.endsWith(`json`)||e===`importmap`||e===`speculationrules`,i=e=>t?(typeof e==`string`?e:JSON.stringify(e)).replace(O,`\\u003C`):typeof e==`string`?e.replace(k,`<\\/script`):e;n={...n},r&&(n.innerHTML=i(r)),n.textContent&&=i(n.textContent),n._d=v(n)}e[t++]=n}}return e.length=t,e}function B(e,t){let n=t?.tagWeight??e.resolvedOptions._tagWeight??j,r={tagMap:new Map,tags:[]},i=e.hooks?._hooks||{};P(e,i);for(let t of e.entries.values())t._pending!==void 0&&(t.input=t._pending,delete t._pending,delete t._tags,delete t._precomputedTags);let a;(i[`entries:resolve`]?.length||i[`entries:normalize`]?.length)&&(a=[...e.entries.values()],i[`entries:resolve`]?.length&&m(e,`entries:resolve`,{entries:a,...r})),P(e,i);for(let t of a||e.entries.values()){let a=t._tags;if(!a)if(t._precomputedTags&&n===e.resolvedOptions._tagWeight&&!i[`entries:normalize`]?.length&&!i[`entries:resolve`]?.length&&(!t.options||M(t.options)))a=t._precomputedTags;else{if(a=D(t.input,e.resolvedOptions.propResolvers||[]),t.options&&!M(t.options))for(let e of a)Object.assign(e,t.options);if(i[`entries:normalize`]?.length){let n={tags:a,entry:t};m(e,`entries:normalize`,n),a=n.tags}for(let e=0;e<a.length;e++){let r=a[e];r._w=n(r),r._p=(t._i<<10)+e,r._d=v(r),r._d||(r._h=y(r))}t._tags=a}r.tags.push(...a)}for(let e in i)if(i[e]?.length&&N.test(e)){F(r.tags);break}let o=L(r);return R(r,e),I(r,o),m(e,`tags:beforeResolve`,r),m(e,`tags:resolve`,r),m(e,`tags:afterResolve`,r),z(r.tags)}var V=`usehead`;function H(){if(n()){let e=t(V);if(e)return e}throw Error(`useHead() was called without provide context, ensure you call it through the setup() function.`)}function U(e){return{install(t){t.config.globalProperties.$unhead=e,t.config.globalProperties.$head=e,t.provide(V,e)}}.install}export{y as a,B as c,p as d,a as f,v as i,b as l,H as n,_ as o,d as p,U as r,C as s,V as t,m as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e,g as t,h as n,i as r}from"./dy_xXcv9.js";import{C as i,D as a,G as o,O as s,S as c,U as l,Z as u,k as d,q as f,y as p,z as m}from"./DNfpyBVU.js";import{l as h,n as g}from"./B29GGJ5n.js";var _=Object.assign((e,t)=>o(t)?u(t):t,{_static:!0});function v(e,t={}){let n=t.head||g();return n.ssr?n.push(e||{},t):y(n,e,t)}function y(e,t,n={}){let r=l();if(r&&!r.active)return{patch(){},dispose(){},_i:-1};let i=f(!1);if(n.onRendered&&r){let e=n.onRendered;n={...n,onRendered:t=>r.run(()=>e(t))}}let o;return m(()=>{let r=i.value?{}:h(t,_);o?o.patch(r):o=e.push(r,n)}),p()&&(s(()=>{o.dispose()}),d(()=>{i.value=!0}),a(()=>{i.value=!1})),o}var b=e({docsBase:n,reporters:t});function x(e){let t=e||r();return t.ssrContext?.head||t.runWithContext(()=>{if(c()){let e=i(`usehead`);if(!e)throw b.NUXT_E6001();return e}})}function S(e,t={}){return v(e,{head:t.head||x(t.nuxt),...t})}export{S as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as e,_t as t,f as n,l as r,t as i}from"./DNfpyBVU.js";import{t as a}from"./BSDEpQet.js";var o={class:`antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide`},s={class:`max-w-520px text-center`},c=[`textContent`],l=[`textContent`],u=[`textContent`],d=i({__name:`error-500`,props:{appName:{type:String,default:`Nuxt`},status:{type:Number,default:500},statusText:{type:String,default:`Internal server error`},description:{type:String,default:`This page is temporarily unavailable.`},refresh:{type:String,default:`Refresh this page`}},setup(i){let d=i;return a({title:`${d.status} - ${d.statusText} | ${d.appName}`,script:[{innerHTML:`!function(){let e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(let e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(let t of e)if("childList"===t.type)for(let e of t.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;let r=function(e){let r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:`*,:after,:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 #0000;--un-ring-shadow:0 0 #0000;--un-shadow-inset: ;--un-shadow:0 0 #0000;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:#93c5fd80;--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`}]}),(a,d)=>(e(),n(`div`,o,[r(`div`,s,[r(`h1`,{class:`font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]`,textContent:t(i.status)},null,8,c),r(`h2`,{class:`font-semibold mb-2 sm:text-3xl text-2xl`,textContent:t(i.statusText)},null,8,l),r(`p`,{class:`mb-4 px-2 text-[#64748B] text-md`,textContent:t(i.description)},null,8,u)])]))}},[[`__scopeId`,`data-v-d6d2b4c9`]]);export{d as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,F as n,M as r,P as i,T as a,_t as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,u as m,v as h}from"./DNfpyBVU.js";import{c as g,n as _,o as v,s as y}from"#entry";import{t as b}from"./CZbAGcNC.js";var x={key:0,"i-carbon:arrow-up-right":``,"translate-y--1":``,"text-xs":``,op50:``},S={__name:`NLink`,props:{to:{type:String,required:!1},href:{type:String,required:!1},target:{type:String,required:!1},underline:{type:Boolean,required:!1}},setup(e){let i=e,o=s(()=>i.href||i.to);return(i,s)=>{let u=v;return r(),m(u,a(o.value?{href:o.value,target:e.target,rel:e.target===`_blank`?`noopener noreferrer`:void 0}:{},{class:{"n-link n-transition hover:n-link-hover n-link-base":o.value||e.underline}}),{default:t(()=>[n(i.$slots,`default`),o.value&&e.target===`_blank`?(r(),l(`div`,x)):c(``,!0)]),_:3},16,[`class`])}}},C={class:`flex flex-col gap-4`},w={key:0,class:`op65 font-mono text-xs`},T={key:1,class:`op65`},E={class:`grid grid-cols-2 md:grid-cols-3 gap-3`},D={class:`op50 text-xs`},O={class:`font-mono`},k={class:`flex flex-col gap-1 font-mono text-xs`},A={key:0},j=h({__name:`index`,setup(n){let a=_(),h=s(()=>a.connection.status),v=s(()=>a.connection.state),x=s(()=>h.value===`closed`?{n:`red`,text:`Closed`}:h.value===`idle`?{n:`gray`,text:`Idle — no WebSocket yet`}:v.value?.isWebSocketConnected?{n:`green`,text:`Connected`}:{n:`orange`,text:`Disconnected`}),j=s(()=>{let e=a.info?.url;if(!e)return null;try{let t=new URL(e).hostname.split(`.`)[0];return t?`https://dashboard.convex.dev/d/${t}`:null}catch{return null}}),M=s(()=>{let e=v.value?.timeOfOldestInflightRequest;return e?`${Math.round((Date.now()-e)/1e3)}s ago`:`—`}),N=s(()=>[{label:`Ever connected`,value:v.value?String(v.value.hasEverConnected):`—`},{label:`Connections`,value:v.value?String(v.value.connectionCount):`—`},{label:`Connection retries`,value:v.value?String(v.value.connectionRetries):`—`},{label:`In-flight mutations`,value:v.value?String(v.value.inflightMutations):`—`},{label:`In-flight actions`,value:v.value?String(v.value.inflightActions):`—`},{label:`Oldest in-flight request`,value:M.value}]);return(n,s)=>{let h=y,_=g,v=S,M=b;return r(),l(`div`,C,[u(M,{class:`p4 flex items-center gap-3`},{default:t(()=>[u(h,{n:e(x).n},{default:t(()=>[d(o(e(x).text),1)]),_:1},8,[`n`]),e(a).info?.url?(r(),l(`span`,w,o(e(a).info.url),1)):(r(),l(`span`,T,`No deployment URL configured`)),e(j)?(r(),m(v,{key:2,href:e(j),target:`_blank`,class:`ml-auto flex items-center gap-1`},{default:t(()=>[u(_,{icon:`carbon-launch`}),s[0]||=d(` Convex dashboard `,-1)]),_:1},8,[`href`])):c(``,!0)]),_:1}),u(M,{class:`p4`},{default:t(()=>[p(`div`,E,[(r(!0),l(f,null,i(e(N),e=>(r(),l(`div`,{key:e.label},[p(`div`,D,o(e.label),1),p(`div`,O,o(e.value),1)]))),128))])]),_:1}),e(a).info?(r(),m(M,{key:0,class:`p4`},{default:t(()=>[s[1]||=p(`div`,{class:`op50 text-xs mb2`},` Module `,-1),p(`div`,k,[p(`div`,null,`functions dir: `+o(e(a).info.functionsDir)+`/`,1),e(a).info.siteUrl?(r(),l(`div`,A,` site url: `+o(e(a).info.siteUrl),1)):c(``,!0),p(`div`,null,` integrations: `+o(Object.entries(e(a).info.integrations).filter(([,e])=>e).map(([e])=>e).join(`, `)||`none`),1)])]),_:1})):c(``,!0)])}}});export{j as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,M as n,P as r,_t as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,u as f,v as p}from"./DNfpyBVU.js";import{a as m,n as h,s as g}from"#entry";import{t as _}from"./CZbAGcNC.js";var v={class:`flex flex-col gap-4`},y={key:0,class:`flex gap-2`},b={key:1,class:`op50`},x={class:`op50 text-xs font-mono`},S=p({__name:`auth`,setup(p){let S=h(),C=a(()=>{let e=S.info?.integrations;return e?[{name:`Better Auth`,enabled:e.betterAuth,observable:!0},{name:`Clerk`,enabled:e.clerk,observable:!1},{name:`Auth0`,enabled:e.auth0,observable:!1}].filter(e=>e.enabled):[]}),w=a(()=>S.auth.isLoading?{n:`gray`,text:`Loading`}:S.auth.isRefreshing?{n:`orange`,text:`Refreshing token`}:S.auth.isAuthenticated?{n:`green`,text:`Authenticated`}:{n:`gray`,text:`Unauthenticated`});return(a,p)=>{let h=g,T=_,E=m;return n(),s(`div`,v,[c(T,{class:`p4`},{default:t(()=>[p[0]||=d(`div`,{class:`op50 text-xs mb2`},` Auth adapters `,-1),e(C).length?(n(),s(`div`,y,[(n(!0),s(u,null,r(e(C),e=>(n(),f(h,{key:e.name,n:`blue`},{default:t(()=>[l(i(e.name),1)]),_:2},1024))),128))])):(n(),s(`span`,b,`No auth integration enabled.`))]),_:1}),e(S).auth.available?(n(),f(T,{key:0,class:`p4 flex items-center gap-3`},{default:t(()=>[c(h,{n:e(w).n},{default:t(()=>[l(i(e(w).text),1)]),_:1},8,[`n`]),d(`span`,x,` isLoading: `+i(e(S).auth.isLoading)+` · isAuthenticated: `+i(e(S).auth.isAuthenticated)+` · isRefreshing: `+i(e(S).auth.isRefreshing),1)]),_:1})):e(C).length?(n(),f(E,{key:1,n:`blue`,icon:`carbon-information`},{default:t(()=>[...p[1]||=[l(` Auth state isn't observable for this adapter yet — Clerk and Auth0 provide their state at component level, which the DevTools bridge can't reach. `,-1)]]),_:1})):o(``,!0)])}}});export{S as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,B as t,G as n,M as r,P as i,V as a,_t as o,c as s,f as c,g as l,ht as u,i as d,l as f,q as p,u as m,v as h}from"./DNfpyBVU.js";import{i as g,l as _,n as v}from"#entry";import{t as y}from"./DPWXUmcI.js";var b={class:`n-select-tabs flex flex-inline flex-wrap items-center border n-border-base rounded n-bg-base`},x=[`disabled`,`title`],S=[`disabled`,`value`,`title`],C={__name:`NSelectTabs`,props:{modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1,default:!1},options:{type:Array,required:!0}},emits:[],setup(t,{emit:s}){let l=y(t,`modelValue`,s,{passive:!0});return(s,p)=>(r(),c(`fieldset`,b,[(r(!0),c(d,null,i(t.options,(i,s)=>(r(),c(`label`,{key:i.label,disabled:t.disabled,class:u([`relative n-border-base px-0.5em py-0.1em hover:n-bg-active`,[s?`border-l n-border-base ml--1px`:``,i.value===e(l)?`n-bg-active`:``]]),title:i.label},[f(`div`,{class:u([i.value===e(l)?``:`op35`])},o(i.label),3),a(f(`input`,{"onUpdate:modelValue":p[0]||=e=>n(l)?l.value=e:null,type:`radio`,disabled:t.disabled,value:i.value,title:i.label,class:`absolute inset-0 op-0.1`},null,8,S),[[_,e(l)]])],10,x))),128))]))}},w={class:`flex flex-col gap-3 h-full`},T={key:1,class:`font-mono text-xs flex flex-col gap-1 of-auto`},E={class:`op40 shrink-0`},D={class:`uppercase op50 shrink-0 w-14`},O={class:`break-all`},k=h({__name:`logs`,setup(a){let h=v(),_=p(`all`),y=s(()=>_.value===`all`?h.logs:h.logs.filter(e=>e.level===_.value)),b={verbose:`op40`,log:``,warn:`text-orange`,error:`text-red`};return(a,s)=>{let p=C,v=g;return r(),c(`div`,w,[l(p,{modelValue:e(_),"onUpdate:modelValue":s[0]||=e=>n(_)?_.value=e:null,n:`xs`,options:[{label:`All (${e(h).logs.length})`,value:`all`},{label:`Verbose`,value:`verbose`},{label:`Log`,value:`log`},{label:`Warn`,value:`warn`},{label:`Error`,value:`error`}]},null,8,[`modelValue`,`options`]),e(y).length?(r(),c(`div`,T,[(r(!0),c(d,null,i(e(y),(e,t)=>(r(),c(`div`,{key:t,class:u([`flex gap-2`,b[e.level]])},[f(`span`,E,o(new Date(e.timestamp).toLocaleTimeString()),1),f(`span`,D,o(e.level),1),f(`span`,O,o(e.args.join(` `)),1)],2))),128))])):(r(),m(v,{key:0},{default:t(()=>[...s[1]||=[f(`span`,{class:`op50`},`No client log output yet.`,-1)]]),_:1}))])}}});export{k as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{$ as e,B as t,E as n,F as r,M as i,P as a,V as o,_t as s,c,d as l,f as u,g as d,h as f,ht as p,i as m,l as h,t as g,u as _,v,x as y}from"./DNfpyBVU.js";import{a as b,c as x,d as S,i as C,n as w,o as T,r as E,s as D,t as O,u as k}from"#entry";import{t as A}from"./DPWXUmcI.js";var j=v({name:`NButton`,props:{to:String,icon:String,border:{type:Boolean,default:!0},disabled:Boolean,type:{type:String,default:`button`}},setup(e,{attrs:t,slots:n}){return()=>y(e.to?T:`button`,{to:e.to,...t,...!e.to&&{type:e.type},...e.disabled?{disabled:!0}:{tabindex:0},class:[e.border?`n-button-base active:n-button-active focus-visible:n-focus-base hover:n-button-hover`:``,n.default?``:`n-icon-button`,`n-button n-transition n-disabled:n-disabled`].join(` `)},{default:()=>[r(n,`icon`,{},()=>e.icon?[y(x,{icon:e.icon,class:n.default?`n-button-icon`:``})]:[]),r(n,`default`)]})}}),M=E(),N=[`innerHTML`],P=[`textContent`],F={__name:`NCodeBlock`,props:{code:{type:String,required:!0},lang:{type:String,required:!1},lines:{type:Boolean,required:!1,default:!0},inline:{type:Boolean,required:!1},grammarContextCode:{type:String,required:!1},transformRendered:{type:Function,required:!1}},emits:[`loaded`],setup(e,{emit:t}){let r=e,o=t,l=c(()=>{let e=r.lang===`text`?{code:r.code,supported:!1}:M.value?.devtools.renderCodeHighlight(r.code,r.lang,{grammarContextCode:r.grammarContextCode})||{code:r.code,supported:!1};return e.supported&&r.transformRendered&&(e.code=r.transformRendered(e.code)),e.supported&&n(()=>o(`loaded`)),e}),d=c(()=>[`n-code-block shiki`,r.lines&&!r.inline?`n-code-block-lines`:``]);return(t,n)=>e.lang&&l.value.supported?(i(),u(`pre`,{key:0,class:p(d.value)},[h(`code`,{innerHTML:l.value.code},null,8,N)],2)):(i(),u(`pre`,{key:1,class:p(d.value)},[h(`code`,null,[(i(!0),u(m,null,a(e.code.split(`
|
|
2
|
+
`),(e,t)=>(i(),u(m,{key:t},[h(`span`,{class:`line`,textContent:s(e)},null,8,P),n[0]||=h(`br`,null,null,-1)],64))),128))])],2))}},I={flex:`~ gap-3`,"items-center":``},L={__name:`NIconTitle`,props:{icon:{type:String,required:!1},text:{type:String,required:!1}},setup(e){return(t,n)=>(i(),u(`div`,I,[e.icon?(i(),u(`div`,{key:0,class:p(e.icon)},null,2)):l(``,!0),r(t.$slots,`default`,{},()=>[h(`div`,null,s(e.text),1)])]))}},R=[`open`],z={"text-base":``},B={key:0,"text-sm":``,op50:``},V=g({__name:`NSectionBlock`,props:{icon:{type:String,required:!1},text:{type:String,required:!1},description:{type:String,required:!1},containerClass:{type:String,required:!1,default:``},headerClass:{type:String,required:!1},collapse:{type:Boolean,required:!1,default:!0},open:{type:Boolean,required:!1,default:!0},padding:{type:[Boolean,String],required:!1,default:!0}},setup(n){let a=A(n,`open`,void 0,{passive:!0});function c(e){a.value=e.target.open}return(g,v)=>{let y=x,b=L;return i(),u(m,null,[h(`details`,{open:e(a),onToggle:c},[h(`summary`,{class:p([`cursor-pointer select-none p4 hover:bg-active`,n.collapse?``:`pointer-events-none`])},[d(b,{icon:n.icon,text:n.text,"text-xl":``,transition:``,class:p([e(a)?`op100`:`op60`,n.headerClass])},{default:t(()=>[h(`div`,null,[h(`div`,z,[r(g.$slots,`text`,{},()=>[f(s(n.text),1)],!0)]),n.description||g.$slots.description?(i(),u(`div`,B,[r(g.$slots,`description`,{},()=>[f(s(n.description),1)],!0)])):l(``,!0)]),v[0]||=h(`div`,{class:`flex-auto`},null,-1),r(g.$slots,`actions`,{},void 0,!0),n.collapse?(i(),_(y,{key:0,icon:`carbon-chevron-down`,class:`chevron`,"cursor-pointer":``,"place-self-start":``,"text-base":``,op75:``,transition:``,"duration-500":``})):l(``,!0)]),_:3},8,[`icon`,`text`,`class`])],2),v._lazyshow1||e(a)?(v._lazyshow1=!0,i(),u(m,null,[o(h(`div`,{class:p([`flex flex-col flex-gap2 pb6 pt2`,typeof n.padding==`string`?n.padding:n.padding?`px4`:``])},[r(g.$slots,`details`,{},void 0,!0),h(`div`,{class:p([n.containerClass,`mt1`])},[r(g.$slots,`default`,{},void 0,!0)],2),r(g.$slots,`footer`,{},void 0,!0)],2),[[k,e(a)]])],64)):l(`v-show-if`,!0)],40,R),v[1]||=h(`div`,{class:`x-divider`},null,-1)],64)}}},[[`__scopeId`,`data-v-fe0e6edc`]]),H={class:`flex flex-col gap-2`},U={class:`font-mono text-xs op65`},W={class:`op50 text-xs whitespace-nowrap`},G={class:`flex flex-col gap-3 px4 pb4`},K={class:`font-mono text-xs bg-active rounded p2 flex flex-col gap-1`},q=v({__name:`queries`,setup(n){let r=w();function o(e){return e?new Date(e).toLocaleTimeString():`never`}function c(e){return JSON.stringify(e,null,2)??`undefined`}return(n,p)=>{let g=C,v=D,y=j,x=b,w=F,T=V;return i(),u(`div`,H,[e(r).queries.length?l(``,!0):(i(),_(g,{key:0},{default:t(()=>[...p[0]||=[h(`span`,{class:`op50`},`No active query subscriptions.`,-1)]]),_:1})),(i(!0),u(m,null,a(e(r).queries,r=>(i(),_(T,{key:r.token,text:r.udfPath,padding:!1,open:!1,icon:`carbon-data-share`},{description:t(()=>[h(`span`,U,s(JSON.stringify(r.args)),1)]),actions:t(()=>[r.paginated?(i(),_(v,{key:0,n:`blue`},{default:t(()=>[...p[1]||=[f(` paginated `,-1)]]),_:1})):l(``,!0),r.errorMessage?(i(),_(v,{key:1,n:`red`},{default:t(()=>[...p[2]||=[f(` error `,-1)]]),_:1})):l(``,!0),h(`span`,W,s(r.listenerCount)+` 👂 · `+s(r.updates)+` updates · `+s(o(r.lastUpdatedAt)),1),d(y,{n:`xs`,icon:`carbon-launch`,title:`Open source file in editor`,onClick:S(t=>(`openFunctionInEditor`in n?n.openFunctionInEditor:e(O))(r.udfPath),[`stop`])},{default:t(()=>[...p[3]||=[f(` source `,-1)]]),_:1},8,[`onClick`])]),default:t(()=>[h(`div`,G,[r.errorMessage?(i(),_(x,{key:0,n:`red`,icon:`carbon-warning`},{default:t(()=>[f(s(r.errorMessage),1)]),_:2},1024)):(i(),u(m,{key:1},[p[4]||=h(`div`,{class:`op50 text-xs`},` Result `,-1),d(w,{code:r.result===void 0?`// loading…`:c(r.result),lang:`json`,lines:!1,class:`max-h-80 of-auto`},null,8,[`code`])],64)),r.logs?.length?(i(),u(m,{key:2},[p[5]||=h(`div`,{class:`op50 text-xs`},` Server logs `,-1),h(`div`,K,[(i(!0),u(m,null,a(r.logs,(e,t)=>(i(),u(`div`,{key:t},s(e),1))),128))])],64)):l(``,!0)])]),_:2},1032,[`text`]))),128))])}}});export{q as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{F as e,M as t,f as n,t as r}from"./DNfpyBVU.js";var i={},a={class:`n-card n-card-base`};function o(r,i){return t(),n(`div`,a,[e(r.$slots,`default`)])}var s=Object.assign(r(i,[[`render`,o]]),{__name:`NCard`});export{s as t};
|