From fcabb7710fc9ed57e64d0e9d5521fabe2a7dde4e Mon Sep 17 00:00:00 2001 From: Eric Sizer Date: Tue, 3 Dec 2024 13:34:58 -0500 Subject: [PATCH] [Debt] Upgrade Larastan to v3 (#12165) * bump larastan version * add phpdoc for relationship types * fix access of nullable properties * fix misc errors * fix relationship eager load * add parent relationships * add baseline ignore errors * fix lint error * revert morph to change --- .../Exceptions/ApiKeyNotFoundException.php | 2 +- .../Exceptions/EmailAttachmentException.php | 2 +- .../InvalidBulkRowDataException.php | 2 +- api/app/Exceptions/NotFutureDateException.php | 2 +- .../Generators/ApplicationZipGenerator.php | 2 +- .../Generators/PoolCandidateCsvGenerator.php | 35 +- .../Generators/PoolCandidateZipGenerator.php | 7 +- api/app/Generators/UserCsvGenerator.php | 2 + api/app/Generators/UserZipGenerator.php | 2 +- api/app/GraphQL/Mutations/DuplicatePool.php | 1 + api/app/Models/ApplicantFilter.php | 5 + api/app/Models/AssessmentResult.php | 3 + api/app/Models/AssessmentStep.php | 4 + api/app/Models/AwardExperience.php | 2 - api/app/Models/Classification.php | 1 + api/app/Models/Community.php | 11 +- api/app/Models/CommunityExperience.php | 2 - api/app/Models/Department.php | 11 +- api/app/Models/EducationExperience.php | 2 - api/app/Models/Experience.php | 9 +- api/app/Models/ExperienceSkill.php | 5 +- api/app/Models/GeneralQuestion.php | 2 + api/app/Models/GeneralQuestionResponse.php | 2 + api/app/Models/GenericJobTitle.php | 1 + api/app/Models/JobPosterTemplate.php | 8 +- api/app/Models/PersonalExperience.php | 2 - api/app/Models/Pool.php | 15 + api/app/Models/PoolCandidate.php | 17 +- api/app/Models/PoolCandidateFilter.php | 3 + api/app/Models/PoolCandidateSearchRequest.php | 7 +- api/app/Models/PoolSkill.php | 4 + api/app/Models/Role.php | 2 +- api/app/Models/RoleAssignment.php | 2 + api/app/Models/ScreeningQuestion.php | 3 + api/app/Models/ScreeningQuestionResponse.php | 2 + api/app/Models/Skill.php | 4 + api/app/Models/SkillFamily.php | 1 + api/app/Models/Team.php | 3 +- api/app/Models/User.php | 27 +- api/app/Models/UserSkill.php | 9 + api/app/Models/WorkExperience.php | 2 - api/app/Providers/RouteServiceProvider.php | 6 +- api/app/Traits/Generator/GeneratesFile.php | 2 +- api/app/Traits/Generator/GeneratesUserDoc.php | 4 +- api/composer.json | 2 +- api/composer.lock | 312 +++++++++--------- api/phpstan-baseline.neon | 13 + api/phpstan.neon | 1 + api/programmatic-types.graphql | 38 ++- 49 files changed, 366 insertions(+), 240 deletions(-) create mode 100644 api/phpstan-baseline.neon diff --git a/api/app/Exceptions/ApiKeyNotFoundException.php b/api/app/Exceptions/ApiKeyNotFoundException.php index f01e2517bd8..a2695739c29 100644 --- a/api/app/Exceptions/ApiKeyNotFoundException.php +++ b/api/app/Exceptions/ApiKeyNotFoundException.php @@ -10,7 +10,7 @@ class ApiKeyNotFoundException extends Exception /** * Report the exception. * - * @return bool|null + * @return void */ public function report() { diff --git a/api/app/Exceptions/EmailAttachmentException.php b/api/app/Exceptions/EmailAttachmentException.php index 464f80e2393..dfa65c3e2a5 100644 --- a/api/app/Exceptions/EmailAttachmentException.php +++ b/api/app/Exceptions/EmailAttachmentException.php @@ -10,7 +10,7 @@ class EmailAttachmentException extends Exception /** * Report the exception. * - * @return bool|null + * @return void */ public function report() { diff --git a/api/app/Exceptions/InvalidBulkRowDataException.php b/api/app/Exceptions/InvalidBulkRowDataException.php index df4b245928e..d221ea818a8 100644 --- a/api/app/Exceptions/InvalidBulkRowDataException.php +++ b/api/app/Exceptions/InvalidBulkRowDataException.php @@ -10,7 +10,7 @@ class InvalidBulkRowDataException extends Exception /** * Report the exception. * - * @return bool|null + * @return void */ public function report() { diff --git a/api/app/Exceptions/NotFutureDateException.php b/api/app/Exceptions/NotFutureDateException.php index 65b9ddc2574..03bc6eec605 100644 --- a/api/app/Exceptions/NotFutureDateException.php +++ b/api/app/Exceptions/NotFutureDateException.php @@ -10,7 +10,7 @@ class NotFutureDateException extends Exception /** * Report the exception. * - * @return bool|null + * @return void */ public function report() { diff --git a/api/app/Generators/ApplicationZipGenerator.php b/api/app/Generators/ApplicationZipGenerator.php index 99db5498e45..63d5c8dd019 100644 --- a/api/app/Generators/ApplicationZipGenerator.php +++ b/api/app/Generators/ApplicationZipGenerator.php @@ -15,7 +15,7 @@ public function generate(): self { PoolCandidate::with([ 'educationRequirementExperiences', - 'pool' => ['poolSkills' => ['skill']], + 'pool' => ['poolSkills', 'poolSkills.skill'], 'screeningQuestionResponses' => ['screeningQuestion'], 'generalQuestionResponses' => ['generalQuestion'], ]) diff --git a/api/app/Generators/PoolCandidateCsvGenerator.php b/api/app/Generators/PoolCandidateCsvGenerator.php index 40a602266c0..a9eb147e1cb 100644 --- a/api/app/Generators/PoolCandidateCsvGenerator.php +++ b/api/app/Generators/PoolCandidateCsvGenerator.php @@ -20,10 +20,13 @@ use App\Enums\PriorityWeight; use App\Enums\ProvinceOrTerritory; use App\Enums\WorkRegion; +use App\Models\GeneralQuestion; use App\Models\Pool; use App\Models\PoolCandidate; +use App\Models\ScreeningQuestion; use App\Traits\Generator\Filterable; use App\Traits\Generator\GeneratesFile; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Lang; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -307,12 +310,19 @@ public function generate(): self */ private function generatePoolHeaders() { - Pool::with(['generalQuestions', 'screeningQuestions', 'poolSkills' => ['skill'], 'assessmentSteps' => ['poolSkills' => ['skill']]]) + Pool::with([ + 'generalQuestions', + 'screeningQuestions', + 'poolSkills', + 'poolSkills.skill', + 'assessmentSteps' => ['poolSkills.skill'], + ]) ->whereIn('id', $this->poolIds) ->chunk(100, function ($pools) { /** @var Pool $pool */ foreach ($pools as $pool) { if ($pool->generalQuestions->count() > 0) { + /** @var GeneralQuestion $question */ foreach ($pool->generalQuestions as $question) { $this->generalQuestionIds[] = $question->id; $this->generatedHeaders['general_questions'][] = @@ -321,6 +331,7 @@ private function generatePoolHeaders() } if ($pool->screeningQuestions->count() > 0) { + /** @var ScreeningQuestion $question */ foreach ($pool->screeningQuestions as $question) { $this->screeningQuestionIds[] = $question->id; $this->generatedHeaders['screening_questions'][] = @@ -451,18 +462,23 @@ private function buildQuery() 'pool' => [ 'generalQuestions', 'screeningQuestions', - 'poolSkills' => ['skill'], - 'assessmentSteps' => ['poolSkills'], + 'poolSkills', + 'poolSkills.skill', + 'assessmentSteps', + 'assessmentSteps.poolSkills', ], 'user' => [ 'department', 'currentClassification', - 'userSkills' => ['skill', 'experiences' => ['skills']], - 'awardExperiences' => ['userSkills' => ['skill']], - 'communityExperiences' => ['userSkills' => ['skill']], - 'educationExperiences' => ['userSkills' => ['skill']], - 'personalExperiences' => ['userSkills' => ['skill']], - 'workExperiences' => ['userSkills' => ['skill']], + 'userSkills', + 'userSkills.skill', + 'userSkills.experiences', + 'userSkills.experiences.skills', + 'awardExperiences.userSkills.skill', + 'communityExperiences.userSkills.skill', + 'educationExperiences.userSkills.skill', + 'personalExperiences.userSkills.skill', + 'workExperiences.userSkills.skill', ], ]); @@ -474,6 +490,7 @@ private function buildQuery() 'community' => 'candidatesInCommunity', ]); + /** @var Builder<\App\Models\User> $query */ $query->authorizedToView(['userId' => $this->userId]); return $query; diff --git a/api/app/Generators/PoolCandidateZipGenerator.php b/api/app/Generators/PoolCandidateZipGenerator.php index ec7c31d3c6a..2e32137aa0f 100644 --- a/api/app/Generators/PoolCandidateZipGenerator.php +++ b/api/app/Generators/PoolCandidateZipGenerator.php @@ -14,8 +14,11 @@ public function generate(): self 'user' => [ 'department', 'currentClassification', - 'experiences' => ['userSkills' => ['skill']], - 'userSkills' => ['skill'], + 'experiences', + 'experiences.userSkills', + 'experiences.userSkills.skill', + 'userSkills', + 'userSkills.skill', ], 'screeningQuestionResponses' => ['screeningQuestion'], 'generalQuestionResponses' => ['generalQuestion'], diff --git a/api/app/Generators/UserCsvGenerator.php b/api/app/Generators/UserCsvGenerator.php index 738e9dabbd4..8f7b891d4b3 100644 --- a/api/app/Generators/UserCsvGenerator.php +++ b/api/app/Generators/UserCsvGenerator.php @@ -14,6 +14,7 @@ use App\Models\User; use App\Traits\Generator\Filterable; use App\Traits\Generator\GeneratesFile; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Arr; use PhpOffice\PhpSpreadsheet\Spreadsheet; @@ -164,6 +165,7 @@ private function buildQuery() 'skills' => 'skillsAdditive', ]); + /** @var Builder $query */ $query->authorizedToView(['userId' => $this->userId]); return $query; diff --git a/api/app/Generators/UserZipGenerator.php b/api/app/Generators/UserZipGenerator.php index a3517496c51..8c17b131dd2 100644 --- a/api/app/Generators/UserZipGenerator.php +++ b/api/app/Generators/UserZipGenerator.php @@ -16,7 +16,7 @@ public function generate(): self User::with([ 'department', 'currentClassification', - 'experiences' => ['userSkills' => ['skill']], + 'experiences' => ['userSkills', 'userSkills.skill'], 'userSkills' => ['skill'], ]) ->whereIn('id', $this->ids) diff --git a/api/app/GraphQL/Mutations/DuplicatePool.php b/api/app/GraphQL/Mutations/DuplicatePool.php index 136b71d909d..2d6036549fb 100644 --- a/api/app/GraphQL/Mutations/DuplicatePool.php +++ b/api/app/GraphQL/Mutations/DuplicatePool.php @@ -31,6 +31,7 @@ public function __invoke($_, array $args) $newPool->save(); + /** @var iterable $skillsToSync */ $skillsToSync = $pool->poolSkills->map(function (PoolSkill $poolSkill) { return [ 'skill_id' => $poolSkill->skill->id, diff --git a/api/app/Models/ApplicantFilter.php b/api/app/Models/ApplicantFilter.php index 7fb2199359e..6da733abf4c 100644 --- a/api/app/Models/ApplicantFilter.php +++ b/api/app/Models/ApplicantFilter.php @@ -40,26 +40,31 @@ class ApplicantFilter extends Model 'qualified_streams' => 'array', ]; + /** @return BelongsToMany */ public function classifications(): BelongsToMany { return $this->belongsToMany(Classification::class, 'applicant_filter_classification'); } + /** @return BelongsToMany */ public function qualifiedClassifications(): BelongsToMany { return $this->belongsToMany(Classification::class, 'applicant_filter_qualified_classification'); } + /** @return BelongsToMany */ public function skills(): BelongsToMany { return $this->belongsToMany(Skill::class, 'applicant_filter_skill'); } + /** @return BelongsToMany */ public function pools(): BelongsToMany { return $this->belongsToMany(Pool::class, 'applicant_filter_pool'); } + /** @return BelongsTo */ public function community(): BelongsTo { return $this->belongsTo(Community::class); diff --git a/api/app/Models/AssessmentResult.php b/api/app/Models/AssessmentResult.php index 349d88b5d76..71778f00c7e 100644 --- a/api/app/Models/AssessmentResult.php +++ b/api/app/Models/AssessmentResult.php @@ -60,16 +60,19 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } + /** @return BelongsTo */ public function assessmentStep(): BelongsTo { return $this->belongsTo(AssessmentStep::class); } + /** @return BelongsTo */ public function poolCandidate(): BelongsTo { return $this->belongsTo(PoolCandidate::class); } + /** @return BelongsTo */ public function poolSkill(): BelongsTo { return $this->belongsTo(PoolSkill::class); diff --git a/api/app/Models/AssessmentStep.php b/api/app/Models/AssessmentStep.php index 3ae04fd7677..799e6f3182a 100644 --- a/api/app/Models/AssessmentStep.php +++ b/api/app/Models/AssessmentStep.php @@ -54,22 +54,26 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } + /** @return BelongsTo */ public function pool(): BelongsTo { return $this->belongsTo(Pool::class); } + /** @return BelongsToMany */ public function poolSkills(): BelongsToMany { return $this->belongsToMany(PoolSkill::class, 'assessment_step_pool_skill') ->withTimestamps(); } + /** @return HasMany */ public function assessmentResults(): HasMany { return $this->hasMany(AssessmentResult::class); } + /** @return HasMany */ public function screeningQuestions(): HasMany { return $this->hasMany(ScreeningQuestion::class); diff --git a/api/app/Models/AwardExperience.php b/api/app/Models/AwardExperience.php index d23c5b15624..6be2f338348 100644 --- a/api/app/Models/AwardExperience.php +++ b/api/app/Models/AwardExperience.php @@ -35,8 +35,6 @@ class AwardExperience extends Experience /** * Default values for attributes - * - * @var array an array with attribute as key and default as value */ protected $attributes = [ 'experience_type' => AwardExperience::class, diff --git a/api/app/Models/Classification.php b/api/app/Models/Classification.php index 9fd40226989..9c93456ec4d 100644 --- a/api/app/Models/Classification.php +++ b/api/app/Models/Classification.php @@ -38,6 +38,7 @@ class Classification extends Model 'name' => 'array', ]; + /** @return HasMany */ public function genericJobTitles(): HasMany { return $this->hasMany(GenericJobTitle::class); diff --git a/api/app/Models/Community.php b/api/app/Models/Community.php index 66ca7689e5d..d23f364f210 100644 --- a/api/app/Models/Community.php +++ b/api/app/Models/Community.php @@ -54,32 +54,31 @@ protected static function boot() }); } - /** - * Search requests - */ + /** @return HasMany */ public function poolCandidateSearchRequests(): HasMany { return $this->hasMany(PoolCandidateSearchRequest::class); } - /** - * ApplicationFilters - */ + /** @return HasMany */ public function applicantFilters(): HasMany { return $this->hasMany(ApplicantFilter::class); } + /** @return MorphOne */ public function team(): MorphOne { return $this->morphOne(Team::class, 'teamable'); } + /** @return HasMany */ public function pools(): HasMany { return $this->hasMany(Pool::class); } + /** @return HasManyThrough */ public function roleAssignments(): HasManyThrough { // I think this only works because we use UUIDs diff --git a/api/app/Models/CommunityExperience.php b/api/app/Models/CommunityExperience.php index 7a4c1e5c30c..2f2b9127e31 100644 --- a/api/app/Models/CommunityExperience.php +++ b/api/app/Models/CommunityExperience.php @@ -36,8 +36,6 @@ class CommunityExperience extends Experience /** * Default values for attributes - * - * @var array an array with attribute as key and default as value */ protected $attributes = [ 'experience_type' => CommunityExperience::class, diff --git a/api/app/Models/Department.php b/api/app/Models/Department.php index d9d0f91977f..809c49e1c6d 100644 --- a/api/app/Models/Department.php +++ b/api/app/Models/Department.php @@ -35,14 +35,13 @@ class Department extends Model 'name' => 'array', ]; - /** - * Model relations - */ + /** @return HasMany */ public function poolCandidateSearchRequests(): HasMany { return $this->hasMany(PoolCandidateSearchRequest::class); } + /** @return BelongsToMany */ public function teams(): BelongsToMany { return $this->belongsToMany(Team::class, 'team_department'); @@ -68,10 +67,8 @@ public static function scopeDepartmentsByIds(Builder $query, ?array $departmentI return $query; } - /** - * Get the pools for the department. - */ - public function pools() + /** @return HasMany */ + public function pools(): HasMany { return $this->hasMany(Pool::class); } diff --git a/api/app/Models/EducationExperience.php b/api/app/Models/EducationExperience.php index 7067bd7d2d5..994f1d0d8ab 100644 --- a/api/app/Models/EducationExperience.php +++ b/api/app/Models/EducationExperience.php @@ -38,8 +38,6 @@ class EducationExperience extends Experience /** * Default values for attributes - * - * @var array an array with attribute as key and default as value */ protected $attributes = [ 'experience_type' => EducationExperience::class, diff --git a/api/app/Models/Experience.php b/api/app/Models/Experience.php index 7f0a595999d..3b9674b9d76 100644 --- a/api/app/Models/Experience.php +++ b/api/app/Models/Experience.php @@ -8,10 +8,10 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Lang; +use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; /** @@ -21,6 +21,7 @@ * @property string $user_id * @property \Illuminate\Support\Carbon $start_date * @property ?\Illuminate\Support\Carbon $end_date + * @property ?\Illuminate\Support\Carbon $awarded_date * @property \Illuminate\Support\Carbon $created_at * @property \Illuminate\Support\Carbon $updated_at */ @@ -69,11 +70,13 @@ private function newInstanceFromType(string $type) return new $type; } + /** @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class); } + /** @return BelongsToMany */ public function userSkills(): BelongsToMany { return $this->belongsToMany(UserSkill::class, 'experience_skill', 'experience_id') @@ -83,7 +86,7 @@ public function userSkills(): BelongsToMany ->as('experience_skill'); } - public function skills(): HasManyThrough + public function skills(): HasManyDeep { return $this->hasManyDeepFromRelations($this->userSkills(), (new UserSkill)->skill()) ->withPivot('experience_skill', ['created_at', 'updated_at', 'details']) @@ -91,6 +94,7 @@ public function skills(): HasManyThrough ->withTrashed(); // from the deep relation $this->userSkills->skills fetch soft deleted skills but not userSkills } + /** @return HasMany */ public function experienceSkills(): HasMany { return $this->hasMany(ExperienceSkill::class); @@ -215,7 +219,6 @@ public function getDateRange($lang = 'en'): string { $format = 'MMM Y'; if ($this->attributes['experience_type'] === AwardExperience::class) { - /** @var AwardExperience $this */ return $this->awarded_date->locale($lang)->isoFormat($format); } diff --git a/api/app/Models/ExperienceSkill.php b/api/app/Models/ExperienceSkill.php index 615fd86db3e..4feb3733e20 100644 --- a/api/app/Models/ExperienceSkill.php +++ b/api/app/Models/ExperienceSkill.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; +use Staudenmeir\EloquentHasManyDeep\HasOneDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; /** @@ -27,17 +28,19 @@ class ExperienceSkill extends Model protected $table = 'experience_skill'; + /** @return BelongsTo */ public function experience(): BelongsTo { return $this->belongsTo(Experience::class); } + /** @return BelongsTo */ public function userSkill(): BelongsTo { return $this->belongsTo(UserSkill::class); } - public function skill() + public function skill(): HasOneDeep { return $this->hasOneDeepFromRelations($this->userSkill(), (new UserSkill)->skill()); } diff --git a/api/app/Models/GeneralQuestion.php b/api/app/Models/GeneralQuestion.php index c05c06f62e0..b09d79eb24e 100644 --- a/api/app/Models/GeneralQuestion.php +++ b/api/app/Models/GeneralQuestion.php @@ -49,11 +49,13 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } + /** @return BelongsTo */ public function pool(): BelongsTo { return $this->belongsTo(Pool::class); } + /** @return HasMany */ public function generalQuestionResponses(): HasMany { return $this->hasMany(GeneralQuestionResponse::class); diff --git a/api/app/Models/GeneralQuestionResponse.php b/api/app/Models/GeneralQuestionResponse.php index f9a0fd521fa..9c3476a906c 100644 --- a/api/app/Models/GeneralQuestionResponse.php +++ b/api/app/Models/GeneralQuestionResponse.php @@ -34,11 +34,13 @@ class GeneralQuestionResponse extends Model 'answer', ]; + /** @return BelongsTo */ public function poolCandidate(): BelongsTo { return $this->belongsTo(PoolCandidate::class); } + /** @return BelongsTo */ public function generalQuestion(): BelongsTo { return $this->belongsTo(GeneralQuestion::class)->select(['id', 'question', 'pool_id', 'sort_order']); diff --git a/api/app/Models/GenericJobTitle.php b/api/app/Models/GenericJobTitle.php index c148c0e40ba..2c91bdea3ed 100644 --- a/api/app/Models/GenericJobTitle.php +++ b/api/app/Models/GenericJobTitle.php @@ -32,6 +32,7 @@ class GenericJobTitle extends Model ]; + /** @return BelongsTo */ public function classification(): BelongsTo { return $this->belongsTo(Classification::class); diff --git a/api/app/Models/JobPosterTemplate.php b/api/app/Models/JobPosterTemplate.php index 7e89b033027..820dda1ea5d 100644 --- a/api/app/Models/JobPosterTemplate.php +++ b/api/app/Models/JobPosterTemplate.php @@ -63,17 +63,13 @@ class JobPosterTemplate extends Model 'nonessential_technical_skills_notes', ]; - /** - * Associated classification - */ + /** @return BelongsTo */ public function classification(): BelongsTo { return $this->belongsTo(Classification::class); } - /** - * Associated skills - */ + /** @return BelongsToMany */ public function skills(): BelongsToMany { return $this->belongsToMany(Skill::class) diff --git a/api/app/Models/PersonalExperience.php b/api/app/Models/PersonalExperience.php index 3d30d1cc616..ddc40772c5d 100644 --- a/api/app/Models/PersonalExperience.php +++ b/api/app/Models/PersonalExperience.php @@ -34,8 +34,6 @@ class PersonalExperience extends Experience /** * Default values for attributes - * - * @var array an array with attribute as key and default as value */ protected $attributes = [ 'experience_type' => PersonalExperience::class, diff --git a/api/app/Models/Pool.php b/api/app/Models/Pool.php index bc6812bfca7..d279a7dfcf8 100644 --- a/api/app/Models/Pool.php +++ b/api/app/Models/Pool.php @@ -180,11 +180,13 @@ public function poolBookmarks(): BelongsToMany return $this->belongsToMany(User::class, 'pool_user_bookmarks', 'pool_id', 'user_id')->withTimestamps(); } + /** @return BelongsTo */ public function legacyTeam(): BelongsTo { return $this->belongsTo(Team::class, 'team_id'); } + /** @return MorphOne */ public function team(): MorphOne { return $this->morphOne(Team::class, 'teamable'); @@ -192,17 +194,21 @@ public function team(): MorphOne /** * Get the department that owns the pool. + * + * @return BelongsTo */ public function department(): BelongsTo { return $this->belongsTo(Department::class); } + /** @return BelongsTo */ public function community(): BelongsTo { return $this->belongsTo(Community::class); } + /** @return HasManyThrough */ public function roleAssignments(): HasManyThrough { // I think this only works because we use UUIDs @@ -210,21 +216,25 @@ public function roleAssignments(): HasManyThrough return $this->hasManyThrough(RoleAssignment::class, Team::class, 'teamable_id'); } + /** @return BelongsTo */ public function classification(): BelongsTo { return $this->belongsTo(Classification::class); } + /** @return HasMany */ public function poolCandidates(): HasMany { return $this->hasMany(PoolCandidate::class); } + /** @return HasMany */ public function publishedPoolCandidates(): HasMany { return $this->hasMany(PoolCandidate::class)->notDraft(); } + /** @return BelongsToMany */ public function essentialSkills(): BelongsToMany { return $this->belongsToMany(Skill::class, 'pool_skill') @@ -233,6 +243,7 @@ public function essentialSkills(): BelongsToMany ->wherePivot('type', PoolSkillType::ESSENTIAL->name); } + /** @return BelongsToMany */ public function nonessentialSkills(): BelongsToMany { return $this->belongsToMany(Skill::class, 'pool_skill') @@ -241,11 +252,13 @@ public function nonessentialSkills(): BelongsToMany ->wherePivot('type', PoolSkillType::NONESSENTIAL->name); } + /** @return HasMany */ public function poolSkills(): HasMany { return $this->hasMany(PoolSkill::class); } + /** @return HasMany */ public function assessmentSteps(): HasMany { return $this->hasMany(AssessmentStep::class)->orderBy('sort_order', 'ASC'); @@ -325,11 +338,13 @@ public function syncApplicationScreeningStepPoolSkills() $screeningStep->poolSkills()->sync($technicalSkills); } + /** @returns HasMany */ public function generalQuestions(): HasMany { return $this->hasMany(GeneralQuestion::class)->select(['id', 'question', 'pool_id', 'sort_order']); } + /** @returns HasMany */ public function screeningQuestions(): HasMany { return $this->hasMany(ScreeningQuestion::class); diff --git a/api/app/Models/PoolCandidate.php b/api/app/Models/PoolCandidate.php index 615e38f6a0a..6d5fc08c744 100644 --- a/api/app/Models/PoolCandidate.php +++ b/api/app/Models/PoolCandidate.php @@ -49,7 +49,7 @@ * @property string $pool_id * @property string $user_id * @property ?\Illuminate\Support\Carbon $suspended_at - * @property Illuminate\Support\Carbon $created_at + * @property \Illuminate\Support\Carbon $created_at * @property ?\Illuminate\Support\Carbon $updated_at * @property array $submitted_steps * @property ?string $education_requirement_option @@ -122,8 +122,6 @@ class PoolCandidate extends Model /** * The model's default values for attributes. - * - * @var array */ protected $attributes = [ 'is_bookmarked' => false, @@ -158,21 +156,25 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } + /** @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } + /** @return BelongsTo */ public function pool(): BelongsTo { return $this->belongsTo(Pool::class)->select(Pool::getSelectableColumns())->withTrashed(); } + /** @return BelongsTo */ public function placedDepartment(): BelongsTo { return $this->belongsTo(Department::class); } + /** @return HasMany */ public function generalQuestionResponses(): HasMany { return $this->hasMany(GeneralQuestionResponse::class)->select([ @@ -183,12 +185,13 @@ public function generalQuestionResponses(): HasMany ]); } + /** @return HasMany */ public function screeningQuestionResponses(): HasMany { return $this->hasMany(ScreeningQuestionResponse::class); } - // education_requirement_option fulfilled by what experience models + /** @return BelongsToMany */ public function educationRequirementAwardExperiences(): BelongsToMany { return $this->belongsToMany( @@ -200,6 +203,7 @@ public function educationRequirementAwardExperiences(): BelongsToMany ->withTimestamps(); } + /** @return BelongsToMany */ public function educationRequirementCommunityExperiences(): BelongsToMany { return $this->belongsToMany( @@ -211,6 +215,7 @@ public function educationRequirementCommunityExperiences(): BelongsToMany ->withTimestamps(); } + /** @return BelongsToMany */ public function educationRequirementEducationExperiences(): BelongsToMany { return $this->belongsToMany( @@ -222,6 +227,7 @@ public function educationRequirementEducationExperiences(): BelongsToMany ->withTimestamps(); } + /** @return BelongsToMany */ public function educationRequirementPersonalExperiences(): BelongsToMany { return $this->belongsToMany( @@ -233,6 +239,7 @@ public function educationRequirementPersonalExperiences(): BelongsToMany ->withTimestamps(); } + /** @return BelongsToMany */ public function educationRequirementWorkExperiences(): BelongsToMany { return $this->belongsToMany( @@ -244,11 +251,13 @@ public function educationRequirementWorkExperiences(): BelongsToMany ->withTimestamps(); } + /** @return HasMany */ public function assessmentResults(): HasMany { return $this->hasMany(AssessmentResult::class); } + /** @return BelongsToMany */ public function educationRequirementExperiences(): BelongsToMany { return $this->belongsToMany( diff --git a/api/app/Models/PoolCandidateFilter.php b/api/app/Models/PoolCandidateFilter.php index 0f6afe413b5..ea7f9ff897f 100644 --- a/api/app/Models/PoolCandidateFilter.php +++ b/api/app/Models/PoolCandidateFilter.php @@ -42,16 +42,19 @@ class PoolCandidateFilter extends Model 'operational_requirements' => 'array', ]; + /** @return BelongsToMany */ public function classifications(): BelongsToMany { return $this->belongsToMany(Classification::class, 'classification_pool_candidate_filter'); } + /** @return BelongsToMany */ public function pools(): BelongsToMany { return $this->belongsToMany(Pool::class, 'pool_pool_candidate_filter'); } + /** @return HasOne */ public function poolCandidateSearchRequest(): HasOne { return $this->hasOne(PoolCandidateSearchRequest::class); diff --git a/api/app/Models/PoolCandidateSearchRequest.php b/api/app/Models/PoolCandidateSearchRequest.php index 23049c7bc32..a79bb0f06ae 100644 --- a/api/app/Models/PoolCandidateSearchRequest.php +++ b/api/app/Models/PoolCandidateSearchRequest.php @@ -99,24 +99,25 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } - /** - * Model relations - */ + /** @return BelongsTo */ public function department(): BelongsTo { return $this->belongsTo(Department::class); } + /** @return BelongsTo */ public function poolCandidateFilter(): BelongsTo { return $this->belongsTo(PoolCandidateFilter::class); } + /** @return BelongsTo */ public function applicantFilter(): BelongsTo { return $this->belongsTo(ApplicantFilter::class); } + /** @return BelongsTo */ public function community(): BelongsTo { return $this->belongsTo(Community::class); diff --git a/api/app/Models/PoolSkill.php b/api/app/Models/PoolSkill.php index a3c293ddec0..3eaca629429 100644 --- a/api/app/Models/PoolSkill.php +++ b/api/app/Models/PoolSkill.php @@ -42,22 +42,26 @@ protected static function boot() }); } + /** @return BelongsTo */ public function skill(): BelongsTo { return $this->belongsTo(Skill::class)->withTrashed(); } + /** @return BelongsTo */ public function pool(): BelongsTo { return $this->belongsTo(Pool::class); } + /** @return BelongsToMany */ public function assessmentSteps(): BelongsToMany { return $this->belongsToMany(AssessmentStep::class, 'assessment_step_pool_skill') ->withTimestamps(); } + /** @return HasMany */ public function assessmentResults(): HasMany { return $this->hasMany(AssessmentResult::class); diff --git a/api/app/Models/Role.php b/api/app/Models/Role.php index 62458b21770..8b310f1cb85 100644 --- a/api/app/Models/Role.php +++ b/api/app/Models/Role.php @@ -37,7 +37,7 @@ class Role extends LaratrustRole public $guarded = []; - // A relationship to the custom roleAssignments pivot model + /** @return HasMany */ public function roleAssignments(): HasMany { return $this->hasMany(RoleAssignment::class); diff --git a/api/app/Models/RoleAssignment.php b/api/app/Models/RoleAssignment.php index 51b016acdd8..8942b82b8af 100644 --- a/api/app/Models/RoleAssignment.php +++ b/api/app/Models/RoleAssignment.php @@ -32,11 +32,13 @@ class RoleAssignment extends Model 'team_id', ]; + /** @return BelongsTo */ public function role(): BelongsTo { return $this->belongsTo(Role::class); } + /** @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(Team::class); diff --git a/api/app/Models/ScreeningQuestion.php b/api/app/Models/ScreeningQuestion.php index 7ee1bf57f6d..2f2b77b3829 100644 --- a/api/app/Models/ScreeningQuestion.php +++ b/api/app/Models/ScreeningQuestion.php @@ -50,16 +50,19 @@ public function getActivitylogOptions(): LogOptions ->dontSubmitEmptyLogs(); } + /** @return BelongsTo */ public function pool(): BelongsTo { return $this->belongsTo(Pool::class); } + /** @return BelongsTo */ public function assessmentStep(): BelongsTo { return $this->belongsTo(AssessmentStep::class); } + /** @return HasMany */ public function screeningQuestionResponses(): HasMany { return $this->hasMany(ScreeningQuestionResponse::class); diff --git a/api/app/Models/ScreeningQuestionResponse.php b/api/app/Models/ScreeningQuestionResponse.php index 1dbb0f8b14f..c5336ddc70f 100644 --- a/api/app/Models/ScreeningQuestionResponse.php +++ b/api/app/Models/ScreeningQuestionResponse.php @@ -37,11 +37,13 @@ class ScreeningQuestionResponse extends Model 'answer', ]; + /** @return BelongsTo */ public function poolCandidate(): BelongsTo { return $this->belongsTo(PoolCandidate::class); } + /** @return BelongsTo */ public function screeningQuestion(): BelongsTo { return $this->belongsTo(ScreeningQuestion::class); diff --git a/api/app/Models/Skill.php b/api/app/Models/Skill.php index a181fcf9e07..34a79d6a5ce 100644 --- a/api/app/Models/Skill.php +++ b/api/app/Models/Skill.php @@ -46,21 +46,25 @@ class Skill extends Model */ protected $appends = ['details']; + /** @return BelongsToMany */ public function families(): BelongsToMany { return $this->belongsToMany(SkillFamily::class); } + /** @return HasMany */ public function userSkills(): HasMany { return $this->hasMany(UserSkill::class); } + /** @return BelongsToMany */ public function poolsEssentialSkills(): BelongsToMany { return $this->belongsToMany(Pool::class, 'pool_skill')->wherePivot('type', PoolSkillType::ESSENTIAL->name); } + /** @return BelongsToMany */ public function poolsNonessentialSkills(): BelongsToMany { return $this->belongsToMany(Pool::class, 'pool_skill')->wherePivot('type', PoolSkillType::NONESSENTIAL->name); diff --git a/api/app/Models/SkillFamily.php b/api/app/Models/SkillFamily.php index 5c7d2fc455d..81adac8a8ea 100644 --- a/api/app/Models/SkillFamily.php +++ b/api/app/Models/SkillFamily.php @@ -32,6 +32,7 @@ class SkillFamily extends Model 'description' => 'array', ]; + /** @return BelongsToMany */ public function skills(): BelongsToMany { return $this->belongsToMany(Skill::class); diff --git a/api/app/Models/Team.php b/api/app/Models/Team.php index d9d1a9d490c..b0831fbdee8 100644 --- a/api/app/Models/Team.php +++ b/api/app/Models/Team.php @@ -45,6 +45,7 @@ public function departments(): BelongsToMany return $this->belongsToMany(Department::class, 'team_department'); } + /** @return HasMany */ public function pools(): HasMany { return $this->hasMany(Pool::class); @@ -55,7 +56,7 @@ public function teamable(): MorphTo return $this->morphTo(); } - // A relationship to the custom roleAssignments pivot model + /** @return HasMany */ public function roleAssignments(): HasMany { return $this->hasMany(RoleAssignment::class); diff --git a/api/app/Models/User.php b/api/app/Models/User.php index 047d5e2989b..acce75e0aa5 100644 --- a/api/app/Models/User.php +++ b/api/app/Models/User.php @@ -36,6 +36,7 @@ use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\CausesActivity; use Spatie\Activitylog\Traits\LogsActivity; +use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; /** @@ -90,7 +91,10 @@ * @property ?array $enabled_email_notifications * @property ?array $enabled_in_app_notifications * @property \App\Models\Notification $unreadNotifications - * @property Collection<\App\Models\Notification> $notifications + * @property \Illuminate\Support\Collection<\App\Models\Notification> $notifications + * + * @method Builder|static authorizedToView() + * @method static Builder|static query() */ class User extends Model implements Authenticatable, HasLocalePreference, LaratrustUser { @@ -206,78 +210,89 @@ public function getActivitylogOptions(): LogOptions */ public function preferredLocale(): string { - return $this?->preferred_lang ?? 'en'; + return $this->preferred_lang ?? 'en'; } + /** @return HasMany */ public function pools(): HasMany { return $this->hasMany(Pool::class); } + /** @return BelongsToMany */ public function poolBookmarks(): BelongsToMany { return $this->belongsToMany(Pool::class, 'pool_user_bookmarks', 'user_id', 'pool_id')->withTimestamps(); } + /** @return HasMany */ public function poolCandidates(): HasMany { return $this->hasMany(PoolCandidate::class)->withTrashed(); } + /** @return BelongsTo */ public function department(): BelongsTo { return $this->belongsTo(Department::class, 'department') ->select(['id', 'name', 'department_number']); } + /** @return BelongsTo */ public function currentClassification(): BelongsTo { return $this->belongsTo(Classification::class, 'current_classification'); } - // All the relationships for experiences + /** @return HasMany */ public function awardExperiences(): HasMany { return $this->hasMany(AwardExperience::class); } + /** @return HasMany */ public function communityExperiences(): HasMany { return $this->hasMany(CommunityExperience::class); } + /** @return HasMany */ public function educationExperiences(): HasMany { return $this->hasMany(EducationExperience::class); } + /** @return HasMany */ public function personalExperiences(): HasMany { return $this->hasMany(PersonalExperience::class); } + /** @return HasMany */ public function workExperiences(): HasMany { return $this->hasMany(WorkExperience::class); } + /** @return HasMany */ public function experiences(): HasMany { return $this->hasMany(Experience::class); } - // A relationship to the custom roleAssignments pivot model + /** @return HasMany */ public function roleAssignments(): HasMany { return $this->hasMany(RoleAssignment::class); } + /** @return HasMany */ public function userSkills(): HasMany { return $this->hasMany(UserSkill::class, 'user_id'); } - public function skills() + public function skills(): HasManyDeep { return $this->hasManyDeepFromRelations($this->userSkills(), (new UserSkill)->skill()); } @@ -1142,7 +1157,7 @@ public function scopeAuthorizedToViewBasicInfo(Builder $query): void } // otherwise: use the regular authorized to view scope - /** @var \App\Models\User $query */ + /** @var Builder $query */ $query->authorizedToView(); } diff --git a/api/app/Models/UserSkill.php b/api/app/Models/UserSkill.php index 0905727c1f5..7bad2064814 100644 --- a/api/app/Models/UserSkill.php +++ b/api/app/Models/UserSkill.php @@ -16,6 +16,7 @@ * @property string $id * @property string $user_id * @property string $skill_id + * @property Skill $skill * @property string $skill_level * @property string $when_skill_used * @property int $top_skills_rank @@ -52,16 +53,19 @@ function (UserSkill $userSkill) { ); } + /** @return BelongsTo */ public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } + /** @return BelongsTo */ public function skill(): BelongsTo { return $this->belongsTo(Skill::class, 'skill_id')->withTrashed(); // include soft deleted skills } + /** @return BelongsToMany */ public function awardExperiences() { return $this->belongsToMany( @@ -76,6 +80,7 @@ public function awardExperiences() ->as('experience_skill'); } + /** @return BelongsToMany */ public function communityExperiences() { return $this->belongsToMany( @@ -90,6 +95,7 @@ public function communityExperiences() ->as('experience_skill'); } + /** @return BelongsToMany */ public function educationExperiences() { return $this->belongsToMany( @@ -104,6 +110,7 @@ public function educationExperiences() ->as('experience_skill'); } + /** @return BelongsToMany */ public function personalExperiences() { return $this->belongsToMany( @@ -118,6 +125,7 @@ public function personalExperiences() ->as('experience_skill'); } + /** @return BelongsToMany */ public function workExperiences() { return $this->belongsToMany( @@ -132,6 +140,7 @@ public function workExperiences() ->as('experience_skill'); } + /** @return BelongsToMany */ public function experiences(): BelongsToMany { return $this->belongsToMany( diff --git a/api/app/Models/WorkExperience.php b/api/app/Models/WorkExperience.php index 75579b4c907..ee951eeb62b 100644 --- a/api/app/Models/WorkExperience.php +++ b/api/app/Models/WorkExperience.php @@ -55,8 +55,6 @@ class WorkExperience extends Experience /** * Default values for attributes - * - * @var array an array with attribute as key and default as value */ protected $attributes = [ 'experience_type' => WorkExperience::class, diff --git a/api/app/Providers/RouteServiceProvider.php b/api/app/Providers/RouteServiceProvider.php index 161f34a4394..e61f747bb34 100644 --- a/api/app/Providers/RouteServiceProvider.php +++ b/api/app/Providers/RouteServiceProvider.php @@ -55,7 +55,7 @@ protected function configureRateLimiting() RateLimiter::for('api', function (Request $request) { return Limit::perMinute(config('app.rate_limit'))->by( - $request->user()?->id + $request->user()->id ?? $request->cookie('ai_user') ?? $request->ip() )->response(function () { @@ -66,7 +66,7 @@ protected function configureRateLimiting() }); RateLimiter::for('web', function (Request $request) { return Limit::perMinute(config('app.rate_limit'))->by( - $request->user()?->id + $request->user()->id ?? $request->cookie('ai_user') ?? $request->ip() )->response(function () { @@ -78,7 +78,7 @@ protected function configureRateLimiting() // This limiter is for the throttle directive which can be set independently of the route-based limiters and can raise graphql-style error messages. RateLimiter::for('graphql', function (Request $request) { return Limit::perMinute(config('app.rate_limit'))->by( - $request->user()?->id + $request->user()->id ?? $request->cookie('ai_user') ?? $request->ip() ); diff --git a/api/app/Traits/Generator/GeneratesFile.php b/api/app/Traits/Generator/GeneratesFile.php index 0f3a24d64d1..424ea5c48fd 100644 --- a/api/app/Traits/Generator/GeneratesFile.php +++ b/api/app/Traits/Generator/GeneratesFile.php @@ -30,7 +30,7 @@ protected function localizeEnum(?string $value, string $enum, ?string $subKey = return ''; } - /** @use \App\Traits\HasLocalization $enum */ + /** @use \App\Traits\HasLocalization $enum */ return $enum::localizedString($value, $subKey)[$this->lang] ?? ''; } diff --git a/api/app/Traits/Generator/GeneratesUserDoc.php b/api/app/Traits/Generator/GeneratesUserDoc.php index 69e7e7c37ac..c1853900853 100644 --- a/api/app/Traits/Generator/GeneratesUserDoc.php +++ b/api/app/Traits/Generator/GeneratesUserDoc.php @@ -21,6 +21,7 @@ use App\Models\EducationExperience; use App\Models\PersonalExperience; use App\Models\User; +use App\Models\UserSkill; use App\Models\WorkExperience; use Illuminate\Support\Collection; use PhpOffice\PhpWord\Element\Section; @@ -171,7 +172,7 @@ protected function workPreferences(Section $section, User $user, $headingRank = $section->addTitle($this->localizeHeading('work_preferences'), $headingRank); $section->addText($this->localizeHeading('contract_duration'), $this->strong); - foreach ($user?->position_duration ?? [] as $duration) { + foreach ($user->position_duration ?? [] as $duration) { $section->addListItem($this->localizeEnum($duration, PositionDuration::class)); } @@ -320,6 +321,7 @@ public function experience(Section $section, AwardExperience|CommunityExperience $experience->userSkills->each(function ($userSkill) use ($section) { $skillRun = $section->addListItemRun(); + /** @var UserSkill $userSkill */ $skillRun->addText($userSkill->skill->name[$this->lang], $this->strong); if (isset($userSkill->experience_skill->details)) { $skillRun->addText($this->colon().$userSkill->experience_skill->details); diff --git a/api/composer.json b/api/composer.json index 15fa15bb4de..6f8ebc4c040 100644 --- a/api/composer.json +++ b/api/composer.json @@ -34,7 +34,7 @@ "require-dev": { "brianium/paratest": "^7.4", "fakerphp/faker": "^1.9.1", - "larastan/larastan": "^2.0", + "larastan/larastan": "^3.0.2", "laravel/pint": "^1.11", "mockery/mockery": "^1.4.4", "phpunit/phpunit": "^10.0" diff --git a/api/composer.lock b/api/composer.lock index c98726b76c3..683d2c8da17 100644 --- a/api/composer.lock +++ b/api/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "af4c34f1ad4dc7e42f342a5f8e7258de", + "content-hash": "e5780e843af50fb14b19207b662e66f4", "packages": [ { "name": "amphp/amp", @@ -5663,16 +5663,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.4", + "version": "v0.12.5", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818" + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2fd717afa05341b4f8152547f142cd2f130f6818", - "reference": "2fd717afa05341b4f8152547f142cd2f130f6818", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/36a03ff27986682c22985e56aabaf840dd173cb5", + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5", "shasum": "" }, "require": { @@ -5699,12 +5699,12 @@ ], "type": "library", "extra": { - "branch-alias": { - "dev-main": "0.12.x-dev" - }, "bamarni-bin": { "bin-links": false, "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" } }, "autoload": { @@ -5736,9 +5736,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.4" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.5" }, - "time": "2024-06-10T01:18:23+00:00" + "time": "2024-11-29T06:14:30+00:00" }, { "name": "ralouphie/getallheaders", @@ -6064,12 +6064,12 @@ "type": "library", "extra": { "laravel": { - "providers": [ - "Laratrust\\LaratrustServiceProvider" - ], "aliases": { "Laratrust": "Laratrust\\LaratrustFacade" - } + }, + "providers": [ + "Laratrust\\LaratrustServiceProvider" + ] } }, "autoload": { @@ -6689,16 +6689,16 @@ }, { "name": "symfony/clock", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d" + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", "shasum": "" }, "require": { @@ -6743,7 +6743,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.6" + "source": "https://github.com/symfony/clock/tree/v7.2.0" }, "funding": [ { @@ -6759,20 +6759,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/console", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5" + "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5", - "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5", + "url": "https://api.github.com/repos/symfony/console/zipball/23c8aae6d764e2bae02d2a99f7532a7f6ed619cf", + "reference": "23c8aae6d764e2bae02d2a99f7532a7f6ed619cf", "shasum": "" }, "require": { @@ -6836,7 +6836,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.8" + "source": "https://github.com/symfony/console/tree/v7.2.0" }, "funding": [ { @@ -6852,20 +6852,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2024-11-06T14:24:19+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { @@ -6901,7 +6901,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.6" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, "funding": [ { @@ -6917,7 +6917,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6988,16 +6988,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.1.7", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342" + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342", - "reference": "010e44661f4c6babaf8c4862fe68c24a53903342", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/672b3dd1ef8b87119b446d67c58c106c43f965fe", + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe", "shasum": "" }, "require": { @@ -7043,7 +7043,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.7" + "source": "https://github.com/symfony/error-handler/tree/v7.2.0" }, "funding": [ { @@ -7059,20 +7059,20 @@ "type": "tidelift" } ], - "time": "2024-11-05T15:34:55+00:00" + "time": "2024-11-05T15:35:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87254c78dd50721cfd015b62277a8281c5589702" + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", - "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { @@ -7123,7 +7123,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { @@ -7139,7 +7139,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -7219,16 +7219,16 @@ }, { "name": "symfony/finder", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" + "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", - "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", + "url": "https://api.github.com/repos/symfony/finder/zipball/6de263e5868b9a137602dd1e33e4d48bfae99c49", + "reference": "6de263e5868b9a137602dd1e33e4d48bfae99c49", "shasum": "" }, "require": { @@ -7263,7 +7263,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.6" + "source": "https://github.com/symfony/finder/tree/v7.2.0" }, "funding": [ { @@ -7279,24 +7279,25 @@ "type": "tidelift" } ], - "time": "2024-10-01T08:31:23+00:00" + "time": "2024-10-23T06:56:12+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.1.9", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "82765842fb599c7ed839b650214680c7ee5779be" + "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/82765842fb599c7ed839b650214680c7ee5779be", - "reference": "82765842fb599c7ed839b650214680c7ee5779be", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e88a66c3997859532bc2ddd6dd8f35aba2711744", + "reference": "e88a66c3997859532bc2ddd6dd8f35aba2711744", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, @@ -7340,7 +7341,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.9" + "source": "https://github.com/symfony/http-foundation/tree/v7.2.0" }, "funding": [ { @@ -7356,20 +7357,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T18:58:36+00:00" + "time": "2024-11-13T18:58:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.9", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "649d0e23c571344ef1153d4ffb2564f534b85a45" + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/649d0e23c571344ef1153d4ffb2564f534b85a45", - "reference": "649d0e23c571344ef1153d4ffb2564f534b85a45", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", "shasum": "" }, "require": { @@ -7398,7 +7399,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -7426,7 +7427,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -7454,7 +7455,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.9" + "source": "https://github.com/symfony/http-kernel/tree/v7.2.0" }, "funding": [ { @@ -7470,20 +7471,20 @@ "type": "tidelift" } ], - "time": "2024-11-27T12:55:11+00:00" + "time": "2024-11-29T08:42:40+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd" + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd", - "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e4d358702fb66e4c8a2af08e90e7271a62de39cc", + "reference": "e4d358702fb66e4c8a2af08e90e7271a62de39cc", "shasum": "" }, "require": { @@ -7492,7 +7493,7 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7534,7 +7535,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.6" + "source": "https://github.com/symfony/mailer/tree/v7.2.0" }, "funding": [ { @@ -7550,20 +7551,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-11-25T15:21:05+00:00" }, { "name": "symfony/mime", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598" + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598", - "reference": "caa1e521edb2650b8470918dfe51708c237f0598", + "url": "https://api.github.com/repos/symfony/mime/zipball/cc84a4b81f62158c3846ac7ff10f696aae2b524d", + "reference": "cc84a4b81f62158c3846ac7ff10f696aae2b524d", "shasum": "" }, "require": { @@ -7618,7 +7619,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.6" + "source": "https://github.com/symfony/mime/tree/v7.2.0" }, "funding": [ { @@ -7634,7 +7635,7 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2024-11-23T09:19:39+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8274,16 +8275,16 @@ }, { "name": "symfony/process", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", + "url": "https://api.github.com/repos/symfony/process/zipball/d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", + "reference": "d34b22ba9390ec19d2dd966c40aa9e8462f27a7e", "shasum": "" }, "require": { @@ -8315,7 +8316,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.8" + "source": "https://github.com/symfony/process/tree/v7.2.0" }, "funding": [ { @@ -8331,20 +8332,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2024-11-06T14:24:19+00:00" }, { "name": "symfony/routing", - "version": "v7.1.9", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c" + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a27bb8e0cc3ca4baf17159d053910c9736c3aa4c", - "reference": "a27bb8e0cc3ca4baf17159d053910c9736c3aa4c", + "url": "https://api.github.com/repos/symfony/routing/zipball/e10a2450fa957af6c448b9b93c9010a4e4c0725e", + "reference": "e10a2450fa957af6c448b9b93c9010a4e4c0725e", "shasum": "" }, "require": { @@ -8396,7 +8397,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.9" + "source": "https://github.com/symfony/routing/tree/v7.2.0" }, "funding": [ { @@ -8412,7 +8413,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T16:12:35+00:00" + "time": "2024-11-25T11:08:51+00:00" }, { "name": "symfony/service-contracts", @@ -8499,16 +8500,16 @@ }, { "name": "symfony/string", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { @@ -8566,7 +8567,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.8" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -8582,24 +8583,25 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:21+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { "name": "symfony/translation", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "url": "https://api.github.com/repos/symfony/translation/zipball/dc89e16b44048ceecc879054e5b7f38326ab6cc5", + "reference": "dc89e16b44048ceecc879054e5b7f38326ab6cc5", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, @@ -8660,7 +8662,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.6" + "source": "https://github.com/symfony/translation/tree/v7.2.0" }, "funding": [ { @@ -8676,7 +8678,7 @@ "type": "tidelift" } ], - "time": "2024-09-28T12:35:13+00:00" + "time": "2024-11-12T20:47:56+00:00" }, { "name": "symfony/translation-contracts", @@ -8758,16 +8760,16 @@ }, { "name": "symfony/uid", - "version": "v7.1.6", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "65befb3bb2d503bbffbd08c815aa38b472999917" + "reference": "2d294d0c48df244c71c105a169d0190bfb080426" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917", - "reference": "65befb3bb2d503bbffbd08c815aa38b472999917", + "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", + "reference": "2d294d0c48df244c71c105a169d0190bfb080426", "shasum": "" }, "require": { @@ -8812,7 +8814,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.1.6" + "source": "https://github.com/symfony/uid/tree/v7.2.0" }, "funding": [ { @@ -8828,20 +8830,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.8", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8" + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", - "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", "shasum": "" }, "require": { @@ -8857,7 +8859,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -8895,7 +8897,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" }, "funding": [ { @@ -8911,7 +8913,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:46:42+00:00" + "time": "2024-11-08T15:48:14+00:00" }, { "name": "thecodingmachine/safe", @@ -9757,28 +9759,28 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.6", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", - "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", + "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", "shasum": "" }, "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" + "composer-runtime-api": "^2.1.0", + "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" + "phpunit/phpunit": "^7.5|^8.5|^9.6", + "vimeo/psalm": "^4.3 || ^5.0" }, "type": "library", "extra": { @@ -9810,46 +9812,46 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" }, - "time": "2024-03-08T09:58:59+00:00" + "time": "2024-11-18T16:19:46+00:00" }, { "name": "larastan/larastan", - "version": "v2.9.12", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "19012b39fbe4dede43dbe0c126d9681827a5e908" + "reference": "b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/19012b39fbe4dede43dbe0c126d9681827a5e908", - "reference": "19012b39fbe4dede43dbe0c126d9681827a5e908", + "url": "https://api.github.com/repos/larastan/larastan/zipball/b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f", + "reference": "b2e24e1605cff1d1097ccb6fb8af3bbd1dfe1c6f", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/console": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/container": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/contracts": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/database": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/http": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/pipeline": "^9.52.16 || ^10.28.0 || ^11.16", - "illuminate/support": "^9.52.16 || ^10.28.0 || ^11.16", - "php": "^8.0.2", + "illuminate/console": "^11.15.0", + "illuminate/container": "^11.15.0", + "illuminate/contracts": "^11.15.0", + "illuminate/database": "^11.15.0", + "illuminate/http": "^11.15.0", + "illuminate/pipeline": "^11.15.0", + "illuminate/support": "^11.15.0", + "php": "^8.2", "phpmyadmin/sql-parser": "^5.9.0", - "phpstan/phpstan": "^1.12.11" + "phpstan/phpstan": "^2.0.2" }, "require-dev": { "doctrine/coding-standard": "^12.0", - "laravel/framework": "^9.52.16 || ^10.28.0 || ^11.16", - "mockery/mockery": "^1.5.1", - "nikic/php-parser": "^4.19.1", - "orchestra/canvas": "^7.11.1 || ^8.11.0 || ^9.0.2", - "orchestra/testbench-core": "^7.33.0 || ^8.13.0 || ^9.0.9", - "phpstan/phpstan-deprecation-rules": "^1.2", - "phpunit/phpunit": "^9.6.13 || ^10.5.16" + "laravel/framework": "^11.15.0", + "mockery/mockery": "^1.6", + "nikic/php-parser": "^5.3", + "orchestra/canvas": "^v9.1.3", + "orchestra/testbench-core": "^9.5.2", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpunit/phpunit": "^10.5.16" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" @@ -9884,7 +9886,7 @@ "email": "enunomaduro@gmail.com" } ], - "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel", + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", "keywords": [ "PHPStan", "code analyse", @@ -9897,7 +9899,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v2.9.12" + "source": "https://github.com/larastan/larastan/tree/v3.0.2" }, "funding": [ { @@ -9905,7 +9907,7 @@ "type": "github" } ], - "time": "2024-11-26T23:09:02+00:00" + "time": "2024-11-26T23:15:21+00:00" }, { "name": "laravel/pint", @@ -10323,20 +10325,20 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.11", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733" + "reference": "46b4d3529b12178112d9008337beda0cc2a1a6b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", - "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/46b4d3529b12178112d9008337beda0cc2a1a6b4", + "reference": "46b4d3529b12178112d9008337beda0cc2a1a6b4", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -10377,7 +10379,7 @@ "type": "github" } ], - "time": "2024-11-17T14:08:01+00:00" + "time": "2024-11-28T22:19:37+00:00" }, { "name": "phpunit/php-code-coverage", @@ -11770,13 +11772,13 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.2" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "8.2.9" }, diff --git a/api/phpstan-baseline.neon b/api/phpstan-baseline.neon new file mode 100644 index 00000000000..a29fd0dad3d --- /dev/null +++ b/api/phpstan-baseline.neon @@ -0,0 +1,13 @@ +parameters: + ignoreErrors: + - + message: '#^PHPDoc tag @var with type callable\(\)\: GraphQL\\Type\\Definition\\Type&GraphQL\\Type\\Definition\\NamedType is not subtype of native type Closure\(\)\: GraphQL\\Type\\Definition\\EnumType\.$#' + identifier: varTag.nativeType + count: 2 + path: app/Providers/GraphQLServiceProvider.php + + - + message: '#^Trait App\\Traits\\ExperienceFactoryWithSkills is used zero times and is not analysed\.$#' + identifier: trait.unused + count: 1 + path: app/Traits/ExperienceFactoryWithSkills.php diff --git a/api/phpstan.neon b/api/phpstan.neon index dd71fd89ca7..75778c25c4c 100644 --- a/api/phpstan.neon +++ b/api/phpstan.neon @@ -1,5 +1,6 @@ includes: - vendor/larastan/larastan/extension.neon + - phpstan-baseline.neon parameters: treatPhpDocTypesAsCertain: false diff --git a/api/programmatic-types.graphql b/api/programmatic-types.graphql index fba709073f9..d7b8a86cbad 100644 --- a/api/programmatic-types.graphql +++ b/api/programmatic-types.graphql @@ -89,6 +89,11 @@ type LocalizedCourseLanguage { label: LocalizedString! } +type LocalizedDeadlineStatus { + value: DeadlineStatus! + label: LocalizedString! +} + type LocalizedEducationRequirementOption { value: EducationRequirementOption! label: LocalizedString! @@ -149,11 +154,6 @@ type LocalizedGovEmployeeType { label: LocalizedString! } -type LocalizedGovEmploymentType { - value: GovEmploymentType! - label: LocalizedString! -} - type LocalizedGovPositionType { value: GovPositionType! label: LocalizedString! @@ -279,6 +279,11 @@ type LocalizedSupervisoryStatus { label: LocalizedString! } +type LocalizedWorkExperienceGovEmployeeType { + value: WorkExperienceGovEmployeeType! + label: LocalizedString! +} + type LocalizedWorkRegion { value: WorkRegion! label: LocalizedString! @@ -298,7 +303,7 @@ scalar Boolean """ The `Int` scalar type represents non-fractional signed whole numeric -values. Int can represent values between -(2^31) and 2^31 - 1. +values. Int can represent values between -(2^31) and 2^31 - 1. """ scalar Int @@ -772,6 +777,11 @@ enum CourseLanguage { BILINGUAL } +enum DeadlineStatus { + PUBLISHED + EXPIRED +} + enum AdvertisementType { INTERNAL EXTERNAL @@ -1058,14 +1068,6 @@ enum GovEmployeeType { INDETERMINATE } -enum GovEmploymentType { - STUDENT - CASUAL - TERM - INDETERMINATE - CONTRACTOR -} - enum GovPositionType { SUBSTANTIVE ACTING @@ -1276,6 +1278,14 @@ enum WhenSkillUsed { PAST } +enum WorkExperienceGovEmployeeType { + STUDENT + CASUAL + TERM + INDETERMINATE + CONTRACTOR +} + enum WorkRegion { TELEWORK NATIONAL_CAPITAL