| /** |
| * @license |
| * Copyright (C) 2020 The Android Open Source Project |
| * |
| * 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 is a command-line tool to calculate licenses for files in npm packages. |
| * The tool expected the following inputs: |
| * |
| * config.js - information about licenses for packages. The js file must be a module |
| * and must have array of {@link PackageInfo} as a default export. |
| * |
| * node-modules-files.txt - list of files (one per line) to calculate license. |
| * Each line must be a path to a file inside node_module directory |
| * (full path or path relative to current work dir) |
| * |
| * shared-licenses.txt - list of files (one per line) with licenses texts. Each line is a path |
| * to a file with license text. The files can be referenced by {@link SharedFileLicenseInfo} |
| * |
| * json-output.json - output file name. The {@link LicensesMap} defines the schema of this file. |
| * |
| * Note: It is expected, that config is compiled from .ts file end has default export. |
| * Typescript compiler checks that .ts file matches PackageInfo interface, so no additional |
| * validations are needed. |
| */ |
| |
| import * as path from "path"; |
| import * as fs from "fs"; |
| import {PackageInfo} from "./package-license-info"; |
| import {fail, readMultilineParamFile} from "./utils"; |
| import {LicenseMapGenerator} from "./licenses-map"; |
| import {SharedLicensesProvider} from "./shared-licenses-provider"; |
| |
| interface LicenseMapCommandLineArgs { |
| generatorParams: LicenseMapGeneratorParameters; |
| outputJsonPath: string; |
| } |
| |
| export interface LicenseMapGeneratorParameters { |
| sharedLicensesFiles: string[]; |
| nodeModulesFiles: string[]; |
| packages: PackageInfo[]; |
| } |
| |
| function parseArguments(argv: string[]): LicenseMapCommandLineArgs { |
| if(argv.length < 6) { |
| fail("Invalid command line parameters\n" + |
| "\tUsage:\n\tnode license-map-generator config.js node-modules-files.txt shared-licenses.txt json-output.json"); |
| } |
| const packages: PackageInfo[] = require(path.join(process.cwd(), argv[2])).default; |
| const nodeModulesFiles = readMultilineParamFile(argv[3]); |
| const sharedLicensesFiles = readMultilineParamFile(argv[4]); |
| |
| return { |
| generatorParams: { |
| packages, |
| nodeModulesFiles, |
| sharedLicensesFiles, |
| }, |
| outputJsonPath: argv[5] |
| } |
| } |
| |
| function main() { |
| const args = parseArguments(process.argv); |
| const generator = new LicenseMapGenerator(args.generatorParams.packages, new SharedLicensesProvider(args.generatorParams.sharedLicensesFiles)); |
| const licenseMap = generator.generateMap(args.generatorParams.nodeModulesFiles); |
| // JSON is quite small, so there are no reasons to minify it. |
| // Write it as multiline file with tabs (spaces). |
| fs.writeFileSync(args.outputJsonPath, JSON.stringify(licenseMap, null, 2), "utf-8"); |
| } |
| |
| main(); |