Best JavaScript code snippet using playwright-internal
utils.js
Source:utils.js
1"use strict";2/** @typedef {import("source-map").RawSourceMap} RawSourceMap */3/** @typedef {import("terser").FormatOptions} TerserFormatOptions */4/** @typedef {import("terser").MinifyOptions} TerserOptions */5/** @typedef {import("terser").ECMA} TerserECMA */6/** @typedef {import("./index.js").ExtractCommentsOptions} ExtractCommentsOptions */7/** @typedef {import("./index.js").ExtractCommentsFunction} ExtractCommentsFunction */8/** @typedef {import("./index.js").ExtractCommentsCondition} ExtractCommentsCondition */9/** @typedef {import("./index.js").Input} Input */10/** @typedef {import("./index.js").MinimizedResult} MinimizedResult */11/** @typedef {import("./index.js").PredefinedOptions} PredefinedOptions */12/** @typedef {import("./index.js").CustomOptions} CustomOptions */13/**14 * @typedef {Array<string>} ExtractedComments15 */16const notSettled = Symbol(`not-settled`);17/**18 * @template T19 * @typedef {() => Promise<T>} Task20 */21/**22 * Run tasks with limited concurency.23 * @template T24 * @param {number} limit - Limit of tasks that run at once.25 * @param {Task<T>[]} tasks - List of tasks to run.26 * @returns {Promise<T[]>} A promise that fulfills to an array of the results27 */28function throttleAll(limit, tasks) {29 if (!Number.isInteger(limit) || limit < 1) {30 throw new TypeError(`Expected \`limit\` to be a finite number > 0, got \`${limit}\` (${typeof limit})`);31 }32 if (!Array.isArray(tasks) || !tasks.every(task => typeof task === `function`)) {33 throw new TypeError(`Expected \`tasks\` to be a list of functions returning a promise`);34 }35 return new Promise((resolve, reject) => {36 const result = Array(tasks.length).fill(notSettled);37 const entries = tasks.entries();38 const next = () => {39 const {40 done,41 value42 } = entries.next();43 if (done) {44 const isLast = !result.includes(notSettled);45 if (isLast) resolve(46 /** @type{T[]} **/47 result);48 return;49 }50 const [index, task] = value;51 /**52 * @param {T} x53 */54 const onFulfilled = x => {55 result[index] = x;56 next();57 };58 task().then(onFulfilled, reject);59 };60 Array(limit).fill(0).forEach(next);61 });62}63/* istanbul ignore next */64/**65 * @param {Input} input66 * @param {RawSourceMap | undefined} sourceMap67 * @param {PredefinedOptions & CustomOptions} minimizerOptions68 * @param {ExtractCommentsOptions | undefined} extractComments69 * @return {Promise<MinimizedResult>}70 */71async function terserMinify(input, sourceMap, minimizerOptions, extractComments) {72 /**73 * @param {any} value74 * @returns {boolean}75 */76 const isObject = value => {77 const type = typeof value;78 return value != null && (type === "object" || type === "function");79 };80 /**81 * @param {TerserOptions & { sourceMap: undefined } & ({ output: TerserFormatOptions & { beautify: boolean } } | { format: TerserFormatOptions & { beautify: boolean } })} terserOptions82 * @param {ExtractedComments} extractedComments83 * @returns {ExtractCommentsFunction}84 */85 const buildComments = (terserOptions, extractedComments) => {86 /** @type {{ [index: string]: ExtractCommentsCondition }} */87 const condition = {};88 let comments;89 if (terserOptions.format) {90 ({91 comments92 } = terserOptions.format);93 } else if (terserOptions.output) {94 ({95 comments96 } = terserOptions.output);97 }98 condition.preserve = typeof comments !== "undefined" ? comments : false;99 if (typeof extractComments === "boolean" && extractComments) {100 condition.extract = "some";101 } else if (typeof extractComments === "string" || extractComments instanceof RegExp) {102 condition.extract = extractComments;103 } else if (typeof extractComments === "function") {104 condition.extract = extractComments;105 } else if (extractComments && isObject(extractComments)) {106 condition.extract = typeof extractComments.condition === "boolean" && extractComments.condition ? "some" : typeof extractComments.condition !== "undefined" ? extractComments.condition : "some";107 } else {108 // No extract109 // Preserve using "commentsOpts" or "some"110 condition.preserve = typeof comments !== "undefined" ? comments : "some";111 condition.extract = false;112 } // Ensure that both conditions are functions113 ["preserve", "extract"].forEach(key => {114 /** @type {undefined | string} */115 let regexStr;116 /** @type {undefined | RegExp} */117 let regex;118 switch (typeof condition[key]) {119 case "boolean":120 condition[key] = condition[key] ? () => true : () => false;121 break;122 case "function":123 break;124 case "string":125 if (condition[key] === "all") {126 condition[key] = () => true;127 break;128 }129 if (condition[key] === "some") {130 condition[key] =131 /** @type {ExtractCommentsFunction} */132 (astNode, comment) => (comment.type === "comment2" || comment.type === "comment1") && /@preserve|@lic|@cc_on|^\**!/i.test(comment.value);133 break;134 }135 regexStr =136 /** @type {string} */137 condition[key];138 condition[key] =139 /** @type {ExtractCommentsFunction} */140 (astNode, comment) => new RegExp(141 /** @type {string} */142 regexStr).test(comment.value);143 break;144 default:145 regex =146 /** @type {RegExp} */147 condition[key];148 condition[key] =149 /** @type {ExtractCommentsFunction} */150 (astNode, comment) =>151 /** @type {RegExp} */152 regex.test(comment.value);153 }154 }); // Redefine the comments function to extract and preserve155 // comments according to the two conditions156 return (astNode, comment) => {157 if (158 /** @type {{ extract: ExtractCommentsFunction }} */159 condition.extract(astNode, comment)) {160 const commentText = comment.type === "comment2" ? `/*${comment.value}*/` : `//${comment.value}`; // Don't include duplicate comments161 if (!extractedComments.includes(commentText)) {162 extractedComments.push(commentText);163 }164 }165 return (166 /** @type {{ preserve: ExtractCommentsFunction }} */167 condition.preserve(astNode, comment)168 );169 };170 };171 /**172 * @param {PredefinedOptions & TerserOptions} [terserOptions={}]173 * @returns {TerserOptions & { sourceMap: undefined } & ({ output: TerserFormatOptions & { beautify: boolean } } | { format: TerserFormatOptions & { beautify: boolean } })}174 */175 const buildTerserOptions = (terserOptions = {}) => {176 // Need deep copy objects to avoid https://github.com/terser/terser/issues/366177 return { ...terserOptions,178 compress: typeof terserOptions.compress === "boolean" ? terserOptions.compress : { ...terserOptions.compress179 },180 // ecma: terserOptions.ecma,181 // ie8: terserOptions.ie8,182 // keep_classnames: terserOptions.keep_classnames,183 // keep_fnames: terserOptions.keep_fnames,184 mangle: terserOptions.mangle == null ? true : typeof terserOptions.mangle === "boolean" ? terserOptions.mangle : { ...terserOptions.mangle185 },186 // module: terserOptions.module,187 // nameCache: { ...terserOptions.toplevel },188 // the `output` option is deprecated189 ...(terserOptions.format ? {190 format: {191 beautify: false,192 ...terserOptions.format193 }194 } : {195 output: {196 beautify: false,197 ...terserOptions.output198 }199 }),200 parse: { ...terserOptions.parse201 },202 // safari10: terserOptions.safari10,203 // Ignoring sourceMap from options204 // eslint-disable-next-line no-undefined205 sourceMap: undefined // toplevel: terserOptions.toplevel206 };207 }; // eslint-disable-next-line global-require208 const {209 minify210 } = require("terser"); // Copy `terser` options211 const terserOptions = buildTerserOptions(minimizerOptions); // Let terser generate a SourceMap212 if (sourceMap) {213 // @ts-ignore214 terserOptions.sourceMap = {215 asObject: true216 };217 }218 /** @type {ExtractedComments} */219 const extractedComments = [];220 if (terserOptions.output) {221 terserOptions.output.comments = buildComments(terserOptions, extractedComments);222 } else if (terserOptions.format) {223 terserOptions.format.comments = buildComments(terserOptions, extractedComments);224 }225 const [[filename, code]] = Object.entries(input);226 const result = await minify({227 [filename]: code228 }, terserOptions);229 return {230 code:231 /** @type {string} **/232 result.code,233 // @ts-ignore234 // eslint-disable-next-line no-undefined235 map: result.map ?236 /** @type {RawSourceMap} **/237 result.map : undefined,238 extractedComments239 };240}241/**242 * @returns {string | undefined}243 */244terserMinify.getMinimizerVersion = () => {245 let packageJson;246 try {247 // eslint-disable-next-line global-require248 packageJson = require("terser/package.json");249 } catch (error) {// Ignore250 }251 return packageJson && packageJson.version;252};253/* istanbul ignore next */254/**255 * @param {Input} input256 * @param {RawSourceMap | undefined} sourceMap257 * @param {PredefinedOptions & CustomOptions} minimizerOptions258 * @param {ExtractCommentsOptions | undefined} extractComments259 * @return {Promise<MinimizedResult>}260 */261async function uglifyJsMinify(input, sourceMap, minimizerOptions, extractComments) {262 /**263 * @param {any} value264 * @returns {boolean}265 */266 const isObject = value => {267 const type = typeof value;268 return value != null && (type === "object" || type === "function");269 };270 /**271 * @param {import("uglify-js").MinifyOptions & { sourceMap: undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}} uglifyJsOptions272 * @param {ExtractedComments} extractedComments273 * @returns {ExtractCommentsFunction}274 */275 const buildComments = (uglifyJsOptions, extractedComments) => {276 /** @type {{ [index: string]: ExtractCommentsCondition }} */277 const condition = {};278 const {279 comments280 } = uglifyJsOptions.output;281 condition.preserve = typeof comments !== "undefined" ? comments : false;282 if (typeof extractComments === "boolean" && extractComments) {283 condition.extract = "some";284 } else if (typeof extractComments === "string" || extractComments instanceof RegExp) {285 condition.extract = extractComments;286 } else if (typeof extractComments === "function") {287 condition.extract = extractComments;288 } else if (extractComments && isObject(extractComments)) {289 condition.extract = typeof extractComments.condition === "boolean" && extractComments.condition ? "some" : typeof extractComments.condition !== "undefined" ? extractComments.condition : "some";290 } else {291 // No extract292 // Preserve using "commentsOpts" or "some"293 condition.preserve = typeof comments !== "undefined" ? comments : "some";294 condition.extract = false;295 } // Ensure that both conditions are functions296 ["preserve", "extract"].forEach(key => {297 /** @type {undefined | string} */298 let regexStr;299 /** @type {undefined | RegExp} */300 let regex;301 switch (typeof condition[key]) {302 case "boolean":303 condition[key] = condition[key] ? () => true : () => false;304 break;305 case "function":306 break;307 case "string":308 if (condition[key] === "all") {309 condition[key] = () => true;310 break;311 }312 if (condition[key] === "some") {313 condition[key] =314 /** @type {ExtractCommentsFunction} */315 (astNode, comment) => (comment.type === "comment2" || comment.type === "comment1") && /@preserve|@lic|@cc_on|^\**!/i.test(comment.value);316 break;317 }318 regexStr =319 /** @type {string} */320 condition[key];321 condition[key] =322 /** @type {ExtractCommentsFunction} */323 (astNode, comment) => new RegExp(324 /** @type {string} */325 regexStr).test(comment.value);326 break;327 default:328 regex =329 /** @type {RegExp} */330 condition[key];331 condition[key] =332 /** @type {ExtractCommentsFunction} */333 (astNode, comment) =>334 /** @type {RegExp} */335 regex.test(comment.value);336 }337 }); // Redefine the comments function to extract and preserve338 // comments according to the two conditions339 return (astNode, comment) => {340 if (341 /** @type {{ extract: ExtractCommentsFunction }} */342 condition.extract(astNode, comment)) {343 const commentText = comment.type === "comment2" ? `/*${comment.value}*/` : `//${comment.value}`; // Don't include duplicate comments344 if (!extractedComments.includes(commentText)) {345 extractedComments.push(commentText);346 }347 }348 return (349 /** @type {{ preserve: ExtractCommentsFunction }} */350 condition.preserve(astNode, comment)351 );352 };353 };354 /**355 * @param {PredefinedOptions & import("uglify-js").MinifyOptions} [uglifyJsOptions={}]356 * @returns {import("uglify-js").MinifyOptions & { sourceMap: undefined } & { output: import("uglify-js").OutputOptions & { beautify: boolean }}}357 */358 const buildUglifyJsOptions = (uglifyJsOptions = {}) => {359 // eslint-disable-next-line no-param-reassign360 delete minimizerOptions.ecma; // eslint-disable-next-line no-param-reassign361 delete minimizerOptions.module; // Need deep copy objects to avoid https://github.com/terser/terser/issues/366362 return { ...uglifyJsOptions,363 // warnings: uglifyJsOptions.warnings,364 parse: { ...uglifyJsOptions.parse365 },366 compress: typeof uglifyJsOptions.compress === "boolean" ? uglifyJsOptions.compress : { ...uglifyJsOptions.compress367 },368 mangle: uglifyJsOptions.mangle == null ? true : typeof uglifyJsOptions.mangle === "boolean" ? uglifyJsOptions.mangle : { ...uglifyJsOptions.mangle369 },370 output: {371 beautify: false,372 ...uglifyJsOptions.output373 },374 // Ignoring sourceMap from options375 // eslint-disable-next-line no-undefined376 sourceMap: undefined // toplevel: uglifyJsOptions.toplevel377 // nameCache: { ...uglifyJsOptions.toplevel },378 // ie8: uglifyJsOptions.ie8,379 // keep_fnames: uglifyJsOptions.keep_fnames,380 };381 }; // eslint-disable-next-line global-require, import/no-extraneous-dependencies382 const {383 minify384 } = require("uglify-js"); // Copy `uglify-js` options385 const uglifyJsOptions = buildUglifyJsOptions(minimizerOptions); // Let terser generate a SourceMap386 if (sourceMap) {387 // @ts-ignore388 uglifyJsOptions.sourceMap = true;389 }390 /** @type {ExtractedComments} */391 const extractedComments = []; // @ts-ignore392 uglifyJsOptions.output.comments = buildComments(uglifyJsOptions, extractedComments);393 const [[filename, code]] = Object.entries(input);394 const result = await minify({395 [filename]: code396 }, uglifyJsOptions);397 return {398 code: result.code,399 // eslint-disable-next-line no-undefined400 map: result.map ? JSON.parse(result.map) : undefined,401 errors: result.error ? [result.error] : [],402 warnings: result.warnings || [],403 extractedComments404 };405}406/**407 * @returns {string | undefined}408 */409uglifyJsMinify.getMinimizerVersion = () => {410 let packageJson;411 try {412 // eslint-disable-next-line global-require, import/no-extraneous-dependencies413 packageJson = require("uglify-js/package.json");414 } catch (error) {// Ignore415 }416 return packageJson && packageJson.version;417};418/* istanbul ignore next */419/**420 * @param {Input} input421 * @param {RawSourceMap | undefined} sourceMap422 * @param {PredefinedOptions & CustomOptions} minimizerOptions423 * @return {Promise<MinimizedResult>}424 */425async function swcMinify(input, sourceMap, minimizerOptions) {426 /**427 * @param {PredefinedOptions & import("@swc/core").JsMinifyOptions} [swcOptions={}]428 * @returns {import("@swc/core").JsMinifyOptions & { sourceMap: undefined }}429 */430 const buildSwcOptions = (swcOptions = {}) => {431 // Need deep copy objects to avoid https://github.com/terser/terser/issues/366432 return { ...swcOptions,433 compress: typeof swcOptions.compress === "boolean" ? swcOptions.compress : { ...swcOptions.compress434 },435 mangle: swcOptions.mangle == null ? true : typeof swcOptions.mangle === "boolean" ? swcOptions.mangle : { ...swcOptions.mangle436 },437 // ecma: swcOptions.ecma,438 // keep_classnames: swcOptions.keep_classnames,439 // keep_fnames: swcOptions.keep_fnames,440 // module: swcOptions.module,441 // safari10: swcOptions.safari10,442 // toplevel: swcOptions.toplevel443 // eslint-disable-next-line no-undefined444 sourceMap: undefined445 };446 }; // eslint-disable-next-line import/no-extraneous-dependencies, global-require447 const swc = require("@swc/core"); // Copy `swc` options448 const swcOptions = buildSwcOptions(minimizerOptions); // Let `swc` generate a SourceMap449 if (sourceMap) {450 // @ts-ignore451 swcOptions.sourceMap = true;452 }453 const [[filename, code]] = Object.entries(input);454 const result = await swc.minify(code, swcOptions);455 let map;456 if (result.map) {457 map = JSON.parse(result.map); // TODO workaround for swc because `filename` is not preset as in `swc` signature as for `terser`458 map.sources = [filename];459 delete map.sourcesContent;460 }461 return {462 code: result.code,463 map464 };465}466/**467 * @returns {string | undefined}468 */469swcMinify.getMinimizerVersion = () => {470 let packageJson;471 try {472 // eslint-disable-next-line global-require, import/no-extraneous-dependencies473 packageJson = require("@swc/core/package.json");474 } catch (error) {// Ignore475 }476 return packageJson && packageJson.version;477};478/* istanbul ignore next */479/**480 * @param {Input} input481 * @param {RawSourceMap | undefined} sourceMap482 * @param {PredefinedOptions & CustomOptions} minimizerOptions483 * @return {Promise<MinimizedResult>}484 */485async function esbuildMinify(input, sourceMap, minimizerOptions) {486 /**487 * @param {PredefinedOptions & import("esbuild").TransformOptions} [esbuildOptions={}]488 * @returns {import("esbuild").TransformOptions}489 */490 const buildEsbuildOptions = (esbuildOptions = {}) => {491 // eslint-disable-next-line no-param-reassign492 delete esbuildOptions.ecma;493 if (esbuildOptions.module) {494 // eslint-disable-next-line no-param-reassign495 esbuildOptions.format = "esm";496 } // eslint-disable-next-line no-param-reassign497 delete esbuildOptions.module; // Need deep copy objects to avoid https://github.com/terser/terser/issues/366498 return {499 minify: true,500 legalComments: "inline",501 ...esbuildOptions,502 sourcemap: false503 };504 }; // eslint-disable-next-line import/no-extraneous-dependencies, global-require505 const esbuild = require("esbuild"); // Copy `esbuild` options506 const esbuildOptions = buildEsbuildOptions(minimizerOptions); // Let `esbuild` generate a SourceMap507 if (sourceMap) {508 esbuildOptions.sourcemap = true;509 esbuildOptions.sourcesContent = false;510 }511 const [[filename, code]] = Object.entries(input);512 esbuildOptions.sourcefile = filename;513 const result = await esbuild.transform(code, esbuildOptions);514 return {515 code: result.code,516 // eslint-disable-next-line no-undefined517 map: result.map ? JSON.parse(result.map) : undefined,518 warnings: result.warnings.length > 0 ? result.warnings.map(item => {519 return {520 name: "Warning",521 source: item.location && item.location.file,522 line: item.location && item.location.line,523 column: item.location && item.location.column,524 plugin: item.pluginName,525 message: `${item.text}${item.detail ? `\nDetails:\n${item.detail}` : ""}${item.notes.length > 0 ? `\n\nNotes:\n${item.notes.map(note => `${note.location ? `[${note.location.file}:${note.location.line}:${note.location.column}] ` : ""}${note.text}${note.location ? `\nSuggestion: ${note.location.suggestion}` : ""}${note.location ? `\nLine text:\n${note.location.lineText}\n` : ""}`).join("\n")}` : ""}`526 };527 }) : []528 };529}530/**531 * @returns {string | undefined}532 */533esbuildMinify.getMinimizerVersion = () => {534 let packageJson;535 try {536 // eslint-disable-next-line global-require, import/no-extraneous-dependencies537 packageJson = require("esbuild/package.json");538 } catch (error) {// Ignore539 }540 return packageJson && packageJson.version;541};542module.exports = {543 throttleAll,544 terserMinify,545 uglifyJsMinify,546 swcMinify,547 esbuildMinify...
minify.js
Source:minify.js
1"use strict";2const {3 minify: terserMinify4} = require('terser');5const buildTerserOptions = ({6 ecma,7 warnings,8 parse = {},9 compress = {},10 mangle,11 module,12 output,13 toplevel,14 nameCache,15 ie8,16 /* eslint-disable camelcase */17 keep_classnames,18 keep_fnames,19 /* eslint-enable camelcase */20 safari1021} = {}) => ({22 ecma,23 warnings,24 parse: { ...parse25 },26 compress: typeof compress === 'boolean' ? compress : { ...compress27 },28 // eslint-disable-next-line no-nested-ternary29 mangle: mangle == null ? true : typeof mangle === 'boolean' ? mangle : { ...mangle30 },31 output: {32 beautify: false,33 ...output34 },35 module,36 // Ignoring sourceMap from options37 sourceMap: null,38 toplevel,39 nameCache,40 ie8,41 keep_classnames,42 keep_fnames,43 safari1044});45function isObject(value) {46 const type = typeof value;47 return value != null && (type === 'object' || type === 'function');48}49const buildComments = (options, terserOptions, extractedComments) => {50 const condition = {};51 const commentsOpts = terserOptions.output.comments;52 const {53 extractComments54 } = options;55 condition.preserve = typeof commentsOpts !== 'undefined' ? commentsOpts : false;56 if (typeof extractComments === 'boolean' && extractComments) {57 condition.extract = 'some';58 } else if (typeof extractComments === 'string' || extractComments instanceof RegExp) {59 condition.extract = extractComments;60 } else if (typeof extractComments === 'function') {61 condition.extract = extractComments;62 } else if (isObject(extractComments)) {63 condition.extract = typeof extractComments.condition === 'boolean' && extractComments.condition ? 'some' : typeof extractComments.condition !== 'undefined' ? extractComments.condition : 'some';64 } else {65 // No extract66 // Preserve using "commentsOpts" or "some"67 condition.preserve = typeof commentsOpts !== 'undefined' ? commentsOpts : 'some';68 condition.extract = false;69 } // Ensure that both conditions are functions70 ['preserve', 'extract'].forEach(key => {71 let regexStr;72 let regex;73 switch (typeof condition[key]) {74 case 'boolean':75 condition[key] = condition[key] ? () => true : () => false;76 break;77 case 'function':78 break;79 case 'string':80 if (condition[key] === 'all') {81 condition[key] = () => true;82 break;83 }84 if (condition[key] === 'some') {85 condition[key] = (astNode, comment) => {86 return (comment.type === 'comment2' || comment.type === 'comment1') && /@preserve|@lic|@cc_on|^\**!/i.test(comment.value);87 };88 break;89 }90 regexStr = condition[key];91 condition[key] = (astNode, comment) => {92 return new RegExp(regexStr).test(comment.value);93 };94 break;95 default:96 regex = condition[key];97 condition[key] = (astNode, comment) => regex.test(comment.value);98 }99 }); // Redefine the comments function to extract and preserve100 // comments according to the two conditions101 return (astNode, comment) => {102 if (condition.extract(astNode, comment)) {103 const commentText = comment.type === 'comment2' ? `/*${comment.value}*/` : `//${comment.value}`; // Don't include duplicate comments104 if (!extractedComments.includes(commentText)) {105 extractedComments.push(commentText);106 }107 }108 return condition.preserve(astNode, comment);109 };110};111const minify = options => {112 const {113 file,114 input,115 inputSourceMap,116 minify: minifyFn117 } = options;118 if (minifyFn) {119 return minifyFn({120 [file]: input121 }, inputSourceMap);122 } // Copy terser options123 const terserOptions = buildTerserOptions(options.terserOptions); // Let terser generate a SourceMap124 if (inputSourceMap) {125 terserOptions.sourceMap = {126 asObject: true127 };128 }129 const extractedComments = [];130 terserOptions.output.comments = buildComments(options, terserOptions, extractedComments);131 const {132 error,133 map,134 code,135 warnings136 } = terserMinify({137 [file]: input138 }, terserOptions);139 return {140 error,141 map,142 code,143 warnings,144 extractedComments145 };146};...
Using AI Code Generation
1const { extractComments } = require('playwright-core/lib/utils/stackTrace');2const { extractComments } = require('playwright-core/lib/utils/stackTrace');3const { extractComments } = require('playwright-core/lib/utils/stackTrace');4const { extractComments } = require('playwright-core/lib/utils/stackTrace');5const { extractComments } = require('playwright-core/lib/utils/stackTrace');6const { extractComments } = require('playwright-core/lib/utils/stackTrace');7const { extractComments } = require('playwright-core/lib/utils/stackTrace');8const { extractComments } = require('playwright-core/lib/utils/stackTrace');9const { extractComments } = require('playwright-core/lib/utils/stackTrace');10const { extractComments } = require('playwright-core/lib/utils/stackTrace');11const { extractComments } = require('playwright-core/lib/utils/stackTrace');12const { extractComments } = require('playwright-core/lib/utils/stackTrace');13const { extractComments } = require('playwright-core/lib/utils/stackTrace');14const { extractComments } = require('playwright-core/lib/utils/stackTrace');15const { extractComments } = require('playwright-core/lib/utils/stackTrace');16const { extractComments } = require('playwright-core/lib/utils/stackTrace');17const { extractComments } = require('playwright-core/lib/utils/stackTrace');
Using AI Code Generation
1const { extractComments } = require('@playwright/test');2const { test } = require('@playwright/test');3const { expect } = require('@playwright/test');4const { describe } = require('@playwright/test');5const { it } = require('@playwright/test');6const { beforeAll } = require('@playwright/test');7const { afterAll } = require('@playwright/test');8const { beforeEach } = require('@playwright/test');9const { afterEach } = require('@playwright/test');10test.describe('Playwright Internal', () => {11 test.beforeAll(async ({ page }) => {12 });13 test('should extract comments from the file', async ({ page }) => {14 const comments = await extractComments('test.js');15 expect(comments).toContain('Path: test.js');16 });17});18const { extractComments } = require('@playwright/test');19const { test } = require('@playwright/test');20const { expect } = require('@playwright/test');21const { describe } = require('@playwright/test');22const { it } = require('@playwright/test');23const { beforeAll } = require('@playwright/test');24const { afterAll } = require('@playwright/test');25const { beforeEach } = require('@playwright/test');26const { afterEach } = require('@playwright/test');27test.describe('Playwright Internal', () => {28 test.beforeAll(async ({ page }) => {29 });30 test('should extract comments from the file', async ({ page }) => {31 const comments = await extractComments('test1.js');32 expect(comments).toContain('Path: test1.js');33 });34});
Using AI Code Generation
1const { extractComments } = require('playwright/lib/utils/extractComments');2const { parse } = require('playwright/lib/utils/parseJavaScript');3const { readFileSync } = require('fs');4const { join } = require('path');5const file = readFileSync(join(__dirname, 'test.ts'), 'utf8');6const comments = extractComments(parse(file));7console.log(comments);8[{9 loc: {10 start: { line: 1, column: 0 },11 end: { line: 4, column: 1 }12 }13}]
Using AI Code Generation
1const { extractComments } = require('playwright/lib/utils/doclint/markdown');2const { parse } = require('playwright/lib/utils/doclint/extract');3const { join } = require('path');4const { readFileSync } = require('fs');5const { promisify } = require('util');6const { exec } = require('child_process');7const { chromium } = require('playwright');8const execAsync = promisify(exec);9const { source, language } = extractComments(parse(readFileSync(join(__dirname, 'test.md')).toString()))[0];10(async () => {11 const browser = await chromium.launch();12 const page = await browser.newPage();13 await page.goto('data:text/html,<div id="container"></div>');14 await page.addScriptTag({ content: source, language });15 const output = await page.evaluate(() => {16 return container.textContent;17 });18 console.log(output);19 await browser.close();20})();21### `extractComments(document)`22### `parse(markdown)`
Using AI Code Generation
1const { extractComments } = require('@playwright/test/lib/test/runner');2const fs = require('fs');3const path = require('path');4const testFile = path.join(process.cwd(), 'test.js');5const comments = extractComments(fs.readFileSync(testFile, 'utf8'), testFile);6console.log(comments);7const { test } = require('@playwright/test');8test('my test', async ({ page, testInfo }) => {9 console.log(testInfo.comments);10});11const { test } = require('@playwright/test');12test('my test', async ({ page, testInfo }) => {13 console.log(testInfo.comments);14});
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!!