diff --git a/dev/licensing/gen-js-licenses b/dev/licensing/gen-js-licenses index 6c44791aa..dfb2f6651 100644 --- a/dev/licensing/gen-js-licenses +++ b/dev/licensing/gen-js-licenses @@ -4,10 +4,12 @@ // This script reads the project composer.lock file to generate // clear license details for our PHP dependencies. +declare(strict_types=1); +require "gen-licenses-shared.php"; + $rootPath = dirname(__DIR__, 2); $outputPath = "{$rootPath}/dev/licensing/js-library-licenses.txt"; $outputSeparator = "\n-----------\n"; -$warnings = []; $packages = [ ...glob("{$rootPath}/node_modules/*/package.json"), @@ -20,12 +22,7 @@ $licenseInfo = implode($outputSeparator, $packageOutput) . "\n"; file_put_contents($outputPath, $licenseInfo); echo "License information written to {$outputPath}\n"; -echo implode("\n", $warnings); - -function dd(mixed $data): never { - print_r($data); - exit(0); -} +echo implode("\n", getWarnings()); function packageToOutput(string $packagePath): string { @@ -64,58 +61,3 @@ function packageToOutput(string $packagePath): string return implode("\n", $output); } - -function findLicenseFile(string $packageName, string $packagePath): string -{ - $licenseNameOptions = [ - 'license', 'LICENSE', 'License', - 'license.*', 'LICENSE.*', 'License.*', - 'license-*.*', 'LICENSE-*.*', 'License-*.*', - ]; - $packageDir = dirname($packagePath); - - $foundLicenses = []; - foreach ($licenseNameOptions as $option) { - $search = glob("{$packageDir}/$option"); - array_push($foundLicenses, ...$search); - } - - if (count($foundLicenses) > 1) { - warn("Package {$packageName}: more than one license file found"); - } - - if (count($foundLicenses) > 0) { - $fileName = basename($foundLicenses[0]); - return "{$packageDir}/{$fileName}"; - } - - warn("Package {$packageName}: no license files found"); - return ''; -} - -function findCopyright(string $licenseFile): string -{ - $fileContents = file_get_contents($licenseFile); - $pattern = '/^.*?copyright (\(c\)|\d{4})[\s\S]*?(\n\n|\.\n)/mi'; - $matches = []; - preg_match($pattern, $fileContents, $matches); - $copyright = trim($matches[0] ?? ''); - - if (str_contains($copyright, 'i.e.')) { - return ''; - } - - $emailPattern = '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i'; - return preg_replace_callback($emailPattern, obfuscateEmail(...), $copyright); -} - -function obfuscateEmail(array $matches): string -{ - return preg_replace('/[^@.]/', '*', $matches[1]); -} - -function warn(string $text): void -{ - global $warnings; - $warnings[] = "WARN:" . $text; -} \ No newline at end of file diff --git a/dev/licensing/gen-licenses-shared.php b/dev/licensing/gen-licenses-shared.php index 265c209ca..a8ad350f2 100644 --- a/dev/licensing/gen-licenses-shared.php +++ b/dev/licensing/gen-licenses-shared.php @@ -2,3 +2,65 @@ declare(strict_types=1); +$warnings = []; + +function findLicenseFile(string $packageName, string $packagePath): string +{ + $licenseNameOptions = [ + 'license', 'LICENSE', 'License', + 'license.*', 'LICENSE.*', 'License.*', + 'license-*.*', 'LICENSE-*.*', 'License-*.*', + ]; + $packageDir = dirname($packagePath); + + $foundLicenses = []; + foreach ($licenseNameOptions as $option) { + $search = glob("{$packageDir}/$option"); + array_push($foundLicenses, ...$search); + } + + if (count($foundLicenses) > 1) { + warn("Package {$packageName}: more than one license file found"); + } + + if (count($foundLicenses) > 0) { + $fileName = basename($foundLicenses[0]); + return "{$packageDir}/{$fileName}"; + } + + warn("Package {$packageName}: no license files found"); + return ''; +} + +function findCopyright(string $licenseFile): string +{ + $fileContents = file_get_contents($licenseFile); + $pattern = '/^.*?copyright (\(c\)|\d{4})[\s\S]*?(\n\n|\.\n)/mi'; + $matches = []; + preg_match($pattern, $fileContents, $matches); + $copyright = trim($matches[0] ?? ''); + + if (str_contains($copyright, 'i.e.')) { + return ''; + } + + $emailPattern = '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i'; + return preg_replace_callback($emailPattern, obfuscateEmail(...), $copyright); +} + +function obfuscateEmail(array $matches): string +{ + return preg_replace('/[^@.]/', '*', $matches[1]); +} + +function warn(string $text): void +{ + global $warnings; + $warnings[] = "WARN:" . $text; +} + +function getWarnings(): array +{ + global $warnings; + return $warnings; +} diff --git a/dev/licensing/gen-php-licenses b/dev/licensing/gen-php-licenses index 0c922e281..ed5a21c5a 100644 --- a/dev/licensing/gen-php-licenses +++ b/dev/licensing/gen-php-licenses @@ -4,11 +4,13 @@ // This script reads the project composer.lock file to generate // clear license details for our PHP dependencies. +declare(strict_types=1); +require "gen-licenses-shared.php"; + $rootPath = dirname(__DIR__, 2); $outputPath = "{$rootPath}/dev/licensing/php-library-licenses.txt"; $composerLock = json_decode(file_get_contents($rootPath . "/composer.lock")); $outputSeparator = "\n-----------\n"; -$warnings = []; $packages = $composerLock->packages; $packageOutput = array_map(packageToOutput(...), $packages); @@ -17,22 +19,25 @@ $licenseInfo = implode($outputSeparator, $packageOutput) . "\n"; file_put_contents($outputPath, $licenseInfo); echo "License information written to {$outputPath}\n"; -echo implode("\n", $warnings); +echo implode("\n", getWarnings()); function packageToOutput(stdClass $package) : string { + global $rootPath; $output = ["{$package->name}"]; $licenses = is_array($package->license) ? $package->license : [$package->license]; $output[] = "License: " . implode(' ', $licenses); - $licenseFile = findLicenseFile($package->name); + $packagePath = "{$rootPath}/vendor/{$package->name}/package.json"; + $licenseFile = findLicenseFile($package->name, $packagePath); if ($licenseFile) { - $output[] = "License File: {$licenseFile}"; + $relLicenseFile = str_replace("{$rootPath}/", '', $licenseFile); + $output[] = "License File: {$relLicenseFile}"; $copyright = findCopyright($licenseFile); if ($copyright) { $output[] = "Copyright: {$copyright}"; } else { - warn("Package {$package->name} has no copyright found in its license"); + warn("Package {$package->name}: no copyright found in its license"); } } @@ -47,50 +52,4 @@ function packageToOutput(stdClass $package) : string { } return implode("\n", $output); -} - -function findLicenseFile(string $packageName): string { - global $rootPath; - $licenseNameOptions = ['license', 'LICENSE', 'license.*', 'LICENSE.*']; - - $packagePath = "vendor/{$packageName}"; - $filePath = "{$rootPath}/{$packagePath}"; - - $foundLicenses = []; - foreach ($licenseNameOptions as $option) { - $search = glob("{$filePath}/$option"); - array_push($foundLicenses, ...$search); - } - - if (count($foundLicenses) > 1) { - warn("Package {$packagePath} has more than one license file found"); - } - - if (count($foundLicenses) > 0) { - $fileName = basename($foundLicenses[0]); - return "{$packagePath}/{$fileName}"; - } - - warn("Package {$packageName} has no license files found"); - return ''; -} - -function findCopyright(string $licenseFile): string { - $fileContents = file_get_contents($licenseFile); - $pattern = '/^.*?copyright (\(c\)|\d{4})[\s\S]*?(\n\n|\.\n)/mi'; - $matches = []; - preg_match($pattern, $fileContents, $matches); - $copyright = trim($matches[0] ?? ''); - - $emailPattern = '/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i'; - return preg_replace_callback($emailPattern, obfuscateEmail(...), $copyright); -} - -function obfuscateEmail(array $matches): string { - return preg_replace('/[^@.]/', '*', $matches[1]); -} - -function warn(string $text): void { - global $warnings; - $warnings[] = "WARN:" . $text; } \ No newline at end of file diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 15a519e20..bcf4e5aa2 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -19,5 +19,6 @@ parameters: excludePaths: - ./Config/**/*.php + - ./dev/**/*.php checkMissingIterableValueType: false \ No newline at end of file