Skip to content

Commit 0d4b922

Browse files
nonaraRon S
authored and
Ron S
committed
feat!: Add esm named export support (closes #160 closes #139)
Added wrapper for esm over CJS module and removed nonworking separate ESM build (per advice from url below). Note: Essentially a breaking change as `exports` package.json property prevents direct import from files in dist see: https://redfin.engineering/node-modules-at-war-why-commonjs-and-es-modules-cant-get-along-9617135eeca1
1 parent 2b65583 commit 0d4b922

13 files changed

+101
-5
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
test/
22
dist/
33
node_modules/
4+
esm/

esm/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import nhp from '../dist/index.js'
2+
3+
export const CommentNode = nhp.CommentNode;
4+
export const HTMLElement = nhp.HTMLElement;
5+
export const parse = nhp.parse;
6+
export const valid = nhp.valid;
7+
export const Node = nhp.Node;
8+
export const TextNode = nhp.TextNode;
9+
export const NodeType = nhp.NodeType;
10+
11+
export default nhp;

esm/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"type": "module"
3+
}

package.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@
33
"version": "4.1.5",
44
"description": "A very fast HTML parser, generating a simplified DOM, with basic element query support.",
55
"main": "dist/index.js",
6-
"module": "dist/esm/index.js",
76
"types": "dist/index.d.ts",
87
"scripts": {
98
"test": "mocha",
109
"lint": "eslint ./src/*.ts ./src/**/*.ts",
1110
"clean": "del-cli ./dist/",
1211
"ts:cjs": "tsc -m commonjs",
1312
"ts:amd": "tsc -t es5 -m amd -d false --outFile ./dist/main.js",
14-
"ts:esm": "tsc -t es2019 -m esnext -d false --outDir ./dist/esm/",
15-
"build": "npm run lint && npm run clean && npm run ts:cjs && npm run ts:amd && npm run ts:esm",
13+
"build": "npm run lint && npm run clean && npm run ts:cjs && npm run ts:amd",
1614
"dev": "tsc -w & mocha -w ./test/*.js",
17-
"pretest": "tsc -m commonjs",
15+
"pretest": "tsc -m commonjs && cd test/assets && yarn install",
1816
"release": "yarn build && np",
1917
"prepare": "npm run build"
2018
},
@@ -60,6 +58,7 @@
6058
"should": "latest",
6159
"spec": "latest",
6260
"travis-cov": "latest",
61+
"ts-node": "^10.2.1",
6362
"typescript": "next"
6463
},
6564
"config": {
@@ -84,5 +83,9 @@
8483
"url": "https://github.com/taoqf/node-fast-html-parser/issues"
8584
},
8685
"homepage": "https://github.com/taoqf/node-fast-html-parser",
87-
"sideEffects": false
86+
"sideEffects": false,
87+
"exports": {
88+
"require": "./dist/index.js",
89+
"import": "./esm/index.js"
90+
}
8891
}

test/assets/cjs/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { parse } from 'node-html-parser'
2+
3+
const res = parse('<a href="#">parse succeeded</a>');
4+
console.log(res.firstChild.text);

test/assets/cjs/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "cjs-test",
3+
"private": true,
4+
"type": "commonjs",
5+
"peerDependencies": {
6+
"node-html-parser": "*"
7+
}
8+
}

test/assets/cjs/tsconfig.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"files": [ "index.ts" ],
3+
"extends": "../tsconfig.base.json",
4+
"compilerOptions": {
5+
"noEmit": true,
6+
"module": "CommonJS",
7+
"moduleResolution": "node"
8+
}
9+
}

test/assets/esm/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { parse } from 'node-html-parser'
2+
3+
const res = parse('<a href="#">parse succeeded</a>');
4+
console.log(res.firstChild.text);

test/assets/esm/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "esm-test",
3+
"private": true,
4+
"type": "module",
5+
"peerDependencies": {
6+
"node-html-parser": "*"
7+
}
8+
}

test/assets/esm/tsconfig.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"files": [ "index.ts" ],
3+
"extends": "../tsconfig.base.json",
4+
"compilerOptions": {
5+
"noEmit": true,
6+
"module": "ESNext",
7+
"moduleResolution": "node"
8+
}
9+
}

test/assets/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"private": true,
3+
"workspaces": [
4+
"assets/*"
5+
],
6+
"dependencies": {
7+
"node-html-parser": "link:../.."
8+
}
9+
}

test/assets/tsconfig.base.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"compilerOptions": {
3+
"skipDefaultLibCheck": true,
4+
"skipLibCheck": true,
5+
"noLib": true
6+
}
7+
}

test/import.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const { execSync } = require('child_process');
2+
const path = require('path');
3+
4+
describe(`Module Import`, function () {
5+
this.timeout(20000);
6+
7+
it(`ESM project can import and use named exports`, () => {
8+
execSync('node --loader ts-node/esm index.ts', {
9+
cwd: path.resolve(__dirname, 'assets/esm'),
10+
stdio: "pipe"
11+
}).toString().should.eql('parse succeeded\n')
12+
});
13+
14+
it(`CommonJS project can import and use named exports`, () => {
15+
execSync('node -r ts-node/register index.ts', {
16+
cwd: path.resolve(__dirname, 'assets/cjs'),
17+
stdio: "pipe"
18+
}).toString().should.eql('parse succeeded\n')
19+
});
20+
});

0 commit comments

Comments
 (0)