From 90ef48936aa92fd4d99f356d5516e2b1b4aa1741 Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Fri, 3 Jul 2020 09:33:23 +0200
Subject: [PATCH] Build initial functionality

---
 composer.json   |  7 ++--
 src/Handler.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/composer.json b/composer.json
index 2d13f64..4bfc267 100644
--- a/composer.json
+++ b/composer.json
@@ -17,12 +17,9 @@
         "source": "https://gitlab.lakedrops.com/composer/plugin/drupal-spoons/tree/master"
     },
     "require": {
-        "php": ">=7",
-        "composer-plugin-api": "^1.0.0"
-    },
-    "require-dev": {
+        "php": ">=7.1",
         "composer/composer": "^1.10",
-        "phpunit/phpunit": "^8.4"
+        "composer-plugin-api": "^1.0.0"
     },
     "minimum-stability": "dev",
     "prefer-stable": true,
diff --git a/src/Handler.php b/src/Handler.php
index 739995c..8e30f10 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -4,6 +4,7 @@ namespace LakeDrops\DrupalSpoons;
 
 use Composer\Composer;
 use Composer\IO\IOInterface;
+use Composer\Json\JsonFile;
 use Symfony\Component\Filesystem\Filesystem;
 
 /**
@@ -50,6 +51,30 @@ class Handler {
 
     // Directory where the root project is being created.
     $projectRoot = getcwd();
+    $full_name = $this->composer->getPackage()->getName();
+    [, $project_name] = explode('/', $full_name);
+    $moduleRoot = $projectRoot . "/web/modules/custom/$project_name";
+
+    // Prepare directory for current module.
+    if ($fs->exists($moduleRoot)) {
+      $fs->remove($moduleRoot);
+    }
+    $fs->mkdir($moduleRoot);
+    foreach (scandir($projectRoot) as $item) {
+      if (!in_array($item, ['.git', 'vemdor', 'web'])) {
+        $rel = $fs->makePathRelative($projectRoot, $moduleRoot);
+        $fs->symlink($rel, $moduleRoot . "/$item");
+      }
+    }
+
+    // Append DrupalSpoon related components to composer.json.
+    $jsonFile = new JsonFile($projectRoot . '/composer.json');
+    $content = [];
+    if ($jsonFile->exists()) {
+      $content = $jsonFile->read();
+    }
+    $content = array_merge_recursive($content, $options);
+    $jsonFile->write($content);
   }
 
   /**
@@ -61,6 +86,70 @@ class Handler {
   protected function getOptions(): array {
     $extra = $this->composer->getPackage()->getExtra() + ['drupalspoons' => []];
     return $extra['drupalspoons'] + [
+      'repositories' => [
+        [
+          'type' => 'composer',
+          'url' => 'https://packages.drupal.org/8',
+        ],
+      ],
+      'require_dev' => [
+        'composer/installers' => '^1',
+        'drupal/core-composer-scaffold' => '^8.8',
+        'cweagans/composer-patches' => '~1.0',
+        'drupal/core-recommended' => '^8.8',
+        'drupal/core-dev' => '^8.8',
+        'drush/drush' => '^10',
+        'mglaman/phpstan-drupal' => '^0.12',
+        'phpstan/phpstan-deprecation-rules' => '^0.12',
+        'php-parallel-lint/php-parallel-lint' => '^1.2',
+        'zaporylie/composer-drupal-optimizations' => '^1.0',
+      ],
+      'scripts' => [
+        'si' => 'drush si -v --db-url=${SIMPLETEST_DB:-mysql://root:password@mariadb/db}',
+        'phpcs' => 'phpcs --runtime-set ignore_warnings_on_exit 1 --runtime-set ignore_errors_on_exit 1 web/modules/custom',
+        'lint' => 'parallel-lint --exclude web --exclude vendor .',
+        'webserver' => 'cd web && php -S 0.0.0.0:8888 .ht.router.php',
+        'chromedriver' => 'chromedriver --port=9515 --verbose --whitelisted-ips --log-path=/tmp/chromedriver.log --no-sandbox',
+        'unit' => 'phpunit --verbose web/modules/custom',
+        'phpstan' => 'phpstan analyse web/modules/custom',
+        'stylelint' => 'yarn --silent --cwd web/core stylelint --formatter verbose --config ./.stylelintrc.json ../modules/custom/**/*.css',
+        'eslint' => 'yarn --silent --cwd web/core eslint -c ./.eslintrc.json ../modules/custom',
+      ],
+      'config' => [
+        'process-timeout' => 36000,
+      ],
+      'extra' => [
+        'installer-paths' => [
+          'web/core' => [
+            0 => 'type:drupal-core',
+          ],
+          'web/libraries/{$name}' => [
+            0 => 'type:drupal-library',
+          ],
+          'web/modules/contrib/{$name}' => [
+            0 => 'type:drupal-module',
+          ],
+          'web/profiles/{$name}' => [
+            0 => 'type:drupal-profile',
+          ],
+          'web/themes/{$name}' => [
+            0 => 'type:drupal-theme',
+          ],
+          'drush/{$name}' => [
+            0 => 'type:drupal-drush',
+          ],
+        ],
+        'drupal-scaffold' => [
+          'locations' => [
+            'web-root' => 'web/',
+          ],
+        ],
+        'drush' => [
+          'services' => [
+            'drush.services.yml' => '^9 || ^10',
+          ],
+        ],
+      ],
     ];
   }
 
-- 
GitLab