diff --git a/README.md b/README.md index a05afb6..3b83368 100644 --- a/README.md +++ b/README.md @@ -10,37 +10,36 @@ Extract critical CSS path for the current viewport in the current page. Using modules ```html - ``` Without using modules ```html - - - + + ``` @@ -75,7 +74,8 @@ urls.forEach(async url => critical(url, { screenshot: true, secure: false, // dimensions can be specified as an array of string or object - dimensions: ['1400x900', '1200x675', '992x558'] + dimensions: ['1400x900', '1200x675', '992x558'], + advanced: true }).then((results) => { // print extracted CSS @@ -111,6 +111,7 @@ urls.forEach(async url => critical(url, { - output: _string_. change output directory. default _'./output/'_ - fonts: _bool_. generate javascript to load web fonts. default _true_ - json: _bool_. dump result as JSON + - advanced: _bool_. remove parts of css selectors that do not match any element. default _false_ > debugging settings - console: _bool_. log console messages from the pages. default _true_ - verbose: _bool_. enable verbose mode @@ -161,6 +162,8 @@ Options: -p, --html Generate an HTML page containing inlined critical css [boolean] --json print result in JSON format [boolean] [default: false] + -e, --advanced remove parts of css selectors that do not match any elem + ent [boolean] [default: false] -v, --verbose Enable verbose mode [boolean] [default: false] @@ -185,6 +188,7 @@ $ cat pages/dashboard.html | critical-cli --base=pages/ --secure=no -i -d '1440x ### V1.1.0 - read data from STDIN +- remove unused selectors - dump cli result as JSON ### V1.0.1 diff --git a/bin/args.json b/bin/args.json index 850d36c..0fa8bd9 100644 --- a/bin/args.json +++ b/bin/args.json @@ -128,7 +128,14 @@ "description": "print result in JSON format", "type": "boolean", "default": false - } , + }, + "advanced": { + "alias": "e", + "demandOption": false, + "description": "remove parts of css selectors that do not match any element", + "type": "boolean", + "default": false + }, "verbose": { "alias": "v", "demandOption": false, diff --git a/bin/critical-cli.js b/bin/critical-cli.js index 3cf3771..3d5027e 100755 --- a/bin/critical-cli.js +++ b/bin/critical-cli.js @@ -11,29 +11,39 @@ const aliases = new Map; aliases.set('h', 'help'); -for (const [name, command] of Object.entries(cliArgs.args)) { +try { - if (aliases.has(command.alias)) { + for (const [name, command] of Object.entries(cliArgs.args)) { - throw new Error(`'${name}': Alias ${command.alias} already in use by ${aliases.get(command.alias)}'`); + if (aliases.has(command.alias)) { + + throw new Error(`'${name}': Alias ${command.alias} already in use by ${aliases.get(command.alias)}'`); + } + + aliases.set(command.alias, name); + aliases.set(name.replace(/-([a-z])/g, (all, one) => one.toUpperCase()), name); + _yargs.option(name, command); } - aliases.set(command.alias, name); - aliases.set(name.replace(/-([a-z])/g, (all, one) => one.toUpperCase()), name); - _yargs.option(name, command); -} + for (const name of Object.keys(_yargs.argv)) { + + if (name === '_' || '$0' === name) { -for (const name of Object.keys(_yargs.argv)) { + continue; + } - if (name === '_' || '$0' === name) { + if (!aliases.has(name.replace(/-([a-z])/g, (all, one) => one.toUpperCase()))) { - continue; + throw new Error(`'${name}': Unknown argument`); + } } +} - if (!aliases.has(name.replace(/-([a-z])/g, (all, one) => one.toUpperCase()))) { +catch (error) { - throw new Error(`'${name}': Unknown argument`); - } + _yargs.showHelp(); + console.error(error.message); + process.exit(1); } _yargs.help().alias('help', 'h') /*.strict(true) */; @@ -52,7 +62,6 @@ for (let key of Object.keys(options)) { } } - // @ts-ignore delete options._; // @ts-ignore @@ -64,7 +73,6 @@ if (urls.length === 0 && process.stdin.isTTY) { process.exit(); } - if (process.stdin.isTTY == null) { urls.length = 0; diff --git a/dist/browser-umd.js b/dist/browser-umd.js index ad94070..a79ef38 100644 --- a/dist/browser-umd.js +++ b/dist/browser-umd.js @@ -216,6 +216,8 @@ var critical = (function (exports) { } file = files.get(rule.parentStyleSheet).file; css = rule.cssText; + // @ts-ignore + console.error({ sel: rule.selectorText, css }); if (file !== 'inline') { // resolve url() css = css.replace(/url\(([^)%\s]*?)\)/g, function (all, one) { diff --git a/dist/browser-umd.js.map b/dist/browser-umd.js.map index 834078e..68d3fa3 100644 --- a/dist/browser-umd.js.map +++ b/dist/browser-umd.js.map @@ -1 +1 @@ -{"version":3,"file":"browser-umd.js","sources":["../src/file/download.ts","../src/file/path.ts","../src/critical/fontscript.ts","../src/critical/extract.ts","../src/browser.ts"],"sourcesContent":["/**\n *\n * @param {string[]} content\n * @param {string} filename\n * @param {string} mimetype\n * @return {Promise}\n */\nexport async function download(content: Array, filename: string, mimetype: string = 'application/octet-stream; charset=utf-8'): Promise> {\n\n //\n const url: string = URL.createObjectURL(new Blob(content, {type: mimetype}));\n //\n const a: HTMLAnchorElement = document.createElement('a');\n document.body.append(a);\n a.style.display = 'none';\n a.download = filename;\n a.href = url;\n\n //\n a.dispatchEvent(new MouseEvent('click'));\n URL.revokeObjectURL(url);\n\n return content;\n}","\nexport function resolve(path: string, from: string): string {\n\n if (path.match(/^['\"]?data:/)) {\n\n return path;\n }\n\n // @ts-ignore\n const baseURL: URL = new URL(from, window.location);\n const pathURL: URL = new URL(path, baseURL);\n\n if (baseURL.protocol != pathURL.protocol ||\n baseURL.host != pathURL.host ||\n pathURL.host != window.location.host ||\n baseURL.port != pathURL.port ||\n pathURL.port != window.location.port ||\n baseURL.port != pathURL.port ||\n pathURL.protocol != window.location.protocol\n ) {\n\n return pathURL.toString();\n }\n\n return pathURL.pathname + pathURL.search + pathURL.hash;\n}","import type {FontObject} from \"../@types\";\n\nexport function fontscript(fonts: FontObject[]): string {\n\n return '/* font preloader script: ' + fonts.length + ' */\\n\"fonts\" in document && ' + JSON.stringify([...fonts], null, 1) + '.forEach(font => new FontFace(font.fontFamily, font.src, font.properties).load().then(font => document.fonts.add(font)))'\n}","import {resolve} from \"../file\";\nimport {fontscript} from \"./fontscript\";\nimport type {\n CriticalExtractOptions,\n CriticalResult,\n FileMapObject,\n FontObject,\n MatchCSSStyleSheet,\n RuleList\n} from \"../@types\";\n\nexport async function extract(options: CriticalExtractOptions = {}) {\n\n const document: Document = window.document;\n const location: Location = window.location;\n const styles: Set = new Set;\n const excluded = ['all', 'print', ''];\n const allStylesheets: MatchCSSStyleSheet[] = [];\n\n // Get a list of all the elements in the view.\n const height = window.innerHeight;\n const walker = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT});\n\n const fonts: Set = new Set;\n const fontFamilies: Set = new Set;\n const files: Map = new Map;\n const weakMap: WeakMap = new WeakMap;\n const nodeMap: Set = new Set;\n let nodeCount: number = 0;\n let k: number;\n let rule: CSSMediaRule | CSSStyleRule;\n let rules;\n\n performance.mark('filterStylesheets');\n\n for (k = 0; k < document.styleSheets.length; k++) {\n\n // @ts-ignore\n rule = document.styleSheets[k];\n\n if (rule.media.mediaText === 'print' || (rule.media.mediaText !== '' && !window.matchMedia(rule.media.mediaText).matches)) {\n\n continue;\n }\n\n try {\n\n\n // @ts-ignore\n rules = (rule).cssRules ?? (rule).rules;\n\n for (let l = 0; l < rules.length; l++) {\n\n allStylesheets.push({rule: rules[l], match: false})\n }\n\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n }\n\n performance.measure('filter stylesheets', 'filterStylesheets');\n\n if (allStylesheets.length === 0) {\n\n return {styles: [], fonts: [], stats: {}};\n }\n\n let node;\n let rect;\n let allStylesLength = allStylesheets.length;\n\n performance.mark('nodeWalking');\n\n while ((node = walker.nextNode())) {\n\n if (options && options.signal && options.signal.aborted) {\n\n return Promise.reject('Aborted');\n }\n\n if (['SCRIPT', 'LINK', 'HEAD', 'META', 'TITLE', 'NOSCRIPT'].includes(node.tagName)) {\n\n continue;\n }\n\n nodeCount++;\n rect = node.getBoundingClientRect();\n\n if (rect.top < height) {\n\n nodeMap.add(node);\n }\n }\n\n for (k = 0; k < allStylesLength; k++) {\n\n if (allStylesheets[k].match || weakMap.has(allStylesheets[k].rule)) {\n\n continue;\n }\n\n weakMap.set(allStylesheets[k].rule, 1);\n\n if (allStylesheets[k].rule instanceof CSSStyleRule) {\n\n // @ts-ignore\n let selector = allStylesheets[k].rule.selectorText;\n let match;\n\n // detect pseudo selectors\n if (selector.match(/(^|,|\\s)::?((before)|(after))/)) {\n\n match = true\n } else {\n\n if (selector.match(/::?((before)|(after))/)) {\n\n selector = selector.replace(/::?((before)|(after))\\s*((,)|$)/g, '$5');\n }\n\n try {\n\n match = nodeMap.has(document.querySelector(selector));\n } catch (e) {\n\n // @ts-ignore\n match = nodeMap.has(document.querySelector(allStylesheets[k].rule.selectorText));\n }\n }\n\n if (match) {\n\n allStylesheets[k].match = true;\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family')) {\n\n // @ts-ignore\n allStylesheets[k].rule.style.getPropertyValue('font-family').split(/\\s*,\\s*/).forEach(fontFamily => fontFamily !== 'inherit' && fontFamilies.add(fontFamily.replace(/(['\"])([^\\1\\s]+)\\1/, '$2')));\n }\n }\n\n } else if (allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule || allStylesheets[k].rule instanceof CSSConditionRule) {\n\n // @ts-ignore\n if ((allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule) && (allStylesheets[k].rule.media.mediaText === 'print' || (allStylesheets[k].rule.media.mediaText !== '' && !window.matchMedia(allStylesheets[k].rule.media.mediaText).matches))) {\n continue;\n }\n\n try {\n\n const rule = allStylesheets[k].rule;\n const rules = [];\n // @ts-ignore\n const sheet = rule instanceof CSSImportRule ? rule.styleSheet.cssRules || rule.styleSheet.rules : rule.cssRules || rule.rules;\n\n for (let l = 0; l < sheet.length; l++) {\n\n if (!weakMap.has(sheet[l])) {\n\n rules.push({rule: sheet[l], match: false})\n }\n }\n\n if (rules.length > 0) {\n\n // @ts-ignore\n allStylesheets.splice.apply(allStylesheets, [k + 1, 0].concat(rules))\n allStylesLength = allStylesheets.length\n }\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n } else if (allStylesheets[k].rule instanceof CSSFontFaceRule) {\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family') && allStylesheets[k].rule.style.getPropertyValue('src')) {\n\n // @ts-ignore\n fonts.add(allStylesheets[k].rule);\n }\n }\n }\n\n performance.measure('node walking', 'nodeWalking');\n\n let css;\n let file = '';\n let inlineCount = -1;\n\n performance.mark('rulesExtraction');\n\n loop1:\n for (let k = 0; k < allStylesLength; k++) {\n\n if (!allStylesheets[k].match) {\n\n continue;\n }\n\n // @ts-ignore\n rule = allStylesheets[k].rule;\n let fileUpdate = false;\n\n // @ts-ignore\n if (!files.has(rule.parentStyleSheet)) {\n\n //\n // @ts-ignore\n files.set(rule.parentStyleSheet, {\n\n // @ts-ignore\n base: (rule.parentStyleSheet.href && rule.parentStyleSheet.href.replace(/[?#].*/, '') || location.pathname).replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: rule.parentStyleSheet.href || `inline style #${++inlineCount}`\n });\n\n fileUpdate = true;\n } else { // @ts-ignore\n if (file != null && file !== files.get(rule.parentStyleSheet).file) {\n\n fileUpdate = true;\n }\n }\n\n if (fileUpdate) {\n\n try {\n\n // @ts-ignore\n console.error('analysing ' + files.get(rule.parentStyleSheet).file);\n // @ts-ignore\n styles.add('/* file: ' + files.get(rule.parentStyleSheet).file + ' */');\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify(e.message, null, 1));\n console.error(JSON.stringify(rule?.parentStyleSheet?.href, null, 1));\n }\n }\n\n file = (files.get(rule.parentStyleSheet)).file;\n css = rule.cssText;\n\n if (file !== 'inline') {\n\n // resolve url()\n css = css.replace(/url\\(([^)%\\s]*?)\\)/g, function (all, one) {\n\n one = one.trim();\n\n if (one.match(/^['\"]?data:/)) {\n\n return all;\n }\n\n one = one.replace(/^(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(rule.parentStyleSheet).base) + ')';\n })\n }\n\n while (rule.parentRule) {\n\n /**\n *\n * @type {CSSMediaRule}\n */\n // @ts-ignore\n rule = rule.parentRule;\n\n // @ts-ignore\n if (rule.conditionText == 'print') {\n\n continue loop1;\n }\n\n // @ts-ignore\n if (!excluded.includes(rule.conditionText)) {\n\n // @ts-ignore\n css = '@' + rule.constructor.name.replace(/^CSS(.*?)Rule/, '$1').toLowerCase() + ' ' + rule.conditionText + ' {' + css + '}';\n }\n\n if (!rule.parentRule) {\n\n break;\n }\n }\n\n if (rule.parentStyleSheet) {\n\n let media = rule.parentStyleSheet.media.mediaText;\n\n if (media === 'print') {\n\n continue;\n }\n\n if (media !== '') {\n\n css = '@media ' + media + ' {' + css + '}';\n }\n }\n\n if (styles.has(css)) {\n\n styles.delete(css);\n }\n\n styles.add(css);\n }\n\n performance.measure('rules extraction', 'rulesExtraction');\n\n const usedFonts = new Map;\n\n if (options.fonts) {\n\n let j;\n let name;\n let value;\n let font: CSSFontFaceRule;\n let fontObject;\n let src;\n\n performance.mark('fontsExtraction');\n\n for (font of fonts) {\n\n if (font.style.getPropertyValue('font-family').split(/\\s*,\\s*/).some(token => {\n\n return fontFamilies.has(token.replace(/(['\"])([^\\1\\s]+)\\1/, '$2'));\n })) {\n\n src = font.style.getPropertyValue('src');\n\n if (!src) {\n\n continue;\n }\n\n fontObject = {\n 'fontFamily': font.style.getPropertyValue('font-family').replace(/(['\"])([^\\1\\s]+)\\1/, '$2'),\n src: src.replace(/(^|[,\\s*])local\\([^)]+\\)\\s*,?\\s*?/g, '').replace(/url\\(([^)%\\s]+)\\)([^,]*)(,?)\\s*/g, (all, one, two, three) => {\n\n one = one.replace(/(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n if (!files.has(font.parentStyleSheet)) {\n\n // @ts-ignore\n if (!font.parentStyleSheet.href) {\n\n return all;\n }\n\n // @ts-ignore\n files.set(font.parentStyleSheet, {\n\n // @ts-ignore\n base: font.parentStyleSheet.href.replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: font.parentStyleSheet.href\n })\n }\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(font.parentStyleSheet).base) + ')' + three;\n }).trim(),\n properties: {}\n }\n\n j = font.style.length;\n\n while (j--) {\n\n name = font.style.item(j);\n value = font.style.getPropertyValue(name);\n\n name !== 'font-family' &&\n name !== 'src' &&\n value !== '' &&\n value !== undefined &&\n // @ts-ignore\n (fontObject.properties[name.replace(/([A-Z])/g, (all, name) => '-' + name.toLowerCase())] = value)\n }\n\n usedFonts.set(JSON.stringify(fontObject), fontObject)\n }\n }\n\n performance.measure('fonts extraction', 'fontsExtraction');\n }\n\n const stats = performance.getEntriesByType(\"measure\").filter(entry => ['filter stylesheets', 'node walking', 'rules extraction', 'fonts extraction'].includes(entry.name)).map(entry => {\n\n return {\n\n name: entry.name,\n\n duration: (entry.duration / 1000).toFixed(3) + 's'\n }\n });\n\n\n const result: CriticalResult = {\n styles: [...styles],\n fonts: [...usedFonts.values()],\n nodeCount,\n stats: {nodeCount, stats}\n };\n\n if (options.html) {\n\n if (!document.querySelector('base')) {\n\n const base: HTMLBaseElement = document.createElement('base');\n\n base.href = options.base ?? (location.protocol + '//' + location.host + location.pathname);\n document.head.insertBefore(base, document.querySelector('meta[charset]')?.nextElementSibling || document.head.firstChild)\n }\n\n if (!document.querySelector('meta[charset]')) {\n\n const meta = document.createElement('meta');\n meta.setAttribute('charset', 'utf-8');\n document.head.insertBefore(meta, document.head.firstChild)\n }\n\n // @ts-ignore\n Array.from(document.querySelectorAll('style,link[rel=stylesheet]')).forEach((node: HTMLLinkElement | HTMLStyleElement) => {\n\n document.body.append(node);\n\n if (node.tagName === 'LINK') {\n\n if (node.media === 'print') {\n\n return\n }\n\n if (node.hasAttribute('media')) {\n\n node.setAttribute('data-media', node.media);\n }\n\n node.media = 'print';\n node.dataset.async = '';\n }\n });\n\n const script: HTMLScriptElement = document.createElement('script');\n\n script.textContent = `\n window.addEventListener('DOMContentLoaded', () => Array.from(document.querySelectorAll('link[data-async]')).forEach(node => {\n\n if(!node.hasAttribute('data-media')) {\n node.removeAttribute('media');\n }\n else {\n node.media=node.dataset.media;\n node.removeAttribute('data-media')\n }\n \n node.removeAttribute('data-async');\n }))`;\n\n document.head.append(script);\n\n // add data-attribute\n const style: HTMLStyleElement = document.createElement('style');\n // @ts-ignore\n style.dataset.critical = true;\n style.textContent = [...usedFonts.values()].map((entry) => {\n\n return '@font-face {' + '\\n ' + Object.entries(entry).map(entry => {\n\n // @ts-ignore\n return typeof entry[1] == 'string' ? `${entry[0] + ': ' + entry[1]}` : Object.entries(entry[1]).map(entry => `${entry[0] + ': ' + entry[1]}`).join(';\\n ') + '\\n}'\n }).join(';\\n')\n }).join('\\n') +\n '\\n' + (result.styles).join('\\n');\n\n if (style.textContent.trim() !== '') {\n\n document.head.insertBefore(style, document.querySelector('base')?.nextElementSibling);\n }\n\n if ((result.fonts).length > 0) {\n\n const script = document.createElement('script');\n script.textContent = fontscript(result.fonts);\n document.head.append(script);\n }\n\n const doctype: DocumentType = document.doctype as DocumentType;\n\n result.html = `` + '\\n' + document.documentElement.outerHTML\n }\n\n return result;\n}","import {extract} from \"./critical/extract\";\nimport {download} from \"./file/download\";\nimport {fontscript} from \"./critical/fontscript\";\nimport {CriticalExtractOptions, CriticalResult} from \"./@types\";\n\nasync function extractAndDownload(filename: string = 'critical.css', options: CriticalExtractOptions = {}): Promise {\n\n return extract(options).\n then(async (content : CriticalResult): Promise => download(content.styles, filename, 'text/css; charset=utf-8').\n then(async () => {\n\n if ((content.fonts).length > 0) {\n\n // @ts-ignore\n return download([fontscript(content.fonts)], filename.replace(/\\.css$/, '.js'), 'text/javascript; charset=utf-8');\n }\n }).\n then(() => content)\n );\n}\n\nexport {extract, fontscript, extractAndDownload as download}"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser-umd.js","sources":["../src/file/download.ts","../src/file/path.ts","../src/critical/fontscript.ts","../src/critical/extract.ts","../src/browser.ts"],"sourcesContent":["/**\n *\n * @param {string[]} content\n * @param {string} filename\n * @param {string} mimetype\n * @return {Promise}\n */\nexport async function download(content: Array, filename: string, mimetype: string = 'application/octet-stream; charset=utf-8'): Promise> {\n\n //\n const url: string = URL.createObjectURL(new Blob(content, {type: mimetype}));\n //\n const a: HTMLAnchorElement = document.createElement('a');\n document.body.append(a);\n a.style.display = 'none';\n a.download = filename;\n a.href = url;\n\n //\n a.dispatchEvent(new MouseEvent('click'));\n URL.revokeObjectURL(url);\n\n return content;\n}","\nexport function resolve(path: string, from: string): string {\n\n if (path.match(/^['\"]?data:/)) {\n\n return path;\n }\n\n // @ts-ignore\n const baseURL: URL = new URL(from, window.location);\n const pathURL: URL = new URL(path, baseURL);\n\n if (baseURL.protocol != pathURL.protocol ||\n baseURL.host != pathURL.host ||\n pathURL.host != window.location.host ||\n baseURL.port != pathURL.port ||\n pathURL.port != window.location.port ||\n baseURL.port != pathURL.port ||\n pathURL.protocol != window.location.protocol\n ) {\n\n return pathURL.toString();\n }\n\n return pathURL.pathname + pathURL.search + pathURL.hash;\n}","import type {FontObject} from \"../@types\";\n\nexport function fontscript(fonts: FontObject[]): string {\n\n return '/* font preloader script: ' + fonts.length + ' */\\n\"fonts\" in document && ' + JSON.stringify([...fonts], null, 1) + '.forEach(font => new FontFace(font.fontFamily, font.src, font.properties).load().then(font => document.fonts.add(font)))'\n}","import {resolve} from \"../file\";\nimport {fontscript} from \"./fontscript\";\nimport type {\n CriticalExtractOptions,\n CriticalResult,\n FileMapObject,\n FontObject,\n MatchCSSStyleSheet,\n RuleList\n} from \"../@types\";\n\nexport async function extract(options: CriticalExtractOptions = {}) {\n\n const document: Document = window.document;\n const location: Location = window.location;\n const styles: Set = new Set;\n const excluded: string[] = ['all', 'print', ''];\n const allStylesheets: MatchCSSStyleSheet[] = [];\n\n // Get a list of all the elements in the view.\n const height: number = window.innerHeight;\n const walker: NodeIterator = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT});\n\n const fonts: Set = new Set;\n const fontFamilies: Set = new Set;\n const files: Map = new Map;\n const weakMap: WeakMap = new WeakMap;\n const nodeMap: Set = new Set;\n let nodeCount: number = 0;\n let k: number;\n let rule: CSSMediaRule | CSSStyleRule;\n let rules;\n\n performance.mark('filterStylesheets');\n\n for (k = 0; k < document.styleSheets.length; k++) {\n\n // @ts-ignore\n rule = document.styleSheets[k];\n\n if (rule.media.mediaText === 'print' || (rule.media.mediaText !== '' && !window.matchMedia(rule.media.mediaText).matches)) {\n\n continue;\n }\n\n try {\n\n // @ts-ignore\n rules = (rule).cssRules ?? (rule).rules;\n\n for (let l = 0; l < rules.length; l++) {\n\n allStylesheets.push({rule: rules[l], match: false})\n }\n\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n }\n\n performance.measure('filter stylesheets', 'filterStylesheets');\n\n if (allStylesheets.length === 0) {\n\n return {styles: [], fonts: [], stats: {}};\n }\n\n let node;\n let rect;\n let allStylesLength = allStylesheets.length;\n\n performance.mark('nodeWalking');\n\n while ((node = walker.nextNode())) {\n\n if (options && options.signal && options.signal.aborted) {\n\n return Promise.reject('Aborted');\n }\n\n if (['SCRIPT', 'LINK', 'HEAD', 'META', 'TITLE', 'NOSCRIPT'].includes(node.tagName)) {\n\n continue;\n }\n\n nodeCount++;\n rect = node.getBoundingClientRect();\n\n if (rect.top < height) {\n\n nodeMap.add(node);\n }\n }\n\n for (k = 0; k < allStylesLength; k++) {\n\n if (allStylesheets[k].match || weakMap.has(allStylesheets[k].rule)) {\n\n continue;\n }\n\n weakMap.set(allStylesheets[k].rule, 1);\n\n if (allStylesheets[k].rule instanceof CSSStyleRule) {\n\n // @ts-ignore\n let selector = allStylesheets[k].rule.selectorText;\n let match;\n\n // detect pseudo selectors\n if (selector.match(/(^|,|\\s)::?((before)|(after))/)) {\n\n match = true\n } else {\n\n if (selector.match(/::?((before)|(after))/)) {\n\n selector = selector.replace(/::?((before)|(after))\\s*((,)|$)/g, '$5');\n }\n\n try {\n\n match = nodeMap.has(document.querySelector(selector));\n } catch (e) {\n\n // @ts-ignore\n match = nodeMap.has(document.querySelector(allStylesheets[k].rule.selectorText));\n }\n }\n\n if (match) {\n\n allStylesheets[k].match = true;\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family')) {\n\n // @ts-ignore\n allStylesheets[k].rule.style.getPropertyValue('font-family').split(/\\s*,\\s*/).forEach(fontFamily => fontFamily !== 'inherit' && fontFamilies.add(fontFamily.replace(/(['\"])([^\\1\\s]+)\\1/, '$2')));\n }\n }\n\n } else if (allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule || allStylesheets[k].rule instanceof CSSConditionRule) {\n\n // @ts-ignore\n if ((allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule) && (allStylesheets[k].rule.media.mediaText === 'print' || (allStylesheets[k].rule.media.mediaText !== '' && !window.matchMedia(allStylesheets[k].rule.media.mediaText).matches))) {\n continue;\n }\n\n try {\n\n const rule = allStylesheets[k].rule;\n const rules = [];\n // @ts-ignore\n const sheet = rule instanceof CSSImportRule ? rule.styleSheet.cssRules || rule.styleSheet.rules : rule.cssRules || rule.rules;\n\n for (let l = 0; l < sheet.length; l++) {\n\n if (!weakMap.has(sheet[l])) {\n\n rules.push({rule: sheet[l], match: false})\n }\n }\n\n if (rules.length > 0) {\n\n // @ts-ignore\n allStylesheets.splice.apply(allStylesheets, [k + 1, 0].concat(rules))\n allStylesLength = allStylesheets.length\n }\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n } else if (allStylesheets[k].rule instanceof CSSFontFaceRule) {\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family') && allStylesheets[k].rule.style.getPropertyValue('src')) {\n\n // @ts-ignore\n fonts.add(allStylesheets[k].rule);\n }\n }\n }\n\n performance.measure('node walking', 'nodeWalking');\n\n let css;\n let file = '';\n let inlineCount = -1;\n\n performance.mark('rulesExtraction');\n\n loop1:\n for (let k = 0; k < allStylesLength; k++) {\n\n if (!allStylesheets[k].match) {\n\n continue;\n }\n\n // @ts-ignore\n rule = allStylesheets[k].rule;\n let fileUpdate: boolean = false;\n\n // @ts-ignore\n if (!files.has(rule.parentStyleSheet)) {\n\n //\n // @ts-ignore\n files.set(rule.parentStyleSheet, {\n\n // @ts-ignore\n base: (rule.parentStyleSheet.href && rule.parentStyleSheet.href.replace(/[?#].*/, '') || location.pathname).replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: rule.parentStyleSheet.href || `inline style #${++inlineCount}`\n });\n\n fileUpdate = true;\n } else { // @ts-ignore\n if (file != null && file !== files.get(rule.parentStyleSheet).file) {\n\n fileUpdate = true;\n }\n }\n\n if (fileUpdate) {\n\n try {\n\n // @ts-ignore\n console.error('analysing ' + files.get(rule.parentStyleSheet).file);\n // @ts-ignore\n styles.add('/* file: ' + files.get(rule.parentStyleSheet).file + ' */');\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify(e.message, null, 1));\n console.error(JSON.stringify(rule?.parentStyleSheet?.href, null, 1));\n }\n }\n\n file = (files.get(rule.parentStyleSheet)).file;\n css = rule.cssText;\n\n // @ts-ignore\n console.error({sel: rule.selectorText, css});\n\n if (file !== 'inline') {\n\n // resolve url()\n css = css.replace(/url\\(([^)%\\s]*?)\\)/g, function (all, one) {\n\n one = one.trim();\n\n if (one.match(/^['\"]?data:/)) {\n\n return all;\n }\n\n one = one.replace(/^(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(rule.parentStyleSheet).base) + ')';\n })\n }\n\n while (rule.parentRule) {\n\n /**\n *\n * @type {CSSMediaRule}\n */\n // @ts-ignore\n rule = rule.parentRule;\n\n // @ts-ignore\n if (rule.conditionText == 'print') {\n\n continue loop1;\n }\n\n // @ts-ignore\n if (!excluded.includes(rule.conditionText)) {\n\n // @ts-ignore\n css = '@' + rule.constructor.name.replace(/^CSS(.*?)Rule/, '$1').toLowerCase() + ' ' + rule.conditionText + ' {' + css + '}';\n }\n\n if (!rule.parentRule) {\n\n break;\n }\n }\n\n if (rule.parentStyleSheet) {\n\n let media: string = rule.parentStyleSheet.media.mediaText;\n\n if (media === 'print') {\n\n continue;\n }\n\n if (media !== '') {\n\n css = '@media ' + media + ' {' + css + '}';\n }\n }\n\n if (styles.has(css)) {\n\n styles.delete(css);\n }\n\n styles.add(css);\n }\n\n performance.measure('rules extraction', 'rulesExtraction');\n\n const usedFonts = new Map;\n\n if (options.fonts) {\n\n let j;\n let name;\n let value;\n let font: CSSFontFaceRule;\n let fontObject;\n let src;\n\n performance.mark('fontsExtraction');\n\n for (font of fonts) {\n\n if (font.style.getPropertyValue('font-family').split(/\\s*,\\s*/).some(token => {\n\n return fontFamilies.has(token.replace(/(['\"])([^\\1\\s]+)\\1/, '$2'));\n })) {\n\n src = font.style.getPropertyValue('src');\n\n if (!src) {\n\n continue;\n }\n\n fontObject = {\n 'fontFamily': font.style.getPropertyValue('font-family').replace(/(['\"])([^\\1\\s]+)\\1/, '$2'),\n src: src.replace(/(^|[,\\s*])local\\([^)]+\\)\\s*,?\\s*?/g, '').replace(/url\\(([^)%\\s]+)\\)([^,]*)(,?)\\s*/g, (all, one, two, three) => {\n\n one = one.replace(/(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n if (!files.has(font.parentStyleSheet)) {\n\n // @ts-ignore\n if (!font.parentStyleSheet.href) {\n\n return all;\n }\n\n // @ts-ignore\n files.set(font.parentStyleSheet, {\n\n // @ts-ignore\n base: font.parentStyleSheet.href.replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: font.parentStyleSheet.href\n })\n }\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(font.parentStyleSheet).base) + ')' + three;\n }).trim(),\n properties: {}\n }\n\n j = font.style.length;\n\n while (j--) {\n\n name = font.style.item(j);\n value = font.style.getPropertyValue(name);\n\n name !== 'font-family' &&\n name !== 'src' &&\n value !== '' &&\n value !== undefined &&\n // @ts-ignore\n (fontObject.properties[name.replace(/([A-Z])/g, (all, name) => '-' + name.toLowerCase())] = value)\n }\n\n usedFonts.set(JSON.stringify(fontObject), fontObject)\n }\n }\n\n performance.measure('fonts extraction', 'fontsExtraction');\n }\n\n const stats = performance.getEntriesByType(\"measure\").filter(entry => ['filter stylesheets', 'node walking', 'rules extraction', 'fonts extraction'].includes(entry.name)).map(entry => {\n\n return {\n\n name: entry.name,\n duration: (entry.duration / 1000).toFixed(3) + 's'\n }\n });\n\n\n const result: CriticalResult = {\n styles: [...styles],\n fonts: [...usedFonts.values()],\n nodeCount,\n stats: {nodeCount, stats}\n };\n\n if (options.html) {\n\n if (!document.querySelector('base')) {\n\n const base: HTMLBaseElement = document.createElement('base');\n\n base.href = options.base ?? (location.protocol + '//' + location.host + location.pathname);\n document.head.insertBefore(base, document.querySelector('meta[charset]')?.nextElementSibling || document.head.firstChild)\n }\n\n if (!document.querySelector('meta[charset]')) {\n\n const meta = document.createElement('meta');\n meta.setAttribute('charset', 'utf-8');\n document.head.insertBefore(meta, document.head.firstChild)\n }\n\n // @ts-ignore\n Array.from(document.querySelectorAll('style,link[rel=stylesheet]')).forEach((node: HTMLLinkElement | HTMLStyleElement) => {\n\n document.body.append(node);\n\n if (node.tagName === 'LINK') {\n\n if (node.media === 'print') {\n\n return\n }\n\n if (node.hasAttribute('media')) {\n\n node.setAttribute('data-media', node.media);\n }\n\n node.media = 'print';\n node.dataset.async = '';\n }\n });\n\n const script: HTMLScriptElement = document.createElement('script');\n\n script.textContent = `\n window.addEventListener('DOMContentLoaded', () => Array.from(document.querySelectorAll('link[data-async]')).forEach(node => {\n\n if(!node.hasAttribute('data-media')) {\n node.removeAttribute('media');\n }\n else {\n node.media=node.dataset.media;\n node.removeAttribute('data-media')\n }\n \n node.removeAttribute('data-async');\n }))`;\n\n document.head.append(script);\n\n // add data-attribute\n const style: HTMLStyleElement = document.createElement('style');\n // @ts-ignore\n style.dataset.critical = true;\n style.textContent = [...usedFonts.values()].map((entry) => {\n\n return '@font-face {' + '\\n ' + Object.entries(entry).map(entry => {\n\n // @ts-ignore\n return typeof entry[1] == 'string' ? `${entry[0] + ': ' + entry[1]}` : Object.entries(entry[1]).map(entry => `${entry[0] + ': ' + entry[1]}`).join(';\\n ') + '\\n}'\n }).join(';\\n')\n }).join('\\n') +\n '\\n' + (result.styles).join('\\n');\n\n if (style.textContent.trim() !== '') {\n\n document.head.insertBefore(style, document.querySelector('base')?.nextElementSibling);\n }\n\n if ((result.fonts).length > 0) {\n\n const script: HTMLScriptElement = document.createElement('script');\n script.textContent = fontscript(result.fonts);\n document.head.append(script);\n }\n\n const doctype: DocumentType = document.doctype as DocumentType;\n\n result.html = `` + '\\n' + document.documentElement.outerHTML\n }\n\n return result;\n}\n","import {extract} from \"./critical/extract\";\nimport {download} from \"./file/download\";\nimport {fontscript} from \"./critical/fontscript\";\nimport {CriticalExtractOptions, CriticalResult} from \"./@types\";\n\nasync function extractAndDownload(filename: string = 'critical.css', options: CriticalExtractOptions = {}): Promise {\n\n return extract(options).\n then(async (content : CriticalResult): Promise => download(content.styles, filename, 'text/css; charset=utf-8').\n then(async () => {\n\n if ((content.fonts).length > 0) {\n\n // @ts-ignore\n return download([fontscript(content.fonts)], filename.replace(/\\.css$/, '.js'), 'text/javascript; charset=utf-8');\n }\n }).\n then(() => content)\n );\n}\n\nexport {extract, fontscript, extractAndDownload as download}"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/browser.js b/dist/browser.js index 185e65b..b1b2c10 100644 --- a/dist/browser.js +++ b/dist/browser.js @@ -213,6 +213,8 @@ async function extract(options = {}) { } file = files.get(rule.parentStyleSheet).file; css = rule.cssText; + // @ts-ignore + console.error({ sel: rule.selectorText, css }); if (file !== 'inline') { // resolve url() css = css.replace(/url\(([^)%\s]*?)\)/g, function (all, one) { diff --git a/dist/browser.js.map b/dist/browser.js.map index 36986f6..18cc2c4 100644 --- a/dist/browser.js.map +++ b/dist/browser.js.map @@ -1 +1 @@ -{"version":3,"file":"browser.js","sources":["../src/file/download.ts","../src/file/path.ts","../src/critical/fontscript.ts","../src/critical/extract.ts","../src/browser.ts"],"sourcesContent":["/**\n *\n * @param {string[]} content\n * @param {string} filename\n * @param {string} mimetype\n * @return {Promise}\n */\nexport async function download(content: Array, filename: string, mimetype: string = 'application/octet-stream; charset=utf-8'): Promise> {\n\n //\n const url: string = URL.createObjectURL(new Blob(content, {type: mimetype}));\n //\n const a: HTMLAnchorElement = document.createElement('a');\n document.body.append(a);\n a.style.display = 'none';\n a.download = filename;\n a.href = url;\n\n //\n a.dispatchEvent(new MouseEvent('click'));\n URL.revokeObjectURL(url);\n\n return content;\n}","\nexport function resolve(path: string, from: string): string {\n\n if (path.match(/^['\"]?data:/)) {\n\n return path;\n }\n\n // @ts-ignore\n const baseURL: URL = new URL(from, window.location);\n const pathURL: URL = new URL(path, baseURL);\n\n if (baseURL.protocol != pathURL.protocol ||\n baseURL.host != pathURL.host ||\n pathURL.host != window.location.host ||\n baseURL.port != pathURL.port ||\n pathURL.port != window.location.port ||\n baseURL.port != pathURL.port ||\n pathURL.protocol != window.location.protocol\n ) {\n\n return pathURL.toString();\n }\n\n return pathURL.pathname + pathURL.search + pathURL.hash;\n}","import type {FontObject} from \"../@types\";\n\nexport function fontscript(fonts: FontObject[]): string {\n\n return '/* font preloader script: ' + fonts.length + ' */\\n\"fonts\" in document && ' + JSON.stringify([...fonts], null, 1) + '.forEach(font => new FontFace(font.fontFamily, font.src, font.properties).load().then(font => document.fonts.add(font)))'\n}","import {resolve} from \"../file\";\nimport {fontscript} from \"./fontscript\";\nimport type {\n CriticalExtractOptions,\n CriticalResult,\n FileMapObject,\n FontObject,\n MatchCSSStyleSheet,\n RuleList\n} from \"../@types\";\n\nexport async function extract(options: CriticalExtractOptions = {}) {\n\n const document: Document = window.document;\n const location: Location = window.location;\n const styles: Set = new Set;\n const excluded = ['all', 'print', ''];\n const allStylesheets: MatchCSSStyleSheet[] = [];\n\n // Get a list of all the elements in the view.\n const height = window.innerHeight;\n const walker = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT});\n\n const fonts: Set = new Set;\n const fontFamilies: Set = new Set;\n const files: Map = new Map;\n const weakMap: WeakMap = new WeakMap;\n const nodeMap: Set = new Set;\n let nodeCount: number = 0;\n let k: number;\n let rule: CSSMediaRule | CSSStyleRule;\n let rules;\n\n performance.mark('filterStylesheets');\n\n for (k = 0; k < document.styleSheets.length; k++) {\n\n // @ts-ignore\n rule = document.styleSheets[k];\n\n if (rule.media.mediaText === 'print' || (rule.media.mediaText !== '' && !window.matchMedia(rule.media.mediaText).matches)) {\n\n continue;\n }\n\n try {\n\n\n // @ts-ignore\n rules = (rule).cssRules ?? (rule).rules;\n\n for (let l = 0; l < rules.length; l++) {\n\n allStylesheets.push({rule: rules[l], match: false})\n }\n\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n }\n\n performance.measure('filter stylesheets', 'filterStylesheets');\n\n if (allStylesheets.length === 0) {\n\n return {styles: [], fonts: [], stats: {}};\n }\n\n let node;\n let rect;\n let allStylesLength = allStylesheets.length;\n\n performance.mark('nodeWalking');\n\n while ((node = walker.nextNode())) {\n\n if (options && options.signal && options.signal.aborted) {\n\n return Promise.reject('Aborted');\n }\n\n if (['SCRIPT', 'LINK', 'HEAD', 'META', 'TITLE', 'NOSCRIPT'].includes(node.tagName)) {\n\n continue;\n }\n\n nodeCount++;\n rect = node.getBoundingClientRect();\n\n if (rect.top < height) {\n\n nodeMap.add(node);\n }\n }\n\n for (k = 0; k < allStylesLength; k++) {\n\n if (allStylesheets[k].match || weakMap.has(allStylesheets[k].rule)) {\n\n continue;\n }\n\n weakMap.set(allStylesheets[k].rule, 1);\n\n if (allStylesheets[k].rule instanceof CSSStyleRule) {\n\n // @ts-ignore\n let selector = allStylesheets[k].rule.selectorText;\n let match;\n\n // detect pseudo selectors\n if (selector.match(/(^|,|\\s)::?((before)|(after))/)) {\n\n match = true\n } else {\n\n if (selector.match(/::?((before)|(after))/)) {\n\n selector = selector.replace(/::?((before)|(after))\\s*((,)|$)/g, '$5');\n }\n\n try {\n\n match = nodeMap.has(document.querySelector(selector));\n } catch (e) {\n\n // @ts-ignore\n match = nodeMap.has(document.querySelector(allStylesheets[k].rule.selectorText));\n }\n }\n\n if (match) {\n\n allStylesheets[k].match = true;\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family')) {\n\n // @ts-ignore\n allStylesheets[k].rule.style.getPropertyValue('font-family').split(/\\s*,\\s*/).forEach(fontFamily => fontFamily !== 'inherit' && fontFamilies.add(fontFamily.replace(/(['\"])([^\\1\\s]+)\\1/, '$2')));\n }\n }\n\n } else if (allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule || allStylesheets[k].rule instanceof CSSConditionRule) {\n\n // @ts-ignore\n if ((allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule) && (allStylesheets[k].rule.media.mediaText === 'print' || (allStylesheets[k].rule.media.mediaText !== '' && !window.matchMedia(allStylesheets[k].rule.media.mediaText).matches))) {\n continue;\n }\n\n try {\n\n const rule = allStylesheets[k].rule;\n const rules = [];\n // @ts-ignore\n const sheet = rule instanceof CSSImportRule ? rule.styleSheet.cssRules || rule.styleSheet.rules : rule.cssRules || rule.rules;\n\n for (let l = 0; l < sheet.length; l++) {\n\n if (!weakMap.has(sheet[l])) {\n\n rules.push({rule: sheet[l], match: false})\n }\n }\n\n if (rules.length > 0) {\n\n // @ts-ignore\n allStylesheets.splice.apply(allStylesheets, [k + 1, 0].concat(rules))\n allStylesLength = allStylesheets.length\n }\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n } else if (allStylesheets[k].rule instanceof CSSFontFaceRule) {\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family') && allStylesheets[k].rule.style.getPropertyValue('src')) {\n\n // @ts-ignore\n fonts.add(allStylesheets[k].rule);\n }\n }\n }\n\n performance.measure('node walking', 'nodeWalking');\n\n let css;\n let file = '';\n let inlineCount = -1;\n\n performance.mark('rulesExtraction');\n\n loop1:\n for (let k = 0; k < allStylesLength; k++) {\n\n if (!allStylesheets[k].match) {\n\n continue;\n }\n\n // @ts-ignore\n rule = allStylesheets[k].rule;\n let fileUpdate = false;\n\n // @ts-ignore\n if (!files.has(rule.parentStyleSheet)) {\n\n //\n // @ts-ignore\n files.set(rule.parentStyleSheet, {\n\n // @ts-ignore\n base: (rule.parentStyleSheet.href && rule.parentStyleSheet.href.replace(/[?#].*/, '') || location.pathname).replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: rule.parentStyleSheet.href || `inline style #${++inlineCount}`\n });\n\n fileUpdate = true;\n } else { // @ts-ignore\n if (file != null && file !== files.get(rule.parentStyleSheet).file) {\n\n fileUpdate = true;\n }\n }\n\n if (fileUpdate) {\n\n try {\n\n // @ts-ignore\n console.error('analysing ' + files.get(rule.parentStyleSheet).file);\n // @ts-ignore\n styles.add('/* file: ' + files.get(rule.parentStyleSheet).file + ' */');\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify(e.message, null, 1));\n console.error(JSON.stringify(rule?.parentStyleSheet?.href, null, 1));\n }\n }\n\n file = (files.get(rule.parentStyleSheet)).file;\n css = rule.cssText;\n\n if (file !== 'inline') {\n\n // resolve url()\n css = css.replace(/url\\(([^)%\\s]*?)\\)/g, function (all, one) {\n\n one = one.trim();\n\n if (one.match(/^['\"]?data:/)) {\n\n return all;\n }\n\n one = one.replace(/^(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(rule.parentStyleSheet).base) + ')';\n })\n }\n\n while (rule.parentRule) {\n\n /**\n *\n * @type {CSSMediaRule}\n */\n // @ts-ignore\n rule = rule.parentRule;\n\n // @ts-ignore\n if (rule.conditionText == 'print') {\n\n continue loop1;\n }\n\n // @ts-ignore\n if (!excluded.includes(rule.conditionText)) {\n\n // @ts-ignore\n css = '@' + rule.constructor.name.replace(/^CSS(.*?)Rule/, '$1').toLowerCase() + ' ' + rule.conditionText + ' {' + css + '}';\n }\n\n if (!rule.parentRule) {\n\n break;\n }\n }\n\n if (rule.parentStyleSheet) {\n\n let media = rule.parentStyleSheet.media.mediaText;\n\n if (media === 'print') {\n\n continue;\n }\n\n if (media !== '') {\n\n css = '@media ' + media + ' {' + css + '}';\n }\n }\n\n if (styles.has(css)) {\n\n styles.delete(css);\n }\n\n styles.add(css);\n }\n\n performance.measure('rules extraction', 'rulesExtraction');\n\n const usedFonts = new Map;\n\n if (options.fonts) {\n\n let j;\n let name;\n let value;\n let font: CSSFontFaceRule;\n let fontObject;\n let src;\n\n performance.mark('fontsExtraction');\n\n for (font of fonts) {\n\n if (font.style.getPropertyValue('font-family').split(/\\s*,\\s*/).some(token => {\n\n return fontFamilies.has(token.replace(/(['\"])([^\\1\\s]+)\\1/, '$2'));\n })) {\n\n src = font.style.getPropertyValue('src');\n\n if (!src) {\n\n continue;\n }\n\n fontObject = {\n 'fontFamily': font.style.getPropertyValue('font-family').replace(/(['\"])([^\\1\\s]+)\\1/, '$2'),\n src: src.replace(/(^|[,\\s*])local\\([^)]+\\)\\s*,?\\s*?/g, '').replace(/url\\(([^)%\\s]+)\\)([^,]*)(,?)\\s*/g, (all, one, two, three) => {\n\n one = one.replace(/(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n if (!files.has(font.parentStyleSheet)) {\n\n // @ts-ignore\n if (!font.parentStyleSheet.href) {\n\n return all;\n }\n\n // @ts-ignore\n files.set(font.parentStyleSheet, {\n\n // @ts-ignore\n base: font.parentStyleSheet.href.replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: font.parentStyleSheet.href\n })\n }\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(font.parentStyleSheet).base) + ')' + three;\n }).trim(),\n properties: {}\n }\n\n j = font.style.length;\n\n while (j--) {\n\n name = font.style.item(j);\n value = font.style.getPropertyValue(name);\n\n name !== 'font-family' &&\n name !== 'src' &&\n value !== '' &&\n value !== undefined &&\n // @ts-ignore\n (fontObject.properties[name.replace(/([A-Z])/g, (all, name) => '-' + name.toLowerCase())] = value)\n }\n\n usedFonts.set(JSON.stringify(fontObject), fontObject)\n }\n }\n\n performance.measure('fonts extraction', 'fontsExtraction');\n }\n\n const stats = performance.getEntriesByType(\"measure\").filter(entry => ['filter stylesheets', 'node walking', 'rules extraction', 'fonts extraction'].includes(entry.name)).map(entry => {\n\n return {\n\n name: entry.name,\n\n duration: (entry.duration / 1000).toFixed(3) + 's'\n }\n });\n\n\n const result: CriticalResult = {\n styles: [...styles],\n fonts: [...usedFonts.values()],\n nodeCount,\n stats: {nodeCount, stats}\n };\n\n if (options.html) {\n\n if (!document.querySelector('base')) {\n\n const base: HTMLBaseElement = document.createElement('base');\n\n base.href = options.base ?? (location.protocol + '//' + location.host + location.pathname);\n document.head.insertBefore(base, document.querySelector('meta[charset]')?.nextElementSibling || document.head.firstChild)\n }\n\n if (!document.querySelector('meta[charset]')) {\n\n const meta = document.createElement('meta');\n meta.setAttribute('charset', 'utf-8');\n document.head.insertBefore(meta, document.head.firstChild)\n }\n\n // @ts-ignore\n Array.from(document.querySelectorAll('style,link[rel=stylesheet]')).forEach((node: HTMLLinkElement | HTMLStyleElement) => {\n\n document.body.append(node);\n\n if (node.tagName === 'LINK') {\n\n if (node.media === 'print') {\n\n return\n }\n\n if (node.hasAttribute('media')) {\n\n node.setAttribute('data-media', node.media);\n }\n\n node.media = 'print';\n node.dataset.async = '';\n }\n });\n\n const script: HTMLScriptElement = document.createElement('script');\n\n script.textContent = `\n window.addEventListener('DOMContentLoaded', () => Array.from(document.querySelectorAll('link[data-async]')).forEach(node => {\n\n if(!node.hasAttribute('data-media')) {\n node.removeAttribute('media');\n }\n else {\n node.media=node.dataset.media;\n node.removeAttribute('data-media')\n }\n \n node.removeAttribute('data-async');\n }))`;\n\n document.head.append(script);\n\n // add data-attribute\n const style: HTMLStyleElement = document.createElement('style');\n // @ts-ignore\n style.dataset.critical = true;\n style.textContent = [...usedFonts.values()].map((entry) => {\n\n return '@font-face {' + '\\n ' + Object.entries(entry).map(entry => {\n\n // @ts-ignore\n return typeof entry[1] == 'string' ? `${entry[0] + ': ' + entry[1]}` : Object.entries(entry[1]).map(entry => `${entry[0] + ': ' + entry[1]}`).join(';\\n ') + '\\n}'\n }).join(';\\n')\n }).join('\\n') +\n '\\n' + (result.styles).join('\\n');\n\n if (style.textContent.trim() !== '') {\n\n document.head.insertBefore(style, document.querySelector('base')?.nextElementSibling);\n }\n\n if ((result.fonts).length > 0) {\n\n const script = document.createElement('script');\n script.textContent = fontscript(result.fonts);\n document.head.append(script);\n }\n\n const doctype: DocumentType = document.doctype as DocumentType;\n\n result.html = `` + '\\n' + document.documentElement.outerHTML\n }\n\n return result;\n}","import {extract} from \"./critical/extract\";\nimport {download} from \"./file/download\";\nimport {fontscript} from \"./critical/fontscript\";\nimport {CriticalExtractOptions, CriticalResult} from \"./@types\";\n\nasync function extractAndDownload(filename: string = 'critical.css', options: CriticalExtractOptions = {}): Promise {\n\n return extract(options).\n then(async (content : CriticalResult): Promise => download(content.styles, filename, 'text/css; charset=utf-8').\n then(async () => {\n\n if ((content.fonts).length > 0) {\n\n // @ts-ignore\n return download([fontscript(content.fonts)], filename.replace(/\\.css$/, '.js'), 'text/javascript; charset=utf-8');\n }\n }).\n then(() => content)\n );\n}\n\nexport {extract, fontscript, extractAndDownload as download}"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser.js","sources":["../src/file/download.ts","../src/file/path.ts","../src/critical/fontscript.ts","../src/critical/extract.ts","../src/browser.ts"],"sourcesContent":["/**\n *\n * @param {string[]} content\n * @param {string} filename\n * @param {string} mimetype\n * @return {Promise}\n */\nexport async function download(content: Array, filename: string, mimetype: string = 'application/octet-stream; charset=utf-8'): Promise> {\n\n //\n const url: string = URL.createObjectURL(new Blob(content, {type: mimetype}));\n //\n const a: HTMLAnchorElement = document.createElement('a');\n document.body.append(a);\n a.style.display = 'none';\n a.download = filename;\n a.href = url;\n\n //\n a.dispatchEvent(new MouseEvent('click'));\n URL.revokeObjectURL(url);\n\n return content;\n}","\nexport function resolve(path: string, from: string): string {\n\n if (path.match(/^['\"]?data:/)) {\n\n return path;\n }\n\n // @ts-ignore\n const baseURL: URL = new URL(from, window.location);\n const pathURL: URL = new URL(path, baseURL);\n\n if (baseURL.protocol != pathURL.protocol ||\n baseURL.host != pathURL.host ||\n pathURL.host != window.location.host ||\n baseURL.port != pathURL.port ||\n pathURL.port != window.location.port ||\n baseURL.port != pathURL.port ||\n pathURL.protocol != window.location.protocol\n ) {\n\n return pathURL.toString();\n }\n\n return pathURL.pathname + pathURL.search + pathURL.hash;\n}","import type {FontObject} from \"../@types\";\n\nexport function fontscript(fonts: FontObject[]): string {\n\n return '/* font preloader script: ' + fonts.length + ' */\\n\"fonts\" in document && ' + JSON.stringify([...fonts], null, 1) + '.forEach(font => new FontFace(font.fontFamily, font.src, font.properties).load().then(font => document.fonts.add(font)))'\n}","import {resolve} from \"../file\";\nimport {fontscript} from \"./fontscript\";\nimport type {\n CriticalExtractOptions,\n CriticalResult,\n FileMapObject,\n FontObject,\n MatchCSSStyleSheet,\n RuleList\n} from \"../@types\";\n\nexport async function extract(options: CriticalExtractOptions = {}) {\n\n const document: Document = window.document;\n const location: Location = window.location;\n const styles: Set = new Set;\n const excluded: string[] = ['all', 'print', ''];\n const allStylesheets: MatchCSSStyleSheet[] = [];\n\n // Get a list of all the elements in the view.\n const height: number = window.innerHeight;\n const walker: NodeIterator = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT});\n\n const fonts: Set = new Set;\n const fontFamilies: Set = new Set;\n const files: Map = new Map;\n const weakMap: WeakMap = new WeakMap;\n const nodeMap: Set = new Set;\n let nodeCount: number = 0;\n let k: number;\n let rule: CSSMediaRule | CSSStyleRule;\n let rules;\n\n performance.mark('filterStylesheets');\n\n for (k = 0; k < document.styleSheets.length; k++) {\n\n // @ts-ignore\n rule = document.styleSheets[k];\n\n if (rule.media.mediaText === 'print' || (rule.media.mediaText !== '' && !window.matchMedia(rule.media.mediaText).matches)) {\n\n continue;\n }\n\n try {\n\n // @ts-ignore\n rules = (rule).cssRules ?? (rule).rules;\n\n for (let l = 0; l < rules.length; l++) {\n\n allStylesheets.push({rule: rules[l], match: false})\n }\n\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n }\n\n performance.measure('filter stylesheets', 'filterStylesheets');\n\n if (allStylesheets.length === 0) {\n\n return {styles: [], fonts: [], stats: {}};\n }\n\n let node;\n let rect;\n let allStylesLength = allStylesheets.length;\n\n performance.mark('nodeWalking');\n\n while ((node = walker.nextNode())) {\n\n if (options && options.signal && options.signal.aborted) {\n\n return Promise.reject('Aborted');\n }\n\n if (['SCRIPT', 'LINK', 'HEAD', 'META', 'TITLE', 'NOSCRIPT'].includes(node.tagName)) {\n\n continue;\n }\n\n nodeCount++;\n rect = node.getBoundingClientRect();\n\n if (rect.top < height) {\n\n nodeMap.add(node);\n }\n }\n\n for (k = 0; k < allStylesLength; k++) {\n\n if (allStylesheets[k].match || weakMap.has(allStylesheets[k].rule)) {\n\n continue;\n }\n\n weakMap.set(allStylesheets[k].rule, 1);\n\n if (allStylesheets[k].rule instanceof CSSStyleRule) {\n\n // @ts-ignore\n let selector = allStylesheets[k].rule.selectorText;\n let match;\n\n // detect pseudo selectors\n if (selector.match(/(^|,|\\s)::?((before)|(after))/)) {\n\n match = true\n } else {\n\n if (selector.match(/::?((before)|(after))/)) {\n\n selector = selector.replace(/::?((before)|(after))\\s*((,)|$)/g, '$5');\n }\n\n try {\n\n match = nodeMap.has(document.querySelector(selector));\n } catch (e) {\n\n // @ts-ignore\n match = nodeMap.has(document.querySelector(allStylesheets[k].rule.selectorText));\n }\n }\n\n if (match) {\n\n allStylesheets[k].match = true;\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family')) {\n\n // @ts-ignore\n allStylesheets[k].rule.style.getPropertyValue('font-family').split(/\\s*,\\s*/).forEach(fontFamily => fontFamily !== 'inherit' && fontFamilies.add(fontFamily.replace(/(['\"])([^\\1\\s]+)\\1/, '$2')));\n }\n }\n\n } else if (allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule || allStylesheets[k].rule instanceof CSSConditionRule) {\n\n // @ts-ignore\n if ((allStylesheets[k].rule instanceof CSSMediaRule || allStylesheets[k].rule instanceof CSSImportRule) && (allStylesheets[k].rule.media.mediaText === 'print' || (allStylesheets[k].rule.media.mediaText !== '' && !window.matchMedia(allStylesheets[k].rule.media.mediaText).matches))) {\n continue;\n }\n\n try {\n\n const rule = allStylesheets[k].rule;\n const rules = [];\n // @ts-ignore\n const sheet = rule instanceof CSSImportRule ? rule.styleSheet.cssRules || rule.styleSheet.rules : rule.cssRules || rule.rules;\n\n for (let l = 0; l < sheet.length; l++) {\n\n if (!weakMap.has(sheet[l])) {\n\n rules.push({rule: sheet[l], match: false})\n }\n }\n\n if (rules.length > 0) {\n\n // @ts-ignore\n allStylesheets.splice.apply(allStylesheets, [k + 1, 0].concat(rules))\n allStylesLength = allStylesheets.length\n }\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify({'message': e.message, stylesheet: rule.href}, null, 1));\n }\n } else if (allStylesheets[k].rule instanceof CSSFontFaceRule) {\n\n // @ts-ignore\n if (allStylesheets[k].rule.style.getPropertyValue('font-family') && allStylesheets[k].rule.style.getPropertyValue('src')) {\n\n // @ts-ignore\n fonts.add(allStylesheets[k].rule);\n }\n }\n }\n\n performance.measure('node walking', 'nodeWalking');\n\n let css;\n let file = '';\n let inlineCount = -1;\n\n performance.mark('rulesExtraction');\n\n loop1:\n for (let k = 0; k < allStylesLength; k++) {\n\n if (!allStylesheets[k].match) {\n\n continue;\n }\n\n // @ts-ignore\n rule = allStylesheets[k].rule;\n let fileUpdate: boolean = false;\n\n // @ts-ignore\n if (!files.has(rule.parentStyleSheet)) {\n\n //\n // @ts-ignore\n files.set(rule.parentStyleSheet, {\n\n // @ts-ignore\n base: (rule.parentStyleSheet.href && rule.parentStyleSheet.href.replace(/[?#].*/, '') || location.pathname).replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: rule.parentStyleSheet.href || `inline style #${++inlineCount}`\n });\n\n fileUpdate = true;\n } else { // @ts-ignore\n if (file != null && file !== files.get(rule.parentStyleSheet).file) {\n\n fileUpdate = true;\n }\n }\n\n if (fileUpdate) {\n\n try {\n\n // @ts-ignore\n console.error('analysing ' + files.get(rule.parentStyleSheet).file);\n // @ts-ignore\n styles.add('/* file: ' + files.get(rule.parentStyleSheet).file + ' */');\n } catch (e) {\n\n // @ts-ignore\n console.error(JSON.stringify(e.message, null, 1));\n console.error(JSON.stringify(rule?.parentStyleSheet?.href, null, 1));\n }\n }\n\n file = (files.get(rule.parentStyleSheet)).file;\n css = rule.cssText;\n\n // @ts-ignore\n console.error({sel: rule.selectorText, css});\n\n if (file !== 'inline') {\n\n // resolve url()\n css = css.replace(/url\\(([^)%\\s]*?)\\)/g, function (all, one) {\n\n one = one.trim();\n\n if (one.match(/^['\"]?data:/)) {\n\n return all;\n }\n\n one = one.replace(/^(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(rule.parentStyleSheet).base) + ')';\n })\n }\n\n while (rule.parentRule) {\n\n /**\n *\n * @type {CSSMediaRule}\n */\n // @ts-ignore\n rule = rule.parentRule;\n\n // @ts-ignore\n if (rule.conditionText == 'print') {\n\n continue loop1;\n }\n\n // @ts-ignore\n if (!excluded.includes(rule.conditionText)) {\n\n // @ts-ignore\n css = '@' + rule.constructor.name.replace(/^CSS(.*?)Rule/, '$1').toLowerCase() + ' ' + rule.conditionText + ' {' + css + '}';\n }\n\n if (!rule.parentRule) {\n\n break;\n }\n }\n\n if (rule.parentStyleSheet) {\n\n let media: string = rule.parentStyleSheet.media.mediaText;\n\n if (media === 'print') {\n\n continue;\n }\n\n if (media !== '') {\n\n css = '@media ' + media + ' {' + css + '}';\n }\n }\n\n if (styles.has(css)) {\n\n styles.delete(css);\n }\n\n styles.add(css);\n }\n\n performance.measure('rules extraction', 'rulesExtraction');\n\n const usedFonts = new Map;\n\n if (options.fonts) {\n\n let j;\n let name;\n let value;\n let font: CSSFontFaceRule;\n let fontObject;\n let src;\n\n performance.mark('fontsExtraction');\n\n for (font of fonts) {\n\n if (font.style.getPropertyValue('font-family').split(/\\s*,\\s*/).some(token => {\n\n return fontFamilies.has(token.replace(/(['\"])([^\\1\\s]+)\\1/, '$2'));\n })) {\n\n src = font.style.getPropertyValue('src');\n\n if (!src) {\n\n continue;\n }\n\n fontObject = {\n 'fontFamily': font.style.getPropertyValue('font-family').replace(/(['\"])([^\\1\\s]+)\\1/, '$2'),\n src: src.replace(/(^|[,\\s*])local\\([^)]+\\)\\s*,?\\s*?/g, '').replace(/url\\(([^)%\\s]+)\\)([^,]*)(,?)\\s*/g, (all, one, two, three) => {\n\n one = one.replace(/(['\"])([^\\1\\s]+)\\1/, '$2');\n\n // @ts-ignore\n if (!files.has(font.parentStyleSheet)) {\n\n // @ts-ignore\n if (!font.parentStyleSheet.href) {\n\n return all;\n }\n\n // @ts-ignore\n files.set(font.parentStyleSheet, {\n\n // @ts-ignore\n base: font.parentStyleSheet.href.replace(/([^/]+)$/, ''),\n // @ts-ignore\n file: font.parentStyleSheet.href\n })\n }\n\n // @ts-ignore\n return 'url(' + resolve(one, files.get(font.parentStyleSheet).base) + ')' + three;\n }).trim(),\n properties: {}\n }\n\n j = font.style.length;\n\n while (j--) {\n\n name = font.style.item(j);\n value = font.style.getPropertyValue(name);\n\n name !== 'font-family' &&\n name !== 'src' &&\n value !== '' &&\n value !== undefined &&\n // @ts-ignore\n (fontObject.properties[name.replace(/([A-Z])/g, (all, name) => '-' + name.toLowerCase())] = value)\n }\n\n usedFonts.set(JSON.stringify(fontObject), fontObject)\n }\n }\n\n performance.measure('fonts extraction', 'fontsExtraction');\n }\n\n const stats = performance.getEntriesByType(\"measure\").filter(entry => ['filter stylesheets', 'node walking', 'rules extraction', 'fonts extraction'].includes(entry.name)).map(entry => {\n\n return {\n\n name: entry.name,\n duration: (entry.duration / 1000).toFixed(3) + 's'\n }\n });\n\n\n const result: CriticalResult = {\n styles: [...styles],\n fonts: [...usedFonts.values()],\n nodeCount,\n stats: {nodeCount, stats}\n };\n\n if (options.html) {\n\n if (!document.querySelector('base')) {\n\n const base: HTMLBaseElement = document.createElement('base');\n\n base.href = options.base ?? (location.protocol + '//' + location.host + location.pathname);\n document.head.insertBefore(base, document.querySelector('meta[charset]')?.nextElementSibling || document.head.firstChild)\n }\n\n if (!document.querySelector('meta[charset]')) {\n\n const meta = document.createElement('meta');\n meta.setAttribute('charset', 'utf-8');\n document.head.insertBefore(meta, document.head.firstChild)\n }\n\n // @ts-ignore\n Array.from(document.querySelectorAll('style,link[rel=stylesheet]')).forEach((node: HTMLLinkElement | HTMLStyleElement) => {\n\n document.body.append(node);\n\n if (node.tagName === 'LINK') {\n\n if (node.media === 'print') {\n\n return\n }\n\n if (node.hasAttribute('media')) {\n\n node.setAttribute('data-media', node.media);\n }\n\n node.media = 'print';\n node.dataset.async = '';\n }\n });\n\n const script: HTMLScriptElement = document.createElement('script');\n\n script.textContent = `\n window.addEventListener('DOMContentLoaded', () => Array.from(document.querySelectorAll('link[data-async]')).forEach(node => {\n\n if(!node.hasAttribute('data-media')) {\n node.removeAttribute('media');\n }\n else {\n node.media=node.dataset.media;\n node.removeAttribute('data-media')\n }\n \n node.removeAttribute('data-async');\n }))`;\n\n document.head.append(script);\n\n // add data-attribute\n const style: HTMLStyleElement = document.createElement('style');\n // @ts-ignore\n style.dataset.critical = true;\n style.textContent = [...usedFonts.values()].map((entry) => {\n\n return '@font-face {' + '\\n ' + Object.entries(entry).map(entry => {\n\n // @ts-ignore\n return typeof entry[1] == 'string' ? `${entry[0] + ': ' + entry[1]}` : Object.entries(entry[1]).map(entry => `${entry[0] + ': ' + entry[1]}`).join(';\\n ') + '\\n}'\n }).join(';\\n')\n }).join('\\n') +\n '\\n' + (result.styles).join('\\n');\n\n if (style.textContent.trim() !== '') {\n\n document.head.insertBefore(style, document.querySelector('base')?.nextElementSibling);\n }\n\n if ((result.fonts).length > 0) {\n\n const script: HTMLScriptElement = document.createElement('script');\n script.textContent = fontscript(result.fonts);\n document.head.append(script);\n }\n\n const doctype: DocumentType = document.doctype as DocumentType;\n\n result.html = `` + '\\n' + document.documentElement.outerHTML\n }\n\n return result;\n}\n","import {extract} from \"./critical/extract\";\nimport {download} from \"./file/download\";\nimport {fontscript} from \"./critical/fontscript\";\nimport {CriticalExtractOptions, CriticalResult} from \"./@types\";\n\nasync function extractAndDownload(filename: string = 'critical.css', options: CriticalExtractOptions = {}): Promise {\n\n return extract(options).\n then(async (content : CriticalResult): Promise => download(content.styles, filename, 'text/css; charset=utf-8').\n then(async () => {\n\n if ((content.fonts).length > 0) {\n\n // @ts-ignore\n return download([fontscript(content.fonts)], filename.replace(/\\.css$/, '.js'), 'text/javascript; charset=utf-8');\n }\n }).\n then(() => content)\n );\n}\n\nexport {extract, fontscript, extractAndDownload as download}"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index d24ebd1..14b4cbc 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -11,6 +11,7 @@ interface CriticalOptions { url?: string; input?: string; headless?: boolean; + advanced?: boolean; browser?: BrowserOptions; browserType?: 'mobile' | 'desktop' | 'default'; base?: string; @@ -66,5 +67,7 @@ interface CriticalCliResult { declare function critical(options: CriticalOptions): Promise; declare function critical(url: string, options: CriticalOptions): Promise; +declare function isWhiteSpace(codepoint: number): boolean; +declare function splitRule(buffer: string): string[][]; -export { critical }; +export { critical, isWhiteSpace, splitRule }; diff --git a/dist/index.js b/dist/index.js index b271328..03a2eea 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5,7 +5,7 @@ import { readFileSync } from 'node:fs'; import { size } from './file/size.js'; import { fontscript } from './critical/fontscript.js'; import chalk from 'chalk'; -import { transform, render } from '@tbela99/css-parser'; +import { parse, expand, walk, EnumToken, render, transform } from '@tbela99/css-parser'; import { createRequire } from 'node:module'; import { mkdtemp, writeFile, rm, mkdir } from 'node:fs/promises'; import { tmpdir } from 'node:os'; @@ -19,6 +19,61 @@ const deviceNames = Object.values(devices); async function sleep(duration) { return new Promise(resolve => setTimeout(resolve, duration + Math.ceil(Math.random() * 10))); } +async function createBrowser(options, dimension, chromium, browserName) { + const launchOptions = { + headless: options.headless, + bypassCSP: !options.secure, + defaultViewport: { + isMobile: true, + isLandscape: false, + }, + waitForInitialPage: false, + args: [], + ignoreDefaultArgs: ['--enable-automation'] + }; + launchOptions.args = [ + '--test-type', + '--no-startup-window', + `--window-size=${dimension.width},${dimension.height}` + ]; + if (!options.secure) { + launchOptions.args.push('--disable-web-security', '--allow-running-insecure-content', '--no-default-browser-check', '--ignore-certificate-errors', '--disable-site-isolation-trials'); + } + if (options.container) { + launchOptions.args.push("--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox"); + } + let contextData = {}; + if (options.browserType != null || options.randomUserAgent || options.randomBrowser) { + contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => { + if (browserName != d.defaultBrowserType) { + return false; + } + if (options.browserType != null) { + if (options.browserType == 'mobile') { + return d.isMobile; + } + else { + return !d.isMobile; + } + } + return true; + })[0]; + } + const browser = await chromium.launch(launchOptions); + const context = await browser.newContext({ + ...contextData, + bypassCSP: !options.secure, + viewport: dimension + }); + if (options.randomUserAgent) { + // antibot evasion + await context.addInitScript(() => { + Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); + }); + } + const page = await context.newPage(); + return { browser, context, page }; +} async function critical(url, options = {}) { if (typeof url === 'object') { options = url; @@ -59,11 +114,11 @@ async function critical(url, options = {}) { await writeFile(dir + '/index.html', options.input); url = 'file://' + dir + '/index.html'; // @ts-ignore - process.on('exit', async () => await rm(dir, { recursive: true })); + process.on('exit', async () => await rm(dir, { recursive: true, force: true })); // @ts-ignore - process.on('uncaughtException', async () => await rm(dir, { recursive: true })); + process.on('uncaughtException', async () => await rm(dir, { recursive: true, force: true })); // @ts-ignore - process.on('unhandledRejection', async () => await rm(dir, { recursive: true })); + process.on('unhandledRejection', async () => await rm(dir, { recursive: true, force: true })); await page.close(); await context.close(); await browser.close(); @@ -135,6 +190,9 @@ async function critical(url, options = {}) { height: +options.height }] : ['1920x1080', '1440x900', '1366x768', '1024x768', '768x1024', '320x480']; } + if (dimensions.length == 0) { + throw new Error(`No dimensions specified`); + } if (typeof dimensions == 'string') { dimensions = dimensions.split(/\s/); } @@ -154,65 +212,14 @@ async function critical(url, options = {}) { dimensions.sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]); // @ts-ignore for (const dimension of dimensions) { - const launchOptions = { - headless: options.headless, - bypassCSP: !options.secure, - defaultViewport: { - isMobile: true, - isLandscape: false, - }, - waitForInitialPage: false, - args: [], - ignoreDefaultArgs: ['--enable-automation'] - }; - const size = ` (${dimension.width}x${dimension.height})`; - launchOptions.args = [ - '--test-type', - '--no-startup-window', - `--window-size=${dimension.width},${dimension.height}` - ]; - if (!options.secure) { - launchOptions.args.push('--disable-web-security', '--allow-running-insecure-content', '--no-default-browser-check', '--ignore-certificate-errors', '--disable-site-isolation-trials'); - } - if (options.container) { - launchOptions.args.push("--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox"); - } if (options.verbose || options.console) { console.error(chalk.blue(`[${shortUrl}]> selected browser `) + chalk.green(chromium.name())); console.error(chalk.blue(`[${shortUrl}${size}]> set viewport to `) + chalk.green(`${dimension.width}x${dimension.height}`)); } - let contextData = {}; - if (options.browserType != null || options.randomUserAgent || options.randomBrowser) { - contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => { - if (browserName != d.defaultBrowserType) { - return false; - } - if (options.browserType != null) { - if (options.browserType == 'mobile') { - return d.isMobile; - } - else { - return !d.isMobile; - } - } - return true; - })[0]; - } - const browser = await chromium.launch(launchOptions); - const context = await browser.newContext({ - ...contextData, - bypassCSP: !options.secure, - viewport: dimension - }); - if (options.randomUserAgent) { - // antibot evasion - await context.addInitScript(() => { - Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); - }); - } - await context.addInitScript(script + ';window.critical=critical;'); - const page = await context.newPage(); + const { browser, context, page } = await createBrowser(options, dimension, chromium, browserName); try { + const size = ` (${dimension.width}x${dimension.height})`; + await context.addInitScript(script + ';window.critical=critical;'); await page.emulateMedia({ colorScheme: options.colorScheme, }); @@ -294,12 +301,56 @@ async function critical(url, options = {}) { let rawCssFile = undefined; let nestedCssFile = undefined; let minNestedCssFile = undefined; - if (options.filename) { - const rawCSS = [...styles].join('\n'); - const { code, unminified } = (await transform(rawCSS).then(result => { - return { code: result.code, unminified: render(result.ast, { minify: false }).code }; + if (options.filename != null) { + let rawCSS = [...styles].join('\n'); + let css = rawCSS; + if (options.advanced) { + const { browser, context, page } = await createBrowser(options, dimensions[0], chromium, browserName); + await page.emulateMedia({ + colorScheme: options.colorScheme, + }); + const dimension = dimensions[0]; + const size = ` (${dimension.width}x${dimension.height})`; + console.error(chalk.blue(`[${shortUrl}${size}]> open `) + url); + if (options.input != null) { + const dir = await mkdtemp(tmpdir() + '/'); + await writeFile(dir + '/index.html', options.input); + url = 'file://' + dir + '/index.html'; + // @ts-ignore + process.on('exit', async () => await rm(dir, { recursive: true })); + // @ts-ignore + process.on('uncaughtException', async () => await rm(dir, { recursive: true, force: true })); + // @ts-ignore + process.on('unhandledRejection', async () => await rm(dir, { recursive: true, force: true })); + } + await page.goto(url, { waitUntil: 'networkidle' }); + const result = await parse(rawCSS, { minify: false }).then(result => Object.assign(result, { ast: expand(result.ast) })); + for (const { node, parent } of walk(result.ast)) { + if (node.typ == EnumToken.RuleNodeType) { + const filtered = await Promise.all(splitRule(node.sel).map(async (sel) => { + const rule = sel.filter(sel => !sel.match(/::?((before)|(after))/)); + if (rule.length == 0) { + return sel; + } + return await page.evaluate((param) => document.querySelector(param.sel) != null, { sel: rule.join('') }) ? sel : []; + })).then((r) => r.filter((r) => r.length > 0)); + if (filtered.length == 0) { + parent.chi.splice(parent.chi.indexOf(node), 1); + } + else { + node.sel = filtered.reduce((acc, curr) => acc + (acc.length == 0 ? '' : ',') + curr.join(''), ''); + } + } + } + css = render(result.ast, { minify: false, expandNestingRules: true }).code; + await page.close(); + await context.close(); + await browser.close(); + } + const { code, unminified } = (await transform(css, { expandNestingRules: true }).then(result => { + return { code: result.code, unminified: render(result.ast, { minify: false, expandNestingRules: true }).code }; })); - const { code: nestedCSS, unminified: nestedUnminified } = (await transform(rawCSS, { nestingRules: true }).then(result => { + const { code: nestedCSS, unminified: nestedUnminified } = (await transform(css, { nestingRules: true }).then(result => { return { code: result.code, unminified: render(result.ast, { minify: false }).code }; })); let cssFile = options.filename; @@ -324,15 +375,15 @@ async function critical(url, options = {}) { await writeFile(nestedCssFile, nestedUnminified); // @ts-ignore await writeFile(rawCssFile, rawCSS); - } - if (options.html != null && html != null && html !== '') { - const match = html.match(/`); + if (options.html != null && html != null && html !== '') { + const match = html.match(/`); + } + htmlFile = options.filename + '.html'; + // @ts-ignore + await writeFile(htmlFile, html); } - htmlFile = options.filename + '.html'; - // @ts-ignore - await writeFile(htmlFile, html); } const fontObjects = new Set([...fonts].map((font) => JSON.parse(font))); if (options.fonts) { @@ -366,6 +417,111 @@ async function critical(url, options = {}) { }, fonts: [...fonts], stats, html }; } +function isWhiteSpace(codepoint) { + return codepoint == 0x9 || codepoint == 0x20 || + // isNewLine + codepoint == 0xa || codepoint == 0xc || codepoint == 0xd; +} +function splitRule(buffer) { + const result = [[]]; + let str = ''; + for (let i = 0; i < buffer.length; i++) { + let chr = buffer.charAt(i); + if (isWhiteSpace(chr.charCodeAt(0))) { + let k = i; + while (k + 1 < buffer.length) { + if (isWhiteSpace(buffer[k + 1].charCodeAt(0))) { + k++; + continue; + } + break; + } + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + // @ts-ignore + if (result.at(-1).length > 0) { + // @ts-ignore + result.at(-1).push(' '); + } + i = k; + continue; + } + if (chr == ',') { + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + result.push([]); + continue; + } + if (chr == ':') { + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + if (buffer.charAt(i + 1) == ':') { + chr += buffer.charAt(++i); + } + str += chr; + continue; + } + str += chr; + if (chr == '\\') { + str += buffer.charAt(++i); + continue; + } + if (chr == '"' || chr == "'") { + let k = i; + while (++k < buffer.length) { + chr = buffer.charAt(k); + str += chr; + if (chr == '//') { + str += buffer.charAt(++k); + continue; + } + if (chr == buffer.charAt(i)) { + break; + } + } + continue; + } + if (chr == '(' || chr == '[') { + const open = chr; + const close = chr == '(' ? ')' : ']'; + let inParens = 1; + let k = i; + while (++k < buffer.length) { + chr = buffer.charAt(k); + if (chr == '\\') { + str += buffer.slice(k, k + 2); + k++; + continue; + } + str += chr; + if (chr == open) { + inParens++; + } + else if (chr == close) { + inParens--; + } + if (inParens == 0) { + break; + } + } + i = k; + } + } + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + } + return result; +} -export { critical }; +export { critical, isWhiteSpace, splitRule }; //# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map index b3e1e46..201a221 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import * as playwright from \"playwright\";\nimport {Browser, BrowserContext, BrowserType, ConsoleMessage, devices, LaunchOptions, Page, Request} from \"playwright\";\nimport {basename, dirname, resolve} from \"node:path\";\nimport {readFileSync} from \"node:fs\";\nimport {fontscript} from \"./critical\";\nimport {size} from \"./file\";\nimport type {\n BrowserOptions,\n CriticalCliResult,\n CriticalCliStats,\n CriticalDimension,\n CriticalExtractOptions,\n CriticalOptions,\n CriticalResult,\n FontObject\n} from \"./@types\";\nimport chalk from \"chalk\";\nimport {render, transform} from \"@tbela99/css-parser\";\nimport {createRequire} from 'node:module';\nimport {mkdir, mkdtemp, rm, writeFile} from 'node:fs/promises';\nimport {tmpdir} from 'node:os';\nimport process from \"node:process\";\n\nconst __dirname: string = dirname(new URL(import.meta.url).pathname);\nconst require = createRequire(import.meta.url);\n\nconst script: string = readFileSync(require.resolve('@tbela99/critical/umd'), {encoding: \"utf-8\"});\n\n// @ts-ignore\nconst deviceNames: Array<{\n userAgent: string;\n viewport: any[];\n screen: any[];\n deviceScaleFactor: number;\n isMobile: boolean;\n hasTouch: boolean;\n defaultBrowserType: string;\n}> = Object.values(devices);\n\nasync function sleep(duration: number) {\n\n return new Promise(resolve => setTimeout(resolve, duration + Math.ceil(Math.random() * 10)));\n}\n\nexport async function critical(options: CriticalOptions): Promise;\nexport async function critical(url: string, options: CriticalOptions): Promise\nexport async function critical(url: string | CriticalOptions, options: CriticalOptions = {}): Promise {\n\n if (typeof url === 'object') {\n\n options = url;\n url = options.url;\n }\n\n let html: string = '';\n let fonts: Set = new Set;\n\n const styles: Set = new Set;\n const stats: CriticalCliStats[] = [];\n const browserName: BrowserOptions = (options.randomBrowser ? ['chromium', 'firefox', 'webkit', 'edge', 'chrome'][Math.floor(Math.random() * 5)] : options.browser ?? 'chromium');\n const chromium: BrowserType = (['chromium', 'firefox', 'webkit', 'edge', 'chrome'].includes(browserName) &&\n // @ts-ignore\n playwright[browserName]) ?? playwright.chromium ?? 'chromium';\n\n if (options.input != null) {\n\n const browser: Browser = await chromium.launch({headless: true});\n const context: BrowserContext = await browser.newContext();\n\n const page: Page = await context.newPage();\n\n await page.goto(options.input.startsWith('data:') ? options.input : 'data:text/html;base64,' + Buffer.from(options.input).toString('base64'), {waitUntil: 'networkidle'});\n\n let base: string = options.base ?? 'file://' + process.cwd();\n\n if (!base.endsWith('/')) {\n\n base += '/';\n }\n\n if (!base.match(/^(([a-zA-Z]+:)?\\/)?\\//)) {\n\n base = 'file://' + process.cwd() + '/' + base;\n }\n\n options.input = await page.evaluate((base: string) => {\n\n const baseElement = (document.querySelector('base') ?? document.head.insertBefore(document.createElement('base'), document.head.firstChild)) as HTMLBaseElement;\n baseElement.href = base;\n\n const doctype = document.doctype as DocumentType;\n return `` + '\\n' + document.documentElement.outerHTML\n }, base) as string;\n\n const dir: string = await mkdtemp(tmpdir() + '/');\n\n await writeFile(dir + '/index.html', options.input);\n url = 'file://' + dir + '/index.html';\n\n // @ts-ignore\n process.on('exit', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('uncaughtException', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('unhandledRejection', async () => await rm(dir, {recursive: true}));\n\n await page.close();\n await context.close();\n await browser.close();\n }\n\n if (['\"', \"'\"].includes(url.charAt(0))) {\n\n // @ts-ignore\n url = url.replace(/^(['\"])([^\\1\\s]+)\\1$/, '$2');\n }\n\n if (!url.match(/^([a-zA-Z]+:)?\\/\\//)) {\n\n url = 'file://' + (url.charAt(0) == '/' ? url : resolve(__dirname + '/' + url));\n }\n\n options = {\n\n headless: true,\n randomBrowser: false,\n fonts: true,\n screenshot: false,\n console: false,\n secure: false,\n filename: '',\n container: false,\n html: false,\n pause: 30,\n verbose: false,\n colorScheme: 'dark',\n output: 'output/', ...options, browser: browserName\n };\n\n let theUrl: URL = new URL(url);\n let filePath: string = options.output + ((options.output).endsWith('/') ? '' : '/') + browserName + (options.browserType != null ? '-' + options.browserType : '') + ('/' + options.colorScheme);\n let shortUrl: string = theUrl.protocol == 'data:' ? 'data.html' : (theUrl.protocol == 'file:' ? basename(theUrl.pathname) : theUrl.protocol + '//' + theUrl.host + theUrl.pathname);\n let dimensions: string | string[] | Array;\n\n if (filePath.slice(-1) != '/') {\n\n filePath += '/';\n }\n\n if (theUrl.host !== '') {\n\n filePath += theUrl.host.replace(':', '@') + '/';\n } else {\n\n filePath += 'local_files/';\n }\n\n if (theUrl.pathname != '/') {\n\n filePath += basename(theUrl.pathname).replace(/\\.[a-z]{1,4}$/, '').replace(/^[^a-zA-Z0-9_-]+/, '').replace(/[^a-zA-Z0-9_-]+/, '-');\n } else {\n\n filePath += 'index'\n }\n\n // @ts-ignore\n filePath = filePath.replace(/[/]+$/, '');\n\n await mkdir(dirname(filePath), {recursive: true});\n\n options.filename = filePath;\n\n if (options.base != null) {\n\n if (!options.base.match(/^([a-z]+:\\/)?\\//)) {\n\n const parts1: string[] = (filePath.endsWith('/') ? filePath.slice(0, -1) : filePath).split('/');\n const parts2: string[] = (options.base.endsWith('/') ? options.base.slice(0, -1) : options.base).split('/');\n\n const result: string[] = [];\n\n parts1.pop();\n\n while (parts1.shift()) {\n\n result.push('..');\n }\n\n result.push(...parts2);\n\n options.base = result.join('/');\n }\n }\n\n if ('dimensions' in options) {\n\n dimensions = >options.dimensions;\n } else {\n\n dimensions = Number.isInteger(options.width) && Number.isInteger(options.height) ? [{\n width: +options.width,\n height: +options.height\n }] : ['1920x1080', '1440x900', '1366x768', '1024x768', '768x1024', '320x480'];\n }\n\n if (typeof dimensions == 'string') {\n\n dimensions = (dimensions).split(/\\s/)\n } else if (!Array.isArray(dimensions)) {\n\n dimensions = [dimensions];\n }\n\n dimensions = dimensions.map((dimension: string | CriticalDimension): CriticalDimension => {\n\n if (typeof dimension == 'string') {\n\n const parts: string[] = dimension.split(/[xX\"']/g);\n\n return {\n\n width: +parts[0],\n height: +parts[1]\n }\n }\n\n return dimension;\n });\n dimensions.sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]);\n\n // @ts-ignore\n for (const dimension of dimensions) {\n\n const launchOptions: LaunchOptions = {\n headless: options.headless,\n bypassCSP: !options.secure,\n defaultViewport: {\n isMobile: true,\n isLandscape: false,\n },\n waitForInitialPage: false,\n args: [],\n ignoreDefaultArgs: ['--enable-automation']\n };\n\n const size: string = ` (${dimension.width}x${dimension.height})`\n\n launchOptions.args = [\n '--test-type',\n '--no-startup-window',\n `--window-size=${(dimension).width},${(dimension).height}`\n ];\n\n if (!options.secure) {\n\n launchOptions.args.push(\n '--disable-web-security',\n '--allow-running-insecure-content',\n '--no-default-browser-check',\n '--ignore-certificate-errors',\n '--disable-site-isolation-trials'\n )\n }\n\n if (options.container) {\n\n launchOptions.args.push(\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--disable-setuid-sandbox\",\n \"--no-sandbox\"\n )\n }\n\n if (options.verbose || options.console) {\n\n console.error(chalk.blue(`[${shortUrl}]> selected browser `) + chalk.green(chromium.name()));\n console.error(chalk.blue(`[${shortUrl}${size}]> set viewport to `) + chalk.green(`${dimension.width}x${dimension.height}`));\n }\n\n let contextData = {};\n\n if (options.browserType != null || options.randomUserAgent || options.randomBrowser) {\n\n contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => {\n\n if (browserName != d.defaultBrowserType) {\n\n return false;\n }\n\n if (options.browserType != null) {\n\n if (options.browserType == 'mobile') {\n\n return d.isMobile;\n } else {\n\n return !d.isMobile;\n }\n }\n\n return true;\n })[0];\n }\n\n const browser: Browser = await chromium.launch(launchOptions);\n const context: BrowserContext = await browser.newContext({\n ...contextData,\n bypassCSP: !options.secure,\n viewport: dimension\n });\n\n if (options.randomUserAgent) {\n\n // antibot evasion\n await context.addInitScript(() => {\n\n Object.defineProperty(navigator, 'webdriver', {get: () => undefined});\n });\n }\n\n await context.addInitScript(script + ';window.critical=critical;');\n const page: Page = await context.newPage();\n\n try {\n\n await page.emulateMedia({\n colorScheme: options.colorScheme,\n });\n\n if (options.console) {\n\n page.on('console', (message: ConsoleMessage) =>\n // @ts-ignore\n console.error(chalk.yellow(`[${shortUrl}${size}]> ${message.type().replace(/^([a-z])/, (all: string, one: string) => one.toUpperCase())} ${message.text()}`)))\n // @ts-ignore\n .on('pageerror', ({message}) => console.error(chalk.red(`[${shortUrl}${size}]> ${message}`)))\n .on('requestfailed', (request: Request) => {\n\n const failure = request.failure();\n console.error(chalk.red(`[${shortUrl}${size}]> ${failure && failure.errorText} ${request.url()}`))\n });\n }\n\n console.error(chalk.blue(`[${shortUrl}${size}]> open `) + url);\n\n if (options.input != null) {\n\n const dir: string = await mkdtemp(tmpdir() + '/');\n\n await writeFile(dir + '/index.html', options.input);\n url = 'file://' + dir + '/index.html';\n\n // @ts-ignore\n process.on('exit', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('uncaughtException', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('unhandledRejection', async () => await rm(dir, {recursive: true}));\n }\n\n await page.goto(url, {waitUntil: 'networkidle'});\n\n if (options.screenshot) {\n\n const screenshot: {\n path: string\n } = typeof options.screenshot == 'object' && Object.assign({}, options.screenshot) || {path: typeof options.screenshot == 'string' && options.screenshot || options.filename + '.png' || 'screenshot.png'}\n\n if (dimensions.length > 1) {\n\n screenshot.path = screenshot.path.replace(/\\.([^.]+)$/, `_${dimension.width}x${dimension.height}.\\$1`)\n }\n\n if (options.verbose) {\n\n console.error(chalk.blue(`[${shortUrl}${size}]> generating screenshot at `) + chalk.green(screenshot.path));\n }\n\n await page.screenshot(screenshot);\n }\n\n if (options.verbose) {\n\n console.error(chalk.blue(`[${shortUrl}${size}]> collect critical data`));\n }\n\n const data = await page.evaluate(async (param: { options: CriticalExtractOptions }) => {\n\n // @ts-ignore\n return await critical.extract(param.options).then((result: CriticalResult) => {\n\n if (Array.isArray(result.fonts)) {\n\n // @ts-ignore\n result.fonts = (result.fonts).map((font: FontObject) => JSON.stringify(font));\n }\n\n // @ts-ignore\n if (param.options.verbose) {\n\n console.error(JSON.stringify({result}, null, 1));\n }\n\n return result;\n });\n }, {options});\n\n if (data.styles != null) {\n\n data.styles.forEach((line: string) => styles.add(line));\n data.fonts.forEach((line: string) => fonts.add(line));\n stats.push({width: dimension.width, height: dimension.height, stats: data.stats});\n\n if (options.html != null && html === '') {\n\n html = data.html ?? '';\n }\n }\n\n } catch (error: any) {\n\n console.error(error);\n } finally {\n\n await page.close();\n await context.close();\n await browser.close();\n }\n\n if (options.pause > 0) {\n\n await sleep(options.pause);\n }\n }\n\n let htmlFile: string | undefined = undefined;\n let fontJS: string | undefined = undefined;\n let minCssFile: string | undefined = undefined;\n let rawCssFile: string | undefined = undefined;\n let nestedCssFile: string | undefined = undefined;\n let minNestedCssFile: string | undefined = undefined;\n\n if (options.filename) {\n\n const rawCSS: string = [...styles].join('\\n');\n const {code, unminified}: { code: string; unminified: string } = (await transform(rawCSS).then(result => {\n\n return {code: result.code, unminified: render(result.ast, {minify: false}).code}\n }));\n const {code: nestedCSS, unminified: nestedUnminified}: {\n code: string;\n unminified: string\n } = (await transform(rawCSS, {nestingRules: true}).then(result => {\n\n return {code: result.code, unminified: render(result.ast, {minify: false}).code}\n }));\n\n let cssFile: string = options.filename;\n\n if (cssFile.slice(-4) != '.css') {\n\n cssFile += '.css';\n }\n\n minCssFile = cssFile.slice(0, -4) + '.min.css' as string;\n rawCssFile = cssFile.slice(0, -4) + '.raw.css' as string;\n\n minNestedCssFile = cssFile.slice(0, -4) + '.nested.min.css' as string;\n nestedCssFile = cssFile.slice(0, -4) + '.nested.css' as string;\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(minCssFile + ' [' + size(code.length) + ']'));\n // @ts-ignore\n await writeFile(minCssFile, code);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(cssFile + ' [' + size(unminified.length) + ']'));\n\n await writeFile(cssFile, unminified);\n\n // @ts-ignore\n await writeFile(rawCssFile, rawCSS);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(minNestedCssFile + ' [' + size(nestedCSS.length) + ']'));\n // @ts-ignore\n await writeFile(minNestedCssFile, nestedCSS);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(nestedCssFile + ' [' + size(nestedUnminified.length) + ']'));\n\n await writeFile(nestedCssFile, nestedUnminified);\n\n // @ts-ignore\n await writeFile(rawCssFile, rawCSS);\n }\n\n if (options.html != null && html != null && html !== '') {\n\n const match: RegExpMatchArray | null = html.match(/`);\n }\n\n htmlFile = options.filename + '.html';\n // @ts-ignore\n await writeFile(htmlFile, html);\n }\n\n const fontObjects: Set = >new Set([...fonts].map((font: string) => JSON.parse(font)));\n\n if (options.fonts) {\n\n let fontJS: string = options.filename;\n let data: string = '/* no font found! */';\n\n if (fontJS.slice(-3) != '.js') {\n\n fontJS += '.js';\n }\n\n if (fontObjects.size == 0) {\n\n console.error(chalk.yellow(`[${shortUrl}]> no preload font found`));\n } else {\n\n data = fontscript([...fontObjects]);\n console.error(chalk.blue(`[${shortUrl}]> writing `) + chalk.green(fontObjects.size.toString()) + chalk.blue(` preload font script at `) +\n chalk.green(`${fontJS} [` + size(data.length) + ']'));\n }\n\n // @ts-ignore\n await writeFile(fontJS, data);\n }\n\n return {\n styles: [...styles],\n files: {\n\n html: htmlFile,\n fonts: fontJS,\n css: {\n\n min: minCssFile,\n raw: rawCssFile,\n nested: nestedCssFile,\n minNested: minNestedCssFile\n }\n\n }, fonts: [...fonts], stats, html\n };\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import * as playwright from \"playwright\";\nimport {Browser, BrowserContext, BrowserType, ConsoleMessage, devices, LaunchOptions, Page, Request} from \"playwright\";\nimport {basename, dirname, resolve} from \"node:path\";\nimport {readFileSync} from \"node:fs\";\nimport {fontscript} from \"./critical\";\nimport {size} from \"./file\";\nimport type {\n BrowserOptions,\n CriticalCliResult,\n CriticalCliStats,\n CriticalDimension,\n CriticalExtractOptions,\n CriticalOptions,\n CriticalResult,\n FontObject\n} from \"./@types\";\nimport chalk from \"chalk\";\nimport {AstRule, EnumToken, expand, parse, render, transform, walk} from \"@tbela99/css-parser\";\nimport {createRequire} from 'node:module';\nimport {mkdir, mkdtemp, rm, writeFile} from 'node:fs/promises';\nimport {tmpdir} from 'node:os';\nimport process from \"node:process\";\n\nconst __dirname: string = dirname(new URL(import.meta.url).pathname);\nconst require = createRequire(import.meta.url);\n\nconst script: string = readFileSync(require.resolve('@tbela99/critical/umd'), {encoding: \"utf-8\"});\n\n// @ts-ignore\nconst deviceNames: Array<{\n userAgent: string;\n viewport: any[];\n screen: any[];\n deviceScaleFactor: number;\n isMobile: boolean;\n hasTouch: boolean;\n defaultBrowserType: string;\n}> = Object.values(devices);\n\nasync function sleep(duration: number) {\n\n return new Promise(resolve => setTimeout(resolve, duration + Math.ceil(Math.random() * 10)));\n}\n\nasync function createBrowser(options: CriticalOptions, dimension: CriticalDimension, chromium: BrowserType, browserName: \"chromium\" | \"firefox\" | \"webkit\" | \"edge\" | \"chrome\"): Promise<{\n\n browser: Browser,\n context: BrowserContext,\n page: Page\n}> {\n const launchOptions: LaunchOptions = {\n headless: options.headless,\n bypassCSP: !options.secure,\n defaultViewport: {\n isMobile: true,\n isLandscape: false,\n },\n waitForInitialPage: false,\n args: [],\n ignoreDefaultArgs: ['--enable-automation']\n };\n\n launchOptions.args = [\n '--test-type',\n '--no-startup-window',\n `--window-size=${(dimension).width},${(dimension).height}`\n ];\n\n if (!options.secure) {\n\n launchOptions.args.push(\n '--disable-web-security',\n '--allow-running-insecure-content',\n '--no-default-browser-check',\n '--ignore-certificate-errors',\n '--disable-site-isolation-trials'\n )\n }\n\n if (options.container) {\n\n launchOptions.args.push(\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--disable-setuid-sandbox\",\n \"--no-sandbox\"\n )\n }\n\n let contextData = {};\n\n if (options.browserType != null || options.randomUserAgent || options.randomBrowser) {\n\n contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => {\n\n if (browserName != d.defaultBrowserType) {\n\n return false;\n }\n\n if (options.browserType != null) {\n\n if (options.browserType == 'mobile') {\n\n return d.isMobile;\n } else {\n\n return !d.isMobile;\n }\n }\n\n return true;\n })[0];\n }\n\n const browser: Browser = await chromium.launch(launchOptions);\n const context: BrowserContext = await browser.newContext({\n ...contextData,\n bypassCSP: !options.secure,\n viewport: dimension\n });\n\n if (options.randomUserAgent) {\n\n // antibot evasion\n await context.addInitScript(() => {\n\n Object.defineProperty(navigator, 'webdriver', {get: () => undefined});\n });\n }\n\n const page: Page = await context.newPage();\n return {browser, context, page};\n}\n\nexport async function critical(options: CriticalOptions): Promise;\nexport async function critical(url: string, options: CriticalOptions): Promise\n\nexport async function critical(url: string | CriticalOptions, options: CriticalOptions = {}): Promise {\n\n if (typeof url === 'object') {\n\n options = url;\n url = options.url;\n }\n\n let html: string = '';\n let fonts: Set = new Set;\n\n const styles: Set = new Set;\n const stats: CriticalCliStats[] = [];\n const browserName: BrowserOptions = (options.randomBrowser ? ['chromium', 'firefox', 'webkit', 'edge', 'chrome'][Math.floor(Math.random() * 5)] : options.browser ?? 'chromium');\n const chromium: BrowserType = (['chromium', 'firefox', 'webkit', 'edge', 'chrome'].includes(browserName) &&\n // @ts-ignore\n playwright[browserName]) ?? playwright.chromium ?? 'chromium';\n\n if (options.input != null) {\n\n const browser: Browser = await chromium.launch({headless: true});\n const context: BrowserContext = await browser.newContext();\n\n const page: Page = await context.newPage();\n\n await page.goto(options.input.startsWith('data:') ? options.input : 'data:text/html;base64,' + Buffer.from(options.input).toString('base64'), {waitUntil: 'networkidle'});\n\n let base: string = options.base ?? 'file://' + process.cwd();\n\n if (!base.endsWith('/')) {\n\n base += '/';\n }\n\n if (!base.match(/^(([a-zA-Z]+:)?\\/)?\\//)) {\n\n base = 'file://' + process.cwd() + '/' + base;\n }\n\n options.input = await page.evaluate((base: string) => {\n\n const baseElement = (document.querySelector('base') ?? document.head.insertBefore(document.createElement('base'), document.head.firstChild)) as HTMLBaseElement;\n baseElement.href = base;\n\n const doctype = document.doctype as DocumentType;\n return `` + '\\n' + document.documentElement.outerHTML\n }, base) as string;\n\n const dir: string = await mkdtemp(tmpdir() + '/');\n\n await writeFile(dir + '/index.html', options.input);\n url = 'file://' + dir + '/index.html';\n\n // @ts-ignore\n process.on('exit', async () => await rm(dir, {recursive: true, force: true}));\n // @ts-ignore\n process.on('uncaughtException', async () => await rm(dir, {recursive: true, force: true}));\n // @ts-ignore\n process.on('unhandledRejection', async () => await rm(dir, {recursive: true, force: true}));\n\n await page.close();\n await context.close();\n await browser.close();\n }\n\n if (['\"', \"'\"].includes(url.charAt(0))) {\n\n // @ts-ignore\n url = url.replace(/^(['\"])([^\\1\\s]+)\\1$/, '$2');\n }\n\n if (!url.match(/^([a-zA-Z]+:)?\\/\\//)) {\n\n url = 'file://' + (url.charAt(0) == '/' ? url : resolve(__dirname + '/' + url));\n }\n\n options = {\n\n headless: true,\n randomBrowser: false,\n fonts: true,\n screenshot: false,\n console: false,\n secure: false,\n filename: '',\n container: false,\n html: false,\n pause: 30,\n verbose: false,\n colorScheme: 'dark',\n output: 'output/', ...options, browser: browserName\n };\n\n let theUrl: URL = new URL(url);\n let filePath: string = options.output + ((options.output).endsWith('/') ? '' : '/') + browserName + (options.browserType != null ? '-' + options.browserType : '') + ('/' + options.colorScheme);\n let shortUrl: string = theUrl.protocol == 'data:' ? 'data.html' : (theUrl.protocol == 'file:' ? basename(theUrl.pathname) : theUrl.protocol + '//' + theUrl.host + theUrl.pathname);\n let dimensions: string | string[] | Array;\n\n if (filePath.slice(-1) != '/') {\n\n filePath += '/';\n }\n\n if (theUrl.host !== '') {\n\n filePath += theUrl.host.replace(':', '@') + '/';\n } else {\n\n filePath += 'local_files/';\n }\n\n if (theUrl.pathname != '/') {\n\n filePath += basename(theUrl.pathname).replace(/\\.[a-z]{1,4}$/, '').replace(/^[^a-zA-Z0-9_-]+/, '').replace(/[^a-zA-Z0-9_-]+/, '-');\n } else {\n\n filePath += 'index'\n }\n\n // @ts-ignore\n filePath = filePath.replace(/[/]+$/, '');\n\n await mkdir(dirname(filePath), {recursive: true});\n\n options.filename = filePath;\n\n if (options.base != null) {\n\n if (!options.base.match(/^([a-z]+:\\/)?\\//)) {\n\n const parts1: string[] = (filePath.endsWith('/') ? filePath.slice(0, -1) : filePath).split('/');\n const parts2: string[] = (options.base.endsWith('/') ? options.base.slice(0, -1) : options.base).split('/');\n\n const result: string[] = [];\n\n parts1.pop();\n\n while (parts1.shift()) {\n\n result.push('..');\n }\n\n result.push(...parts2);\n\n options.base = result.join('/');\n }\n }\n\n if ('dimensions' in options) {\n\n dimensions = >options.dimensions;\n } else {\n\n dimensions = Number.isInteger(options.width) && Number.isInteger(options.height) ? [{\n width: +options.width,\n height: +options.height\n }] : ['1920x1080', '1440x900', '1366x768', '1024x768', '768x1024', '320x480'];\n }\n\n if (dimensions.length == 0) {\n\n throw new Error(`No dimensions specified`);\n }\n\n if (typeof dimensions == 'string') {\n\n dimensions = (dimensions).split(/\\s/)\n } else if (!Array.isArray(dimensions)) {\n\n dimensions = [dimensions];\n }\n\n dimensions = dimensions.map((dimension: string | CriticalDimension): CriticalDimension => {\n\n if (typeof dimension == 'string') {\n\n const parts: string[] = dimension.split(/[xX\"']/g);\n\n return {\n\n width: +parts[0],\n height: +parts[1]\n }\n }\n\n return dimension;\n });\n dimensions.sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]);\n\n // @ts-ignore\n for (const dimension of dimensions) {\n\n if (options.verbose || options.console) {\n\n console.error(chalk.blue(`[${shortUrl}]> selected browser `) + chalk.green(chromium.name()));\n console.error(chalk.blue(`[${shortUrl}${size}]> set viewport to `) + chalk.green(`${dimension.width}x${dimension.height}`));\n }\n\n const {browser, context, page} = await createBrowser(options, dimension, chromium, browserName);\n\n try {\n\n const size: string = ` (${dimension.width}x${dimension.height})`;\n\n await context.addInitScript(script + ';window.critical=critical;');\n await page.emulateMedia({\n colorScheme: options.colorScheme,\n });\n\n if (options.console) {\n\n page.on('console', (message: ConsoleMessage) =>\n // @ts-ignore\n console.error(chalk.yellow(`[${shortUrl}${size}]> ${message.type().replace(/^([a-z])/, (all: string, one: string) => one.toUpperCase())} ${message.text()}`)))\n // @ts-ignore\n .on('pageerror', ({message}) => console.error(chalk.red(`[${shortUrl}${size}]> ${message}`)))\n .on('requestfailed', (request: Request) => {\n\n const failure = request.failure();\n console.error(chalk.red(`[${shortUrl}${size}]> ${failure && failure.errorText} ${request.url()}`))\n });\n }\n\n console.error(chalk.blue(`[${shortUrl}${size}]> open `) + url);\n\n if (options.input != null) {\n\n const dir: string = await mkdtemp(tmpdir() + '/');\n\n await writeFile(dir + '/index.html', options.input);\n url = 'file://' + dir + '/index.html';\n\n // @ts-ignore\n process.on('exit', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('uncaughtException', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('unhandledRejection', async () => await rm(dir, {recursive: true}));\n }\n\n await page.goto(url, {waitUntil: 'networkidle'});\n\n if (options.screenshot) {\n\n const screenshot: {\n path: string\n } = typeof options.screenshot == 'object' && Object.assign({}, options.screenshot) || {path: typeof options.screenshot == 'string' && options.screenshot || options.filename + '.png' || 'screenshot.png'}\n\n if (dimensions.length > 1) {\n\n screenshot.path = screenshot.path.replace(/\\.([^.]+)$/, `_${dimension.width}x${dimension.height}.\\$1`)\n }\n\n if (options.verbose) {\n\n console.error(chalk.blue(`[${shortUrl}${size}]> generating screenshot at `) + chalk.green(screenshot.path));\n }\n\n await page.screenshot(screenshot);\n }\n\n if (options.verbose) {\n\n console.error(chalk.blue(`[${shortUrl}${size}]> collect critical data`));\n }\n\n const data = await page.evaluate(async (param: { options: CriticalExtractOptions }) => {\n\n // @ts-ignore\n return await critical.extract(param.options).then((result: CriticalResult) => {\n\n if (Array.isArray(result.fonts)) {\n\n // @ts-ignore\n result.fonts = (result.fonts).map((font: FontObject) => JSON.stringify(font));\n }\n\n // @ts-ignore\n if (param.options.verbose) {\n\n console.error(JSON.stringify({result}, null, 1));\n }\n\n return result;\n });\n }, {options});\n\n if (data.styles != null) {\n\n data.styles.forEach((line: string) => styles.add(line));\n data.fonts.forEach((line: string) => fonts.add(line));\n stats.push({width: dimension.width, height: dimension.height, stats: data.stats});\n\n if (options.html != null && html === '') {\n\n html = data.html ?? '';\n }\n }\n\n } catch (error: any) {\n\n console.error(error);\n } finally {\n\n await page.close();\n await context.close();\n await browser.close();\n }\n\n if (options.pause > 0) {\n\n await sleep(options.pause);\n }\n }\n\n let htmlFile: string | undefined = undefined;\n let fontJS: string | undefined = undefined;\n let minCssFile: string | undefined = undefined;\n let rawCssFile: string | undefined = undefined;\n let nestedCssFile: string | undefined = undefined;\n let minNestedCssFile: string | undefined = undefined;\n\n if (options.filename != null) {\n\n let rawCSS: string = [...styles].join('\\n');\n let css: string = rawCSS;\n\n if (options.advanced) {\n\n const {browser, context, page} = await createBrowser(options, dimensions[0], chromium, browserName);\n\n await page.emulateMedia({\n colorScheme: options.colorScheme,\n });\n\n const dimension = dimensions[0];\n const size: string = ` (${dimension.width}x${dimension.height})`;\n\n console.error(chalk.blue(`[${shortUrl}${size}]> open `) + url);\n\n if (options.input != null) {\n\n const dir: string = await mkdtemp(tmpdir() + '/');\n\n await writeFile(dir + '/index.html', options.input);\n url = 'file://' + dir + '/index.html';\n\n // @ts-ignore\n process.on('exit', async () => await rm(dir, {recursive: true}));\n // @ts-ignore\n process.on('uncaughtException', async () => await rm(dir, {recursive: true, force: true}));\n // @ts-ignore\n process.on('unhandledRejection', async () => await rm(dir, {recursive: true, force: true}));\n }\n\n await page.goto(url, {waitUntil: 'networkidle'});\n\n const result = await parse(rawCSS, {minify: false}).then(result => Object.assign(result, {ast: expand(result.ast)}));\n\n for (const {node, parent} of walk(result.ast)) {\n\n if (node.typ == EnumToken.RuleNodeType) {\n\n const filtered = await Promise.all(splitRule((node as AstRule).sel).map(async sel => {\n\n const rule: string[] = sel.filter(sel => !sel.match(/::?((before)|(after))/));\n\n if (rule.length == 0) {\n return sel;\n }\n\n return await page.evaluate((param: {\n sel: string\n }): boolean => document.querySelector(param.sel) != null, {sel: rule.join('')}) ? sel : [];\n })).then((r: string[][]) => r.filter((r: string[]): boolean => r.length > 0));\n\n if (filtered.length == 0) {\n\n parent!.chi.splice(parent!.chi.indexOf(node), 1);\n } else {\n\n (node as AstRule).sel = filtered.reduce((acc, curr) => acc + (acc.length == 0 ? '' : ',') + curr.join(''), '');\n }\n }\n }\n\n css = render(result.ast, {minify: false, expandNestingRules: true}).code;\n\n await page.close();\n await context.close();\n await browser.close();\n }\n\n const {code, unminified}: {\n code: string;\n unminified: string\n } = (await transform(css, {expandNestingRules: true}).then(result => {\n\n return {code: result.code, unminified: render(result.ast, {minify: false, expandNestingRules: true}).code}\n }));\n\n const {code: nestedCSS, unminified: nestedUnminified}: {\n code: string;\n unminified: string\n } = (await transform(css, {nestingRules: true}).then(result => {\n\n return {code: result.code, unminified: render(result.ast, {minify: false}).code}\n }));\n\n let cssFile: string = options.filename;\n\n if (cssFile.slice(-4) != '.css') {\n\n cssFile += '.css';\n }\n\n minCssFile = cssFile.slice(0, -4) + '.min.css' as string;\n rawCssFile = cssFile.slice(0, -4) + '.raw.css' as string;\n\n minNestedCssFile = cssFile.slice(0, -4) + '.nested.min.css' as string;\n nestedCssFile = cssFile.slice(0, -4) + '.nested.css' as string;\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(minCssFile + ' [' + size(code.length) + ']'));\n\n // @ts-ignore\n await writeFile(minCssFile, code);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(cssFile + ' [' + size(unminified.length) + ']'));\n\n await writeFile(cssFile, unminified);\n\n // @ts-ignore\n await writeFile(rawCssFile, rawCSS);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(minNestedCssFile + ' [' + size(nestedCSS.length) + ']'));\n // @ts-ignore\n await writeFile(minNestedCssFile, nestedCSS);\n\n console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(nestedCssFile + ' [' + size(nestedUnminified.length) + ']'));\n\n await writeFile(nestedCssFile, nestedUnminified);\n\n // @ts-ignore\n await writeFile(rawCssFile, rawCSS);\n\n if (options.html != null && html != null && html !== '') {\n\n const match: RegExpMatchArray | null = html.match(/`);\n }\n\n htmlFile = options.filename + '.html';\n // @ts-ignore\n await writeFile(htmlFile, html);\n }\n }\n\n const fontObjects: Set = >new Set([...fonts].map((font: string) => JSON.parse(font)));\n\n if (options.fonts) {\n\n let fontJS: string = options.filename;\n let data: string = '/* no font found! */';\n\n if (fontJS.slice(-3) != '.js') {\n\n fontJS += '.js';\n }\n\n if (fontObjects.size == 0) {\n\n console.error(chalk.yellow(`[${shortUrl}]> no preload font found`));\n } else {\n\n data = fontscript([...fontObjects]);\n console.error(chalk.blue(`[${shortUrl}]> writing `) + chalk.green(fontObjects.size.toString()) + chalk.blue(` preload font script at `) +\n chalk.green(`${fontJS} [` + size(data.length) + ']'));\n }\n\n // @ts-ignore\n await writeFile(fontJS, data);\n }\n\n return {\n styles: [...styles],\n files: {\n\n html: htmlFile,\n fonts: fontJS,\n css: {\n\n min: minCssFile,\n raw: rawCssFile,\n nested: nestedCssFile,\n minNested: minNestedCssFile\n }\n\n }, fonts: [...fonts], stats, html\n };\n}\n\nexport function isWhiteSpace(codepoint: number): boolean {\n\n return codepoint == 0x9 || codepoint == 0x20 ||\n // isNewLine\n codepoint == 0xa || codepoint == 0xc || codepoint == 0xd;\n}\n\nexport function splitRule(buffer: string): string[][] {\n\n const result: string[][] = [[]];\n let str: string = '';\n\n for (let i = 0; i < buffer.length; i++) {\n\n let chr: string = buffer.charAt(i);\n\n if (isWhiteSpace(chr.charCodeAt(0))) {\n\n let k: number = i;\n\n while (k + 1 < buffer.length) {\n\n if (isWhiteSpace(buffer[k + 1].charCodeAt(0))) {\n\n k++;\n continue;\n }\n\n break;\n }\n\n if (str !== '') {\n\n // @ts-ignore\n result.at(-1).push(str);\n str = '';\n }\n\n // @ts-ignore\n if (result.at(-1).length > 0) {\n\n // @ts-ignore\n result.at(-1).push(' ');\n }\n\n i = k;\n continue;\n }\n\n if (chr == ',') {\n\n if (str !== '') {\n // @ts-ignore\n result.at(-1).push(str);\n str = '';\n }\n\n result.push([]);\n continue;\n }\n\n if (chr == ':') {\n\n if (str !== '') {\n // @ts-ignore\n result.at(-1).push(str);\n str = '';\n }\n\n if (buffer.charAt(i + 1) == ':') {\n\n chr += buffer.charAt(++i);\n }\n\n str += chr;\n continue;\n }\n\n str += chr;\n if (chr == '\\\\') {\n\n str += buffer.charAt(++i);\n continue;\n }\n\n if (chr == '\"' || chr == \"'\") {\n\n let k = i;\n while (++k < buffer.length) {\n chr = buffer.charAt(k);\n str += chr;\n if (chr == '//') {\n str += buffer.charAt(++k);\n continue;\n }\n if (chr == buffer.charAt(i)) {\n break;\n }\n }\n continue;\n }\n\n if (chr == '(' || chr == '[') {\n const open = chr;\n const close = chr == '(' ? ')' : ']';\n let inParens = 1;\n let k = i;\n while (++k < buffer.length) {\n chr = buffer.charAt(k);\n if (chr == '\\\\') {\n str += buffer.slice(k, k + 2);\n k++;\n continue;\n }\n str += chr;\n if (chr == open) {\n inParens++;\n } else if (chr == close) {\n inParens--;\n }\n if (inParens == 0) {\n break;\n }\n }\n i = k;\n }\n }\n\n if (str !== '') {\n // @ts-ignore\n result.at(-1).push(str);\n }\n\n return result;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/@types/index.d.ts b/src/@types/index.d.ts index 535f06b..5fa55a5 100644 --- a/src/@types/index.d.ts +++ b/src/@types/index.d.ts @@ -18,6 +18,7 @@ export interface CriticalOptions { url?: string; input?: string; headless?: boolean; + advanced?: boolean; browser?: BrowserOptions; browserType?: 'mobile' | 'desktop' | 'default'; base?: string; @@ -44,6 +45,7 @@ export interface CriticalExtractOptions { html?: boolean; base?: string; fonts?: boolean; + advanced?: boolean; signal?: AbortSignal; } diff --git a/src/critical/extract.ts b/src/critical/extract.ts index be57bd7..6f602eb 100644 --- a/src/critical/extract.ts +++ b/src/critical/extract.ts @@ -14,12 +14,12 @@ export async function extract(options: CriticalExtractOptions = {}) { const document: Document = window.document; const location: Location = window.location; const styles: Set = new Set; - const excluded = ['all', 'print', '']; + const excluded: string[] = ['all', 'print', '']; const allStylesheets: MatchCSSStyleSheet[] = []; // Get a list of all the elements in the view. - const height = window.innerHeight; - const walker = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT}); + const height: number = window.innerHeight; + const walker: NodeIterator = document.createNodeIterator(document, NodeFilter.SHOW_ELEMENT, {acceptNode: () => NodeFilter.SHOW_ELEMENT}); const fonts: Set = new Set; const fontFamilies: Set = new Set; @@ -45,7 +45,6 @@ export async function extract(options: CriticalExtractOptions = {}) { try { - // @ts-ignore rules = (rule).cssRules ?? (rule).rules; @@ -205,7 +204,7 @@ export async function extract(options: CriticalExtractOptions = {}) { // @ts-ignore rule = allStylesheets[k].rule; - let fileUpdate = false; + let fileUpdate: boolean = false; // @ts-ignore if (!files.has(rule.parentStyleSheet)) { @@ -247,6 +246,9 @@ export async function extract(options: CriticalExtractOptions = {}) { file = (files.get(rule.parentStyleSheet)).file; css = rule.cssText; + // @ts-ignore + console.error({sel: rule.selectorText, css}); + if (file !== 'inline') { // resolve url() @@ -296,7 +298,7 @@ export async function extract(options: CriticalExtractOptions = {}) { if (rule.parentStyleSheet) { - let media = rule.parentStyleSheet.media.mediaText; + let media: string = rule.parentStyleSheet.media.mediaText; if (media === 'print') { @@ -404,7 +406,6 @@ export async function extract(options: CriticalExtractOptions = {}) { return { name: entry.name, - duration: (entry.duration / 1000).toFixed(3) + 's' } }); @@ -495,7 +496,7 @@ export async function extract(options: CriticalExtractOptions = {}) { if ((result.fonts).length > 0) { - const script = document.createElement('script'); + const script: HTMLScriptElement = document.createElement('script'); script.textContent = fontscript(result.fonts); document.head.append(script); } @@ -511,4 +512,4 @@ export async function extract(options: CriticalExtractOptions = {}) { } return result; -} \ No newline at end of file +} diff --git a/src/index.ts b/src/index.ts index fbd5ece..931cef8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,7 +15,7 @@ import type { FontObject } from "./@types"; import chalk from "chalk"; -import {render, transform} from "@tbela99/css-parser"; +import {AstRule, EnumToken, expand, parse, render, transform, walk} from "@tbela99/css-parser"; import {createRequire} from 'node:module'; import {mkdir, mkdtemp, rm, writeFile} from 'node:fs/promises'; import {tmpdir} from 'node:os'; @@ -42,8 +42,100 @@ async function sleep(duration: number) { return new Promise(resolve => setTimeout(resolve, duration + Math.ceil(Math.random() * 10))); } +async function createBrowser(options: CriticalOptions, dimension: CriticalDimension, chromium: BrowserType, browserName: "chromium" | "firefox" | "webkit" | "edge" | "chrome"): Promise<{ + + browser: Browser, + context: BrowserContext, + page: Page +}> { + const launchOptions: LaunchOptions = { + headless: options.headless, + bypassCSP: !options.secure, + defaultViewport: { + isMobile: true, + isLandscape: false, + }, + waitForInitialPage: false, + args: [], + ignoreDefaultArgs: ['--enable-automation'] + }; + + launchOptions.args = [ + '--test-type', + '--no-startup-window', + `--window-size=${(dimension).width},${(dimension).height}` + ]; + + if (!options.secure) { + + launchOptions.args.push( + '--disable-web-security', + '--allow-running-insecure-content', + '--no-default-browser-check', + '--ignore-certificate-errors', + '--disable-site-isolation-trials' + ) + } + + if (options.container) { + + launchOptions.args.push( + "--disable-gpu", + "--disable-dev-shm-usage", + "--disable-setuid-sandbox", + "--no-sandbox" + ) + } + + let contextData = {}; + + if (options.browserType != null || options.randomUserAgent || options.randomBrowser) { + + contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => { + + if (browserName != d.defaultBrowserType) { + + return false; + } + + if (options.browserType != null) { + + if (options.browserType == 'mobile') { + + return d.isMobile; + } else { + + return !d.isMobile; + } + } + + return true; + })[0]; + } + + const browser: Browser = await chromium.launch(launchOptions); + const context: BrowserContext = await browser.newContext({ + ...contextData, + bypassCSP: !options.secure, + viewport: dimension + }); + + if (options.randomUserAgent) { + + // antibot evasion + await context.addInitScript(() => { + + Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); + }); + } + + const page: Page = await context.newPage(); + return {browser, context, page}; +} + export async function critical(options: CriticalOptions): Promise; export async function critical(url: string, options: CriticalOptions): Promise + export async function critical(url: string | CriticalOptions, options: CriticalOptions = {}): Promise { if (typeof url === 'object') { @@ -103,11 +195,11 @@ export async function critical(url: string | CriticalOptions, options: CriticalO url = 'file://' + dir + '/index.html'; // @ts-ignore - process.on('exit', async () => await rm(dir, {recursive: true})); + process.on('exit', async () => await rm(dir, {recursive: true, force: true})); // @ts-ignore - process.on('uncaughtException', async () => await rm(dir, {recursive: true})); + process.on('uncaughtException', async () => await rm(dir, {recursive: true, force: true})); // @ts-ignore - process.on('unhandledRejection', async () => await rm(dir, {recursive: true})); + process.on('unhandledRejection', async () => await rm(dir, {recursive: true, force: true})); await page.close(); await context.close(); @@ -208,6 +300,11 @@ export async function critical(url: string | CriticalOptions, options: CriticalO }] : ['1920x1080', '1440x900', '1366x768', '1024x768', '768x1024', '320x480']; } + if (dimensions.length == 0) { + + throw new Error(`No dimensions specified`); + } + if (typeof dimensions == 'string') { dimensions = (dimensions).split(/\s/) @@ -236,100 +333,19 @@ export async function critical(url: string | CriticalOptions, options: CriticalO // @ts-ignore for (const dimension of dimensions) { - const launchOptions: LaunchOptions = { - headless: options.headless, - bypassCSP: !options.secure, - defaultViewport: { - isMobile: true, - isLandscape: false, - }, - waitForInitialPage: false, - args: [], - ignoreDefaultArgs: ['--enable-automation'] - }; - - const size: string = ` (${dimension.width}x${dimension.height})` - - launchOptions.args = [ - '--test-type', - '--no-startup-window', - `--window-size=${(dimension).width},${(dimension).height}` - ]; - - if (!options.secure) { - - launchOptions.args.push( - '--disable-web-security', - '--allow-running-insecure-content', - '--no-default-browser-check', - '--ignore-certificate-errors', - '--disable-site-isolation-trials' - ) - } - - if (options.container) { - - launchOptions.args.push( - "--disable-gpu", - "--disable-dev-shm-usage", - "--disable-setuid-sandbox", - "--no-sandbox" - ) - } - if (options.verbose || options.console) { console.error(chalk.blue(`[${shortUrl}]> selected browser `) + chalk.green(chromium.name())); console.error(chalk.blue(`[${shortUrl}${size}]> set viewport to `) + chalk.green(`${dimension.width}x${dimension.height}`)); } - let contextData = {}; - - if (options.browserType != null || options.randomUserAgent || options.randomBrowser) { - - contextData = deviceNames.slice().sort(() => [-1, 0, 1][Math.floor(3 * Math.random())]).filter(d => { - - if (browserName != d.defaultBrowserType) { - - return false; - } - - if (options.browserType != null) { - - if (options.browserType == 'mobile') { - - return d.isMobile; - } else { - - return !d.isMobile; - } - } - - return true; - })[0]; - } - - const browser: Browser = await chromium.launch(launchOptions); - const context: BrowserContext = await browser.newContext({ - ...contextData, - bypassCSP: !options.secure, - viewport: dimension - }); - - if (options.randomUserAgent) { - - // antibot evasion - await context.addInitScript(() => { - - Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); - }); - } - - await context.addInitScript(script + ';window.critical=critical;'); - const page: Page = await context.newPage(); + const {browser, context, page} = await createBrowser(options, dimension, chromium, browserName); try { + const size: string = ` (${dimension.width}x${dimension.height})`; + + await context.addInitScript(script + ';window.critical=critical;'); await page.emulateMedia({ colorScheme: options.colorScheme, }); @@ -447,17 +463,89 @@ export async function critical(url: string | CriticalOptions, options: CriticalO let nestedCssFile: string | undefined = undefined; let minNestedCssFile: string | undefined = undefined; - if (options.filename) { + if (options.filename != null) { - const rawCSS: string = [...styles].join('\n'); - const {code, unminified}: { code: string; unminified: string } = (await transform(rawCSS).then(result => { + let rawCSS: string = [...styles].join('\n'); + let css: string = rawCSS; - return {code: result.code, unminified: render(result.ast, {minify: false}).code} + if (options.advanced) { + + const {browser, context, page} = await createBrowser(options, dimensions[0], chromium, browserName); + + await page.emulateMedia({ + colorScheme: options.colorScheme, + }); + + const dimension = dimensions[0]; + const size: string = ` (${dimension.width}x${dimension.height})`; + + console.error(chalk.blue(`[${shortUrl}${size}]> open `) + url); + + if (options.input != null) { + + const dir: string = await mkdtemp(tmpdir() + '/'); + + await writeFile(dir + '/index.html', options.input); + url = 'file://' + dir + '/index.html'; + + // @ts-ignore + process.on('exit', async () => await rm(dir, {recursive: true})); + // @ts-ignore + process.on('uncaughtException', async () => await rm(dir, {recursive: true, force: true})); + // @ts-ignore + process.on('unhandledRejection', async () => await rm(dir, {recursive: true, force: true})); + } + + await page.goto(url, {waitUntil: 'networkidle'}); + + const result = await parse(rawCSS, {minify: false}).then(result => Object.assign(result, {ast: expand(result.ast)})); + + for (const {node, parent} of walk(result.ast)) { + + if (node.typ == EnumToken.RuleNodeType) { + + const filtered = await Promise.all(splitRule((node as AstRule).sel).map(async sel => { + + const rule: string[] = sel.filter(sel => !sel.match(/::?((before)|(after))/)); + + if (rule.length == 0) { + return sel; + } + + return await page.evaluate((param: { + sel: string + }): boolean => document.querySelector(param.sel) != null, {sel: rule.join('')}) ? sel : []; + })).then((r: string[][]) => r.filter((r: string[]): boolean => r.length > 0)); + + if (filtered.length == 0) { + + parent!.chi.splice(parent!.chi.indexOf(node), 1); + } else { + + (node as AstRule).sel = filtered.reduce((acc, curr) => acc + (acc.length == 0 ? '' : ',') + curr.join(''), ''); + } + } + } + + css = render(result.ast, {minify: false, expandNestingRules: true}).code; + + await page.close(); + await context.close(); + await browser.close(); + } + + const {code, unminified}: { + code: string; + unminified: string + } = (await transform(css, {expandNestingRules: true}).then(result => { + + return {code: result.code, unminified: render(result.ast, {minify: false, expandNestingRules: true}).code} })); + const {code: nestedCSS, unminified: nestedUnminified}: { code: string; unminified: string - } = (await transform(rawCSS, {nestingRules: true}).then(result => { + } = (await transform(css, {nestingRules: true}).then(result => { return {code: result.code, unminified: render(result.ast, {minify: false}).code} })); @@ -476,6 +564,7 @@ export async function critical(url: string | CriticalOptions, options: CriticalO nestedCssFile = cssFile.slice(0, -4) + '.nested.css' as string; console.error(chalk.blue(`[${shortUrl}]> writing css at `) + chalk.green(minCssFile + ' [' + size(code.length) + ']')); + // @ts-ignore await writeFile(minCssFile, code); @@ -496,20 +585,20 @@ export async function critical(url: string | CriticalOptions, options: CriticalO // @ts-ignore await writeFile(rawCssFile, rawCSS); - } - if (options.html != null && html != null && html !== '') { + if (options.html != null && html != null && html !== '') { - const match: RegExpMatchArray | null = html.match(/`); - } + html = html.replace(match[0], ``); + } - htmlFile = options.filename + '.html'; - // @ts-ignore - await writeFile(htmlFile, html); + htmlFile = options.filename + '.html'; + // @ts-ignore + await writeFile(htmlFile, html); + } } const fontObjects: Set = >new Set([...fonts].map((font: string) => JSON.parse(font))); @@ -555,3 +644,139 @@ export async function critical(url: string | CriticalOptions, options: CriticalO }, fonts: [...fonts], stats, html }; } + +export function isWhiteSpace(codepoint: number): boolean { + + return codepoint == 0x9 || codepoint == 0x20 || + // isNewLine + codepoint == 0xa || codepoint == 0xc || codepoint == 0xd; +} + +export function splitRule(buffer: string): string[][] { + + const result: string[][] = [[]]; + let str: string = ''; + + for (let i = 0; i < buffer.length; i++) { + + let chr: string = buffer.charAt(i); + + if (isWhiteSpace(chr.charCodeAt(0))) { + + let k: number = i; + + while (k + 1 < buffer.length) { + + if (isWhiteSpace(buffer[k + 1].charCodeAt(0))) { + + k++; + continue; + } + + break; + } + + if (str !== '') { + + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + + // @ts-ignore + if (result.at(-1).length > 0) { + + // @ts-ignore + result.at(-1).push(' '); + } + + i = k; + continue; + } + + if (chr == ',') { + + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + + result.push([]); + continue; + } + + if (chr == ':') { + + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + str = ''; + } + + if (buffer.charAt(i + 1) == ':') { + + chr += buffer.charAt(++i); + } + + str += chr; + continue; + } + + str += chr; + if (chr == '\\') { + + str += buffer.charAt(++i); + continue; + } + + if (chr == '"' || chr == "'") { + + let k = i; + while (++k < buffer.length) { + chr = buffer.charAt(k); + str += chr; + if (chr == '//') { + str += buffer.charAt(++k); + continue; + } + if (chr == buffer.charAt(i)) { + break; + } + } + continue; + } + + if (chr == '(' || chr == '[') { + const open = chr; + const close = chr == '(' ? ')' : ']'; + let inParens = 1; + let k = i; + while (++k < buffer.length) { + chr = buffer.charAt(k); + if (chr == '\\') { + str += buffer.slice(k, k + 2); + k++; + continue; + } + str += chr; + if (chr == open) { + inParens++; + } else if (chr == close) { + inParens--; + } + if (inParens == 0) { + break; + } + } + i = k; + } + } + + if (str !== '') { + // @ts-ignore + result.at(-1).push(str); + } + + return result; +}