@nuxtjs/hanko
Version:
Hanko integration for Nuxt
100 lines (97 loc) • 3.17 kB
JavaScript
import { defineNuxtModule, createResolver, addPlugin, addServerHandler, addRouteMiddleware, addImportsSources, addTemplate } from '@nuxt/kit';
import { defu } from 'defu';
const module$1 = defineNuxtModule({
meta: {
name: "@nuxtjs/hanko",
configKey: "hanko"
},
defaults: {
apiURL: "",
registerComponents: true,
augmentContext: true,
cookieName: "hanko",
redirects: {
login: "/login",
home: "/",
success: "/",
followRedirect: true
}
},
setup(options, nuxt) {
const resolver = createResolver(import.meta.url);
const isCustomElement = nuxt.options.vue.compilerOptions.isCustomElement;
nuxt.options.vue.compilerOptions.isCustomElement = (tag) => tag.startsWith("hanko-") || isCustomElement?.(tag) || false;
nuxt.options.runtimeConfig.public = defu(nuxt.options.runtimeConfig.public, {
hanko: {
apiURL: options.apiURL,
cookieName: options.cookieName,
cookieSameSite: options.cookieSameSite || void 0,
cookieDomain: options.cookieDomain || void 0,
storageKey: options.storageKey || void 0,
components: options.components || {}
}
});
nuxt.options.appConfig = defu(nuxt.options.appConfig, {
hanko: {
redirects: options.redirects
}
});
if (options.registerComponents) {
if (nuxt.options.vue.runtimeCompiler) {
addPlugin(resolver.resolve("./runtime/plugins/custom-elements"));
}
addPlugin(resolver.resolve("./runtime/plugins/components.client"));
nuxt.hook("prepare:types", ({ references }) => {
references.push({
path: resolver.resolve("./runtime/components.d.ts")
});
});
}
if (options.augmentContext) {
addServerHandler({
middleware: true,
handler: resolver.resolve("./runtime/server/middleware/auth")
});
nuxt.hook("prepare:types", ({ references }) => {
references.push({
path: resolver.resolve("./runtime/auth.d.ts")
});
});
}
for (const name of ["logged-in", "logged-out"]) {
addRouteMiddleware({
name: `hanko-${name}`,
path: resolver.resolve(`./runtime/middleware/${name}`)
});
}
addImportsSources({
from: resolver.resolve("./runtime/composables/index"),
imports: ["useHanko"]
});
const hankoElementsTemplate = addTemplate({
filename: "hanko-elements.mjs",
getContents: () => `export const Hanko = () => null`
});
nuxt.hook("vite:extendConfig", (config, { isServer }) => {
if (isServer) {
config.resolve.alias = defu(config.resolve.alias, {
"@teamhanko/hanko-elements": hankoElementsTemplate.dst
});
}
});
nuxt.hook("nitro:config", (config) => {
config.externals = defu(config.externals, {
inline: [resolver.resolve("./runtime/server")]
});
config.imports = defu(config.imports, {
presets: [
{
from: resolver.resolve("./runtime/server/utils/index"),
imports: ["verifyHankoEvent"]
}
]
});
});
}
});
export { module$1 as default };