diff --git a/framework/core/src/Console/ConsoleServiceProvider.php b/framework/core/src/Console/ConsoleServiceProvider.php index 4d0eafb41..00111c96b 100644 --- a/framework/core/src/Console/ConsoleServiceProvider.php +++ b/framework/core/src/Console/ConsoleServiceProvider.php @@ -13,6 +13,7 @@ class ConsoleServiceProvider extends ServiceProvider { $this->commands('Flarum\Console\InstallCommand'); $this->commands('Flarum\Console\SeedCommand'); + $this->commands('Flarum\Console\GenerateExtensionCommand'); } public function register() diff --git a/framework/core/src/Console/GenerateExtensionCommand.php b/framework/core/src/Console/GenerateExtensionCommand.php new file mode 100644 index 000000000..f07da4b4c --- /dev/null +++ b/framework/core/src/Console/GenerateExtensionCommand.php @@ -0,0 +1,127 @@ +app = $app; + } + + /** + * Execute the console command. + * + * @return mixed + */ + public function fire() + { + do { + $name = $this->ask('Extension name (-):'); + } while (! preg_match('/^([a-z0-9]+)-([a-z0-9-]+)$/i', $name, $match)); + + list(, $vendor, $package) = $match; + + do { + $title = $this->ask('Title:'); + } while (! $title); + + $description = $this->ask('Description:'); + + $authorName = $this->ask('Author name:'); + + $authorEmail = $this->ask('Author email:'); + + $license = $this->ask('License:'); + + $this->info('Generating extension skeleton for "'.$name.'"...'); + + $dir = public_path().'/extensions/'.$name; + + $replacements = [ + '{{namespace}}' => ucfirst($vendor).'\\'.ucfirst($package), + '{{escapedNamespace}}' => ucfirst($vendor).'\\\\'.ucfirst($package), + '{{classPrefix}}' => ucfirst($package), + '{{name}}' => $name + ]; + + $this->copyStub($dir, $replacements); + + rename($dir.'/src/ServiceProvider.php', $dir.'/src/'.ucfirst($package).'ServiceProvider.php'); + + $manifest = [ + 'name' => $name, + 'title' => $title, + 'description' => $description, + 'tags' => [], + 'version' => '0.1.0', + 'author' => [ + 'name' => $authorName, + 'email' => $authorEmail + ], + 'license' => $license, + 'require' => [ + 'php' => '>=5.4.0', + 'flarum' => '>0.1.0' + ] + ]; + + file_put_contents($dir.'/flarum.json', json_encode($manifest, JSON_PRETTY_PRINT)); + + passthru("cd $dir; composer install; cd js; npm install; gulp"); + + $this->info('Extension "'.$name.'" generated!'); + } + + protected function copyStub($destination, $replacements = []) + { + $this->recursiveCopy(__DIR__.'/../../stubs/extension', $destination, $replacements); + } + + protected function recursiveCopy($src, $dst, $replacements = []) + { + $dir = opendir($src); + @mkdir($dst); + + while (($file = readdir($dir)) !== false) { + if ($file != '.' && $file != '..') { + if (is_dir($src.'/'.$file)) { + $this->recursiveCopy($src.'/'.$file, $dst.'/'.$file, $replacements); + } + else { + $contents = file_get_contents($src.'/'.$file); + $contents = str_replace(array_keys($replacements), array_values($replacements), $contents); + + file_put_contents($dst.'/'.$file, $contents); + } + } + } + + closedir($dir); + } +} diff --git a/framework/core/stubs/extension/bootstrap.php b/framework/core/stubs/extension/bootstrap.php new file mode 100644 index 000000000..1d29892f9 --- /dev/null +++ b/framework/core/stubs/extension/bootstrap.php @@ -0,0 +1,9 @@ +app->register('{{namespace}}\{{classPrefix}}ServiceProvider'); diff --git a/framework/core/stubs/extension/composer.json b/framework/core/stubs/extension/composer.json new file mode 100644 index 000000000..78b078e14 --- /dev/null +++ b/framework/core/stubs/extension/composer.json @@ -0,0 +1,11 @@ +{ + "require": { + "php": ">=5.4.0" + }, + "autoload": { + "psr-4": { + "{{escapedNamespace}}\\": "src/" + } + }, + "minimum-stability": "dev" +} diff --git a/framework/core/stubs/extension/js/.gitignore b/framework/core/stubs/extension/js/.gitignore new file mode 100644 index 000000000..372e20a51 --- /dev/null +++ b/framework/core/stubs/extension/js/.gitignore @@ -0,0 +1,3 @@ +bower_components +node_modules +dist diff --git a/framework/core/stubs/extension/js/Gulpfile.js b/framework/core/stubs/extension/js/Gulpfile.js new file mode 100644 index 000000000..e53f28d21 --- /dev/null +++ b/framework/core/stubs/extension/js/Gulpfile.js @@ -0,0 +1,5 @@ +var gulp = require('flarum-gulp'); + +gulp({ + modulePrefix: '{{name}}' +}); diff --git a/framework/core/stubs/extension/js/bootstrap.js b/framework/core/stubs/extension/js/bootstrap.js new file mode 100644 index 000000000..5643a6449 --- /dev/null +++ b/framework/core/stubs/extension/js/bootstrap.js @@ -0,0 +1,7 @@ +import { extend, override } from 'flarum/extension-utils'; + +app.initializers.add('{{name}}', function() { + + // @todo + +}); diff --git a/framework/core/stubs/extension/js/package.json b/framework/core/stubs/extension/js/package.json new file mode 100644 index 000000000..3e0ef919d --- /dev/null +++ b/framework/core/stubs/extension/js/package.json @@ -0,0 +1,7 @@ +{ + "private": true, + "devDependencies": { + "gulp": "^3.8.11", + "flarum-gulp": "git+https://github.com/flarum/gulp.git" + } +} diff --git a/framework/core/stubs/extension/less/extension.less b/framework/core/stubs/extension/less/extension.less new file mode 100644 index 000000000..e69de29bb diff --git a/framework/core/stubs/extension/src/ServiceProvider.php b/framework/core/stubs/extension/src/ServiceProvider.php new file mode 100644 index 000000000..5b11546d8 --- /dev/null +++ b/framework/core/stubs/extension/src/ServiceProvider.php @@ -0,0 +1,32 @@ +extend( + new ForumAssets([ + __DIR__.'/../js/dist/extension.js', + __DIR__.'/../less/extension.less' + ]) + ); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // + } +}