From 27a143635ba28cd24ba439295ac44fece2469ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Fri, 1 Apr 2022 21:19:31 +0100 Subject: [PATCH 1/5] feat: Add ESM output --- package.json | 11 ++++++++++- tsconfig.json | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c3889950..9e68d045 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,13 @@ }, "main": "lib/index.js", "types": "lib/index.d.ts", + "module": "lib/esm/index.js", + "exports": { + ".": { + "require": "./lib/index.js", + "import": "./lib/esm/index.js" + } + }, "files": [ "lib/**/*" ], @@ -48,7 +55,9 @@ "format:es": "npm run lint:es -- --fix", "format:prettier": "npm run prettier -- --write", "prettier": "prettier '**/*.{ts,md,json,yml}'", - "build": "tsc && cp -r src/maps lib", + "build": "npm run build:cjs && npm run build:esm", + "build:cjs": "tsc && cp -r src/maps lib", + "build:esm": "tsc --module esnext --target es2019 --outDir lib/esm && cp -r src/maps lib/esm && echo '{\"type\":\"module\"}' > lib/esm/package.json", "build:docs": "typedoc --hideGenerator src/index.ts", "build:trie": "ts-node scripts/write-decode-map.ts", "build:encode-map": "jq -c 'to_entries | reverse | map( {(.value) : .key } ) | sort | add' maps/entities.json > src/maps/entities-encode.json", diff --git a/tsconfig.json b/tsconfig.json index 55c02961..62861a08 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ // "lib": [], /* Specify library files to be included in the compilation. */ "declaration": true /* Generates corresponding '.d.ts' file. */, "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, - // "sourceMap": true, /* Generates corresponding '.map' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, "outDir": "lib" /* Redirect output structure to the directory. */, // "importHelpers": true, /* Import emit helpers from 'tslib'. */ @@ -22,6 +22,7 @@ /* Module Resolution Options */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "moduleResolution": "node", "resolveJsonModule": true }, "include": ["src"], From 1e21e9326454b8bcc86f174ff24b7b564d717f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Fri, 1 Apr 2022 21:19:50 +0100 Subject: [PATCH 2/5] Add extensions to all imports --- .eslintrc.json | 1 + scripts/trie/encode-trie.spec.ts | 4 ++-- scripts/trie/encode-trie.ts | 2 +- scripts/trie/utils.ts | 6 +++--- scripts/write-decode-map.ts | 4 ++-- src/decode.spec.ts | 2 +- src/decode.ts | 6 +++--- src/encode.ts | 2 +- src/index.ts | 8 ++++---- 9 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 5ba83e79..3293f472 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,6 +23,7 @@ "curly": [2, "multi-line"], "no-else-return": 2, + "node/no-missing-import": 0, "node/no-unsupported-features/es-syntax": 0 }, "overrides": [ diff --git a/scripts/trie/encode-trie.spec.ts b/scripts/trie/encode-trie.spec.ts index 0a8250f1..c3185167 100644 --- a/scripts/trie/encode-trie.spec.ts +++ b/scripts/trie/encode-trie.spec.ts @@ -1,5 +1,5 @@ -import { encodeTrie } from "./encode-trie"; -import type { TrieNode } from "./trie"; +import { encodeTrie } from "./encode-trie.js"; +import type { TrieNode } from "./trie.js"; describe("encode_trie", () => { it("should encode an empty node", () => { diff --git a/scripts/trie/encode-trie.ts b/scripts/trie/encode-trie.ts index 7b690b4f..2ea88325 100644 --- a/scripts/trie/encode-trie.ts +++ b/scripts/trie/encode-trie.ts @@ -1,7 +1,7 @@ /* eslint-disable node/no-unsupported-features/es-builtins */ import * as assert from "assert"; -import { TrieNode } from "./trie"; +import { TrieNode } from "./trie.js"; function binaryLength(num: number) { return Math.ceil(Math.log2(num)); diff --git a/scripts/trie/utils.ts b/scripts/trie/utils.ts index 37a6f4ca..d679e8af 100644 --- a/scripts/trie/utils.ts +++ b/scripts/trie/utils.ts @@ -1,6 +1,6 @@ -import { getTrie, TrieNode } from "./trie"; -import { encodeTrie } from "./encode-trie"; -import { BinTrieFlags } from "../../src/decode"; +import { getTrie, TrieNode } from "./trie.js"; +import { encodeTrie } from "./encode-trie.js"; +import { BinTrieFlags } from "../../src/decode.js"; import xmlMap from "../../maps/xml.json"; /** diff --git a/scripts/write-decode-map.ts b/scripts/write-decode-map.ts index 08dbc408..75cdaa0a 100644 --- a/scripts/write-decode-map.ts +++ b/scripts/write-decode-map.ts @@ -3,8 +3,8 @@ import entityMap from "../maps/entities.json"; import legacyMap from "../maps/legacy.json"; import xmlMap from "../maps/xml.json"; -import { getTrie } from "./trie/trie"; -import { encodeTrie } from "./trie/encode-trie"; +import { getTrie } from "./trie/trie.js"; +import { encodeTrie } from "./trie/encode-trie.js"; function convertMapToBinaryTrie( name: string, diff --git a/src/decode.spec.ts b/src/decode.spec.ts index 04d99fe9..e0eaa729 100644 --- a/src/decode.spec.ts +++ b/src/decode.spec.ts @@ -1,4 +1,4 @@ -import * as entities from "./decode"; +import * as entities from "./decode.js"; describe("Decode test", () => { const testcases = [ diff --git a/src/decode.ts b/src/decode.ts index 3b6d3bbd..06ea6853 100644 --- a/src/decode.ts +++ b/src/decode.ts @@ -1,6 +1,6 @@ -import htmlDecodeTree from "./generated/decode-data-html"; -import xmlDecodeTree from "./generated/decode-data-xml"; -import decodeCodePoint from "./decode_codepoint"; +import htmlDecodeTree from "./generated/decode-data-html.js"; +import xmlDecodeTree from "./generated/decode-data-xml.js"; +import decodeCodePoint from "./decode_codepoint.js"; // Re-export for use by eg. htmlparser2 export { htmlDecodeTree, xmlDecodeTree }; diff --git a/src/encode.ts b/src/encode.ts index 66defd8d..c872a712 100644 --- a/src/encode.ts +++ b/src/encode.ts @@ -1,4 +1,4 @@ -import { encodeHTMLTrieRe, getCodePoint } from "./encode-trie"; +import { encodeHTMLTrieRe, getCodePoint } from "./encode-trie.js"; const htmlReplacer = /[\t\n!-,./:-@[-`\f{-}$\x80-\uFFFF]/g; const xmlReplacer = /["&'<>$\x80-\uFFFF]/g; diff --git a/src/index.ts b/src/index.ts index 1978c15e..16912ada 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { decodeXML, decodeHTML, decodeHTMLStrict } from "./decode"; +import { decodeXML, decodeHTML, decodeHTMLStrict } from "./decode.js"; import { encodeXML, escapeUTF8, @@ -6,7 +6,7 @@ import { encodeNonAsciiHTML, escapeAttribute, escapeText, -} from "./encode"; +} from "./encode.js"; /** The level of entities to support. */ export enum EntityLevel { @@ -174,7 +174,7 @@ export { // Legacy aliases (deprecated) encodeHTML as encodeHTML4, encodeHTML as encodeHTML5, -} from "./encode"; +} from "./encode.js"; export { decodeXML, @@ -186,4 +186,4 @@ export { decodeHTMLStrict as decodeHTML4Strict, decodeHTMLStrict as decodeHTML5Strict, decodeXML as decodeXMLStrict, -} from "./decode"; +} from "./decode.js"; From 39630365df8b6cf2fa35d94766ec06a224ba2e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:08:03 +0100 Subject: [PATCH 3/5] Fix up JSON import We need an import assertion. Also, updates the path so we don't duplicate the encode map. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e68d045..5072a553 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,8 @@ "prettier": "prettier '**/*.{ts,md,json,yml}'", "build": "npm run build:cjs && npm run build:esm", "build:cjs": "tsc && cp -r src/maps lib", - "build:esm": "tsc --module esnext --target es2019 --outDir lib/esm && cp -r src/maps lib/esm && echo '{\"type\":\"module\"}' > lib/esm/package.json", + "build:esm": "tsc --module esnext --target es2019 --outDir lib/esm && npm rum build:esm:fixup && echo '{\"type\":\"module\"}' > lib/esm/package.json", + "build:esm:fixup": "sed -i.b '1s|\".*json\"|\"../maps/entities-encode.json\" assert {type:\"json\"}|' lib/esm/encode-trie.js && rm lib/esm/encode-trie.js.b", "build:docs": "typedoc --hideGenerator src/index.ts", "build:trie": "ts-node scripts/write-decode-map.ts", "build:encode-map": "jq -c 'to_entries | reverse | map( {(.value) : .key } ) | sort | add' maps/entities.json > src/maps/entities-encode.json", From dd1ae760996015837be9723904681886f8fb3225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:10:37 +0100 Subject: [PATCH 4/5] Export `decode.js` Imported directly by htmlparser2. Added `decodeCodePoint` to the re-exported variables, as it is also used by htmlparser2. --- package.json | 4 ++++ src/decode.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5072a553..03f291fe 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,10 @@ ".": { "require": "./lib/index.js", "import": "./lib/esm/index.js" + }, + "./lib/decode.js": { + "require": "./lib/decode.js", + "import": "./lib/esm/decode.js" } }, "files": [ diff --git a/src/decode.ts b/src/decode.ts index 06ea6853..36e409d1 100644 --- a/src/decode.ts +++ b/src/decode.ts @@ -3,7 +3,7 @@ import xmlDecodeTree from "./generated/decode-data-xml.js"; import decodeCodePoint from "./decode_codepoint.js"; // Re-export for use by eg. htmlparser2 -export { htmlDecodeTree, xmlDecodeTree }; +export { htmlDecodeTree, xmlDecodeTree, decodeCodePoint }; const enum CharCodes { NUM = 35, // "#" From 5148345c38f2d9611f99817ab7d60259bdf072fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=B6hm?= <188768+fb55@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:14:19 +0100 Subject: [PATCH 5/5] Add a Jest `moduleNameMapper` --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 03f291fe..d2bec4a0 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,10 @@ "jest": { "preset": "ts-jest", "testEnvironment": "node", - "coverageProvider": "v8" + "coverageProvider": "v8", + "moduleNameMapper": { + "^(.*)\\.js$": "$1" + } }, "prettier": { "tabWidth": 4,