nuxt-mitter
Version:
Nuxt-Mitter - Nuxt module for mitt library
79 lines (75 loc) • 2.5 kB
JavaScript
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 };