Web Types
Web Types is a JSON metadata format, which provides an easy way to contribute statically defined Poly Symbols. The JSON Web Types detailed schema can be accessed by following this link. The format is open source and IDE-agnostic by itself. However, currently it is being actively used mostly by JetBrains IDEs.
Originally, it was created to facilitate the contribution of statically defined symbols for the Vue framework, which may explain the presence of some deprecated properties in the schema.
A simple Web Types file looks as follows, where this file defines a my-element HTML element with a foo attribute:
File Structure
The Web Types file should, at least, contain name, version and contributions properties. It should also include $schema property which can be either https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json or http://json.schemastore.org/web-types. The schema contains detailed documentation for all the JSON entities.
Directly under contributions property are listed namespaces with their contributions. Currently only html, css or js namespaces are allowed. However, in the future this limitation will be lifted to support Web Types for other technologies.
The namespace object contains symbol kind names listed as properties. Some symbol kinds are predefined and directly supported by IDE (see Direct Support for reference). The kind of symbol should be related to its role. For instance, a Vue directive should be of the kind vue-directives. Each framework should define a set of custom symbol kinds if needed. Reference for the most important symbol kinds defined by frameworks supported by IDEs is below.
Each symbol kind name property of a namespace object is an array of symbol contributions. A symbol contribution should have at least a name. Contributions in addition to standard properties can define sub-contributions and custom properties. A custom property is a JSON property, whose value is of a simple type (string, number or boolean), or is an array of simple types. If a contribution’s JSON property’s value is an object value or an array of objects, it is treated as a list of sub-contributions. Such contributions will be assigned to the same namespace as the parent contributions. To use a different namespace for sub-contributions, nest symbol kind JSON property name under a js, css or html property, e.g.:
In the example below, Web Types contributes information that the my-element HTML element supports a custom CSS property --bg-color. The attributes are implicitly under the html namespace. To contribute a foo attribute, one could also write it in longer form:
Each Web Types contribution is represented in the Poly Symbols framework by a PsiSourcedPolySymbol object. All the Web Types contributions are mapped one-to-one, and custom properties are accessible through properties property.
Including Web Types
Web Types can currently be discovered by the IDE in the following ways:
- NPM
The IDE will automatically discover any Web Types shipped with the NPM library and specified in the
web-typesproperty ofpackage.json. The property accepts a string or an array of strings with relative paths to Web Types files shipped with the package.- Local Project
In your JavaScript projects in
package.jsonfiles, you can specifyweb-typesproperty similarly to the NPM package. The property accepts a string or an array of strings with relative paths to Web Types files within the project.- IDE Plugin
You can ship Web Types JSON with your IDE plugin. To point an IDE to its location, use
com.intellij.polySymbols.webTypesextension point and pass the file location insourceattribute value. WithenableByDefaultattribute, you can choose whether the Web Types file should be contributed to Poly Symbols scope by default, or only if an NPM package with the same name is present in the project.
Special Properties
inject-languageSupported by
html/elementsandhtml/attributes, allows to inject the specified language into HTML element text or HTML attribute value.doc-hide-patternIf a symbol uses a RegEx pattern, usually it will be displayed in a documentation popup section "pattern". Setting this property to
truehides that section.hide-from-completionBy default, all symbols show up in code completion. Setting this property to
trueprevents a symbol from showing up in the code completion.
Symbol Kinds
Web Types files are used internally by IDEs and tools to define rules for frameworks. Following is the reference for symbol kinds used by framework support.
Direct Support
IDEs provide direct support for the following symbol kinds:
html/elementshtml/attributescss/propertiescss/pseudo-classescss/pseudo-elementscss/functionscss/classescss/parts(since 2023.2)
Prior to 2023.1, IDEs were required to have JavaScript plugin installed for the support to work.
Angular
Angular plugin Web Types are available here for reference. Any Web Types file targeting only Angular support should have framework property set to angular. Highlights: js/ng-custom-events contribute symbols with patterns for any custom events supported by Angular EventManagers, e.g.:
Vue
Vue plugin Web Types are available here for reference. Any Web Types file targeting only Vue support should have framework property set to vue. Highlights:
/html/vue-componentsUse
/html/vue-componentsto contribute Vue components./html/vue-directivesUse
/html/vue-directivesto contribute Vue directives. Useattribute-valueproperty to specify the type of value expression. E.g.:{ "attribute-value": { "type": "boolean", "required": true } }/html/vue-file-top-elementsUse
/html/vue-file-top-elementsto contribute any custom top-level elements available in Vue Single Component File
A Vue /html/vue-components contribution supports:
/html/propsUse
/html/propsto contribute Vue component props, e.g:{ "props": [{ "name": "appear", "description": "Whether to apply transition on initial render.", "type": "boolean", "default": "false" }] }/html/slotsUse
/html/slotsto contribute Vue component slots. For scoped slots, usevue-propertiesto provide a list of scoped slot properties. Example:{ "slots": [{ "name": "img", "description": "Expects the [v-img](/components/images) component.", "doc-url": "https://vuetifyjs.com/en/api/v-app-bar/#slots", "vue-properties": [ { "name": "props", "type": "{ height: string, src: string | srcObject }" } ] }] }/js/eventsUse
/js/eventsto contribute Vue component events, e.g.:{ "js": { "events": [ { "name": "input", "description": "The updated bound model" } ] } }html/vue-modelUse
html/vue-modelto contribute settings for Vue model directive. E.g.:{ "vue-model": { "prop": "show", "event": "input" } }
A Vue /html/vue-directives contribution supports:
/html/argumentUse
/html/argumentas a Vue directive argument. E.g.:{ "argument": { "name": "attribute or property name", "description": "Optional attribute or property name", "pattern": { "items": [ { "path": "/html/attributes", "includeVirtual": false } ] } } }/html/modifiersUse
/html/modifiersas a Vue directive modifier. E.g.:{ "modifiers": [ { "name": "body", "description": "Make the mask append to the body element", "type": "boolean" }, { "name": "fullscreen", "type": "boolean" } ] }
Web Components
For Lit support, install it in your Node project as a devDependency @web-types/lit. Web Types are available here for reference.
Web Components should use:
/html/attributes: for attributes available in HTML/js/properties: for Web Component DOM class properties/js/events: for Web Component events
Example Web Component: