Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/oscarmarina/to-markdown


https://github.com/oscarmarina/to-markdown

Last synced: 11 days ago
JSON representation

Awesome Lists containing this project

README

        

# @blockquote/to-markdown

> [Individual NPM package from the following PR](https://github.com/open-wc/custom-elements-manifest/pull/221)

Custom-elements.json is a file format that describes custom elements. This format will allow tooling and IDEs to give rich information about the custom elements in a given project. It is, however, very experimental and things are subject to change. Follow the discussion [here](https://github.com/webcomponents/custom-elements-manifest).

This library takes a Custom Elements Manifest and renders it to markdown.

## Usage

Install:
```bash
npm i -S @blockquote/to-markdown
```

Import and use in your code:
```js
import fs from 'fs';
import { customElementsManifestToMarkdown } from '@blockquote/to-markdown';

const manifest = JSON.parse(fs.readFileSync('./custom-elements.json', 'utf-8'));
const markdown = customElementsManifestToMarkdown(manifest);

fs.writeFileSync('./custom-elements.md', markdown);
```

### Options

| Option | Type | Default | Description |
| ------------- | ---------------------------- | ------- | ----------- |
| headingOffset | Integer | 0 | Offset the heading level by this number |
| mainDescription | Boolean | true | Show description field for Class and Mixins |
| private | `'all'\|'details'\|'hidden'` | `'all'` | See [Private Members](#private-members) |
| omitDeclarations | `OptionalDeclarations[]` | [] | See [Omit Declarations](#omit-declarations) |
| omitSections | `OptionalSections[]` | [] | See [Omit Sections](#omit-sections) |
| classNameFilter | `string \| (() => string)` | `'.*'` | See [Class Name Filter](#class-name-filter) |

#### Private Members

The `private` option controls how private members appear in the markdown.
- `'all'`: private members appear alongside public members according to source order
- `'hidden'`: private members do not appear at all in markdown, but protected members do
- `'details'`: private and protected members appear in a details disclosure widget below the table

#### Omit Declarations

The `omitDeclarations` option is a `string[]` that controls which kinds of entities are rendered in the final markdown output. The four declaration types are:

- mixins
- variables
- functions
- exports

The following is an example config that would filter out all four declaration types:

```js
customElementsManifestToMarkdown(manifest, {
omitDeclarations: ['mixins', 'variables', 'functions', 'exports' ]
})
```
**Note: ** Mixins can be rendered both as declarations AND as sections inside a declaration. The `omitDeclarations` option for `mixins` will only filter out top level mixin declarations. To filter out mixin sections from a `class` declaration, use the `mixin` filter from `omitSections`.

#### Omit Sections

The `omitSections` option is a `string[]` that controls which sections of a declaration's full entry in the manifest.json should be rendered in the final markdown output. The section names are:

- mainHeading : "main-heading"
- mainDescription : "main-description"
- superClass : "super-class"
- fields : "fields"
- methods : "methods"
- staticFields : "static-fields"
- staticMethods : "static-methods"
- slots : "slots"
- events : "events"
- attributes : "attributes"
- cssProperties : "css-properties"
- cssParts : "css-parts"
- mixins : "main-heading"

The following is an example config showing how to filter out a few sections:

```js
customElementsManifestToMarkdown(manifest, {
// static fields and static methods tables will not be present
// in the markdown result
omitSections: [ 'super-class', 'static-methods', 'fields' ]
})
```

#### Class Name Filter
Depending on the source files you pass to the analyzer, your `custom-elements-manifest.json` may contain more class file declarations than you need for the final markdown output. The `classNameFilter` option accepts a regex as a string (or a function that returns one) that will be used to filter out class declarations before rendering.

```js
customElementsManifestToMarkdown(manifest, {
classNameFilter: () => {
// some logic
return `(${prefix}-*|SuperClassExact)`; // filters out every class name that doesnt match the regex provided
}
})
```

## Demo

```js
customElementsManifestToMarkdown(manifest, {
headingOffset: 1,
private: 'details',
})
```
Source

```json
{
"schemaVersion": "1.0.0",
"readme": "",
"modules": [
{
"kind": "javascript-module",
"path": "./fixtures/-TEST/package/my-element.js",
"declarations": [
{
"kind": "class",
"description": "My description",
"name": "SuperClass",
"events": [
{
"name": "custom-event",
"type": {
"text": "SuperCustomEvent"
},
"description": "this is custom"
}
],
"superclass": {
"name": "LitElement",
"package": "lit-element"
},
"members": [
{
"kind": "method",
"name": "superClassMethod",
"privacy": "public"
}
]
},
{
"kind": "class",
"name": "MyElement",
"cssProperties": [
{
"name": "--background-color",
"description": "Controls the color of bar"
}
],
"cssParts": [
{
"name": "bar",
"description": "Styles the color of bar"
}
],
"slots": [
{
"name": "container",
"description": "You can put some elements here"
}
],
"events": [
{
"name": "my-event",
"type": {
"text": "Event"
}
},
{
"name": "custom-event",
"type": {
"text": "SuperCustomEvent"
},
"description": "this is custom",
"inheritedFrom": {
"name": "SuperClass",
"module": "./fixtures/-TEST/package/my-element.js"
}
}
],
"mixins": [
{
"name": "LocalizeMixin",
"package": "lion"
},
{
"name": "Mixin",
"module": "./fixtures/-TEST/package/my-element.js"
}
],
"superclass": {
"name": "SuperClass",
"module": "./fixtures/-TEST/package/my-element.js"
},
"attributes": [
{
"name": "prop-1",
"fieldName": "prop1"
},
{
"name": "prop2",
"fieldName": "prop2"
}
],
"members": [
{
"kind": "field",
"name": "prop1",
"privacy": "public"
},
{
"kind": "field",
"name": "prop2",
"privacy": "public"
},
{
"kind": "field",
"name": "prop3",
"privacy": "public",
"type": {
"text": "boolean"
},
"default": "true"
},
{
"kind": "field",
"name": "foo",
"type": {
"text": "string"
},
"privacy": "private",
"description": "description goes here",
"default": "'bar'"
},
{
"kind": "method",
"name": "instanceMethod",
"privacy": "public",
"description": "Some description of the method here",
"return": {
"type": {
"text": ""
}
},
"parameters": [
{
"name": "e",
"type": {
"text": "Event"
}
},
{
"name": "a",
"type": {
"text": "string"
},
"description": "some description"
}
]
},
{
"kind": "field",
"name": "mixinProp",
"type": {
"text": "number"
},
"privacy": "protected",
"default": "1",
"inheritedFrom": {
"name": "Mixin",
"module": "./fixtures/-TEST/package/my-element.js"
}
},
{
"kind": "method",
"name": "superClassMethod",
"privacy": "public",
"inheritedFrom": {
"name": "SuperClass",
"module": "./fixtures/-TEST/package/my-element.js"
}
}
],
"tagName": "my-element"
},
{
"kind": "variable",
"name": "variableExport",
"description": "this is a var export",
"type": {
"text": "boolean"
}
},
{
"kind": "variable",
"name": "stringVariableExport",
"description": "this is a string var export",
"type": {
"text": "string"
}
},
{
"kind": "function",
"name": "functionExport",
"description": "This is a function export",
"return": {
"type": {
"text": "boolean"
}
},
"parameters": [
{
"name": "a",
"type": {
"text": "string"
}
},
{
"name": "b",
"type": {
"text": "boolean"
}
}
]
},
{
"kind": "mixin",
"name": "MyMixin4",
"parameters": [
{
"name": "klass",
"type": {
"text": "*"
},
"description": "This is the description"
},
{
"name": "foo",
"type": {
"text": "string"
},
"description": "Description goes here"
}
]
},
{
"kind": "mixin",
"name": "Mixin",
"parameters": [
{
"name": "klass",
"type": {
"text": "*"
},
"description": "This is the description"
}
],
"members": [
{
"kind": "field",
"name": "mixinProp",
"type": {
"text": "number"
},
"privacy": "protected",
"default": "1"
}
]
}
],
"exports": [
{
"kind": "js",
"name": "SuperClass",
"declaration": {
"name": "SuperClass",
"module": "./fixtures/-TEST/package/my-element.js"
}
},
{
"kind": "custom-element-definition",
"name": "my-element",
"declaration": {
"name": "MyElement",
"module": "./fixtures/-TEST/package/my-element.js"
}
},
{
"kind": "js",
"name": "variableExport",
"declaration": {
"name": "variableExport",
"module": "./fixtures/-TEST/package/my-element.js"
}
},
{
"kind": "js",
"name": "stringVariableExport",
"declaration": {
"name": "stringVariableExport",
"module": "./fixtures/-TEST/package/my-element.js"
}
},
{
"kind": "js",
"name": "functionExport",
"declaration": {
"name": "functionExport",
"module": "./fixtures/-TEST/package/my-element.js"
}
}
]
}
]
}
```

Result

My description

## `./fixtures/-TEST/package/my-element.js`:
### class: `SuperClass`

#### Superclass

| Name | Module | Package |
| ---------- | ------ | ----------- |
| LitElement | | lit-element |

#### Methods

| Name | Privacy | Description | Parameters | Return | Inherited From |
| ---------------- | ------- | ----------- | ---------- | ------ | -------------- |
| superClassMethod | public | | | | |

#### Events

| Name | Type | Description | Inherited From |
| ------------ | ------------------ | -------------- | -------------- |
| custom-event | `SuperCustomEvent` | this is custom | |


### class: `MyElement`, `my-element`

#### Superclass

| Name | Module | Package |
| ---------- | -------------------------------------- | ------- |
| SuperClass | ./fixtures/-TEST/package/my-element.js | |

#### Mixins

| Name | Module | Package |
| ------------- | -------------------------------------- | ------- |
| LocalizeMixin | | lion |
| Mixin | ./fixtures/-TEST/package/my-element.js | |

#### Fields

| Name | Privacy | Type | Default | Description | Inherited From |
| ----- | ------- | --------- | ------- | ----------- | -------------- |
| prop1 | public | | | | |
| prop2 | public | | | | |
| prop3 | public | `boolean` | `true` | | |

#### Methods

| Name | Privacy | Description | Parameters | Return | Inherited From |
| ---------------- | ------- | ----------------------------------- | --------------------- | ------ | -------------- |
| instanceMethod | public | Some description of the method here | `e: Event, a: string` | | |
| superClassMethod | public | | | | SuperClass |

#### Events

| Name | Type | Description | Inherited From |
| ------------ | ------------------ | -------------- | -------------- |
| my-event | `Event` | | |
| custom-event | `SuperCustomEvent` | this is custom | SuperClass |

#### Attributes

| Name | Field | Inherited From |
| ------ | ----- | -------------- |
| prop-1 | prop1 | |
| prop2 | prop2 | |

#### CSS Properties

| Name | Description |
| ------------------ | ------------------------- |
| --background-color | Controls the color of bar |

#### Slots

| Name | Description |
| --------- | ------------------------------ |
| container | You can put some elements here |

Private API

#### Fields

| Name | Privacy | Type | Default | Description | Inherited From |
| --------- | --------- | -------- | ------- | --------------------- | -------------- |
| foo | private | `string` | `'bar'` | description goes here | |
| mixinProp | protected | `number` | `1` | | Mixin |


### mixin: `MyMixin4`

#### Parameters

| Name | Type | Default | Description |
| ----- | -------- | ------- | ----------------------- |
| klass | `*` | | This is the description |
| foo | `string` | | Description goes here |


### mixin: `Mixin`

#### Parameters

| Name | Type | Default | Description |
| ----- | ---- | ------- | ----------------------- |
| klass | `*` | | This is the description |

Private API

#### Fields

| Name | Privacy | Type | Default | Description | Inherited From |
| --------- | --------- | -------- | ------- | ----------- | -------------- |
| mixinProp | protected | `number` | `1` | | |


### Variables

| Name | Description | Type |
| -------------------- | --------------------------- | --------- |
| variableExport | this is a var export | `boolean` |
| stringVariableExport | this is a string var export | `string` |


### Functions

| Name | Description | Parameters | Return |
| -------------- | ------------------------- | ----------------------- | --------- |
| functionExport | This is a function export | `a: string, b: boolean` | `boolean` |


### Exports

| Kind | Name | Declaration | Module | Package |
| ------------------------- | -------------------- | -------------------- | -------------------------------------- | ------- |
| js | SuperClass | SuperClass | ./fixtures/-TEST/package/my-element.js | |
| custom-element-definition | my-element | MyElement | ./fixtures/-TEST/package/my-element.js | |
| js | variableExport | variableExport | ./fixtures/-TEST/package/my-element.js | |
| js | stringVariableExport | stringVariableExport | ./fixtures/-TEST/package/my-element.js | |
| js | functionExport | functionExport | ./fixtures/-TEST/package/my-element.js | |