diff --git a/.github/get-ux-packages.php b/.github/get-ux-packages.php new file mode 100644 index 00000000000..e1513067c13 --- /dev/null +++ b/.github/get-ux-packages.php @@ -0,0 +1,31 @@ +in([__DIR__.'/../src/*/', __DIR__.'/../src/*/src/Bridge/*/']) + ->depth(0) + ->name('composer.json') +; + +// 1. Find all UX packages +$uxPackages = []; +foreach ($finder as $composerFile) { + $json = file_get_contents($composerFile->getPathname()); + if (null === $packageData = json_decode($json, true)) { + passthru(sprintf('composer validate %s', $composerFile->getPathname())); + exit(1); + } + + if (str_starts_with($composerFile->getPathname(), __DIR__ . '/../src/')) { + $packageName = $packageData['name']; + + $uxPackages[] = [ + 'path' => realpath($composerFile->getPath()), + ]; + } +} + +echo json_encode($uxPackages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . PHP_EOL; diff --git a/.github/workflows/code-quality.yaml b/.github/workflows/code-quality.yaml index bf9fd03867b..3391147a80c 100644 --- a/.github/workflows/code-quality.yaml +++ b/.github/workflows/code-quality.yaml @@ -81,3 +81,15 @@ jobs: source .github/workflows/.utils.sh echo "$PACKAGES" | xargs -n1 | parallel -j +3 "_run_task {} '(cd src/{} && $COMPOSER_MIN_STAB && $COMPOSER_UP && $PHPUNIT_INSTALL && $PHPSTAN)'" + + normalize-package-php: + name: Normalize PHP Packages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + - run: composer install --no-progress --no-interaction --ansi + - run: composer packages-normalize-check diff --git a/.github/workflows/validate-packages.yaml b/.github/workflows/validate-packages.yaml new file mode 100644 index 00000000000..34e684a323e --- /dev/null +++ b/.github/workflows/validate-packages.yaml @@ -0,0 +1,44 @@ +name: Validate Packages + +on: + push: + paths: + - 'src/**/composer.json' + pull_request: + paths: + - 'src/**/composer.json' + - 'src/**/package.json' + +jobs: + validate-packages: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + + - name: Install PHP root dependencies + run: composer install + + - run: npm i -g corepack && corepack enable + + - uses: actions/setup-node@v4 + with: + cache: 'yarn' + + - name: Install Node.js root dependencies + run: yarn install --immutable + + - name: Verify packages + run: | + php .github/get-ux-packages.php | jq -r '.[] | .path' | while read -r pkg_path; do + composer normalize "$pkg_path/composer.json" --no-check-lock --dry-run || echo "\033[41mFile $pkg_path is not normalized.\033[0m\033[41mPlease run "composer packages-normalize" in Symfony UX root repository.\033[0m" && exit 1; + node <=8.1", "symfony/filesystem": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "php-cs-fixer/shim": "^3.62" + "php-cs-fixer/shim": "^3.62", + "ergebnis/composer-normalize": "^2.47" + }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true + } + }, + "scripts": { + "packages-normalize": "php .github/get-ux-packages.php | jq -r '.[] | .path' | while read -r path; do composer normalize \"$path/composer.json\" --no-check-lock; done" } } diff --git a/package.json b/package.json index 6aa2a0ee656..288f03d0b44 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@symfony/stimulus-testing": "^2.0.1", "@vitest/browser": "^2.1.1", "lightningcss": "^1.28.2", + "normalize-package-data": "^7.0.0", "playwright": "^1.47.0", "rollup": "^4.22.5", "tslib": "^2.6.3", diff --git a/yarn.lock b/yarn.lock index 3fe81d3cf16..b9c6418451a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5775,6 +5775,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^8.0.0": + version: 8.1.0 + resolution: "hosted-git-info@npm:8.1.0" + dependencies: + lru-cache: "npm:^10.0.1" + checksum: 10c0/53cc838ecaa7d4aa69a81d9d8edc362c9d415f67b76ad38cdd781d2a2f5b45ad0aa9f9b013fb4ea54a9f64fd2365d0b6386b5a24bdf4cb90c80477cf3175aaa2 + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^2.0.1": version: 2.0.1 resolution: "html-encoding-sniffer@npm:2.0.1" @@ -7873,6 +7882,17 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^7.0.0": + version: 7.0.0 + resolution: "normalize-package-data@npm:7.0.0" + dependencies: + hosted-git-info: "npm:^8.0.0" + semver: "npm:^7.3.5" + validate-npm-package-license: "npm:^3.0.4" + checksum: 10c0/d492cbc4cdd92e99cba517b08cec6adf40ff37f2e97ecf4484ccb2da1ef5bd81c6dfbd8b434d3bdc749df639492ecdc71f4a61de1a8b99fe97fdf4faac13e7f1 + languageName: node + linkType: hard + "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -8804,6 +8824,7 @@ __metadata: "@symfony/stimulus-testing": "npm:^2.0.1" "@vitest/browser": "npm:^2.1.1" lightningcss: "npm:^1.28.2" + normalize-package-data: "npm:^7.0.0" playwright: "npm:^1.47.0" rollup: "npm:^4.22.5" tslib: "npm:^2.6.3" @@ -9886,7 +9907,7 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": +"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: