diff options
Diffstat (limited to 'cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js')
-rw-r--r-- | cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js b/cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js new file mode 100644 index 000000000..f72a7ecb9 --- /dev/null +++ b/cli/bench/testdata/npm/hono/dist/middleware/jsx/index.js @@ -0,0 +1,193 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Fragment = exports.memo = exports.jsx = exports.JSXNode = void 0; +const html_1 = require("../../utils/html"); +const emptyTags = [ + 'area', + 'base', + 'br', + 'col', + 'embed', + 'hr', + 'img', + 'input', + 'keygen', + 'link', + 'meta', + 'param', + 'source', + 'track', + 'wbr', +]; +const booleanAttributes = [ + 'allowfullscreen', + 'async', + 'autofocus', + 'autoplay', + 'checked', + 'controls', + 'default', + 'defer', + 'disabled', + 'formnovalidate', + 'hidden', + 'inert', + 'ismap', + 'itemscope', + 'loop', + 'multiple', + 'muted', + 'nomodule', + 'novalidate', + 'open', + 'playsinline', + 'readonly', + 'required', + 'reversed', + 'selected', +]; +const childrenToStringToBuffer = (children, buffer) => { + for (let i = 0, len = children.length; i < len; i++) { + const child = children[i]; + if (typeof child === 'string') { + (0, html_1.escapeToBuffer)(child, buffer); + } + else if (typeof child === 'boolean' || child === null || child === undefined) { + continue; + } + else if (child instanceof JSXNode) { + child.toStringToBuffer(buffer); + } + else if (typeof child === 'number' || child.isEscaped) { + buffer[0] += child; + } + else { + // `child` type is `Child[]`, so stringify recursively + childrenToStringToBuffer(child, buffer); + } + } +}; +class JSXNode { + constructor(tag, props, children) { + this.isEscaped = true; + this.tag = tag; + this.props = props; + this.children = children; + } + toString() { + const buffer = ['']; + this.toStringToBuffer(buffer); + return buffer[0]; + } + toStringToBuffer(buffer) { + const tag = this.tag; + const props = this.props; + let { children } = this; + buffer[0] += `<${tag}`; + const propsKeys = Object.keys(props || {}); + for (let i = 0, len = propsKeys.length; i < len; i++) { + const v = props[propsKeys[i]]; + if (typeof v === 'string') { + buffer[0] += ` ${propsKeys[i]}="`; + (0, html_1.escapeToBuffer)(v, buffer); + buffer[0] += '"'; + } + else if (typeof v === 'number') { + buffer[0] += ` ${propsKeys[i]}="${v}"`; + } + else if (v === null || v === undefined) { + // Do nothing + } + else if (typeof v === 'boolean' && booleanAttributes.includes(propsKeys[i])) { + if (v) { + buffer[0] += ` ${propsKeys[i]}=""`; + } + } + else if (propsKeys[i] === 'dangerouslySetInnerHTML') { + if (children.length > 0) { + throw 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.'; + } + const escapedString = new String(v.__html); + escapedString.isEscaped = true; + children = [escapedString]; + } + else { + buffer[0] += ` ${propsKeys[i]}="`; + (0, html_1.escapeToBuffer)(v.toString(), buffer); + buffer[0] += '"'; + } + } + if (emptyTags.includes(tag)) { + buffer[0] += '/>'; + return; + } + buffer[0] += '>'; + childrenToStringToBuffer(children, buffer); + buffer[0] += `</${tag}>`; + } +} +exports.JSXNode = JSXNode; +class JSXFunctionNode extends JSXNode { + toStringToBuffer(buffer) { + const { children } = this; + const res = this.tag.call(null, { + ...this.props, + children: children.length <= 1 ? children[0] : children, + }); + if (res instanceof JSXNode) { + res.toStringToBuffer(buffer); + } + else if (typeof res === 'number' || res.isEscaped) { + buffer[0] += res; + } + else { + (0, html_1.escapeToBuffer)(res, buffer); + } + } +} +class JSXFragmentNode extends JSXNode { + toStringToBuffer(buffer) { + childrenToStringToBuffer(this.children, buffer); + } +} +const jsxFn = (tag, props, ...children) => { + if (typeof tag === 'function') { + return new JSXFunctionNode(tag, props, children); + } + else { + return new JSXNode(tag, props, children); + } +}; +exports.jsx = jsxFn; +const shallowEqual = (a, b) => { + if (a === b) { + return true; + } + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + if (aKeys.length !== bKeys.length) { + return false; + } + for (let i = 0, len = aKeys.length; i < len; i++) { + if (a[aKeys[i]] !== b[aKeys[i]]) { + return false; + } + } + return true; +}; +const memo = (component, propsAreEqual = shallowEqual) => { + let computed = undefined; + let prevProps = undefined; + return ((props) => { + if (prevProps && !propsAreEqual(prevProps, props)) { + computed = undefined; + } + prevProps = props; + return (computed || (computed = component(props))); + }); +}; +exports.memo = memo; +const Fragment = (props) => { + return new JSXFragmentNode('', {}, props.children || []); +}; +exports.Fragment = Fragment; |