blob: c0c2315725300bacf06b9013c43faa2064640e0f [file] [log] [blame]
* @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
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* 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: {
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");