playwright/utils/prepare_packages.js
2021-10-11 16:52:17 +02:00

131 lines
4.0 KiB
JavaScript

#!/usr/bin/env node
/**
* 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.
*/
//@ts-check
const fs = require('fs');
const path = require('path');
const ncp = require('ncp');
const util = require('util');
const { packageNameToPath } = require('./list_packages');
const cpAsync = util.promisify(ncp);
const ROOT_PATH = path.join(__dirname, '..');
const LICENSE_FILES = ['NOTICE', 'LICENSE'];
const PACKAGES = {
'playwright': {
browsers: ['chromium', 'firefox', 'webkit', 'ffmpeg'],
// We copy README.md additionally for Playwright so that it looks nice on NPM.
files: [...LICENSE_FILES, 'README.md'],
},
'playwright-core': {
browsers: [],
files: LICENSE_FILES,
},
'@playwright/test': {
browsers: ['chromium', 'firefox', 'webkit', 'ffmpeg'],
files: LICENSE_FILES,
name: '@playwright/test',
},
'playwright-webkit': {
browsers: ['webkit'],
files: LICENSE_FILES,
},
'playwright-firefox': {
browsers: ['firefox'],
files: LICENSE_FILES,
},
'playwright-chromium': {
browsers: ['chromium', 'ffmpeg'],
files: LICENSE_FILES,
},
'create-playwright': {
browsers: [],
files: [],
ignore: true,
}
};
const dirtyFiles = [];
(async function () {
for (const packagePath of require('./list_packages').packages) {
const packageJSON = require(path.join(packagePath, 'package.json'));
packageNameToPath.set(packageJSON.name, packagePath);
}
for (const packageName of packageNameToPath.keys())
await lintPackage(packageName);
for (const file of dirtyFiles) {
console.warn('Updated', path.relative(ROOT_PATH, file));
}
if (dirtyFiles.length && process.argv.includes('--check-clean'))
process.exit(1);
})();
/**
* @param {string} packageName
*/
async function lintPackage(packageName) {
const packagePath = packageNameToPath.get(packageName);
const package = PACKAGES[packageName];
if (package.ignore)
return;
if (!package) {
console.log(`ERROR: unknown package ${packageName}`);
process.exit(1);
}
// 3. Copy package files.
for (const file of package.files)
await copyToPackage(path.join(ROOT_PATH, file), path.join(packagePath, file));
// 4. Generate package.json
const pwInternalJSON = require(path.join(ROOT_PATH, 'package.json'));
const currentPackageJSON = require(path.join(packagePath, 'package.json'));
currentPackageJSON.version = pwInternalJSON.version;
currentPackageJSON.description = pwInternalJSON.description;
currentPackageJSON.repository = pwInternalJSON.repository;
currentPackageJSON.engines = pwInternalJSON.engines;
currentPackageJSON.homepage = pwInternalJSON.homepage;
currentPackageJSON.author = pwInternalJSON.author;
currentPackageJSON.license = pwInternalJSON.license;
for (const name of Object.keys(currentPackageJSON.dependencies)) {
if (name in PACKAGES)
currentPackageJSON.dependencies[name] = `=${pwInternalJSON.version}`;
}
await writeToPackage('package.json', JSON.stringify(currentPackageJSON, null, 2) + '\n');
async function writeToPackage(fileName, content) {
const toPath = path.join(packagePath, fileName);
const currentContent = await fs.promises.readFile(toPath, 'utf8').catch(e => null);
if (currentContent === content)
return;
dirtyFiles.push(toPath);
await fs.promises.writeFile(toPath, content);
}
}
async function copyToPackage(fromPath, toPath) {
await fs.promises.mkdir(path.dirname(toPath), { recursive: true });
await cpAsync(fromPath, toPath);
}