|
|
- //@ts-check
- /* eslint-disable @typescript-eslint/no-var-requires */
- import * as fs from 'fs';
- import * as path from 'path';
- import fetch from 'node-fetch';
- import * as checker from 'license-checker-rseidelsohn';
- import { spawn } from 'child_process';
-
- /** @typedef { { licenses: string; repository: string; licenseFile: string } } PackageInfo **/
-
- /**
- * @param { { [key: string]: PackageInfo } } packages
- */
- async function generateThirdpartyNotices(packages) {
- /**
- * @type [string, PackageInfo][]
- */
- const codeOnlyPackages = [
- [
- 'microsoft/vscode',
- {
- licenses: 'MIT',
- repository: 'https://github.com/microsoft/vscode',
- licenseFile: 'https://raw.github.com/microsoft/vscode/main/LICENSE.txt',
- },
- ],
- [
- 'sindresorhus/string-width',
- {
- licenses: 'MIT',
- repository: 'https://github.com/sindresorhus/string-width',
- licenseFile: 'https://raw.github.com/sindresorhus/string-width/main/license',
- },
- ],
- [
- 'sindresorhus/is-fullwidth-code-point',
- {
- licenses: 'MIT',
- repository: 'https://github.com/sindresorhus/is-fullwidth-code-point',
- licenseFile: 'https://raw.github.com/sindresorhus/is-fullwidth-code-point/main/license',
- },
- ],
- ];
-
- const packageOutputs = [];
- const licenseOutputs = [];
-
- let count = 0;
- for (const [key, data] of Object.entries(packages)
- .concat(codeOnlyPackages)
- .sort(([a], [b]) => a.localeCompare(b))) {
- let name;
- let version;
-
- const index = key.lastIndexOf('@');
- if (index !== -1) {
- name = key.substr(0, index);
- version = key.substr(index + 1);
- } else {
- name = key;
- }
-
- if (name === 'gitlens') continue;
-
- let license;
- if (data.licenseFile.startsWith('https://')) {
- const response = await fetch(data.licenseFile);
- license = await response.text();
- } else {
- license = fs.readFileSync(data.licenseFile, 'utf8');
- }
-
- packageOutputs.push(`${++count}. ${name}${version ? ` version ${version}` : ''} (${data.repository})`);
- licenseOutputs.push(
- `\n%% ${name} NOTICES AND INFORMATION BEGIN HERE\n=========================================\n${license}\n=========================================\nEND OF ${name} NOTICES AND INFORMATION`,
- );
- }
-
- const content = `GitLens\n\nTHIRD-PARTY SOFTWARE NOTICES AND INFORMATION\nThis project incorporates components from the projects listed below.\n\n${packageOutputs.join(
- '\n',
- )}\n${licenseOutputs.join('\n')}`;
- fs.writeFileSync(path.join(process.cwd(), 'ThirdPartyNotices.txt'), content, 'utf8');
- }
-
- async function generate() {
- const packages = await new Promise((resolve, reject) => {
- checker.init(
- {
- direct: 0,
- json: true,
- production: true,
- start: process.cwd(),
- },
- (err, packages) => {
- if (err) {
- reject(err);
- } else {
- resolve(packages);
- }
- },
- );
- });
- void generateThirdpartyNotices(packages);
- }
-
- void generate();
|