@reckona/mreact-shared 0.0.138 → 0.0.140

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.
@@ -1 +1 @@
1
- {"version":3,"file":"html-escape.d.ts","sourceRoot":"","sources":["../src/html-escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhE"}
1
+ {"version":3,"file":"html-escape.d.ts","sourceRoot":"","sources":["../src/html-escape.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhE"}
@@ -1,13 +1,62 @@
1
+ const textEscapePattern = /[&<>]/;
2
+ const attributeEscapePattern = /["&<>]/;
3
+ const quotedAttributeEscapePattern = /["&]/;
1
4
  export function escapeHtmlText(value) {
2
- return String(value)
3
- .replaceAll("&", "&amp;")
4
- .replaceAll("<", "&lt;")
5
- .replaceAll(">", "&gt;");
5
+ return escapeHtml(String(value), textEscapePattern, textReplacement);
6
6
  }
7
7
  export function escapeHtmlAttribute(value) {
8
- return escapeHtmlText(value).replaceAll("\"", "&quot;");
8
+ return escapeHtml(String(value), attributeEscapePattern, attributeReplacement);
9
9
  }
10
10
  export function escapeHtmlQuotedAttribute(value) {
11
- return String(value).replaceAll("&", "&amp;").replaceAll("\"", "&quot;");
11
+ return escapeHtml(String(value), quotedAttributeEscapePattern, quotedAttributeReplacement);
12
+ }
13
+ function escapeHtml(value, pattern, replacementForCode) {
14
+ const match = pattern.exec(value);
15
+ if (match === null) {
16
+ return value;
17
+ }
18
+ let escaped = "";
19
+ let lastIndex = 0;
20
+ let index = match.index;
21
+ for (; index < value.length; index += 1) {
22
+ const replacement = replacementForCode(value.charCodeAt(index));
23
+ if (replacement === undefined) {
24
+ continue;
25
+ }
26
+ if (lastIndex !== index) {
27
+ escaped += value.substring(lastIndex, index);
28
+ }
29
+ escaped += replacement;
30
+ lastIndex = index + 1;
31
+ }
32
+ return lastIndex === index ? escaped : escaped + value.substring(lastIndex, index);
33
+ }
34
+ function textReplacement(code) {
35
+ switch (code) {
36
+ case 38:
37
+ return "&amp;";
38
+ case 60:
39
+ return "&lt;";
40
+ case 62:
41
+ return "&gt;";
42
+ default:
43
+ return undefined;
44
+ }
45
+ }
46
+ function attributeReplacement(code) {
47
+ if (code === 34) {
48
+ return "&quot;";
49
+ }
50
+ return textReplacement(code);
51
+ }
52
+ function quotedAttributeReplacement(code) {
53
+ switch (code) {
54
+ case 34:
55
+ return "&quot;";
56
+ case 38:
57
+ return "&amp;";
58
+ default:
59
+ return undefined;
60
+ }
12
61
  }
13
62
  //# sourceMappingURL=html-escape.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html-escape.js","sourceRoot":"","sources":["../src/html-escape.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["export function escapeHtmlText(value: unknown): string {\n return String(value)\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nexport function escapeHtmlAttribute(value: unknown): string {\n return escapeHtmlText(value).replaceAll(\"\\\"\", \"&quot;\");\n}\n\nexport function escapeHtmlQuotedAttribute(value: unknown): string {\n return String(value).replaceAll(\"&\", \"&amp;\").replaceAll(\"\\\"\", \"&quot;\");\n}\n"]}
1
+ {"version":3,"file":"html-escape.js","sourceRoot":"","sources":["../src/html-escape.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AACxC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,4BAA4B,EAAE,0BAA0B,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,UAAU,CACjB,KAAa,EACb,OAAe,EACf,kBAAwD;IAExD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAExB,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,WAAW,CAAC;QACvB,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,EAAE;YACL,OAAO,OAAO,CAAC;QACjB,KAAK,EAAE;YACL,OAAO,MAAM,CAAC;QAChB,KAAK,EAAE;YACL,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,0BAA0B,CAAC,IAAY;IAC9C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,EAAE;YACL,OAAO,QAAQ,CAAC;QAClB,KAAK,EAAE;YACL,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC","sourcesContent":["const textEscapePattern = /[&<>]/;\nconst attributeEscapePattern = /[\"&<>]/;\nconst quotedAttributeEscapePattern = /[\"&]/;\n\nexport function escapeHtmlText(value: unknown): string {\n return escapeHtml(String(value), textEscapePattern, textReplacement);\n}\n\nexport function escapeHtmlAttribute(value: unknown): string {\n return escapeHtml(String(value), attributeEscapePattern, attributeReplacement);\n}\n\nexport function escapeHtmlQuotedAttribute(value: unknown): string {\n return escapeHtml(String(value), quotedAttributeEscapePattern, quotedAttributeReplacement);\n}\n\nfunction escapeHtml(\n value: string,\n pattern: RegExp,\n replacementForCode: (code: number) => string | undefined,\n): string {\n const match = pattern.exec(value);\n\n if (match === null) {\n return value;\n }\n\n let escaped = \"\";\n let lastIndex = 0;\n let index = match.index;\n\n for (; index < value.length; index += 1) {\n const replacement = replacementForCode(value.charCodeAt(index));\n\n if (replacement === undefined) {\n continue;\n }\n\n if (lastIndex !== index) {\n escaped += value.substring(lastIndex, index);\n }\n\n escaped += replacement;\n lastIndex = index + 1;\n }\n\n return lastIndex === index ? escaped : escaped + value.substring(lastIndex, index);\n}\n\nfunction textReplacement(code: number): string | undefined {\n switch (code) {\n case 38:\n return \"&amp;\";\n case 60:\n return \"&lt;\";\n case 62:\n return \"&gt;\";\n default:\n return undefined;\n }\n}\n\nfunction attributeReplacement(code: number): string | undefined {\n if (code === 34) {\n return \"&quot;\";\n }\n\n return textReplacement(code);\n}\n\nfunction quotedAttributeReplacement(code: number): string | undefined {\n switch (code) {\n case 34:\n return \"&quot;\";\n case 38:\n return \"&amp;\";\n default:\n return undefined;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-shared",
3
- "version": "0.0.138",
3
+ "version": "0.0.140",
4
4
  "description": "Shared runtime utilities used by mreact packages.",
5
5
  "keywords": [
6
6
  "jsx",
@@ -1,14 +1,80 @@
1
+ const textEscapePattern = /[&<>]/;
2
+ const attributeEscapePattern = /["&<>]/;
3
+ const quotedAttributeEscapePattern = /["&]/;
4
+
1
5
  export function escapeHtmlText(value: unknown): string {
2
- return String(value)
3
- .replaceAll("&", "&amp;")
4
- .replaceAll("<", "&lt;")
5
- .replaceAll(">", "&gt;");
6
+ return escapeHtml(String(value), textEscapePattern, textReplacement);
6
7
  }
7
8
 
8
9
  export function escapeHtmlAttribute(value: unknown): string {
9
- return escapeHtmlText(value).replaceAll("\"", "&quot;");
10
+ return escapeHtml(String(value), attributeEscapePattern, attributeReplacement);
10
11
  }
11
12
 
12
13
  export function escapeHtmlQuotedAttribute(value: unknown): string {
13
- return String(value).replaceAll("&", "&amp;").replaceAll("\"", "&quot;");
14
+ return escapeHtml(String(value), quotedAttributeEscapePattern, quotedAttributeReplacement);
15
+ }
16
+
17
+ function escapeHtml(
18
+ value: string,
19
+ pattern: RegExp,
20
+ replacementForCode: (code: number) => string | undefined,
21
+ ): string {
22
+ const match = pattern.exec(value);
23
+
24
+ if (match === null) {
25
+ return value;
26
+ }
27
+
28
+ let escaped = "";
29
+ let lastIndex = 0;
30
+ let index = match.index;
31
+
32
+ for (; index < value.length; index += 1) {
33
+ const replacement = replacementForCode(value.charCodeAt(index));
34
+
35
+ if (replacement === undefined) {
36
+ continue;
37
+ }
38
+
39
+ if (lastIndex !== index) {
40
+ escaped += value.substring(lastIndex, index);
41
+ }
42
+
43
+ escaped += replacement;
44
+ lastIndex = index + 1;
45
+ }
46
+
47
+ return lastIndex === index ? escaped : escaped + value.substring(lastIndex, index);
48
+ }
49
+
50
+ function textReplacement(code: number): string | undefined {
51
+ switch (code) {
52
+ case 38:
53
+ return "&amp;";
54
+ case 60:
55
+ return "&lt;";
56
+ case 62:
57
+ return "&gt;";
58
+ default:
59
+ return undefined;
60
+ }
61
+ }
62
+
63
+ function attributeReplacement(code: number): string | undefined {
64
+ if (code === 34) {
65
+ return "&quot;";
66
+ }
67
+
68
+ return textReplacement(code);
69
+ }
70
+
71
+ function quotedAttributeReplacement(code: number): string | undefined {
72
+ switch (code) {
73
+ case 34:
74
+ return "&quot;";
75
+ case 38:
76
+ return "&amp;";
77
+ default:
78
+ return undefined;
79
+ }
14
80
  }