hono 2.3.2 → 2.4.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 (143) hide show
  1. package/dist/cjs/compose.js +82 -66
  2. package/dist/cjs/context.js +159 -144
  3. package/dist/cjs/hono.js +173 -150
  4. package/dist/cjs/index.js +31 -11
  5. package/dist/cjs/middleware/basic-auth/index.js +70 -39
  6. package/dist/cjs/middleware/bearer-auth/index.js +69 -51
  7. package/dist/cjs/middleware/cache/index.js +49 -28
  8. package/dist/cjs/middleware/compress/index.js +39 -16
  9. package/dist/cjs/middleware/cors/index.js +89 -71
  10. package/dist/cjs/middleware/etag/index.js +46 -24
  11. package/dist/cjs/middleware/html/index.js +50 -30
  12. package/dist/cjs/middleware/jsx/index.js +178 -166
  13. package/dist/cjs/middleware/jsx/jsx-dev-runtime.js +33 -7
  14. package/dist/cjs/middleware/jsx/jsx-runtime.js +32 -6
  15. package/dist/cjs/middleware/jwt/index.js +74 -54
  16. package/dist/cjs/middleware/logger/index.js +59 -38
  17. package/dist/cjs/middleware/powered-by/index.js +30 -7
  18. package/dist/cjs/middleware/pretty-json/index.js +31 -8
  19. package/dist/cjs/middleware/serve-static/bun.js +56 -38
  20. package/dist/cjs/middleware/serve-static/index.js +27 -4
  21. package/dist/cjs/middleware/serve-static/module.js +42 -0
  22. package/dist/cjs/middleware/serve-static/serve-static.js +58 -39
  23. package/dist/cjs/middleware/validator/index.js +27 -4
  24. package/dist/cjs/middleware/validator/middleware.js +125 -91
  25. package/dist/cjs/package.json +3 -0
  26. package/dist/cjs/request.js +129 -116
  27. package/dist/cjs/router/reg-exp-router/index.js +27 -4
  28. package/dist/cjs/router/reg-exp-router/node.js +108 -97
  29. package/dist/cjs/router/reg-exp-router/router.js +158 -141
  30. package/dist/cjs/router/reg-exp-router/trie.js +55 -39
  31. package/dist/cjs/router/smart-router/index.js +27 -4
  32. package/dist/cjs/router/smart-router/router.js +70 -49
  33. package/dist/cjs/router/static-router/index.js +27 -4
  34. package/dist/cjs/router/static-router/router.js +78 -64
  35. package/dist/cjs/router/trie-router/index.js +27 -4
  36. package/dist/cjs/router/trie-router/node.js +167 -159
  37. package/dist/cjs/router/trie-router/router.js +43 -20
  38. package/dist/cjs/router.js +35 -6
  39. package/dist/cjs/types.js +16 -0
  40. package/dist/cjs/utils/body.js +36 -15
  41. package/dist/cjs/utils/buffer.js +56 -31
  42. package/dist/cjs/utils/cloudflare.js +53 -34
  43. package/dist/cjs/utils/cookie.js +59 -35
  44. package/dist/cjs/utils/crypto.js +69 -43
  45. package/dist/cjs/utils/encode.js +92 -65
  46. package/dist/cjs/utils/filepath.js +39 -22
  47. package/dist/cjs/utils/html.js +54 -33
  48. package/dist/cjs/utils/http-status.js +68 -45
  49. package/dist/cjs/utils/json.js +91 -76
  50. package/dist/cjs/utils/jwt/index.js +32 -25
  51. package/dist/cjs/utils/jwt/jwt.js +124 -93
  52. package/dist/cjs/utils/jwt/types.js +65 -38
  53. package/dist/cjs/utils/mime.js +110 -87
  54. package/dist/cjs/utils/object.js +53 -35
  55. package/dist/cjs/utils/types.js +15 -1
  56. package/dist/cjs/utils/url.js +89 -78
  57. package/dist/cjs/validator/rule.js +78 -64
  58. package/dist/cjs/validator/sanitizer.js +28 -4
  59. package/dist/cjs/validator/schema.js +15 -1
  60. package/dist/cjs/validator/validator.js +405 -386
  61. package/dist/compose.d.ts +1 -1
  62. package/dist/compose.js +61 -64
  63. package/dist/context.d.ts +4 -4
  64. package/dist/context.js +139 -143
  65. package/dist/hono.d.ts +1 -17
  66. package/dist/hono.js +153 -149
  67. package/dist/index.d.ts +3 -1
  68. package/dist/index.js +9 -9
  69. package/dist/middleware/basic-auth/index.d.ts +1 -1
  70. package/dist/middleware/basic-auth/index.js +52 -40
  71. package/dist/middleware/bearer-auth/index.d.ts +1 -1
  72. package/dist/middleware/bearer-auth/index.js +48 -49
  73. package/dist/middleware/cache/index.d.ts +1 -1
  74. package/dist/middleware/cache/index.js +28 -26
  75. package/dist/middleware/compress/index.d.ts +1 -1
  76. package/dist/middleware/compress/index.js +18 -14
  77. package/dist/middleware/cors/index.d.ts +1 -1
  78. package/dist/middleware/cors/index.js +68 -69
  79. package/dist/middleware/etag/index.d.ts +1 -1
  80. package/dist/middleware/etag/index.js +25 -22
  81. package/dist/middleware/html/index.js +29 -28
  82. package/dist/middleware/jsx/index.js +164 -172
  83. package/dist/middleware/jsx/jsx-dev-runtime.d.ts +1 -0
  84. package/dist/middleware/jsx/jsx-dev-runtime.js +11 -5
  85. package/dist/middleware/jsx/jsx-runtime.d.ts +1 -1
  86. package/dist/middleware/jsx/jsx-runtime.js +8 -2
  87. package/dist/middleware/jwt/index.d.ts +1 -1
  88. package/dist/middleware/jwt/index.js +53 -52
  89. package/dist/middleware/logger/index.d.ts +1 -1
  90. package/dist/middleware/logger/index.js +35 -39
  91. package/dist/middleware/powered-by/index.d.ts +1 -1
  92. package/dist/middleware/powered-by/index.js +9 -5
  93. package/dist/middleware/pretty-json/index.d.ts +1 -1
  94. package/dist/middleware/pretty-json/index.js +10 -6
  95. package/dist/middleware/serve-static/bun.d.ts +1 -1
  96. package/dist/middleware/serve-static/bun.js +35 -36
  97. package/dist/middleware/serve-static/index.js +5 -1
  98. package/dist/middleware/serve-static/{module.d.mts → module.d.ts} +1 -1
  99. package/dist/middleware/serve-static/module.js +13 -0
  100. package/dist/middleware/serve-static/serve-static.d.ts +1 -1
  101. package/dist/middleware/serve-static/serve-static.js +36 -36
  102. package/dist/middleware/validator/index.js +5 -2
  103. package/dist/middleware/validator/middleware.d.ts +1 -1
  104. package/dist/middleware/validator/middleware.js +104 -89
  105. package/dist/request.js +108 -114
  106. package/dist/router/reg-exp-router/index.js +5 -1
  107. package/dist/router/reg-exp-router/node.js +87 -96
  108. package/dist/router/reg-exp-router/router.js +140 -142
  109. package/dist/router/reg-exp-router/trie.js +35 -38
  110. package/dist/router/smart-router/index.js +5 -1
  111. package/dist/router/smart-router/router.js +50 -48
  112. package/dist/router/static-router/index.js +5 -1
  113. package/dist/router/static-router/router.js +58 -63
  114. package/dist/router/trie-router/index.js +5 -1
  115. package/dist/router/trie-router/node.js +147 -158
  116. package/dist/router/trie-router/router.js +23 -19
  117. package/dist/router.js +12 -5
  118. package/dist/types.d.ts +22 -0
  119. package/dist/types.js +0 -0
  120. package/dist/utils/body.js +15 -13
  121. package/dist/utils/buffer.js +35 -29
  122. package/dist/utils/cloudflare.js +32 -32
  123. package/dist/utils/cookie.js +38 -33
  124. package/dist/utils/crypto.js +48 -41
  125. package/dist/utils/encode.js +70 -62
  126. package/dist/utils/filepath.js +18 -20
  127. package/dist/utils/html.js +34 -32
  128. package/dist/utils/http-status.js +48 -44
  129. package/dist/utils/json.js +71 -75
  130. package/dist/utils/jwt/index.js +5 -1
  131. package/dist/utils/jwt/jwt.js +95 -90
  132. package/dist/utils/jwt/types.js +47 -41
  133. package/dist/utils/mime.js +90 -86
  134. package/dist/utils/object.js +31 -32
  135. package/dist/utils/types.js +0 -1
  136. package/dist/utils/url.js +69 -77
  137. package/dist/validator/rule.js +56 -62
  138. package/dist/validator/sanitizer.js +6 -2
  139. package/dist/validator/schema.js +0 -1
  140. package/dist/validator/validator.d.ts +5 -4
  141. package/dist/validator/validator.js +393 -393
  142. package/package.json +14 -8
  143. package/dist/middleware/serve-static/module.mjs +0 -13
@@ -1,15 +1,19 @@
1
- export const compress = (options) => {
2
- return async (ctx, next) => {
3
- await next();
4
- const accepted = ctx.req.headers.get('Accept-Encoding');
5
- const pattern = options?.encoding ?? /gzip|deflate/;
6
- const match = accepted?.match(pattern);
7
- if (!accepted || !match || !ctx.res.body) {
8
- return;
9
- }
10
- const encoding = match[0];
11
- const stream = new CompressionStream(encoding);
12
- ctx.res = new Response(ctx.res.body.pipeThrough(stream), ctx.res);
13
- ctx.res.headers.set('Content-Encoding', encoding);
14
- };
1
+ // src/middleware/compress/index.ts
2
+ var compress = (options) => {
3
+ return async (ctx, next) => {
4
+ await next();
5
+ const accepted = ctx.req.headers.get("Accept-Encoding");
6
+ const pattern = options?.encoding ?? /gzip|deflate/;
7
+ const match = accepted?.match(pattern);
8
+ if (!accepted || !match || !ctx.res.body) {
9
+ return;
10
+ }
11
+ const encoding = match[0];
12
+ const stream = new CompressionStream(encoding);
13
+ ctx.res = new Response(ctx.res.body.pipeThrough(stream), ctx.res);
14
+ ctx.res.headers.set("Content-Encoding", encoding);
15
+ };
16
+ };
17
+ export {
18
+ compress
15
19
  };
@@ -1,4 +1,4 @@
1
- import type { MiddlewareHandler } from '../../hono';
1
+ import type { MiddlewareHandler } from '../../types';
2
2
  declare type CORSOptions = {
3
3
  origin: string | string[] | ((origin: string) => string | undefined | null);
4
4
  allowMethods?: string[];
@@ -1,71 +1,70 @@
1
- export const cors = (options) => {
2
- const defaults = {
3
- origin: '*',
4
- allowMethods: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH'],
5
- allowHeaders: [],
6
- exposeHeaders: [],
7
- };
8
- const opts = {
9
- ...defaults,
10
- ...options,
11
- };
12
- const findAllowOrigin = ((optsOrigin) => {
13
- if (typeof optsOrigin === 'string') {
14
- return () => optsOrigin;
1
+ // src/middleware/cors/index.ts
2
+ var cors = (options) => {
3
+ const defaults = {
4
+ origin: "*",
5
+ allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"],
6
+ allowHeaders: [],
7
+ exposeHeaders: []
8
+ };
9
+ const opts = {
10
+ ...defaults,
11
+ ...options
12
+ };
13
+ const findAllowOrigin = ((optsOrigin) => {
14
+ if (typeof optsOrigin === "string") {
15
+ return () => optsOrigin;
16
+ } else if (typeof optsOrigin === "function") {
17
+ return optsOrigin;
18
+ } else {
19
+ return (origin) => optsOrigin.includes(origin) ? origin : optsOrigin[0];
20
+ }
21
+ })(opts.origin);
22
+ return async (c, next) => {
23
+ await next();
24
+ function set(key, value) {
25
+ c.res.headers.append(key, value);
26
+ }
27
+ const allowOrigin = findAllowOrigin(c.req.headers.get("origin") || "");
28
+ if (allowOrigin) {
29
+ set("Access-Control-Allow-Origin", allowOrigin);
30
+ }
31
+ if (opts.origin !== "*") {
32
+ set("Vary", "Origin");
33
+ }
34
+ if (opts.credentials) {
35
+ set("Access-Control-Allow-Credentials", "true");
36
+ }
37
+ if (opts.exposeHeaders?.length) {
38
+ set("Access-Control-Expose-Headers", opts.exposeHeaders.join(","));
39
+ }
40
+ if (c.req.method === "OPTIONS") {
41
+ if (opts.maxAge != null) {
42
+ set("Access-Control-Max-Age", opts.maxAge.toString());
43
+ }
44
+ if (opts.allowMethods?.length) {
45
+ set("Access-Control-Allow-Methods", opts.allowMethods.join(","));
46
+ }
47
+ let headers = opts.allowHeaders;
48
+ if (!headers?.length) {
49
+ const requestHeaders = c.req.headers.get("Access-Control-Request-Headers");
50
+ if (requestHeaders) {
51
+ headers = requestHeaders.split(/\s*,\s*/);
15
52
  }
16
- else if (typeof optsOrigin === 'function') {
17
- return optsOrigin;
18
- }
19
- else {
20
- return (origin) => (optsOrigin.includes(origin) ? origin : optsOrigin[0]);
21
- }
22
- })(opts.origin);
23
- return async (c, next) => {
24
- await next();
25
- function set(key, value) {
26
- c.res.headers.append(key, value);
27
- }
28
- const allowOrigin = findAllowOrigin(c.req.headers.get('origin') || '');
29
- if (allowOrigin) {
30
- set('Access-Control-Allow-Origin', allowOrigin);
31
- }
32
- // Suppose the server sends a response with an Access-Control-Allow-Origin value with an explicit origin (rather than the "*" wildcard).
33
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
34
- if (opts.origin !== '*') {
35
- set('Vary', 'Origin');
36
- }
37
- if (opts.credentials) {
38
- set('Access-Control-Allow-Credentials', 'true');
39
- }
40
- if (opts.exposeHeaders?.length) {
41
- set('Access-Control-Expose-Headers', opts.exposeHeaders.join(','));
42
- }
43
- if (c.req.method === 'OPTIONS') {
44
- // Preflight
45
- if (opts.maxAge != null) {
46
- set('Access-Control-Max-Age', opts.maxAge.toString());
47
- }
48
- if (opts.allowMethods?.length) {
49
- set('Access-Control-Allow-Methods', opts.allowMethods.join(','));
50
- }
51
- let headers = opts.allowHeaders;
52
- if (!headers?.length) {
53
- const requestHeaders = c.req.headers.get('Access-Control-Request-Headers');
54
- if (requestHeaders) {
55
- headers = requestHeaders.split(/\s*,\s*/);
56
- }
57
- }
58
- if (headers?.length) {
59
- set('Access-Control-Allow-Headers', headers.join(','));
60
- set('Vary', 'Access-Control-Request-Headers');
61
- }
62
- c.res.headers.delete('Content-Length');
63
- c.res.headers.delete('Content-Type');
64
- c.res = new Response(null, {
65
- headers: c.res.headers,
66
- status: 204,
67
- statusText: c.res.statusText,
68
- });
69
- }
70
- };
53
+ }
54
+ if (headers?.length) {
55
+ set("Access-Control-Allow-Headers", headers.join(","));
56
+ set("Vary", "Access-Control-Request-Headers");
57
+ }
58
+ c.res.headers.delete("Content-Length");
59
+ c.res.headers.delete("Content-Type");
60
+ c.res = new Response(null, {
61
+ headers: c.res.headers,
62
+ status: 204,
63
+ statusText: c.res.statusText
64
+ });
65
+ }
66
+ };
67
+ };
68
+ export {
69
+ cors
71
70
  };
@@ -1,4 +1,4 @@
1
- import type { MiddlewareHandler } from '../../hono';
1
+ import type { MiddlewareHandler } from '../../types';
2
2
  declare type ETagOptions = {
3
3
  weak: boolean;
4
4
  };
@@ -1,23 +1,26 @@
1
- import { sha1 } from '../../utils/crypto';
2
- export const etag = (options = { weak: false }) => {
3
- return async (c, next) => {
4
- const ifNoneMatch = c.req.header('If-None-Match') || c.req.header('if-none-match');
5
- await next();
6
- const res = c.res;
7
- const clone = res.clone();
8
- const hash = await sha1(res.body || '');
9
- const etag = options.weak ? `W/"${hash}"` : `"${hash}"`;
10
- if (ifNoneMatch && ifNoneMatch === etag) {
11
- await clone.blob(); // Force using body
12
- c.res = new Response(null, {
13
- status: 304,
14
- statusText: 'Not Modified',
15
- });
16
- c.res.headers.delete('Content-Length');
17
- }
18
- else {
19
- c.res = new Response(clone.body, clone);
20
- c.res.headers.append('ETag', etag);
21
- }
22
- };
1
+ // src/middleware/etag/index.ts
2
+ import { sha1 } from "../../utils/crypto.js";
3
+ var etag = (options = { weak: false }) => {
4
+ return async (c, next) => {
5
+ const ifNoneMatch = c.req.header("If-None-Match") || c.req.header("if-none-match");
6
+ await next();
7
+ const res = c.res;
8
+ const clone = res.clone();
9
+ const hash = await sha1(res.body || "");
10
+ const etag2 = options.weak ? `W/"${hash}"` : `"${hash}"`;
11
+ if (ifNoneMatch && ifNoneMatch === etag2) {
12
+ await clone.blob();
13
+ c.res = new Response(null, {
14
+ status: 304,
15
+ statusText: "Not Modified"
16
+ });
17
+ c.res.headers.delete("Content-Length");
18
+ } else {
19
+ c.res = new Response(clone.body, clone);
20
+ c.res.headers.append("ETag", etag2);
21
+ }
22
+ };
23
+ };
24
+ export {
25
+ etag
23
26
  };
@@ -1,31 +1,32 @@
1
- import { escapeToBuffer } from '../../utils/html';
2
- export const raw = (value) => {
3
- const escapedString = new String(value);
4
- escapedString.isEscaped = true;
5
- return escapedString;
1
+ // src/middleware/html/index.ts
2
+ import { escapeToBuffer } from "../../utils/html.js";
3
+ var raw = (value) => {
4
+ const escapedString = new String(value);
5
+ escapedString.isEscaped = true;
6
+ return escapedString;
6
7
  };
7
- export const html = (strings, ...values) => {
8
- const buffer = [''];
9
- for (let i = 0, len = strings.length - 1; i < len; i++) {
10
- buffer[0] += strings[i];
11
- const children = values[i] instanceof Array ? values[i].flat(Infinity) : [values[i]];
12
- for (let i = 0, len = children.length; i < len; i++) {
13
- const child = children[i];
14
- if (typeof child === 'string') {
15
- escapeToBuffer(child, buffer);
16
- }
17
- else if (typeof child === 'boolean' || child === null || child === undefined) {
18
- continue;
19
- }
20
- else if ((typeof child === 'object' && child.isEscaped) ||
21
- typeof child === 'number') {
22
- buffer[0] += child;
23
- }
24
- else {
25
- escapeToBuffer(child.toString(), buffer);
26
- }
27
- }
8
+ var html = (strings, ...values) => {
9
+ const buffer = [""];
10
+ for (let i = 0, len = strings.length - 1; i < len; i++) {
11
+ buffer[0] += strings[i];
12
+ const children = values[i] instanceof Array ? values[i].flat(Infinity) : [values[i]];
13
+ for (let i2 = 0, len2 = children.length; i2 < len2; i2++) {
14
+ const child = children[i2];
15
+ if (typeof child === "string") {
16
+ escapeToBuffer(child, buffer);
17
+ } else if (typeof child === "boolean" || child === null || child === void 0) {
18
+ continue;
19
+ } else if (typeof child === "object" && child.isEscaped || typeof child === "number") {
20
+ buffer[0] += child;
21
+ } else {
22
+ escapeToBuffer(child.toString(), buffer);
23
+ }
28
24
  }
29
- buffer[0] += strings[strings.length - 1];
30
- return raw(buffer[0]);
25
+ }
26
+ buffer[0] += strings[strings.length - 1];
27
+ return raw(buffer[0]);
28
+ };
29
+ export {
30
+ html,
31
+ raw
31
32
  };
@@ -1,187 +1,179 @@
1
- import { escapeToBuffer } from '../../utils/html';
2
- const emptyTags = [
3
- 'area',
4
- 'base',
5
- 'br',
6
- 'col',
7
- 'embed',
8
- 'hr',
9
- 'img',
10
- 'input',
11
- 'keygen',
12
- 'link',
13
- 'meta',
14
- 'param',
15
- 'source',
16
- 'track',
17
- 'wbr',
1
+ // src/middleware/jsx/index.ts
2
+ import { escapeToBuffer } from "../../utils/html.js";
3
+ var emptyTags = [
4
+ "area",
5
+ "base",
6
+ "br",
7
+ "col",
8
+ "embed",
9
+ "hr",
10
+ "img",
11
+ "input",
12
+ "keygen",
13
+ "link",
14
+ "meta",
15
+ "param",
16
+ "source",
17
+ "track",
18
+ "wbr"
18
19
  ];
19
- const booleanAttributes = [
20
- 'allowfullscreen',
21
- 'async',
22
- 'autofocus',
23
- 'autoplay',
24
- 'checked',
25
- 'controls',
26
- 'default',
27
- 'defer',
28
- 'disabled',
29
- 'formnovalidate',
30
- 'hidden',
31
- 'inert',
32
- 'ismap',
33
- 'itemscope',
34
- 'loop',
35
- 'multiple',
36
- 'muted',
37
- 'nomodule',
38
- 'novalidate',
39
- 'open',
40
- 'playsinline',
41
- 'readonly',
42
- 'required',
43
- 'reversed',
44
- 'selected',
20
+ var booleanAttributes = [
21
+ "allowfullscreen",
22
+ "async",
23
+ "autofocus",
24
+ "autoplay",
25
+ "checked",
26
+ "controls",
27
+ "default",
28
+ "defer",
29
+ "disabled",
30
+ "formnovalidate",
31
+ "hidden",
32
+ "inert",
33
+ "ismap",
34
+ "itemscope",
35
+ "loop",
36
+ "multiple",
37
+ "muted",
38
+ "nomodule",
39
+ "novalidate",
40
+ "open",
41
+ "playsinline",
42
+ "readonly",
43
+ "required",
44
+ "reversed",
45
+ "selected"
45
46
  ];
46
- const childrenToStringToBuffer = (children, buffer) => {
47
- for (let i = 0, len = children.length; i < len; i++) {
48
- const child = children[i];
49
- if (typeof child === 'string') {
50
- escapeToBuffer(child, buffer);
51
- }
52
- else if (typeof child === 'boolean' || child === null || child === undefined) {
53
- continue;
54
- }
55
- else if (child instanceof JSXNode) {
56
- child.toStringToBuffer(buffer);
57
- }
58
- else if (typeof child === 'number' || child.isEscaped) {
59
- buffer[0] += child;
60
- }
61
- else {
62
- // `child` type is `Child[]`, so stringify recursively
63
- childrenToStringToBuffer(child, buffer);
64
- }
47
+ var childrenToStringToBuffer = (children, buffer) => {
48
+ for (let i = 0, len = children.length; i < len; i++) {
49
+ const child = children[i];
50
+ if (typeof child === "string") {
51
+ escapeToBuffer(child, buffer);
52
+ } else if (typeof child === "boolean" || child === null || child === void 0) {
53
+ continue;
54
+ } else if (child instanceof JSXNode) {
55
+ child.toStringToBuffer(buffer);
56
+ } else if (typeof child === "number" || child.isEscaped) {
57
+ buffer[0] += child;
58
+ } else {
59
+ childrenToStringToBuffer(child, buffer);
65
60
  }
61
+ }
66
62
  };
67
- export class JSXNode {
68
- constructor(tag, props, children) {
69
- this.isEscaped = true;
70
- this.tag = tag;
71
- this.props = props;
72
- this.children = children;
73
- }
74
- toString() {
75
- const buffer = [''];
76
- this.toStringToBuffer(buffer);
77
- return buffer[0];
78
- }
79
- toStringToBuffer(buffer) {
80
- const tag = this.tag;
81
- const props = this.props;
82
- let { children } = this;
83
- buffer[0] += `<${tag}`;
84
- const propsKeys = Object.keys(props || {});
85
- for (let i = 0, len = propsKeys.length; i < len; i++) {
86
- const v = props[propsKeys[i]];
87
- if (typeof v === 'string') {
88
- buffer[0] += ` ${propsKeys[i]}="`;
89
- escapeToBuffer(v, buffer);
90
- buffer[0] += '"';
91
- }
92
- else if (typeof v === 'number') {
93
- buffer[0] += ` ${propsKeys[i]}="${v}"`;
94
- }
95
- else if (v === null || v === undefined) {
96
- // Do nothing
97
- }
98
- else if (typeof v === 'boolean' && booleanAttributes.includes(propsKeys[i])) {
99
- if (v) {
100
- buffer[0] += ` ${propsKeys[i]}=""`;
101
- }
102
- }
103
- else if (propsKeys[i] === 'dangerouslySetInnerHTML') {
104
- if (children.length > 0) {
105
- throw 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.';
106
- }
107
- const escapedString = new String(v.__html);
108
- escapedString.isEscaped = true;
109
- children = [escapedString];
110
- }
111
- else {
112
- buffer[0] += ` ${propsKeys[i]}="`;
113
- escapeToBuffer(v.toString(), buffer);
114
- buffer[0] += '"';
115
- }
116
- }
117
- if (emptyTags.includes(tag)) {
118
- buffer[0] += '/>';
119
- return;
120
- }
121
- buffer[0] += '>';
122
- childrenToStringToBuffer(children, buffer);
123
- buffer[0] += `</${tag}>`;
124
- }
125
- }
126
- class JSXFunctionNode extends JSXNode {
127
- toStringToBuffer(buffer) {
128
- const { children } = this;
129
- const res = this.tag.call(null, {
130
- ...this.props,
131
- children: children.length <= 1 ? children[0] : children,
132
- });
133
- if (res instanceof JSXNode) {
134
- res.toStringToBuffer(buffer);
135
- }
136
- else if (typeof res === 'number' || res.isEscaped) {
137
- buffer[0] += res;
63
+ var JSXNode = class {
64
+ constructor(tag, props, children) {
65
+ this.isEscaped = true;
66
+ this.tag = tag;
67
+ this.props = props;
68
+ this.children = children;
69
+ }
70
+ toString() {
71
+ const buffer = [""];
72
+ this.toStringToBuffer(buffer);
73
+ return buffer[0];
74
+ }
75
+ toStringToBuffer(buffer) {
76
+ const tag = this.tag;
77
+ const props = this.props;
78
+ let { children } = this;
79
+ buffer[0] += `<${tag}`;
80
+ const propsKeys = Object.keys(props || {});
81
+ for (let i = 0, len = propsKeys.length; i < len; i++) {
82
+ const v = props[propsKeys[i]];
83
+ if (typeof v === "string") {
84
+ buffer[0] += ` ${propsKeys[i]}="`;
85
+ escapeToBuffer(v, buffer);
86
+ buffer[0] += '"';
87
+ } else if (typeof v === "number") {
88
+ buffer[0] += ` ${propsKeys[i]}="${v}"`;
89
+ } else if (v === null || v === void 0) {
90
+ } else if (typeof v === "boolean" && booleanAttributes.includes(propsKeys[i])) {
91
+ if (v) {
92
+ buffer[0] += ` ${propsKeys[i]}=""`;
138
93
  }
139
- else {
140
- escapeToBuffer(res, buffer);
94
+ } else if (propsKeys[i] === "dangerouslySetInnerHTML") {
95
+ if (children.length > 0) {
96
+ throw "Can only set one of `children` or `props.dangerouslySetInnerHTML`.";
141
97
  }
98
+ const escapedString = new String(v.__html);
99
+ escapedString.isEscaped = true;
100
+ children = [escapedString];
101
+ } else {
102
+ buffer[0] += ` ${propsKeys[i]}="`;
103
+ escapeToBuffer(v.toString(), buffer);
104
+ buffer[0] += '"';
105
+ }
142
106
  }
143
- }
144
- class JSXFragmentNode extends JSXNode {
145
- toStringToBuffer(buffer) {
146
- childrenToStringToBuffer(this.children, buffer);
147
- }
148
- }
149
- export { jsxFn as jsx };
150
- const jsxFn = (tag, props, ...children) => {
151
- if (typeof tag === 'function') {
152
- return new JSXFunctionNode(tag, props, children);
153
- }
154
- else {
155
- return new JSXNode(tag, props, children);
107
+ if (emptyTags.includes(tag)) {
108
+ buffer[0] += "/>";
109
+ return;
156
110
  }
111
+ buffer[0] += ">";
112
+ childrenToStringToBuffer(children, buffer);
113
+ buffer[0] += `</${tag}>`;
114
+ }
157
115
  };
158
- const shallowEqual = (a, b) => {
159
- if (a === b) {
160
- return true;
116
+ var JSXFunctionNode = class extends JSXNode {
117
+ toStringToBuffer(buffer) {
118
+ const { children } = this;
119
+ const res = this.tag.call(null, {
120
+ ...this.props,
121
+ children: children.length <= 1 ? children[0] : children
122
+ });
123
+ if (res instanceof JSXNode) {
124
+ res.toStringToBuffer(buffer);
125
+ } else if (typeof res === "number" || res.isEscaped) {
126
+ buffer[0] += res;
127
+ } else {
128
+ escapeToBuffer(res, buffer);
161
129
  }
162
- const aKeys = Object.keys(a);
163
- const bKeys = Object.keys(b);
164
- if (aKeys.length !== bKeys.length) {
165
- return false;
130
+ }
131
+ };
132
+ var JSXFragmentNode = class extends JSXNode {
133
+ toStringToBuffer(buffer) {
134
+ childrenToStringToBuffer(this.children, buffer);
135
+ }
136
+ };
137
+ var jsxFn = (tag, props, ...children) => {
138
+ if (typeof tag === "function") {
139
+ return new JSXFunctionNode(tag, props, children);
140
+ } else {
141
+ return new JSXNode(tag, props, children);
142
+ }
143
+ };
144
+ var shallowEqual = (a, b) => {
145
+ if (a === b) {
146
+ return true;
147
+ }
148
+ const aKeys = Object.keys(a);
149
+ const bKeys = Object.keys(b);
150
+ if (aKeys.length !== bKeys.length) {
151
+ return false;
152
+ }
153
+ for (let i = 0, len = aKeys.length; i < len; i++) {
154
+ if (a[aKeys[i]] !== b[aKeys[i]]) {
155
+ return false;
166
156
  }
167
- for (let i = 0, len = aKeys.length; i < len; i++) {
168
- if (a[aKeys[i]] !== b[aKeys[i]]) {
169
- return false;
170
- }
157
+ }
158
+ return true;
159
+ };
160
+ var memo = (component, propsAreEqual = shallowEqual) => {
161
+ let computed = void 0;
162
+ let prevProps = void 0;
163
+ return (props) => {
164
+ if (prevProps && !propsAreEqual(prevProps, props)) {
165
+ computed = void 0;
171
166
  }
172
- return true;
167
+ prevProps = props;
168
+ return computed || (computed = component(props));
169
+ };
173
170
  };
174
- export const memo = (component, propsAreEqual = shallowEqual) => {
175
- let computed = undefined;
176
- let prevProps = undefined;
177
- return ((props) => {
178
- if (prevProps && !propsAreEqual(prevProps, props)) {
179
- computed = undefined;
180
- }
181
- prevProps = props;
182
- return (computed || (computed = component(props)));
183
- });
171
+ var Fragment = (props) => {
172
+ return new JSXFragmentNode("", {}, props.children || []);
184
173
  };
185
- export const Fragment = (props) => {
186
- return new JSXFragmentNode('', {}, props.children || []);
174
+ export {
175
+ Fragment,
176
+ JSXNode,
177
+ jsxFn as jsx,
178
+ memo
187
179
  };
@@ -1,2 +1,3 @@
1
1
  import type { JSXNode } from '.';
2
+ export { Fragment } from '.';
2
3
  export declare function jsxDEV(tag: string | Function, props: Record<string, any>): JSXNode;