UNPKG

nuxt-mitter

Version:

Nuxt-Mitter - Nuxt module for mitt library

79 lines (75 loc) 2.5 kB
import { fileURLToPath } from 'node:url'; import { existsSync, readFileSync } from 'node:fs'; import { useLogger, defineNuxtModule, createResolver, addTypeTemplate, addPlugin, addImportsDir } from '@nuxt/kit'; const moduleMessenger = (type, projectTypesPath) => { const logger = useLogger("nuxt-mitt", { formatOptions: { date: false, columns: 2 } }); switch (type) { case "start": logger.start(`Initializing nuxt-mitt module...`); break; case "success": logger.success(`event types used from: ${projectTypesPath}`); break; case "error": logger.error(`no such file found for event types under path: ${projectTypesPath}`); logger.warn(`Module is working but events not typed - not recommanded`); logger.info(`Please provide mittEvents.d.ts file like:`); logger.box(`export type MitterEvents = { //Your types foo: string bar?: number }`); break; } }; const module = defineNuxtModule({ meta: { name: "nuxt-mitt", configKey: "mitt" }, defaults: { types: "" }, setup(_options, _nuxt) { moduleMessenger("start"); const runtimeDir = fileURLToPath(new URL("./runtime", import.meta.url)); const { resolve } = createResolver(import.meta.url); const projectRootDir = _nuxt.options.rootDir; const projectTypesPath = _options.types; _nuxt.options.build.transpile.push(runtimeDir); _nuxt.options.alias["#mitter"] = runtimeDir; if (projectTypesPath && existsSync(resolve(projectRootDir, projectTypesPath))) { const customTypes = readFileSync(resolve(projectRootDir, projectTypesPath), "utf8"); const generatedTypesContent = ` ${customTypes} type WildCardEvent = { '*': string } export type NuxtMitterEvents = MitterEvents & WildCardEvent `; addTypeTemplate({ filename: "types/mitterEvents.d.ts", getContents: () => generatedTypesContent }); moduleMessenger("success", projectTypesPath); } else { addTypeTemplate({ filename: "types/mitterEvents.d.ts", src: resolve(runtimeDir, "templates/mitterEventsTemplate.d.ts") }); moduleMessenger("error", projectTypesPath); } addTypeTemplate({ filename: "types/mitt.d.ts", src: resolve(runtimeDir, "types.d.ts") }); addPlugin({ src: resolve("./runtime/mitterPlugin") }); addImportsDir(resolve(runtimeDir, "composables")); } }); export { module as default };