UNPKG

storycrawler

Version:

Utilities to build Storybook crawling tools with Puppeteer

185 lines (184 loc) 7.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.findChrome = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); const newLineRegex = /\r?\n/; function canAccess(file) { if (!file) return false; try { fs_1.default.accessSync(file); return true; } catch (e) { return false; } } function findChromeExecutables(folder) { const argumentsRegex = /(^[^ ]+).*/; // Take everything up to the first space const chromeExecRegex = '^Exec=/.*/(google-chrome|chrome|chromium)-.*'; const installations = []; if (canAccess(folder)) { // Output of the grep & print looks like: // /opt/google/chrome/google-chrome --profile-directory // /home/user/Downloads/chrome-linux/chrome-wrapper %U let execPaths; // Some systems do not support grep -R so fallback to -r. // See https://github.com/GoogleChrome/chrome-launcher/issues/46 for more context. try { execPaths = (0, child_process_1.execSync)(`grep -ER "${chromeExecRegex}" ${folder} | awk -F '=' '{print $2}'`); } catch (e) { execPaths = (0, child_process_1.execSync)(`grep -Er "${chromeExecRegex}" ${folder} | awk -F '=' '{print $2}'`); } execPaths = execPaths .toString() .split(newLineRegex) .map(execPath => execPath.replace(argumentsRegex, '$1')); execPaths.forEach(execPath => canAccess(execPath) && installations.push(execPath)); } return installations; } function sort(installations, priorities) { const defaultPriority = 10; return (installations // assign priorities .map(inst => { for (const pair of priorities) { if (pair.regex.test(inst)) return { path: inst, weight: pair.weight }; } return { path: inst, weight: defaultPriority }; }) // sort based on priorities .sort((a, b) => b.weight - a.weight) // remove priority flag .map(pair => pair.path)); } function uniq(arr) { return Array.from(new Set(arr)); } function localPuppeteer() { try { require.resolve('puppeteer'); } catch { return; } const p = require('puppeteer'); return p.executablePath(); } function darwin(canary = false) { const LSREGISTER = '/System/Library/Frameworks/CoreServices.framework' + '/Versions/A/Frameworks/LaunchServices.framework' + '/Versions/A/Support/lsregister'; const grepexpr = canary ? 'google chrome canary' : 'google chrome'; const result = (0, child_process_1.execSync)(`${LSREGISTER} -dump | grep -i \'${grepexpr}\\?.app$\' | awk \'{$1=""; print $0}\'`); const paths = result .toString() .split(newLineRegex) .filter(a => a) .map(a => a.trim()); paths.unshift(canary ? '/Applications/Google Chrome Canary.app' : '/Applications/Google Chrome.app'); for (const p of paths) { if (p.startsWith('/Volumes')) continue; const inst = path_1.default.join(p, canary ? '/Contents/MacOS/Google Chrome Canary' : '/Contents/MacOS/Google Chrome'); if (canAccess(inst)) return inst; } return; } /** * Look for linux executables in 3 ways * 1. Look into CHROME_PATH env variable * 2. Look into the directories where .desktop are saved on gnome based distro's * 3. Look for google-chrome-stable & google-chrome executables by using the which command */ function linux(_canary = false) { let installations = []; // Look into the directories where .desktop are saved on gnome based distro's const desktopInstallationFolders = [ path_1.default.join(require('os').homedir(), '.local/share/applications/'), '/usr/share/applications/', ]; desktopInstallationFolders.forEach(folder => { installations = installations.concat(findChromeExecutables(folder)); }); // Look for google-chrome(-stable) & chromium(-browser) executables by using the which command const executables = ['google-chrome-stable', 'google-chrome', 'chromium-browser', 'chromium']; executables.forEach(executable => { try { const chromePath = (0, child_process_1.execFileSync)('which', [executable], { stdio: 'pipe' }).toString().split(newLineRegex)[0]; if (canAccess(chromePath)) installations.push(chromePath); } catch (e) { // Not installed. } }); if (!installations.length) throw new Error('The environment variable CHROME_PATH must be set to executable of a build of Chromium version 54.0 or later.'); const priorities = [ { regex: /chrome-wrapper$/, weight: 51 }, { regex: /google-chrome-stable$/, weight: 50 }, { regex: /google-chrome$/, weight: 49 }, { regex: /chromium-browser$/, weight: 48 }, { regex: /chromium$/, weight: 47 }, ]; if (process.env.CHROME_PATH) priorities.unshift({ regex: new RegExp(`${process.env.CHROME_PATH}`), weight: 101 }); return sort(uniq(installations.filter(Boolean)), priorities)[0]; } function win32(canary = false) { const suffix = canary ? `${path_1.default.sep}Google${path_1.default.sep}Chrome SxS${path_1.default.sep}Application${path_1.default.sep}chrome.exe` : `${path_1.default.sep}Google${path_1.default.sep}Chrome${path_1.default.sep}Application${path_1.default.sep}chrome.exe`; const prefixes = [process.env.LOCALAPPDATA, process.env.PROGRAMFILES, process.env['PROGRAMFILES(X86)']].filter(Boolean); let result; prefixes.forEach(prefix => { const chromePath = path_1.default.join(prefix, suffix); if (canAccess(chromePath)) result = chromePath; }); return result; } async function findChrome(options) { if (options.executablePath) return { executablePath: options.executablePath, type: 'user' }; const config = new Set(options.channel ? [options.channel] : ['*']); let executablePath = undefined; if (config.has('puppeteer') || config.has('*')) { executablePath = localPuppeteer(); if (executablePath) return { executablePath, type: 'puppeteer' }; } if (config.has('canary') || config.has('*')) { if (process.platform === 'linux') executablePath = linux(true); else if (process.platform === 'win32') executablePath = win32(true); else if (process.platform === 'darwin') executablePath = darwin(true); if (executablePath) return { executablePath, type: 'canary' }; } // Then pick stable. if (config.has('stable') || config.has('*')) { if (process.platform === 'linux') executablePath = linux(); else if (process.platform === 'win32') executablePath = win32(); else if (process.platform === 'darwin') executablePath = darwin(); if (executablePath) return { executablePath, type: 'stable' }; } return { executablePath: null, type: null }; } exports.findChrome = findChrome;