entities 6.0.1 → 7.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/decode.d.ts +2 -0
  2. package/dist/commonjs/decode-codepoint.d.ts.map +1 -1
  3. package/dist/commonjs/decode-codepoint.js +2 -2
  4. package/dist/commonjs/decode-codepoint.js.map +1 -1
  5. package/dist/commonjs/decode.d.ts +3 -7
  6. package/dist/commonjs/decode.d.ts.map +1 -1
  7. package/dist/commonjs/decode.js +105 -48
  8. package/dist/commonjs/decode.js.map +1 -1
  9. package/dist/commonjs/encode.d.ts.map +1 -1
  10. package/dist/commonjs/encode.js +49 -30
  11. package/dist/commonjs/encode.js.map +1 -1
  12. package/dist/commonjs/escape.d.ts +7 -4
  13. package/dist/commonjs/escape.d.ts.map +1 -1
  14. package/dist/commonjs/escape.js +36 -19
  15. package/dist/commonjs/escape.js.map +1 -1
  16. package/dist/commonjs/generated/decode-data-html.d.ts.map +1 -1
  17. package/dist/commonjs/generated/decode-data-html.js +2 -5
  18. package/dist/commonjs/generated/decode-data-html.js.map +1 -1
  19. package/dist/commonjs/generated/decode-data-xml.d.ts.map +1 -1
  20. package/dist/commonjs/generated/decode-data-xml.js +2 -5
  21. package/dist/commonjs/generated/decode-data-xml.js.map +1 -1
  22. package/dist/commonjs/generated/encode-html.d.ts +1 -6
  23. package/dist/commonjs/generated/encode-html.d.ts.map +1 -1
  24. package/dist/commonjs/generated/encode-html.js +9 -8
  25. package/dist/commonjs/generated/encode-html.js.map +1 -1
  26. package/dist/commonjs/index.d.ts +3 -3
  27. package/dist/commonjs/index.d.ts.map +1 -1
  28. package/dist/commonjs/index.js +19 -19
  29. package/dist/commonjs/index.js.map +1 -1
  30. package/dist/commonjs/internal/bin-trie-flags.d.ts +17 -0
  31. package/dist/commonjs/internal/bin-trie-flags.d.ts.map +1 -0
  32. package/dist/commonjs/internal/bin-trie-flags.js +21 -0
  33. package/dist/commonjs/internal/bin-trie-flags.js.map +1 -0
  34. package/dist/commonjs/internal/decode-shared.d.ts +2 -0
  35. package/dist/commonjs/internal/decode-shared.d.ts.map +1 -0
  36. package/dist/commonjs/internal/decode-shared.js +31 -0
  37. package/dist/commonjs/internal/decode-shared.js.map +1 -0
  38. package/dist/commonjs/internal/encode-shared.d.ts +32 -0
  39. package/dist/commonjs/internal/encode-shared.d.ts.map +1 -0
  40. package/dist/commonjs/internal/encode-shared.js +94 -0
  41. package/dist/commonjs/internal/encode-shared.js.map +1 -0
  42. package/dist/esm/decode-codepoint.d.ts.map +1 -1
  43. package/dist/esm/decode-codepoint.js +2 -2
  44. package/dist/esm/decode-codepoint.js.map +1 -1
  45. package/dist/esm/decode.d.ts +3 -7
  46. package/dist/esm/decode.d.ts.map +1 -1
  47. package/dist/esm/decode.js +96 -39
  48. package/dist/esm/decode.js.map +1 -1
  49. package/dist/esm/encode.d.ts.map +1 -1
  50. package/dist/esm/encode.js +49 -30
  51. package/dist/esm/encode.js.map +1 -1
  52. package/dist/esm/escape.d.ts +7 -4
  53. package/dist/esm/escape.d.ts.map +1 -1
  54. package/dist/esm/escape.js +35 -18
  55. package/dist/esm/escape.js.map +1 -1
  56. package/dist/esm/generated/decode-data-html.d.ts.map +1 -1
  57. package/dist/esm/generated/decode-data-html.js +2 -5
  58. package/dist/esm/generated/decode-data-html.js.map +1 -1
  59. package/dist/esm/generated/decode-data-xml.d.ts.map +1 -1
  60. package/dist/esm/generated/decode-data-xml.js +2 -5
  61. package/dist/esm/generated/decode-data-xml.js.map +1 -1
  62. package/dist/esm/generated/encode-html.d.ts +1 -6
  63. package/dist/esm/generated/encode-html.d.ts.map +1 -1
  64. package/dist/esm/generated/encode-html.js +9 -8
  65. package/dist/esm/generated/encode-html.js.map +1 -1
  66. package/dist/esm/index.d.ts +3 -3
  67. package/dist/esm/index.d.ts.map +1 -1
  68. package/dist/esm/index.js +9 -9
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/internal/bin-trie-flags.d.ts +17 -0
  71. package/dist/esm/internal/bin-trie-flags.d.ts.map +1 -0
  72. package/dist/esm/internal/bin-trie-flags.js +18 -0
  73. package/dist/esm/internal/bin-trie-flags.js.map +1 -0
  74. package/dist/esm/internal/decode-shared.d.ts +2 -0
  75. package/dist/esm/internal/decode-shared.d.ts.map +1 -0
  76. package/dist/esm/internal/decode-shared.js +28 -0
  77. package/dist/esm/internal/decode-shared.js.map +1 -0
  78. package/dist/esm/internal/encode-shared.d.ts +32 -0
  79. package/dist/esm/internal/encode-shared.d.ts.map +1 -0
  80. package/dist/esm/internal/encode-shared.js +91 -0
  81. package/dist/esm/internal/encode-shared.js.map +1 -0
  82. package/escape.d.ts +2 -0
  83. package/package.json +26 -24
  84. package/readme.md +32 -11
  85. package/src/decode-codepoint.ts +2 -2
  86. package/src/decode.ts +120 -55
  87. package/src/encode.ts +47 -31
  88. package/src/escape.ts +39 -26
  89. package/src/generated/decode-data-html.ts +3 -5
  90. package/src/generated/decode-data-xml.ts +3 -5
  91. package/src/generated/encode-html.ts +14 -14
  92. package/src/index.ts +23 -24
  93. package/src/internal/bin-trie-flags.ts +16 -0
  94. package/src/internal/decode-shared.ts +30 -0
  95. package/src/internal/encode-shared.ts +121 -0
  96. package/src/decode.spec.ts +0 -320
  97. package/src/encode.spec.ts +0 -78
  98. package/src/escape.spec.ts +0 -14
  99. package/src/index.spec.ts +0 -125
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Bit flags & masks for the binary trie encoding used for entity decoding.
3
+ *
4
+ * Bit layout (16 bits total):
5
+ * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)
6
+ * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').
7
+ * If valueLength==0: compact run flag.
8
+ * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)
9
+ * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char
10
+ */
11
+ export declare enum BinTrieFlags {
12
+ VALUE_LENGTH = 49152,
13
+ FLAG13 = 8192,
14
+ BRANCH_LENGTH = 8064,
15
+ JUMP_TABLE = 127
16
+ }
17
+ //# sourceMappingURL=bin-trie-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-trie-flags.d.ts","sourceRoot":"","sources":["../../../src/internal/bin-trie-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,oBAAY,YAAY;IACpB,YAAY,QAAwB;IACpC,MAAM,OAAwB;IAC9B,aAAa,OAAwB;IACrC,UAAU,MAAwB;CACrC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Bit flags & masks for the binary trie encoding used for entity decoding.
3
+ *
4
+ * Bit layout (16 bits total):
5
+ * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)
6
+ * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').
7
+ * If valueLength==0: compact run flag.
8
+ * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)
9
+ * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char
10
+ */
11
+ export var BinTrieFlags;
12
+ (function (BinTrieFlags) {
13
+ BinTrieFlags[BinTrieFlags["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH";
14
+ BinTrieFlags[BinTrieFlags["FLAG13"] = 8192] = "FLAG13";
15
+ BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 8064] = "BRANCH_LENGTH";
16
+ BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE";
17
+ })(BinTrieFlags || (BinTrieFlags = {}));
18
+ //# sourceMappingURL=bin-trie-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin-trie-flags.js","sourceRoot":"","sources":["../../../src/internal/bin-trie-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACpB,mEAAoC,CAAA;IACpC,sDAA8B,CAAA;IAC9B,oEAAqC,CAAA;IACrC,6DAAkC,CAAA;AACtC,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB"}
@@ -0,0 +1,2 @@
1
+ export declare function decodeBase64(input: string): Uint16Array;
2
+ //# sourceMappingURL=decode-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-shared.d.ts","sourceRoot":"","sources":["../../../src/internal/decode-shared.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAyBvD"}
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Shared base64 decode helper for generated decode data.
3
+ * Assumes global atob is available.
4
+ */
5
+ export function decodeBase64(input) {
6
+ const binary =
7
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
8
+ typeof atob === "function"
9
+ ? // Browser (and Node >=16)
10
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
11
+ atob(input)
12
+ : // Older Node versions (<16)
13
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
14
+ typeof Buffer.from === "function"
15
+ ? // eslint-disable-next-line n/no-unsupported-features/node-builtins
16
+ Buffer.from(input, "base64").toString("binary")
17
+ : // eslint-disable-next-line unicorn/no-new-buffer, n/no-deprecated-api
18
+ new Buffer(input, "base64").toString("binary");
19
+ const evenLength = binary.length & ~1; // Round down to even length
20
+ const out = new Uint16Array(evenLength / 2);
21
+ for (let index = 0, outIndex = 0; index < evenLength; index += 2) {
22
+ const lo = binary.charCodeAt(index);
23
+ const hi = binary.charCodeAt(index + 1);
24
+ out[outIndex++] = lo | (hi << 8);
25
+ }
26
+ return out;
27
+ }
28
+ //# sourceMappingURL=decode-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-shared.js","sourceRoot":"","sources":["../../../src/internal/decode-shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,MAAM,MAAM;IACR,mEAAmE;IACnE,OAAO,IAAI,KAAK,UAAU;QACtB,CAAC,CAAC,0BAA0B;YAC1B,mEAAmE;YACnE,IAAI,CAAC,KAAK,CAAC;QACb,CAAC,CAAC,4BAA4B;YAC5B,mEAAmE;YACnE,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;gBACjC,CAAC,CAAC,mEAAmE;oBACnE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACjD,CAAC,CAAC,sEAAsE;oBACtE,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,4BAA4B;IACnE,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAE5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A node inside the encoding trie used by `encode.ts`.
3
+ *
4
+ * There are two physical shapes to minimize allocations and lookup cost:
5
+ *
6
+ * 1. Leaf node (string)
7
+ * - A plain string (already in the form `"&name;"`).
8
+ * - Represents a terminal match with no children.
9
+ *
10
+ * 2. Branch / value node (object)
11
+ */
12
+ export type EncodeTrieNode = string | {
13
+ /**
14
+ * Entity value for the current code point sequence (wrapped: `&...;`).
15
+ * Present when the path to this node itself is a valid named entity.
16
+ */
17
+ value: string | undefined;
18
+ /** If a number, the next code unit of the only next character. */
19
+ next: number | Map<number, EncodeTrieNode>;
20
+ /** If next is a number, `nextValue` contains the entity value. */
21
+ nextValue?: string;
22
+ };
23
+ /**
24
+ * Parse a compact encode trie string into a Map structure used for encoding.
25
+ *
26
+ * Format per entry (ascending code points using delta encoding):
27
+ * <diffBase36>[&name;][{<children>}] -- diff omitted when 0
28
+ * Where diff = currentKey - previousKey - 1 (first entry stores absolute key).
29
+ * `&name;` is the entity value (already wrapped); a following `{` denotes children.
30
+ */
31
+ export declare function parseEncodeTrie(serialized: string): Map<number, EncodeTrieNode>;
32
+ //# sourceMappingURL=encode-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode-shared.d.ts","sourceRoot":"","sources":["../../../src/internal/encode-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GACpB,MAAM,GACN;IACI;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,kEAAkE;IAClE,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC3C,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAER;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,GACnB,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAqF7B"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Parse a compact encode trie string into a Map structure used for encoding.
3
+ *
4
+ * Format per entry (ascending code points using delta encoding):
5
+ * <diffBase36>[&name;][{<children>}] -- diff omitted when 0
6
+ * Where diff = currentKey - previousKey - 1 (first entry stores absolute key).
7
+ * `&name;` is the entity value (already wrapped); a following `{` denotes children.
8
+ */
9
+ export function parseEncodeTrie(serialized) {
10
+ const top = new Map();
11
+ const totalLength = serialized.length;
12
+ let cursor = 0;
13
+ let lastTopKey = -1;
14
+ function readDiff() {
15
+ const start = cursor;
16
+ while (cursor < totalLength) {
17
+ const char = serialized.charAt(cursor);
18
+ if ((char < "0" || char > "9") && (char < "a" || char > "z")) {
19
+ break;
20
+ }
21
+ cursor++;
22
+ }
23
+ if (cursor === start)
24
+ return 0;
25
+ return Number.parseInt(serialized.slice(start, cursor), 36);
26
+ }
27
+ function readEntity() {
28
+ if (serialized[cursor] !== "&") {
29
+ throw new Error(`Child entry missing value near index ${cursor}`);
30
+ }
31
+ // Cursor currently points at '&'
32
+ const start = cursor;
33
+ const end = serialized.indexOf(";", cursor + 1);
34
+ if (end === -1) {
35
+ throw new Error(`Unterminated entity starting at index ${start}`);
36
+ }
37
+ cursor = end + 1; // Move past ';'
38
+ return serialized.slice(start, cursor); // Includes & ... ;
39
+ }
40
+ while (cursor < totalLength) {
41
+ const keyDiff = readDiff();
42
+ const key = lastTopKey === -1 ? keyDiff : lastTopKey + keyDiff + 1;
43
+ let value;
44
+ if (serialized[cursor] === "&")
45
+ value = readEntity();
46
+ if (serialized[cursor] === "{") {
47
+ cursor++; // Skip '{'
48
+ // Parse first child
49
+ let diff = readDiff();
50
+ let childKey = diff; // First key (lastChildKey = -1)
51
+ const firstValue = readEntity();
52
+ if (serialized[cursor] === "{") {
53
+ throw new Error("Unexpected nested '{' beyond depth 2");
54
+ }
55
+ // If end of block -> single child optimization
56
+ if (serialized[cursor] === "}") {
57
+ top.set(key, { value, next: childKey, nextValue: firstValue });
58
+ cursor++; // Skip '}'
59
+ }
60
+ else {
61
+ const childMap = new Map();
62
+ childMap.set(childKey, firstValue);
63
+ let lastChildKey = childKey;
64
+ while (cursor < totalLength && serialized[cursor] !== "}") {
65
+ diff = readDiff();
66
+ childKey = lastChildKey + diff + 1;
67
+ const childValue = readEntity();
68
+ if (serialized[cursor] === "{") {
69
+ throw new Error("Unexpected nested '{' beyond depth 2");
70
+ }
71
+ childMap.set(childKey, childValue);
72
+ lastChildKey = childKey;
73
+ }
74
+ if (serialized[cursor] !== "}") {
75
+ throw new Error("Unterminated child block");
76
+ }
77
+ cursor++; // Skip '}'
78
+ top.set(key, { value, next: childMap });
79
+ }
80
+ }
81
+ else if (value === undefined) {
82
+ throw new Error(`Malformed encode trie: missing value at index ${cursor}`);
83
+ }
84
+ else {
85
+ top.set(key, value);
86
+ }
87
+ lastTopKey = key;
88
+ }
89
+ return top;
90
+ }
91
+ //# sourceMappingURL=encode-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode-shared.js","sourceRoot":"","sources":["../../../src/internal/encode-shared.ts"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC3B,UAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IAEpB,SAAS,QAAQ;QACb,MAAM,KAAK,GAAG,MAAM,CAAC;QACrB,OAAO,MAAM,GAAG,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM;YACV,CAAC;YACD,MAAM,EAAE,CAAC;QACb,CAAC;QACD,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,UAAU;QACf,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,iCAAiC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC;QACrB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,gBAAgB;QAClC,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB;IAC/D,CAAC;IAED,OAAO,MAAM,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC;QAEnE,IAAI,KAAyB,CAAC;QAC9B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG;YAAE,KAAK,GAAG,UAAU,EAAE,CAAC;QAErD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7B,MAAM,EAAE,CAAC,CAAC,WAAW;YACrB,oBAAoB;YACpB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,gCAAgC;YACrD,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;YAChC,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC5D,CAAC;YACD,+CAA+C;YAC/C,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC7B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC/D,MAAM,EAAE,CAAC,CAAC,WAAW;YACzB,CAAC;iBAAM,CAAC;gBACJ,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;gBACnD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACnC,IAAI,YAAY,GAAG,QAAQ,CAAC;gBAC5B,OAAO,MAAM,GAAG,WAAW,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxD,IAAI,GAAG,QAAQ,EAAE,CAAC;oBAClB,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC;oBACnC,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;oBAChC,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;wBAC7B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAC5D,CAAC;oBACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACnC,YAAY,GAAG,QAAQ,CAAC;gBAC5B,CAAC;gBACD,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM,EAAE,CAAC,CAAC,WAAW;gBACrB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACX,iDAAiD,MAAM,EAAE,CAC5D,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,UAAU,GAAG,GAAG,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
package/escape.d.ts CHANGED
@@ -1 +1,3 @@
1
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2
+ // @ts-ignore
1
3
  export * from "./dist/commonjs/escape.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "entities",
3
- "version": "6.0.1",
3
+ "version": "7.0.1",
4
4
  "description": "Encode & decode XML and HTML entities with ease & speed",
5
5
  "keywords": [
6
6
  "html entities",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "repository": {
15
15
  "type": "git",
16
- "url": "git://github.com/fb55/entities.git"
16
+ "url": "https://github.com/fb55/entities.git"
17
17
  },
18
18
  "funding": "https://github.com/fb55/entities?sponsor=1",
19
19
  "license": "BSD-2-Clause",
@@ -61,43 +61,45 @@
61
61
  "escape.js",
62
62
  "escape.d.ts",
63
63
  "dist",
64
- "src"
64
+ "src",
65
+ "!**/*.spec.ts"
65
66
  ],
66
67
  "scripts": {
67
68
  "build:docs": "typedoc --hideGenerator src/index.ts",
68
69
  "build:encode-trie": "node --import=tsx scripts/write-encode-map.ts",
69
70
  "build:trie": "node --import=tsx scripts/write-decode-map.ts",
70
- "format": "npm run format:es && npm run format:prettier",
71
+ "benchmark": "node --import=tsx scripts/benchmark.ts",
72
+ "format": "npm run format:es && npm run format:biome",
71
73
  "format:es": "npm run lint:es -- --fix",
72
- "format:prettier": "npm run prettier -- --write",
73
- "lint": "npm run lint:es && npm run lint:ts && npm run lint:prettier",
74
+ "format:biome": "biome check --fix .",
75
+ "lint": "npm run lint:es && npm run lint:ts && npm run lint:biome",
74
76
  "lint:es": "eslint . --ignore-path .gitignore",
75
- "lint:prettier": "npm run prettier -- --check",
77
+ "lint:biome": "biome check .",
76
78
  "lint:ts": "tsc --noEmit",
77
79
  "prepublishOnly": "tshy",
78
- "prettier": "prettier '**/*.{ts,md,json,yml}'",
79
80
  "test": "npm run test:vi && npm run lint",
80
81
  "test:vi": "vitest run"
81
82
  },
82
- "prettier": {
83
- "proseWrap": "always",
84
- "tabWidth": 4
85
- },
86
83
  "devDependencies": {
87
- "@types/node": "^22.15.30",
88
- "@typescript-eslint/eslint-plugin": "^8.33.1",
89
- "@typescript-eslint/parser": "^8.33.1",
90
- "@vitest/coverage-v8": "^2.1.8",
84
+ "@biomejs/biome": "^2.3.11",
85
+ "@types/node": "^25.0.9",
86
+ "@typescript-eslint/eslint-plugin": "^8.53.1",
87
+ "@typescript-eslint/parser": "^8.53.1",
88
+ "@vitest/coverage-v8": "^3.2.4",
89
+ "@types/he": "^1.2.3",
91
90
  "eslint": "^8.57.1",
92
- "eslint-config-prettier": "^10.1.5",
93
- "eslint-plugin-n": "^17.19.0",
91
+ "eslint-config-biome": "^2.1.3",
92
+ "eslint-plugin-n": "^17.23.2",
94
93
  "eslint-plugin-unicorn": "^56.0.1",
95
- "prettier": "^3.5.3",
96
- "tshy": "^3.0.2",
97
- "tsx": "^4.19.4",
98
- "typedoc": "^0.28.5",
99
- "typescript": "^5.8.3",
100
- "vitest": "^2.0.2"
94
+ "he": "^1.2.0",
95
+ "html-entities": "^2.6.0",
96
+ "parse-entities": "^4.0.2",
97
+ "tinybench": "^5.1.0",
98
+ "tshy": "^3.1.0",
99
+ "tsx": "^4.21.0",
100
+ "typedoc": "^0.28.16",
101
+ "typescript": "^5.9.3",
102
+ "vitest": "^3.2.4"
101
103
  },
102
104
  "engines": {
103
105
  "node": ">=0.12"
package/readme.md CHANGED
@@ -10,7 +10,7 @@ Encode & decode HTML & XML entities with ease & speed.
10
10
  [`commonmark`](https://github.com/commonmark/commonmark.js) use it to process
11
11
  HTML entities.
12
12
  - ⚡️ Fast: `entities` is the fastest library for decoding HTML entities (as of
13
- April 2022); see [performance](#performance).
13
+ September 2025); see [performance](#performance).
14
14
  - 🎛 Configurable: Get an output tailored for your needs. You are fine with
15
15
  UTF8? That'll save you some bytes. Prefer to only have ASCII characters? We
16
16
  can do that as well!
@@ -38,15 +38,36 @@ entities.decodeHTML("asdf &amp; &yuml; &uuml; &apos;"); // "asdf & ÿ ü '"
38
38
 
39
39
  ## Performance
40
40
 
41
- This is how `entities` compares to other libraries on a very basic benchmark
42
- (see `scripts/benchmark.ts`, for 10,000,000 iterations; **lower is better**):
41
+ Benchmarked in September 2025 with Node v24.6.0 on Apple M2 using `tinybench`.
42
+ Higher ops/s is better; `avg (μs)` is the mean time per operation.
43
+ See `scripts/benchmark.ts` to reproduce.
43
44
 
44
- | Library | Version | `decode` perf | `encode` perf | `escape` perf |
45
- | -------------- | ------- | ------------- | ------------- | ------------- |
46
- | entities | `3.0.1` | 1.418s | 6.786s | 2.196s |
47
- | html-entities | `2.3.2` | 2.530s | 6.829s | 2.415s |
48
- | he | `1.2.0` | 5.800s | 24.237s | 3.624s |
49
- | parse-entities | `3.0.0` | 9.660s | N/A | N/A |
45
+ ### Decoding
46
+
47
+ | Library | Version | ops/s | avg (μs) | ±% | slower |
48
+ | -------------- | ------- | --------- | -------- | ---- | ------ |
49
+ | entities | 7.0.0 | 5,838,416 | 175.57 | 0.06 | — |
50
+ | html-entities | 2.6.0 | 2,919,637 | 347.77 | 0.33 | 50.0% |
51
+ | he | 1.2.0 | 2,318,438 | 446.48 | 0.70 | 60.3% |
52
+ | parse-entities | 4.0.2 | 852,855 | 1,199.51 | 0.36 | 85.4% |
53
+
54
+ ### Encoding
55
+
56
+ | Library | Version | ops/s | avg (μs) | ±% | slower |
57
+ | -------------- | ------- | --------- | -------- | ---- | ------ |
58
+ | entities | 7.0.0 | 2,770,115 | 368.09 | 0.11 | — |
59
+ | html-entities | 2.6.0 | 1,491,963 | 679.96 | 0.58 | 46.2% |
60
+ | he | 1.2.0 | 481,278 | 2,118.25 | 0.61 | 82.6% |
61
+
62
+ ### Escaping
63
+
64
+ | Library | Version | ops/s | avg (μs) | ±% | slower |
65
+ | -------------- | ------- | --------- | -------- | ---- | ------ |
66
+ | entities | 7.0.0 | 4,616,468 | 223.84 | 0.17 | — |
67
+ | he | 1.2.0 | 3,659,301 | 280.76 | 0.58 | 20.7% |
68
+ | html-entities | 2.6.0 | 3,555,301 | 296.63 | 0.84 | 23.0% |
69
+
70
+ Note: Micro-benchmarks may vary across machines and Node versions.
50
71
 
51
72
  ---
52
73
 
@@ -68,8 +89,8 @@ This is helpful for decoding entities in legacy environments.
68
89
 
69
90
  > Why should I use `entities` instead of alternative modules?
70
91
 
71
- As of April 2022, `entities` is a bit faster than other modules. Still, this is
72
- not a very differentiated space and other modules can catch up.
92
+ As of September 2025, `entities` is faster than other modules. Still, this is
93
+ not a differentiated space and other modules can catch up.
73
94
 
74
95
  **More importantly**, you might already have `entities` in your dependency graph
75
96
  (as a dependency of eg. `cheerio`, or `htmlparser2`), and including it directly
@@ -38,7 +38,7 @@ const decodeMap = new Map([
38
38
  export const fromCodePoint: (...codePoints: number[]) => string =
39
39
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, n/no-unsupported-features/es-builtins
40
40
  String.fromCodePoint ??
41
- function (codePoint: number): string {
41
+ ((codePoint: number): string => {
42
42
  let output = "";
43
43
 
44
44
  if (codePoint > 0xff_ff) {
@@ -51,7 +51,7 @@ export const fromCodePoint: (...codePoints: number[]) => string =
51
51
 
52
52
  output += String.fromCharCode(codePoint);
53
53
  return output;
54
- };
54
+ });
55
55
 
56
56
  /**
57
57
  * Replace the given code point with a replacement character if it is a