hts/packages/nuxt/src/module.ts

82 lines
2.3 KiB
TypeScript

import { addServerHandler, createResolver, defineNuxtModule } from "@nuxt/kit";
import { defu } from "defu";
export interface ModuleOptions {
/** Whether to verify Authorization tokens automatically */
automaticVerification: boolean;
/**
* Prefix for the `Authorization` header (when auto-verifying Authorization tokens).
*
* @default {Bearer}
*
* This can be overridden at runtime with `NUXT_UNKEY_AUTH_PREFIX`.
*/
authPrefix: string;
/**
* Whether to auto-import a configured Unkey client which can access with `useUnkey`.
*
* @default {true}
*/
registerHelper: boolean;
/**
* Root token for your Unkey account.
*
* Used to configure the Unkey client accessed with `useUnkey`.
*
* This can be overridden at runtime with `NUXT_UNKEY_TOKEN`.
*/
token?: string;
}
export default defineNuxtModule<ModuleOptions>({
meta: {
name: "@aigxion/nuxt",
configKey: "aigxion",
},
defaults: {
authPrefix: "Bearer",
automaticVerification: true,
registerHelper: true,
},
setup(options, nuxt) {
const resolver = createResolver(import.meta.url);
nuxt.options.runtimeConfig.unkey = defu(nuxt.options.runtimeConfig.unkey as any, {
authPrefix: options.authPrefix,
token: options.token,
});
// Automatically verify all incoming requests with an Authorization header
if (options.automaticVerification) {
addServerHandler({
middleware: true,
handler: resolver.resolve("./runtime/server/middleware/unkey"),
});
}
// Inject automatically-configured Unkey helper
if (options.registerHelper) {
nuxt.hook("nitro:config", (config) => {
if (config.imports !== false) {
config.imports ||= {};
config.imports.presets ||= [];
config.imports.presets.push({
from: resolver.resolve("./runtime/server/utils/unkey"),
imports: ["useUnkey"],
});
}
config.typescript ||= {};
config.typescript.tsConfig = defu(config.typescript.tsConfig, {
include: [resolver.resolve("./runtime/server/types.d.ts")],
});
});
nuxt.hook("prepare:types", ({ references }) => {
references.push({
path: resolver.resolve("./runtime/server/types.d.ts"),
});
});
}
},
});