diff --git a/src/Action/CreateListOfFilesToGenerate.php b/src/Action/CreateListOfFilesToGenerate.php index 7f4cb8a..2fef45d 100644 --- a/src/Action/CreateListOfFilesToGenerate.php +++ b/src/Action/CreateListOfFilesToGenerate.php @@ -9,23 +9,33 @@ use App\DataTransferObject\TemplateFile; use App\Enum\Language; use App\Enum\WebServer; use Illuminate\Support\Arr; +use Illuminate\Support\Collection; final class CreateListOfFilesToGenerate { - public function handle(array $configurationDataAndDto, \Closure $next) { - + public function handle(array $configurationDataAndDto, \Closure $next) + { /** * @var Config $configurationDataDto, * @var array $configurationData */ [$configurationData, $configurationDataDto] = $configurationDataAndDto; + $isDocker = static::isDocker($configurationData); + $isFlake = static::isFlake($configurationData); + /** @var Collection */ - $filesToGenerate = collect([ - new TemplateFile(data: 'common/.dockerignore', name: '.dockerignore'), - new TemplateFile(data: 'common/.hadolint.yaml', name: '.hadolint.yaml'), - new TemplateFile(data: 'env.example', name: '.env.example'), - ]); + $filesToGenerate = collect(); + + if ($isDocker) { + $filesToGenerate->push(new TemplateFile(data: 'common/.dockerignore', name: '.dockerignore')); + $filesToGenerate->push(new TemplateFile(data: 'common/.hadolint.yaml', name: '.hadolint.yaml')); + $filesToGenerate->push(new TemplateFile(data: 'env.example', name: '.env.example')); + } + + if ($isFlake) { + $filesToGenerate->push(new TemplateFile(data: 'common/flake.nix', name: 'flake.nix')); + } $extraDatabases = Arr::get($configurationData, 'database.extra_databases', []); if (count($extraDatabases) > 0) { @@ -45,7 +55,10 @@ final class CreateListOfFilesToGenerate } if (static::isPhp(Arr::get($configurationData, 'language'))) { - $filesToGenerate[] = new TemplateFile(data: 'php/Dockerfile', name: 'Dockerfile'); + if ($isDocker) { + $filesToGenerate[] = new TemplateFile(data: 'php/Dockerfile', name: 'Dockerfile'); + } + $filesToGenerate[] = new TemplateFile(data: 'php/phpcs.xml', name: 'phpcs.xml.dist'); $filesToGenerate[] = new TemplateFile(data: 'php/phpunit.xml', name: 'phpunit.xml.dist'); $filesToGenerate[] = new TemplateFile( @@ -65,8 +78,10 @@ final class CreateListOfFilesToGenerate } if (static::isNode(Arr::get($configurationData, 'language'))) { - $filesToGenerate[] = new TemplateFile(data: 'node/.yarnrc', name: '.yarnrc'); - $filesToGenerate[] = new TemplateFile(data: 'node/Dockerfile', name: 'Dockerfile'); + if ($isDocker) { + $filesToGenerate[] = new TemplateFile(data: 'node/.yarnrc', name: '.yarnrc'); + $filesToGenerate[] = new TemplateFile(data: 'node/Dockerfile', name: 'Dockerfile'); + } } if (static::isCaddy(Arr::get($configurationData, 'web.type'))) { @@ -118,6 +133,20 @@ final class CreateListOfFilesToGenerate return strtoupper($webServer) === WebServer::CADDY->name; } + private static function isDocker(array $configurationData): bool + { + // This should return `false` if there is no explicit `dockerfile` key + // in the build.yaml file. This is currently not the case, I assume + // because of default values being added. + // For now, if it's not a Flake, it's Docker. + return !static::isFlake($configurationData); + } + + private static function isFlake(array $configurationData): bool + { + return Arr::get($configurationData, 'flake') !== null; + } + private static function isNginx(?string $webServer): bool { if (is_null($webServer)) { diff --git a/templates/common/flake.nix.twig b/templates/common/flake.nix.twig new file mode 100644 index 0000000..405959b --- /dev/null +++ b/templates/common/flake.nix.twig @@ -0,0 +1,23 @@ +{ + inputs = { + devshell.url = "github:numtide/devshell"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ inputs.devshell.flakeModule ]; + + systems = [ "x86_64-linux" ]; + + perSystem = { config, self', inputs', pkgs, system, ... }: { + devshells.default = { + packages = with pkgs; [ +{% for package in flake.devshell.packages %} + "{{ package }}" +{% endfor %} + ]; + }; + }; + }; +} diff --git a/templates/justfile.twig b/templates/justfile.twig index 77e1c9b..4c8e98d 100644 --- a/templates/justfile.twig +++ b/templates/justfile.twig @@ -1,5 +1,7 @@ # {{ managedText | raw }} +{% set isFlake = flake is defined %} + default: @just --list @@ -39,8 +41,12 @@ install *args: {% if "node" is same as language %} yarn *args: +{% if isFlake %} + {{ "just _exec yarn {{ args }}" | raw }} +{% else %} {{ "just _exec node yarn {{ args }}" | raw }} {% endif %} +{% endif %} {% if "fractal" is same as type %} fractal *args: @@ -50,7 +56,7 @@ clean: rm -fr build build *args: - just fractal build {{ args }} + {{ "just fractal build {{ args }}" | raw }} sync: clean build #!/usr/bin/env bash @@ -99,8 +105,13 @@ test-commit: {% endif %} _exec +args: +{% if flake is defined %} + {{ "nix develop --command {{ args }}" | raw }} +{% else %} {{ "docker compose exec -T {{ args }}" | raw }} +{% endif %} +{% if flake is not defined %} _run service command *args: docker compose run \ --entrypoint {{ "{{ command }}"|raw }} \ @@ -108,5 +119,6 @@ _run service command *args: --rm \ -T \ {{ "{{ service }} {{ args }}"|raw }} +{% endif %} # vim: ft=just