Skip to content

Add types #17

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 16, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@
],
"files": [
"lib",
"index.js"
"index.js",
"types/index.d.ts"
],
"types": "types/index.d.ts",
"dependencies": {
"ccount": "^1.0.0",
"comma-separated-tokens": "^1.0.1",
Expand All @@ -30,12 +32,14 @@
"html-void-elements": "^1.0.0",
"property-information": "^5.2.0",
"space-separated-tokens": "^1.0.0",
"stringify-entities": "^2.0.0",
"stringify-entities": "^3.0.0",
"unist-util-is": "^3.0.0",
"xtend": "^4.0.1"
},
"devDependencies": {
"@types/unist": "^2.0.3",
"browserify": "^16.0.0",
"dtslint": "^2.0.5",
"hastscript": "^5.0.0",
"nyc": "^14.0.0",
"prettier": "^1.0.0",
Expand All @@ -47,13 +51,14 @@
"xo": "^0.25.0"
},
"scripts": {
"format": "remark . -qfo && prettier --write \"**/*.js\" && xo --fix",
"format": "remark . -qfo && prettier --write \"**/*.{js,ts}\" && xo --fix",
"build-bundle": "browserify . -s hastUtilToHtml > hast-util-to-html.js",
"build-mangle": "browserify . -s hastUtilToHtml -p tinyify > hast-util-to-html.min.js",
"build": "npm run build-bundle && npm run build-mangle",
"test-api": "node test",
"test-coverage": "nyc --reporter lcov tape test/index.js",
"test": "npm run format && npm run build && npm run test-coverage"
"test-types": "dtslint types",
"test": "npm run format && npm run build && npm run test-coverage && npm run test-types"
},
"prettier": {
"tabWidth": 2,
Expand Down
141 changes: 141 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
// TypeScript Version: 3.0

import {Node} from 'unist'
import stringifyEntities = require('stringify-entities')

declare namespace hastUtilToHtml {
interface HastUtilToHtmlOptions {
/**
* Whether the *root* of the *tree* is in the `'html'` or `'svg'` space (enum, `'svg'` or `'html'`, default: `'html'`).
*
* If an `svg` element is found in the HTML space, `toHtml` automatically switches to the SVG space when entering the element, and switches back when exiting.
*/
space: 'html' | 'svg'

/**
* Configuration for `stringify-entities` (`Object`, default: `{}`).
* Do not use `escapeOnly`, `attribute`, or `subset` (`toHtml` already passes those, so they won’t work).
* However, `useNamedReferences`, `useShortestReferences`, and `omitOptionalSemicolons` are all fine.
*/
entities: Partial<stringifyEntities.StringifyEntitiesOptions>

/**
* Tag names of *elements* to stringify without closing tag(`Array.<string>`, default: `html-void-elements`).
*
* Not used in the SVG space.
*/
voids: string[]

/**
* Use an `<!DOCTYPE…` instead of `<!doctype…`.
* Useless except for XHTML (`boolean`, default: `false`).
*/
upperDoctype: boolean

/**
* Preferred quote to use (`'"'` or `'\''`, default: `'"'`).
*/
quote: string

/**
* Use the other quote if that results in less bytes (`boolean`, default: `false`).
*/
quoteSmart: boolean

/**
* Leave attributes unquoted if that results in less bytes (`boolean`, default: `false`).
*
* Not used in the SVG space.
*/
preferUnquoted: boolean

/**
* Omit optional opening and closing tags (`boolean`, default: `false`).
* For example, in `<ol><li>one</li><li>two</li></ol>`, both `</li>` closing tags can be omitted.
* The first because it’s followed by another `li`, the last because it’s followed by nothing.
*
* Not used in the SVG space.
*/
omitOptionalTags: boolean

/**
* Collapse empty attributes: `class=""` is stringified as `class` instead (`boolean`, default: `false`).
* **Note**: boolean attributes, such as `hidden`, are always collapsed.
*
* Not used in the SVG space.
*/
collapseEmptyAttributes: boolean

/**
* Close self-closing nodes with an extra slash (`/`): `<img />` instead of `<img>` (`boolean`, default: `false`).
* See `tightSelfClosing` to control whether a space is used before the slash.
*
* Not used in the SVG space.
*/
closeSelfClosing: boolean

/**
* Close SVG elements without any content with slash (`/`) on the opening tag instead of an end tag: `<circle />` instead of `<circle></circle>` (`boolean`, default: `false`).
* See `tightSelfClosing` to control whether a space is used before the slash.
*
* Not used in the HTML space.
*/
closeEmptyElements: boolean

/**
* Do not use an extra space when closing self-closing elements: `<img/>` instead of `<img />` (`boolean`, default: `false`).
* **Note**: Only used if `closeSelfClosing: true` or `closeEmptyElements: true`.
*/
tightSelfClosing: boolean

/**
* Join known comma-separated attribute values with just a comma (`,`), instead of padding them on the right as well (`,·`, where `·` represents a space) (`boolean`, default: `false`).
*/
tightCommaSeparatedLists: boolean

/**
* Join attributes together, without white-space, if possible: `class="a b" title="c d"` is stringified as `class="a b"title="c d"` instead to save bytes (`boolean`, default: `false`).
* **Note**: creates invalid (but working) markup.
*
* Not used in the SVG space.
*/
tightAttributes: boolean

/**
* Drop unneeded spaces in doctypes: `<!doctypehtml>` instead of `<!doctype html>` to save bytes (`boolean`, default: `false`).
* **Note**: creates invalid (but working) markup.
*/
tightDoctype: boolean

/**
* Do not encode characters which cause parse errors (even though they work), to save bytes (`boolean`, default: `false`).
* **Note**: creates invalid (but working) markup.
*
* Not used in the SVG space.
*/
allowParseErrors: boolean

/**
* Do not encode some characters which cause XSS vulnerabilities in older browsers (`boolean`, default: `false`).
* **Note**: Only set this if you completely trust the content.
*/
allowDangerousCharacters: boolean

/**
* Allow `raw` nodes and insert them as raw HTML.
* When falsey, encodes `raw` nodes (`boolean`, default: `false`).
* **Note**: Only set this if you completely trust the content.
*/
allowDangerousHTML: boolean
}
}

/**
* Stringify the given **hast** *tree*.
*/
declare function hastUtilToHtml(
tree: Node,
options?: Partial<hastUtilToHtml.HastUtilToHtmlOptions>
): string

export = hastUtilToHtml
71 changes: 71 additions & 0 deletions types/tests.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import toHtml = require('hast-util-to-html')
import {Node} from 'unist'

const node: Node = {
type: 'element',
tagName: 'div'
}

const result: string = toHtml(node)
toHtml(node, {
space: 'html'
})
toHtml(node, {
space: 'svg'
})
toHtml(node, {
space: 'svg'
})
toHtml(node, {
entities: {
escapeOnly: true
}
})
toHtml(node, {
voids: ['hr']
})
toHtml(node, {
upperDoctype: true
})
toHtml(node, {
quote: "'"
})
toHtml(node, {
quoteSmart: true
})
toHtml(node, {
preferUnquoted: true
})
toHtml(node, {
omitOptionalTags: true
})
toHtml(node, {
collapseEmptyAttributes: true
})
toHtml(node, {
closeSelfClosing: true
})
toHtml(node, {
closeEmptyElements: true
})
toHtml(node, {
tightSelfClosing: true
})
toHtml(node, {
tightCommaSeparatedLists: true
})
toHtml(node, {
tightAttributes: true
})
toHtml(node, {
tightDoctype: true
})
toHtml(node, {
allowParseErrors: true
})
toHtml(node, {
allowDangerousCharacters: true
})
toHtml(node, {
allowDangerousHTML: true
})
10 changes: 10 additions & 0 deletions types/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"compilerOptions": {
"lib": ["es2015"],
"strict": true,
"baseUrl": ".",
"paths": {
"hast-util-to-html": ["index.d.ts"]
}
}
}
7 changes: 7 additions & 0 deletions types/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "dtslint/dtslint.json",
"rules": {
"semicolon": false,
"whitespace": false
}
}