Switching to npm packages requires a new way to define licenses for javascript libraries. This change adds a tool to generate json licenses map and also adds some examples how to define licenses. Change-Id: I80ba0ec5ef7853c517073566dfb34a5caebd5dcb
86 lines
3.2 KiB
TypeScript
86 lines
3.2 KiB
TypeScript
/**
|
|
* @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();
|