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();
 |