85 строки
3.2 KiB
JavaScript
85 строки
3.2 KiB
JavaScript
/**
|
|
* Copyright 2017 Google Inc. All rights reserved.
|
|
* Modifications copyright (c) Microsoft Corporation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// This file is only run when someone installs via the github repo
|
|
|
|
const {execSync} = require('child_process');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const util = require('util');
|
|
const rmAsync = util.promisify(require('rimraf'));
|
|
|
|
(async () => {
|
|
const SRC_FOLDER = path.join(__dirname, 'src');
|
|
const LIB_FOLDER = path.join(__dirname, 'lib');
|
|
const srcTypeScriptFiles = (await listFiles(path.join(__dirname, 'src'))).filter(filepath => filepath.toLowerCase().endsWith('.ts'));
|
|
const outdatedFiles = await Promise.all(srcTypeScriptFiles.map(async srcFile => {
|
|
const libFileTS = path.join(LIB_FOLDER, path.relative(SRC_FOLDER, srcFile));
|
|
const libFile = libFileTS.substring(0, libFileTS.lastIndexOf('.')) + '.js';
|
|
try {
|
|
const [srcStat, libStat] = await Promise.all([fs.promises.stat(srcFile), fs.promises.stat(libFile)]);
|
|
return srcStat.ctimeMs > libStat.ctimeMs;
|
|
} catch (e) {
|
|
// Either `.ts` of `.js` file is missing - rebuild is required.
|
|
return true;
|
|
}
|
|
}));
|
|
if (outdatedFiles.some(Boolean)) {
|
|
console.log(`Rebuilding playwright...`);
|
|
try {
|
|
execSync('npm run build');
|
|
} catch (e) {
|
|
}
|
|
}
|
|
await downloadAllBrowsersAndGenerateProtocolTypes();
|
|
})();
|
|
|
|
async function listFiles(dirpath) {
|
|
const files = [];
|
|
await dfs(dirpath);
|
|
return files;
|
|
|
|
async function dfs(dirpath) {
|
|
const entries = await fs.promises.readdir(dirpath, {withFileTypes: true});
|
|
files.push(...entries.filter(entry => entry.isFile()).map(entry => path.join(dirpath, entry.name)));
|
|
await Promise.all(entries.filter(entry => entry.isDirectory()).map(entry => dfs(path.join(dirpath, entry.name))));
|
|
}
|
|
}
|
|
|
|
async function downloadAllBrowsersAndGenerateProtocolTypes() {
|
|
const { installBrowsersWithProgressBar } = require('./lib/install/installer');
|
|
const protocolGenerator = require('./utils/protocol-types-generator');
|
|
const browserPaths = require('./lib/install/browserPaths');
|
|
const browsersPath = browserPaths.browsersPath(__dirname);
|
|
const browsers = require('./browsers.json')['browsers'];
|
|
await installBrowsersWithProgressBar(__dirname);
|
|
for (const browser of browsers) {
|
|
const browserPath = browserPaths.browserDirectory(browsersPath, browser);
|
|
await protocolGenerator.generateProtocol(browser.name, browserPaths.executablePath(browserPath, browser)).catch(console.warn);
|
|
}
|
|
|
|
try {
|
|
console.log('Generating types...');
|
|
execSync('npm run generate-types');
|
|
} catch (e) {
|
|
}
|
|
|
|
async function readdirAsync(dirpath) {
|
|
return fs.promises.readdir(dirpath).then(dirs => dirs.map(dir => path.join(dirpath, dir)));
|
|
}
|
|
}
|