@vueless/nuxt
Version:
Nuxt Styleless UI Component Library, powered by Tailwind CSS.
77 lines (72 loc) • 2.47 kB
JavaScript
import { addTemplate, installModule, useNuxt, defineNuxtModule, createResolver, addPlugin, addComponent, addImportsDir } from '@nuxt/kit';
import { COMPONENTS } from 'vueless/constants.js';
import { Vueless } from 'vueless/plugin-vite.js';
import { createTailwindSafelist } from 'vueless/utils/node/tailwindSafelist.js';
import { getNuxtDirs } from 'vueless/utils/node/helper.js';
import { join } from 'pathe';
import { defu } from 'defu';
async function installTailwind(_nuxt = useNuxt()) {
await createTailwindSafelist({
targetFiles: getNuxtDirs()
});
const vuelessConfigFile = addTemplate({
filename: "vueless-tailwind.config.mjs",
write: true,
getContents: async () => `
import forms from "@tailwindcss/forms";
import { getSafelist, vuelessTailwindConfig } from "vueless/preset-tailwind";
export default {
plugins: [forms({ strategy: "base" })],
safelist: getSafelist(),
...vuelessTailwindConfig,
}
`
});
const configPaths = [vuelessConfigFile.dst, join(_nuxt.options.rootDir, "tailwind.config")];
const { configPath = [], ...twModuleConfig } = _nuxt.options.tailwindcss ?? {};
const userConfigPath = configPath;
if (typeof userConfigPath === "string") {
configPaths.push(userConfigPath);
} else {
configPaths.push(...userConfigPath);
}
await installModule("@nuxtjs/tailwindcss", defu({
exposeConfig: true,
configPath: configPaths
}, twModuleConfig));
}
const module = defineNuxtModule({
meta: {
name: "@vueless/nuxt",
configKey: "vueless",
compatibility: {
nuxt: ">=3.13.0"
}
},
defaults: {
mirrorCacheDir: "",
debug: false
},
async setup(_options, _nuxt) {
const { resolve } = createResolver(import.meta.url);
const { mirrorCacheDir, debug } = _options;
_nuxt.options.build.transpile.push("vueless", "tailwindcss");
_nuxt.hook("vite:extendConfig", (config) => {
config.plugins = config.plugins || [];
config.plugins.push(
Vueless({ mode: "nuxt-module", mirrorCacheDir, debug })
);
});
await installTailwind(_nuxt);
addPlugin(resolve("./runtime/plugin"));
for (const componentName in COMPONENTS) {
addComponent({
name: componentName,
filePath: `vueless/${COMPONENTS[componentName]}/${componentName}.vue`
});
}
addImportsDir("vueless/composables");
addImportsDir("vueless/utils");
}
});
export { module as default };