UNPKG

11.3 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../../src/react/experimental-server-rendering/utils.js"],"names":["matchHtmlRegExp","createMarkupForRoot","ROOT_ATTRIBUTE_NAME","isCustomComponent","realm","tagName","propsValue","indexOf","is","StringValue","escapeHtml","string","str","match","exec","escape","html","index","lastIndex","length","charCodeAt","substring","normalizeNode","reactNode","Array","isArray","newReactNode","element","undefined","lastNode","push","AbstractValue","convertValueToNode","value","NumberValue","createHtmlEscapeHelper","escapeHelperAst","toString","plugins","helper","ECMAScriptSourceFunctionValue","body","uniqueOrderedTag","functionBodyUniqueTagSeed","$ECMAScriptCode","$FormalParameters","params","createArrayHelper","arrayHelper","getNonChildrenInnerMarkup","innerHTML","ObjectValue","_html","content","quoteAttributeValueForBrowser"],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2017-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n/* @flow */\n\n// Warning: This code is experimental and might not fully work. There is no guarantee\n// that is up-to-date with the curent react-dom/server logic and there may also be\n// security holes in the string escaping because of this.\n\nimport type { Realm } from \"../../realm.js\";\nimport type { FunctionBodyAstNode } from \"../../types.js\";\nimport { parseExpression } from \"@babel/parser\";\nimport {\n AbstractObjectValue,\n AbstractValue,\n ECMAScriptSourceFunctionValue,\n NumberValue,\n ObjectValue,\n StringValue,\n Value,\n} from \"../../values/index.js\";\nimport { getProperty } from \"../utils.js\";\nimport invariant from \"../../invariant.js\";\nimport type { ReactNode } from \"./rendering.js\";\nimport { ROOT_ATTRIBUTE_NAME } from \"./dom-config.js\";\n\nconst matchHtmlRegExp = /[\"'&<>]/;\n\nexport function createMarkupForRoot(): string {\n return ROOT_ATTRIBUTE_NAME + '=\"\"';\n}\n\nexport function isCustomComponent(\n realm: Realm,\n tagName: string,\n propsValue: ObjectValue | AbstractObjectValue\n): boolean {\n if (tagName.indexOf(\"-\") === -1) {\n let is = getProperty(realm, propsValue, \"is\");\n return is instanceof StringValue;\n }\n switch (tagName) {\n case \"annotation-xml\":\n case \"color-profile\":\n case \"font-face\":\n case \"font-face-src\":\n case \"font-face-uri\":\n case \"font-face-format\":\n case \"font-face-name\":\n case \"missing-glyph\":\n return false;\n default:\n return true;\n }\n}\n\n// $FlowFixMe: we don't want to provides types here as we inject this function into source\nexport function escapeHtml(string): string {\n if (typeof string === \"boolean\" || typeof string === \"number\") {\n return \"\" + string;\n }\n let str = \"\" + string;\n let match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n let escape;\n let html = \"\";\n let index = 0;\n let lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \"&quot;\";\n break;\n case 38:\n escape = \"&amp;\";\n break;\n case 39:\n escape = \"&#x27;\";\n break;\n case 60:\n escape = \"&lt;\";\n break;\n case 62:\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index ? html + str.substring(lastIndex, index) : html;\n}\n\nexport function normalizeNode(realm: Realm, reactNode: ReactNode): ReactNode {\n if (Array.isArray(reactNode)) {\n let newReactNode;\n\n for (let element of reactNode) {\n if (typeof element === \"string\") {\n if (newReactNode === undefined) {\n newReactNode = element;\n } else if (typeof newReactNode === \"string\") {\n newReactNode += element;\n } else {\n let lastNode = newReactNode[newReactNode.length - 1];\n if (typeof lastNode === \"string\") {\n newReactNode[newReactNode.length - 1] += element;\n } else {\n newReactNode.push(element);\n }\n }\n } else if (newReactNode === undefined) {\n newReactNode = ([element]: Array<ReactNode>);\n } else if (typeof newReactNode === \"string\") {\n newReactNode = ([newReactNode, element]: Array<ReactNode>);\n } else {\n newReactNode.push(element);\n }\n }\n invariant(newReactNode !== undefined);\n return newReactNode;\n } else if (typeof reactNode === \"string\" || reactNode instanceof AbstractValue) {\n return reactNode;\n }\n invariant(false, \"TODO\");\n}\n\nexport function convertValueToNode(value: Value): ReactNode {\n if (value instanceof AbstractValue) {\n return value;\n } else if (value instanceof StringValue || value instanceof NumberValue) {\n return value.value + \"\";\n }\n invariant(false, \"TODO\");\n}\n\nexport function createHtmlEscapeHelper(realm: Realm): ECMAScriptSourceFunctionValue {\n let escapeHelperAst = parseExpression(escapeHtml.toString(), { plugins: [\"flow\"] });\n let helper = new ECMAScriptSourceFunctionValue(realm);\n let body = escapeHelperAst.body;\n ((body: any): FunctionBodyAstNode).uniqueOrderedTag = realm.functionBodyUniqueTagSeed++;\n helper.$ECMAScriptCode = body;\n helper.$FormalParameters = escapeHelperAst.params;\n return helper;\n}\n\nexport function createArrayHelper(realm: Realm): ECMAScriptSourceFunctionValue {\n let arrayHelper = `\n function arrayHelper(array) {\n let length = array.length;\n let i = 0;\n let str = \"\";\n let item;\n\n while (i < length) {\n item = array[i++];\n if (previousWasTextNode === true) {\n str += \"<!-- -->\" + item;\n } else {\n str += item;\n }\n previousWasTextNode = item[0] !== \"<\";\n }\n return str;\n }\n `;\n\n let escapeHelperAst = parseExpression(arrayHelper, { plugins: [\"flow\"] });\n let helper = new ECMAScriptSourceFunctionValue(realm);\n let body = escapeHelperAst.body;\n ((body: any): FunctionBodyAstNode).uniqueOrderedTag = realm.functionBodyUniqueTagSeed++;\n helper.$ECMAScriptCode = body;\n helper.$FormalParameters = escapeHelperAst.params;\n return helper;\n}\n\nexport function getNonChildrenInnerMarkup(\n realm: Realm,\n propsValue: ObjectValue | AbstractObjectValue\n): ReactNode | null {\n let innerHTML = getProperty(realm, propsValue, \"dangerouslySetInnerHTML\");\n\n if (innerHTML instanceof ObjectValue) {\n let _html = getProperty(realm, innerHTML, \"dangerouslySetInnerHTML\");\n\n if (_html instanceof StringValue) {\n return _html.value;\n }\n } else {\n let content = getProperty(realm, propsValue, \"children\");\n\n if (content instanceof StringValue || content instanceof NumberValue) {\n return escapeHtml(content.value);\n }\n }\n return null;\n}\n\nexport function quoteAttributeValueForBrowser(value: string): string {\n return '\"' + escapeHtml(value) + '\"';\n}\n"],"file":"utils.js"}
\No newline at end of file