export function jsParse(jsString:string) { var script = espree.parse(jsString, { attachComment: true, comment: true, loc: true, ecmaFeatures: { arrowFunctions: true, blockBindings: true, destructuring: true, regexYFlag: true, regexUFlag: true, templateStrings: true, binaryLiterals: true, unicodeCodePointEscapes: true, defaultParams: true, restParams: true, forOf: true, objectLiteralComputedProperties: true, objectLiteralShorthandMethods: true, objectLiteralShorthandProperties: true, objectLiteralDuplicateProperties: true, generators: true, spread: true, classes: true, modules: true, jsx: true, globalReturn: true, } }); var featureInfo = featureFinder(); var behaviorInfo = behaviorFinder(); var elementInfo = elementFinder(); var visitors = [featureInfo, behaviorInfo, elementInfo].map(function(info) { return info.visitors; }); estraverse.traverse(script, traverse(visitors)); return { behaviors: behaviorInfo.behaviors, elements: elementInfo.elements, features: featureInfo.features, parsedScript: script }; };
export function jsParse(jsString:string) { var script = espree.parse(jsString, { attachComment: true, comment: true, loc: true, ecmaVersion: 6 }); var featureInfo = featureFinder(); var behaviorInfo = behaviorFinder(); var elementInfo = elementFinder(); var visitors = [featureInfo, behaviorInfo, elementInfo].map(function(info) { return info.visitors; }); estraverse.traverse(script, traverse(visitors)); return { behaviors: behaviorInfo.behaviors, elements: elementInfo.elements, features: featureInfo.features, parsedScript: script }; };
async function addShadowDomTests(element: ElementRepo): Promise<void> { const testDir = path.join(element.dir, 'test'); if (!existsSync(testDir) || !fs.statSync(testDir).isDirectory()) { return; // nothing to do } const testIndexFile = path.join(testDir, 'index.html'); if (!existsSync(testIndexFile)) { return; // nothing to do } const contents = fs.readFileSync(testIndexFile, 'utf8'); const domTree = dom5.parse(contents); const scripts = dom5.queryAll(domTree, (n) => n.tagName === 'script'); let updateNeeded = false; for (const script of scripts) { const data = script.childNodes[0]; if (!data || data.nodeName !== '#text') { continue; } const program = espree.parse(data.value, {attachComment: true}); estree_walker.walk(program, { enter(n) { if (!(n.type === 'CallExpression' && n.callee.type === 'MemberExpression')) { return; } if (!(n.callee.object && n.callee.property)) { return; } if (!(n.callee.object.name === 'WCT' && n.callee.property.name === 'loadSuites')) { return; } if (!(n.arguments && n.arguments.length === 1 && n.arguments[0].type === 'ArrayExpression')) { return; } const testFilenameExpressions = n.arguments[0]; const shadyFilenames = new Set<string>(); const shadowFilenames = new Set<string>(); for (const filenameExpression of testFilenameExpressions.elements) { if (/dom=shadow/.test(filenameExpression.value)) { shadowFilenames.add(filenameExpression.value); } else { shadyFilenames.add(filenameExpression.value); } } for (const shadyFilename of shadyFilenames) { if (!shadowFilenames.has(shadyFilename + '?dom=shadow')) { updateNeeded = true; } } testFilenameExpressions.elements = []; for (const shadyFilename of shadyFilenames) { testFilenameExpressions.elements.push( {type: 'Literal', value: shadyFilename}); } for (const shadyFilename of shadyFilenames) { testFilenameExpressions.elements.push( {type: 'Literal', value: shadyFilename + '?dom=shadow'}); } } }); // Try to infer indentation let indentation = ' '; const parent = script.parentNode; const scriptIndex = parent.childNodes.indexOf(script); if (scriptIndex >= 0 && parent.childNodes[scriptIndex - 1].nodeName === '#text') { const textJustBefore = parent.childNodes[scriptIndex - 1].value; indentation = textJustBefore.match(/( +)$/)[1]; } data.value = '\n' + escodegen.generate(program, { comment: true, format: { indent: { style: ' ', base: (indentation.length / 2) + 1, adjustMultilineComment: true } } }) + '\n' + indentation; } if (updateNeeded) { fs.writeFileSync(testIndexFile, dom5.serialize(domTree) + '\n', 'utf8'); element.needsReview = true; await makeCommit( element, ['test/index.html'], 'Add shadow dom test configurations.'); } }