|
1 | 1 | import { existsSync } from 'node:fs' |
| 2 | +import type { NuxtModule } from 'nuxt/schema' |
2 | 3 | import { addComponentsDir, addImports, addPlugin, addServerHandler, addServerImports, addServerPlugin, createResolver, defineNuxtModule } from '@nuxt/kit' |
3 | 4 | import { createConsola } from 'consola' |
4 | 5 | import { join } from 'pathe' |
@@ -44,7 +45,7 @@ const activePrompts = { |
44 | 45 | schemaPrompt: undefined as any, |
45 | 46 | } |
46 | 47 |
|
47 | | -export default defineNuxtModule<ModuleOptions>({ |
| 48 | +const nuxtModule = defineNuxtModule<ModuleOptions>({ |
48 | 49 | meta: { |
49 | 50 | name: 'nuxt-edgedb-module', |
50 | 51 | configKey: 'edgeDb', |
@@ -84,11 +85,105 @@ export default defineNuxtModule<ModuleOptions>({ |
84 | 85 | nuxt.options.build.transpile ??= [] |
85 | 86 | nuxt.options.build.transpile.push('edgedb') |
86 | 87 |
|
87 | | - // Set user model if `auth` is set. |
88 | | - ;(nuxt.options.runtimeConfig as any).edgeDb ??= {} |
89 | | - ;(nuxt.options.runtimeConfig.app as any).edgeDb ??= { |
90 | | - auth: options.auth, |
91 | | - identityModel: options.identityModel, |
| 88 | + // Inject env credentials from `edgedb instance credentials` |
| 89 | + if (options.injectDbCredentials) { |
| 90 | + // http://localhost:10702/db/edgedb/ext/auth/ |
| 91 | + let dbCredentials: any | undefined |
| 92 | + try { |
| 93 | + dbCredentials = await execa.execaCommand(`edgedb instance credentials --json`, { cwd: resolveProject() }) |
| 94 | + } |
| 95 | + catch (e) { |
| 96 | + // Silently fail, the EdgeDB instance credentials command failed. |
| 97 | + } |
| 98 | + if (dbCredentials) { |
| 99 | + const { host, port, database, user, password, tls_ca, tls_security } = JSON.parse(dbCredentials.stdout) |
| 100 | + |
| 101 | + if (!process.env.NUXT_EDGEDB_HOST) |
| 102 | + process.env.NUXT_EDGEDB_HOST = host |
| 103 | + if (!process.env.NUXT_EDGEDB_PORT) |
| 104 | + process.env.NUXT_EDGEDB_PORT = port |
| 105 | + if (!process.env.NUXT_EDGEDB_DATABASE) |
| 106 | + process.env.NUXT_EDGEDB_DATABASE = database |
| 107 | + if (!process.env.NUXT_EDGEDB_USER) |
| 108 | + process.env.NUXT_EDGEDB_USER = user |
| 109 | + if (!process.env.NUXT_EDGEDB_PASS) |
| 110 | + process.env.NUXT_EDGEDB_PASS = password |
| 111 | + if (!process.env.NUXT_EDGEDB_TLS_CA) |
| 112 | + process.env.NUXT_EDGEDB_TLS_CA = tls_ca |
| 113 | + if (!process.env.NUXT_EDGEDB_TLS_SECURITY) |
| 114 | + process.env.NUXT_EDGEDB_TLS_SECURITY = tls_security |
| 115 | + if (!process.env.NUXT_EDGEDB_AUTH_BASE_URL) |
| 116 | + process.env.NUXT_EDGEDB_AUTH_BASE_URL = `http://${host}:${port}/db/${database}/ext/auth/` |
| 117 | + } |
| 118 | + } |
| 119 | + |
| 120 | + const envAppUrl = process.env.APP_URL || process.env.NUXT_EDGEDB_APP_URL |
| 121 | + |
| 122 | + // Create dev app url |
| 123 | + const devAppUrl = [ |
| 124 | + nuxt.options.devServer.https ? `https://` : `http://`, |
| 125 | + nuxt.options.devServer.host ? nuxt.options.devServer.host : 'localhost', |
| 126 | + nuxt.options.devServer.port ? `:${nuxt.options.devServer.port}` : '', |
| 127 | + ].join('') |
| 128 | + |
| 129 | + const appUrl = envAppUrl || devAppUrl |
| 130 | + |
| 131 | + const { |
| 132 | + // EdgeDB DSN settings |
| 133 | + NUXT_EDGEDB_HOST: host, |
| 134 | + NUXT_EDGEDB_PORT: port, |
| 135 | + NUXT_EDGEDB_USER: user, |
| 136 | + NUXT_EDGEDB_PASS: pass, |
| 137 | + NUXT_EDGEDB_DATABASE: database, |
| 138 | + NUXT_EDGEDB_TLS_CA: tlsCA, |
| 139 | + NUXT_EDGEDB_TLS_SECURITY: tlsSecurity, |
| 140 | + |
| 141 | + // EdgeDB Auth settings |
| 142 | + NUXT_EDGEDB_IDENTITY_MODEL: identityModel = options.identityModel || 'User', |
| 143 | + |
| 144 | + // EdgeDB Auth URls |
| 145 | + NUXT_EDGEDB_AUTH_BASE_URL: authBaseUrl = `http://${host}:${port}/db/${database}/ext/auth/`, |
| 146 | + NUXT_EDGEDB_OAUTH_CALLBACK: oAuthCallbackUrl = `http://${host}:${port}/db/${database}/ext/auth/callback`, |
| 147 | + |
| 148 | + // EdgeDB Nuxt Auth URLs |
| 149 | + NUXT_EDGEDB_AUTH_VERIFY_REDIRECT_URL: verifyRedirectUrl = `${appUrl}/auth/verify`, |
| 150 | + NUXT_EDGEDB_AUTH_RESET_PASSWORD_URL: resetPasswordUrl = `${appUrl}/auth/reset-password`, |
| 151 | + NUXT_EDGEDB_OAUTH_REDIRECT_URL: oAuthRedirectUrl = `${appUrl}/auth/callback`, |
| 152 | + } = process.env |
| 153 | + |
| 154 | + const dsn = { |
| 155 | + host, |
| 156 | + port, |
| 157 | + user, |
| 158 | + pass, |
| 159 | + database, |
| 160 | + tlsCA, |
| 161 | + tlsSecurity: tlsSecurity as 'insecure' | 'no_host_verification' | 'strict' | 'default' | undefined, |
| 162 | + full: `edgedb://${user}:${pass}@${host}:${port}/${database}`, |
| 163 | + } |
| 164 | + |
| 165 | + const urls = { |
| 166 | + // EdgeDB Nuxt Auth URLs |
| 167 | + appUrl: appUrl || devAppUrl, |
| 168 | + resetPasswordUrl, |
| 169 | + verifyRedirectUrl, |
| 170 | + oAuthRedirectUrl, |
| 171 | + |
| 172 | + // EdgeDB Auth URls |
| 173 | + authBaseUrl, |
| 174 | + oAuthCallbackUrl, |
| 175 | + } |
| 176 | + |
| 177 | + const auth = { |
| 178 | + enabled: options.auth, |
| 179 | + oauth: options.oauth, |
| 180 | + identityModel, |
| 181 | + } |
| 182 | + |
| 183 | + nuxt.options.runtimeConfig.edgeDb ??= { |
| 184 | + auth, |
| 185 | + dsn, |
| 186 | + urls, |
92 | 187 | } |
93 | 188 |
|
94 | 189 | async function piped$( |
@@ -543,28 +638,6 @@ export default defineNuxtModule<ModuleOptions>({ |
543 | 638 | } |
544 | 639 |
|
545 | 640 | if (options.auth) { |
546 | | - if (options.injectDbCredentials) { |
547 | | - // http://localhost:10702/db/edgedb/ext/auth/ |
548 | | - let dbCredentials: any | undefined |
549 | | - try { |
550 | | - dbCredentials = await execa.execaCommand(`edgedb instance credentials --json`, { cwd: resolveProject() }) |
551 | | - } |
552 | | - catch (e) { |
553 | | - // |
554 | | - } |
555 | | - if (dbCredentials) { |
556 | | - const { host, port, database, user, password, tls_ca, tls_security } = JSON.parse(dbCredentials.stdout) |
557 | | - process.env.NUXT_EDGEDB_HOST = host |
558 | | - process.env.NUXT_EDGEDB_PORT = port |
559 | | - process.env.NUXT_EDGEDB_DATABASE = database |
560 | | - process.env.NUXT_EDGEDB_USER = user |
561 | | - process.env.NUXT_EDGEDB_PASS = password |
562 | | - process.env.NUXT_EDGEDB_TLS_CA = tls_ca |
563 | | - process.env.NUXT_EDGEDB_TLS_SECURITY = tls_security |
564 | | - process.env.NUXT_EDGEDB_AUTH_BASE_URL = `http://${host}:${port}/db/${database}/ext/auth/` |
565 | | - } |
566 | | - } |
567 | | - |
568 | 641 | // Runtime |
569 | 642 | addPlugin({ |
570 | 643 | src: resolveLocal('./runtime/plugins/edgedb-auth'), |
@@ -661,3 +734,43 @@ function useLogger() { |
661 | 734 | }, |
662 | 735 | ) |
663 | 736 | } |
| 737 | + |
| 738 | +export default nuxtModule |
| 739 | + |
| 740 | +declare module 'nuxt/schema' { |
| 741 | + interface NuxtConfig { |
| 742 | + ['edgeDb']?: typeof nuxtModule extends NuxtModule<infer O> ? Partial<O> : Record<string, any> |
| 743 | + } |
| 744 | + |
| 745 | + interface RuntimeConfig { |
| 746 | + edgeDb: { |
| 747 | + auth: { |
| 748 | + enabled: boolean |
| 749 | + oauth: boolean |
| 750 | + identityModel: string |
| 751 | + } |
| 752 | + identityModel?: string |
| 753 | + urls: { |
| 754 | + appUrl?: string |
| 755 | + authBaseUrl?: string |
| 756 | + resetPasswordUrl?: string |
| 757 | + verifyRedirectUrl?: string |
| 758 | + oAuthCallbackUrl?: string |
| 759 | + oAuthRedirectUrl?: string |
| 760 | + } |
| 761 | + dsn: { |
| 762 | + host?: string |
| 763 | + port?: string |
| 764 | + user?: string |
| 765 | + pass?: string |
| 766 | + database?: string |
| 767 | + tlsCA?: string |
| 768 | + tlsSecurity?: 'insecure' | 'no_host_verification' | 'strict' | 'default' | undefined |
| 769 | + } |
| 770 | + } |
| 771 | + } |
| 772 | + |
| 773 | + interface PublicRuntimeConfig { |
| 774 | + |
| 775 | + } |
| 776 | +} |
0 commit comments