Skip to main content

Repository: widdershins

OpenApi / Swagger & AsyncApi definition to Slate / Shins compatible markdown



OpenApi / Swagger / AsyncAPI definition to Slate / Shins compatible markdown

Build Tested on Tested on Mermade OpenAPIs Known Vulnerabilities

Widdershins adverb:

  • In a direction contrary to the sun’s course;
  • anticlockwise;
  • helping you produce static documentation from your OpenApi 3.0 / Swagger 2.0 / AsyncAPI 1.x definition

Widdershins screenshot


As of v2.1.0 Widdershins expands the definition of OpenAPI body parameters / requestBodies (and AsyncAPI headers and payloads) by default. You can restore the old behaviour by using the --noschema option.

To install

  • Clone the git repository, or
  • npm install [-g] widdershins, or
  • yarn global add widdershins
node widdershins [options] {input-spec} [[-o] output markdown]

  -h, --help            Show help                                      [boolean]
  --version             Show version number                            [boolean]
  -y, --yaml            Load spec in yaml format, default json         [boolean]
  -c, --code            Turn generic code samples off                  [boolean]
  -d, --discovery       Include WebAPI discovery data       [boolean]
  -i, --includes        List of files to include, comma separated       [string]
  -l, --lang            Automatically generate list of languages for code
                        samples                                        [boolean]
  -n, --noschema        Do not expand schema definitions               [boolean]
  -o, --outfile         File to write output markdown to                [string]
  -r, --raw             Output raw schemas not example values          [boolean]
  -s, --search          Whether to enable search or not, default true
                                                       [boolean] [default: true]
  -t, --theme           Syntax-highlighter theme to use                 [string]
  -u, --user_templates  directory to load override templates from       [string]


var converter = require('widdershins');
var options = {}; // defaults shown
options.codeSamples = true;
//options.language_tabs = [];
//options.loadedFrom = sourceUrl;
//options.user_templates = './user_templates';
options.templateCallback = function(templateName,stage,data) { return data };
options.theme = 'darkula'; = true;
options.sample = true; // set false by --raw
options.schema = true; // set false by --noschema
options.discovery = false;
options.includes = [];
  // str contains the converted markdown

To only include a subset of the pre-defined language-tabs, or to rename their display-names, you can override the options.language_tabs:

options.language_tabs = [{ 'http': 'HTTP' }, { 'javascript': 'JavaScript' }, { 'javascript--nodejs': 'Node.JS' }, { 'python': 'Python' }, { 'ruby': 'Ruby' }];

The loadedFrom option is only needed where the OpenApi / Swagger definition does not specify a host, and (as per the OpenApi specification) the API endpoint is deemed to be based on the source URL the definition was loaded from.

Note that the list of included files is simply passed into the header of the markdown file, they are actually included by Slate or the alternative you use.

To see the list of highlight-js syntax highlighting themes, click here WebAPI discovery data is included if the discovery option above is set true. See the W3C WebAPI Discovery Community Group for more information.

Language tabs

Widdershins supports the x-code-samples vendor-extension to completely customise your documentation. Alternatively, you can edit the default code-samples in the templates sub-directory, or override them using the user_templates option to specify a directory containing your templates.

Widdershins supports the use of multiple language tabs with the same language (i.e. plain Javascript and Node.Js). To use this support you must be using Slate (or one of its ports compatible with) version 1.5.0 or higher. Shins versions track Slate version numbers.

Template parameters

Templates are compiled with doT.js.

Templates have access to a data object with a range of properties based on the document context.

If you specify an options.templateCallback function, it will be called before and after each template, with three parameters, the template name, the stage, ('pre' or 'post') and the current data object. You can mutate the data object in any way you see fit, as long as you return it. Content in the data.append property will be appended to the current output stream.


To run a test-suite:

node testRunner {path-to-APIs}

The test harness currently expects .yaml or .json files and has been tested against

Comparison between this and other OpenAPI / Swagger to Slate tools

Blog posting by the author of Widdershins.


Thanks to @latgeek for the logo.

Widdershins in the wild

Please feel free to add a link to your API documentation here.