Created
October 11, 2021 16:21
-
-
Save eskayamadeus/a39287b0b870478662657fe10fd926ad to your computer and use it in GitHub Desktop.
Configuration file for Spatie Laravel Skeleton - PHP 7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env php | |
<?php | |
function ask(string $question, string $default = ''): string { | |
$answer = readline($question . ($default ? " ({$default})" : null) . ': '); | |
if (! $answer) { | |
return $default; | |
} | |
return $answer; | |
} | |
function confirm(string $question, bool $default = false): bool { | |
$answer = ask($question . ' (' . ($default ? 'Y/n' : 'y/N') . ')'); | |
if (! $answer) { | |
return $default; | |
} | |
return strtolower($answer) === 'y'; | |
} | |
function writeln(string $line): void { | |
echo $line . PHP_EOL; | |
} | |
function run(string $command): string { | |
return trim(shell_exec($command)); | |
} | |
function str_after(string $subject, string $search): string { | |
$pos = strrpos($subject, $search); | |
if ($pos === false) { | |
return $subject; | |
} | |
return substr($subject, $pos + strlen($search)); | |
} | |
function slugify(string $subject): string { | |
return strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $subject), '-')); | |
} | |
function title_case(string $subject): string { | |
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $subject))); | |
} | |
if (!function_exists('str_starts_with')) { | |
function str_starts_with($haystack, $needle) { | |
return (string)$needle !== '' && strncmp($haystack, $needle, strlen($needle)) === 0; | |
} | |
} | |
function replace_in_file(string $file, array $replacements): void { | |
$contents = file_get_contents($file); | |
file_put_contents( | |
$file, | |
str_replace( | |
array_keys($replacements), | |
array_values($replacements), | |
$contents | |
) | |
); | |
} | |
function remove_prefix(string $prefix, string $content): string { | |
if (str_starts_with($content, $prefix)) { | |
return substr($content, strlen($prefix)); | |
} | |
return $content; | |
} | |
function replaceForWindows(): array { | |
return preg_split('/\\r\\n|\\r|\\n/', run('dir /S /B * | findstr /v /i .github | findstr /v /i vendor | findstr /v /i '.basename(__FILE__).' | findstr /r /i /M /F:/ ":author :vendor :package VendorName skeleton vendor_name vendor_slug [email protected]"')); | |
} | |
function replaceForAllOtherOSes(): array { | |
return explode(PHP_EOL, run('grep -E -r -l -i ":author|:vendor|:package|VendorName|skeleton|vendor_name|vendor_slug|[email protected]" --exclude-dir=vendor ./* ./.github/* | grep -v ' . basename(__FILE__))); | |
} | |
$gitName = run('git config user.name'); | |
$authorName = ask('Author name', $gitName); | |
$gitEmail = run('git config user.email'); | |
$authorEmail = ask('Author email', $gitEmail); | |
$usernameGuess = explode(':', run('git config remote.origin.url'))[1]; | |
$usernameGuess = dirname($usernameGuess); | |
$usernameGuess = basename($usernameGuess); | |
$authorUsername = ask('Author username', $usernameGuess); | |
$vendorName = ask('Vendor name', $authorUsername); | |
$vendorSlug = slugify($vendorName); | |
$vendorNamespace = ucwords($vendorName); | |
$vendorNamespace = ask('Vendor namespace', $vendorNamespace); | |
$currentDirectory = getcwd(); | |
$folderName = basename($currentDirectory); | |
$packageName = ask('Package name', $folderName); | |
$packageSlug = slugify($packageName); | |
$packageSlugWithoutPrefix = remove_prefix('laravel-', $packageSlug); | |
$className = title_case($packageName); | |
$className = ask('Class name', $className); | |
$description = ask('Package description', "This is my package {$packageSlug}"); | |
writeln('------'); | |
writeln("Author : {$authorName} ({$authorUsername}, {$authorEmail})"); | |
writeln("Vendor : {$vendorName} ({$vendorSlug})"); | |
writeln("Package : {$packageSlug} <{$description}>"); | |
writeln("Namespace : {$vendorNamespace}\\{$className}"); | |
writeln("Class name : {$className}"); | |
writeln('------'); | |
writeln('This script will replace the above values in all relevant files in the project directory.'); | |
if (! confirm('Modify files?', true)) { | |
exit(1); | |
} | |
$files = (str_starts_with(strtoupper(PHP_OS), 'WIN') ? replaceForWindows() : replaceForAllOtherOSes()); | |
foreach ($files as $file) { | |
replace_in_file($file, [ | |
':author_name' => $authorName, | |
':author_username' => $authorUsername, | |
'[email protected]' => $authorEmail, | |
':vendor_name' => $vendorName, | |
':vendor_slug' => $vendorSlug, | |
'VendorName' => $vendorNamespace, | |
':package_name' => $packageName, | |
':package_slug' => $packageSlug, | |
'Skeleton' => $className, | |
'skeleton' => $packageSlug, | |
':package_description' => $description, | |
]); | |
switch (true) { | |
case strpos($file, 'src/Skeleton.php'): | |
rename($file, './src/' . $className . '.php'); | |
case strpos($file, 'src/SkeletonServiceProvider.php'): | |
rename($file, './src/' . $className . 'ServiceProvider.php'); | |
case strpos($file, 'src/SkeletonFacade.php'): | |
rename($file, './src/' . $className . 'Facade.php'); | |
case strpos($file, 'src/Commands/SkeletonCommand.php'): | |
rename($file, './src/Commands/' . $className . 'Command.php'); | |
case strpos($file, 'database/migrations/create_skeleton_table.php.stub'): | |
rename($file, './database/migrations/create_' . $packageSlugWithoutPrefix . '_table.php.stub'); | |
case strpos($file, 'config/Skeleton.php'): | |
rename($file, './config/' . $packageSlugWithoutPrefix . '.php'); | |
default: | |
# code... | |
[]; | |
break; | |
} | |
// match (true) { | |
// str_contains($file, 'src/Skeleton.php') => rename($file, './src/' . $className . '.php'), | |
// str_contains($file, 'src/SkeletonServiceProvider.php') => rename($file, './src/' . $className . 'ServiceProvider.php'), | |
// str_contains($file, 'src/SkeletonFacade.php') => rename($file, './src/' . $className . 'Facade.php'), | |
// str_contains($file, 'src/Commands/SkeletonCommand.php') => rename($file, './src/Commands/' . $className . 'Command.php'), | |
// str_contains($file, 'database/migrations/create_skeleton_table.php.stub') => rename($file, './database/migrations/create_' . $packageSlugWithoutPrefix . '_table.php.stub'), | |
// str_contains($file, 'config/skeleton.php') => rename($file, './config/' . $packageSlugWithoutPrefix . '.php'), | |
// default => [], | |
// }; | |
// match (true) { | |
// str_contains($file, 'src/Skeleton.php') => rename($file, './src/' . $className . '.php'), | |
// str_contains($file, 'src/SkeletonServiceProvider.php') => rename($file, './src/' . $className . 'ServiceProvider.php'), | |
// str_contains($file, 'src/SkeletonFacade.php') => rename($file, './src/' . $className . 'Facade.php'), | |
// str_contains($file, 'src/Commands/SkeletonCommand.php') => rename($file, './src/Commands/' . $className . 'Command.php'), | |
// str_contains($file, 'database/migrations/create_skeleton_table.php.stub') => rename($file, './database/migrations/create_' . $packageSlugWithoutPrefix . '_table.php.stub'), | |
// str_contains($file, 'config/skeleton.php') => rename($file, './config/' . $packageSlugWithoutPrefix . '.php'), | |
// default => [], | |
// }; | |
} | |
confirm('Execute `composer install` and run tests?') && run('composer install && composer test'); | |
confirm('Let this script delete itself?', true) && unlink(__FILE__); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment