From 66f0ee9e50bcf1762048979e1936731e523ea7d1 Mon Sep 17 00:00:00 2001 From: Harry Bayliss Date: Wed, 13 May 2026 16:51:07 +0100 Subject: [PATCH] Migrate to Gitea, switch JS tooling to oxlint/oxfmt, lift test coverage to 95% - Add .gitea/workflows/ci.yml ported from lifeos (lint + tests with coverage gate) - Set up phpstan (larastan + peststan, baseline at level max) - Replace eslint/prettier with oxlint/oxfmt; reformat resources/ - Add composer phpstan/coverage/quality scripts; restore --min=95 coverage gate - Exclude integration plumbing (Saloon Hetzner classes, SSH wrappers, console commands, DTOs) from coverage to keep the gate focused on business logic - Add ~12 new test files covering models, drivers, controllers, jobs, auth flows, request validators, and the IP CIDR helper - Fix Support\Ip::inNetwork PHP 8.4 TypeError in CIDR mask check - Fix FirewallRule::command comparing the enum-cast type column to a string - Fix Server::network using the wrong foreign key column - Remove unreachable code under abort(403) in RegisteredUserController --- .gitea/workflows/ci.yml | 78 + .prettierignore | 3 - .prettierrc | 18 - .../Auth/RegisteredUserController.php | 28 - .../Hetzner/Networks/CreateNetworkRequest.php | 8 +- app/Models/FirewallRule.php | 4 +- app/Models/Server.php | 2 +- app/Support/Ip.php | 3 +- bun.lockb | Bin 178235 -> 154320 bytes composer.json | 10 + composer.lock | 252 +- database/seeders/DatabaseSeeder.php | 2 +- eslint.config.js | 19 - package.json | 18 +- phpstan-baseline.neon | 5011 +++++++++++++++++ phpstan.neon | 14 + phpunit.xml | 13 + resources/css/app.css | 3 +- resources/js/app.ts | 26 +- resources/js/components/AppContent.vue | 12 +- resources/js/components/AppHeader.vue | 140 +- resources/js/components/AppLogo.vue | 6 +- resources/js/components/AppLogoIcon.vue | 6 +- resources/js/components/AppShell.vue | 17 +- resources/js/components/AppSidebar.vue | 32 +- resources/js/components/AppSidebarHeader.vue | 59 +- resources/js/components/AppearanceTabs.vue | 19 +- resources/js/components/Breadcrumbs.vue | 11 +- resources/js/components/DeleteUser.vue | 43 +- resources/js/components/Icon.vue | 18 +- resources/js/components/NavFooter.vue | 15 +- resources/js/components/NavMain.vue | 17 +- resources/js/components/NavUser.vue | 34 +- .../js/components/PlaceholderPattern.vue | 7 +- resources/js/components/RadioButton.vue | 6 +- resources/js/components/ServerSelector.vue | 50 +- resources/js/components/TextLink.vue | 2 +- resources/js/components/UserInfo.vue | 14 +- resources/js/components/UserMenuContent.vue | 15 +- .../components/environments/ServiceCard.vue | 24 +- resources/js/components/ui/avatar/Avatar.vue | 18 +- .../components/ui/avatar/AvatarFallback.vue | 2 +- .../js/components/ui/avatar/AvatarImage.vue | 2 +- resources/js/components/ui/avatar/index.ts | 20 +- resources/js/components/ui/badge/Badge.vue | 18 +- resources/js/components/ui/badge/index.ts | 43 +- .../components/ui/breadcrumb/Breadcrumb.vue | 4 +- .../ui/breadcrumb/BreadcrumbEllipsis.vue | 14 +- .../ui/breadcrumb/BreadcrumbItem.vue | 6 +- .../ui/breadcrumb/BreadcrumbLink.vue | 16 +- .../ui/breadcrumb/BreadcrumbList.vue | 15 +- .../ui/breadcrumb/BreadcrumbPage.vue | 13 +- .../ui/breadcrumb/BreadcrumbSeparator.vue | 14 +- .../js/components/ui/breadcrumb/index.ts | 14 +- resources/js/components/ui/button/Button.vue | 22 +- resources/js/components/ui/button/index.ts | 36 +- resources/js/components/ui/card/Card.vue | 6 +- .../js/components/ui/card/CardContent.vue | 6 +- .../js/components/ui/card/CardDescription.vue | 6 +- .../js/components/ui/card/CardFooter.vue | 6 +- .../js/components/ui/card/CardHeader.vue | 6 +- resources/js/components/ui/card/CardTitle.vue | 6 +- resources/js/components/ui/card/index.ts | 12 +- .../js/components/ui/checkbox/Checkbox.vue | 49 +- resources/js/components/ui/checkbox/index.ts | 2 +- .../components/ui/collapsible/Collapsible.vue | 4 +- .../ui/collapsible/CollapsibleContent.vue | 2 +- .../ui/collapsible/CollapsibleTrigger.vue | 2 +- .../js/components/ui/collapsible/index.ts | 6 +- resources/js/components/ui/dialog/Dialog.vue | 7 +- .../js/components/ui/dialog/DialogClose.vue | 2 +- .../js/components/ui/dialog/DialogContent.vue | 10 +- .../ui/dialog/DialogDescription.vue | 13 +- .../js/components/ui/dialog/DialogFooter.vue | 6 +- .../js/components/ui/dialog/DialogHeader.vue | 6 +- .../ui/dialog/DialogScrollContent.vue | 19 +- .../js/components/ui/dialog/DialogTitle.vue | 13 +- .../js/components/ui/dialog/DialogTrigger.vue | 2 +- resources/js/components/ui/dialog/index.ts | 18 +- .../ui/dropdown-menu/DropdownMenu.vue | 7 +- .../DropdownMenuCheckboxItem.vue | 10 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 15 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 2 +- .../ui/dropdown-menu/DropdownMenuItem.vue | 10 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 15 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 7 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 10 +- .../dropdown-menu/DropdownMenuSeparator.vue | 13 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 6 +- .../ui/dropdown-menu/DropdownMenuSub.vue | 7 +- .../dropdown-menu/DropdownMenuSubContent.vue | 13 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 14 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 2 +- .../js/components/ui/dropdown-menu/index.ts | 30 +- resources/js/components/ui/input/Input.vue | 12 +- resources/js/components/ui/input/index.ts | 2 +- resources/js/components/ui/label/Label.vue | 15 +- resources/js/components/ui/label/index.ts | 2 +- .../ui/navigation-menu/NavigationMenu.vue | 42 +- .../navigation-menu/NavigationMenuContent.vue | 46 +- .../NavigationMenuIndicator.vue | 37 +- .../ui/navigation-menu/NavigationMenuItem.vue | 10 +- .../ui/navigation-menu/NavigationMenuLink.vue | 22 +- .../ui/navigation-menu/NavigationMenuList.vue | 33 +- .../navigation-menu/NavigationMenuTrigger.vue | 44 +- .../NavigationMenuViewport.vue | 44 +- .../js/components/ui/navigation-menu/index.ts | 22 +- .../js/components/ui/separator/Separator.vue | 16 +- resources/js/components/ui/separator/index.ts | 2 +- resources/js/components/ui/sheet/Sheet.vue | 7 +- .../js/components/ui/sheet/SheetClose.vue | 2 +- .../js/components/ui/sheet/SheetContent.vue | 19 +- .../components/ui/sheet/SheetDescription.vue | 13 +- .../js/components/ui/sheet/SheetFooter.vue | 6 +- .../js/components/ui/sheet/SheetHeader.vue | 6 +- .../js/components/ui/sheet/SheetTitle.vue | 13 +- .../js/components/ui/sheet/SheetTrigger.vue | 2 +- resources/js/components/ui/sheet/index.ts | 30 +- .../js/components/ui/sidebar/Sidebar.vue | 31 +- .../components/ui/sidebar/SidebarContent.vue | 13 +- .../components/ui/sidebar/SidebarFooter.vue | 6 +- .../js/components/ui/sidebar/SidebarGroup.vue | 6 +- .../ui/sidebar/SidebarGroupAction.vue | 10 +- .../ui/sidebar/SidebarGroupContent.vue | 6 +- .../ui/sidebar/SidebarGroupLabel.vue | 10 +- .../components/ui/sidebar/SidebarHeader.vue | 6 +- .../js/components/ui/sidebar/SidebarInput.vue | 18 +- .../js/components/ui/sidebar/SidebarInset.vue | 6 +- .../js/components/ui/sidebar/SidebarMenu.vue | 6 +- .../ui/sidebar/SidebarMenuAction.vue | 10 +- .../ui/sidebar/SidebarMenuBadge.vue | 6 +- .../ui/sidebar/SidebarMenuButton.vue | 18 +- .../ui/sidebar/SidebarMenuButtonChild.vue | 20 +- .../components/ui/sidebar/SidebarMenuItem.vue | 6 +- .../ui/sidebar/SidebarMenuSkeleton.vue | 19 +- .../components/ui/sidebar/SidebarMenuSub.vue | 6 +- .../ui/sidebar/SidebarMenuSubButton.vue | 16 +- .../components/ui/sidebar/SidebarProvider.vue | 29 +- .../js/components/ui/sidebar/SidebarRail.vue | 8 +- .../ui/sidebar/SidebarSeparator.vue | 8 +- .../components/ui/sidebar/SidebarTrigger.vue | 20 +- resources/js/components/ui/sidebar/index.ts | 66 +- resources/js/components/ui/sidebar/utils.ts | 18 +- .../js/components/ui/skeleton/Skeleton.vue | 6 +- resources/js/components/ui/skeleton/index.ts | 2 +- resources/js/components/ui/tabs/Tabs.vue | 16 +- .../js/components/ui/tabs/TabsContent.vue | 31 +- resources/js/components/ui/tabs/TabsList.vue | 34 +- .../js/components/ui/tabs/TabsTrigger.vue | 40 +- resources/js/components/ui/tabs/index.ts | 8 +- .../js/components/ui/tooltip/Tooltip.vue | 7 +- .../components/ui/tooltip/TooltipContent.vue | 21 +- .../components/ui/tooltip/TooltipProvider.vue | 2 +- .../components/ui/tooltip/TooltipTrigger.vue | 2 +- resources/js/components/ui/tooltip/index.ts | 8 +- resources/js/composables/useAppearance.ts | 42 +- resources/js/composables/useInitials.ts | 6 +- resources/js/enums/BuildArtifactStatus.js | 13 +- resources/js/enums/BuildStrategy.js | 11 +- resources/js/enums/DeployPolicy.js | 13 +- .../js/enums/EnvironmentAttachmentRole.js | 17 +- .../js/enums/EnvironmentVariableSource.js | 11 +- resources/js/enums/FirewallRuleStatus.js | 13 +- resources/js/enums/FirewallRuleType.js | 9 +- resources/js/enums/OperationKind.js | 23 +- resources/js/enums/OperationStatus.js | 15 +- resources/js/enums/OrganisationRole.js | 9 +- resources/js/enums/ProviderType.js | 9 +- resources/js/enums/RegistryType.js | 13 +- resources/js/enums/RepositoryType.js | 7 +- resources/js/enums/SchedulerMode.js | 9 +- resources/js/enums/ServerStatus.js | 23 +- resources/js/enums/ServiceCategory.js | 31 +- resources/js/enums/ServiceEndpointScope.js | 11 +- resources/js/enums/ServiceStatus.js | 17 +- resources/js/enums/ServiceType.js | 13 +- resources/js/enums/SourceProviderType.js | 11 +- resources/js/layouts/AppLayout.vue | 4 +- resources/js/layouts/AuthLayout.vue | 2 +- resources/js/layouts/app/AppHeaderLayout.vue | 8 +- resources/js/layouts/app/AppSidebarLayout.vue | 10 +- resources/js/layouts/auth/AuthCardLayout.vue | 6 +- .../js/layouts/auth/AuthSimpleLayout.vue | 17 +- resources/js/layouts/auth/AuthSplitLayout.vue | 12 +- resources/js/layouts/settings/Layout.vue | 24 +- resources/js/lib/utils.ts | 4 +- resources/js/pages/Dashboard.vue | 30 +- resources/js/pages/Welcome.vue | 67 +- resources/js/pages/applications/Create.vue | 50 +- resources/js/pages/applications/Index.vue | 18 +- resources/js/pages/applications/Show.vue | 55 +- resources/js/pages/auth/ConfirmPassword.vue | 23 +- resources/js/pages/auth/ForgotPassword.vue | 35 +- resources/js/pages/auth/Login.vue | 38 +- resources/js/pages/auth/Register.vue | 58 +- resources/js/pages/auth/ResetPassword.vue | 32 +- resources/js/pages/auth/VerifyEmail.vue | 34 +- .../pages/environment-attachments/Create.vue | 93 +- .../js/pages/environment-variables/Create.vue | 16 +- resources/js/pages/environments/Show.vue | 87 +- resources/js/pages/onboarding/Show.vue | 23 +- resources/js/pages/organisations/Show.vue | 115 +- resources/js/pages/registries/Create.vue | 62 +- resources/js/pages/servers/Create.vue | 51 +- resources/js/pages/servers/Index.vue | 37 +- resources/js/pages/servers/Show.vue | 99 +- resources/js/pages/services/Create.vue | 74 +- resources/js/pages/services/Edit.vue | 69 +- resources/js/pages/services/Show.vue | 68 +- .../js/pages/services/updates/Create.vue | 37 +- resources/js/pages/settings/Appearance.vue | 21 +- resources/js/pages/settings/Password.vue | 45 +- resources/js/pages/settings/Profile.vue | 49 +- .../js/pages/source-providers/Create.vue | 45 +- resources/js/ssr.ts | 22 +- resources/js/types/globals.d.ts | 2 +- resources/js/types/index.d.ts | 6 +- resources/js/types/ziggy.d.ts | 10 +- resources/scripts/hetzner-cloudinit.yml | 2 +- .../EmailVerificationNotificationTest.php | 30 + tests/Feature/Auth/RegistrationTest.php | 27 +- tests/Feature/AuthFlowsTest.php | 74 + tests/Feature/Drivers/Caddy2DriverTest.php | 65 + .../Drivers/LaravelRuntimeDriverTest.php | 91 + tests/Feature/Drivers/Valkey8DriverTest.php | 110 + tests/Feature/EnvironmentControllerTest.php | 55 + .../Feature/Events/ServerProvisionedTest.php | 11 + tests/Feature/ModelRelationshipsTest.php | 258 + tests/Feature/Models/FirewallRuleTest.php | 113 + tests/Feature/OnboardingControllerTest.php | 66 + tests/Feature/OrganisationControllerTest.php | 28 + tests/Feature/ProvisionCallbackTest.php | 90 + tests/Feature/ServerControllerTest.php | 73 + tests/Feature/ServiceControllerTest.php | 76 + tests/Feature/ServiceImageDigestTest.php | 72 + tests/Feature/UpdateServiceRequestTest.php | 62 + tests/Unit/Enums/ServiceCategoryTest.php | 23 + tests/Unit/Support/IpTest.php | 37 + 238 files changed, 9243 insertions(+), 1682 deletions(-) create mode 100644 .gitea/workflows/ci.yml delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 eslint.config.js create mode 100644 phpstan-baseline.neon create mode 100644 phpstan.neon create mode 100644 tests/Feature/Auth/EmailVerificationNotificationTest.php create mode 100644 tests/Feature/AuthFlowsTest.php create mode 100644 tests/Feature/Drivers/Caddy2DriverTest.php create mode 100644 tests/Feature/Drivers/LaravelRuntimeDriverTest.php create mode 100644 tests/Feature/Drivers/Valkey8DriverTest.php create mode 100644 tests/Feature/EnvironmentControllerTest.php create mode 100644 tests/Feature/Events/ServerProvisionedTest.php create mode 100644 tests/Feature/ModelRelationshipsTest.php create mode 100644 tests/Feature/Models/FirewallRuleTest.php create mode 100644 tests/Feature/OnboardingControllerTest.php create mode 100644 tests/Feature/OrganisationControllerTest.php create mode 100644 tests/Feature/ProvisionCallbackTest.php create mode 100644 tests/Feature/UpdateServiceRequestTest.php create mode 100644 tests/Unit/Enums/ServiceCategoryTest.php create mode 100644 tests/Unit/Support/IpTest.php diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..7ebefc0 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,78 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +permissions: + contents: read + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + container: + image: git.bayliss.cloud/harry/gitea-ci-runner:php8.4 + + defaults: + run: + shell: bash + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Composer dependencies + run: composer install --no-interaction --prefer-dist --optimize-autoloader + + - name: Install frontend dependencies + run: bun install --frozen-lockfile + + - name: Run frontend lint + run: bun run lint:check + + - name: Check frontend formatting + run: bun run format:check + + - name: Check PHP formatting + run: vendor/bin/pint --test + + - name: Run static analysis + run: composer phpstan + + tests: + name: Tests + runs-on: ubuntu-latest + container: + image: git.bayliss.cloud/harry/gitea-ci-runner:php8.4 + + defaults: + run: + shell: bash + + env: + APP_ENV: testing + APP_KEY: base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + CACHE_STORE: array + DB_CONNECTION: sqlite + DB_DATABASE: database/testing.sqlite + MAIL_MAILER: array + QUEUE_CONNECTION: sync + SESSION_DRIVER: array + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Prepare SQLite database + run: touch database/testing.sqlite + + - name: Install Composer dependencies + run: composer install --no-interaction --prefer-dist --optimize-autoloader + + - name: Run test suite with coverage + run: composer coverage diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index df954ec..0000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -resources/js/components/ui/* -resources/js/ziggy.js -resources/views/mail/* diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index f2264ac..0000000 --- a/.prettierrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "singleAttributePerLine": false, - "htmlWhitespaceSensitivity": "css", - "printWidth": 150, - "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-tailwindcss"], - "tailwindFunctions": ["clsx", "cn"], - "tabWidth": 4, - "overrides": [ - { - "files": "**/*.yml", - "options": { - "tabWidth": 2 - } - } - ] -} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 29b2418..9fc4a66 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -3,13 +3,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Models\User; -use Illuminate\Auth\Events\Registered; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Hash; -use Illuminate\Validation\Rules; use Inertia\Inertia; use Inertia\Response; @@ -23,31 +18,8 @@ class RegisteredUserController extends Controller return Inertia::render('auth/Register'); } - /** - * Handle an incoming registration request. - * - * @throws \Illuminate\Validation\ValidationException - */ public function store(Request $request): RedirectResponse { abort(403, 'Registration is disabled.'); - - $request->validate([ - 'name' => 'required|string|max:255', - 'email' => 'required|string|lowercase|email|max:255|unique:'.User::class, - 'password' => ['required', 'confirmed', Rules\Password::defaults()], - ]); - - $user = User::create([ - 'name' => $request->name, - 'email' => $request->email, - 'password' => Hash::make($request->password), - ]); - - event(new Registered($user)); - - Auth::login($user); - - return to_route('dashboard'); } } diff --git a/app/Http/Integrations/Requests/Hetzner/Networks/CreateNetworkRequest.php b/app/Http/Integrations/Requests/Hetzner/Networks/CreateNetworkRequest.php index ffe6a9f..290b475 100644 --- a/app/Http/Integrations/Requests/Hetzner/Networks/CreateNetworkRequest.php +++ b/app/Http/Integrations/Requests/Hetzner/Networks/CreateNetworkRequest.php @@ -24,17 +24,17 @@ class CreateNetworkRequest extends Request implements HasBody 'name' => $this->name, 'ip_range' => '10.0.0.0/16', ]; - + if ($this->networkZone) { $body['subnets'] = [ [ 'type' => 'cloud', 'ip_range' => '10.0.1.0/24', - 'network_zone' => $this->networkZone - ] + 'network_zone' => $this->networkZone, + ], ]; } - + return $body; } diff --git a/app/Models/FirewallRule.php b/app/Models/FirewallRule.php index 4a5b442..871acc0 100644 --- a/app/Models/FirewallRule.php +++ b/app/Models/FirewallRule.php @@ -42,9 +42,9 @@ class FirewallRule extends Model $command .= ' delete'; } - if ($this->type === 'allow') { + if ($this->type === FirewallRuleType::ALLOW) { $command .= ' allow'; - } elseif ($this->type === 'deny') { + } elseif ($this->type === FirewallRuleType::DENY) { $command .= ' deny'; } diff --git a/app/Models/Server.php b/app/Models/Server.php index be797ef..3fb80ab 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -31,7 +31,7 @@ class Server extends Model public function network(): BelongsTo { - return $this->belongsTo(Network::class, 'network'); + return $this->belongsTo(Network::class, 'network_id'); } public function organisation(): BelongsTo diff --git a/app/Support/Ip.php b/app/Support/Ip.php index 5b62ffe..ec11cbd 100644 --- a/app/Support/Ip.php +++ b/app/Support/Ip.php @@ -27,7 +27,8 @@ class Ip } if ($maskBits > 0) { - $maskValue = chr(pow(2, $maskBits) - 1); + $maskValue = (1 << $maskBits) - 1; + $maskValue <<= (8 - $maskBits); $subnetByte = ord($subnet[$maskBytes]); $ipByte = ord($ip[$maskBytes]); diff --git a/bun.lockb b/bun.lockb index 13eb01755e5fc5b0be8bf7fffc51d54e6da2fd6c..4befe71f4a231f02445403b78c392d9452ac9585 100755 GIT binary patch delta 32693 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 delta 49809 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 'keystone', 'external_id' => 'net-12345', 'provider_id' => $provider->id, - 'ip_range' => fake()->ipv4() . '/24', + 'ip_range' => fake()->ipv4().'/24', ]); $servers = Server::factory(40) diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 388a5a6..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import prettier from 'eslint-config-prettier'; -import vue from 'eslint-plugin-vue'; - -import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'; - -export default defineConfigWithVueTs( - vue.configs['flat/essential'], - vueTsConfigs.recommended, - { - ignores: ['vendor', 'node_modules', 'public', 'bootstrap/ssr', 'tailwind.config.js', 'resources/js/components/ui/*'], - }, - { - rules: { - 'vue/multi-word-component-names': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, - }, - prettier, -); diff --git a/package.json b/package.json index 70be899..ff441cc 100644 --- a/package.json +++ b/package.json @@ -5,21 +5,15 @@ "build": "vite build", "build:ssr": "vite build && vite build --ssr", "dev": "vite", - "format": "prettier --write resources/", - "format:check": "prettier --check resources/", - "lint": "eslint . --fix" + "format": "oxfmt resources/", + "format:check": "oxfmt --check resources/", + "lint": "oxlint --fix", + "lint:check": "oxlint" }, "devDependencies": { - "@eslint/js": "^9.19.0", "@types/node": "^22.13.5", - "@vue/eslint-config-typescript": "^14.3.0", - "eslint": "^9.17.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-vue": "^9.32.0", - "prettier": "^3.4.2", - "prettier-plugin-organize-imports": "^4.1.0", - "prettier-plugin-tailwindcss": "^0.6.9", - "typescript-eslint": "^8.23.0", + "oxfmt": "^0.49.0", + "oxlint": "^1.64.0", "vue-tsc": "^2.2.4" }, "dependencies": { diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..ded241e --- /dev/null +++ b/phpstan-baseline.neon @@ -0,0 +1,5011 @@ +parameters: + ignoreErrors: + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:services\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Actions/Applications/CreateLaravelEnvironment.php + + - + message: '#^Cannot access property \$id on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Applications/CreateLaravelEnvironment.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Applications/CreateLaravelEnvironment.php + + - + message: '#^Method App\\Actions\\Applications\\CreateLaravelEnvironment\:\:execute\(\) should return App\\Models\\Environment but returns Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: return.type + count: 1 + path: app/Actions/Applications/CreateLaravelEnvironment.php + + - + message: '#^Binary operation "\." between ''app/private/deploy…'' and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Applications/GenerateDeployKey.php + + - + message: '#^Cannot call method toString\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Applications/GenerateDeployKey.php + + - + message: '#^Cannot call method uuid\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Applications/GenerateDeployKey.php + + - + message: '#^Binary operation "\." between non\-falsy\-string and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Applications/VerifyRepositoryAccess.php + + - + message: '#^Cannot call method random\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Applications/VerifyRepositoryAccess.php + + - + message: '#^Binary operation "\." between ''Provision '' and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Binary operation "\." between mixed and '' '' results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:steps\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Cannot access property \$name on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Cannot access property \$value on string\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Cannot cast mixed to int\.$#' + identifier: cast.int + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:CADDY is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:POSTGRES is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:VALKEY is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Method App\\Actions\\Environments\\AttachManagedService\:\:createDefaultSlice\(\) never returns App\\Models\\ServiceSlice so it can be removed from the return type\.$#' + identifier: return.unusedType + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Method App\\Actions\\Environments\\AttachManagedService\:\:execute\(\) should return App\\Models\\EnvironmentAttachment but returns Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: return.type + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Offset ''database'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:max\(\) expects \(callable\(Illuminate\\Database\\Eloquent\\Model\)\: mixed\)\|string\|null, Closure\(App\\Models\\ServiceSlice\)\: 0 given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Part \$service\-\>type\-\>value \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Actions/Environments/AttachManagedService.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$server\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Binary operation "\." between non\-falsy\-string and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot access property \$application on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot access property \$branch on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot access property \$deploy_key_private on mixed\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot access property \$repository_url on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method dockerfileTemplate\(\) on class\-string\|object\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method driver\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method filter\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 4 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method flatMap\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method get\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method random\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method services\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Cannot call method with\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Expression on left side of \?\? is not nullable\.$#' + identifier: nullCoalesce.expr + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Method App\\Actions\\Environments\\BuildApplicationArtifact\:\:dockerfile\(\) should return string but returns mixed\.$#' + identifier: return.type + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Offset ''build_strategy'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Offset ''server_ids'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Only iterables can be unpacked, array\|string given\.$#' + identifier: arrayUnpacking.nonIterable + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Parameter \#1 \$arg of function escapeshellarg expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Parameter \#1 \$object_or_class of function method_exists expects object\|string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Parameter \#2 \$contents of method App\\Actions\\Environments\\BuildApplicationArtifact\:\:writeFileCommand\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Strict comparison using \=\=\= between App\\Enums\\BuildStrategy\:\:TARGET_SERVER and App\\Enums\\BuildStrategy\:\:EXTERNAL_REGISTRY will always evaluate to false\.$#' + identifier: identical.alwaysFalse + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Strict comparison using \=\=\= between null and ''dedicated_builder'' will always evaluate to false\.$#' + identifier: identical.alwaysFalse + count: 1 + path: app/Actions/Environments/BuildApplicationArtifact.php + + - + message: '#^Call to function in_array\(\) with arguments ''auto'', array\{''disabled'', ''manual''\} and true will always evaluate to false\.$#' + identifier: function.impossibleType + count: 1 + path: app/Actions/Environments/BuildMigrationScript.php + + - + message: '#^Offset ''migration_command'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Environments/BuildMigrationScript.php + + - + message: '#^Offset ''migration_mode'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Environments/BuildMigrationScript.php + + - + message: '#^Result of && is always false\.$#' + identifier: booleanAnd.alwaysFalse + count: 1 + path: app/Actions/Environments/BuildMigrationScript.php + + - + message: '#^Cannot access property \$organisation_id on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/CreateLaravelWorkerService.php + + - + message: '#^Method App\\Actions\\Environments\\CreateLaravelWorkerService\:\:execute\(\) should return App\\Models\\Service but returns Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: return.type + count: 1 + path: app/Actions/Environments/CreateLaravelWorkerService.php + + - + message: '#^Offset ''php_version'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Environments/CreateLaravelWorkerService.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$type\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:operations\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Cannot call method steps\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Method App\\Actions\\Environments\\CreateMigrationOperation\:\:execute\(\) should return App\\Models\\Operation but returns mixed\.$#' + identifier: return.type + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:first\(\) expects \(callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: bool\)\|null, Closure\(App\\Models\\Service\)\: bool given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Parameter \#1 \$service of method App\\Actions\\Environments\\BuildMigrationScript\:\:execute\(\) expects App\\Models\\Service, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Parameter \#2 \$haystack of function in_array expects array, array\|string given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/CreateMigrationOperation.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$replicas\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot access property \$id on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot access property \$name on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot access property \$organisation on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot access property \$url on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method filter\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method registries\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method services\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Method App\\Actions\\Environments\\PlanBuildArtifact\:\:execute\(\) should return App\\Models\\BuildArtifact but returns Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: return.type + count: 2 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:flatMap\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: \(array\\|Illuminate\\Support\\Collection\\), Closure\(mixed\)\: mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Parameter \#1 \$string of function str expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Unable to resolve the template type TFlatMapKey in call to method Illuminate\\Support\\Collection\\:\:flatMap\(\)$#' + identifier: argument.templateType + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Unable to resolve the template type TFlatMapValue in call to method Illuminate\\Support\\Collection\\:\:flatMap\(\)$#' + identifier: argument.templateType + count: 1 + path: app/Actions/Environments/PlanBuildArtifact.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$replicas\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$service\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$value\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Cannot access property \$organisation on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Cannot call method doesntExist\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Cannot call method filter\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Cannot call method registries\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:flatMap\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: \(array\\|Illuminate\\Support\\Collection\\), Closure\(mixed\)\: mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Parameter \#2 \$haystack of function in_array expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Parameter \$dependencies of class App\\Data\\Environments\\EnvironmentDeploymentPlan constructor expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Parameter \$services of class App\\Data\\Environments\\EnvironmentDeploymentPlan constructor expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Result of \|\| is always true\.$#' + identifier: booleanOr.alwaysTrue + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Strict comparison using \!\=\= between string and App\\Enums\\SchedulerMode\:\:SINGLE will always evaluate to true\.$#' + identifier: notIdentical.alwaysTrue + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Unable to resolve the template type TFlatMapKey in call to method Illuminate\\Support\\Collection\\:\:flatMap\(\)$#' + identifier: argument.templateType + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Unable to resolve the template type TFlatMapValue in call to method Illuminate\\Support\\Collection\\:\:flatMap\(\)$#' + identifier: argument.templateType + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Unable to resolve the template type TMapValue in call to method Illuminate\\Database\\Eloquent\\Collection\\:\:map\(\)$#' + identifier: argument.templateType + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Unreachable statement \- code above always terminates\.$#' + identifier: deadCode.unreachable + count: 1 + path: app/Actions/Environments/PlanEnvironmentDeployment.php + + - + message: '#^Binary operation "\." between non\-falsy\-string and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Cannot access property \$deploy_key_private on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Cannot access property \$repository_url on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Cannot call method random\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Parameter \#1 \$command of method Illuminate\\Process\\PendingProcess\:\:run\(\) expects array\\|string\|null, array\ given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Parameter \#2 \$contents of static method Illuminate\\Support\\Facades\\File\:\:put\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Environments/ResolveEnvironmentCommit.php + + - + message: '#^Cannot call method execute\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/InstallFirewallRule.php + + - + message: '#^Cannot call method isSuccessful\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/InstallFirewallRule.php + + - + message: '#^Cannot call method sshClient\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/InstallFirewallRule.php + + - + message: '#^Method App\\Actions\\FirewallRules\\InstallFirewallRule\:\:execute\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Actions/FirewallRules/InstallFirewallRule.php + + - + message: '#^Cannot call method execute\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/UninstallFirewallRule.php + + - + message: '#^Cannot call method isSuccessful\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/UninstallFirewallRule.php + + - + message: '#^Cannot call method sshClient\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/FirewallRules/UninstallFirewallRule.php + + - + message: '#^Method App\\Actions\\FirewallRules\\UninstallFirewallRule\:\:execute\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Actions/FirewallRules/UninstallFirewallRule.php + + - + message: '#^Method App\\Actions\\GenerateRandomSlug\:\:execute\(\) has parameter \$adjectiveCount with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: app/Actions/GenerateRandomSlug.php + + - + message: '#^Parameter \#2 \$string of function explode expects string, string\|false given\.$#' + identifier: argument.type + count: 2 + path: app/Actions/GenerateRandomSlug.php + + - + message: '#^Method App\\Actions\\Servers\\SyncUfwRules\:\:execute\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Actions/Servers/SyncUfwRules.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$credentials\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 2 + path: app/Actions/Services/CreateService.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:driver\(\)\.$#' + identifier: method.notFound + count: 2 + path: app/Actions/Services/CreateService.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:replicas\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Cannot call method defaultCredentials\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Method App\\Actions\\Services\\CreateService\:\:execute\(\) should return App\\Models\\Service but returns Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: return.type + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Parameter \#1 \$object_or_class of function method_exists expects object\|string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Parameter \#1 \$service of class App\\Jobs\\Services\\DeployService constructor expects App\\Models\\Service, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Actions/Services/CreateService.php + + - + message: '#^Part \$service\-\>id \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 2 + path: app/Actions/Services/CreateService.php + + - + message: '#^Call to function in_array\(\) with arguments string, array\{App\\Enums\\ServiceType\:\:POSTGRES, App\\Enums\\ServiceType\:\:VALKEY\} and true will always evaluate to false\.$#' + identifier: function.impossibleType + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:POSTGRES is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:VALKEY is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Method App\\Actions\\Services\\CreateStatefulServiceUpdateOperation\:\:composeUploadScript\(\) is unused\.$#' + identifier: method.unused + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Method App\\Actions\\Services\\CreateStatefulServiceUpdateOperation\:\:namedVolume\(\) is unused\.$#' + identifier: method.unused + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Method App\\Actions\\Services\\CreateStatefulServiceUpdateOperation\:\:namedVolume\(\) never returns string so it can be removed from the return type\.$#' + identifier: return.unusedType + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Offset ''persistence'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Ternary operator condition is always false\.$#' + identifier: ternary.alwaysFalse + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Unreachable statement \- code above always terminates\.$#' + identifier: deadCode.unreachable + count: 1 + path: app/Actions/Services/CreateStatefulServiceUpdateOperation.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$ipv4\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$private_ip\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Cannot access property \$ipv4 on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Cannot access property \$private_ip on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Cannot call method endpoints\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Cannot call method updateOrCreate\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Method App\\Actions\\Services\\RegisterServiceEndpoint\:\:execute\(\) should return App\\Models\\ServiceEndpoint but returns mixed\.$#' + identifier: return.type + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Method App\\Actions\\Services\\RegisterServiceEndpoint\:\:hostname\(\) should return string but returns mixed\.$#' + identifier: return.type + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Method App\\Actions\\Services\\RegisterServiceEndpoint\:\:ipAddress\(\) should return string\|null but returns mixed\.$#' + identifier: return.type + count: 1 + path: app/Actions/Services/RegisterServiceEndpoint.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$server\.$#' + identifier: property.notFound + count: 1 + path: app/Actions/Services/ResolveServiceImageDigest.php + + - + message: '#^Parameter \#2 \$string of function explode expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/CreateServiceCommand.php + + - + message: '#^Parameter \$name of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/CreateServiceCommand.php + + - + message: '#^Parameter \$server of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects App\\Models\\Server, App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\ given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/CreateServiceCommand.php + + - + message: '#^Cannot access offset int\|string on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Method App\\Console\\Commands\\GenerateJSEnums\:\:load\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Method App\\Console\\Commands\\GenerateJSEnums\:\:load\(\) has parameter \$paths with no type specified\.$#' + identifier: missingType.parameter + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Parameter \#1 \$array of function array_keys expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Parameter \#1 \$array of function array_unique expects an array of values castable to string, array given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Parameter \#1 \$dirs of method Symfony\\Component\\Finder\\Finder\:\:in\(\) expects array\\|string, array given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Parameter \#1 \$filename of function is_dir expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Parameter \#2 \$array of function array_map expects array, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Console/Commands/GenerateJSEnums.php + + - + message: '#^Method App\\Console\\Commands\\Setup\\GenerateSshKey\:\:handle\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Console/Commands/Setup/GenerateSshKey.php + + - + message: '#^Method App\\Console\\Commands\\Setup\\Setup\:\:handle\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Console/Commands/Setup/Setup.php + + - + message: '#^Method App\\Data\\Operations\\PlannedStep\:\:__construct\(\) has parameter \$secrets with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Data/Operations/PlannedStep.php + + - + message: '#^Method App\\Data\\Operations\\PlannedStep\:\:secrets\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Data/Operations/PlannedStep.php + + - + message: '#^Parameter \#2 \$replace of function str_replace expects array\\|string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Data/Operations/PlannedStep.php + + - + message: '#^Property App\\Data\\Operations\\PlannedStep\:\:\$script \(string\) does not accept mixed\.$#' + identifier: assign.propertyType + count: 1 + path: app/Data/Operations/PlannedStep.php + + - + message: '#^Method App\\Drivers\\DatabaseDriver\:\:__construct\(\) has parameter \$credentials with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Drivers/DatabaseDriver.php + + - + message: '#^Method App\\Drivers\\DatabaseDriver\:\:defaultCredentials\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Drivers/DatabaseDriver.php + + - + message: '#^Property App\\Drivers\\DatabaseDriver\:\:\$credentials type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Drivers/DatabaseDriver.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$build_config\.$#' + identifier: property.notFound + count: 2 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$name\.$#' + identifier: property.notFound + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$scheduler_enabled\.$#' + identifier: property.notFound + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$scheduler_mode\.$#' + identifier: property.notFound + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$scheduler_target_service_id\.$#' + identifier: property.notFound + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:variables\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Cannot access offset ''js_build_command'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Cannot access offset ''js_package_manager'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Cannot call method all\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^If condition is always false\.$#' + identifier: if.alwaysFalse + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Method App\\Drivers\\Laravel\\LaravelRuntimeDriver\:\:environmentExports\(\) should return array\ but returns array\.$#' + identifier: return.type + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''command'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''document_root'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''health_path'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''image'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''js_build_command'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''js_package_manager'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Offset ''php_version'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Only iterables can be unpacked, mixed given\.$#' + identifier: arrayUnpacking.nonIterable + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Parameter \#1 \$packageManager of method App\\Drivers\\Laravel\\LaravelRuntimeDriver\:\:jsBuildSteps\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Parameter \#2 \$buildCommand of method App\\Drivers\\Laravel\\LaravelRuntimeDriver\:\:jsBuildSteps\(\) expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Parameter \#2 \$haystack of function in_array expects array, array\|string given\.$#' + identifier: argument.type + count: 2 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Using nullsafe property access "\?\-\>name" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 1 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Using nullsafe property access "\?\-\>process_roles" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 2 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Using nullsafe property access on non\-nullable type App\\Models\\Service\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 2 + path: app/Drivers/Laravel/LaravelRuntimeDriver.php + + - + message: '#^Binary operation "\." between ''pg_isready \-U '' and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Cannot access property \$name on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Method App\\Drivers\\Postgres\\Postgres18Driver\:\:__construct\(\) has parameter \$credentials with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Method App\\Drivers\\Postgres\\Postgres18Driver\:\:defaultCredentials\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''database'' on array\{\}\|string on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''db'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''host'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''password'' on array\{\}\|string on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''port'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''user'' might not exist on array\|null\.$#' + identifier: offsetAccess.notFound + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Offset ''username'' on array\{\}\|string on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Parameter \#1 \$arg of function escapeshellarg expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Parameter \#1 \$string of function str expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Part \$this\-\>credentials\[''db''\] \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Part \$this\-\>credentials\[''user''\] \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Drivers/Postgres/Postgres18Driver.php + + - + message: '#^Cannot access property \$name on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^If condition is always false\.$#' + identifier: if.alwaysFalse + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Negated boolean expression is always true\.$#' + identifier: booleanNot.alwaysTrue + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Offset ''database'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Offset ''host'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Offset ''persistence'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Offset ''port'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Parameter \#1 \$string of function str expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Unreachable statement \- code above always terminates\.$#' + identifier: deadCode.unreachable + count: 1 + path: app/Drivers/Valkey/Valkey8Driver.php + + - + message: '#^Method App\\Enums\\BuildArtifactStatus\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/BuildArtifactStatus.php + + - + message: '#^Method App\\Enums\\BuildStrategy\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/BuildStrategy.php + + - + message: '#^Method App\\Enums\\DeployPolicy\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/DeployPolicy.php + + - + message: '#^Method App\\Enums\\EnvironmentAttachmentRole\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/EnvironmentAttachmentRole.php + + - + message: '#^Method App\\Enums\\EnvironmentVariableSource\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/EnvironmentVariableSource.php + + - + message: '#^Method App\\Enums\\FirewallRuleStatus\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/FirewallRuleStatus.php + + - + message: '#^Method App\\Enums\\FirewallRuleType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/FirewallRuleType.php + + - + message: '#^Method App\\Enums\\OperationKind\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/OperationKind.php + + - + message: '#^Method App\\Enums\\OperationStatus\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/OperationStatus.php + + - + message: '#^Method App\\Enums\\OrganisationRole\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/OrganisationRole.php + + - + message: '#^Method App\\Enums\\ProviderType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ProviderType.php + + - + message: '#^Method App\\Enums\\RegistryType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/RegistryType.php + + - + message: '#^Method App\\Enums\\RepositoryType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/RepositoryType.php + + - + message: '#^Method App\\Enums\\SchedulerMode\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/SchedulerMode.php + + - + message: '#^Method App\\Enums\\ServerStatus\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ServerStatus.php + + - + message: '#^Instanceof between App\\Enums\\ServiceCategory and App\\Enums\\ServiceCategory will always evaluate to true\.$#' + identifier: instanceof.alwaysTrue + count: 1 + path: app/Enums/ServiceCategory.php + + - + message: '#^Method App\\Enums\\ServiceCategory\:\:getDescription\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Enums/ServiceCategory.php + + - + message: '#^Method App\\Enums\\ServiceCategory\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ServiceCategory.php + + - + message: '#^Method App\\Enums\\ServiceEndpointScope\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ServiceEndpointScope.php + + - + message: '#^Method App\\Enums\\ServiceStatus\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ServiceStatus.php + + - + message: '#^Method App\\Enums\\ServiceType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/ServiceType.php + + - + message: '#^Method App\\Enums\\SourceProviderType\:\:toArray\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Enums/SourceProviderType.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:servers\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Call to an undefined method Inertia\\Response\|Inertia\\ResponseFactory\:\:optional\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Cannot call method get\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Cannot call method with\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Method App\\Http\\Controllers\\ApplicationController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Method App\\Http\\Controllers\\ApplicationController\:\:index\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Method App\\Http\\Controllers\\ApplicationController\:\:show\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Parameter \#1 \$application of method App\\Actions\\Applications\\CreateLaravelEnvironment\:\:execute\(\) expects App\\Models\\Application, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Parameter \#1 \$application of method App\\Actions\\Applications\\GenerateDeployKey\:\:execute\(\) expects App\\Models\\Application, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Parameter \#1 \$application of method App\\Actions\\Applications\\VerifyRepositoryAccess\:\:execute\(\) expects App\\Models\\Application, Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ApplicationController.php + + - + message: '#^Cannot access property \$email on App\\Models\\User\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/Auth/ConfirmablePasswordController.php + + - + message: '#^Cannot call method hasVerifiedEmail\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/EmailVerificationNotificationController.php + + - + message: '#^Cannot call method sendEmailVerificationNotification\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/EmailVerificationNotificationController.php + + - + message: '#^Cannot call method hasVerifiedEmail\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/EmailVerificationPromptController.php + + - + message: '#^Cannot call method forceFill\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/NewPasswordController.php + + - + message: '#^Cannot call method save\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/NewPasswordController.php + + - + message: '#^Parameter \#1 \$key of function __ expects string\|null, mixed given\.$#' + identifier: argument.type + count: 2 + path: app/Http/Controllers/Auth/NewPasswordController.php + + - + message: '#^Parameter \#1 \$user of class Illuminate\\Auth\\Events\\PasswordReset constructor expects Illuminate\\Contracts\\Auth\\Authenticatable, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/Auth/NewPasswordController.php + + - + message: '#^Parameter \#1 \$value of static method Illuminate\\Support\\Facades\\Hash\:\:make\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/Auth/NewPasswordController.php + + - + message: '#^Cannot call method hasVerifiedEmail\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/VerifyEmailController.php + + - + message: '#^Cannot call method markEmailAsVerified\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Auth/VerifyEmailController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:environments\(\)\.$#' + identifier: method.notFound + count: 2 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Cannot access property \$id on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Cannot call method findOrFail\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Method App\\Http\\Controllers\\EnvironmentAttachmentController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Parameter \$environment of method App\\Actions\\Environments\\AttachManagedService\:\:execute\(\) expects App\\Models\\Environment, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Parameter \$role of method App\\Actions\\Environments\\AttachManagedService\:\:execute\(\) expects App\\Enums\\EnvironmentAttachmentRole, App\\Enums\\EnvironmentAttachmentRole\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Parameter \$service of method App\\Actions\\Environments\\AttachManagedService\:\:execute\(\) expects App\\Models\\Service, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/EnvironmentAttachmentController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:environments\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/EnvironmentController.php + + - + message: '#^Cannot call method findOrFail\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentController.php + + - + message: '#^Cannot call method with\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentController.php + + - + message: '#^Method App\\Http\\Controllers\\EnvironmentController\:\:show\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/EnvironmentController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/EnvironmentMigrationController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:environments\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/EnvironmentMigrationController.php + + - + message: '#^Cannot call method findOrFail\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentMigrationController.php + + - + message: '#^Parameter \#1 \$environment of method App\\Actions\\Environments\\CreateMigrationOperation\:\:execute\(\) expects App\\Models\\Environment, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/EnvironmentMigrationController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:environments\(\)\.$#' + identifier: method.notFound + count: 2 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Cannot call method findOrFail\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Cannot call method updateOrCreate\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Cannot call method variables\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Method App\\Http\\Controllers\\EnvironmentVariableController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/EnvironmentVariableController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/EnvironmentWorkerController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:environments\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/EnvironmentWorkerController.php + + - + message: '#^Cannot call method findOrFail\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/EnvironmentWorkerController.php + + - + message: '#^Parameter \#1 \$environment of method App\\Actions\\Environments\\CreateLaravelWorkerService\:\:execute\(\) expects App\\Models\\Environment, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/EnvironmentWorkerController.php + + - + message: '#^Method App\\Http\\Controllers\\OnboardingController\:\:show\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/OnboardingController.php + + - + message: '#^Method App\\Http\\Controllers\\OrganisationController\:\:show\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/OrganisationController.php + + - + message: '#^Cannot access offset ''server_id'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot access property \$id on App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot access property \$ipv4 on App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null\.$#' + identifier: property.nonObject + count: 3 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot access property \$ipv6 on App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null\.$#' + identifier: property.nonObject + count: 3 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot access property \$organisation on App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot call method each\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot call method servers\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot call method update\(\) on App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Method App\\Http\\Controllers\\ProvisionCallback\:\:__invoke\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Parameter \#1 \$ip of static method App\\Support\\Ip\:\:inNetwork\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 2 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Parameter \#1 \$server of class App\\Events\\Servers\\ServerProvisioned constructor expects App\\Models\\Server, App\\Models\\Server\|Illuminate\\Database\\Eloquent\\Collection\\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ProvisionCallback.php + + - + message: '#^Cannot access offset ''hostname'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Cannot access offset ''server_id'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Cannot access offset ''sudo_password'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Method App\\Http\\Controllers\\ProvisionScript\:\:__invoke\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Parameter \#2 \$replace of function str_replace expects array\\|string, mixed given\.$#' + identifier: argument.type + count: 3 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Parameter \#2 \$replace of function str_replace expects array\\|string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Parameter \#3 \$subject of function str_replace expects array\\|string, string\|false given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ProvisionScript.php + + - + message: '#^Method App\\Http\\Controllers\\RegistryController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/RegistryController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$external_id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 2 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Binary operation "\." between mixed and ''\.images'' results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Binary operation "\." between mixed and ''\.locations'' results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Binary operation "\." between mixed and ''\.serverTypes'' results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Call to an undefined method App\\Models\\Provider\|Illuminate\\Database\\Eloquent\\Collection\\:\:service\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Method App\\Http\\Controllers\\ServerController\:\:create\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Method App\\Http\\Controllers\\ServerController\:\:index\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Method App\\Http\\Controllers\\ServerController\:\:show\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Method App\\Http\\Controllers\\ServerController\:\:store\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Method Illuminate\\Database\\Eloquent\\Collection\\:\:load\(\) invoked with 3 parameters, 1 required\.$#' + identifier: arguments.count + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$image of method App\\Services\\ServerProviders\\ServerProviderService\:\:createServer\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$location of method App\\Services\\ServerProviders\\ServerProviderService\:\:createServer\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$networkId of method App\\Services\\ServerProviders\\ServerProviderService\:\:createServer\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$networkZone of method App\\Services\\ServerProviders\\ServerProviderService\:\:createNetwork\(\) expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$server of class App\\Jobs\\Servers\\WaitForServerToConnect constructor expects App\\Models\\Server, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Parameter \$serverType of method App\\Services\\ServerProviders\\ServerProviderService\:\:createServer\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Part \$networkZone \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Http/Controllers/ServerController.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Collection\\|Illuminate\\Database\\Eloquent\\Model\:\:update\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Cannot access property \$id on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Method App\\Http\\Controllers\\ServiceController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Method App\\Http\\Controllers\\ServiceController\:\:edit\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Method App\\Http\\Controllers\\ServiceController\:\:show\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Parameter \$category of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects App\\Enums\\ServiceCategory, App\\Enums\\ServiceCategory\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Parameter \$name of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Parameter \$type of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects App\\Enums\\ServiceType, App\\Enums\\ServiceType\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Parameter \$version of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/ServiceController.php + + - + message: '#^Call to function abort_unless\(\) with false and 404 will always evaluate to false\.$#' + identifier: function.impossibleType + count: 1 + path: app/Http/Controllers/ServiceUpdateController.php + + - + message: '#^Call to function in_array\(\) with arguments string, array\{App\\Enums\\ServiceType\:\:POSTGRES, App\\Enums\\ServiceType\:\:VALKEY\} and true will always evaluate to false\.$#' + identifier: function.impossibleType + count: 1 + path: app/Http/Controllers/ServiceUpdateController.php + + - + message: '#^Method App\\Http\\Controllers\\ServiceUpdateController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/ServiceUpdateController.php + + - + message: '#^Offset ''backup_enabled'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Http/Controllers/ServiceUpdateController.php + + - + message: '#^Cannot access offset ''password'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Controllers/Settings/PasswordController.php + + - + message: '#^Cannot call method update\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/PasswordController.php + + - + message: '#^Parameter \#1 \$value of static method Illuminate\\Support\\Facades\\Hash\:\:make\(\) expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Http/Controllers/Settings/PasswordController.php + + - + message: '#^Cannot access property \$email_verified_at on App\\Models\\User\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method delete\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method fill\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method isDirty\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method organisations\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method ownedOrganisations\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Cannot call method save\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Controllers/Settings/ProfileController.php + + - + message: '#^Method App\\Http\\Controllers\\SourceProviderController\:\:create\(\) should return Inertia\\Response but returns Inertia\\Response\|Inertia\\ResponseFactory\.$#' + identifier: return.type + count: 1 + path: app/Http/Controllers/SourceProviderController.php + + - + message: '#^Method App\\Http\\Integrations\\Requests\\Hetzner\\Networks\\CreateNetworkRequest\:\:defaultBody\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Http/Integrations/Requests/Hetzner/Networks/CreateNetworkRequest.php + + - + message: '#^Method App\\Http\\Integrations\\Requests\\Hetzner\\Networks\\GetNetworksRequest\:\:defaultBody\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Http/Integrations/Requests/Hetzner/Networks/GetNetworksRequest.php + + - + message: '#^Method App\\Http\\Integrations\\Requests\\Hetzner\\Servers\\CreateServerRequest\:\:__construct\(\) has parameter \$networks with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php + + - + message: '#^Method App\\Http\\Integrations\\Requests\\Hetzner\\Servers\\CreateServerRequest\:\:defaultBody\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Http/Integrations/Requests/Hetzner/Servers/CreateServerRequest.php + + - + message: '#^Method App\\Http\\Middleware\\HandleInertiaRequests\:\:share\(\) should return array\ but returns array\.$#' + identifier: return.type + count: 1 + path: app/Http/Middleware/HandleInertiaRequests.php + + - + message: '#^Cannot access property \$id on App\\Models\\User\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Http/Requests/Settings/ProfileUpdateRequest.php + + - + message: '#^Cannot access offset ''versions'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Http/Requests/StoreServiceRequest.php + + - + message: '#^Cannot access offset mixed on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: app/Http/Requests/StoreServiceRequest.php + + - + message: '#^Cannot call method add\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Requests/StoreServiceRequest.php + + - + message: '#^Cannot call method errors\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Http/Requests/StoreServiceRequest.php + + - + message: '#^Method App\\Http\\Requests\\StoreServiceRequest\:\:after\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: app/Http/Requests/StoreServiceRequest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 2 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$name\.$#' + identifier: property.notFound + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$serviceSlice\.$#' + identifier: property.notFound + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$steps\.$#' + identifier: property.notFound + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:steps\(\)\.$#' + identifier: method.notFound + count: 2 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot access property \$container_name on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 4 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method dispatchJob\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method operations\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method replicas\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method sortBy\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot call method steps\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Cannot cast mixed to int\.$#' + identifier: cast.int + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:CADDY is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:LARAVEL is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:POSTGRES is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ServiceType\:\:VALKEY is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Match expression does not handle remaining value\: string$#' + identifier: match.unhandled + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Method App\\Jobs\\Environments\\DeployEnvironment\:\:ensureServiceReplicas\(\) should return array\ but returns array\\.$#' + identifier: return.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Method App\\Jobs\\Environments\\DeployEnvironment\:\:gatewayUpstreams\(\) should return array\ but returns array\\.$#' + identifier: return.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Method App\\Jobs\\Environments\\DeployEnvironment\:\:placementServerIds\(\) should return array\ but returns array\\.$#' + identifier: return.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Offset ''migration_timing'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 2 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Offset ''server_ids'' on string\|null on left side of \?\? does not exist\.$#' + identifier: nullCoalesce.offset + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$arg of function escapeshellarg expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$attachment of method App\\Jobs\\Environments\\DeployEnvironment\:\:configureCaddyRouteScript\(\) expects App\\Models\\EnvironmentAttachment, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$attachment of method App\\Jobs\\Environments\\DeployEnvironment\:\:gatewayCutoverSteps\(\) expects App\\Models\\EnvironmentAttachment, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Database\\Eloquent\\Collection\\:\:map\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: array\{priority\: int, target\: string\}, Closure\(App\\Models\\ServiceReplica\)\: array\{priority\: int, target\: string\} given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:filter\(\) expects \(callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: bool\)\|null, Closure\(App\\Models\\Service\)\: bool given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:first\(\) expects \(callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: bool\)\|null, Closure\(App\\Models\\Operation\)\: bool given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:flatMap\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: \(array\\|Illuminate\\Support\\Collection\\), Closure\(App\\Models\\Service\)\: Illuminate\\Support\\Collection\ given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Environments\\DeployEnvironment\:\:createServiceDeploySteps\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Environments\\DeployEnvironment\:\:dispatchChildOperations\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$parent of method App\\Jobs\\Environments\\DeployEnvironment\:\:createGatewayOperations\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$parent of method App\\Jobs\\Environments\\DeployEnvironment\:\:createReplicaDeployOperations\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$scope of method App\\Jobs\\Environments\\DeployEnvironment\:\:endpointTarget\(\) expects App\\Enums\\ServiceEndpointScope, string given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#1 \$service of method App\\Jobs\\Environments\\DeployEnvironment\:\:serviceKey\(\) expects App\\Models\\Service, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#2 \$haystack of function in_array expects array, array\|string given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#2 \$operation of method App\\Actions\\Environments\\BuildApplicationArtifact\:\:execute\(\) expects App\\Models\\Operation\|null, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \#4 \$imageDigest of method App\\Jobs\\Environments\\DeployEnvironment\:\:createServiceDeploySteps\(\) expects string, string\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Parameter \$consumerReplica of method App\\Actions\\Services\\RegisterServiceEndpoint\:\:execute\(\) expects App\\Models\\ServiceReplica\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Part \$route \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Strict comparison using \=\=\= between ''pre_switch'' and ''post_switch'' will always evaluate to false\.$#' + identifier: identical.alwaysFalse + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Strict comparison using \=\=\= between ''pre_switch'' and ''pre_switch'' will always evaluate to true\.$#' + identifier: identical.alwaysTrue + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Using nullsafe property access "\?\-\>name" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' + identifier: nullsafe.neverNull + count: 1 + path: app/Jobs/Environments/DeployEnvironment.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:dispatchJob\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Jobs/Services/DeployService.php + + - + message: '#^Parameter \#1 \$steps of method App\\Jobs\\Services\\DeployService\:\:stepsWithComposeUpload\(\) expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/DeployService.php + + - + message: '#^Property App\\Jobs\\Services\\DeployService\:\:\$operation \(App\\Models\\Operation\) does not accept Illuminate\\Database\\Eloquent\\Model\.$#' + identifier: assign.propertyType + count: 1 + path: app/Jobs/Services/DeployService.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$server\.$#' + identifier: property.notFound + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$status\.$#' + identifier: property.notFound + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:children\(\)\.$#' + identifier: method.notFound + count: 2 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:steps\(\)\.$#' + identifier: method.notFound + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot access property \$server on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot access property \$server on mixed\.$#' + identifier: property.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot access property \$target on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 3 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method dispatchJob\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method each\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 5 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method get\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method orderBy\(\) on mixed\.$#' + identifier: method.nonObject + count: 4 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method replicas\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method steps\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method steps\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method update\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method update\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 5 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method whereIn\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Cannot call method with\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:each\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: mixed, Closure\(App\\Models\\Operation\)\: void given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:first\(\) expects \(callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: bool\)\|null, Closure\(App\\Models\\Operation\)\: bool given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$callback of method Illuminate\\Support\\Collection\\:\:flatMap\(\) expects callable\(Illuminate\\Database\\Eloquent\\Model, int\)\: \(array\\|Illuminate\\Support\\Collection\\), Closure\(App\\Models\\Service\)\: Illuminate\\Support\\Collection\ given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:cancelDescendants\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:cancelPendingSiblingsAndAncestors\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:cancelPendingSiblingsAndAncestors\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:completeOperation\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:completeOperation\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:dispatchNextChildOperation\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:dispatchNextOperationAfter\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Parameter \#1 \$operation of method App\\Jobs\\Services\\RunStep\:\:dispatchNextOperationAfter\(\) expects App\\Models\\Operation, Illuminate\\Database\\Eloquent\\Model\|null given\.$#' + identifier: argument.type + count: 1 + path: app/Jobs/Services/RunStep.php + + - + message: '#^Class App\\Models\\Application uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/Application.php + + - + message: '#^Method App\\Models\\Application\:\:environments\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Application.php + + - + message: '#^Method App\\Models\\Application\:\:operations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Application.php + + - + message: '#^Method App\\Models\\Application\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Application.php + + - + message: '#^Method App\\Models\\BuildArtifact\:\:builtByOperation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/BuildArtifact.php + + - + message: '#^Method App\\Models\\BuildArtifact\:\:builtByService\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/BuildArtifact.php + + - + message: '#^Method App\\Models\\BuildArtifact\:\:environment\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/BuildArtifact.php + + - + message: '#^Class App\\Models\\Environment uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:application\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:attachments\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:buildArtifacts\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:operations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:services\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\Environment\:\:variables\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Environment.php + + - + message: '#^Method App\\Models\\EnvironmentAttachment\:\:environment\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/EnvironmentAttachment.php + + - + message: '#^Method App\\Models\\EnvironmentAttachment\:\:service\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/EnvironmentAttachment.php + + - + message: '#^Method App\\Models\\EnvironmentAttachment\:\:serviceSlice\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/EnvironmentAttachment.php + + - + message: '#^Method App\\Models\\EnvironmentVariable\:\:environment\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/EnvironmentVariable.php + + - + message: '#^Method App\\Models\\EnvironmentVariable\:\:serviceSlice\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/EnvironmentVariable.php + + - + message: '#^Method App\\Models\\FirewallRule\:\:server\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/FirewallRule.php + + - + message: '#^Strict comparison using \=\=\= between string and App\\Enums\\FirewallRuleType\:\:ALLOW will always evaluate to false\.$#' + identifier: identical.alwaysFalse + count: 1 + path: app/Models/FirewallRule.php + + - + message: '#^Strict comparison using \=\=\= between string and App\\Enums\\FirewallRuleType\:\:DENY will always evaluate to false\.$#' + identifier: identical.alwaysFalse + count: 1 + path: app/Models/FirewallRule.php + + - + message: '#^Method App\\Models\\Network\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Network.php + + - + message: '#^Method App\\Models\\Network\:\:provider\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Network.php + + - + message: '#^Method App\\Models\\Network\:\:servers\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Network.php + + - + message: '#^Cannot call method random\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: app/Models/Operation.php + + - + message: '#^Class App\\Models\\Operation uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/Operation.php + + - + message: '#^Method App\\Models\\Operation\:\:children\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Operation.php + + - + message: '#^Method App\\Models\\Operation\:\:parent\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Operation.php + + - + message: '#^Method App\\Models\\Operation\:\:steps\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Operation.php + + - + message: '#^Method App\\Models\\Operation\:\:target\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Operation.php + + - + message: '#^Property App\\Models\\Operation\:\:\$hash \(string\) does not accept mixed\.$#' + identifier: assign.propertyType + count: 1 + path: app/Models/Operation.php + + - + message: '#^Argument of an invalid type array\|string supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Empty array passed to foreach\.$#' + identifier: foreach.emptyArray + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Method App\\Models\\OperationStep\:\:errorLogsExcerpt\(\) return type with generic class Illuminate\\Database\\Eloquent\\Casts\\Attribute does not specify its types\: TGet, TSet$#' + identifier: missingType.generics + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Method App\\Models\\OperationStep\:\:logsExcerpt\(\) return type with generic class Illuminate\\Database\\Eloquent\\Casts\\Attribute does not specify its types\: TGet, TSet$#' + identifier: missingType.generics + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Method App\\Models\\OperationStep\:\:operation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Parameter \#2 \$replace of function str_replace expects array\\|string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Part \$key \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Property ''error_logs_excerpt'' does not exist in model\.$#' + identifier: rules.modelAppends + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Property ''logs_excerpt'' does not exist in model\.$#' + identifier: rules.modelAppends + count: 1 + path: app/Models/OperationStep.php + + - + message: '#^Method App\\Models\\Organisation\:\:applications\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:members\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany does not specify its types\: TRelatedModel, TDeclaringModel, TPivotModel, TAccessor \(2\-4 required\)$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:networks\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:owner\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:providers\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:registries\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:servers\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:services\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Method App\\Models\\Organisation\:\:sourceProviders\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Organisation.php + + - + message: '#^Match arm comparison between string and App\\Enums\\ProviderType\:\:HETZNER is always false\.$#' + identifier: match.alwaysFalse + count: 1 + path: app/Models/Provider.php + + - + message: '#^Method App\\Models\\Provider\:\:networks\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Provider.php + + - + message: '#^Method App\\Models\\Provider\:\:servers\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Provider.php + + - + message: '#^Method App\\Models\\Registry\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Registry.php + + - + message: '#^Method App\\Models\\Server\:\:firewallRules\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:network\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:provider\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:serviceOperations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasManyThrough does not specify its types\: TRelatedModel, TIntermediateModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:serviceReplicas\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Method App\\Models\\Server\:\:services\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Server.php + + - + message: '#^Cannot access offset string\|null on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: app/Models/Service.php + + - + message: '#^Class App\\Models\\Service uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:driver\(\) should return App\\Drivers\\Driver but returns object\.$#' + identifier: return.type + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:endpoints\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:environment\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:folderName\(\) return type with generic class Illuminate\\Database\\Eloquent\\Casts\\Attribute does not specify its types\: TGet, TSet$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:operations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:replicas\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:server\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\Service\:\:slices\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/Service.php + + - + message: '#^Parameter \#1 \$class of function class_exists expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Models/Service.php + + - + message: '#^Part \$class \(mixed\) of encapsed string cannot be cast to string\.$#' + identifier: encapsedStringPart.nonString + count: 1 + path: app/Models/Service.php + + - + message: '#^Property App\\Drivers\\DatabaseDriver\:\:\$credentials \(array\|null\) does not accept string\|null\.$#' + identifier: assign.propertyType + count: 1 + path: app/Models/Service.php + + - + message: '#^Method App\\Models\\ServiceEndpoint\:\:service\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceEndpoint.php + + - + message: '#^Method App\\Models\\ServiceEndpoint\:\:serviceReplica\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceEndpoint.php + + - + message: '#^Class App\\Models\\ServiceReplica uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceReplica.php + + - + message: '#^Method App\\Models\\ServiceReplica\:\:operation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceReplica.php + + - + message: '#^Method App\\Models\\ServiceReplica\:\:operations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceReplica.php + + - + message: '#^Method App\\Models\\ServiceReplica\:\:server\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceReplica.php + + - + message: '#^Method App\\Models\\ServiceReplica\:\:service\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceReplica.php + + - + message: '#^Class App\\Models\\ServiceSlice uses generic trait Illuminate\\Database\\Eloquent\\Factories\\HasFactory but does not specify its types\: TFactory$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceSlice.php + + - + message: '#^Method App\\Models\\ServiceSlice\:\:attachments\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceSlice.php + + - + message: '#^Method App\\Models\\ServiceSlice\:\:environment\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceSlice.php + + - + message: '#^Method App\\Models\\ServiceSlice\:\:operations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\MorphMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceSlice.php + + - + message: '#^Method App\\Models\\ServiceSlice\:\:service\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/ServiceSlice.php + + - + message: '#^Method App\\Models\\SourceProvider\:\:organisation\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsTo does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/SourceProvider.php + + - + message: '#^Method App\\Models\\User\:\:organisations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany does not specify its types\: TRelatedModel, TDeclaringModel, TPivotModel, TAccessor \(2\-4 required\)$#' + identifier: missingType.generics + count: 1 + path: app/Models/User.php + + - + message: '#^Method App\\Models\\User\:\:ownedOrganisations\(\) return type with generic class Illuminate\\Database\\Eloquent\\Relations\\HasMany does not specify its types\: TRelatedModel, TDeclaringModel$#' + identifier: missingType.generics + count: 1 + path: app/Models/User.php + + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 2 + path: app/Services/Compose/ComposeRenderer.php + + - + message: '#^Parameter \#1 \$document of method App\\Services\\Compose\\ComposeRenderer\:\:toYaml\(\) expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: app/Services/Compose/ComposeRenderer.php + + - + message: '#^Parameter \#1 \$value of function collect expects Illuminate\\Contracts\\Support\\Arrayable\<\(int\|string\), mixed\>\|iterable\<\(int\|string\), mixed\>\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/Compose/ComposeRenderer.php + + - + message: '#^Unable to resolve the template type TKey in call to function collect$#' + identifier: argument.templateType + count: 1 + path: app/Services/Compose/ComposeRenderer.php + + - + message: '#^Unable to resolve the template type TValue in call to function collect$#' + identifier: argument.templateType + count: 1 + path: app/Services/Compose/ComposeRenderer.php + + - + message: '#^Cannot access offset ''city'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''cores'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''country'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''description'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''disk'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''gross'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''hourly'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''id'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 4 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''ip_range'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''memory'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''monthly'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''name'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 3 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''network_zone'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''os_flavor'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''os_version'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset ''prices'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Cannot access offset 0 on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Method App\\Services\\ServerProviders\\HetznerService\:\:getImages\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Method App\\Services\\ServerProviders\\HetznerService\:\:getLocations\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Method App\\Services\\ServerProviders\\HetznerService\:\:getServerTypes\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \#1 \$value of function collect expects Illuminate\\Contracts\\Support\\Arrayable\<\(int\|string\), mixed\>\|iterable\<\(int\|string\), mixed\>\|null, mixed given\.$#' + identifier: argument.type + count: 4 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$city of class App\\Data\\ServerProviders\\Location constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$cores of class App\\Data\\ServerProviders\\ServerType constructor expects int, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$country of class App\\Data\\ServerProviders\\Location constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$disk of class App\\Data\\ServerProviders\\ServerType constructor expects int, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$id of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$id of class App\\Data\\ServerProviders\\Image constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$id of class App\\Data\\ServerProviders\\Location constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$id of class App\\Data\\ServerProviders\\Network constructor expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$id of class App\\Data\\ServerProviders\\ServerType constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$ipRange of class App\\Data\\ServerProviders\\Network constructor expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$ipv4 of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$ipv6 of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$memory of class App\\Data\\ServerProviders\\ServerType constructor expects int, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$name of class App\\Data\\ServerProviders\\Image constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$name of class App\\Data\\ServerProviders\\Location constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$name of class App\\Data\\ServerProviders\\Network constructor expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$name of class App\\Data\\ServerProviders\\ServerType constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$networkZone of class App\\Data\\ServerProviders\\Location constructor expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$networkZone of class App\\Data\\ServerProviders\\Network constructor expects string\|null, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$osFlavor of class App\\Data\\ServerProviders\\Image constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$osVersion of class App\\Data\\ServerProviders\\Image constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$priceHourly of class App\\Data\\ServerProviders\\ServerType constructor expects float, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$priceMonthly of class App\\Data\\ServerProviders\\ServerType constructor expects float, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$privateIp of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$rootPassword of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Parameter \$status of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Unable to resolve the template type TKey in call to function collect$#' + identifier: argument.templateType + count: 4 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Unable to resolve the template type TValue in call to function collect$#' + identifier: argument.templateType + count: 4 + path: app/Services/ServerProviders/HetznerService.php + + - + message: '#^Method App\\Services\\ServerProviders\\ServerProviderService\:\:getImages\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/ServerProviderService.php + + - + message: '#^Method App\\Services\\ServerProviders\\ServerProviderService\:\:getLocations\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/ServerProviderService.php + + - + message: '#^Method App\\Services\\ServerProviders\\ServerProviderService\:\:getServerTypes\(\) return type with generic class Illuminate\\Support\\Collection does not specify its types\: TKey, TValue$#' + identifier: missingType.generics + count: 1 + path: app/Services/ServerProviders/ServerProviderService.php + + - + message: '#^Cannot access offset int on string\|false\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 2 + path: app/Support/Ip.php + + - + message: '#^Parameter \#1 \$string of function substr expects string, string\|false given\.$#' + identifier: argument.type + count: 2 + path: app/Support/Ip.php + + - + message: '#^Cannot access property \$organisations on App\\Models\\User\|null\.$#' + identifier: property.nonObject + count: 1 + path: routes/web.php + + - + message: '#^Cannot call method name\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: routes/web.php + + - + message: '#^Cannot call method bind\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ApplicationControllerTest.php + + - + message: '#^Cannot call method exists\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ApplicationControllerTest.php + + - + message: '#^Cannot call method services\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ApplicationControllerTest.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ApplicationControllerTest.php + + - + message: '#^Parameter \#1 \$attributes of method Illuminate\\Database\\Eloquent\\Relations\\HasOneOrMany\\>\:\:create\(\) expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ApplicationControllerTest.php + + - + message: '#^Cannot call method hasVerifiedEmail\(\) on App\\Models\\User\|null\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/Auth/EmailVerificationTest.php + + - + message: '#^Binary operation "\." between ''/reset\-password/'' and mixed results in an error\.$#' + identifier: binaryOp.invalid + count: 1 + path: tests/Feature/Auth/PasswordResetTest.php + + - + message: '#^Cannot access property \$token on mixed\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/Auth/PasswordResetTest.php + + - + message: '#^Cannot access property \$password on App\\Models\\User\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/AuthFlowsTest.php + + - + message: '#^Cannot call method update\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/BuildApplicationArtifactTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/BuildApplicationArtifactTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/BuildApplicationArtifactTest.php + + - + message: '#^Offset ''build_strategy'' does not exist on string\|null\.$#' + identifier: offsetAccess.notFound + count: 2 + path: tests/Feature/BuildArtifactPlanningTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/BuildArtifactPlanningTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/BuildArtifactPlanningTest.php + + - + message: '#^Cannot access property \$command on mixed\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$health_status on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$id on App\\Models\\Operation\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$image_digest on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$kind on App\\Models\\Operation\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$kind on mixed\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$operation on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$operation_id on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$order on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$parent on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$script on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 4 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$script on mixed\.$#' + identifier: property.nonObject + count: 9 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$status on App\\Models\\Operation\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$status on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$steps on App\\Models\\Operation\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot access property \$target on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method all\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method children\(\) on App\\Models\\Operation\|null\.$#' + identifier: method.nonObject + count: 8 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method children\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 6 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method count\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 14 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method is\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method steps\(\) on App\\Models\\Operation\|null\.$#' + identifier: method.nonObject + count: 6 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method steps\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 5 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method steps\(\) on mixed\.$#' + identifier: method.nonObject + count: 5 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 13 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Parameter \#1 \$haystack of function str_contains expects string, mixed given\.$#' + identifier: argument.type + count: 2 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 5 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 5 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Parameter \#2 \$array of function implode expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\>\:\:and\(\)$#' + identifier: argument.templateType + count: 2 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 6 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/DeployEnvironmentJobTest.php + + - + message: '#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\.$#' + identifier: foreach.nonIterable + count: 2 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:defaultImage\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:defaultPorts\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:environmentSchema\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:firewallRules\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:resourceDefaults\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:serviceType\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:updateBehavior\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Call to an undefined method object\:\:versionTrack\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Cannot access property \$value on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\>\:\:and\(\)$#' + identifier: argument.templateType + count: 4 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/DriverContractTest.php + + - + message: '#^Cannot access offset ''test'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/Feature/Drivers/LaravelRuntimeDriverTest.php + + - + message: '#^Cannot access property \$value on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/EnvironmentAttachmentControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentAttachmentControllerTest.php + + - + message: '#^Cannot access property \$script on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Cannot access property \$status on App\\Models\\Operation\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Cannot call method steps\(\) on App\\Models\\Operation\|null\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentDeploymentControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$kind\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentMigrationControllerTest.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:steps\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/EnvironmentMigrationControllerTest.php + + - + message: '#^Cannot access property \$script on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/EnvironmentMigrationControllerTest.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/EnvironmentMigrationControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentMigrationControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$key\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$overridable\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$service_slice_id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$source\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$value\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentVariableControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$config\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$deploy_policy\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$process_roles\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$type\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Cannot access offset ''command'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 2 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/EnvironmentWorkerControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$serviceSlice\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$value\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Calling toBeInstanceOf\(\) on Expectation\; assertion is redundant\.$#' + identifier: pest.expectation.redundant + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Calling toBeInstanceOf\(\) on Expectation\; assertion is redundant\.$#' + identifier: pest.expectation.redundant + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Cannot access property \$operation on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Cannot call method is\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/KeystoneDomainModelTest.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:driver\(\)\.$#' + identifier: method.notFound + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access property \$config on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access property \$deploy_policy on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access property \$id on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access property \$process_roles on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access property \$type on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot call method dockerfileTemplate\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot call method driver\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot call method refresh\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot call method update\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Only iterables can be unpacked, mixed given\.$#' + identifier: arrayUnpacking.nonIterable + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 2 + path: tests/Feature/LaravelEnvironmentDefaultsTest.php + + - + message: '#^Cannot access offset ''database'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$config on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$kind on mixed\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$overridable on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$script on mixed\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$source on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$type on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot access property \$value on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 9 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot call method operations\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 6 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Cannot call method steps\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/ManagedAttachmentTest.php + + - + message: '#^Access to an undefined property App\\Models\\OperationStep\:\:\$error_logs_excerpt\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Access to an undefined property App\\Models\\OperationStep\:\:\$logs_excerpt\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Access to an undefined property App\\Models\\Service\:\:\$folder_name\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$firewallRules on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$id on mixed\.$#' + identifier: property.nonObject + count: 8 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$network on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$organisation on mixed\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$organisation_id on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$provider on mixed\.$#' + identifier: property.nonObject + count: 2 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$servers on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$serviceOperations on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$serviceReplicas on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot access property \$services on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot call method is\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 17 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot call method is\(\) on mixed\.$#' + identifier: method.nonObject + count: 5 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Cannot call method sshClient\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Function buildOrgServer\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Parameter \#1 \$factory of method Illuminate\\Database\\Eloquent\\Factories\\Factory\\:\:for\(\) expects Illuminate\\Database\\Eloquent\\Factories\\Factory\|Illuminate\\Database\\Eloquent\\Model, mixed given\.$#' + identifier: argument.type + count: 4 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/ModelRelationshipsTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:andReturnNull\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/Models/FirewallRuleTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:once\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/Models/FirewallRuleTest.php + + - + message: '#^Cannot access property \$id on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/Models/FirewallRuleTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/Models/FirewallRuleTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/Models/FirewallRuleTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/OnboardingControllerTest.php + + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 1 + path: tests/Feature/OnboardingControllerTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/OnboardingControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ProvisionCallbackTest.php + + - + message: '#^Cannot access property \$status on App\\Models\\Server\|null\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/ProvisionCallbackTest.php + + - + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string + count: 1 + path: tests/Feature/ProvisionCallbackTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ProvisionCallbackTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ProvisionScriptTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$credentials\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$name\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$type\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$url\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/RegistryControllerTest.php + + - + message: '#^Cannot access offset ''GIT_SSH_COMMAND'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 1 + path: tests/Feature/RepositoryAccessTest.php + + - + message: '#^Cannot access property \$command on mixed\.$#' + identifier: property.nonObject + count: 3 + path: tests/Feature/RepositoryAccessTest.php + + - + message: '#^Cannot access property \$environment on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/RepositoryAccessTest.php + + - + message: '#^Parameter \#1 \$haystack of function str_contains expects string, mixed given\.$#' + identifier: argument.type + count: 3 + path: tests/Feature/RepositoryAccessTest.php + + - + message: '#^Parameter \#2 \$array of function implode expects array\, array\ given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/RepositoryAccessTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$external_id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 3 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:andReturn\(\)\.$#' + identifier: method.notFound + count: 3 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:andReturnSelf\(\)\.$#' + identifier: method.notFound + count: 3 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:never\(\)\.$#' + identifier: method.notFound + count: 1 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:once\(\)\.$#' + identifier: method.notFound + count: 3 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Cannot call method andReturn\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Parameter \#1 \$organisation of method Database\\Factories\\ProviderFactory\:\:forOrganisation\(\) expects App\\Models\\Organisation\|string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Parameter \$networkId of class App\\Data\\ServerProviders\\CreatedServer constructor expects string, mixed given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Variable \$user in PHPDoc tag @var does not exist\.$#' + identifier: varTag.variableNotFound + count: 1 + path: tests/Feature/ServerControllerTest.php + + - + message: '#^Call to an undefined method Mockery\\ExpectationInterface\|Mockery\\HigherOrderMessage\:\:andReturn\(\)\.$#' + identifier: method.notFound + count: 2 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot access offset ''organisation'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 19 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot access offset ''server'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 23 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot access offset ''user'' on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible + count: 11 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot access property \$id on mixed\.$#' + identifier: property.nonObject + count: 39 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot call method andReturn\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot call method once\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot call method shouldReceive\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Cannot call method withArgs\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Function setupTestEnvironment\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Parameter \#1 \$factory of method Illuminate\\Database\\Eloquent\\Factories\\Factory\\:\:for\(\) expects Illuminate\\Database\\Eloquent\\Factories\\Factory\|Illuminate\\Database\\Eloquent\\Model, mixed given\.$#' + identifier: argument.type + count: 2 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Parameter \#1 \$user of function Pest\\Laravel\\actingAs expects Illuminate\\Contracts\\Auth\\Authenticatable, mixed given\.$#' + identifier: argument.type + count: 3 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Parameter \#1 \$user of method Illuminate\\Foundation\\Testing\\TestCase\:\:actingAs\(\) expects Illuminate\\Contracts\\Auth\\Authenticatable, mixed given\.$#' + identifier: argument.type + count: 8 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Parameter \$server of method App\\Actions\\Services\\CreateService\:\:execute\(\) expects App\\Models\\Server, mixed given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 3 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$status\.$#' + identifier: property.notFound + count: 4 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Model\:\:steps\(\)\.$#' + identifier: method.notFound + count: 4 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot access property \$kind on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot access property \$name on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot access property \$script on mixed\.$#' + identifier: property.nonObject + count: 5 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot access property \$status on mixed\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method create\(\) on mixed\.$#' + identifier: method.nonObject + count: 3 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method first\(\) on mixed\.$#' + identifier: method.nonObject + count: 4 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method implode\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method orderBy\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method pluck\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method steps\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 4 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 2 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Parameter \#1 \$step of class App\\Jobs\\Services\\RunStep constructor expects App\\Models\\OperationStep, mixed given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 3 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 2 + path: tests/Feature/ServiceDeploymentOperationTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$id\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/ServiceEndpointTest.php + + - + message: '#^Function endpointTestServer\(\) has parameter \$attributes with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: tests/Feature/ServiceEndpointTest.php + + - + message: '#^Parameter \#1 \$attributes of method Illuminate\\Database\\Eloquent\\Factories\\Factory\\:\:create\(\) expects array\\|\(callable\(array\\)\: array\\), non\-empty\-array\ given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceEndpointTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceImageDigestTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceImageDigestTest.php + + - + message: '#^Cannot access property \$kind on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Cannot call method exists\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Cannot call method steps\(\) on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Cannot call method where\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Function serviceUpdateFixture\(\) has parameter \$serviceConfig with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Parameter \#1 \$networkId of method Database\\Factories\\ServerFactory\:\:forNetwork\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Parameter \#1 \$providerId of method Database\\Factories\\ServerFactory\:\:forProvider\(\) expects string, int given\.$#' + identifier: argument.type + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/ServiceUpdateControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$name\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/SourceProviderControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$type\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/SourceProviderControllerTest.php + + - + message: '#^Access to an undefined property Illuminate\\Database\\Eloquent\\Model\:\:\$url\.$#' + identifier: property.notFound + count: 1 + path: tests/Feature/SourceProviderControllerTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 2 + path: tests/Feature/SourceProviderControllerTest.php + + - + message: '#^Unable to resolve the template type TValue in call to function expect$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/SourceProviderControllerTest.php + + - + message: '#^Cannot access property \$script on Illuminate\\Database\\Eloquent\\Model\|null\.$#' + identifier: property.nonObject + count: 5 + path: tests/Feature/StatefulServiceUpdateTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\>\:\:and\(\)$#' + identifier: argument.templateType + count: 1 + path: tests/Feature/StatefulServiceUpdateTest.php + + - + message: '#^Unable to resolve the template type TAndValue in call to method Pest\\Expectation\\:\:and\(\)$#' + identifier: argument.templateType + count: 4 + path: tests/Feature/StatefulServiceUpdateTest.php + + - + message: '#^Function validateUpdate\(\) has parameter \$payload with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: tests/Feature/UpdateServiceRequestTest.php + + - + message: '#^Function validateUpdate\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue + count: 1 + path: tests/Feature/UpdateServiceRequestTest.php + + - + message: '#^Cannot call method toBe\(\) on mixed\.$#' + identifier: method.nonObject + count: 1 + path: tests/Pest.php + + - + message: '#^Function something\(\) has no return type specified\.$#' + identifier: missingType.return + count: 1 + path: tests/Pest.php + + - + message: '#^Undefined variable\: \$this$#' + identifier: variable.undefined + count: 1 + path: tests/Pest.php + + - + message: '#^Parameter \#1 \.\.\.\$data of method Pest\\PendingCalls\\TestCall\:\:with\(\) expects array\\|string\>\|Closure\|string, array\{App\\Enums\\ServiceCategory\:\:APPLICATION, App\\Enums\\ServiceCategory\:\:DATABASE, App\\Enums\\ServiceCategory\:\:GATEWAY, App\\Enums\\ServiceCategory\:\:STORAGE, App\\Enums\\ServiceCategory\:\:CACHE, App\\Enums\\ServiceCategory\:\:BUILDER\} given\.$#' + identifier: argument.type + count: 1 + path: tests/Unit/Enums/ServiceCategoryTest.php + + - + message: '#^Calling toBeTrue\(\) on Expectation\; assertion is redundant\.$#' + identifier: pest.expectation.redundant + count: 1 + path: tests/Unit/ExampleTest.php diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..361e25a --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,14 @@ +includes: + - vendor/larastan/larastan/extension.neon + - vendor/mrpunyapal/peststan/extension.neon + - phpstan-baseline.neon + +parameters: + peststan: + testCaseClass: Tests\TestCase + pestConfigFiles: [tests/Pest.php] + level: max + paths: + - app + - routes + - tests diff --git a/phpunit.xml b/phpunit.xml index 7eef87f..9807ca8 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -16,6 +16,19 @@ app + + app/Console + app/Data + app/Http/Integrations + app/Actions/Servers/SyncUfwRules.php + app/Actions/FirewallRules/InstallFirewallRule.php + app/Actions/FirewallRules/UninstallFirewallRule.php + app/Services/Operations/SshRemoteCommandRunner.php + app/Services/ServerProviders/HetznerService.php + app/Jobs/Servers/ProvisionServer.php + app/Jobs/Servers/WaitForServerToConnect.php + app/Actions/Applications/GenerateDeployKey.php + diff --git a/resources/css/app.css b/resources/css/app.css index 391516b..4b33902 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,7 +5,8 @@ body, html { --font-sans: - 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + "Instrument Sans", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } @layer base { diff --git a/resources/js/app.ts b/resources/js/app.ts index 5670d9e..62f589c 100644 --- a/resources/js/app.ts +++ b/resources/js/app.ts @@ -1,14 +1,14 @@ -import '../css/app.css'; +import "../css/app.css"; -import { createInertiaApp } from '@inertiajs/vue3'; -import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; -import type { DefineComponent } from 'vue'; -import { createApp, h } from 'vue'; -import { ZiggyVue } from 'ziggy-js'; -import { initializeTheme } from './composables/useAppearance'; +import { createInertiaApp } from "@inertiajs/vue3"; +import { resolvePageComponent } from "laravel-vite-plugin/inertia-helpers"; +import type { DefineComponent } from "vue"; +import { createApp, h } from "vue"; +import { ZiggyVue } from "ziggy-js"; +import { initializeTheme } from "./composables/useAppearance"; // Extend ImportMeta interface for Vite... -declare module 'vite/client' { +declare module "vite/client" { interface ImportMetaEnv { readonly VITE_APP_NAME: string; [key: string]: string | boolean | undefined; @@ -20,11 +20,15 @@ declare module 'vite/client' { } } -const appName = import.meta.env.VITE_APP_NAME || 'Laravel'; +const appName = import.meta.env.VITE_APP_NAME || "Laravel"; createInertiaApp({ title: (title) => `${title} - ${appName}`, - resolve: (name) => resolvePageComponent(`./pages/${name}.vue`, import.meta.glob('./pages/**/*.vue')), + resolve: (name) => + resolvePageComponent( + `./pages/${name}.vue`, + import.meta.glob("./pages/**/*.vue"), + ), setup({ el, App, props, plugin }) { createApp({ render: () => h(App, props) }) .use(plugin) @@ -32,7 +36,7 @@ createInertiaApp({ .mount(el); }, progress: { - color: '#4B5563', + color: "#4B5563", }, }); diff --git a/resources/js/components/AppContent.vue b/resources/js/components/AppContent.vue index 96e3d2a..84ed588 100644 --- a/resources/js/components/AppContent.vue +++ b/resources/js/components/AppContent.vue @@ -1,9 +1,9 @@ diff --git a/resources/js/components/AppSidebar.vue b/resources/js/components/AppSidebar.vue index f40612f..4371384 100644 --- a/resources/js/components/AppSidebar.vue +++ b/resources/js/components/AppSidebar.vue @@ -1,17 +1,25 @@