diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 83e47a5..f8f67fa 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -1,25 +1,25 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>whitesource/merge-confidence:beta"], + "extends": ["mergeConfidence:all-badges"], + + "enabled": true, - "enabled": false, "assignees": [ "mimmi20" ], - "automerge": false, + "branchConcurrentLimit": 0, "commitBody": "Signed-off-by: {{{gitAuthor}}}", "commitBodyTable": true, - "dependencyDashboard": false, - "enabledManagers": ["composer", "github-actions", "npm"], - "ignoreUnstable": true, + "configMigration": true, + "configWarningReuseIssue": false, + "dependencyDashboard": true, + "dependencyDashboardApproval": true, + "dependencyDashboardOSVVulnerabilitySummary": "all", "labels": [ - "dependencies", - "patch" + "dependencies" ], - "lockFileMaintenance": { - "enabled": false - }, + "osvVulnerabilityAlerts": true, "platformAutomerge": false, "prBodyColumns": [ "Package", @@ -33,41 +33,52 @@ "Update": "{{{updateType}}}", "Change": "[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})" }, + "prConcurrentLimit": 0, "prCreation": "immediate", + "prHourlyLimit": 0, "rangeStrategy": "bump", "rebaseWhen": "behind-base-branch", "reviewers": [ "mimmi20" ], - "rollbackPrs": true, - "schedule": ["at 4:00 pm on Thursday"], + "schedule": ["at 4:00 am on Thursday"], "semanticCommits": "disabled", - "separateMajorMinor": true, - "separateMinorPatch": false, "timezone": "Europe/Berlin", - "updateLockFiles": false, - "updateNotScheduled": false, "packageRules": [ + { + "groupName": "PHP", + "matchDepNames": ["php"], + "allowedVersions": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "ignoreUnstable": false, + "rangeStrategy": "widen" + }, + { + "groupName": "Node", + "matchDepNames": ["node"], + "allowedVersions": "~19.5.0 || ~20.0.0 || ~21.0.0 || ~22.0.0", + "ignoreUnstable": false, + "rangeStrategy": "widen" + }, + { + "groupName": "devDependencies", + "matchDepTypes": ["devDependencies", "peerDependencies"], + "rangeStrategy": "widen" + }, + { + "matchPackageNames": ["nikic/php-parser"], + "rangeStrategy": "widen" + }, { "groupName": "all non-major dependencies", "groupSlug": "all-minor-patch-dependencies", - "matchPackagePatterns": [ - "*" - ], "matchUpdateTypes": [ "minor", "patch" ] - }, - { - "groupName": "PHP", - "matchPackageNames": ["php"], - "allowedVersions": "^8.1", - "ignoreUnstable": false, - "rangeStrategy": "widen" } ], "vulnerabilityAlerts": { - "enabled": true + "enabled": true, + "labels": ["security"] } } diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index db55a6f..f78870c 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -39,6 +39,8 @@ jobs: extensions: "ctype, curl, dom, iconv, intl, mbstring, simplexml, tokenizer, xml, xmlwriter" ini-values: "opcache.enable=1, opcache.fast_shutdown=0, zend.assertions=1, assert.exception=On, intl.default_locale=de, intl.use_exceptions=1, zend.exception_ignore_args=0" composer-options: "--optimize-autoloader --prefer-dist --prefer-stable -v" + skip-php-install: false + skip-npm-install: true analytics: name: "Project Analysis" diff --git a/composer.json b/composer.json index 484967b..b1ae36f 100644 --- a/composer.json +++ b/composer.json @@ -41,7 +41,11 @@ "phpstan/phpstan-deprecation-rules": "^1.1.4", "phpstan/phpstan-phpunit": "^1.3.16", "phpunit/phpunit": "^10.5.20", - "rector/rector": "^1.0.4" + "rector/rector": "^1.0.4", + "symplify/phpstan-rules": "^12.4.9", + "tomasvotruba/cognitive-complexity": "^0.2.3", + "tomasvotruba/type-coverage": "^0.2.8", + "tomasvotruba/unused-public": "^0.3.9" }, "suggest": { "laminas/laminas-modulemanager": "Required for Module Integration", diff --git a/phpstan.neon b/phpstan.neon index 13512e7..ba8f02e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -97,8 +97,88 @@ parameters: missingCheckedExceptionInThrows: true tooWideThrowType: true + cognitive_complexity: + class: 28 + function: 14 + + type_coverage: + return: 100 + param: 77.7 + property: 100 + # also, how many files has declare strict types + declare: 100 + + unused_public: + methods: true + properties: true + constants: true + local_methods: true + ignoreErrors: - '~Parameter #1 \$options of static method Mimmi20\\Routing\\Router\\HostName::factory\(\) expects array{host\?: string, hosts\?: array, defaults\?: array}\|bool\|Traversable, ~' - '~is not subtype of Throwable~' - '~Call to static method PHPUnit\\Framework\\Assert::assert.*\(\) with .* will always evaluate to true~' - '~Parameter #1 \$hosts of class Mimmi20\\Routing\\Router\\HostName constructor expects array, array given~' + +rules: + # code complexity + - Symplify\PHPStanRules\Rules\Explicit\NoMixedPropertyFetcherRule + - Symplify\PHPStanRules\Rules\Explicit\NoMixedMethodCallerRule + - Symplify\PHPStanRules\Rules\Enum\RequireEnumDocBlockOnConstantListPassRule + - Symplify\PHPStanRules\Rules\NoDynamicNameRule + - Symplify\PHPStanRules\Rules\Explicit\NoRelativeFilePathRule + # - Symplify\PHPStanRules\Rules\NoReturnArrayVariableListRule # todo: fix + + - Symplify\PHPStanRules\Rules\NoProtectedClassElementRule + - Symplify\PHPStanRules\Rules\ForbiddenExtendOfNonAbstractClassRule + - Symplify\PHPStanRules\Rules\Complexity\ForbiddenSameNamedNewInstanceRule + + # domain + - Symplify\PHPStanRules\Rules\Domain\RequireExceptionNamespaceRule + - Symplify\PHPStanRules\Rules\Domain\RequireAttributeNamespaceRule + - Symplify\PHPStanRules\Rules\Enum\RequireUniqueEnumConstantRule + - Symplify\PHPStanRules\Rules\ForbiddenParamTypeRemovalRule + - Symplify\PHPStanRules\Rules\PreventParentMethodVisibilityOverrideRule + + # paths + - Symplify\PHPStanRules\Rules\NoMissingDirPathRule + - Symplify\PHPStanRules\Rules\NoAbstractMethodRule + - Symplify\PHPStanRules\Rules\NoReferenceRule # References are required + - Symplify\PHPStanRules\Rules\NoArrayAccessOnObjectRule + + - Symplify\PHPStanRules\Rules\NoNullableArrayPropertyRule + - Symplify\PHPStanRules\Rules\BoolishClassMethodPrefixRule + + # dead-code + - Symplify\PHPStanRules\Rules\NoIssetOnObjectRule + + # explicit naming + - Symplify\PHPStanRules\Rules\ForbiddenMultipleClassLikeInOneFileRule + + # comlexity + - Symplify\PHPStanRules\Rules\Complexity\ForbiddenSameNamedNewInstanceRule + - Symplify\PHPStanRules\Rules\NarrowType\NoReturnFalseInNonBoolClassMethodRule + + - Symplify\PHPStanRules\Rules\Complexity\ForbiddenArrayMethodCallRule + # - Symplify\PHPStanRules\Rules\CheckRequiredInterfaceInContractNamespaceRule + - Symplify\PHPStanRules\Rules\NoEmptyClassRule + + # naming + - Symplify\PHPStanRules\Rules\RequireAttributeNameRule + + # regexes + - Symplify\PHPStanRules\Rules\AnnotateRegexClassConstWithRegexLinkRule + - Symplify\PHPStanRules\Rules\NoInlineStringRegexRule + - Symplify\PHPStanRules\Rules\RegexSuffixInRegexConstantRule + + # naming + - Symplify\PHPStanRules\Rules\Explicit\ExplicitClassPrefixSuffixRule + - Symplify\PHPStanRules\Rules\NoReturnSetterMethodRule + - Symplify\PHPStanRules\Rules\NoVoidGetterMethodRule + - Symplify\PHPStanRules\Rules\UppercaseConstantRule + - Symplify\PHPStanRules\Rules\ClassNameRespectsParentSuffixRule + - Symplify\PHPStanRules\Rules\CheckTypehintCallerTypeRule + - Symplify\PHPStanRules\Rules\CheckClassNamespaceFollowPsr4Rule + +includes: + - vendor/symplify/phpstan-rules/config/collector-rules.neon