Skip to content

Commit d3749d4

Browse files
authored
Merge pull request #14 from aem/flow
Add flow type checking
2 parents 18f6203 + 504a3ba commit d3749d4

9 files changed

+76
-15
lines changed

.babelrc

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
{
2-
"presets": ["es2015"]
2+
"presets": ["es2015"],
3+
"plugins": ["transform-flow-strip-types"]
34
}

.eslintrc

+24-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,29 @@
11
{
2+
"parser": "babel-eslint",
23
"extends": "airbnb-base",
34
"rules": {
45
"comma-dangle": 0,
5-
"max-len": 0
6-
}
6+
"max-len": 0,
7+
"flowtype/require-parameter-type": 1,
8+
"flowtype/require-return-type": [
9+
1,
10+
"always",
11+
{
12+
"annotateUndefined": "never"
13+
}
14+
],
15+
"flowtype/space-after-type-colon": [
16+
1,
17+
"always"
18+
],
19+
"flowtype/space-before-type-colon": [
20+
1,
21+
"never"
22+
],
23+
"flowtype/type-id-match": [
24+
1,
25+
"^([A-Z][a-z0-9]+)+Type$"
26+
]
27+
},
28+
"plugins": ["flowtype"]
729
}

.flowconfig

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[options]
2+
suppress_comment= \\(.\\|\n\\)*\\flow-ignore

.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
npm-debug.log
22
node_modules
3+
coverage

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ node_js:
44
script:
55
- npm run build
66
- npm run lint
7+
- npm run flow
78
- npm run test
89
- npm run codecov

package.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,22 @@
2323
"codecov": "istanbul cover ./node_modules/.bin/_mocha -- test --recursive --compilers js:babel-register && codecov",
2424
"prepublish": "npm run build",
2525
"test": "mocha --compilers js:babel-register test",
26-
"lint": "eslint --ext '.js' ./src"
26+
"lint": "eslint --ext '.js' ./src",
27+
"flow": "flow"
2728
},
2829
"devDependencies": {
2930
"babel-cli": "^6.9.0",
31+
"babel-eslint": "^6.1.0",
32+
"babel-plugin-transform-flow-strip-types": "^6.8.0",
3033
"babel-preset-es2015": "^6.6.0",
3134
"babel-register": "^6.9.0",
3235
"codecov": "^1.0.1",
3336
"eslint": "^2.11.1",
3437
"eslint-config-airbnb-base": "^3.0.1",
38+
"eslint-plugin-flowtype": "^2.3.0",
3539
"eslint-plugin-import": "^1.8.1",
3640
"expect": "^1.20.1",
41+
"flow-bin": "^0.28.0",
3742
"istanbul": "1.0.0-alpha.2",
3843
"jsdom": "^9.2.1",
3944
"mocha": "^2.4.5",

src/docsSoap.js

+33-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
1+
// @flow
2+
13
import { docsId, elements, styles } from './constants';
24
import parseHTML from './parseHTML';
35

4-
const wrapNodeAnchor = (node, href) => {
6+
const wrapNodeAnchor = (
7+
node: Node,
8+
href: string
9+
): HTMLAnchorElement => {
510
const anchor = document.createElement(elements.ANCHOR);
611
anchor.href = href;
712
anchor.appendChild(node.cloneNode(true));
813
return anchor;
914
};
1015

11-
const wrapNodeInline = (node, style) => {
16+
const wrapNodeInline = (
17+
node: Node,
18+
style: string
19+
): Node => {
1220
const el = document.createElement(style);
1321
el.appendChild(node.cloneNode(true));
1422
return el;
1523
};
1624

17-
const wrapNode = (inner, result) => {
25+
const wrapNode = (
26+
inner: Node,
27+
result: Node
28+
): Node => {
1829
let newNode = result.cloneNode(true);
1930
if (inner.style && inner.style.fontWeight === styles.BOLD) {
2031
newNode = wrapNodeInline(newNode, elements.BOLD);
@@ -37,26 +48,32 @@ const wrapNode = (inner, result) => {
3748
return newNode;
3849
};
3950

40-
const applyBlockStyles = dirty => {
51+
const applyBlockStyles = (
52+
dirty: Node
53+
): Node => {
4154
const node = dirty.cloneNode(true);
4255
let newNode = document.createTextNode(node.textContent);
43-
let styledNode = null;
56+
let styledNode = document.createTextNode('');
4457
if (node.childNodes[0] && node.childNodes[0].style) {
4558
styledNode = node.childNodes[0];
4659
}
4760
if (node.childNodes[0] && node.childNodes[0].nodeName === 'A') {
61+
// flow-ignore Flow doesn't recognize that a childNode can be an HTMLAnchorElement
4862
newNode = wrapNodeAnchor(newNode.cloneNode(true), node.childNodes[0].href);
4963
styledNode = node.childNodes[0].childNodes[0];
5064
}
5165
newNode = wrapNode(styledNode, newNode);
5266
return newNode;
5367
};
5468

55-
const applyInlineStyles = dirty => {
69+
const applyInlineStyles = (
70+
dirty: Node
71+
): Node => {
5672
const node = dirty.cloneNode(true);
5773
let newNode = document.createTextNode(node.textContent);
5874
let styledNode = node;
5975
if (node.nodeName === 'A') {
76+
// flow-ignore Flow doesn't recognize that cloneNode() can return an HTMLAnchorElement
6077
newNode = wrapNodeAnchor(newNode, node.href);
6178
if (node.childNodes[0] && node.childNodes[0].style) {
6279
styledNode = node.childNodes[0];
@@ -66,7 +83,9 @@ const applyInlineStyles = dirty => {
6683
return newNode;
6784
};
6885

69-
const getCleanNode = (node) => {
86+
const getCleanNode = (
87+
node: Node
88+
): Array<Node> => {
7089
if (node.childNodes && node.childNodes.length <= 1) {
7190
let newWrapper = null;
7291
let newNode = document.createTextNode(node.textContent);
@@ -94,7 +113,7 @@ const getCleanNode = (node) => {
94113
}
95114
return nodes;
96115
}
97-
return node;
116+
return [node];
98117
};
99118

100119
/**
@@ -103,7 +122,9 @@ const getCleanNode = (node) => {
103122
* @param dirty
104123
* @returns {HTMLElement}
105124
*/
106-
const getCleanDocument = (dirty) => {
125+
const getCleanDocument = (
126+
dirty: HTMLElement
127+
): HTMLElement => {
107128
// create a new document to preserve the integrity of the original data
108129
const body = document.createElement('body');
109130
const nodes = dirty.childNodes;
@@ -123,7 +144,9 @@ const getCleanDocument = (dirty) => {
123144
return body;
124145
};
125146

126-
module.exports = (clipboardContent) => {
147+
module.exports = (
148+
clipboardContent: string
149+
): string => {
127150
if (typeof clipboardContent !== 'string') {
128151
throw new Error(`Expected 'clipboardContent' to be a string of HTML, received ${typeof clipboardContent}`);
129152
}

src/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// @flow
2+
13
const docsSoap = require('./docsSoap');
24
const parseHTML = require('./parseHTML');
35

src/parseHTML.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
module.exports = function parseHTML(html) {
1+
// @flow
2+
3+
module.exports = (
4+
html: string
5+
): HTMLElement => {
26
let doc = void 0;
37
if (typeof DOMParser !== 'undefined') {
48
const parser = new DOMParser();

0 commit comments

Comments
 (0)