@norbiros/nuxt-auto-form
Version:
Auto-generate Nuxt UI forms from Zod 4 schemas
72 lines (68 loc) • 2.12 kB
JavaScript
import { defineNuxtModule, createResolver, addTypeTemplate, addComponent, addComponentsDir } from '@nuxt/kit';
async function ensureDependencies() {
if (!await isPackageInstalled("zod")) {
console.error("nuxt-auto-form requires 'zod' package to be installed.");
return false;
}
const zodMajorVersion = await getPackageMajorVersion("zod");
if (zodMajorVersion && zodMajorVersion < 4) {
console.error('nuxt-auto-form requires "zod" version >= 4 and found', zodMajorVersion);
return false;
}
const hasNuxtUI = await isPackageInstalled("@nuxt/ui");
const hasNuxtUIPro = await isPackageInstalled("@nuxt/ui-pro");
if (!hasNuxtUI && !hasNuxtUIPro) {
console.error('nuxt-auto-form requires "@nuxt/ui" or "@nuxt/ui-pro" package to be installed.');
return false;
}
return true;
}
async function isPackageInstalled(packageName) {
try {
await import(packageName);
return true;
} catch {
return false;
}
}
async function getPackageMajorVersion(packageName) {
try {
const pkg = await import(`${packageName}/package.json`);
return Number.parseInt(pkg.version.split(".")[0]);
} catch {
return null;
}
}
const module = defineNuxtModule({
meta: {
name: "nuxt-auto-form",
configKey: "autoForm"
},
// Default configuration options of the Nuxt module
defaults: {},
async setup(options, nuxt) {
nuxt.options.runtimeConfig.public.autoForm = options;
if (!await ensureDependencies()) {
return;
}
const resolver = createResolver(import.meta.url);
addTypeTemplate({
filename: "runtime/types/nuxt-auto-form.d.ts",
src: resolver.resolve("runtime/types/index.d.ts")
});
addTypeTemplate({
filename: "runtime/types/nuxt-auto-form-zod.d.ts",
src: resolver.resolve("runtime/types/zod.d.ts")
});
addComponent({
name: "AutoForm",
filePath: resolver.resolve("runtime/components/AutoForm.vue")
});
addComponentsDir({
path: resolver.resolve("runtime/components/input/"),
prefix: "AInput",
pathPrefix: false
});
}
});
export { module as default };