Best JavaScript code snippet using playwright-internal
compiler-core.cjs.js
Source:compiler-core.cjs.js
...1081 0x9e: 0x017e,1082 0x9f: 0x01781083};1084function hoistStatic(root, context) {1085 walk(root.children, context, new Map(), isSingleElementRoot(root, root.children[0]));1086}1087function isSingleElementRoot(root, child) {1088 const { children } = root;1089 return (children.length === 1 &&1090 child.type === 1 /* ELEMENT */ &&1091 !isSlotOutlet(child));1092}1093function walk(children, context, resultCache, doNotHoistNode = false) {1094 for (let i = 0; i < children.length; i++) {1095 const child = children[i];1096 // only plain elements are eligible for hoisting.1097 if (child.type === 1 /* ELEMENT */ &&1098 child.tagType === 0 /* ELEMENT */) {1099 if (!doNotHoistNode && isStaticNode(child, resultCache)) {1100 child.codegenNode = context.hoist(child.codegenNode);1101 continue;1102 }1103 else {1104 // node may contain dynamic children, but its props may be eligible for1105 // hoisting.1106 const flag = getPatchFlag(child);1107 if (!flag ||1108 flag === 32 /* NEED_PATCH */ ||1109 flag === 1 /* TEXT */) {1110 let codegenNode = child.codegenNode;1111 if (codegenNode.callee === APPLY_DIRECTIVES) {1112 codegenNode = codegenNode.arguments[0];1113 }1114 const props = codegenNode.arguments[1];1115 if (props && props !== `null`) {1116 codegenNode.arguments[1] = context.hoist(props);1117 }1118 }1119 }1120 }1121 if (child.type === 1 /* ELEMENT */) {1122 walk(child.children, context, resultCache);1123 }1124 else if (child.type === 11 /* FOR */) {1125 // Do not hoist v-for single child because it has to be a block1126 walk(child.children, context, resultCache, child.children.length === 1);1127 }1128 else if (child.type === 9 /* IF */) {1129 for (let i = 0; i < child.branches.length; i++) {1130 const branchChildren = child.branches[i].children;1131 // Do not hoist v-if single child because it has to be a block1132 walk(branchChildren, context, resultCache, branchChildren.length === 1);1133 }1134 }1135 }1136}1137function getPatchFlag(node) {1138 let codegenNode = node.codegenNode;1139 if (codegenNode.callee === APPLY_DIRECTIVES) {1140 codegenNode = codegenNode.arguments[0];1141 }1142 const flag = codegenNode.arguments[3];1143 return flag ? parseInt(flag, 10) : undefined;1144}1145function isStaticNode(node, resultCache) {1146 switch (node.type) {1147 case 1 /* ELEMENT */:1148 if (node.tagType !== 0 /* ELEMENT */) {1149 return false;1150 }1151 if (resultCache.has(node)) {1152 return resultCache.get(node);1153 }1154 const flag = getPatchFlag(node);1155 if (!flag) {1156 // element self is static. check its children.1157 for (let i = 0; i < node.children.length; i++) {1158 if (!isStaticNode(node.children[i], resultCache)) {1159 resultCache.set(node, false);1160 return false;1161 }1162 }1163 resultCache.set(node, true);1164 return true;1165 }1166 else {1167 return false;1168 }1169 case 2 /* TEXT */:1170 case 3 /* COMMENT */:1171 return true;1172 case 9 /* IF */:1173 case 11 /* FOR */:1174 case 5 /* INTERPOLATION */:1175 case 8 /* COMPOUND_EXPRESSION */:1176 return false;1177 default:1178 return false;1179 }1180}1181function createTransformContext(root, { prefixIdentifiers = false, hoistStatic = false, nodeTransforms = [], directiveTransforms = {}, onError = defaultOnError }) {1182 const context = {1183 root,1184 helpers: new Set(),1185 components: new Set(),1186 directives: new Set(),1187 hoists: [],1188 identifiers: {},1189 scopes: {1190 vFor: 0,1191 vSlot: 0,1192 vPre: 0,1193 vOnce: 01194 },1195 prefixIdentifiers,1196 hoistStatic,1197 nodeTransforms,1198 directiveTransforms,1199 onError,1200 parent: null,1201 currentNode: root,1202 childIndex: 0,1203 helper(name) {1204 context.helpers.add(name);1205 return name;1206 },1207 helperString(name) {1208 return ((context.prefixIdentifiers ? `` : `_`) +1209 helperNameMap[context.helper(name)]);1210 },1211 replaceNode(node) {1212 /* istanbul ignore if */1213 {1214 if (!context.currentNode) {1215 throw new Error(`Node being replaced is already removed.`);1216 }1217 if (!context.parent) {1218 throw new Error(`Cannot replace root node.`);1219 }1220 }1221 context.parent.children[context.childIndex] = context.currentNode = node;1222 },1223 removeNode(node) {1224 if ( !context.parent) {1225 throw new Error(`Cannot remove root node.`);1226 }1227 const list = context.parent.children;1228 const removalIndex = node1229 ? list.indexOf(node)1230 : context.currentNode1231 ? context.childIndex1232 : -1;1233 /* istanbul ignore if */1234 if ( removalIndex < 0) {1235 throw new Error(`node being removed is not a child of current parent`);1236 }1237 if (!node || node === context.currentNode) {1238 // current node removed1239 context.currentNode = null;1240 context.onNodeRemoved();1241 }1242 else {1243 // sibling node removed1244 if (context.childIndex > removalIndex) {1245 context.childIndex--;1246 context.onNodeRemoved();1247 }1248 }1249 context.parent.children.splice(removalIndex, 1);1250 },1251 onNodeRemoved: () => { },1252 addIdentifiers(exp) {1253 // identifier tracking only happens in non-browser builds.1254 {1255 if (isString(exp)) {1256 addId(exp);1257 }1258 else if (exp.identifiers) {1259 exp.identifiers.forEach(addId);1260 }1261 else if (exp.type === 4 /* SIMPLE_EXPRESSION */) {1262 addId(exp.content);1263 }1264 }1265 },1266 removeIdentifiers(exp) {1267 {1268 if (isString(exp)) {1269 removeId(exp);1270 }1271 else if (exp.identifiers) {1272 exp.identifiers.forEach(removeId);1273 }1274 else if (exp.type === 4 /* SIMPLE_EXPRESSION */) {1275 removeId(exp.content);1276 }1277 }1278 },1279 hoist(exp) {1280 context.hoists.push(exp);1281 return createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc);1282 }1283 };1284 function addId(id) {1285 const { identifiers } = context;1286 if (identifiers[id] === undefined) {1287 identifiers[id] = 0;1288 }1289 identifiers[id]++;1290 }1291 function removeId(id) {1292 context.identifiers[id]--;1293 }1294 return context;1295}1296function transform(root, options) {1297 const context = createTransformContext(root, options);1298 traverseNode(root, context);1299 if (options.hoistStatic) {1300 hoistStatic(root, context);1301 }1302 finalizeRoot(root, context);1303}1304function finalizeRoot(root, context) {1305 const { helper } = context;1306 const { children } = root;1307 const child = children[0];1308 if (isSingleElementRoot(root, child) && child.codegenNode) {1309 // turn root element into a block1310 root.codegenNode = createBlockExpression(child.codegenNode.arguments, context);1311 }1312 else if (children.length === 1) {1313 // - single <slot/>, IfNode, ForNode: already blocks.1314 // - single text node: always patched.1315 // - transform calls without transformElement (only during tests)1316 // Just generate the node as-is1317 root.codegenNode = child;1318 }1319 else if (children.length > 1) {1320 // root has multiple nodes - return a fragment block.1321 root.codegenNode = createBlockExpression([helper(FRAGMENT), `null`, root.children], context);1322 }
...
compiler-dom.global.js
Source:compiler-dom.global.js
...1055 0x9e: 0x017e,1056 0x9f: 0x01781057 };1058 function hoistStatic(root, context) {1059 walk(root.children, context, new Map(), isSingleElementRoot(root, root.children[0]));1060 }1061 function isSingleElementRoot(root, child) {1062 const { children } = root;1063 return (children.length === 1 &&1064 child.type === 1 /* ELEMENT */ &&1065 !isSlotOutlet(child));1066 }1067 function walk(children, context, resultCache, doNotHoistNode = false) {1068 for (let i = 0; i < children.length; i++) {1069 const child = children[i];1070 // only plain elements are eligible for hoisting.1071 if (child.type === 1 /* ELEMENT */ &&1072 child.tagType === 0 /* ELEMENT */) {1073 if (!doNotHoistNode && isStaticNode(child, resultCache)) {1074 child.codegenNode = context.hoist(child.codegenNode);1075 continue;1076 }1077 else {1078 // node may contain dynamic children, but its props may be eligible for1079 // hoisting.1080 const flag = getPatchFlag(child);1081 if (!flag ||1082 flag === 32 /* NEED_PATCH */ ||1083 flag === 1 /* TEXT */) {1084 let codegenNode = child.codegenNode;1085 if (codegenNode.callee === APPLY_DIRECTIVES) {1086 codegenNode = codegenNode.arguments[0];1087 }1088 const props = codegenNode.arguments[1];1089 if (props && props !== `null`) {1090 codegenNode.arguments[1] = context.hoist(props);1091 }1092 }1093 }1094 }1095 if (child.type === 1 /* ELEMENT */) {1096 walk(child.children, context, resultCache);1097 }1098 else if (child.type === 11 /* FOR */) {1099 // Do not hoist v-for single child because it has to be a block1100 walk(child.children, context, resultCache, child.children.length === 1);1101 }1102 else if (child.type === 9 /* IF */) {1103 for (let i = 0; i < child.branches.length; i++) {1104 const branchChildren = child.branches[i].children;1105 // Do not hoist v-if single child because it has to be a block1106 walk(branchChildren, context, resultCache, branchChildren.length === 1);1107 }1108 }1109 }1110 }1111 function getPatchFlag(node) {1112 let codegenNode = node.codegenNode;1113 if (codegenNode.callee === APPLY_DIRECTIVES) {1114 codegenNode = codegenNode.arguments[0];1115 }1116 const flag = codegenNode.arguments[3];1117 return flag ? parseInt(flag, 10) : undefined;1118 }1119 function isStaticNode(node, resultCache) {1120 switch (node.type) {1121 case 1 /* ELEMENT */:1122 if (node.tagType !== 0 /* ELEMENT */) {1123 return false;1124 }1125 if (resultCache.has(node)) {1126 return resultCache.get(node);1127 }1128 const flag = getPatchFlag(node);1129 if (!flag) {1130 // element self is static. check its children.1131 for (let i = 0; i < node.children.length; i++) {1132 if (!isStaticNode(node.children[i], resultCache)) {1133 resultCache.set(node, false);1134 return false;1135 }1136 }1137 resultCache.set(node, true);1138 return true;1139 }1140 else {1141 return false;1142 }1143 case 2 /* TEXT */:1144 case 3 /* COMMENT */:1145 return true;1146 case 9 /* IF */:1147 case 11 /* FOR */:1148 case 5 /* INTERPOLATION */:1149 case 8 /* COMPOUND_EXPRESSION */:1150 return false;1151 default:1152 return false;1153 }1154 }1155 function createTransformContext(root, { prefixIdentifiers = false, hoistStatic = false, nodeTransforms = [], directiveTransforms = {}, onError = defaultOnError }) {1156 const context = {1157 root,1158 helpers: new Set(),1159 components: new Set(),1160 directives: new Set(),1161 hoists: [],1162 identifiers: {},1163 scopes: {1164 vFor: 0,1165 vSlot: 0,1166 vPre: 0,1167 vOnce: 01168 },1169 prefixIdentifiers,1170 hoistStatic,1171 nodeTransforms,1172 directiveTransforms,1173 onError,1174 parent: null,1175 currentNode: root,1176 childIndex: 0,1177 helper(name) {1178 context.helpers.add(name);1179 return name;1180 },1181 helperString(name) {1182 return ((context.prefixIdentifiers ? `` : `_`) +1183 helperNameMap[context.helper(name)]);1184 },1185 replaceNode(node) {1186 /* istanbul ignore if */1187 {1188 if (!context.currentNode) {1189 throw new Error(`Node being replaced is already removed.`);1190 }1191 if (!context.parent) {1192 throw new Error(`Cannot replace root node.`);1193 }1194 }1195 context.parent.children[context.childIndex] = context.currentNode = node;1196 },1197 removeNode(node) {1198 if ( !context.parent) {1199 throw new Error(`Cannot remove root node.`);1200 }1201 const list = context.parent.children;1202 const removalIndex = node1203 ? list.indexOf(node)1204 : context.currentNode1205 ? context.childIndex1206 : -1;1207 /* istanbul ignore if */1208 if ( removalIndex < 0) {1209 throw new Error(`node being removed is not a child of current parent`);1210 }1211 if (!node || node === context.currentNode) {1212 // current node removed1213 context.currentNode = null;1214 context.onNodeRemoved();1215 }1216 else {1217 // sibling node removed1218 if (context.childIndex > removalIndex) {1219 context.childIndex--;1220 context.onNodeRemoved();1221 }1222 }1223 context.parent.children.splice(removalIndex, 1);1224 },1225 onNodeRemoved: () => { },1226 addIdentifiers(exp) {1227 },1228 removeIdentifiers(exp) {1229 },1230 hoist(exp) {1231 context.hoists.push(exp);1232 return createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc);1233 }1234 };1235 return context;1236 }1237 function transform(root, options) {1238 const context = createTransformContext(root, options);1239 traverseNode(root, context);1240 if (options.hoistStatic) {1241 hoistStatic(root, context);1242 }1243 finalizeRoot(root, context);1244 }1245 function finalizeRoot(root, context) {1246 const { helper } = context;1247 const { children } = root;1248 const child = children[0];1249 if (isSingleElementRoot(root, child) && child.codegenNode) {1250 // turn root element into a block1251 root.codegenNode = createBlockExpression(child.codegenNode.arguments, context);1252 }1253 else if (children.length === 1) {1254 // - single <slot/>, IfNode, ForNode: already blocks.1255 // - single text node: always patched.1256 // - transform calls without transformElement (only during tests)1257 // Just generate the node as-is1258 root.codegenNode = child;1259 }1260 else if (children.length > 1) {1261 // root has multiple nodes - return a fragment block.1262 root.codegenNode = createBlockExpression([helper(FRAGMENT), `null`, root.children], context);1263 }
...
compiler-dom.esm-browser.js
Source:compiler-dom.esm-browser.js
...1053 0x9e: 0x017e,1054 0x9f: 0x01781055};1056function hoistStatic(root, context) {1057 walk(root.children, context, new Map(), isSingleElementRoot(root, root.children[0]));1058}1059function isSingleElementRoot(root, child) {1060 const { children } = root;1061 return (children.length === 1 &&1062 child.type === 1 /* ELEMENT */ &&1063 !isSlotOutlet(child));1064}1065function walk(children, context, resultCache, doNotHoistNode = false) {1066 for (let i = 0; i < children.length; i++) {1067 const child = children[i];1068 // only plain elements are eligible for hoisting.1069 if (child.type === 1 /* ELEMENT */ &&1070 child.tagType === 0 /* ELEMENT */) {1071 if (!doNotHoistNode && isStaticNode(child, resultCache)) {1072 child.codegenNode = context.hoist(child.codegenNode);1073 continue;1074 }1075 else {1076 // node may contain dynamic children, but its props may be eligible for1077 // hoisting.1078 const flag = getPatchFlag(child);1079 if (!flag ||1080 flag === 32 /* NEED_PATCH */ ||1081 flag === 1 /* TEXT */) {1082 let codegenNode = child.codegenNode;1083 if (codegenNode.callee === APPLY_DIRECTIVES) {1084 codegenNode = codegenNode.arguments[0];1085 }1086 const props = codegenNode.arguments[1];1087 if (props && props !== `null`) {1088 codegenNode.arguments[1] = context.hoist(props);1089 }1090 }1091 }1092 }1093 if (child.type === 1 /* ELEMENT */) {1094 walk(child.children, context, resultCache);1095 }1096 else if (child.type === 11 /* FOR */) {1097 // Do not hoist v-for single child because it has to be a block1098 walk(child.children, context, resultCache, child.children.length === 1);1099 }1100 else if (child.type === 9 /* IF */) {1101 for (let i = 0; i < child.branches.length; i++) {1102 const branchChildren = child.branches[i].children;1103 // Do not hoist v-if single child because it has to be a block1104 walk(branchChildren, context, resultCache, branchChildren.length === 1);1105 }1106 }1107 }1108}1109function getPatchFlag(node) {1110 let codegenNode = node.codegenNode;1111 if (codegenNode.callee === APPLY_DIRECTIVES) {1112 codegenNode = codegenNode.arguments[0];1113 }1114 const flag = codegenNode.arguments[3];1115 return flag ? parseInt(flag, 10) : undefined;1116}1117function isStaticNode(node, resultCache) {1118 switch (node.type) {1119 case 1 /* ELEMENT */:1120 if (node.tagType !== 0 /* ELEMENT */) {1121 return false;1122 }1123 if (resultCache.has(node)) {1124 return resultCache.get(node);1125 }1126 const flag = getPatchFlag(node);1127 if (!flag) {1128 // element self is static. check its children.1129 for (let i = 0; i < node.children.length; i++) {1130 if (!isStaticNode(node.children[i], resultCache)) {1131 resultCache.set(node, false);1132 return false;1133 }1134 }1135 resultCache.set(node, true);1136 return true;1137 }1138 else {1139 return false;1140 }1141 case 2 /* TEXT */:1142 case 3 /* COMMENT */:1143 return true;1144 case 9 /* IF */:1145 case 11 /* FOR */:1146 case 5 /* INTERPOLATION */:1147 case 8 /* COMPOUND_EXPRESSION */:1148 return false;1149 default:1150 return false;1151 }1152}1153function createTransformContext(root, { prefixIdentifiers = false, hoistStatic = false, nodeTransforms = [], directiveTransforms = {}, onError = defaultOnError }) {1154 const context = {1155 root,1156 helpers: new Set(),1157 components: new Set(),1158 directives: new Set(),1159 hoists: [],1160 identifiers: {},1161 scopes: {1162 vFor: 0,1163 vSlot: 0,1164 vPre: 0,1165 vOnce: 01166 },1167 prefixIdentifiers,1168 hoistStatic,1169 nodeTransforms,1170 directiveTransforms,1171 onError,1172 parent: null,1173 currentNode: root,1174 childIndex: 0,1175 helper(name) {1176 context.helpers.add(name);1177 return name;1178 },1179 helperString(name) {1180 return ((context.prefixIdentifiers ? `` : `_`) +1181 helperNameMap[context.helper(name)]);1182 },1183 replaceNode(node) {1184 /* istanbul ignore if */1185 {1186 if (!context.currentNode) {1187 throw new Error(`Node being replaced is already removed.`);1188 }1189 if (!context.parent) {1190 throw new Error(`Cannot replace root node.`);1191 }1192 }1193 context.parent.children[context.childIndex] = context.currentNode = node;1194 },1195 removeNode(node) {1196 if ( !context.parent) {1197 throw new Error(`Cannot remove root node.`);1198 }1199 const list = context.parent.children;1200 const removalIndex = node1201 ? list.indexOf(node)1202 : context.currentNode1203 ? context.childIndex1204 : -1;1205 /* istanbul ignore if */1206 if ( removalIndex < 0) {1207 throw new Error(`node being removed is not a child of current parent`);1208 }1209 if (!node || node === context.currentNode) {1210 // current node removed1211 context.currentNode = null;1212 context.onNodeRemoved();1213 }1214 else {1215 // sibling node removed1216 if (context.childIndex > removalIndex) {1217 context.childIndex--;1218 context.onNodeRemoved();1219 }1220 }1221 context.parent.children.splice(removalIndex, 1);1222 },1223 onNodeRemoved: () => { },1224 addIdentifiers(exp) {1225 },1226 removeIdentifiers(exp) {1227 },1228 hoist(exp) {1229 context.hoists.push(exp);1230 return createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc);1231 }1232 };1233 return context;1234}1235function transform(root, options) {1236 const context = createTransformContext(root, options);1237 traverseNode(root, context);1238 if (options.hoistStatic) {1239 hoistStatic(root, context);1240 }1241 finalizeRoot(root, context);1242}1243function finalizeRoot(root, context) {1244 const { helper } = context;1245 const { children } = root;1246 const child = children[0];1247 if (isSingleElementRoot(root, child) && child.codegenNode) {1248 // turn root element into a block1249 root.codegenNode = createBlockExpression(child.codegenNode.arguments, context);1250 }1251 else if (children.length === 1) {1252 // - single <slot/>, IfNode, ForNode: already blocks.1253 // - single text node: always patched.1254 // - transform calls without transformElement (only during tests)1255 // Just generate the node as-is1256 root.codegenNode = child;1257 }1258 else if (children.length > 1) {1259 // root has multiple nodes - return a fragment block.1260 root.codegenNode = createBlockExpression([helper(FRAGMENT), `null`, root.children], context);1261 }
...
note-ast-transform.js
Source:note-ast-transform.js
...1750 function hoistStatic(root, context) {1751 walk(root, context, new Map(), 1752 // Root node is unfortunately non-hoistable due to potential parent1753 // fallthrough attributes.1754 isSingleElementRoot(root, root.children[0]));1755 }1756 /**1757 * context.hoists: []1758 */1759 function hoist(exp) {1760 context.hoists.push(exp);1761 const identifier = createSimpleExpression(`_hoisted_${context.hoists.length}`, false, exp.loc, true);1762 identifier.hoisted = exp;1763 return identifier;1764 }1765 function isSingleElementRoot(root, child) {1766 const { children } = root;1767 return (children.length === 1 &&1768 child.type === 1 /* ELEMENT */ &&1769 !isSlotOutlet(child));1770 }1771 function walk(node, context, resultCache, doNotHoistNode = false) {1772 let hasHoistedNode = false;1773 // Some transforms, e.g. transformAssetUrls from @vue/compiler-sfc, replaces1774 // static bindings with expressions. These expressions are guaranteed to be1775 // constant so they are still eligible for hoisting, but they are only1776 // available at runtime and therefore cannot be evaluated ahead of time.1777 // This is only a concern for pre-stringification (via transformHoist by1778 // @vue/compiler-dom), but doing it here allows us to perform only one full1779 // walk of the AST and allow `stringifyStatic` to stop walking as soon as its1780 // stringficiation threshold is met.1781 let hasRuntimeConstant = false;1782 const { children } = node;1783 for (let i = 0; i < children.length; i++) {1784 const child = children[i];1785 // only plain elements & text calls are eligible for hoisting.1786 if (child.type === 1 /* ELEMENT */ &&1787 child.tagType === 0 /* ELEMENT */) {1788 let staticType;1789 if (!doNotHoistNode &&1790 (staticType = getStaticType(child, resultCache)) > 0) {1791 if (staticType === 2 /* HAS_RUNTIME_CONSTANT */) {1792 hasRuntimeConstant = true;1793 }1794 child.codegenNode.patchFlag =1795 -1 /* HOISTED */ + ( ` /* HOISTED */` );1796 child.codegenNode = context.hoist(child.codegenNode);1797 hasHoistedNode = true;1798 continue;1799 }1800 else {1801 // node may contain dynamic children, but its props may be eligible for1802 // hoisting.1803 const codegenNode = child.codegenNode;1804 if (codegenNode.type === 13 /* VNODE_CALL */) {1805 const flag = getPatchFlag(codegenNode);1806 if ((!flag ||1807 flag === 512 /* NEED_PATCH */ ||1808 flag === 1 /* TEXT */) &&1809 !hasNonHoistableProps(child)) {1810 const props = getNodeProps(child);1811 if (props) {1812 codegenNode.props = context.hoist(props);1813 }1814 }1815 }1816 }1817 }1818 else if (child.type === 12 /* TEXT_CALL */) {1819 const staticType = getStaticType(child.content, resultCache);1820 if (staticType > 0) {1821 if (staticType === 2 /* HAS_RUNTIME_CONSTANT */) {1822 hasRuntimeConstant = true;1823 }1824 child.codegenNode = context.hoist(child.codegenNode);1825 hasHoistedNode = true;1826 }1827 }1828 // walk further1829 if (child.type === 1 /* ELEMENT */) {1830 walk(child, context, resultCache);1831 }1832 else if (child.type === 11 /* FOR */) {1833 // Do not hoist v-for single child because it has to be a block1834 walk(child, context, resultCache, child.children.length === 1);1835 }1836 else if (child.type === 9 /* IF */) {1837 for (let i = 0; i < child.branches.length; i++) {1838 // Do not hoist v-if single child because it has to be a block1839 walk(child.branches[i], context, resultCache, child.branches[i].children.length === 1);1840 }1841 }1842 }1843 if (!hasRuntimeConstant && hasHoistedNode && context.transformHoist) {1844 context.transformHoist(children, context, node);1845 }1846 }1847 function createRootCodegen(root, context) {1848 const { helper } = context;1849 const { children } = root;1850 if (children.length === 1) {1851 const child = children[0];1852 // if the single child is an element, turn it into a block.1853 if (isSingleElementRoot(root, child) && child.codegenNode) {1854 // single element root is never hoisted so codegenNode will never be1855 // SimpleExpressionNode1856 const codegenNode = child.codegenNode;1857 if (codegenNode.type === 13 /* VNODE_CALL */) {1858 codegenNode.isBlock = true;1859 helper(OPEN_BLOCK);1860 helper(CREATE_BLOCK);1861 }1862 root.codegenNode = codegenNode;1863 }1864 else {1865 // - single <slot/>, IfNode, ForNode: already blocks.1866 // - single text node: always patched.1867 // root codegen falls through via genNode()...
stable_fragment.js
Source:stable_fragment.js
...128 const { children } = root;129 if (children.length === 1) {130 const child = children[0];131 // if the single child is an element, turn it into a block.132 if (isSingleElementRoot(root, child) && child.codegenNode) {133 // single element root is never hoisted so codegenNode will never be134 // SimpleExpressionNode135 const codegenNode = child.codegenNode;136 if (codegenNode.type === 13 /* VNODE_CALL */) {137 codegenNode.isBlock = true;138 helper(OPEN_BLOCK);139 helper(CREATE_BLOCK);140 }141 root.codegenNode = codegenNode;142 }143 else {144 // - single <slot/>, IfNode, ForNode: already blocks.145 // - single text node: always patched.146 // root codegen falls through via genNode()...
transform.js
Source:transform.js
...176 const { helper } = context177 const { children } = root178 if (children.length === 1) {179 const child = children[0]180 if (isSingleElementRoot(root, child) && child.codegenNode) {181 const codegenNode = child.codegenNode182 if (codegenNode.type === 13) {183 makeBlock(codegenNode, context)184 }185 root.codegenNode = codegenNode186 } else {187 root.codegenNode = child188 }189 } else if (children.length > 1) {190 let patchFlag = 64191 let patchFlagText = PatchFlagNames[64]192 if (children.filter(c => c.type !== 3).length === 1) {193 patchFlag |= 2048194 patchFlagText += `, ${PatchFlagNames[2048]}`...
hoistStatic.js
Source:hoistStatic.js
1function hoistStatic(root, context) {2 walk(root, context, new Map(),3 // Root node is unfortunately non-hoistable due to potential parent fallthrough attributes.4 isSingleElementRoot(root, root.children[0]));5}6function walk(node, context, resultCache, doNotHoistNode = false) {7 let hasHoistedNode = false8 // æ¯å¦å
å«è¿è¡æ¶å¸¸é9 let hasRuntimeConstant = false10 const { children } = node11 for (let i = 0; i < children.length; i++) {12 const child = children[i]13 // åªææ®éå
ç´ åææ¬èç¹æè½è¢«éææå14 if (child.type === 1 /* ELEMENT */ &&15 child.tagType === 0 /* ELEMENT */) {16 let staticType17 if (!doNotHoistNode &&18 // è·åéæèç¹çç±»åï¼å¦ææ¯å
ç´ ï¼åéå½æ£æ¥å®çåèç¹19 (staticType = getStaticType(child, resultCache)) > 0) {20 if (staticType === 2 /* HAS_RUNTIME_CONSTANT */) {21 hasRuntimeConstant = true22 }23 // æ´æ° patchFlag24 child.codegenNode.patchFlag =25 -1 /* HOISTED */ + ((process.env.NODE_ENV !== 'production') ? ` /* HOISTED */` : ``)26 // æ´æ°èç¹ç codegenNode27 child.codegenNode = context.hoist(child.codegenNode)28 hasHoistedNode = true29 continue30 }31 else {32 // èç¹å¯è½ä¼å
å«ä¸äºå¨æåèç¹ï¼ä½å®çéæå±æ§è¿æ¯å¯ä»¥è¢«éææå33 const codegenNode = child.codegenNode34 if (codegenNode.type === 13 /* VNODE_CALL */) {35 const flag = getPatchFlag(codegenNode)36 if ((!flag ||37 flag === 512 /* NEED_PATCH */ ||38 flag === 1 /* TEXT */) &&39 !hasDynamicKeyOrRef(child) &&40 !hasCachedProps()) {41 const props = getNodeProps(child)42 if (props) {43 codegenNode.props = context.hoist(props)44 }45 }46 }47 }48 }49 else if (child.type === 12 /* TEXT_CALL */) {50 // ææ¬èç¹ä¹å¯ä»¥éææå51 const staticType = getStaticType(child.content, resultCache)52 if (staticType > 0) {53 if (staticType === 2 /* HAS_RUNTIME_CONSTANT */) {54 hasRuntimeConstant = true55 }56 child.codegenNode = context.hoist(child.codegenNode)57 hasHoistedNode = true58 }59 }60 if (child.type === 1 /* ELEMENT */) {61 // éå½éååèç¹62 walk(child, context, resultCache)63 }64 else if (child.type === 11 /* FOR */) {65 walk(child, context, resultCache, child.children.length === 1)66 }67 else if (child.type === 9 /* IF */) {68 for (let i = 0; i < child.branches.length; i++) {69 walk(child.branches[i], context, resultCache, child.branches[i].children.length === 1)70 }71 }72 }73 if (!hasRuntimeConstant && hasHoistedNode && context.transformHoist) {74 // å¦æç¼è¯é
ç½®äº transformHoistï¼åæ§è¡75 context.transformHoist(children, context, node)76 }77}78function createRootCodegen(root, context) {79 const { helper } = context;80 const { children } = root;81 const child = children[0];82 if (children.length === 1) {83 // å¦æåèç¹æ¯å个å
ç´ èç¹ï¼åå°å
¶è½¬æ¢æä¸ä¸ª block84 if (isSingleElementRoot(root, child) && child.codegenNode) {85 const codegenNode = child.codegenNode;86 if (codegenNode.type === 13 /* VNODE_CALL */) {87 codegenNode.isBlock = true;88 helper(OPEN_BLOCK);89 helper(CREATE_BLOCK);90 }91 root.codegenNode = codegenNode;92 }93 else {94 root.codegenNode = child;95 }96 }97 else if (children.length > 1) {98 // å¦æåèç¹æ¯å¤ä¸ªèç¹ï¼åè¿åä¸ä¸ª fragement ç代ç çæèç¹...
transform.simple.js
Source:transform.simple.js
...106 source: '',107 start: { line: 1, column: 1, offset: 0 },108 end: { line: 1, column: 1, offset: 0 }109}110function isSingleElementRoot( root, child ) {111 const { children } = root112 return (113 children.length === 1 &&114 child.type === NodeTypes.ELEMENT &&115 !isSlotOutlet(child)116 )117}118function isSlotOutlet( node ){119 return node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.SLOT120}121function createBlockExpression( blockExp, context ) {122 return createSequenceExpression([123 createCallExpression(context.helper(OPEN_BLOCK)),124 blockExp...
Using AI Code Generation
1const { isSingleElementRoot } = require('playwright/lib/server/dom.js');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 const element = await page.$('text=Get started');8 console.log(isSingleElementRoot(element));9 await browser.close();10})();11const { chromium } = require('playwright');12(async () => {13 const browser = await chromium.launch();14 const context = await browser.newContext();15 const page = await context.newPage();16 await page.waitForSelector('text=Get started');17 await browser.close();18})();19const { chromium } = require('playwright');20(async () => {21 const browser = await chromium.launch();22 const context = await browser.newContext();23 const page = await context.newPage();24 await page.waitForSelector('text=Get started', { timeout: 1000 });25 await browser.close();26})();27const { chromium } = require('playwright');28(async () => {29 const browser = await chromium.launch();30 const context = await browser.newContext();31 const page = await context.newPage();32 await page.waitForSelector('text=Get started', { timeout: 1000 });33 await page.click('text=Get started');34 await browser.close();35})();
Using AI Code Generation
1const { isSingleElementRoot } = require('playwright/lib/server/dom.js');2const { isSingleElementRoot } = require('playwright/lib/server/dom.js');3const element = document.querySelector("div");4console.log(isSingleElementRoot(element));5const element = document.querySelector("div");6const childElement = element.querySelector("span");7console.log(isSingleElementRoot(childElement));8#### **[🔝 back to top](#table-of-contents)**9### 4. What is the difference between page.screenshot() and page.screenshotElement()?10const { chromium } = require('playwright');11(async () => {12 const browser = await chromium.launch();13 const page = await browser.newPage();14 await page.screenshot({ path: 'fullpage.png' });15 await browser.close();16})();17const { chromium } = require('playwright');18(async () => {19 const browser = await chromium.launch();20 const page = await browser.newPage();21 const element = await page.$('text=Get Started');22 await element.screenshot({ path: 'button.png' });23 await browser.close();24})();25#### **[🔝 back to top](#table-of-contents)**26const { chromium } = require('playwright');27(async () => {28 const browser = await chromium.launch({ headless: true });29 const page = await browser.newPage();
Using AI Code Generation
1const { isSingleElementRoot } = require('playwright/lib/server/dom.js');2(async () => {3 const { chromium } = require('playwright');4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.setContent('<div><div></div></div>');8 const [div] = await page.$$('div');9 await page.setContent('<div></div><div></div>');10 const divs = await page.$$('div');11 await page.setContent('<div><div></div><div></div></div>');12 const [div2] = await page.$$('div');13 await browser.close();14})();
Using AI Code Generation
1const { isSingleElementRoot } = require('playwright-core/lib/server/dom.js');2const { parse } = require('playwright-core/lib/server/common/parser.js');3const { parseSelector } = require('playwright-core/lib/server/common/selectorParser.js');4const selector = 'div#target';5const root = parseSelector(selector).root;6const parsed = parse(selector);7const result = isSingleElementRoot(root, parsed);8console.log(result);9const { chromium } = require('playwright');10const { isSingleElementRoot } = require('playwright-core/lib/server/dom.js');11const { parse } = require('playwright-core/lib/server/common/parser.js');12const { parseSelector } = require('playwright-core/lib/server/common/selectorParser.js');13(async () => {14 const browser = await chromium.launch();15 const page = await browser.newPage();16 const selector = 'div#target';17 const root = parseSelector(selector).root;18 const parsed = parse(selector);19 const result = isSingleElementRoot(root, parsed);20 console.log(result);21 const element = await page.$(selector, root);22 console.log(element);23 await browser.close();24})();25const { chromium } = require('playwright');26const { isSingleElementRoot } = require('playwright-core/lib/server/dom.js');27const { parse } = require('playwright-core/lib/server/common/parser.js');28const { parseSelector } = require('playwright-core/lib/server/common/selectorParser.js');29(async () => {30 const browser = await chromium.launch();31 const page = await browser.newPage();32 const selector = 'div#target';33 const root = parseSelector(selector).root;34 const parsed = parse(selector);35 const result = isSingleElementRoot(root, parsed
Using AI Code Generation
1const { isSingleElementRoot } = require('playwright/lib/server/dom.js');2const { _elementHandle } = require('playwright/lib/server/dom.js');3const { _frame } = require('playwright/lib/server/dom.js');4const { _page } = require('playwright/lib/server/dom.js');5const { _context } = require('playwright/lib/server/dom.js');6const { _browser } = require('playwright/lib/server/dom.js');7const { ElementHandle } = require('playwright/lib/server/dom.js');8const { Frame } = require('playwright/lib/server/dom.js');9const { Page } = require('playwright/lib/server/dom.js');10const { BrowserContext } = require('playwright/lib/server/dom.js');11const { Browser } = require('playwright/lib/server/dom.js');12const { createJSHandle } = require('playwright/lib/server/dom.js');13const { createHandle } = require('playwright/lib/server/dom.js');14const { createHandleForElement } = require('playwright/lib/server/dom.js');15const { createHandleForFrame } = require('playwright/lib/server/dom.js');16const { createHandleForPage } = require('playwright/lib/server/dom.js');17const { createHandleForContext } = require('playwright/lib/server/dom.js');18const { createHandleForBrowser } = require('playwright/lib/server/dom.js');19const { createHandleForElementHandle } = require('playwright/lib/server/dom.js');20const { createHandleForFrameHandle } = require('playwright/lib/server/dom.js');21const { createHandleForPageHandle } = require('playwright/lib/server/dom.js');22const { createHandleForContextHandle } = require('playwright/lib/server/dom.js');23const { createHandleForBrowserHandle } = require('playwright/lib/server/dom.js');24const { createHandleForElementHandlePromise } = require('playwright/lib/server/dom.js');25const { createHandleForFrameHandlePromise } = require('playwright/lib/server/dom.js');26const { createHandleForPageHandlePromise } = require('playwright/lib/server/dom.js');27const { createHandleForContextHandlePromise } = require('playwright/lib/server/dom.js');28const { createHandleForBrowserHandlePromise } = require('playwright/lib/server/dom.js');29const { createHandleForElementHandleArray } = require('playwright/lib/server/dom.js');30const { createHandleForFrameHandleArray } = require('play
Using AI Code Generation
1const { chromium } = require('playwright');2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const searchBar = await page.$('#twotabsearchtextbox');7 const isSingleElementRoot = await page.evaluate((element) => {8 return element.isSingleElementRoot;9 }, searchBar);10 console.log('Is the search bar a single element root? ', isSingleElementRoot);11 await browser.close();12})();
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!