Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

web-component-analyzer

runem317.2kMIT2.0.0TypeScript support: included

CLI that analyzes web components

web components, web, components

readme

web-component-analyzer

Downloads per month NPM Version Dependencies Contributors

Web component analyzer GIF

web-component-analyzer is a CLI that makes it possible to easily analyze web components. It analyzes your code and jsdoc in order to extract properties, attributes, methods, events, slots, css shadow parts and css custom properties. Works with both javascript and typescript.

Try the online playground here

In addition to vanilla web components this tool supports web components built with the following libraries:

-----------------------------------------------------

➤ Installation

$ npm install -g web-component-analyzer

or

$ npx web-component-analyzer src

-----------------------------------------------------

➤ Usage

$ wca analyze
$ wca analyze src --format markdown
$ wca analyze "src/**/*.{js,ts}" --outDir components
$ wca analyze my-element.js --outFile custom-elements.json
$ wca analyze --outFiles {dir}/custom-element.json

The analyze command analyses an optional <input glob> and emits the output to the console as default. When the <input glob> is omitted it will find all components excluding node_modules. The default format is markdown.

Options

Option Type Description
--format <format> markdown | json | vscode Specify output format. Default is markdown.
--outDir <path> directory path Direct output to a directory where each file corresponds to a web component.
--outFile <path> file path Concatenate and emit output to a single file.
--outFiles <path> file path with pattern Emit output to multiple files using a pattern. Available substitutions:
{dir}: The directory of the component
{filename}: The filename (without ext) of the component
{tagname}: The element's tag name
--visibility <visibility> public | protected | private The mininmum member visibility to output. Default is public.
--features <features> member | method | cssproperty | csspart | event | slot Choose specific features to output. Multiple features are given seperated by a space. All features are enabled as default.
Example: --features member slot event
--dry boolean Don't write any files

-----------------------------------------------------

➤ Output Formats

json

wca analyze src --format json --outFile custom-elements.json

Try the online playground here

This json format is for experimental and demo purposes, and is still being actively discussed. You can expect changes to this format. Please follow and contribute to the discussion at:

markdown

wca analyze src --format markdown --outDir readme

Try the online playground here

Web Component Analyzer can output markdown documentation of your web components. This can either be output into a single file using --outFile or into multiple files using --outDir.

vscode

wca analyze src --format vscode --outFile vscode-html-custom-data.json

VSCode supports a JSON format called vscode custom data for the built in html editor which is set using html.customData vscode setting. Web Component Analyzer can output this format.

-----------------------------------------------------

-----------------------------------------------------

➤ How to document your components using JSDoc

In addition to analyzing the code of your components, this library also use JSDoc to construct the documentation. It's especially a good idea to use JSDoc for documenting slots, events, css custom properties and css shadow parts as these not analyzed statically by this tool as of now (except when constructing a CustomEvent within your component).

Here's an example including all supported JSDoc tags. All JSDoc tags are on the the form @tag {type} name - comment and @tag {type} [name=default] - comment.

/**
 * Here is a description of my web component.
 * 
 * @element my-element
 * 
 * @fires change - This jsdoc tag makes it possible to document events.
 * @fires submit
 * 
 * @attr {Boolean} disabled - This jsdoc tag documents an attribute.
 * @attr {on|off} switch - Here is an attribute with either the "on" or "off" value.
 * @attr [my-attr=default value]
 * 
 * @prop {String} myProp - You can use this jsdoc tag to document properties.
 * @prop value
 * 
 * @slot - This is an unnamed slot (the default slot)
 * @slot start - This is a slot named "start".
 * @slot end
 * 
 * @cssprop --main-bg-color - This jsdoc tag can be used to document css custom properties.
 * @cssprop [--main-color=red]

 * @csspart container 
 */
class MyElement extends HTMLElement {

 /**
  * This is a description of a property with an attribute with exactly the same name: "color".
  * @type {"red"|"green"|"blue"}
  * @attr
  */
  color = "red";

  /**
   * This is a description of a property with an attribute called "my-prop".
   * @type {number}
   * @deprecated
   * @attr my-prop
   */
  myProp = 10

  static get observedAttributes () {
    return [
      /**
       * The header text of this element
       */
      "header"
    ];
  }

}

Overview of supported JSDoc tags

JSDoc Tag Description
@element Gives your component a tag name. This JSDoc tag is useful if your 'customElements.define` is called dynamically eg. using a custom function.
@fires Documents events.
@slot Documents slots. Using an empty name here documents the unnamed (default) slot.
@attr or @attribute Documents an attribute on your component.
@prop or @property Documents a property on your component.
@cssprop or @cssproperty Documents a css custom property on your component.
@csspart Documents a css shadow part on your component.

-----------------------------------------------------

➤ How does this tool analyze my components?

This tool extract information about your components by looking at your code directly and by looking at your JSDoc comments.

Code: Web Component Analyzer supports multiple libraries. Click here for an overview of how each library is analyzed.

JSDoc: Read next section to learn more about how JSDoc is analyzed.

➤ API

You can also directly use the underlying functionality of this tool if you don't want to use the CLI. Web Component Analyzer analyzes Typescript source files, so you will have to include the Typescript parser. Here are some examples of how to use the API.

Analyze Typescript source file

import { analyzeSourceFile } from "web-component-analyzer";

const result = analyzeSourceFile(sourceFile, { checker });

Analyze text

import { analyzeText } from "web-component-analyzer";

const code = `class MyElement extends HTMLElement {

}

customElements.define("my-element", MyElement);
`;


const { results, program } = analyzeText(code);
// or
const { results, program } = analyzeText([
  { fileName: "file1.js", text: code },
  { fileName: "file2.js", text: "..." }, // these files can depend on each other
  { fileName: "file3.js", text: "...", analyze: false }
]);
// each result in "results" is the result of analyzing the corresponding text where "analyze" is not false

Transform the result

import { transformAnalyzerResult } from "web-component-analyzer";

const result = // the result of analyzing the component using one of the above functions

const format = "markdown"; // or "json"

const output = transformAnalyzerResult(format, result, program);

// "output" is now a string containing the result of the "markdown" transformer

-----------------------------------------------------

➤ Contributors

Rune Mehlsen
Rune Mehlsen

-----------------------------------------------------

➤ License

Licensed under MIT.

changelog

Change Log

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog

[2.0.0] - 2023-10-18

  • Drop support for TypeScript pre-4.8. Testing with versions: 4.8, 4.9, 5.0, 5.1, 5.2

[2.0.0-next.5] - 2023-06-12

  • Drop support for 3.x versions of TypeScript. Testing with versions: 4.0, 4.5, 4.8, and 5.0

[1.1.0] - 2020-07-12

Fixed

Added

  • JSDoc related utils are now exported from WCA (#171)
  • hasUpdated and updateComplete are now considered protected members for LitElement elements (https://github.com/runem/web-component-analyzer/pull/166)
  • Updated all dependencies.
  • It's now possible to traverse the entire inheritance tree using declaration.heritageClauses.
  • Added --inline-types CLI option that can be used to expand type aliases in order to inline types in the documentation (#140)

[1.0.2] - 2020-01-18

Fixed

  • Fixed various problems when analyzing globs using the CLI on Windows
  • Fixed problem where discovering global features would not detect all feature
  • Fixed problems with the analyzeHtmlElement function
  • Fixed problem with resolving the value of PrefixUnaryExpression nodes. (#132)

Added

  • The CLI now supports --silent flag that prevents it from outputting progress to the console
  • The CLI now supports --markdown.headerLevel flag that sets the starting header level for the markdown format

[1.0.0] - 2019-12-01

Added

  • Methods are now analyzed
  • @private, @protected, @public and @access jsdoc tags are now support (#106), (#126) (#105)
  • It's now possible to choose if private and/or protected members should be included in the output using --visibility protected CLI option (#112)
  • JSX typescript declaration files are now support (IntrinsicAttributes and IntrinsicElements) (#116)
  • Support for extending HTMLElement with members using Typescript declaration files
  • A list of used mixins for a given component is now included in the markdown output
  • Support for the @deprecated jsdoc tag (#103)
  • Support for specifying default css property values: @cssproperty {Color} [--my-color=red]
  • default is now included in the json format for attributes, properties and css custom properties
  • deprecated is now included in the json format for attributes, properties and events (#103)
  • The library ships with different module formats esm and cjs split in two modules api and cli. This makes it possible to use WCA in the browser (#118)
  • It's now possible to specify which featues should be analyzed
  • Emitted members now include metadata that flavors can add (eg. LitElement specific metadata)
  • Examples added using the @example jsdoc tag will be included in the markdown format.
  • Getter are now also analyzed, making it possible to emit readonly properties.
  • Support for the @readonly jsdoc tag
  • Support @param and @returns jsdoc tags
  • Support @ignore jsdoc tag
  • Add new flag to the CLI called --outFiles. This flag can take special values such as {dir}, {tagname} and {filename}. Read --help to learn more.
  • Add new flag to the CLI called --dry to test the analyzer without writing files.

Removed

  • It's no longer possible to emit diagnostics using the CLI
  • jsDoc has been removed from the json format

Fixed

  • Big internal refactor, including adding a lot of tests
  • Improved merging of component features (#101), (#124)
  • Improved performance by using caching and lazy evaluation where appropriate
  • Improved support for @type jsdoc (#67)
  • Improved jsdoc tag parsing. Default notation like @attr {string} [my-attr=123] is now supported
  • Using an object literal as default value no longer truncates to the first letter (#102)
  • Fixed problems with some default values (#130)