Skip to content
A workbench with tools, html, css, javascript, and Vue.js logo

Vue.js Types Generator

Generate Vue.js types for custom elements / web components

This package generates Vue-specific TypeScript declaration files for your Custom Elements so consuming Vue projects get inline documentation, autocomplete, and type-safe validation when using your components in templates.

Types are generated from a Custom Elements Manifest (CEM) and include documentation for:

  • Custom elements (types + docs)
  • Attributes & properties (types + docs)
  • Events (strongly typed when enabled)
  • Methods (docs)
  • Slots (docs)
  • CSS custom properties & states (docs)

Usage

Two primary ways to generate types:

  1. Programmatically, from a build script
  2. As a plugin for the Custom Elements Manifest Analyzer

Install

Terminal window
npm i -D @wc-toolkit/vuejs-types

Build pipeline

import { generateVuejsTypes, VuejsTypesOptions } from "@wc-toolkit/vuejs-types";
import manifest from "./path/to/custom-elements.json";
const options: VuejsTypesOptions = {
/* see Configuration Options below */
};
generateVuejsTypes(manifest, options);

Run the script as part of your build:

Terminal window
node scripts/generate-types.js

CEM Analyzer plugin

custom-elements-manifest.config.js
import { vuejsTypesPlugin } from "@wc-toolkit/vuejs-types";
export default {
plugins: [
vuejsTypesPlugin({
outdir: "./dist/types",
fileName: "custom-elements.vue.d.ts",
}),
],
};

Implementation / Integrating generated types

There are two common ways consumers can include the generated types in their Vue projects.

Option 1: tsconfig

Add the generated types to tsconfig.json so the compiler picks them up automatically:

{
"compilerOptions": {
"types": ["path/to/custom-elements.vue.d.ts"]
}
}

Option 2: Small module file

Create a tiny module under src/ to ensure the file is part of the TS program (recommended for libraries):

src/custom-elements.d.ts
import "../dist/types/custom-elements.vue.d.ts";
export {};

Vue compiler notes

  • For Vite + Vue, add compilerOptions.isCustomElement so the template compiler treats your custom tags as native custom elements.
  • Ensure the generated .d.ts is included in the consuming project’s TS program (tsconfig include or the module file approach above).

Configuration Options

The Vue generator accepts a VuejsTypesOptions object to customize output.

Common options

OptionTypeDefaultWhat it does
outdirstring"./"Output directory for the generated .d.ts.
fileNamestring"custom-element-vuejs.d.ts"Output file name.
excludestring[][]Exclude components by class name from the manifest.
tagFormatter(tag: string) => stringRewrite tag names before emitting GlobalComponents entries.
prefix / suffixstring""(Deprecated) Legacy tag rewriting; prefer tagFormatter.

Type source & imports

OptionTypeDefaultNotes
useCemTypesbooleanfalseUse types embedded in the CEM instead of ComponentClass["prop"]. Helpful for JS components + JSDoc.
typesSrcstring"type"Which CEM field to read when useCemTypes is on (e.g. "type" vs "parsedType").
componentTypePath(name, tag?, modulePath?) => stringOverride the import path used for component class types. Useful if your CEM module paths don’t match your published paths.
globalTypePathstringAdd a global type import reference used by generated types (advanced).
defaultExportbooleanfalseIf your component classes are default exports, set this so imports are generated correctly.

Template checking behavior

OptionTypeDefaultNotes
stronglyTypedEventsbooleanfalseImproves custom event typing (e.g. event targets, CustomEvent<detail> payloads).
allowUnknownPropsbooleanfalseLoosens template checking by allowing extra attributes/props on your custom elements.
excludeCssCustomPropertiesbooleanfalseSkip augmenting CSSProperties with CSS custom properties from the manifest.

Docs & troubleshooting

OptionTypeDefaultNotes
componentDescriptionOptionsComponentDescriptionOptionsControls how descriptions are rendered into JSDoc (used for hover docs).
debugbooleanfalseEmit contextual logs while generating.
skipbooleanfalseSkip generation (useful in CI toggles).
overrideCustomEventTypeboolean(Deprecated) Will be removed in a future major version.

See src/types.ts for the authoritative option definitions.

Example complete configuration

import { generateVuejsTypes } from "@wc-toolkit/vuejs-types";
import manifest from "./custom-elements.json";
generateVuejsTypes(manifest, {
fileName: "custom-elements.vue.d.ts",
outdir: "./dist/types",
stronglyTypedEvents: true,
useCemTypes: true,
tagFormatter: (tag) => tag.toLowerCase(),
});

Troubleshooting

  • No editor completions: confirm the consuming project’s TS program includes the generated .d.ts (module file or tsconfig types/include).
  • No hover docs on the tag: ensure your CEM includes a component description (it is emitted as JSDoc on the GlobalComponents entry).
  • Event names clobbered by native events: avoid reusing native DOM event names for custom events.