//@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' || name.startsWith('@gitkraken')) continue;
|
|
if (data.licenseFile == null) 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');
|
|
}
|
|
license = license.replace(/\r\n/g, '\n');
|
|
|
|
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();
|