diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff72e2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/composer.lock +/vendor diff --git a/bin/apilite-files b/bin/apilite-files new file mode 100644 index 0000000..98c4670 --- /dev/null +++ b/bin/apilite-files @@ -0,0 +1,129 @@ +#!/usr/bin/env php + $source_dir) { + echo "➡️ [$index]: $project_root/$source_dir\n"; +} +$selected = readline("❔ Select source dir [default: 0]: "); +$selected = empty($selected) ? 0 : $selected; +if (!isset($source_dirs[$selected])) { + echo "⛔ Invalid selection\n"; + exit(2); +} +$source_dir = $project_root . '/' . $source_dirs[$selected]; +$source_dir = rtrim($source_dir, '/') . '/'; +$namespaces = array_keys($composer_arr['autoload']['psr-4']); +$namespace = $namespaces[$selected]; +echo "✔️ Source dir: {$source_dir} with namespace: {$namespace}\n"; + +// Copy files +echo "ℹ️ Copy files\n"; + +copyFile($source_dir . 'API.php', '<' . '?php + +namespace ' . rtrim($namespace, '\\') . '; + +use TPsoft\APIlite\APIlite; + +class API extends APIlite { + +} +'); + +copyFile($project_root . '/scripts/buildTypeScript.php', '<' . '?php + +require __DIR__ . \'/../vendor/autoload.php\'; + +ob_start(); + +$backend_api = new TPsoft\BugreportBackend\API(\'typescript\', \'import.meta.env.VITE_BACKENDAPI_URL\', \'backend\'); + +$output = ob_get_contents(); +ob_end_clean(); + +$ts_path = realpath(__DIR__ . \'/../../frontend/src\').\'/backend.js\'; +$suc = file_put_contents($ts_path, $output); +if ($suc === false) { + echo "✗ TypeScript store into file failed\n"; + exit(2); +} + +echo "✓ TypeScript backend script created\n"; +'); + +copyFile($project_root . '/public/API.php', '<' . '?php + +require_once __DIR__.\'/../src/API.php\'; +new \\' . $namespace . 'API(); +'); + +// Change composer.json +if (!isset($composer_arr['scripts']['build'])) { + $composer_arr['scripts']['build'] = 'php scripts/buildTypeScript.php'; +} + +$composer_json = json_encode($composer_arr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); +$composer_json = preg_replace_callback( + '/^( +)/m', + fn($m) => str_repeat("\t", intdiv(strlen($m[1]), 4)), + $composer_json +); +$suc = file_put_contents($project_root . '/composer.json', $composer_json); +if ($suc) { + echo "✅ File changed: $project_root/composer.json\n"; +} else { + echo "🔴 Failed to change file: $project_root/composer.json\n"; +} + + +/** + * Functions + */ +function findProjectRoot(string $startDir): ?string +{ + $dir = realpath($startDir); + if (!$dir) return null; + while ($dir && $dir !== dirname($dir)) { + if (is_file($dir . '/vendor/autoload.php')) { + return $dir; + } + $dir = dirname($dir); + } + return null; +} + +function copyFile(string $destination, string $content): bool +{ + $dir = dirname($destination); + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + if (file_exists($destination)) { + echo "⚠️ File already exists: $destination\n"; + $confirm = readline("❔ Overwrite? (y - yes, other - no): "); + if ($confirm != 'y') { + return false; + } + } + $suc = file_put_contents($destination, $content) !== false; + if ($suc) { + echo "✅ File created: $destination\n"; + } else { + echo "🔴 Failed to create file: $destination\n"; + } + return $suc; +} diff --git a/composer.json b/composer.json index 080e578..1604b0f 100644 --- a/composer.json +++ b/composer.json @@ -32,5 +32,8 @@ "psr-4": { "TPsoft\\APIlite\\": "src/" } - } + }, + "bin": [ + "bin/apilite-files" + ] }