maz-ui
Version:
A standalone components library for Vue.Js 3 & Nuxt.Js 3
295 lines (289 loc) • 9.6 kB
JavaScript
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { defineNuxtModule, createResolver, addComponent, addPlugin, addImports } from '@nuxt/kit';
import { readdir } from 'node:fs/promises';
function isPlainObject(value) {
if (value === null || typeof value !== "object") {
return false;
}
const prototype = Object.getPrototypeOf(value);
if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {
return false;
}
if (Symbol.iterator in value) {
return false;
}
if (Symbol.toStringTag in value) {
return Object.prototype.toString.call(value) === "[object Module]";
}
return true;
}
function _defu(baseObject, defaults, namespace = ".", merger) {
if (!isPlainObject(defaults)) {
return _defu(baseObject, {}, namespace, merger);
}
const object = Object.assign({}, defaults);
for (const key in baseObject) {
if (key === "__proto__" || key === "constructor") {
continue;
}
const value = baseObject[key];
if (value === null || value === void 0) {
continue;
}
if (merger && merger(object, key, value, namespace)) {
continue;
}
if (Array.isArray(value) && Array.isArray(object[key])) {
object[key] = [...value, ...object[key]];
} else if (isPlainObject(value) && isPlainObject(object[key])) {
object[key] = _defu(
value,
object[key],
(namespace ? `${namespace}.` : "") + key.toString(),
merger
);
} else {
object[key] = value;
}
}
return object;
}
function createDefu(merger) {
return (...arguments_) => (
// eslint-disable-next-line unicorn/no-array-reduce
arguments_.reduce((p, c) => _defu(p, c, "", merger), {})
);
}
const defu = createDefu();
const _dirname$1 = fileURLToPath(new URL(".", import.meta.url));
const INPUT_COMPONENT_DIR = resolve(_dirname$1, "./../components");
async function getComponentList() {
try {
const fileList = await readdir(INPUT_COMPONENT_DIR, { withFileTypes: true });
return fileList.filter(
(dirent) => dirent.isFile() && dirent.name.startsWith("Maz") && !dirent.name.endsWith(".d.ts") && !dirent.name.endsWith(".css")
).map(({ name }) => ({
name: name.split(".")[0],
fullName: `${name}`,
path: `${INPUT_COMPONENT_DIR}/${name}`
}));
} catch (error) {
throw new Error(
`[get-component-list] \u{1F534} Error occurred while generating components entry file ${error}`
);
}
}
const _dirname = dirname(fileURLToPath(import.meta.url));
const defaults = {
defaultMazIconPath: "",
autoImportPrefix: "",
devtools: true,
injectAos: true,
injectComponents: true,
injectCss: true,
injectUseDialog: true,
injectUseIdleTimeout: true,
injectUseReadingTime: true,
injectUseWindowSize: true,
injectUseBreakpoints: true,
injectUseUserVisibility: true,
injectUseStringMatching: true,
injectUseTimer: true,
injectUseThemeHandler: true,
injectUseToast: true,
injectUseWait: true,
injectUseSwiper: true,
installVClickOutside: true,
installVFullscreenImg: true,
installVLazyImg: true,
installVTooltip: true,
installVZoomImg: true,
injectUseFormValidator: true,
injectUseLanguageDisplayNames: true
};
const module = defineNuxtModule({
meta: {
name: "maz-ui",
configKey: "mazUi",
compatibility: {
nuxt: ">=3.0.0"
}
},
defaults,
async setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url);
nuxt.options.build.transpile = ["maz-ui", ...nuxt.options.build.transpile];
const moduleOptions = defu(nuxt.options.runtimeConfig.public.mazUi, options);
nuxt.options.runtimeConfig.public.mazUi = moduleOptions;
if (moduleOptions.injectCss) {
const path = process.env.MAZ_UI_DEV === "true" ? "maz-ui/css/index.css" : "maz-ui/css/main.css";
nuxt.options.css = [path, ...nuxt.options.css];
}
if (moduleOptions.injectComponents) {
const componentList = await getComponentList();
for (const { name } of componentList) {
addComponent({
name,
filePath: process.env.MAZ_UI_DEV === "true" ? `maz-ui/components/${name}.vue` : `maz-ui/components/${name}.mjs`
});
}
}
if (moduleOptions.injectAos) {
addPlugin(resolve(_dirname, "./runtime/plugins/aos"));
addImports({
from: resolve(_dirname, "./runtime/composables/useAos"),
name: "useAos",
as: `use${moduleOptions.autoImportPrefix}Aos`
});
const injectAosCSS = typeof moduleOptions.injectAos === "object" && typeof moduleOptions.injectAos.injectCss === "boolean" ? moduleOptions.injectAos.injectCss : true;
if (typeof moduleOptions.injectAos === "object" && injectAosCSS && process.env.MAZ_UI_DEV === "true") {
nuxt.options.css = ["maz-ui/dist/css/aos.css", ...nuxt.options.css];
} else if (typeof moduleOptions.injectAos === "object" && injectAosCSS) {
nuxt.options.css = ["maz-ui/css/aos.css", ...nuxt.options.css];
}
}
if (moduleOptions.installVZoomImg) {
addPlugin(resolve(_dirname, "./runtime/plugins/v-zoom-img"));
}
if (moduleOptions.installVLazyImg) {
addPlugin(resolve(_dirname, "./runtime/plugins/v-lazy-img"));
}
if (moduleOptions.installVClickOutside) {
addPlugin(resolve(_dirname, "./runtime/plugins/v-click-outside"));
}
if (moduleOptions.installVFullscreenImg) {
addPlugin(resolve(_dirname, "./runtime/plugins/v-fullscreen-img"));
}
if (moduleOptions.installVTooltip) {
addPlugin(resolve(_dirname, "./runtime/plugins/v-tooltip"));
}
if (moduleOptions.injectUseToast) {
addPlugin(resolve(_dirname, "./runtime/plugins/toaster"));
addImports({
from: resolve(_dirname, "./runtime/composables/useToast"),
name: "useToast",
as: `use${moduleOptions.autoImportPrefix}Toast`
});
}
if (moduleOptions.injectUseDialog) {
addPlugin(resolve(_dirname, "./runtime/plugins/dialog"));
addImports({
from: resolve(_dirname, "./runtime/composables/useDialog"),
name: "useDialog",
as: `use${moduleOptions.autoImportPrefix}Dialog`
});
}
if (moduleOptions.injectUseWait) {
addPlugin(resolve(_dirname, "./runtime/plugins/wait"));
addImports({
from: resolve(_dirname, "./runtime/composables/useWait"),
name: "useWait",
as: `use${moduleOptions.autoImportPrefix}Wait`
});
}
if (moduleOptions.injectUseThemeHandler) {
addImports({
from: resolve(_dirname, "./runtime/composables/useThemeHandler"),
name: "useThemeHandler",
as: `use${moduleOptions.autoImportPrefix}ThemeHandler`
});
}
if (moduleOptions.injectUseIdleTimeout) {
addImports({
from: "maz-ui",
name: "useIdleTimeout",
as: `use${moduleOptions.autoImportPrefix}IdleTimeout`
});
}
if (moduleOptions.injectUseReadingTime) {
addImports({
from: "maz-ui",
name: "useReadingTime",
as: `use${moduleOptions.autoImportPrefix}ReadingTime`
});
}
if (moduleOptions.injectUseWindowSize) {
addImports({
from: "maz-ui",
name: "useWindowSize",
as: `use${moduleOptions.autoImportPrefix}WindowSize`
});
}
if (moduleOptions.injectUseBreakpoints) {
addImports({
from: "maz-ui",
name: "useBreakpoints",
as: "useBreakpoints"
});
}
if (moduleOptions.injectUseUserVisibility) {
addImports({
from: "maz-ui",
name: "useUserVisibility",
as: `use${moduleOptions.autoImportPrefix}UserVisibility`
});
}
if (moduleOptions.injectUseUserVisibility) {
addImports({
from: "maz-ui",
name: "useUserVisibility",
as: `use${moduleOptions.autoImportPrefix}UserVisibility`
});
}
if (moduleOptions.injectUseStringMatching) {
addImports({
from: "maz-ui",
name: "useStringMatching",
as: `use${moduleOptions.autoImportPrefix}StringMatching`
});
}
if (moduleOptions.injectUseTimer) {
addImports({
from: "maz-ui",
name: "useTimer",
as: `use${moduleOptions.autoImportPrefix}Timer`
});
}
if (moduleOptions.injectUseFormValidator) {
addImports({
from: "maz-ui",
name: "useFormValidator",
as: `use${moduleOptions.autoImportPrefix}FormValidator`
});
addImports({
from: "maz-ui",
name: "useFormField",
as: `use${moduleOptions.autoImportPrefix}FormField`
});
}
if (moduleOptions.injectUseLanguageDisplayNames) {
addImports({
from: "maz-ui",
name: "useLanguageDisplayNames",
as: `use${moduleOptions.autoImportPrefix}LanguageDisplayNames`
});
}
if (moduleOptions.defaultMazIconPath) {
addPlugin(resolve(_dirname, "./runtime/plugins/maz-icon-path"));
}
if (options.devtools) {
nuxt.hook("devtools:customTabs", (iframeTabs) => {
iframeTabs.push({
// unique identifier
name: "maz-ui",
// title to display in the tab
title: "maz-ui",
// any icon from Iconify, or a URL to an image
icon: "https://maz-ui.com/img/icons/android-chrome-512x512.png",
// iframe view
view: {
type: "iframe",
src: "https://maz-ui.com"
}
});
});
}
}
});
export { module as default };