Skip to content

Commit

Permalink
feat: Mongoose Nitro Plugin Added
Browse files Browse the repository at this point in the history
  • Loading branch information
jahidanowar committed Jun 25, 2023
1 parent fbb239c commit d01d977
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 5 deletions.
4 changes: 3 additions & 1 deletion playground/nuxt.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
export default defineNuxtConfig({
modules: ["../src/module"],
nuxtServerUtils: {},
nuxtServerUtils: {
mongodbUri: process.env.MONGODB_URI,
},
devtools: { enabled: true },
});
5 changes: 2 additions & 3 deletions playground/server/api/index.get.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { allows } from "#nuxt-server-utils";
import { Authorizer } from "#nuxt-server-utils";
import { defineEventHandler } from "#imports";

export default defineEventHandler((event) => {
allows(event, () => false);

Authorizer.allows(event, () => true, "You are not allowed");
return `Gate passed`;
});
53 changes: 52 additions & 1 deletion src/module.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import { defineNuxtModule, createResolver, addTemplate } from "@nuxt/kit";
import {
defineNuxtModule,
createResolver,
addTemplate,
addServerPlugin,
} from "@nuxt/kit";
import { defu } from "defu";

const DOCUMENTATION_URL = "https://nuxt-server-utils.jahid.dev";

// Module options TypeScript interface definition
export interface ModuleOptions {
enabled: boolean;
mongodbUri?: string;
enableDevTools?: boolean;
}

export default defineNuxtModule<ModuleOptions>({
Expand All @@ -14,13 +23,21 @@ export default defineNuxtModule<ModuleOptions>({
// Default configuration options of the Nuxt module
defaults: {
enabled: true,
mongodbUri: process.env.MONGODB_URI || undefined,
enableDevTools: true,
},
setup(options, nuxt) {
if (!options.enabled) {
return;
}

const resolver = createResolver(import.meta.url);
const runtimeConfig = nuxt.options.runtimeConfig;

// Expose MongoDB URI to runtimeConfig
runtimeConfig.nuxtServerUtils = defu(runtimeConfig.nuxtServerUtils || {}, {
mongodbUri: options.mongodbUri,
});

// Add utils to nitro config
nuxt.hook("nitro:config", (nitroConfig) => {
Expand Down Expand Up @@ -62,9 +79,23 @@ export default defineNuxtModule<ModuleOptions>({
const deleteResourceHelper: typeof import("${resolver.resolve(
"./runtime/server/utils"
)}").deleteResourceHelper;
const Validator: typeof import("${resolver.resolve(
"./runtime/server/utils"
)}").Validator;
const Authorizer: typeof import("${resolver.resolve(
"./runtime/server/utils"
)}").Authorizer;
const ResourceHelper: typeof import("${resolver.resolve(
"./runtime/server/utils"
)}").ResourceHelper;
}`,
});

// Add virtual types to Nuxt types
nuxt.hook("prepare:types", (options) => {
options.references.push({
path: resolver.resolve(
Expand All @@ -73,5 +104,25 @@ export default defineNuxtModule<ModuleOptions>({
),
});
});

// Add server plugin
if (options.mongodbUri) {
addServerPlugin(resolver.resolve("./runtime/server/plugins/mongoose"));
}

// Add devtools
if (options.enableDevTools) {
nuxt.hook("devtools:customTabs", (iframeTabs) => {
iframeTabs.push({
name: "nuxr-server-utils",
title: "Nuxt Server Utils",
icon: "solar:settings-minimalistic-bold-duotone",
view: {
type: "iframe",
src: DOCUMENTATION_URL,
},
});
});
}
},
});
27 changes: 27 additions & 0 deletions src/runtime/server/plugins/mongoose.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import type { NitroApp } from "nitropack";
import mongoose from "mongoose";
import { logger } from "@nuxt/kit";
import { useRuntimeConfig } from "#imports";

type NitroAppPlugin = (nitro: NitroApp) => void;

function defineNitroPlugin(def: NitroAppPlugin): NitroAppPlugin {
return def;
}

export default defineNitroPlugin(async (app: NitroApp) => {
const config = useRuntimeConfig();

if (!config.nuxtServerUtils?.mongodbUri) {
logger.warn(
"Mongodb URI not found in runtime config, skipping mongodb connection"
);
return;
}
try {
await mongoose.connect(config.nuxtServerUtils.mongodbUri);
logger.info("Mongodb connected");
} catch (e) {
logger.error("Mongodb connection error: ", e);
}
});

0 comments on commit d01d977

Please sign in to comment.