// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you 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. /** * @fileoverview Script used to prepare WebDriverJS as a Node module. */ 'use strict'; var assert = require('assert'), fs = require('fs'), path = require('path'); var optparse = require('./optparse'); var gendocs = require('./gendocs'); /** * @param {string} srcDir Path to the main source directory. * @param {string} outputDirPath Path to the directory to copy src files to. */ function copySrcs(srcDir, outputDirPath) { var filePaths = fs.readdirSync(srcDir); filePaths.forEach(function(filePath) { if (filePath === 'node_modules') { return; } filePath = path.join(srcDir, filePath); if (fs.statSync(filePath).isDirectory()) { copySrcs(filePath, path.join(outputDirPath, path.basename(filePath))); } else { var dest = path.join(outputDirPath, path.basename(filePath)); copyFile(filePath, dest); } }); } function copyFile(src, dest) { createDirectoryIfNecessary(path.dirname(dest)); var buffer = fs.readFileSync(src); fs.writeFileSync(dest, buffer); } function copyDirectory(baseDir, dest, exclusions) { createDirectoryIfNecessary(dest); if (!fs.statSync(dest).isDirectory()) { throw Error(dest + ' is not a directory!'); } fs.readdirSync(path.resolve(baseDir)). map(function(filePath) { return path.join(baseDir, filePath); }). filter(function(filePath) { return !exclusions.some(function(exclusion) { return exclusion.test(filePath); }); }). forEach(function(srcFile) { var destFile = path.join(dest, srcFile.substring(baseDir.length)); if (fs.statSync(srcFile).isDirectory()) { copyDirectory(srcFile, destFile, exclusions); } else { copyFile(path.resolve(srcFile), destFile); } }); } function createDirectoryIfNecessary(dirPath) { var toCreate = []; var current = dirPath; while (!fs.existsSync(current)) { toCreate.push(path.basename(current)); current = path.dirname(current); } while (toCreate.length) { current = path.join(current, toCreate.pop()); fs.mkdirSync(current); } } function copyResources(outputDirPath, resources, exclusions) { resources.forEach(function(resource) { var parts = resource.split(':', 2); var src = path.resolve(parts[0]); var dest = outputDirPath; var isAbsolute = path.resolve(parts[1]) === parts[1]; if (!isAbsolute) { dest = path.join(dest, 'lib'); } dest = path.join(dest, parts[1]); if (fs.statSync(src).isDirectory()) { copyDirectory(parts[0], dest, exclusions); } else { copyFile(src, dest); } }); } function main() { var parser = new optparse.OptionParser(). path('output', { help: 'Path to the output directory' }). path('src', { help: 'Path to the module source directory. The entire contents of ' + 'this directory will be copied recursively to the main output ' + 'directory.' }). string('resource', { help: 'A resource which should be copied into the final module, in ' + 'the form of a ":" colon separated pair, the first part ' + 'designating the source, and the second its destination. If ' + 'the destination path is absolute, it is relative to the ' + 'module root, otherwise it will be treated relative to the ' + 'lib/ directory. If the source refers to a directory, the ' + 'recursive contents of that directory will be copied to the ' + 'destination directory.', list: true }). regex('exclude_resource', { help: 'A pattern for files to exclude when copying ' + 'an entire directory of resources.', list: true }); parser.parse(); var options = parser.options; console.log('Copying sources...'); copySrcs(options.src, options.output); console.log('Copying resource files...'); copyResources(options.output, options.resource, options.exclude_resource); console.log('Generating documentation...'); gendocs().then(() => console.log('ALL DONE'), function(e) { setTimeout(() => {throw e}, 0); }); } assert.strictEqual(module, require.main, 'This module may not be included'); main();