diff --git a/.gitignore b/.gitignore index ad890cc40f..008f36801c 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,7 @@ app-modules/**/vendor app-modules/**/resources/js/dist/* /.phpactor.json **/.DS_Store +public/api-docs/* +/_lighthouse_ide_helper.php +/programmatic-types.graphql +/schema-directives.graphql diff --git a/.prettierignore b/.prettierignore index 8be7e84f0d..ac87be042c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ resources/views/vendor/mail/**/*.blade.php resources/views/mail/**/*.blade.php resources/lang/**/*.php -**/vendor \ No newline at end of file +**/vendor +app-modules/notifications/graphql/notifications.graphql \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json index 2cf6828881..5c21f158f2 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -27,6 +27,9 @@ "options": { "tabWidth": 4 } - } + }, + { + "files": ["*.graphql"] + } ] } diff --git a/app-modules/alert/src/Policies/AlertPolicy.php b/app-modules/alert/src/Policies/AlertPolicy.php index 0d383fc602..fe6a8e3ef2 100644 --- a/app-modules/alert/src/Policies/AlertPolicy.php +++ b/app-modules/alert/src/Policies/AlertPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Alert\Policies; -use App\Models\User; +use App\Models\Authenticatable; use AdvisingApp\Alert\Models\Alert; use Illuminate\Auth\Access\Response; class AlertPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'alert.view-any', denyResponse: 'You do not have permission to view alerts.' ); } - public function view(User $user, Alert $alert): Response + public function view(Authenticatable $authenticatable, Alert $alert): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['alert.*.view', "alert.{$alert->id}.view"], denyResponse: 'You do not have permission to view this alert.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'alert.create', denyResponse: 'You do not have permission to create alerts.' ); } - public function update(User $user, Alert $alert): Response + public function update(Authenticatable $authenticatable, Alert $alert): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['alert.*.update', "alert.{$alert->id}.update"], denyResponse: 'You do not have permission to update this alert.' ); } - public function delete(User $user, Alert $alert): Response + public function delete(Authenticatable $authenticatable, Alert $alert): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['alert.*.delete', "alert.{$alert->id}.delete"], denyResponse: 'You do not have permission to delete this alert.' ); } - public function restore(User $user, Alert $alert): Response + public function restore(Authenticatable $authenticatable, Alert $alert): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['alert.*.restore', "alert.{$alert->id}.restore"], denyResponse: 'You do not have permission to restore this alert.' ); } - public function forceDelete(User $user, Alert $alert): Response + public function forceDelete(Authenticatable $authenticatable, Alert $alert): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['alert.*.force-delete', "alert.{$alert->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this alert.' ); diff --git a/app-modules/application/src/Policies/ApplicationPolicy.php b/app-modules/application/src/Policies/ApplicationPolicy.php index 33ab38f3d3..5b7282db4f 100644 --- a/app-modules/application/src/Policies/ApplicationPolicy.php +++ b/app-modules/application/src/Policies/ApplicationPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\Application\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Application\Models\Application; use App\Concerns\FeatureAccessEnforcedPolicyBefore; @@ -47,57 +47,57 @@ class ApplicationPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'application.view-any', denyResponse: 'You do not have permission to view applications.' ); } - public function view(User $user, Application $application): Response + public function view(Authenticatable $authenticatable, Application $application): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['application.*.view', "application.{$application->id}.view"], denyResponse: 'You do not have permission to view this application.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'application.create', denyResponse: 'You do not have permission to create applications.' ); } - public function update(User $user, Application $application): Response + public function update(Authenticatable $authenticatable, Application $application): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['application.*.update', "application.{$application->id}.update"], denyResponse: 'You do not have permission to update this application.' ); } - public function delete(User $user, Application $application): Response + public function delete(Authenticatable $authenticatable, Application $application): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['application.*.delete', "application.{$application->id}.delete"], denyResponse: 'You do not have permission to delete this application.' ); } - public function restore(User $user, Application $application): Response + public function restore(Authenticatable $authenticatable, Application $application): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['application.*.restore', "application.{$application->id}.restore"], denyResponse: 'You do not have permission to restore this application.' ); } - public function forceDelete(User $user, Application $application): Response + public function forceDelete(Authenticatable $authenticatable, Application $application): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['application.*.force-delete', "application.{$application->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this application.' ); diff --git a/app-modules/assistant/src/Policies/AssistantChatMessageLogPolicy.php b/app-modules/assistant/src/Policies/AssistantChatMessageLogPolicy.php index e69284ff25..5addc25240 100644 --- a/app-modules/assistant/src/Policies/AssistantChatMessageLogPolicy.php +++ b/app-modules/assistant/src/Policies/AssistantChatMessageLogPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\Assistant\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; use App\Policies\Contracts\FeatureAccessEnforcedPolicy; @@ -47,43 +47,43 @@ class AssistantChatMessageLogPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'assistant_chat_message_log.view-any', denyResponse: 'You do not have permission to view assistant chat message logs.' ); } - public function view(User $user, AssistantChatMessageLog $assistantChatMessageLog): Response + public function view(Authenticatable $authenticatable, AssistantChatMessageLog $assistantChatMessageLog): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['assistant_chat_message_log.*.view', "assistant_chat_message_log.{$assistantChatMessageLog->id}.view"], denyResponse: 'You do not have permission to view this assistant chat message log.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Assistant chat message logs cannot be created.'); } - public function update(User $user, AssistantChatMessageLog $assistantChatMessageLog): Response + public function update(Authenticatable $authenticatable, AssistantChatMessageLog $assistantChatMessageLog): Response { return Response::deny('Assistant chat message logs cannot be updated.'); } - public function delete(User $user, AssistantChatMessageLog $assistantChatMessageLog): Response + public function delete(Authenticatable $authenticatable, AssistantChatMessageLog $assistantChatMessageLog): Response { return Response::deny('Assistant chat message logs cannot be deleted.'); } - public function restore(User $user, AssistantChatMessageLog $assistantChatMessageLog): Response + public function restore(Authenticatable $authenticatable, AssistantChatMessageLog $assistantChatMessageLog): Response { return Response::deny('Assistant chat message logs cannot be restored.'); } - public function forceDelete(User $user, AssistantChatMessageLog $assistantChatMessageLog): Response + public function forceDelete(Authenticatable $authenticatable, AssistantChatMessageLog $assistantChatMessageLog): Response { return Response::deny('Assistant chat message logs cannot be force deleted.'); } diff --git a/app-modules/audit/src/Policies/AuditPolicy.php b/app-modules/audit/src/Policies/AuditPolicy.php index 34e35759d8..6815132140 100644 --- a/app-modules/audit/src/Policies/AuditPolicy.php +++ b/app-modules/audit/src/Policies/AuditPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Audit\Policies; -use App\Models\User; +use App\Models\Authenticatable; use AdvisingApp\Audit\Models\Audit; use Illuminate\Auth\Access\Response; class AuditPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'audit.view-any', denyResponse: 'You do not have permission to view audits.' ); } - public function view(User $user, Audit $audit): Response + public function view(Authenticatable $authenticatable, Audit $audit): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['audit.*.view', "audit.{$audit->id}.view"], denyResponse: 'You do not have permission to view this audit.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'audit.create', denyResponse: 'You do not have permission to create audits.' ); } - public function update(User $user, Audit $audit): Response + public function update(Authenticatable $authenticatable, Audit $audit): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['audit.*.update', "audit.{$audit->id}.update"], denyResponse: 'You do not have permission to update this audit.' ); } - public function delete(User $user, Audit $audit): Response + public function delete(Authenticatable $authenticatable, Audit $audit): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['audit.*.delete', "audit.{$audit->id}.delete"], denyResponse: 'You do not have permission to delete this audit.' ); } - public function restore(User $user, Audit $audit): Response + public function restore(Authenticatable $authenticatable, Audit $audit): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['audit.*.restore', "audit.{$audit->id}.restore"], denyResponse: 'You do not have permission to restore this audit.' ); } - public function forceDelete(User $user, Audit $audit): Response + public function forceDelete(Authenticatable $authenticatable, Audit $audit): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['audit.*.force-delete', "audit.{$audit->id}.force-delete"], denyResponse: 'You do not have permission to force delete this audit.' ); diff --git a/app-modules/authorization/src/Policies/PermissionPolicy.php b/app-modules/authorization/src/Policies/PermissionPolicy.php index bd96e530a4..8c0ab9dbd1 100644 --- a/app-modules/authorization/src/Policies/PermissionPolicy.php +++ b/app-modules/authorization/src/Policies/PermissionPolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\Authorization\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Authorization\Models\Permission; class PermissionPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'permission.view-any', denyResponse: 'You do not have permission to view permissions.' ); } - public function view(User $user, Permission $permission): Response + public function view(Authenticatable $authenticatable, Permission $permission): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['permission.*.view', "permission.{$permission->id}.view"], denyResponse: 'You do not have permission to view this permission.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Permissions cannot be created.'); } - public function update(User $user, Permission $permission): Response + public function update(Authenticatable $authenticatable, Permission $permission): Response { return Response::deny('Permissions cannot be updated.'); } - public function delete(User $user, Permission $permission): Response + public function delete(Authenticatable $authenticatable, Permission $permission): Response { return Response::deny('Permissions cannot be deleted.'); } - public function restore(User $user, Permission $permission): Response + public function restore(Authenticatable $authenticatable, Permission $permission): Response { return Response::deny('Permissions cannot be restored.'); } - public function forceDelete(User $user, Permission $permission): Response + public function forceDelete(Authenticatable $authenticatable, Permission $permission): Response { return Response::deny('Permissions cannot be force deleted.'); } diff --git a/app-modules/authorization/src/Policies/RoleGroupPolicy.php b/app-modules/authorization/src/Policies/RoleGroupPolicy.php index dde6acfcbd..019bcc4326 100644 --- a/app-modules/authorization/src/Policies/RoleGroupPolicy.php +++ b/app-modules/authorization/src/Policies/RoleGroupPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Authorization\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Authorization\Models\RoleGroup; class RoleGroupPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'role_group.view-any', denyResponse: 'You do not have permission to view role groups.' ); } - public function view(User $user, RoleGroup $roleGroup): Response + public function view(Authenticatable $authenticatable, RoleGroup $roleGroup): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role_group.*.view', "role_group.{$roleGroup->id}.view"], denyResponse: 'You do not have permission to view this role group.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'role_group.create', denyResponse: 'You do not have permission to create role groups.' ); } - public function update(User $user, RoleGroup $roleGroup): Response + public function update(Authenticatable $authenticatable, RoleGroup $roleGroup): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role_group.*.update', "role_group.{$roleGroup->id}.update"], denyResponse: 'You do not have permission to update this role group.' ); } - public function delete(User $user, RoleGroup $roleGroup): Response + public function delete(Authenticatable $authenticatable, RoleGroup $roleGroup): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role_group.*.delete', "role_group.{$roleGroup->id}.delete"], denyResponse: 'You do not have permission to delete this role group.' ); } - public function restore(User $user, RoleGroup $roleGroup): Response + public function restore(Authenticatable $authenticatable, RoleGroup $roleGroup): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role_group.*.restore', "role_group.{$roleGroup->id}.restore"], denyResponse: 'You do not have permission to restore this role group.' ); } - public function forceDelete(User $user, RoleGroup $roleGroup): Response + public function forceDelete(Authenticatable $authenticatable, RoleGroup $roleGroup): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role_group.*.force-delete', "role_group.{$roleGroup->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this role group.' ); diff --git a/app-modules/authorization/src/Policies/RolePolicy.php b/app-modules/authorization/src/Policies/RolePolicy.php index e9f1ccb7ab..3f1dd2721f 100644 --- a/app-modules/authorization/src/Policies/RolePolicy.php +++ b/app-modules/authorization/src/Policies/RolePolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\Authorization\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Authorization\Models\Role; class RolePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'role.view-any', denyResponse: 'You do not have permission to view roles.' ); } - public function view(User $user, Role $role): Response + public function view(Authenticatable $authenticatable, Role $role): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['role.*.view', "role.{$role->id}.view"], denyResponse: 'You do not have permission to view this role.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Roles cannot be created.'); } - public function update(User $user, Role $role): Response + public function update(Authenticatable $authenticatable, Role $role): Response { return Response::deny('Roles cannot be updated.'); } - public function delete(User $user, Role $role): Response + public function delete(Authenticatable $authenticatable, Role $role): Response { return Response::deny('Roles cannot be deleted.'); } - public function restore(User $user, Role $role): Response + public function restore(Authenticatable $authenticatable, Role $role): Response { return Response::deny('Roles cannot be restored.'); } - public function forceDelete(User $user, Role $role): Response + public function forceDelete(Authenticatable $authenticatable, Role $role): Response { return Response::deny('Roles cannot be force deleted.'); } diff --git a/app-modules/campaign/src/Policies/CampaignActionPolicy.php b/app-modules/campaign/src/Policies/CampaignActionPolicy.php index df92f3a8de..54e755761d 100644 --- a/app-modules/campaign/src/Policies/CampaignActionPolicy.php +++ b/app-modules/campaign/src/Policies/CampaignActionPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Campaign\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Campaign\Models\CampaignAction; class CampaignActionPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'campaign_action.view-any', denyResponse: 'You do not have permission to view campaign actions.' ); } - public function view(User $user, CampaignAction $campaignAction): Response + public function view(Authenticatable $authenticatable, CampaignAction $campaignAction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign_action.*.view', "campaign_action.{$campaignAction->id}.view"], denyResponse: 'You do not have permission to view this campaign action.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'campaign_action.create', denyResponse: 'You do not have permission to create campaign actions.' ); } - public function update(User $user, CampaignAction $campaignAction): Response + public function update(Authenticatable $authenticatable, CampaignAction $campaignAction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign_action.*.update', "campaign_action.{$campaignAction->id}.update"], denyResponse: 'You do not have permission to update this campaign action.' ); } - public function delete(User $user, CampaignAction $campaignAction): Response + public function delete(Authenticatable $authenticatable, CampaignAction $campaignAction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign_action.*.delete', "campaign_action.{$campaignAction->id}.delete"], denyResponse: 'You do not have permission to delete this campaign action.' ); } - public function restore(User $user, CampaignAction $campaignAction): Response + public function restore(Authenticatable $authenticatable, CampaignAction $campaignAction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign_action.*.restore', "campaign_action.{$campaignAction->id}.restore"], denyResponse: 'You do not have permission to restore this campaign action.' ); } - public function forceDelete(User $user, CampaignAction $campaignAction): Response + public function forceDelete(Authenticatable $authenticatable, CampaignAction $campaignAction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign_action.*.force-delete', "campaign_action.{$campaignAction->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this campaign action.' ); diff --git a/app-modules/campaign/src/Policies/CampaignPolicy.php b/app-modules/campaign/src/Policies/CampaignPolicy.php index 33fe87c70e..560c4f50bb 100644 --- a/app-modules/campaign/src/Policies/CampaignPolicy.php +++ b/app-modules/campaign/src/Policies/CampaignPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Campaign\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Campaign\Models\Campaign; class CampaignPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'campaign.view-any', denyResponse: 'You do not have permission to view campaigns.' ); } - public function view(User $user, Campaign $campaign): Response + public function view(Authenticatable $authenticatable, Campaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign.*.view', "campaign.{$campaign->id}.view"], denyResponse: 'You do not have permission to view this campaign.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'campaign.create', denyResponse: 'You do not have permission to create campaigns.' ); } - public function update(User $user, Campaign $campaign): Response + public function update(Authenticatable $authenticatable, Campaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign.*.update', "campaign.{$campaign->id}.update"], denyResponse: 'You do not have permission to update this campaign.' ); } - public function delete(User $user, Campaign $campaign): Response + public function delete(Authenticatable $authenticatable, Campaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign.*.delete', "campaign.{$campaign->id}.delete"], denyResponse: 'You do not have permission to delete this campaign.' ); } - public function restore(User $user, Campaign $campaign): Response + public function restore(Authenticatable $authenticatable, Campaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign.*.restore', "campaign.{$campaign->id}.restore"], denyResponse: 'You do not have permission to restore this campaign.' ); } - public function forceDelete(User $user, Campaign $campaign): Response + public function forceDelete(Authenticatable $authenticatable, Campaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['campaign.*.force-delete', "campaign.{$campaign->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this campaign.' ); diff --git a/app-modules/care-team/graphql/care-team.graphql b/app-modules/care-team/graphql/care-team.graphql new file mode 100644 index 0000000000..635b180d0d --- /dev/null +++ b/app-modules/care-team/graphql/care-team.graphql @@ -0,0 +1,56 @@ +type UserCareTeam @model(class: "AdvisingApp\\CareTeam\\Models\\CareTeam") { + "Unique primary key." + id: ID! + "The user related to this care team assignment." + user: User! @belongsTo + "The educatable in the user's care team." + educatable: Educatable! @morphTo + "The created date of the care team assignment." + created_at: DateTime + "The updated date of the care team assignment." + updated_at: DateTime +} + +extend type Query { + "Get a care team assignment by its primary key." + userCareTeam("Search by primary key." id: ID! @whereKey): UserCareTeam + @find + @canResolved(ability: "view") + + "Get all care team assignments." + userCareTeams: [UserCareTeam!]! @paginate @canModel(ability: "viewAny") +} + +extend type Mutation { + "Create a new care team assignment." + createUserCareTeam( + "The user to add to the care team of." + user_id: ID! + @rules( + apply: [ + "required" + "exists:users,id" + "AdvisingApp\\CareTeam\\Rules\\UniqueCareTeamRule" + ] + ) + + "The educatable to add to the care team." + educatable_id: ID! + @rules( + apply: [ + "required" + "AdvisingApp\\CareTeam\\Rules\\EducatableIdExistsRule" + ] + ) + + "The type of educatable to add to the care team." + educatable_type: String! + @rules(apply: ["required", "in:student,prospect"]) + ): UserCareTeam! @create @canModel(ability: "create") + + "Delete an existing care team assignment." + deleteUserCareTeam( + "The primary key of the care team assignment." + id: ID! @whereKey + ): UserCareTeam @delete @canFind(ability: "delete", find: "id") +} diff --git a/app-modules/care-team/src/Models/CareTeam.php b/app-modules/care-team/src/Models/CareTeam.php index 0b8bb77b30..c5e0a26280 100644 --- a/app-modules/care-team/src/Models/CareTeam.php +++ b/app-modules/care-team/src/Models/CareTeam.php @@ -70,7 +70,7 @@ public function educatable(): MorphTo public function user(): BelongsTo { - return $this->belongsTo(User::class)->withTimestamps(); + return $this->belongsTo(User::class); } public static function executeFromCampaignAction(CampaignAction $action): bool|string diff --git a/app-modules/care-team/src/Policies/CareTeamPolicy.php b/app-modules/care-team/src/Policies/CareTeamPolicy.php index de2d400c42..34a5bb0c8d 100644 --- a/app-modules/care-team/src/Policies/CareTeamPolicy.php +++ b/app-modules/care-team/src/Policies/CareTeamPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\CareTeam\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\CareTeam\Models\CareTeam; class CareTeamPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'care_team.view-any', denyResponse: 'You do not have permission to view care teams.' ); } - public function view(User $user, CareTeam $careTeam): Response + public function view(Authenticatable $authenticatable, CareTeam $careTeam): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['care_team.*.view', "care_team.{$careTeam->id}.view"], denyResponse: 'You do not have permission to view this care team.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'care_team.create', denyResponse: 'You do not have permission to create care teams.' ); } - public function update(User $user, CareTeam $careTeam): Response + public function update(Authenticatable $authenticatable, CareTeam $careTeam): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['care_team.*.update', "care_team.{$careTeam->id}.update"], denyResponse: 'You do not have permission to update this care team.' ); } - public function delete(User $user, CareTeam $careTeam): Response + public function delete(Authenticatable $authenticatable, CareTeam $careTeam): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['care_team.*.delete', "care_team.{$careTeam->id}.delete"], denyResponse: 'You do not have permission to delete this care team.' ); } - public function restore(User $user, CareTeam $careTeam): Response + public function restore(Authenticatable $authenticatable, CareTeam $careTeam): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['care_team.*.restore', "care_team.{$careTeam->id}.restore"], denyResponse: 'You do not have permission to restore this care team.' ); } - public function forceDelete(User $user, CareTeam $careTeam): Response + public function forceDelete(Authenticatable $authenticatable, CareTeam $careTeam): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['care_team.*.force-delete', "care_team.{$careTeam->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this care team.' ); diff --git a/app-modules/care-team/src/Providers/CareTeamServiceProvider.php b/app-modules/care-team/src/Providers/CareTeamServiceProvider.php index ec3644914b..f9a6e38369 100644 --- a/app-modules/care-team/src/Providers/CareTeamServiceProvider.php +++ b/app-modules/care-team/src/Providers/CareTeamServiceProvider.php @@ -37,6 +37,7 @@ namespace AdvisingApp\CareTeam\Providers; use Filament\Panel; +use App\Concerns\GraphSchemaDiscovery; use Illuminate\Support\ServiceProvider; use AdvisingApp\CareTeam\CareTeamPlugin; use AdvisingApp\CareTeam\Models\CareTeam; @@ -46,6 +47,8 @@ class CareTeamServiceProvider extends ServiceProvider { + use GraphSchemaDiscovery; + public function register(): void { Panel::configureUsing(fn (Panel $panel) => $panel->plugin(new CareTeamPlugin())); @@ -58,6 +61,8 @@ public function boot(): void ]); $this->registerRolesAndPermissions(); + + $this->discoverSchema(__DIR__ . '/../../graphql/care-team.graphql'); } protected function registerRolesAndPermissions(): void diff --git a/app-modules/care-team/src/Rules/EducatableIdExistsRule.php b/app-modules/care-team/src/Rules/EducatableIdExistsRule.php new file mode 100644 index 0000000000..83306751b0 --- /dev/null +++ b/app-modules/care-team/src/Rules/EducatableIdExistsRule.php @@ -0,0 +1,65 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +namespace AdvisingApp\CareTeam\Rules; + +use Closure; +use Illuminate\Contracts\Validation\DataAwareRule; +use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Database\Eloquent\Relations\Relation; + +class EducatableIdExistsRule implements DataAwareRule, ValidationRule +{ + protected $data = []; + + public function validate(string $attribute, mixed $value, Closure $fail): void + { + if ( + ! Relation::getMorphedModel($this->data['educatable_type'])::query() + ->whereKey($value) + ->exists() + ) { + $fail('The educatable does not exist.'); + } + } + + public function setData(array $data): static + { + $this->data = $data; + + return $this; + } +} diff --git a/app-modules/care-team/src/Rules/UniqueCareTeamRule.php b/app-modules/care-team/src/Rules/UniqueCareTeamRule.php new file mode 100644 index 0000000000..8c2e53d0b7 --- /dev/null +++ b/app-modules/care-team/src/Rules/UniqueCareTeamRule.php @@ -0,0 +1,67 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +namespace AdvisingApp\CareTeam\Rules; + +use Closure; +use AdvisingApp\CareTeam\Models\CareTeam; +use Illuminate\Contracts\Validation\DataAwareRule; +use Illuminate\Contracts\Validation\ValidationRule; + +class UniqueCareTeamRule implements DataAwareRule, ValidationRule +{ + protected $data = []; + + public function validate(string $attribute, mixed $value, Closure $fail): void + { + if ( + CareTeam::query() + ->where('educatable_id', $this->data['educatable_id']) + ->where('educatable_type', $this->data['educatable_type']) + ->where('user_id', $value) + ->exists() + ) { + $fail('The user is already on the care team.'); + } + } + + public function setData(array $data): static + { + $this->data = $data; + + return $this; + } +} diff --git a/app-modules/caseload-management/src/Policies/CaseloadPolicy.php b/app-modules/caseload-management/src/Policies/CaseloadPolicy.php index 8a45ce933c..2e05d39415 100644 --- a/app-modules/caseload-management/src/Policies/CaseloadPolicy.php +++ b/app-modules/caseload-management/src/Policies/CaseloadPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\CaseloadManagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\CaseloadManagement\Models\Caseload; class CaseloadPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'caseload.view-any', denyResponse: 'You do not have permission to view caseloads.' ); } - public function view(User $user, Caseload $caseload): Response + public function view(Authenticatable $authenticatable, Caseload $caseload): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['caseload.*.view', "caseload.{$caseload->id}.view"], denyResponse: 'You do not have permission to view this caseload.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'caseload.create', denyResponse: 'You do not have permission to create caseloads.' ); } - public function update(User $user, Caseload $caseload): Response + public function update(Authenticatable $authenticatable, Caseload $caseload): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['caseload.*.update', "caseload.{$caseload->id}.update"], denyResponse: 'You do not have permission to update this caseload.' ); } - public function delete(User $user, Caseload $caseload): Response + public function delete(Authenticatable $authenticatable, Caseload $caseload): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['caseload.*.delete', "caseload.{$caseload->id}.delete"], denyResponse: 'You do not have permission to delete this caseload.' ); } - public function restore(User $user, Caseload $caseload): Response + public function restore(Authenticatable $authenticatable, Caseload $caseload): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['caseload.*.restore', "caseload.{$caseload->id}.restore"], denyResponse: 'You do not have permission to restore this caseload.' ); } - public function forceDelete(User $user, Caseload $caseload): Response + public function forceDelete(Authenticatable $authenticatable, Caseload $caseload): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['caseload.*.force-delete', "caseload.{$caseload->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this caseload.' ); diff --git a/app-modules/consent/src/Policies/ConsentAgreementPolicy.php b/app-modules/consent/src/Policies/ConsentAgreementPolicy.php index 9597f37ba5..c1fab30e1c 100644 --- a/app-modules/consent/src/Policies/ConsentAgreementPolicy.php +++ b/app-modules/consent/src/Policies/ConsentAgreementPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\Consent\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Consent\Models\ConsentAgreement; use App\Concerns\FeatureAccessEnforcedPolicyBefore; @@ -47,46 +47,46 @@ class ConsentAgreementPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'consent_agreement.view-any', denyResponse: 'You do not have permission to view consent agreements.' ); } - public function view(User $user, ConsentAgreement $agreement): Response + public function view(Authenticatable $authenticatable, ConsentAgreement $agreement): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['consent_agreement.*.view', "consent_agreement.{$agreement->id}.view"], denyResponse: 'You do not have permission to view this consent agreement.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Consent Agreements cannot be created.'); } - public function update(User $user, ConsentAgreement $agreement): Response + public function update(Authenticatable $authenticatable, ConsentAgreement $agreement): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['consent_agreement.*.update', "consent_agreement.{$agreement->id}.update"], denyResponse: 'You do not have permission to update this consent agreement.' ); } - public function delete(User $user, ConsentAgreement $agreement): Response + public function delete(Authenticatable $authenticatable, ConsentAgreement $agreement): Response { return Response::deny('Consent Agreements cannot be deleted.'); } - public function restore(User $user, ConsentAgreement $agreement): Response + public function restore(Authenticatable $authenticatable, ConsentAgreement $agreement): Response { return Response::deny('Consent Agreements cannot be restored.'); } - public function forceDelete(User $user, ConsentAgreement $agreement): Response + public function forceDelete(Authenticatable $authenticatable, ConsentAgreement $agreement): Response { return Response::deny('Consent Agreements cannot be permanently deleted.'); } diff --git a/app-modules/division/src/Policies/DivisionPolicy.php b/app-modules/division/src/Policies/DivisionPolicy.php index 21289ac447..7f0710dd06 100644 --- a/app-modules/division/src/Policies/DivisionPolicy.php +++ b/app-modules/division/src/Policies/DivisionPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Division\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Division\Models\Division; class DivisionPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'division.view-any', denyResponse: 'You do not have permission to view divisions.' ); } - public function view(User $user, Division $division): Response + public function view(Authenticatable $authenticatable, Division $division): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['division.*.view', "division.{$division->id}.view"], denyResponse: 'You do not have permission to view this division.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'division.create', denyResponse: 'You do not have permission to create divisions.' ); } - public function update(User $user, Division $division): Response + public function update(Authenticatable $authenticatable, Division $division): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['division.*.update', "division.{$division->id}.update"], denyResponse: 'You do not have permission to update this division.' ); } - public function delete(User $user, Division $division): Response + public function delete(Authenticatable $authenticatable, Division $division): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['division.*.delete', "division.{$division->id}.delete"], denyResponse: 'You do not have permission to delete this division.' ); } - public function restore(User $user, Division $division): Response + public function restore(Authenticatable $authenticatable, Division $division): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['division.*.restore', "division.{$division->id}.restore"], denyResponse: 'You do not have permission to restore this division.' ); } - public function forceDelete(User $user, Division $division): Response + public function forceDelete(Authenticatable $authenticatable, Division $division): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['division.*.force-delete', "division.{$division->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this division.' ); diff --git a/app-modules/engagement/src/Policies/EmailTemplatePolicy.php b/app-modules/engagement/src/Policies/EmailTemplatePolicy.php index 97a0ff95ab..d3b8e65d80 100644 --- a/app-modules/engagement/src/Policies/EmailTemplatePolicy.php +++ b/app-modules/engagement/src/Policies/EmailTemplatePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\EmailTemplate; class EmailTemplatePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'email_template.view-any', denyResponse: 'You do not have permission to view email templates.' ); } - public function view(User $user, EmailTemplate $emailTemplate): Response + public function view(Authenticatable $authenticatable, EmailTemplate $emailTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['email_template.*.view', "email_template.{$emailTemplate->id}.view"], denyResponse: 'You do not have permission to view this email template.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'email_template.create', denyResponse: 'You do not have permission to create email templates.' ); } - public function update(User $user, EmailTemplate $emailTemplate): Response + public function update(Authenticatable $authenticatable, EmailTemplate $emailTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['email_template.*.update', "email_template.{$emailTemplate->id}.update"], denyResponse: 'You do not have permission to update this email template.' ); } - public function delete(User $user, EmailTemplate $emailTemplate): Response + public function delete(Authenticatable $authenticatable, EmailTemplate $emailTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['email_template.*.delete', "email_template.{$emailTemplate->id}.delete"], denyResponse: 'You do not have permission to delete this email template.' ); } - public function restore(User $user, EmailTemplate $emailTemplate): Response + public function restore(Authenticatable $authenticatable, EmailTemplate $emailTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['email_template.*.restore', "email_template.{$emailTemplate->id}.restore"], denyResponse: 'You do not have permission to restore this email template.' ); } - public function forceDelete(User $user, EmailTemplate $emailTemplate): Response + public function forceDelete(Authenticatable $authenticatable, EmailTemplate $emailTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['email_template.*.force-delete', "email_template.{$emailTemplate->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this email template.' ); diff --git a/app-modules/engagement/src/Policies/EngagementDeliverablePolicy.php b/app-modules/engagement/src/Policies/EngagementDeliverablePolicy.php index 89898b3a3f..164d980d0c 100644 --- a/app-modules/engagement/src/Policies/EngagementDeliverablePolicy.php +++ b/app-modules/engagement/src/Policies/EngagementDeliverablePolicy.php @@ -36,75 +36,75 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\EngagementDeliverable; class EngagementDeliverablePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement_deliverable.view-any', denyResponse: 'You do not have permission to view engagement deliverables.' ); } - public function view(User $user, EngagementDeliverable $deliverable): Response + public function view(Authenticatable $authenticatable, EngagementDeliverable $deliverable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.*.view', "engagement_deliverable.{$deliverable->id}.view"], denyResponse: 'You do not have permission to view this engagement deliverable.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.create'], denyResponse: 'You do not have permission to create engagement deliverables.' ); } - public function update(User $user, EngagementDeliverable $deliverable): Response + public function update(Authenticatable $authenticatable, EngagementDeliverable $deliverable): Response { if ($deliverable->hasBeenDelivered()) { return Response::deny('You do not have permission to update this engagement deliverable because it has already been sent.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.*.update', "engagement_deliverable.{$deliverable->id}.update"], denyResponse: 'You do not have permission to update this engagement deliverable.' ); } - public function delete(User $user, EngagementDeliverable $deliverable): Response + public function delete(Authenticatable $authenticatable, EngagementDeliverable $deliverable): Response { if ($deliverable->hasBeenDelivered()) { return Response::deny('You do not have permission to delete this engagement deliverable because it has already been sent.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.*.delete', "engagement_deliverable.{$deliverable->id}.delete"], denyResponse: 'You do not have permission to delete this engagement deliverable.' ); } - public function restore(User $user, EngagementDeliverable $deliverable): Response + public function restore(Authenticatable $authenticatable, EngagementDeliverable $deliverable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.*.restore', "engagement_deliverable.{$deliverable->id}.restore"], denyResponse: 'You do not have permission to restore this engagement deliverable.' ); } - public function forceDelete(User $user, EngagementDeliverable $deliverable): Response + public function forceDelete(Authenticatable $authenticatable, EngagementDeliverable $deliverable): Response { if ($deliverable->hasBeenDelivered()) { return Response::deny('You cannot permanently delete this engagement deliverable because it has already been delivered.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_deliverable.*.force-delete', "engagement_deliverable.{$deliverable->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this engagement deliverable.' ); diff --git a/app-modules/engagement/src/Policies/EngagementFilePolicy.php b/app-modules/engagement/src/Policies/EngagementFilePolicy.php index ed78fddcfd..93338ae2f9 100644 --- a/app-modules/engagement/src/Policies/EngagementFilePolicy.php +++ b/app-modules/engagement/src/Policies/EngagementFilePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\EngagementFile; class EngagementFilePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement_file.view-any', denyResponse: 'You do not have permissions to view engagement files.' ); } - public function view(User $user, EngagementFile $engagementFile): Response + public function view(Authenticatable $authenticatable, EngagementFile $engagementFile): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_file.*.view', "engagement_file.{$engagementFile->id}.view"], denyResponse: 'You do not have permissions to view this engagement file.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement_file.create', denyResponse: 'You do not have permissions to create engagement files.' ); } - public function update(User $user, EngagementFile $engagementFile): Response + public function update(Authenticatable $authenticatable, EngagementFile $engagementFile): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_file.*.update', "engagement_file.{$engagementFile->id}.update"], denyResponse: 'You do not have permissions to update this engagement file.' ); } - public function delete(User $user, EngagementFile $engagementFile): Response + public function delete(Authenticatable $authenticatable, EngagementFile $engagementFile): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_file.*.delete', "engagement_file.{$engagementFile->id}.delete"], denyResponse: 'You do not have permissions to delete this engagement file.' ); } - public function restore(User $user, EngagementFile $engagementFile): Response + public function restore(Authenticatable $authenticatable, EngagementFile $engagementFile): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_file.*.restore', "engagement_file.{$engagementFile->id}.restore"], denyResponse: 'You do not have permissions to restore this engagement file.' ); } - public function forceDelete(User $user, EngagementFile $engagementFile): Response + public function forceDelete(Authenticatable $authenticatable, EngagementFile $engagementFile): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_file.*.force-delete', "engagement_file.{$engagementFile->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this engagement file.' ); diff --git a/app-modules/engagement/src/Policies/EngagementPolicy.php b/app-modules/engagement/src/Policies/EngagementPolicy.php index 31dde670eb..1d31f947ab 100644 --- a/app-modules/engagement/src/Policies/EngagementPolicy.php +++ b/app-modules/engagement/src/Policies/EngagementPolicy.php @@ -36,75 +36,75 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\Engagement; class EngagementPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement.view-any', denyResponse: 'You do not have permission to view engagements.' ); } - public function view(User $user, Engagement $engagement): Response + public function view(Authenticatable $authenticatable, Engagement $engagement): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement.*.view', "engagement.{$engagement->id}.view"], denyResponse: 'You do not have permission to view this engagement.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement.create', denyResponse: 'You do not have permission to create engagements.' ); } - public function update(User $user, Engagement $engagement): Response + public function update(Authenticatable $authenticatable, Engagement $engagement): Response { if ($engagement->hasBeenDelivered()) { return Response::deny('You do not have permission to update this engagement because it has already been delivered.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement.*.update', "engagement.{$engagement->id}.update"], denyResponse: 'You do not have permission to update this engagement.' ); } - public function delete(User $user, Engagement $engagement): Response + public function delete(Authenticatable $authenticatable, Engagement $engagement): Response { if ($engagement->hasBeenDelivered()) { return Response::deny('You do not have permission to delete this engagement because it has already been delivered.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement.*.delete', "engagement.{$engagement->id}.delete"], denyResponse: 'You do not have permission to delete this engagement.' ); } - public function restore(User $user, Engagement $engagement): Response + public function restore(Authenticatable $authenticatable, Engagement $engagement): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement.*.restore', "engagement.{$engagement->id}.restore"], denyResponse: 'You do not have permission to restore this engagement.' ); } - public function forceDelete(User $user, Engagement $engagement): Response + public function forceDelete(Authenticatable $authenticatable, Engagement $engagement): Response { if ($engagement->hasBeenDelivered()) { return Response::deny('You cannot permanently delete this engagement because it has already been delivered.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement.*.force-delete', "engagement.{$engagement->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this engagement.' ); diff --git a/app-modules/engagement/src/Policies/EngagementResponsePolicy.php b/app-modules/engagement/src/Policies/EngagementResponsePolicy.php index 26f5c43421..f15bfdafb1 100644 --- a/app-modules/engagement/src/Policies/EngagementResponsePolicy.php +++ b/app-modules/engagement/src/Policies/EngagementResponsePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\EngagementResponse; class EngagementResponsePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement_response.view-any', denyResponse: 'You do not have permission to view engagement responses.' ); } - public function view(User $user, EngagementResponse $engagementResponse): Response + public function view(Authenticatable $authenticatable, EngagementResponse $engagementResponse): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_response.*.view', "engagement_response.{$engagementResponse->id}.view"], denyResponse: 'You do not have permission to view this engagement response.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'engagement_response.create', denyResponse: 'You do not have permission to create engagement responses.' ); } - public function update(User $user, EngagementResponse $engagementResponse): Response + public function update(Authenticatable $authenticatable, EngagementResponse $engagementResponse): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_response.*.update', "engagement_response.{$engagementResponse->id}.update"], denyResponse: 'You do not have permission to update this engagement response.' ); } - public function delete(User $user, EngagementResponse $engagementResponse): Response + public function delete(Authenticatable $authenticatable, EngagementResponse $engagementResponse): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_response.*.delete', "engagement_response.{$engagementResponse->id}.delete"], denyResponse: 'You do not have permission to delete this engagement response.' ); } - public function restore(User $user, EngagementResponse $engagementResponse): Response + public function restore(Authenticatable $authenticatable, EngagementResponse $engagementResponse): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_response.*.restore', "engagement_response.{$engagementResponse->id}.restore"], denyResponse: 'You do not have permission to restore this engagement response.' ); } - public function forceDelete(User $user, EngagementResponse $engagementResponse): Response + public function forceDelete(Authenticatable $authenticatable, EngagementResponse $engagementResponse): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['engagement_response.*.force-delete', "engagement_response.{$engagementResponse->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this engagement response.' ); diff --git a/app-modules/engagement/src/Policies/SmsTemplatePolicy.php b/app-modules/engagement/src/Policies/SmsTemplatePolicy.php index c559a2b097..60ac63196f 100644 --- a/app-modules/engagement/src/Policies/SmsTemplatePolicy.php +++ b/app-modules/engagement/src/Policies/SmsTemplatePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Engagement\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Engagement\Models\SmsTemplate; class SmsTemplatePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'sms_template.view-any', denyResponse: 'You do not have permission to view sms templates.' ); } - public function view(User $user, SmsTemplate $smsTemplate): Response + public function view(Authenticatable $authenticatable, SmsTemplate $smsTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['sms_template.*.view', "sms_template.{$smsTemplate->id}.view"], denyResponse: 'You do not have permission to view this sms template.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'sms_template.create', denyResponse: 'You do not have permission to create sms templates.' ); } - public function update(User $user, SmsTemplate $smsTemplate): Response + public function update(Authenticatable $authenticatable, SmsTemplate $smsTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['sms_template.*.update', "sms_template.{$smsTemplate->id}.update"], denyResponse: 'You do not have permission to update this sms template.' ); } - public function delete(User $user, SmsTemplate $smsTemplate): Response + public function delete(Authenticatable $authenticatable, SmsTemplate $smsTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['sms_template.*.delete', "sms_template.{$smsTemplate->id}.delete"], denyResponse: 'You do not have permission to delete this sms template.' ); } - public function restore(User $user, SmsTemplate $smsTemplate): Response + public function restore(Authenticatable $authenticatable, SmsTemplate $smsTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['sms_template.*.restore', "sms_template.{$smsTemplate->id}.restore"], denyResponse: 'You do not have permission to restore this sms template.' ); } - public function forceDelete(User $user, SmsTemplate $smsTemplate): Response + public function forceDelete(Authenticatable $authenticatable, SmsTemplate $smsTemplate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['sms_template.*.force-delete', "sms_template.{$smsTemplate->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this sms template.' ); diff --git a/app-modules/form/src/Policies/FormPolicy.php b/app-modules/form/src/Policies/FormPolicy.php index 42d34702c1..d6d72f6300 100644 --- a/app-modules/form/src/Policies/FormPolicy.php +++ b/app-modules/form/src/Policies/FormPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\Form\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use AdvisingApp\Form\Models\Form; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; @@ -47,57 +47,57 @@ class FormPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'form.view-any', denyResponse: 'You do not have permission to view forms.' ); } - public function view(User $user, Form $form): Response + public function view(Authenticatable $authenticatable, Form $form): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['form.*.view', "form.{$form->id}.view"], denyResponse: 'You do not have permission to view this form.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'form.create', denyResponse: 'You do not have permission to create forms.' ); } - public function update(User $user, Form $form): Response + public function update(Authenticatable $authenticatable, Form $form): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['form.*.update', "form.{$form->id}.update"], denyResponse: 'You do not have permission to update this form.' ); } - public function delete(User $user, Form $form): Response + public function delete(Authenticatable $authenticatable, Form $form): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['form.*.delete', "form.{$form->id}.delete"], denyResponse: 'You do not have permission to delete this form.' ); } - public function restore(User $user, Form $form): Response + public function restore(Authenticatable $authenticatable, Form $form): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['form.*.restore', "form.{$form->id}.restore"], denyResponse: 'You do not have permission to restore this form.' ); } - public function forceDelete(User $user, Form $form): Response + public function forceDelete(Authenticatable $authenticatable, Form $form): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['form.*.force-delete', "form.{$form->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this form.' ); diff --git a/app-modules/interaction/src/Policies/InteractionCampaignPolicy.php b/app-modules/interaction/src/Policies/InteractionCampaignPolicy.php index 9153903fe6..9b0b2e793d 100644 --- a/app-modules/interaction/src/Policies/InteractionCampaignPolicy.php +++ b/app-modules/interaction/src/Policies/InteractionCampaignPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionCampaign; class InteractionCampaignPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_campaign.view-any', denyResponse: 'You do not have permission to view interaction campaigns.' ); } - public function view(User $user, InteractionCampaign $campaign): Response + public function view(Authenticatable $authenticatable, InteractionCampaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_campaign.*.view', "interaction_campaign.{$campaign->id}.view"], denyResponse: 'You do not have permission to view this interaction campaign.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_campaign.create', denyResponse: 'You do not have permission to create interaction campaigns.' ); } - public function update(User $user, InteractionCampaign $campaign): Response + public function update(Authenticatable $authenticatable, InteractionCampaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_campaign.*.update', "interaction_campaign.{$campaign->id}.update"], denyResponse: 'You do not have permission to update this interaction campaign.' ); } - public function delete(User $user, InteractionCampaign $campaign): Response + public function delete(Authenticatable $authenticatable, InteractionCampaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_campaign.*.delete', "interaction_campaign.{$campaign->id}.delete"], denyResponse: 'You do not have permission to delete this interaction campaign.' ); } - public function restore(User $user, InteractionCampaign $campaign): Response + public function restore(Authenticatable $authenticatable, InteractionCampaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_campaign.*.restore', "interaction_campaign.{$campaign->id}.restore"], denyResponse: 'You do not have permission to restore this interaction campaign.' ); } - public function forceDelete(User $user, InteractionCampaign $campaign): Response + public function forceDelete(Authenticatable $authenticatable, InteractionCampaign $campaign): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_campaign.*.force-delete', "interaction_campaign.{$campaign->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction campaign.' ); diff --git a/app-modules/interaction/src/Policies/InteractionDriverPolicy.php b/app-modules/interaction/src/Policies/InteractionDriverPolicy.php index 176e78c23e..7231df8b82 100644 --- a/app-modules/interaction/src/Policies/InteractionDriverPolicy.php +++ b/app-modules/interaction/src/Policies/InteractionDriverPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionDriver; class InteractionDriverPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_driver.view-any', denyResponse: 'You do not have permission to view interaction drivers.' ); } - public function view(User $user, InteractionDriver $driver): Response + public function view(Authenticatable $authenticatable, InteractionDriver $driver): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_driver.*.view', "interaction_driver.{$driver->id}.view"], denyResponse: 'You do not have permission to view this interaction driver.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_driver.create', denyResponse: 'You do not have permission to create interaction drivers.' ); } - public function update(User $user, InteractionDriver $driver): Response + public function update(Authenticatable $authenticatable, InteractionDriver $driver): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_driver.*.update', "interaction_driver.{$driver->id}.update"], denyResponse: 'You do not have permission to update this interaction driver.' ); } - public function delete(User $user, InteractionDriver $driver): Response + public function delete(Authenticatable $authenticatable, InteractionDriver $driver): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_driver.*.delete', "interaction_driver.{$driver->id}.delete"], denyResponse: 'You do not have permission to delete this interaction driver.' ); } - public function restore(User $user, InteractionDriver $driver): Response + public function restore(Authenticatable $authenticatable, InteractionDriver $driver): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_driver.*.restore', "interaction_driver.{$driver->id}.restore"], denyResponse: 'You do not have permission to restore this interaction driver.' ); } - public function forceDelete(User $user, InteractionDriver $driver): Response + public function forceDelete(Authenticatable $authenticatable, InteractionDriver $driver): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_driver.*.force-delete', "interaction_driver.{$driver->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction driver.' ); diff --git a/app-modules/interaction/src/Policies/InteractionOutcomePolicy.php b/app-modules/interaction/src/Policies/InteractionOutcomePolicy.php index b29aaaae64..7d69ce4953 100644 --- a/app-modules/interaction/src/Policies/InteractionOutcomePolicy.php +++ b/app-modules/interaction/src/Policies/InteractionOutcomePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionOutcome; class InteractionOutcomePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_outcome.view-any', denyResponse: 'You do not have permission to view interaction outcomes.' ); } - public function view(User $user, InteractionOutcome $outcome): Response + public function view(Authenticatable $authenticatable, InteractionOutcome $outcome): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_outcome.*.view', "interaction_outcome.{$outcome->id}.view"], denyResponse: 'You do not have permission to view this interaction outcome.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_outcome.create', denyResponse: 'You do not have permission to create interaction outcomes.' ); } - public function update(User $user, InteractionOutcome $outcome): Response + public function update(Authenticatable $authenticatable, InteractionOutcome $outcome): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_outcome.*.update', "interaction_outcome.{$outcome->id}.update"], denyResponse: 'You do not have permission to update this interaction outcome.' ); } - public function delete(User $user, InteractionOutcome $outcome): Response + public function delete(Authenticatable $authenticatable, InteractionOutcome $outcome): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_outcome.*.delete', "interaction_outcome.{$outcome->id}.delete"], denyResponse: 'You do not have permission to delete this interaction outcome.' ); } - public function restore(User $user, InteractionOutcome $outcome): Response + public function restore(Authenticatable $authenticatable, InteractionOutcome $outcome): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_outcome.*.restore', "interaction_outcome.{$outcome->id}.restore"], denyResponse: 'You do not have permission to restore this interaction outcome.' ); } - public function forceDelete(User $user, InteractionOutcome $outcome): Response + public function forceDelete(Authenticatable $authenticatable, InteractionOutcome $outcome): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_outcome.*.force-delete', "interaction_outcome.{$outcome->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction outcome.' ); diff --git a/app-modules/interaction/src/Policies/InteractionPolicy.php b/app-modules/interaction/src/Policies/InteractionPolicy.php index fbb95865b6..929427cddf 100644 --- a/app-modules/interaction/src/Policies/InteractionPolicy.php +++ b/app-modules/interaction/src/Policies/InteractionPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\Interaction; class InteractionPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction.view-any', denyResponse: 'You do not have permission to view interactions.' ); } - public function view(User $user, Interaction $interaction): Response + public function view(Authenticatable $authenticatable, Interaction $interaction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction.*.view', "interaction.{$interaction->id}.view"], denyResponse: 'You do not have permission to view this interaction.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction.create', denyResponse: 'You do not have permission to create interactions.' ); } - public function update(User $user, Interaction $interaction): Response + public function update(Authenticatable $authenticatable, Interaction $interaction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction.*.update', "interaction.{$interaction->id}.update"], denyResponse: 'You do not have permission to update this interaction.' ); } - public function delete(User $user, Interaction $interaction): Response + public function delete(Authenticatable $authenticatable, Interaction $interaction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction.*.delete', "interaction.{$interaction->id}.delete"], denyResponse: 'You do not have permission to delete this interaction.' ); } - public function restore(User $user, Interaction $interaction): Response + public function restore(Authenticatable $authenticatable, Interaction $interaction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction.*.restore', "interaction.{$interaction->id}.restore"], denyResponse: 'You do not have permission to restore this interaction.' ); } - public function forceDelete(User $user, Interaction $interaction): Response + public function forceDelete(Authenticatable $authenticatable, Interaction $interaction): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction.*.force-delete', "interaction.{$interaction->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction.' ); diff --git a/app-modules/interaction/src/Policies/InteractionRelationPolicy.php b/app-modules/interaction/src/Policies/InteractionRelationPolicy.php index f647e68382..2fe6426d47 100644 --- a/app-modules/interaction/src/Policies/InteractionRelationPolicy.php +++ b/app-modules/interaction/src/Policies/InteractionRelationPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionRelation; class InteractionRelationPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_relation.view-any', denyResponse: 'You do not have permission to view interaction relations.' ); } - public function view(User $user, InteractionRelation $relation): Response + public function view(Authenticatable $authenticatable, InteractionRelation $relation): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_relation.*.view', "interaction_relation.{$relation->id}.view"], denyResponse: 'You do not have permission to view this interaction relation.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_relation.create', denyResponse: 'You do not have permission to create interaction relations.' ); } - public function update(User $user, InteractionRelation $relation): Response + public function update(Authenticatable $authenticatable, InteractionRelation $relation): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_relation.*.update', "interaction_relation.{$relation->id}.update"], denyResponse: 'You do not have permission to update this interaction relation.' ); } - public function delete(User $user, InteractionRelation $relation): Response + public function delete(Authenticatable $authenticatable, InteractionRelation $relation): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_relation.*.delete', "interaction_relation.{$relation->id}.delete"], denyResponse: 'You do not have permission to delete this interaction relation.' ); } - public function restore(User $user, InteractionRelation $relation): Response + public function restore(Authenticatable $authenticatable, InteractionRelation $relation): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_relation.*.restore', "interaction_relation.{$relation->id}.restore"], denyResponse: 'You do not have permission to restore this interaction relation.' ); } - public function forceDelete(User $user, InteractionRelation $relation): Response + public function forceDelete(Authenticatable $authenticatable, InteractionRelation $relation): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_relation.*.force-delete', "interaction_relation.{$relation->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction relation.' ); diff --git a/app-modules/interaction/src/Policies/InteractionStatusPolicy.php b/app-modules/interaction/src/Policies/InteractionStatusPolicy.php index 3bfb4e930c..0c1b753fb9 100644 --- a/app-modules/interaction/src/Policies/InteractionStatusPolicy.php +++ b/app-modules/interaction/src/Policies/InteractionStatusPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionStatus; class InteractionStatusPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_status.view-any', denyResponse: 'You do not have permission to view interaction statuses.' ); } - public function view(User $user, InteractionStatus $status): Response + public function view(Authenticatable $authenticatable, InteractionStatus $status): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_status.*.view', "interaction_status.{$status->id}.view"], denyResponse: 'You do not have permission to view this interaction status.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_status.create', denyResponse: 'You do not have permission to create interaction statuses.' ); } - public function update(User $user, InteractionStatus $status): Response + public function update(Authenticatable $authenticatable, InteractionStatus $status): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_status.*.update', "interaction_status.{$status->id}.update"], denyResponse: 'You do not have permission to update this interaction status.' ); } - public function delete(User $user, InteractionStatus $status): Response + public function delete(Authenticatable $authenticatable, InteractionStatus $status): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_status.*.delete', "interaction_status.{$status->id}.delete"], denyResponse: 'You do not have permission to delete this interaction status.' ); } - public function restore(User $user, InteractionStatus $status): Response + public function restore(Authenticatable $authenticatable, InteractionStatus $status): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_status.*.restore', "interaction_status.{$status->id}.restore"], denyResponse: 'You do not have permission to restore this interaction status.' ); } - public function forceDelete(User $user, InteractionStatus $status): Response + public function forceDelete(Authenticatable $authenticatable, InteractionStatus $status): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_status.*.force-delete', "interaction_status.{$status->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction status.' ); diff --git a/app-modules/interaction/src/Policies/InteractionTypePolicy.php b/app-modules/interaction/src/Policies/InteractionTypePolicy.php index 747665ae0b..95a4f3a5d0 100644 --- a/app-modules/interaction/src/Policies/InteractionTypePolicy.php +++ b/app-modules/interaction/src/Policies/InteractionTypePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Interaction\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Interaction\Models\InteractionType; class InteractionTypePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_type.view-any', denyResponse: 'You do not have permission to view interaction types.' ); } - public function view(User $user, InteractionType $type): Response + public function view(Authenticatable $authenticatable, InteractionType $type): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_type.*.view', "interaction_type.{$type->id}.view"], denyResponse: 'You do not have permission to view this interaction type.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'interaction_type.create', denyResponse: 'You do not have permission to create interaction types.' ); } - public function update(User $user, InteractionType $type): Response + public function update(Authenticatable $authenticatable, InteractionType $type): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_type.*.update', "interaction_type.{$type->id}.update"], denyResponse: 'You do not have permission to update this interaction type.' ); } - public function delete(User $user, InteractionType $type): Response + public function delete(Authenticatable $authenticatable, InteractionType $type): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_type.*.delete', "interaction_type.{$type->id}.delete"], denyResponse: 'You do not have permission to delete this interaction type.' ); } - public function restore(User $user, InteractionType $type): Response + public function restore(Authenticatable $authenticatable, InteractionType $type): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_type.*.restore', "interaction_type.{$type->id}.restore"], denyResponse: 'You do not have permission to restore this interaction type.' ); } - public function forceDelete(User $user, InteractionType $type): Response + public function forceDelete(Authenticatable $authenticatable, InteractionType $type): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['interaction_type.*.force-delete', "interaction_type.{$type->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this interaction type.' ); diff --git a/app-modules/knowledge-base/graphql/knowledge-base-item.graphql b/app-modules/knowledge-base/graphql/knowledge-base-item.graphql new file mode 100644 index 0000000000..132f8dc7d2 --- /dev/null +++ b/app-modules/knowledge-base/graphql/knowledge-base-item.graphql @@ -0,0 +1,12 @@ +type KnowledgeBaseItem + @feature(feature: "knowledge-management") + @model(class: "AdvisingApp\\KnowledgeBase\\Models\\KnowledgeBaseItem") { + id: ID! +} + +extend type Query @feature(feature: "knowledge-management") { + "Get all knowledge base items." + knowledgeBaseItems: [KnowledgeBaseItem!]! + @canModel(ability: "viewAny") + @paginate +} diff --git a/app-modules/knowledge-base/src/Policies/KnowledgeBaseCategoryPolicy.php b/app-modules/knowledge-base/src/Policies/KnowledgeBaseCategoryPolicy.php index afcec5b683..04ce6748b4 100644 --- a/app-modules/knowledge-base/src/Policies/KnowledgeBaseCategoryPolicy.php +++ b/app-modules/knowledge-base/src/Policies/KnowledgeBaseCategoryPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\KnowledgeBase\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; use App\Policies\Contracts\FeatureAccessEnforcedPolicy; @@ -47,57 +47,57 @@ class KnowledgeBaseCategoryPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_category.view-any', denyResponse: 'You do not have permissions to view knowledge base categories.' ); } - public function view(User $user, KnowledgeBaseCategory $knowledgeBaseCategory): Response + public function view(Authenticatable $authenticatable, KnowledgeBaseCategory $knowledgeBaseCategory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_category.*.view', "knowledge_base_category.{$knowledgeBaseCategory->id}.view"], denyResponse: 'You do not have permissions to view this knowledge base category.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_category.create', denyResponse: 'You do not have permissions to create knowledge base categories.' ); } - public function update(User $user, KnowledgeBaseCategory $knowledgeBaseCategory): Response + public function update(Authenticatable $authenticatable, KnowledgeBaseCategory $knowledgeBaseCategory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_category.*.update', "knowledge_base_category.{$knowledgeBaseCategory->id}.update"], denyResponse: 'You do not have permissions to update this knowledge base category.' ); } - public function delete(User $user, KnowledgeBaseCategory $knowledgeBaseCategory): Response + public function delete(Authenticatable $authenticatable, KnowledgeBaseCategory $knowledgeBaseCategory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_category.*.delete', "knowledge_base_category.{$knowledgeBaseCategory->id}.delete"], denyResponse: 'You do not have permissions to delete this knowledge base category.' ); } - public function restore(User $user, KnowledgeBaseCategory $knowledgeBaseCategory): Response + public function restore(Authenticatable $authenticatable, KnowledgeBaseCategory $knowledgeBaseCategory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_category.*.restore', "knowledge_base_category.{$knowledgeBaseCategory->id}.restore"], denyResponse: 'You do not have permissions to restore this knowledge base category.' ); } - public function forceDelete(User $user, KnowledgeBaseCategory $knowledgeBaseCategory): Response + public function forceDelete(Authenticatable $authenticatable, KnowledgeBaseCategory $knowledgeBaseCategory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_category.*.force-delete', "knowledge_base_category.{$knowledgeBaseCategory->id}.force-delete"], denyResponse: 'You do not have permissions to permanently delete this knowledge base category.' ); diff --git a/app-modules/knowledge-base/src/Policies/KnowledgeBaseItemPolicy.php b/app-modules/knowledge-base/src/Policies/KnowledgeBaseItemPolicy.php index 5f1fef75b6..e0942047f6 100644 --- a/app-modules/knowledge-base/src/Policies/KnowledgeBaseItemPolicy.php +++ b/app-modules/knowledge-base/src/Policies/KnowledgeBaseItemPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\KnowledgeBase\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; use AdvisingApp\KnowledgeBase\Models\KnowledgeBaseItem; @@ -47,57 +47,57 @@ class KnowledgeBaseItemPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_item.view-any', denyResponse: 'You do not have permissions to view knowledge base items.' ); } - public function view(User $user, KnowledgeBaseItem $knowledgeBaseItem): Response + public function view(Authenticatable $authenticatable, KnowledgeBaseItem $knowledgeBaseItem): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_item.*.view', "knowledge_base_item.{$knowledgeBaseItem->id}.view"], denyResponse: 'You do not have permissions to view this knowledge base item.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_item.create', denyResponse: 'You do not have permissions to create knowledge base items.' ); } - public function update(User $user, KnowledgeBaseItem $knowledgeBaseItem): Response + public function update(Authenticatable $authenticatable, KnowledgeBaseItem $knowledgeBaseItem): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_item.*.update', "knowledge_base_item.{$knowledgeBaseItem->id}.update"], denyResponse: 'You do not have permissions to update this knowledge base item.' ); } - public function delete(User $user, KnowledgeBaseItem $knowledgeBaseItem): Response + public function delete(Authenticatable $authenticatable, KnowledgeBaseItem $knowledgeBaseItem): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_item.*.delete', "knowledge_base_item.{$knowledgeBaseItem->id}.delete"], denyResponse: 'You do not have permissions to delete this knowledge base item.' ); } - public function restore(User $user, KnowledgeBaseItem $knowledgeBaseItem): Response + public function restore(Authenticatable $authenticatable, KnowledgeBaseItem $knowledgeBaseItem): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_item.*.restore', "knowledge_base_item.{$knowledgeBaseItem->id}.restore"], denyResponse: 'You do not have permissions to restore this knowledge base item.' ); } - public function forceDelete(User $user, KnowledgeBaseItem $knowledgeBaseItem): Response + public function forceDelete(Authenticatable $authenticatable, KnowledgeBaseItem $knowledgeBaseItem): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_item.*.force-delete', "knowledge_base_item.{$knowledgeBaseItem->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this knowledge base item.' ); diff --git a/app-modules/knowledge-base/src/Policies/KnowledgeBaseQualityPolicy.php b/app-modules/knowledge-base/src/Policies/KnowledgeBaseQualityPolicy.php index b1df5910d4..97ca3894cd 100644 --- a/app-modules/knowledge-base/src/Policies/KnowledgeBaseQualityPolicy.php +++ b/app-modules/knowledge-base/src/Policies/KnowledgeBaseQualityPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\KnowledgeBase\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; use App\Policies\Contracts\FeatureAccessEnforcedPolicy; @@ -47,57 +47,57 @@ class KnowledgeBaseQualityPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_quality.view-any', denyResponse: 'You do not have permission to view any knowledge base categories.' ); } - public function view(User $user, KnowledgeBaseQuality $knowledgeBaseQuality): Response + public function view(Authenticatable $authenticatable, KnowledgeBaseQuality $knowledgeBaseQuality): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_quality.*.view', "knowledge_base_quality.{$knowledgeBaseQuality->id}.view"], denyResponse: 'You do not have permission to view this knowledge base category.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_quality.create', denyResponse: 'You do not have permission to create knowledge base categories.' ); } - public function update(User $user, KnowledgeBaseQuality $knowledgeBaseQuality): Response + public function update(Authenticatable $authenticatable, KnowledgeBaseQuality $knowledgeBaseQuality): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_quality.*.update', "knowledge_base_quality.{$knowledgeBaseQuality->id}.update"], denyResponse: 'You do not have permission to update this knowledge base category.' ); } - public function delete(User $user, KnowledgeBaseQuality $knowledgeBaseQuality): Response + public function delete(Authenticatable $authenticatable, KnowledgeBaseQuality $knowledgeBaseQuality): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_quality.*.delete', "knowledge_base_quality.{$knowledgeBaseQuality->id}.delete"], denyResponse: 'You do not have permission to delete this knowledge base category.' ); } - public function restore(User $user, KnowledgeBaseQuality $knowledgeBaseQuality): Response + public function restore(Authenticatable $authenticatable, KnowledgeBaseQuality $knowledgeBaseQuality): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_quality.*.restore', "knowledge_base_quality.{$knowledgeBaseQuality->id}.restore"], denyResponse: 'You do not have permission to restore this knowledge base category.' ); } - public function forceDelete(User $user, KnowledgeBaseQuality $knowledgeBaseQuality): Response + public function forceDelete(Authenticatable $authenticatable, KnowledgeBaseQuality $knowledgeBaseQuality): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_quality.*.force-delete', "knowledge_base_quality.{$knowledgeBaseQuality->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this knowledge base category.' ); diff --git a/app-modules/knowledge-base/src/Policies/KnowledgeBaseStatusPolicy.php b/app-modules/knowledge-base/src/Policies/KnowledgeBaseStatusPolicy.php index 3d185a47a4..6428da24de 100644 --- a/app-modules/knowledge-base/src/Policies/KnowledgeBaseStatusPolicy.php +++ b/app-modules/knowledge-base/src/Policies/KnowledgeBaseStatusPolicy.php @@ -36,8 +36,8 @@ namespace AdvisingApp\KnowledgeBase\Policies; -use App\Models\User; use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use App\Concerns\FeatureAccessEnforcedPolicyBefore; use App\Policies\Contracts\FeatureAccessEnforcedPolicy; @@ -47,57 +47,57 @@ class KnowledgeBaseStatusPolicy implements FeatureAccessEnforcedPolicy { use FeatureAccessEnforcedPolicyBefore; - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_status.view-any', denyResponse: 'You do not have permission to view any knowledge base statuses.' ); } - public function view(User $user, KnowledgeBaseStatus $knowledgeBaseStatus): Response + public function view(Authenticatable $authenticatable, KnowledgeBaseStatus $knowledgeBaseStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_status.*.view', "knowledge_base_status.{$knowledgeBaseStatus->id}.view"], denyResponse: 'You do not have permission to view this knowledge base status.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'knowledge_base_status.create', denyResponse: 'You do not have permission to create knowledge base statuses.' ); } - public function update(User $user, KnowledgeBaseStatus $knowledgeBaseStatus): Response + public function update(Authenticatable $authenticatable, KnowledgeBaseStatus $knowledgeBaseStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_status.*.update', "knowledge_base_status.{$knowledgeBaseStatus->id}.update"], denyResponse: 'You do not have permission to update this knowledge base status.' ); } - public function delete(User $user, KnowledgeBaseStatus $knowledgeBaseStatus): Response + public function delete(Authenticatable $authenticatable, KnowledgeBaseStatus $knowledgeBaseStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_status.*.delete', "knowledge_base_status.{$knowledgeBaseStatus->id}.delete"], denyResponse: 'You do not have permission to delete this knowledge base status.' ); } - public function restore(User $user, KnowledgeBaseStatus $knowledgeBaseStatus): Response + public function restore(Authenticatable $authenticatable, KnowledgeBaseStatus $knowledgeBaseStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_status.*.restore', "knowledge_base_status.{$knowledgeBaseStatus->id}.restore"], denyResponse: 'You do not have permission to restore this knowledge base status.' ); } - public function forceDelete(User $user, KnowledgeBaseStatus $knowledgeBaseStatus): Response + public function forceDelete(Authenticatable $authenticatable, KnowledgeBaseStatus $knowledgeBaseStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['knowledge_base_status.*.force-delete', "knowledge_base_status.{$knowledgeBaseStatus->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this knowledge base status.' ); diff --git a/app-modules/knowledge-base/src/Providers/KnowledgeBaseServiceProvider.php b/app-modules/knowledge-base/src/Providers/KnowledgeBaseServiceProvider.php index df481ba285..717f183e63 100644 --- a/app-modules/knowledge-base/src/Providers/KnowledgeBaseServiceProvider.php +++ b/app-modules/knowledge-base/src/Providers/KnowledgeBaseServiceProvider.php @@ -37,6 +37,7 @@ namespace AdvisingApp\KnowledgeBase\Providers; use Filament\Panel; +use App\Concerns\GraphSchemaDiscovery; use Illuminate\Support\ServiceProvider; use AdvisingApp\KnowledgeBase\KnowledgeBasePlugin; use Illuminate\Database\Eloquent\Relations\Relation; @@ -50,6 +51,8 @@ class KnowledgeBaseServiceProvider extends ServiceProvider { + use GraphSchemaDiscovery; + public function register(): void { Panel::configureUsing(fn (Panel $panel) => $panel->plugin(new KnowledgeBasePlugin())); @@ -66,6 +69,7 @@ public function boot(): void $this->registerRolesAndPermissions(); $this->registerObservers(); + $this->discoverSchema(__DIR__ . '/../../graphql/knowledge-base-item.graphql'); } public function registerObservers(): void diff --git a/app-modules/notifications/graphql/notifications.graphql b/app-modules/notifications/graphql/notifications.graphql new file mode 100644 index 0000000000..26d9db2a89 --- /dev/null +++ b/app-modules/notifications/graphql/notifications.graphql @@ -0,0 +1 @@ +#import subscription.graphql diff --git a/app-modules/notifications/graphql/subscription.graphql b/app-modules/notifications/graphql/subscription.graphql new file mode 100644 index 0000000000..3f2d1a640e --- /dev/null +++ b/app-modules/notifications/graphql/subscription.graphql @@ -0,0 +1,60 @@ +type UserSubscription + @model(class: "AdvisingApp\\Notifications\\Models\\Subscription") { + "Unique primary key." + id: ID! + "The user related to this subscription." + user: User! @belongsTo + "The subscribable the user is subscribed to." + subscribable: Educatable! @morphTo + "The created date of the subscription." + created_at: DateTime + "The updated date of the subscription." + updated_at: DateTime +} + +extend type Query { + "Get a subscription by its primary key." + userSubscription( + "Search by primary key." + id: ID! @whereKey + ): UserSubscription @find @canResolved(ability: "view") + + "Get all subscriptions." + userSubscriptions: [UserSubscription!]! + @paginate + @canModel(ability: "viewAny") +} + +extend type Mutation { + "Create a new subscription." + createUserSubscription( + "The user to subscribe." + user_id: ID! + @rules( + apply: [ + "required" + "exists:users,id" + "AdvisingApp\\Notifications\\Rules\\UniqueSubscriptionRule" + ] + ) + + "The subscribable to subscribe to." + subscribable_id: ID! + @rules( + apply: [ + "required" + "AdvisingApp\\Notifications\\Rules\\SubscribableIdExistsRule" + ] + ) + + "The type of subscribable to subscribe to." + subscribable_type: String! + @rules(apply: ["required", "in:student,prospect"]) + ): UserSubscription! @create @canModel(ability: "create") + + "Delete an existing subscription." + deleteUserSubscription( + "The primary key of the subscription." + id: ID! @whereKey + ): UserSubscription @delete @canFind(ability: "delete", find: "id") +} diff --git a/app-modules/notifications/src/Policies/SubscriptionPolicy.php b/app-modules/notifications/src/Policies/SubscriptionPolicy.php index 8758c4a1ed..56758a415d 100644 --- a/app-modules/notifications/src/Policies/SubscriptionPolicy.php +++ b/app-modules/notifications/src/Policies/SubscriptionPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Notifications\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Notifications\Models\Subscription; class SubscriptionPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'subscription.view-any', denyResponse: 'You do not have permission to view subscriptions.' ); } - public function view(User $user, Subscription $subscription): Response + public function view(Authenticatable $authenticatable, Subscription $subscription): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['subscription.*.view', "subscription.{$subscription->id}.view"], denyResponse: 'You do not have permission to view this subscription.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'subscription.create', denyResponse: 'You do not have permission to create subscriptions.' ); } - public function update(User $user, Subscription $subscription): Response + public function update(Authenticatable $authenticatable, Subscription $subscription): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['subscription.*.update', "subscription.{$subscription->id}.update"], denyResponse: 'You do not have permission to update this subscription.' ); } - public function delete(User $user, Subscription $subscription): Response + public function delete(Authenticatable $authenticatable, Subscription $subscription): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['subscription.*.delete', "subscription.{$subscription->id}.delete"], denyResponse: 'You do not have permission to delete this subscription.' ); } - public function restore(User $user, Subscription $subscription): Response + public function restore(Authenticatable $authenticatable, Subscription $subscription): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['subscription.*.restore', "subscription.{$subscription->id}.restore"], denyResponse: 'You do not have permission to restore this subscription.' ); } - public function forceDelete(User $user, Subscription $subscription): Response + public function forceDelete(Authenticatable $authenticatable, Subscription $subscription): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['subscription.*.force-delete', "subscription.{$subscription->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this subscription.' ); diff --git a/app-modules/notifications/src/Providers/NotificationsServiceProvider.php b/app-modules/notifications/src/Providers/NotificationsServiceProvider.php index 90b9fe8975..d4fda5a1dc 100644 --- a/app-modules/notifications/src/Providers/NotificationsServiceProvider.php +++ b/app-modules/notifications/src/Providers/NotificationsServiceProvider.php @@ -37,6 +37,7 @@ namespace AdvisingApp\Notifications\Providers; use Illuminate\Support\Facades\Event; +use App\Concerns\GraphSchemaDiscovery; use Illuminate\Support\ServiceProvider; use AdvisingApp\Notifications\Models\Subscription; use Illuminate\Database\Eloquent\Relations\Relation; @@ -52,6 +53,8 @@ class NotificationsServiceProvider extends ServiceProvider { + use GraphSchemaDiscovery; + public function register(): void {} public function boot(): void @@ -63,6 +66,8 @@ public function boot(): void $this->registerRolesAndPermissions(); $this->registerObservers(); $this->registerEvents(); + + $this->discoverSchema(__DIR__ . '/../../graphql/notifications.graphql'); } protected function registerObservers(): void diff --git a/app-modules/notifications/src/Rules/SubscribableIdExistsRule.php b/app-modules/notifications/src/Rules/SubscribableIdExistsRule.php new file mode 100644 index 0000000000..926ad2c0c2 --- /dev/null +++ b/app-modules/notifications/src/Rules/SubscribableIdExistsRule.php @@ -0,0 +1,65 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +namespace AdvisingApp\Notifications\Rules; + +use Closure; +use Illuminate\Contracts\Validation\DataAwareRule; +use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Database\Eloquent\Relations\Relation; + +class SubscribableIdExistsRule implements DataAwareRule, ValidationRule +{ + protected $data = []; + + public function validate(string $attribute, mixed $value, Closure $fail): void + { + if ( + ! Relation::getMorphedModel($this->data['subscribable_type'])::query() + ->whereKey($value) + ->exists() + ) { + $fail('The subscribable does not exist.'); + } + } + + public function setData(array $data): static + { + $this->data = $data; + + return $this; + } +} diff --git a/app-modules/notifications/src/Rules/UniqueSubscriptionRule.php b/app-modules/notifications/src/Rules/UniqueSubscriptionRule.php new file mode 100644 index 0000000000..8ae0feec55 --- /dev/null +++ b/app-modules/notifications/src/Rules/UniqueSubscriptionRule.php @@ -0,0 +1,67 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +namespace AdvisingApp\Notifications\Rules; + +use Closure; +use AdvisingApp\Notifications\Models\Subscription; +use Illuminate\Contracts\Validation\DataAwareRule; +use Illuminate\Contracts\Validation\ValidationRule; + +class UniqueSubscriptionRule implements DataAwareRule, ValidationRule +{ + protected $data = []; + + public function validate(string $attribute, mixed $value, Closure $fail): void + { + if ( + Subscription::query() + ->where('subscribable_id', $this->data['subscribable_id']) + ->where('subscribable_type', $this->data['subscribable_type']) + ->where('user_id', $value) + ->exists() + ) { + $fail('The user is already subscribed.'); + } + } + + public function setData(array $data): static + { + $this->data = $data; + + return $this; + } +} diff --git a/app-modules/prospect/graphql/prospect.graphql b/app-modules/prospect/graphql/prospect.graphql new file mode 100644 index 0000000000..4b09e7e0e6 --- /dev/null +++ b/app-modules/prospect/graphql/prospect.graphql @@ -0,0 +1,3 @@ +type Prospect { + id: ID! +} diff --git a/app-modules/prospect/src/Policies/ProspectSourcePolicy.php b/app-modules/prospect/src/Policies/ProspectSourcePolicy.php index f28439f4bd..af0674b0fc 100644 --- a/app-modules/prospect/src/Policies/ProspectSourcePolicy.php +++ b/app-modules/prospect/src/Policies/ProspectSourcePolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Prospect\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Prospect\Models\ProspectSource; class ProspectSourcePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'prospect_source.view-any', denyResponse: 'You do not have permission to view prospect sources.' ); } - public function view(User $user, ProspectSource $prospectSource): Response + public function view(Authenticatable $authenticatable, ProspectSource $prospectSource): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_source.*.view', "prospect_source.{$prospectSource->id}.view"], denyResponse: 'You do not have permission to view this prospect source.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'prospect_source.create', denyResponse: 'You do not have permission to create prospect sources.' ); } - public function update(User $user, ProspectSource $prospectSource): Response + public function update(Authenticatable $authenticatable, ProspectSource $prospectSource): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_source.*.update', "prospect_source.{$prospectSource->id}.update"], denyResponse: 'You do not have permission to update this prospect source.' ); } - public function delete(User $user, ProspectSource $prospectSource): Response + public function delete(Authenticatable $authenticatable, ProspectSource $prospectSource): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_source.*.delete', "prospect_source.{$prospectSource->id}.delete"], denyResponse: 'You do not have permission to delete this prospect source.' ); } - public function restore(User $user, ProspectSource $prospectSource): Response + public function restore(Authenticatable $authenticatable, ProspectSource $prospectSource): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_source.*.restore', "prospect_source.{$prospectSource->id}.restore"], denyResponse: 'You do not have permission to restore this prospect source.' ); } - public function forceDelete(User $user, ProspectSource $prospectSource): Response + public function forceDelete(Authenticatable $authenticatable, ProspectSource $prospectSource): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_source.*.force-delete', "prospect_source.{$prospectSource->id}.force-delete"], denyResponse: 'You do not have permission to force delete this prospect source.' ); diff --git a/app-modules/prospect/src/Policies/ProspectStatusPolicy.php b/app-modules/prospect/src/Policies/ProspectStatusPolicy.php index a8046daf41..498c8177a8 100644 --- a/app-modules/prospect/src/Policies/ProspectStatusPolicy.php +++ b/app-modules/prospect/src/Policies/ProspectStatusPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Prospect\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Prospect\Models\ProspectStatus; class ProspectStatusPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'prospect_status.view-any', denyResponse: 'You do not have permission to view prospect statuses.' ); } - public function view(User $user, ProspectStatus $prospectStatus): Response + public function view(Authenticatable $authenticatable, ProspectStatus $prospectStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_status.*.view', "prospect_status.{$prospectStatus->id}.view"], denyResponse: 'You do not have permission to view prospect statuses.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'prospect_status.create', denyResponse: 'You do not have permission to create prospect statuses.' ); } - public function update(User $user, ProspectStatus $prospectStatus): Response + public function update(Authenticatable $authenticatable, ProspectStatus $prospectStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_status.*.update', "prospect_status.{$prospectStatus->id}.update"], denyResponse: 'You do not have permission to update prospect statuses.' ); } - public function delete(User $user, ProspectStatus $prospectStatus): Response + public function delete(Authenticatable $authenticatable, ProspectStatus $prospectStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_status.*.delete', "prospect_status.{$prospectStatus->id}.delete"], denyResponse: 'You do not have permission to delete prospect statuses.' ); } - public function restore(User $user, ProspectStatus $prospectStatus): Response + public function restore(Authenticatable $authenticatable, ProspectStatus $prospectStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_status.*.restore', "prospect_status.{$prospectStatus->id}.restore"], denyResponse: 'You do not have permission to restore prospect statuses.' ); } - public function forceDelete(User $user, ProspectStatus $prospectStatus): Response + public function forceDelete(Authenticatable $authenticatable, ProspectStatus $prospectStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['prospect_status.*.force-delete', "prospect_status.{$prospectStatus->id}.force-delete"], denyResponse: 'You do not have permission to force delete prospect statuses.' ); diff --git a/app-modules/prospect/src/Providers/ProspectServiceProvider.php b/app-modules/prospect/src/Providers/ProspectServiceProvider.php index 9abb777bec..851bade0db 100644 --- a/app-modules/prospect/src/Providers/ProspectServiceProvider.php +++ b/app-modules/prospect/src/Providers/ProspectServiceProvider.php @@ -37,6 +37,7 @@ namespace AdvisingApp\Prospect\Providers; use Filament\Panel; +use App\Concerns\GraphSchemaDiscovery; use Illuminate\Support\ServiceProvider; use AdvisingApp\Prospect\ProspectPlugin; use AdvisingApp\Prospect\Models\Prospect; @@ -48,12 +49,14 @@ class ProspectServiceProvider extends ServiceProvider { + use GraphSchemaDiscovery; + public function register(): void { Panel::configureUsing(fn (Panel $panel) => $panel->plugin(new ProspectPlugin())); } - public function boot(AuthorizationPermissionRegistry $permissionRegistry, AuthorizationRoleRegistry $roleRegistry): void + public function boot(): void { Relation::morphMap([ 'prospect' => Prospect::class, @@ -61,6 +64,15 @@ public function boot(AuthorizationPermissionRegistry $permissionRegistry, Author 'prospect_status' => ProspectStatus::class, ]); + $this->registerRolesAndPermissions(); + + $this->discoverSchema(__DIR__ . '/../../graphql/prospect.graphql'); + } + + public function registerRolesAndPermissions(): void + { + $permissionRegistry = app(AuthorizationPermissionRegistry::class); + $permissionRegistry->registerApiPermissions( module: 'prospect', path: 'permissions/api/custom' @@ -71,6 +83,8 @@ public function boot(AuthorizationPermissionRegistry $permissionRegistry, Author path: 'permissions/web/custom' ); + $roleRegistry = app(AuthorizationRoleRegistry::class); + $roleRegistry->registerApiRoles( module: 'prospect', path: 'roles/api' diff --git a/app-modules/service-management/src/Policies/ServiceRequestAssignmentPolicy.php b/app-modules/service-management/src/Policies/ServiceRequestAssignmentPolicy.php index 2ac99216d7..6258416bc3 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestAssignmentPolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestAssignmentPolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestAssignment; -class ServiceRequestAssignmentPolicy +class ServiceRequestAssignmentPolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_assignment.view-any', denyResponse: 'You do not have permissions to view service request assignments.' ); } - public function view(User $user, ServiceRequestAssignment $serviceRequestAssignment): Response + public function view(Authenticatable $authenticatable, ServiceRequestAssignment $serviceRequestAssignment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_assignment.*.view', "service_request_assignment.{$serviceRequestAssignment->id}.view"], denyResponse: 'You do not have permissions to view this service request assignment.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_assignment.create', denyResponse: 'You do not have permissions to create service request assignments.' ); } - public function update(User $user, ServiceRequestAssignment $serviceRequestAssignment): Response + public function update(Authenticatable $authenticatable, ServiceRequestAssignment $serviceRequestAssignment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_assignment.*.update', "service_request_assignment.{$serviceRequestAssignment->id}.update"], denyResponse: 'You do not have permissions to update this service request assignment.' ); } - public function delete(User $user, ServiceRequestAssignment $serviceRequestAssignment): Response + public function delete(Authenticatable $authenticatable, ServiceRequestAssignment $serviceRequestAssignment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_assignment.*.delete', "service_request_assignment.{$serviceRequestAssignment->id}.delete"], denyResponse: 'You do not have permissions to delete this service request assignment.' ); } - public function restore(User $user, ServiceRequestAssignment $serviceRequestAssignment): Response + public function restore(Authenticatable $authenticatable, ServiceRequestAssignment $serviceRequestAssignment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_assignment.*.restore', "service_request_assignment.{$serviceRequestAssignment->id}.restore"], denyResponse: 'You do not have permissions to restore this service request assignment.' ); } - public function forceDelete(User $user, ServiceRequestAssignment $serviceRequestAssignment): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestAssignment $serviceRequestAssignment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_assignment.*.force-delete', "service_request_assignment.{$serviceRequestAssignment->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request assignment.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestHistoryPolicy.php b/app-modules/service-management/src/Policies/ServiceRequestHistoryPolicy.php index f6ed29254c..d99a96a347 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestHistoryPolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestHistoryPolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestHistory; -class ServiceRequestHistoryPolicy +class ServiceRequestHistoryPolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_history.view-any', denyResponse: 'You do not have permissions to view service request history.' ); } - public function view(User $user, ServiceRequestHistory $serviceRequestHistory): Response + public function view(Authenticatable $authenticatable, ServiceRequestHistory $serviceRequestHistory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_history.*.view', "service_request_history.{$serviceRequestHistory->id}.view"], denyResponse: 'You do not have permissions to view this service request history.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_history.create', denyResponse: 'You do not have permissions to create service request history.' ); } - public function update(User $user, ServiceRequestHistory $serviceRequestHistory): Response + public function update(Authenticatable $authenticatable, ServiceRequestHistory $serviceRequestHistory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_history.*.update', "service_request_history.{$serviceRequestHistory->id}.update"], denyResponse: 'You do not have permissions to update this service request history.' ); } - public function delete(User $user, ServiceRequestHistory $serviceRequestHistory): Response + public function delete(Authenticatable $authenticatable, ServiceRequestHistory $serviceRequestHistory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_history.*.delete', "service_request_history.{$serviceRequestHistory->id}.delete"], denyResponse: 'You do not have permissions to delete this service request history.' ); } - public function restore(User $user, ServiceRequestHistory $serviceRequestHistory): Response + public function restore(Authenticatable $authenticatable, ServiceRequestHistory $serviceRequestHistory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_history.*.restore', "service_request_history.{$serviceRequestHistory->id}.restore"], denyResponse: 'You do not have permissions to restore this service request history.' ); } - public function forceDelete(User $user, ServiceRequestHistory $serviceRequestHistory): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestHistory $serviceRequestHistory): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_history.*.force-delete', "service_request_history.{$serviceRequestHistory->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request history.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestPolicy.php b/app-modules/service-management/src/Policies/ServiceRequestPolicy.php index f628f64eb5..53a2e0d6ba 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestPolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestPolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequest; -class ServiceRequestPolicy +class ServiceRequestPolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request.view-any', denyResponse: 'You do not have permission to view service requests.' ); } - public function view(User $user, ServiceRequest $serviceRequest): Response + public function view(Authenticatable $authenticatable, ServiceRequest $serviceRequest): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request.*.view', "service_request.{$serviceRequest->id}.view"], denyResponse: 'You do not have permission to view this service request.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request.create', denyResponse: 'You do not have permission to create service requests.' ); } - public function update(User $user, ServiceRequest $serviceRequest): Response + public function update(Authenticatable $authenticatable, ServiceRequest $serviceRequest): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request.*.update', "service_request.{$serviceRequest->id}.update"], denyResponse: 'You do not have permission to update this service request.' ); } - public function delete(User $user, ServiceRequest $serviceRequest): Response + public function delete(Authenticatable $authenticatable, ServiceRequest $serviceRequest): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request.*.delete', "service_request.{$serviceRequest->id}.delete"], denyResponse: 'You do not have permission to delete this service request.' ); } - public function restore(User $user, ServiceRequest $serviceRequest): Response + public function restore(Authenticatable $authenticatable, ServiceRequest $serviceRequest): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request.*.restore', "service_request.{$serviceRequest->id}.restore"], denyResponse: 'You do not have permission to restore this service request.' ); } - public function forceDelete(User $user, ServiceRequest $serviceRequest): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequest $serviceRequest): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request.*.force-delete', "service_request.{$serviceRequest->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this service request.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestPriorityPolicy.php b/app-modules/service-management/src/Policies/ServiceRequestPriorityPolicy.php index b171613776..84ced8a002 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestPriorityPolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestPriorityPolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestPriority; -class ServiceRequestPriorityPolicy +class ServiceRequestPriorityPolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_priority.view-any', denyResponse: 'You do not have permissions to view service request priorities.' ); } - public function view(User $user, ServiceRequestPriority $serviceRequestPriority): Response + public function view(Authenticatable $authenticatable, ServiceRequestPriority $serviceRequestPriority): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_priority.*.view', "service_request_priority.{$serviceRequestPriority->id}.view"], denyResponse: 'You do not have permissions to view this service request priority.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_priority.create', denyResponse: 'You do not have permissions to create service request priorities.' ); } - public function update(User $user, ServiceRequestPriority $serviceRequestPriority): Response + public function update(Authenticatable $authenticatable, ServiceRequestPriority $serviceRequestPriority): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_priority.*.update', "service_request_priority.{$serviceRequestPriority->id}.update"], denyResponse: 'You do not have permissions to update this service request priority.' ); } - public function delete(User $user, ServiceRequestPriority $serviceRequestPriority): Response + public function delete(Authenticatable $authenticatable, ServiceRequestPriority $serviceRequestPriority): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_priority.*.delete', "service_request_priority.{$serviceRequestPriority->id}.delete"], denyResponse: 'You do not have permissions to delete this service request priority.' ); } - public function restore(User $user, ServiceRequestPriority $serviceRequestPriority): Response + public function restore(Authenticatable $authenticatable, ServiceRequestPriority $serviceRequestPriority): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_priority.*.restore', "service_request_priority.{$serviceRequestPriority->id}.restore"], denyResponse: 'You do not have permissions to restore this service request priority.' ); } - public function forceDelete(User $user, ServiceRequestPriority $serviceRequestPriority): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestPriority $serviceRequestPriority): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_priority.*.force-delete', "service_request_priority.{$serviceRequestPriority->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request priority.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestStatusPolicy.php b/app-modules/service-management/src/Policies/ServiceRequestStatusPolicy.php index 36d2aa05ad..fde684d696 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestStatusPolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestStatusPolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestStatus; -class ServiceRequestStatusPolicy +class ServiceRequestStatusPolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_status.view-any', denyResponse: 'You do not have permissions to view service request statuses.' ); } - public function view(User $user, ServiceRequestStatus $serviceRequestStatus): Response + public function view(Authenticatable $authenticatable, ServiceRequestStatus $serviceRequestStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_status.*.view', "service_request_status.{$serviceRequestStatus->id}.view"], denyResponse: 'You do not have permissions to view this service request status.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_status.create', denyResponse: 'You do not have permissions to create service request statuses.' ); } - public function update(User $user, ServiceRequestStatus $serviceRequestStatus): Response + public function update(Authenticatable $authenticatable, ServiceRequestStatus $serviceRequestStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_status.*.update', "service_request_status.{$serviceRequestStatus->id}.update"], denyResponse: 'You do not have permissions to update this service request status.' ); } - public function delete(User $user, ServiceRequestStatus $serviceRequestStatus): Response + public function delete(Authenticatable $authenticatable, ServiceRequestStatus $serviceRequestStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_status.*.delete', "service_request_status.{$serviceRequestStatus->id}.delete"], denyResponse: 'You do not have permissions to delete this service request status.' ); } - public function restore(User $user, ServiceRequestStatus $serviceRequestStatus): Response + public function restore(Authenticatable $authenticatable, ServiceRequestStatus $serviceRequestStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_status.*.restore', "service_request_status.{$serviceRequestStatus->id}.restore"], denyResponse: 'You do not have permissions to restore this service request status.' ); } - public function forceDelete(User $user, ServiceRequestStatus $serviceRequestStatus): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestStatus $serviceRequestStatus): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_status.*.force-delete', "service_request_status.{$serviceRequestStatus->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request status.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestTypePolicy.php b/app-modules/service-management/src/Policies/ServiceRequestTypePolicy.php index 71946aa00d..349df3a9f5 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestTypePolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestTypePolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestType; -class ServiceRequestTypePolicy +class ServiceRequestTypePolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_type.view-any', denyResponse: 'You do not have permissions to view service request types.' ); } - public function view(User $user, ServiceRequestType $serviceRequestType): Response + public function view(Authenticatable $authenticatable, ServiceRequestType $serviceRequestType): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_type.*.view', "service_request_type.{$serviceRequestType->id}.view"], denyResponse: 'You do not have permissions to view this service request type.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_type.create', denyResponse: 'You do not have permissions to create service request types.' ); } - public function update(User $user, ServiceRequestType $serviceRequestType): Response + public function update(Authenticatable $authenticatable, ServiceRequestType $serviceRequestType): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_type.*.update', "service_request_type.{$serviceRequestType->id}.update"], denyResponse: 'You do not have permissions to update this service request type.' ); } - public function delete(User $user, ServiceRequestType $serviceRequestType): Response + public function delete(Authenticatable $authenticatable, ServiceRequestType $serviceRequestType): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_type.*.delete', "service_request_type.{$serviceRequestType->id}.delete"], denyResponse: 'You do not have permissions to delete this service request type.' ); } - public function restore(User $user, ServiceRequestType $serviceRequestType): Response + public function restore(Authenticatable $authenticatable, ServiceRequestType $serviceRequestType): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_type.*.restore', "service_request_type.{$serviceRequestType->id}.restore"], denyResponse: 'You do not have permissions to restore this service request type.' ); } - public function forceDelete(User $user, ServiceRequestType $serviceRequestType): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestType $serviceRequestType): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_type.*.force-delete', "service_request_type.{$serviceRequestType->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request type.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/src/Policies/ServiceRequestUpdatePolicy.php b/app-modules/service-management/src/Policies/ServiceRequestUpdatePolicy.php index 16ea9d089d..b6fd91298e 100644 --- a/app-modules/service-management/src/Policies/ServiceRequestUpdatePolicy.php +++ b/app-modules/service-management/src/Policies/ServiceRequestUpdatePolicy.php @@ -36,65 +36,75 @@ namespace AdvisingApp\ServiceManagement\Policies; -use App\Models\User; +use App\Enums\Feature; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; +use App\Concerns\FeatureAccessEnforcedPolicyBefore; +use App\Policies\Contracts\FeatureAccessEnforcedPolicy; use AdvisingApp\ServiceManagement\Models\ServiceRequestUpdate; -class ServiceRequestUpdatePolicy +class ServiceRequestUpdatePolicy implements FeatureAccessEnforcedPolicy { - public function viewAny(User $user): Response + use FeatureAccessEnforcedPolicyBefore; + + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_update.view-any', denyResponse: 'You do not have permissions to view service request updates.' ); } - public function view(User $user, ServiceRequestUpdate $serviceRequestUpdate): Response + public function view(Authenticatable $authenticatable, ServiceRequestUpdate $serviceRequestUpdate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_update.*.view', "service_request_update.{$serviceRequestUpdate->id}.view"], denyResponse: 'You do not have permissions to view this service request update.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'service_request_update.create', denyResponse: 'You do not have permissions to create service request updates.' ); } - public function update(User $user, ServiceRequestUpdate $serviceRequestUpdate): Response + public function update(Authenticatable $authenticatable, ServiceRequestUpdate $serviceRequestUpdate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_update.*.update', "service_request_update.{$serviceRequestUpdate->id}.update"], denyResponse: 'You do not have permissions to update this service request update.' ); } - public function delete(User $user, ServiceRequestUpdate $serviceRequestUpdate): Response + public function delete(Authenticatable $authenticatable, ServiceRequestUpdate $serviceRequestUpdate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_update.*.delete', "service_request_update.{$serviceRequestUpdate->id}.delete"], denyResponse: 'You do not have permissions to delete this service request update.' ); } - public function restore(User $user, ServiceRequestUpdate $serviceRequestUpdate): Response + public function restore(Authenticatable $authenticatable, ServiceRequestUpdate $serviceRequestUpdate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_update.*.restore', "service_request_update.{$serviceRequestUpdate->id}.restore"], denyResponse: 'You do not have permissions to restore this service request update.' ); } - public function forceDelete(User $user, ServiceRequestUpdate $serviceRequestUpdate): Response + public function forceDelete(Authenticatable $authenticatable, ServiceRequestUpdate $serviceRequestUpdate): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['service_request_update.*.force-delete', "service_request_update.{$serviceRequestUpdate->id}.force-delete"], denyResponse: 'You do not have permissions to force delete this service request update.' ); } + + protected function requiredFeatures(): array + { + return [Feature::ServiceManagement]; + } } diff --git a/app-modules/service-management/tests/RequestFactories/CreateServiceRequestRequestFactory.php b/app-modules/service-management/tests/RequestFactories/CreateServiceRequestRequestFactory.php index fe9254c4c9..87a97842d2 100644 --- a/app-modules/service-management/tests/RequestFactories/CreateServiceRequestRequestFactory.php +++ b/app-modules/service-management/tests/RequestFactories/CreateServiceRequestRequestFactory.php @@ -47,7 +47,7 @@ class CreateServiceRequestRequestFactory extends RequestFactory public function definition(): array { return [ - 'division_id' => Division::factory()->create()->id, + 'division_id' => Division::inRandomOrder()->first()?->id ?? Division::factory()->create()->id, 'status_id' => ServiceRequestStatus::factory()->create()->id, 'priority_id' => ServiceRequestPriority::factory()->create()->id, 'type_id' => ServiceRequestType::factory()->create()->id, diff --git a/app-modules/service-management/tests/RequestFactories/EditServiceRequestRequestFactory.php b/app-modules/service-management/tests/RequestFactories/EditServiceRequestRequestFactory.php index cd4d5211de..fe168cc213 100644 --- a/app-modules/service-management/tests/RequestFactories/EditServiceRequestRequestFactory.php +++ b/app-modules/service-management/tests/RequestFactories/EditServiceRequestRequestFactory.php @@ -47,7 +47,7 @@ class EditServiceRequestRequestFactory extends RequestFactory public function definition(): array { return [ - 'division_id' => Division::factory()->create()->id, + 'division_id' => Division::inRandomOrder()->first()?->id ?? Division::factory()->create()->id, 'status_id' => ServiceRequestStatus::factory()->create()->id, 'priority_id' => ServiceRequestPriority::factory()->create()->id, 'type_id' => ServiceRequestType::factory()->create()->id, diff --git a/app-modules/service-management/tests/ServiceRequest/CreateServiceRequestTest.php b/app-modules/service-management/tests/ServiceRequest/CreateServiceRequestTest.php index 8f6a80b930..66779f517e 100644 --- a/app-modules/service-management/tests/ServiceRequest/CreateServiceRequestTest.php +++ b/app-modules/service-management/tests/ServiceRequest/CreateServiceRequestTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function PHPUnit\Framework\assertCount; @@ -46,6 +49,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequest; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\CreateServiceRequestRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestResource\Pages\CreateServiceRequest; test('A successful action on the CreateServiceRequest page', function () { asSuperAdmin() @@ -182,3 +186,48 @@ ->and($serviceRequest->type->id) ->toEqual($request->get('type_id')); }); + +test('CreateServiceRequest is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('create') + )->assertForbidden(); + + $user->givePermissionTo('service_request.view-any'); + $user->givePermissionTo('service_request.create'); + + livewire(CreateServiceRequest::class) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('create') + )->assertSuccessful(); + + $request = collect(CreateServiceRequestRequestFactory::new()->create()); + + livewire(CreateServiceRequest::class) + ->fillForm($request->toArray()) + ->call('create') + ->assertHasNoFormErrors(); + + assertCount(1, ServiceRequest::all()); + + assertDatabaseHas(ServiceRequest::class, $request->except('division_id')->toArray()); + + $serviceRequest = ServiceRequest::first(); + + expect($serviceRequest->division->id)->toEqual($request['division_id']); +}); diff --git a/app-modules/service-management/tests/ServiceRequest/EditServiceRequestTest.php b/app-modules/service-management/tests/ServiceRequest/EditServiceRequestTest.php index 66b496efc9..366aeea70a 100644 --- a/app-modules/service-management/tests/ServiceRequest/EditServiceRequestTest.php +++ b/app-modules/service-management/tests/ServiceRequest/EditServiceRequestTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function Pest\Laravel\assertDatabaseHas; @@ -44,6 +47,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequest; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\EditServiceRequestRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestResource\Pages\EditServiceRequest; test('A successful action on the EditServiceRequest page', function () { $serviceRequest = ServiceRequest::factory()->create(); @@ -201,3 +205,54 @@ ->and($serviceRequest->type->id) ->toEqual($request->get('type_id')); }); + +test('EditServiceRequest is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request.view-any'); + $user->givePermissionTo('service_request.*.update'); + + $serviceRequest = ServiceRequest::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('edit', [ + 'record' => $serviceRequest, + ]) + )->assertForbidden(); + + livewire(EditServiceRequest::class, [ + 'record' => $serviceRequest->getRouteKey(), + ]) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('edit', [ + 'record' => $serviceRequest, + ]) + )->assertSuccessful(); + + $request = collect(EditServiceRequestRequestFactory::new()->create()); + + livewire(EditServiceRequest::class, [ + 'record' => $serviceRequest->getRouteKey(), + ]) + ->fillForm($request->toArray()) + ->call('save') + ->assertHasNoFormErrors(); + + expect($serviceRequest->fresh()->only($request->except('division_id')->keys()->toArray())) + ->toEqual($request->except('division_id')->toArray()) + ->and($serviceRequest->fresh()->division->id)->toEqual($request['division_id']); +}); diff --git a/app-modules/service-management/tests/ServiceRequest/ListServiceRequestsTest.php b/app-modules/service-management/tests/ServiceRequest/ListServiceRequestsTest.php index ad5ab1f7e9..97086c9b0a 100644 --- a/app-modules/service-management/tests/ServiceRequest/ListServiceRequestsTest.php +++ b/app-modules/service-management/tests/ServiceRequest/ListServiceRequestsTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -117,3 +120,29 @@ ServiceRequestResource::getUrl('index') )->assertSuccessful(); }); + +test('ListServiceRequests is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request.view-any'); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl() + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl() + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequest/ViewServiceRequestTest.php b/app-modules/service-management/tests/ServiceRequest/ViewServiceRequestTest.php index a3c20b55f9..4038d381fe 100644 --- a/app-modules/service-management/tests/ServiceRequest/ViewServiceRequestTest.php +++ b/app-modules/service-management/tests/ServiceRequest/ViewServiceRequestTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use AdvisingApp\ServiceManagement\Models\ServiceRequest; @@ -96,3 +99,36 @@ ]) )->assertSuccessful(); }); + +test('ViewServiceRequest is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request.view-any'); + $user->givePermissionTo('service_request.*.view'); + + $serviceRequest = ServiceRequest::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('view', [ + 'record' => $serviceRequest, + ]) + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestResource::getUrl('view', [ + 'record' => $serviceRequest, + ]) + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestPriority/CreateServiceRequestPriorityTest.php b/app-modules/service-management/tests/ServiceRequestPriority/CreateServiceRequestPriorityTest.php index 925152d0ae..1cb8248d32 100644 --- a/app-modules/service-management/tests/ServiceRequestPriority/CreateServiceRequestPriorityTest.php +++ b/app-modules/service-management/tests/ServiceRequestPriority/CreateServiceRequestPriorityTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function PHPUnit\Framework\assertCount; @@ -46,6 +49,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestPriority; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestPriorityResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\CreateServiceRequestPriorityRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestPriorityResource\Pages\CreateServiceRequestPriority; test('A successful action on the CreateServiceRequestPriority page', function () { asSuperAdmin() @@ -116,3 +120,44 @@ assertDatabaseHas(ServiceRequestPriority::class, $request->toArray()); }); + +test('CreateServiceRequestPriority is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_priority.view-any'); + $user->givePermissionTo('service_request_priority.create'); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('create') + )->assertForbidden(); + + livewire(CreateServiceRequestPriority::class) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('create') + )->assertSuccessful(); + + $request = collect(CreateServiceRequestPriorityRequestFactory::new()->create()); + + livewire(CreateServiceRequestPriority::class) + ->fillForm($request->toArray()) + ->call('create') + ->assertHasNoFormErrors(); + + assertCount(1, ServiceRequestPriority::all()); + + assertDatabaseHas(ServiceRequestPriority::class, $request->toArray()); +}); diff --git a/app-modules/service-management/tests/ServiceRequestPriority/EditServiceRequestPriorityTest.php b/app-modules/service-management/tests/ServiceRequestPriority/EditServiceRequestPriorityTest.php index c30ecdba66..c37fb7acdf 100644 --- a/app-modules/service-management/tests/ServiceRequestPriority/EditServiceRequestPriorityTest.php +++ b/app-modules/service-management/tests/ServiceRequestPriority/EditServiceRequestPriorityTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function Pest\Laravel\assertDatabaseHas; @@ -45,6 +48,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestPriority; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestPriorityResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\EditServiceRequestPriorityRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestPriorityResource\Pages\EditServiceRequestPriority; test('A successful action on the EditServiceRequestPriority page', function () { $serviceRequestPriority = ServiceRequestPriority::factory()->create(); @@ -135,3 +139,52 @@ assertEquals($request['name'], $serviceRequestPriority->fresh()->name); }); + +test('EditServiceRequestPriority is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_priority.view-any'); + $user->givePermissionTo('service_request_priority.*.update'); + + $serviceRequestPriority = ServiceRequestPriority::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('edit', [ + 'record' => $serviceRequestPriority, + ]) + )->assertForbidden(); + + livewire(EditServiceRequestPriority::class, [ + 'record' => $serviceRequestPriority->getRouteKey(), + ]) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('edit', [ + 'record' => $serviceRequestPriority, + ]) + )->assertSuccessful(); + + $request = collect(EditServiceRequestPriorityRequestFactory::new()->create()); + + livewire(EditServiceRequestPriority::class, [ + 'record' => $serviceRequestPriority->getRouteKey(), + ]) + ->fillForm($request->toArray()) + ->call('save') + ->assertHasNoFormErrors(); + + assertEquals($request['name'], $serviceRequestPriority->fresh()->name); +}); diff --git a/app-modules/service-management/tests/ServiceRequestPriority/ListServiceRequestPrioritiesTest.php b/app-modules/service-management/tests/ServiceRequestPriority/ListServiceRequestPrioritiesTest.php index b22d3bcacc..e2109153ac 100644 --- a/app-modules/service-management/tests/ServiceRequestPriority/ListServiceRequestPrioritiesTest.php +++ b/app-modules/service-management/tests/ServiceRequestPriority/ListServiceRequestPrioritiesTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -100,3 +103,29 @@ ServiceRequestPriorityResource::getUrl('index') )->assertSuccessful(); }); + +test('ListServiceRequestPriorities is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_priority.view-any'); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl() + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl() + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestPriority/ViewServiceRequestPriorityTest.php b/app-modules/service-management/tests/ServiceRequestPriority/ViewServiceRequestPriorityTest.php index 5f438e817b..baac133a50 100644 --- a/app-modules/service-management/tests/ServiceRequestPriority/ViewServiceRequestPriorityTest.php +++ b/app-modules/service-management/tests/ServiceRequestPriority/ViewServiceRequestPriorityTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use AdvisingApp\ServiceManagement\Models\ServiceRequestPriority; @@ -86,3 +89,36 @@ ]) )->assertSuccessful(); }); + +test('ViewServiceRequestPriority is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_priority.view-any'); + $user->givePermissionTo('service_request_priority.*.view'); + + $serviceRequestPriority = ServiceRequestPriority::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('view', [ + 'record' => $serviceRequestPriority, + ]) + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestPriorityResource::getUrl('view', [ + 'record' => $serviceRequestPriority, + ]) + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestStatus/CreateServiceRequestStatusTest.php b/app-modules/service-management/tests/ServiceRequestStatus/CreateServiceRequestStatusTest.php index 6ecd4e5780..878ed4e937 100644 --- a/app-modules/service-management/tests/ServiceRequestStatus/CreateServiceRequestStatusTest.php +++ b/app-modules/service-management/tests/ServiceRequestStatus/CreateServiceRequestStatusTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -49,6 +52,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestStatus; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestStatusResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\CreateServiceRequestStatusRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestStatusResource\Pages\CreateServiceRequestStatus; test('A successful action on the CreateServiceRequestStatus page', function () { asSuperAdmin() @@ -119,3 +123,44 @@ assertDatabaseHas(ServiceRequestStatus::class, $request->toArray()); }); + +test('CreateServiceRequestStatus is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_status.view-any'); + $user->givePermissionTo('service_request_status.create'); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('create') + )->assertForbidden(); + + livewire(CreateServiceRequestStatus::class) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('create') + )->assertSuccessful(); + + $request = collect(CreateServiceRequestStatusRequestFactory::new()->create()); + + livewire(CreateServiceRequestStatus::class) + ->fillForm($request->toArray()) + ->call('create') + ->assertHasNoFormErrors(); + + assertCount(1, ServiceRequestStatus::all()); + + assertDatabaseHas(ServiceRequestStatus::class, $request->toArray()); +}); diff --git a/app-modules/service-management/tests/ServiceRequestStatus/EditServiceRequestStatusTest.php b/app-modules/service-management/tests/ServiceRequestStatus/EditServiceRequestStatusTest.php index 22bcee8e7a..7ce9c2d13c 100644 --- a/app-modules/service-management/tests/ServiceRequestStatus/EditServiceRequestStatusTest.php +++ b/app-modules/service-management/tests/ServiceRequestStatus/EditServiceRequestStatusTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -48,6 +51,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestStatus; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestStatusResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\EditServiceRequestStatusRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestStatusResource\Pages\EditServiceRequestStatus; test('A successful action on the EditServiceRequestStatus page', function () { $serviceRequestStatus = ServiceRequestStatus::factory()->create(); @@ -62,7 +66,7 @@ $editRequest = EditServiceRequestStatusRequestFactory::new()->create(); - livewire(ServiceRequestStatusResource\Pages\EditServiceRequestStatus::class, [ + livewire(EditServiceRequestStatus::class, [ 'record' => $serviceRequestStatus->getRouteKey(), ]) ->assertFormSet([ @@ -84,7 +88,7 @@ $serviceRequestStatus = ServiceRequestStatus::factory()->create(); - livewire(ServiceRequestStatusResource\Pages\EditServiceRequestStatus::class, [ + livewire(EditServiceRequestStatus::class, [ 'record' => $serviceRequestStatus->getRouteKey(), ]) ->assertFormSet([ @@ -120,7 +124,7 @@ ]) )->assertForbidden(); - livewire(ServiceRequestStatusResource\Pages\EditServiceRequestStatus::class, [ + livewire(EditServiceRequestStatus::class, [ 'record' => $serviceRequestStatus->getRouteKey(), ]) ->assertForbidden(); @@ -137,7 +141,56 @@ $request = collect(EditServiceRequestStatusRequestFactory::new()->create()); - livewire(ServiceRequestStatusResource\Pages\EditServiceRequestStatus::class, [ + livewire(EditServiceRequestStatus::class, [ + 'record' => $serviceRequestStatus->getRouteKey(), + ]) + ->fillForm($request->toArray()) + ->call('save') + ->assertHasNoFormErrors(); + + assertEquals($request['name'], $serviceRequestStatus->fresh()->name); +}); + +test('EditServiceRequestStatus is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_status.view-any'); + $user->givePermissionTo('service_request_status.*.update'); + + $serviceRequestStatus = ServiceRequestStatus::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('edit', [ + 'record' => $serviceRequestStatus, + ]) + )->assertForbidden(); + + livewire(EditServiceRequestStatus::class, [ + 'record' => $serviceRequestStatus->getRouteKey(), + ]) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('edit', [ + 'record' => $serviceRequestStatus, + ]) + )->assertSuccessful(); + + $request = collect(EditServiceRequestStatusRequestFactory::new()->create()); + + livewire(EditServiceRequestStatus::class, [ 'record' => $serviceRequestStatus->getRouteKey(), ]) ->fillForm($request->toArray()) diff --git a/app-modules/service-management/tests/ServiceRequestStatus/ListServiceRequestStatusesTest.php b/app-modules/service-management/tests/ServiceRequestStatus/ListServiceRequestStatusesTest.php index 9309e093d4..f9cc3b7937 100644 --- a/app-modules/service-management/tests/ServiceRequestStatus/ListServiceRequestStatusesTest.php +++ b/app-modules/service-management/tests/ServiceRequestStatus/ListServiceRequestStatusesTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -105,3 +108,29 @@ ServiceRequestStatusResource::getUrl('index') )->assertSuccessful(); }); + +test('ListServiceRequestStatuses is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_status.view-any'); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl() + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl() + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestStatus/ViewServiceRequestStatusTest.php b/app-modules/service-management/tests/ServiceRequestStatus/ViewServiceRequestStatusTest.php index 643e3d4991..8562847e6a 100644 --- a/app-modules/service-management/tests/ServiceRequestStatus/ViewServiceRequestStatusTest.php +++ b/app-modules/service-management/tests/ServiceRequestStatus/ViewServiceRequestStatusTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use AdvisingApp\ServiceManagement\Models\ServiceRequestStatus; @@ -86,3 +89,36 @@ ]) )->assertSuccessful(); }); + +test('ViewServiceRequestStatus is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_status.view-any'); + $user->givePermissionTo('service_request_status.*.view'); + + $serviceRequestStatus = ServiceRequestStatus::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('view', [ + 'record' => $serviceRequestStatus, + ]) + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestStatusResource::getUrl('view', [ + 'record' => $serviceRequestStatus, + ]) + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestType/CreateServiceRequestTypeTest.php b/app-modules/service-management/tests/ServiceRequestType/CreateServiceRequestTypeTest.php index e4a86f54df..6e2aa777a0 100644 --- a/app-modules/service-management/tests/ServiceRequestType/CreateServiceRequestTypeTest.php +++ b/app-modules/service-management/tests/ServiceRequestType/CreateServiceRequestTypeTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function PHPUnit\Framework\assertCount; @@ -46,6 +49,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestType; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestTypeResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\CreateServiceRequestTypeRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestTypeResource\Pages\CreateServiceRequestType; test('A successful action on the CreateServiceRequestType page', function () { asSuperAdmin() @@ -114,3 +118,44 @@ assertDatabaseHas(ServiceRequestType::class, $request->toArray()); }); + +test('CreateServiceRequestType is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_type.view-any'); + $user->givePermissionTo('service_request_type.create'); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('create') + )->assertForbidden(); + + livewire(CreateServiceRequestType::class) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('create') + )->assertSuccessful(); + + $request = collect(CreateServiceRequestTypeRequestFactory::new()->create()); + + livewire(CreateServiceRequestType::class) + ->fillForm($request->toArray()) + ->call('create') + ->assertHasNoFormErrors(); + + assertCount(1, ServiceRequestType::all()); + + assertDatabaseHas(ServiceRequestType::class, $request->toArray()); +}); diff --git a/app-modules/service-management/tests/ServiceRequestType/EditServiceRequestTypeTest.php b/app-modules/service-management/tests/ServiceRequestType/EditServiceRequestTypeTest.php index 54035d9493..bb345f823c 100644 --- a/app-modules/service-management/tests/ServiceRequestType/EditServiceRequestTypeTest.php +++ b/app-modules/service-management/tests/ServiceRequestType/EditServiceRequestTypeTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use function Pest\Laravel\assertDatabaseHas; @@ -45,6 +48,7 @@ use AdvisingApp\ServiceManagement\Models\ServiceRequestType; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestTypeResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\EditServiceRequestTypeRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestTypeResource\Pages\EditServiceRequestType; test('A successful action on the EditServiceRequestType page', function () { $serviceRequestType = ServiceRequestType::factory()->create(); @@ -59,7 +63,7 @@ $editRequest = EditServiceRequestTypeRequestFactory::new()->create(); - livewire(ServiceRequestTypeResource\Pages\EditServiceRequestType::class, [ + livewire(EditServiceRequestType::class, [ 'record' => $serviceRequestType->getRouteKey(), ]) ->assertFormSet([ @@ -77,7 +81,7 @@ $serviceRequestType = ServiceRequestType::factory()->create(); - livewire(ServiceRequestTypeResource\Pages\EditServiceRequestType::class, [ + livewire(EditServiceRequestType::class, [ 'record' => $serviceRequestType->getRouteKey(), ]) ->assertFormSet([ @@ -109,7 +113,7 @@ ]) )->assertForbidden(); - livewire(ServiceRequestTypeResource\Pages\EditServiceRequestType::class, [ + livewire(EditServiceRequestType::class, [ 'record' => $serviceRequestType->getRouteKey(), ]) ->assertForbidden(); @@ -126,7 +130,56 @@ $request = collect(EditServiceRequestTypeRequestFactory::new()->create()); - livewire(ServiceRequestTypeResource\Pages\EditServiceRequestType::class, [ + livewire(EditServiceRequestType::class, [ + 'record' => $serviceRequestType->getRouteKey(), + ]) + ->fillForm($request->toArray()) + ->call('save') + ->assertHasNoFormErrors(); + + assertEquals($request['name'], $serviceRequestType->fresh()->name); +}); + +test('EditServiceRequestType is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_type.view-any'); + $user->givePermissionTo('service_request_type.*.update'); + + $serviceRequestType = ServiceRequestType::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('edit', [ + 'record' => $serviceRequestType, + ]) + )->assertForbidden(); + + livewire(EditServiceRequestType::class, [ + 'record' => $serviceRequestType->getRouteKey(), + ]) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('edit', [ + 'record' => $serviceRequestType, + ]) + )->assertSuccessful(); + + $request = collect(EditServiceRequestTypeRequestFactory::new()->create()); + + livewire(EditServiceRequestType::class, [ 'record' => $serviceRequestType->getRouteKey(), ]) ->fillForm($request->toArray()) diff --git a/app-modules/service-management/tests/ServiceRequestType/ListServiceRequestTypeTest.php b/app-modules/service-management/tests/ServiceRequestType/ListServiceRequestTypeTest.php index 271a7b72c3..6d74c49fa1 100644 --- a/app-modules/service-management/tests/ServiceRequestType/ListServiceRequestTypeTest.php +++ b/app-modules/service-management/tests/ServiceRequestType/ListServiceRequestTypeTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -95,3 +98,29 @@ ServiceRequestTypeResource::getUrl('index') )->assertSuccessful(); }); + +test('ListServiceRequestTypes is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_type.view-any'); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl() + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl() + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestType/ViewServiceRequestTypeTest.php b/app-modules/service-management/tests/ServiceRequestType/ViewServiceRequestTypeTest.php index b036775219..7abeb18d92 100644 --- a/app-modules/service-management/tests/ServiceRequestType/ViewServiceRequestTypeTest.php +++ b/app-modules/service-management/tests/ServiceRequestType/ViewServiceRequestTypeTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use AdvisingApp\ServiceManagement\Models\ServiceRequestType; @@ -84,3 +87,36 @@ ]) )->assertSuccessful(); }); + +test('ViewServiceRequestType is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_type.view-any'); + $user->givePermissionTo('service_request_type.*.view'); + + $serviceRequestType = ServiceRequestType::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('view', [ + 'record' => $serviceRequestType, + ]) + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestTypeResource::getUrl('view', [ + 'record' => $serviceRequestType, + ]) + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestUpdate/CreateServiceRequestUpdateTest.php b/app-modules/service-management/tests/ServiceRequestUpdate/CreateServiceRequestUpdateTest.php index d49b9966d4..7f057100da 100644 --- a/app-modules/service-management/tests/ServiceRequestUpdate/CreateServiceRequestUpdateTest.php +++ b/app-modules/service-management/tests/ServiceRequestUpdate/CreateServiceRequestUpdateTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -50,6 +53,7 @@ use AdvisingApp\Notifications\Events\TriggeredAutoSubscription; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestUpdateResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\CreateServiceRequestUpdateRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestUpdateResource\Pages\CreateServiceRequestUpdate; test('A successful action on the CreateServiceRequestUpdate page', function () { // Because we create a ServiceRequest there is already a Subscription created. @@ -137,3 +141,44 @@ assertDatabaseHas(ServiceRequestUpdate::class, $request->toArray()); }); + +test('CreateServiceRequestUpdate is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_update.view-any'); + $user->givePermissionTo('service_request_update.create'); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('create') + )->assertForbidden(); + + livewire(CreateServiceRequestUpdate::class) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('create') + )->assertSuccessful(); + + $request = collect(CreateServiceRequestUpdateRequestFactory::new()->create()); + + livewire(CreateServiceRequestUpdate::class) + ->fillForm($request->toArray()) + ->call('create') + ->assertHasNoFormErrors(); + + assertCount(1, ServiceRequestUpdate::all()); + + assertDatabaseHas(ServiceRequestUpdate::class, $request->toArray()); +}); diff --git a/app-modules/service-management/tests/ServiceRequestUpdate/EditServiceRequestUpdateTest.php b/app-modules/service-management/tests/ServiceRequestUpdate/EditServiceRequestUpdateTest.php index 98836ef332..46f0e55065 100644 --- a/app-modules/service-management/tests/ServiceRequestUpdate/EditServiceRequestUpdateTest.php +++ b/app-modules/service-management/tests/ServiceRequestUpdate/EditServiceRequestUpdateTest.php @@ -37,16 +37,21 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; use Illuminate\Validation\Rules\Enum; use function Pest\Laravel\assertDatabaseHas; +use function PHPUnit\Framework\assertEquals; use AdvisingApp\ServiceManagement\Models\ServiceRequestUpdate; use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestUpdateResource; use AdvisingApp\ServiceManagement\Tests\RequestFactories\EditServiceRequestUpdateRequestFactory; +use AdvisingApp\ServiceManagement\Filament\Resources\ServiceRequestUpdateResource\Pages\EditServiceRequestUpdate; test('A successful action on the EditServiceRequestUpdate page', function () { $serviceRequestUpdate = ServiceRequestUpdate::factory()->create(); @@ -61,7 +66,7 @@ $request = collect(EditServiceRequestUpdateRequestFactory::new()->create()); - livewire(ServiceRequestUpdateResource\Pages\EditServiceRequestUpdate::class, [ + livewire(EditServiceRequestUpdate::class, [ 'record' => $serviceRequestUpdate->getRouteKey(), ]) ->fillForm($request->toArray()) @@ -79,7 +84,7 @@ asSuperAdmin(); - livewire(ServiceRequestUpdateResource\Pages\EditServiceRequestUpdate::class, [ + livewire(EditServiceRequestUpdate::class, [ 'record' => $serviceRequestUpdate->getRouteKey(), ]) ->fillForm(EditServiceRequestUpdateRequestFactory::new($data)->create()) @@ -118,7 +123,7 @@ ]) )->assertForbidden(); - livewire(ServiceRequestUpdateResource\Pages\EditServiceRequestUpdate::class, [ + livewire(EditServiceRequestUpdate::class, [ 'record' => $serviceRequestUpdate->getRouteKey(), ]) ->assertForbidden(); @@ -135,7 +140,7 @@ $request = collect(EditServiceRequestUpdateRequestFactory::new()->create()); - livewire(ServiceRequestUpdateResource\Pages\EditServiceRequestUpdate::class, [ + livewire(EditServiceRequestUpdate::class, [ 'record' => $serviceRequestUpdate->getRouteKey(), ]) ->fillForm($request->toArray()) @@ -147,3 +152,52 @@ expect(ServiceRequestUpdate::first()->serviceRequest->id) ->toEqual($request->get('service_request_id')); }); + +test('EditServiceRequestUpdate is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_update.view-any'); + $user->givePermissionTo('service_request_update.*.update'); + + $serviceRequestUpdate = ServiceRequestUpdate::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('edit', [ + 'record' => $serviceRequestUpdate, + ]) + )->assertForbidden(); + + livewire(EditServiceRequestUpdate::class, [ + 'record' => $serviceRequestUpdate->getRouteKey(), + ]) + ->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('edit', [ + 'record' => $serviceRequestUpdate, + ]) + )->assertSuccessful(); + + $request = collect(EditServiceRequestUpdateRequestFactory::new()->create()); + + livewire(EditServiceRequestUpdate::class, [ + 'record' => $serviceRequestUpdate->getRouteKey(), + ]) + ->fillForm($request->toArray()) + ->call('save') + ->assertHasNoFormErrors(); + + assertEquals($request['update'], $serviceRequestUpdate->fresh()->update); +}); diff --git a/app-modules/service-management/tests/ServiceRequestUpdate/ListServiceRequestUpdatesTest.php b/app-modules/service-management/tests/ServiceRequestUpdate/ListServiceRequestUpdatesTest.php index 6ef0330189..f5328d0b60 100644 --- a/app-modules/service-management/tests/ServiceRequestUpdate/ListServiceRequestUpdatesTest.php +++ b/app-modules/service-management/tests/ServiceRequestUpdate/ListServiceRequestUpdatesTest.php @@ -38,6 +38,9 @@ use Illuminate\Support\Str; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use function Pest\Livewire\livewire; @@ -118,3 +121,29 @@ ServiceRequestUpdateResource::getUrl('index') )->assertSuccessful(); }); + +test('ListServiceRequestUpdates is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_update.view-any'); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl() + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl() + )->assertSuccessful(); +}); diff --git a/app-modules/service-management/tests/ServiceRequestUpdate/ViewServiceRequestUpdateTest.php b/app-modules/service-management/tests/ServiceRequestUpdate/ViewServiceRequestUpdateTest.php index 5b42032f01..78e59ec193 100644 --- a/app-modules/service-management/tests/ServiceRequestUpdate/ViewServiceRequestUpdateTest.php +++ b/app-modules/service-management/tests/ServiceRequestUpdate/ViewServiceRequestUpdateTest.php @@ -37,6 +37,9 @@ use App\Models\User; use function Tests\asSuperAdmin; + +use App\Settings\LicenseSettings; + use function Pest\Laravel\actingAs; use AdvisingApp\ServiceManagement\Models\ServiceRequestUpdate; @@ -90,3 +93,36 @@ ]) )->assertSuccessful(); }); + +test('ViewServiceRequestUpdate is gated with proper feature access control', function () { + $settings = app(LicenseSettings::class); + + $settings->data->addons->serviceManagement = false; + + $settings->save(); + + $user = User::factory()->create(); + + $user->givePermissionTo('service_request_update.view-any'); + $user->givePermissionTo('service_request_update.*.view'); + + $serviceRequestUpdate = ServiceRequestUpdate::factory()->create(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('view', [ + 'record' => $serviceRequestUpdate, + ]) + )->assertForbidden(); + + $settings->data->addons->serviceManagement = true; + + $settings->save(); + + actingAs($user) + ->get( + ServiceRequestUpdateResource::getUrl('view', [ + 'record' => $serviceRequestUpdate, + ]) + )->assertSuccessful(); +}); diff --git a/app-modules/student-data-model/graphql/student.graphql b/app-modules/student-data-model/graphql/student.graphql new file mode 100644 index 0000000000..d52072d00a --- /dev/null +++ b/app-modules/student-data-model/graphql/student.graphql @@ -0,0 +1,3 @@ +type Student { + sisid: ID! +} diff --git a/app-modules/student-data-model/src/Policies/EnrollmentPolicy.php b/app-modules/student-data-model/src/Policies/EnrollmentPolicy.php index 4c47a5be80..6c6b0ff2d8 100644 --- a/app-modules/student-data-model/src/Policies/EnrollmentPolicy.php +++ b/app-modules/student-data-model/src/Policies/EnrollmentPolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\StudentDataModel\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\StudentDataModel\Models\Enrollment; class EnrollmentPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'enrollment.view-any', denyResponse: 'You do not have permission to view enrollments.' ); } - public function view(User $user, Enrollment $enrollment): Response + public function view(Authenticatable $authenticatable, Enrollment $enrollment): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['enrollment.*.view', "enrollment.{$enrollment->id}.view"], denyResponse: 'You do not have permission to view this enrollment.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Enrollments cannot be created.'); } - public function update(User $user, Enrollment $enrollment): Response + public function update(Authenticatable $authenticatable, Enrollment $enrollment): Response { return Response::deny('Enrollments cannot be updated.'); } - public function delete(User $user, Enrollment $enrollment): Response + public function delete(Authenticatable $authenticatable, Enrollment $enrollment): Response { return Response::deny('Enrollments cannot be deleted.'); } - public function restore(User $user, Enrollment $enrollment): Response + public function restore(Authenticatable $authenticatable, Enrollment $enrollment): Response { return Response::deny('Enrollments cannot be restored.'); } - public function forceDelete(User $user, Enrollment $enrollment): Response + public function forceDelete(Authenticatable $authenticatable, Enrollment $enrollment): Response { return Response::deny('Enrollments cannot be force deleted.'); } diff --git a/app-modules/student-data-model/src/Policies/PerformancePolicy.php b/app-modules/student-data-model/src/Policies/PerformancePolicy.php index 55d9bb1352..60c124a632 100644 --- a/app-modules/student-data-model/src/Policies/PerformancePolicy.php +++ b/app-modules/student-data-model/src/Policies/PerformancePolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\StudentDataModel\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\StudentDataModel\Models\Performance; class PerformancePolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'performance.view-any', denyResponse: 'You do not have permission to view performances.' ); } - public function view(User $user, Performance $performance): Response + public function view(Authenticatable $authenticatable, Performance $performance): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['performance.*.view', "performance.{$performance->id}.view"], denyResponse: 'You do not have permission to view this performance.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Performances cannot be created.'); } - public function update(User $user, Performance $performance): Response + public function update(Authenticatable $authenticatable, Performance $performance): Response { return Response::deny('Performances cannot be updated.'); } - public function delete(User $user, Performance $performance): Response + public function delete(Authenticatable $authenticatable, Performance $performance): Response { return Response::deny('Performances cannot be deleted.'); } - public function restore(User $user, Performance $performance): Response + public function restore(Authenticatable $authenticatable, Performance $performance): Response { return Response::deny('Performances cannot be restored.'); } - public function forceDelete(User $user, Performance $performance): Response + public function forceDelete(Authenticatable $authenticatable, Performance $performance): Response { return Response::deny('Performances cannot be force deleted.'); } diff --git a/app-modules/student-data-model/src/Policies/ProgramPolicy.php b/app-modules/student-data-model/src/Policies/ProgramPolicy.php index 13d0414448..4b72a68f2b 100644 --- a/app-modules/student-data-model/src/Policies/ProgramPolicy.php +++ b/app-modules/student-data-model/src/Policies/ProgramPolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\StudentDataModel\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\StudentDataModel\Models\Program; class ProgramPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'program.view-any', denyResponse: 'You do not have permission to view programs.' ); } - public function view(User $user, Program $program): Response + public function view(Authenticatable $authenticatable, Program $program): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['program.*.view', "program.{$program->id}.view"], denyResponse: 'You do not have permission to view this program.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Programs cannot be created.'); } - public function update(User $user, Program $program): Response + public function update(Authenticatable $authenticatable, Program $program): Response { return Response::deny('Programs cannot be updated.'); } - public function delete(User $user, Program $program): Response + public function delete(Authenticatable $authenticatable, Program $program): Response { return Response::deny('Programs cannot be deleted.'); } - public function restore(User $user, Program $program): Response + public function restore(Authenticatable $authenticatable, Program $program): Response { return Response::deny('Programs cannot be restored.'); } - public function forceDelete(User $user, Program $program): Response + public function forceDelete(Authenticatable $authenticatable, Program $program): Response { return Response::deny('Programs cannot be force deleted.'); } diff --git a/app-modules/student-data-model/src/Policies/StudentPolicy.php b/app-modules/student-data-model/src/Policies/StudentPolicy.php index b5ca0b9075..d64427fd47 100644 --- a/app-modules/student-data-model/src/Policies/StudentPolicy.php +++ b/app-modules/student-data-model/src/Policies/StudentPolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\StudentDataModel\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\StudentDataModel\Models\Student; class StudentPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'student.view-any', denyResponse: 'You do not have permission to view students.' ); } - public function view(User $user, Student $student): Response + public function view(Authenticatable $authenticatable, Student $student): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['student.*.view', "student.{$student->id}.view"], denyResponse: 'You do not have permission to view this student.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Students cannot be created.'); } - public function update(User $user, Student $student): Response + public function update(Authenticatable $authenticatable, Student $student): Response { return Response::deny('Students cannot be updated.'); } - public function delete(User $user, Student $student): Response + public function delete(Authenticatable $authenticatable, Student $student): Response { return Response::deny('Students cannot be deleted.'); } - public function restore(User $user, Student $student): Response + public function restore(Authenticatable $authenticatable, Student $student): Response { return Response::deny('Students cannot be restored.'); } - public function forceDelete(User $user, Student $student): Response + public function forceDelete(Authenticatable $authenticatable, Student $student): Response { return Response::deny('Students cannot be force deleted.'); } diff --git a/app-modules/student-data-model/src/Providers/StudentDataModelServiceProvider.php b/app-modules/student-data-model/src/Providers/StudentDataModelServiceProvider.php index 4f70d4b165..0541f276f4 100644 --- a/app-modules/student-data-model/src/Providers/StudentDataModelServiceProvider.php +++ b/app-modules/student-data-model/src/Providers/StudentDataModelServiceProvider.php @@ -37,6 +37,7 @@ namespace AdvisingApp\StudentDataModel\Providers; use Filament\Panel; +use App\Concerns\GraphSchemaDiscovery; use Illuminate\Support\ServiceProvider; use AdvisingApp\StudentDataModel\Models\Program; use AdvisingApp\StudentDataModel\Models\Student; @@ -49,6 +50,8 @@ class StudentDataModelServiceProvider extends ServiceProvider { + use GraphSchemaDiscovery; + public function register(): void { Panel::configureUsing(fn (Panel $panel) => $panel->plugin(new StudentDataModelPlugin())); @@ -64,6 +67,8 @@ public function boot(): void ]); $this->registerRolesAndPermissions(); + + $this->discoverSchema(__DIR__ . '/../../graphql/student.graphql'); } protected function registerRolesAndPermissions(): void diff --git a/app-modules/task/src/Policies/TaskPolicy.php b/app-modules/task/src/Policies/TaskPolicy.php index 9af240c108..8cfd7703ff 100644 --- a/app-modules/task/src/Policies/TaskPolicy.php +++ b/app-modules/task/src/Policies/TaskPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Task\Policies; -use App\Models\User; +use App\Models\Authenticatable; use AdvisingApp\Task\Models\Task; use Illuminate\Auth\Access\Response; class TaskPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'task.view-any', denyResponse: 'You do not have permission to view tasks.' ); } - public function view(User $user, Task $task): Response + public function view(Authenticatable $authenticatable, Task $task): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['task.*.view', "task.{$task->id}.view"], denyResponse: 'You do not have permission to view this task.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'task.create', denyResponse: 'You do not have permission to create tasks.' ); } - public function update(User $user, Task $task): Response + public function update(Authenticatable $authenticatable, Task $task): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['task.*.update', "task.{$task->id}.update"], denyResponse: 'You do not have permission to update this task.' ); } - public function delete(User $user, Task $task): Response + public function delete(Authenticatable $authenticatable, Task $task): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['task.*.delete', "task.{$task->id}.delete"], denyResponse: 'You do not have permission to delete this task.' ); } - public function restore(User $user, Task $task): Response + public function restore(Authenticatable $authenticatable, Task $task): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['task.*.restore', "task.{$task->id}.restore"], denyResponse: 'You do not have permission to restore this task.' ); } - public function forceDelete(User $user, Task $task): Response + public function forceDelete(Authenticatable $authenticatable, Task $task): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['task.*.force-delete', "task.{$task->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this task.' ); diff --git a/app-modules/team/src/Policies/TeamPolicy.php b/app-modules/team/src/Policies/TeamPolicy.php index eee131791c..896210e20a 100644 --- a/app-modules/team/src/Policies/TeamPolicy.php +++ b/app-modules/team/src/Policies/TeamPolicy.php @@ -36,63 +36,63 @@ namespace AdvisingApp\Team\Policies; -use App\Models\User; +use App\Models\Authenticatable; use AdvisingApp\Team\Models\Team; use Illuminate\Auth\Access\Response; class TeamPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'team.view-any', denyResponse: 'You do not have permission to view interactions.' ); } - public function view(User $user, Team $team): Response + public function view(Authenticatable $authenticatable, Team $team): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['team.*.view', "team.{$team->id}.view"], denyResponse: 'You do not have permission to view this team.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'team.create', denyResponse: 'You do not have permission to create interactions.' ); } - public function update(User $user, Team $team): Response + public function update(Authenticatable $authenticatable, Team $team): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['team.*.update', "team.{$team->id}.update"], denyResponse: 'You do not have permission to update this team.' ); } - public function delete(User $user, Team $team): Response + public function delete(Authenticatable $authenticatable, Team $team): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['team.*.delete', "team.{$team->id}.delete"], denyResponse: 'You do not have permission to delete this team.' ); } - public function restore(User $user, Team $team): Response + public function restore(Authenticatable $authenticatable, Team $team): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['team.*.restore', "team.{$team->id}.restore"], denyResponse: 'You do not have permission to restore this team.' ); } - public function forceDelete(User $user, Team $team): Response + public function forceDelete(Authenticatable $authenticatable, Team $team): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['team.*.force-delete', "team.{$team->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this team.' ); diff --git a/app-modules/webhook/src/Policies/InboundWebhookPolicy.php b/app-modules/webhook/src/Policies/InboundWebhookPolicy.php index d6c820911f..6ae68a4120 100644 --- a/app-modules/webhook/src/Policies/InboundWebhookPolicy.php +++ b/app-modules/webhook/src/Policies/InboundWebhookPolicy.php @@ -36,49 +36,49 @@ namespace AdvisingApp\Webhook\Policies; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Auth\Access\Response; use AdvisingApp\Webhook\Models\InboundWebhook; class InboundWebhookPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'inbound_webhook.view-any', denyResponse: 'You do not have permission to view inbound webhooks.' ); } - public function view(User $user, InboundWebhook $inboundWebhook): Response + public function view(Authenticatable $authenticatable, InboundWebhook $inboundWebhook): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['inbound_webhook.*.view', "inbound_webhook.{$inboundWebhook->id}.view"], denyResponse: 'You do not have permission to view this inbound webhook.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { return Response::deny('Inbound webhooks cannot be created.'); } - public function update(User $user, InboundWebhook $inboundWebhook): Response + public function update(Authenticatable $authenticatable, InboundWebhook $inboundWebhook): Response { return Response::deny('Inbound webhooks cannot be updated.'); } - public function delete(User $user, InboundWebhook $inboundWebhook): Response + public function delete(Authenticatable $authenticatable, InboundWebhook $inboundWebhook): Response { return Response::deny('Inbound webhooks cannot be deleted.'); } - public function restore(User $user, InboundWebhook $inboundWebhook): Response + public function restore(Authenticatable $authenticatable, InboundWebhook $inboundWebhook): Response { return Response::deny('Inbound webhooks cannot be restored.'); } - public function forceDelete(User $user, InboundWebhook $inboundWebhook): Response + public function forceDelete(Authenticatable $authenticatable, InboundWebhook $inboundWebhook): Response { return Response::deny('Inbound webhooks cannot be force deleted.'); } diff --git a/app/Concerns/GraphSchemaDiscovery.php b/app/Concerns/GraphSchemaDiscovery.php new file mode 100644 index 0000000000..8244f9a31a --- /dev/null +++ b/app/Concerns/GraphSchemaDiscovery.php @@ -0,0 +1,51 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +namespace App\Concerns; + +use Illuminate\Support\Facades\Event; +use Nuwave\Lighthouse\Events\BuildSchemaString; +use Nuwave\Lighthouse\Schema\Source\SchemaStitcher; + +trait GraphSchemaDiscovery +{ + public function discoverSchema(string $path): void + { + Event::listen(function (BuildSchemaString $event) use ($path) { + return (new SchemaStitcher($path))->getSchemaString(); + }); + } +} diff --git a/app/Enums/Feature.php b/app/Enums/Feature.php index 537ee22998..188146291c 100644 --- a/app/Enums/Feature.php +++ b/app/Enums/Feature.php @@ -36,6 +36,7 @@ namespace App\Enums; +use App\Models\Authenticatable; use App\Settings\LicenseSettings; use Illuminate\Support\Facades\Gate; @@ -62,7 +63,7 @@ public function generateGate(): void // If features are added that are not based on a License Addon we will need to update this Gate::define( $this->getGateName(), - fn () => app(LicenseSettings::class)->data->addons->{str($this->value)->camel()} + fn (?Authenticatable $authenticatable) => app(LicenseSettings::class)->data->addons->{str($this->value)->camel()} ); } diff --git a/app/GraphQL/Directives/FeatureDirective.php b/app/GraphQL/Directives/FeatureDirective.php new file mode 100644 index 0000000000..85574639fd --- /dev/null +++ b/app/GraphQL/Directives/FeatureDirective.php @@ -0,0 +1,128 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +declare(strict_types = 1); + +namespace App\GraphQL\Directives; + +use App\Enums\Feature; +use GraphQL\Language\AST\NodeList; +use Illuminate\Support\Facades\Gate; +use GraphQL\Language\AST\TypeExtensionNode; +use Nuwave\Lighthouse\Schema\AST\ASTHelper; +use GraphQL\Language\AST\TypeDefinitionNode; +use GraphQL\Language\AST\FieldDefinitionNode; +use Nuwave\Lighthouse\Schema\AST\DocumentAST; +use GraphQL\Language\AST\ObjectTypeDefinitionNode; +use GraphQL\Language\AST\InterfaceTypeDefinitionNode; +use Nuwave\Lighthouse\Schema\Directives\BaseDirective; +use Nuwave\Lighthouse\Support\Contracts\TypeManipulator; +use Nuwave\Lighthouse\Support\Contracts\FieldManipulator; +use Nuwave\Lighthouse\Support\Contracts\TypeExtensionManipulator; + +final class FeatureDirective extends BaseDirective implements TypeManipulator, TypeExtensionManipulator, FieldManipulator +{ + public static function definition(): string + { + return /** @lang GraphQL */ <<<'GRAPHQL' +""" +Removes the item from the schema if the provided features are not enabled. +""" +directive @feature( + """ + Specify which features to check + """ + feature: [String!] +) repeatable on FIELD_DEFINITION | OBJECT +GRAPHQL; + } + + public function manipulateTypeDefinition(DocumentAST &$documentAST, TypeDefinitionNode &$typeDefinition): void + { + if ($this->shouldHide()) { + $documentAST->types = collect($documentAST->types)->filter(function ($typeDefinitionNode) use ($typeDefinition) { + return $typeDefinitionNode !== $typeDefinition; + })->toArray(); + + ASTHelper::addDirectiveToFields($this->directiveNode, $typeDefinition); + } + } + + public function manipulateTypeExtension(DocumentAST &$documentAST, TypeExtensionNode &$typeExtension): void + { + if ($this->shouldHide()) { + $typeExtension->interfaces = new NodeList([]); + $typeExtension->directives = new NodeList([]); + $typeExtension->fields = new NodeList([]); + + $documentAST->typeExtensions[$typeExtension->name->value] = collect($documentAST->typeExtensions[$typeExtension->name->value])->filter(function ($typeExtensionNode) use ($typeExtension) { + return $typeExtensionNode !== $typeExtension; + })->toArray(); + } + } + + public function manipulateFieldDefinition(DocumentAST &$documentAST, FieldDefinitionNode &$fieldDefinition, ObjectTypeDefinitionNode|InterfaceTypeDefinitionNode &$parentType): void + { + if ($this->shouldHide()) { + $keyToRemove = null; + + foreach ($parentType->fields as $key => $value) { + if ($value === $fieldDefinition) { + $keyToRemove = $key; + + break; + } + } + + unset($parentType->fields[$keyToRemove]); + + $directives = collect($fieldDefinition->directives); + + if ($directives->contains(fn ($directive) => $directive->name->value === 'paginate')) { + $fieldDefinition->directives = new NodeList($directives->filter(fn ($directive) => $directive->name->value !== 'paginate')->toArray()); + + ASTHelper::addDirectiveToNode('@all', $fieldDefinition); + } + } + } + + protected function shouldHide(): bool + { + $feature = Feature::from($this->directiveArgValue('feature')); + + return Gate::denies($feature->getGateName()); + } +} diff --git a/app/Http/Middleware/AuthGates.php b/app/Http/Middleware/AuthGates.php index d3cdf6100d..f8bd963c8e 100644 --- a/app/Http/Middleware/AuthGates.php +++ b/app/Http/Middleware/AuthGates.php @@ -37,7 +37,7 @@ namespace App\Http\Middleware; use Closure; -use App\Models\User; +use App\Models\Authenticatable; use Illuminate\Support\Facades\Gate; class AuthGates @@ -61,8 +61,8 @@ public function handle($request, Closure $next) } foreach ($permissionsArray as $title => $roles) { - Gate::define($title, function (User $user) use ($roles) { - return count(array_intersect($user->roles->pluck('id')->toArray(), $roles)) > 0; + Gate::define($title, function (Authenticatable $authenticatable) use ($roles) { + return count(array_intersect($authenticatable->roles->pluck('id')->toArray(), $roles)) > 0; }); } diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 70590dad3b..543358d3a8 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -48,5 +48,6 @@ class VerifyCsrfToken extends Middleware protected $except = [ '/api/forms/*', '/api/applications/*', + '/graphql/*', ]; } diff --git a/app/Policies/NotificationSettingPolicy.php b/app/Policies/NotificationSettingPolicy.php index 761446b7b9..eee2518e25 100644 --- a/app/Policies/NotificationSettingPolicy.php +++ b/app/Policies/NotificationSettingPolicy.php @@ -36,63 +36,63 @@ namespace App\Policies; -use App\Models\User; +use App\Models\Authenticatable; use App\Models\NotificationSetting; use Illuminate\Auth\Access\Response; class NotificationSettingPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'notification_setting.view-any', denyResponse: 'You do not have permission to view notification settings.' ); } - public function view(User $user, NotificationSetting $notificationSetting): Response + public function view(Authenticatable $authenticatable, NotificationSetting $notificationSetting): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['notification_setting.*.view', "notification_setting.{$notificationSetting->id}.view"], denyResponse: 'You do not have permission to view this notification setting.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'notification_setting.create', denyResponse: 'You do not have permission to create notification settings.' ); } - public function update(User $user, NotificationSetting $notificationSetting): Response + public function update(Authenticatable $authenticatable, NotificationSetting $notificationSetting): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['notification_setting.*.update', "notification_setting.{$notificationSetting->id}.update"], denyResponse: 'You do not have permission to update this notification setting.' ); } - public function delete(User $user, NotificationSetting $notificationSetting): Response + public function delete(Authenticatable $authenticatable, NotificationSetting $notificationSetting): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['notification_setting.*.delete', "notification_setting.{$notificationSetting->id}.delete"], denyResponse: 'You do not have permission to delete this notification setting.' ); } - public function restore(User $user, NotificationSetting $notificationSetting): Response + public function restore(Authenticatable $authenticatable, NotificationSetting $notificationSetting): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['notification_setting.*.restore', "notification_setting.{$notificationSetting->id}.restore"], denyResponse: 'You do not have permission to restore this notification setting.' ); } - public function forceDelete(User $user, NotificationSetting $notificationSetting): Response + public function forceDelete(Authenticatable $authenticatable, NotificationSetting $notificationSetting): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['notification_setting.*.force-delete', "notification_setting.{$notificationSetting->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this notification setting.' ); diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 6033da09f6..120acf24fc 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -37,71 +37,72 @@ namespace App\Policies; use App\Models\User; +use App\Models\Authenticatable; use App\Settings\LicenseSettings; use Illuminate\Auth\Access\Response; use App\Support\FeatureAccessResponse; class UserPolicy { - public function viewAny(User $user): Response + public function viewAny(Authenticatable $authenticatable): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'user.view-any', denyResponse: 'You do not have permission to view users.' ); } - public function view(User $user, User $model): Response + public function view(Authenticatable $authenticatable, User $model): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['user.*.view', "user.{$model->id}.view"], denyResponse: 'You do not have permission to view this user.' ); } - public function create(User $user): Response + public function create(Authenticatable $authenticatable): Response { if (User::count() >= app(LicenseSettings::class)->data->limits->crmSeats) { return FeatureAccessResponse::deny('You have reached the maximum number of users allowed by your license.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: 'user.create', denyResponse: 'You do not have permission to create users.' ); } - public function update(User $user, User $model): Response + public function update(Authenticatable $authenticatable, User $model): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['user.*.update', "user.{$model->id}.update"], denyResponse: 'You do not have permission to update this user.' ); } - public function delete(User $user, User $model): Response + public function delete(Authenticatable $authenticatable, User $model): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['user.*.delete', "user.{$model->id}.delete"], denyResponse: 'You do not have permission to delete this user.' ); } - public function restore(User $user, User $model): Response + public function restore(Authenticatable $authenticatable, User $model): Response { if (User::count() >= app(LicenseSettings::class)->data->limits->crmSeats) { return FeatureAccessResponse::deny('You have reached the maximum number of users allowed by your license.'); } - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['user.*.restore', "user.{$model->id}.restore"], denyResponse: 'You do not have permission to restore this user.' ); } - public function forceDelete(User $user, User $model): Response + public function forceDelete(Authenticatable $authenticatable, User $model): Response { - return $user->canOrElse( + return $authenticatable->canOrElse( abilities: ['user.*.force-delete', "user.{$model->id}.force-delete"], denyResponse: 'You do not have permission to permanently delete this user.' ); diff --git a/composer.json b/composer.json index 4a53b75442..b8add8365b 100644 --- a/composer.json +++ b/composer.json @@ -15,12 +15,11 @@ "ext-pdo": "*", "awcodes/filament-tiptap-editor": "^3.2", "aws/aws-php-sns-message-validator": "^1.8.0", - "aws/aws-sdk-php": "^3.285", + "aws/aws-sdk-php": "^3.293", "barryvdh/laravel-debugbar": "^3.9", "bvtterfly/model-state-machine": "^0.3.0", "canyon-gbs/advising-app-alert": "*", "canyon-gbs/advising-app-application": "*", - "canyon-gbs/advising-app-student-data-model": "*", "canyon-gbs/advising-app-assistant": "*", "canyon-gbs/advising-app-audit": "*@dev", "canyon-gbs/advising-app-authorization": "*", @@ -43,13 +42,14 @@ "canyon-gbs/advising-app-notifications": "*", "canyon-gbs/advising-app-prospect": "*", "canyon-gbs/advising-app-service-management": "^1.0", + "canyon-gbs/advising-app-student-data-model": "*", "canyon-gbs/advising-app-task": "*", "canyon-gbs/advising-app-team": "^1.0", "canyon-gbs/advising-app-theme": "*", "canyon-gbs/advising-app-timeline": "*", "canyon-gbs/advising-app-webhook": "*", "composer/composer": "^2.6.4", - "filament/filament": "^3.0", + "filament/filament": "^3.1", "filament/spatie-laravel-media-library-plugin": "^3.0", "filament/spatie-laravel-settings-plugin": "^3.0", "friendsofcat/opensearch-migrations": "^2.0", @@ -58,41 +58,43 @@ "google/apiclient": "^2.15", "guzzlehttp/guzzle": "^7.2", "internachi/modular": "^2.0", - "kirschbaum-development/eloquent-power-joins": "^3.0", + "kirschbaum-development/eloquent-power-joins": "^3.4", "laravel/framework": "^10.37", - "laravel/sanctum": "^3.2", - "laravel/scout": "^10.2", - "laravel/socialite": "^5.8", + "laravel/sanctum": "^3.3", + "laravel/scout": "^10.6", + "laravel/socialite": "^5.11", "laravel/tinker": "^2.8", "laravel/ui": "^4.2", - "league/csv": "^9.10", - "league/flysystem-aws-s3-v3": "^3.15", + "league/csv": "^9.12", + "league/flysystem-aws-s3-v3": "^3.22", "league/oauth2-client": "^2.7", - "livewire/livewire": "^3.0", + "livewire/livewire": "^3.3", "lomkit/laravel-rest-api": "^2.3", "maatwebsite/excel": "^3.1", "microsoft/microsoft-graph": "^1.109", + "mll-lab/graphql-php-scalars": "^6.2", + "nuwave/lighthouse": "^6.28", "owen-it/laravel-auditing": "dev-feature/queued-auditing@dev", - "saade/filament-fullcalendar": "^3.0", + "saade/filament-fullcalendar": "^3.1", "shuvroroy/filament-spatie-laravel-health": "^2.0", "socialiteproviders/google": "^4.1", "socialiteproviders/microsoft-azure": "^5.1", - "spatie/laravel-data": "^3.7", - "spatie/laravel-medialibrary": "^10.9", + "spatie/laravel-data": "^3.10", + "spatie/laravel-medialibrary": "^10.15", "spatie/laravel-settings": "^3.2", "sqids/sqids": "^0.4.1", - "staudenmeir/eloquent-has-many-deep": "^1.18", + "staudenmeir/eloquent-has-many-deep": "^1.19", "stechstudio/filament-impersonate": "^3.5", "tapp/filament-timezone-field": "^3.0", "tpetry/laravel-postgresql-enhanced": "^0.33.0", - "twilio/sdk": "^7.7" + "twilio/sdk": "^7.12" }, "require-dev": { "barryvdh/laravel-ide-helper": "^2.13", "brianium/paratest": "^7.2", "doctrine/dbal": "^3.6", "fakerphp/faker": "^1.9.1", - "friendsofphp/php-cs-fixer": "^3.21", + "friendsofphp/php-cs-fixer": "^3.41", "larastan/larastan": "^2.7", "laravel/sail": "^1.18", "mockery/mockery": "^1.4.4", @@ -162,7 +164,7 @@ "rm -f ./.php-cs-fixer.cache" ], "prettier": [ - "./node_modules/.bin/prettier \"resources/**/*{.css,.blade.php,.js}\" \"app-modules/**/resources/**/*{.css,.blade.php,.js}\" --config ./.prettierrc.json --ignore-path ./.prettierignore --cache" + "./node_modules/.bin/prettier \"resources/**/*{.css,.blade.php,.js}\" \"app-modules/**/resources/**/*{.css,.blade.php,.js}\" \"graphql/*.graphql\" \"app-modules/**/graphql/*.graphql\" --config ./.prettierrc.json --ignore-path ./.prettierignore --cache" ], "prettier-format": [ "@prettier --write" @@ -198,6 +200,15 @@ "ci": [ "rm -rf ./vendor", "composer install" + ], + "print-schema": [ + "@php artisan lighthouse:print-schema -W -D public" + ], + "generate-api-docs": [ + "@php artisan lighthouse:ide-helper", + "@prettier-format", + "@print-schema", + "npm run api-docs:generate" ] }, "extra": { diff --git a/composer.lock b/composer.lock index 4ffca4f8b6..5c450e3e56 100644 --- a/composer.lock +++ b/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": "1bd1f6b976015fcbb1c546ee1bcefe9a", + "content-hash": "114ab3eac3c7a0e2278d79df819b4371", "packages": [ { "name": "awcodes/filament-tiptap-editor", @@ -204,16 +204,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.293.9", + "version": "3.293.10", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "1fa17dba47021586de511d10944637da8ea4cc43" + "reference": "9ae3bfd036190847dd0a5c3cdc4681dbb0994f5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1fa17dba47021586de511d10944637da8ea4cc43", - "reference": "1fa17dba47021586de511d10944637da8ea4cc43", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9ae3bfd036190847dd0a5c3cdc4681dbb0994f5a", + "reference": "9ae3bfd036190847dd0a5c3cdc4681dbb0994f5a", "shasum": "" }, "require": { @@ -293,9 +293,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.293.9" + "source": "https://github.com/aws/aws-sdk-php/tree/3.293.10" }, - "time": "2023-12-12T19:08:53+00:00" + "time": "2023-12-13T19:41:27+00:00" }, { "name": "barryvdh/laravel-debugbar", @@ -3415,16 +3415,16 @@ }, { "name": "filament/actions", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "04eea53e61bf0fba6ea12ba82a8d278df613a689" + "reference": "94528865f7a6666a3125da0cb872b17814437dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/04eea53e61bf0fba6ea12ba82a8d278df613a689", - "reference": "04eea53e61bf0fba6ea12ba82a8d278df613a689", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/94528865f7a6666a3125da0cb872b17814437dbf", + "reference": "94528865f7a6666a3125da0cb872b17814437dbf", "shasum": "" }, "require": { @@ -3435,7 +3435,7 @@ "illuminate/contracts": "^10.0", "illuminate/database": "^10.0", "illuminate/support": "^10.0", - "league/csv": "9.11.0", + "league/csv": "^9.11", "php": "^8.1", "spatie/laravel-package-tools": "^1.9" }, @@ -3462,20 +3462,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-12T14:20:35+00:00" + "time": "2023-12-02T22:24:03+00:00" }, { "name": "filament/filament", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "d3db6c6c4639434ae656de3af1f6fab940c7d35c" + "reference": "d857640aa5cc4f55f448edf1c13488fb882c0979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/d3db6c6c4639434ae656de3af1f6fab940c7d35c", - "reference": "d3db6c6c4639434ae656de3af1f6fab940c7d35c", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/d857640aa5cc4f55f448edf1c13488fb882c0979", + "reference": "d857640aa5cc4f55f448edf1c13488fb882c0979", "shasum": "" }, "require": { @@ -3527,20 +3527,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-13T13:06:04+00:00" + "time": "2023-12-02T22:24:06+00:00" }, { "name": "filament/forms", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "55e5754c940d17a50371aadc7d066320b316a174" + "reference": "6a26439d7ff7b81ba00d2ca88a27a57f8e22fb14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/55e5754c940d17a50371aadc7d066320b316a174", - "reference": "55e5754c940d17a50371aadc7d066320b316a174", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/6a26439d7ff7b81ba00d2ca88a27a57f8e22fb14", + "reference": "6a26439d7ff7b81ba00d2ca88a27a57f8e22fb14", "shasum": "" }, "require": { @@ -3583,20 +3583,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-13T13:06:01+00:00" + "time": "2023-12-02T22:24:00+00:00" }, { "name": "filament/infolists", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "2f666327755ab6361e122a71a21d306c3bf41ec1" + "reference": "c99cef616da4b87640cb62e4869df9c5a8b306ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/2f666327755ab6361e122a71a21d306c3bf41ec1", - "reference": "2f666327755ab6361e122a71a21d306c3bf41ec1", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/c99cef616da4b87640cb62e4869df9c5a8b306ce", + "reference": "c99cef616da4b87640cb62e4869df9c5a8b306ce", "shasum": "" }, "require": { @@ -3634,20 +3634,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-12T14:20:34+00:00" + "time": "2023-12-02T22:24:00+00:00" }, { "name": "filament/notifications", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "6ed2dc4a4616bf344db7decab0432c36c0900b09" + "reference": "b0a917a041bee3819a3b58c543d82ba463ffb20c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/6ed2dc4a4616bf344db7decab0432c36c0900b09", - "reference": "6ed2dc4a4616bf344db7decab0432c36c0900b09", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/b0a917a041bee3819a3b58c543d82ba463ffb20c", + "reference": "b0a917a041bee3819a3b58c543d82ba463ffb20c", "shasum": "" }, "require": { @@ -3686,11 +3686,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-12T14:20:34+00:00" + "time": "2023-12-02T22:24:00+00:00" }, { "name": "filament/spatie-laravel-media-library-plugin", - "version": "v3.1.20", + "version": "v3.1.21", "source": { "type": "git", "url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git", @@ -3727,16 +3727,16 @@ }, { "name": "filament/spatie-laravel-settings-plugin", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/spatie-laravel-settings-plugin.git", - "reference": "fee9b4f986e0da49e8943f47f67843cab74ef8ac" + "reference": "7a2bce9ccb18703f867a1a1da1ef07f03cc2eca4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/spatie-laravel-settings-plugin/zipball/fee9b4f986e0da49e8943f47f67843cab74ef8ac", - "reference": "fee9b4f986e0da49e8943f47f67843cab74ef8ac", + "url": "https://api.github.com/repos/filamentphp/spatie-laravel-settings-plugin/zipball/7a2bce9ccb18703f867a1a1da1ef07f03cc2eca4", + "reference": "7a2bce9ccb18703f867a1a1da1ef07f03cc2eca4", "shasum": "" }, "require": { @@ -3770,20 +3770,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-12T14:20:36+00:00" + "time": "2023-11-14T12:07:17+00:00" }, { "name": "filament/support", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "421134621e61a25f05f554a4da0d05a726b10d3d" + "reference": "2bdf07a954c9873e6b4c6f2654798d4b38f62a27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/421134621e61a25f05f554a4da0d05a726b10d3d", - "reference": "421134621e61a25f05f554a4da0d05a726b10d3d", + "url": "https://api.github.com/repos/filamentphp/support/zipball/2bdf07a954c9873e6b4c6f2654798d4b38f62a27", + "reference": "2bdf07a954c9873e6b4c6f2654798d4b38f62a27", "shasum": "" }, "require": { @@ -3793,7 +3793,7 @@ "illuminate/contracts": "^10.0", "illuminate/support": "^10.0", "illuminate/view": "^10.0", - "livewire/livewire": "^3.2.3", + "livewire/livewire": "^3.0.8", "php": "^8.1", "ryangjchandler/blade-capture-directive": "^0.2|^0.3", "spatie/color": "^1.5", @@ -3827,20 +3827,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-13T13:06:03+00:00" + "time": "2023-12-02T22:24:03+00:00" }, { "name": "filament/tables", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "7af52d9c020cbe4564568ad610d08e18c74b8d4e" + "reference": "6a9a952aefc372e77eb07a44e4eb558d94f621b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/7af52d9c020cbe4564568ad610d08e18c74b8d4e", - "reference": "7af52d9c020cbe4564568ad610d08e18c74b8d4e", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/6a9a952aefc372e77eb07a44e4eb558d94f621b3", + "reference": "6a9a952aefc372e77eb07a44e4eb558d94f621b3", "shasum": "" }, "require": { @@ -3880,20 +3880,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-13T13:05:59+00:00" + "time": "2023-12-02T22:24:03+00:00" }, { "name": "filament/widgets", - "version": "v3.1.20", + "version": "v3.1.8", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "f7e38b409e419a3675f9f4ed01b3544c566def5e" + "reference": "64c4e7074908426840f4b16f82822b178dc21afa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/f7e38b409e419a3675f9f4ed01b3544c566def5e", - "reference": "f7e38b409e419a3675f9f4ed01b3544c566def5e", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/64c4e7074908426840f4b16f82822b178dc21afa", + "reference": "64c4e7074908426840f4b16f82822b178dc21afa", "shasum": "" }, "require": { @@ -3924,7 +3924,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2023-12-12T14:20:54+00:00" + "time": "2023-11-29T15:29:52+00:00" }, { "name": "firebase/php-jwt", @@ -5071,6 +5071,48 @@ ], "time": "2023-12-03T19:50:20+00:00" }, + { + "name": "haydenpierce/class-finder", + "version": "0.5.3", + "source": { + "type": "git", + "url": "git@gitlab.com:hpierce1102/ClassFinder.git", + "reference": "40703445c18784edcc6411703e7c3869af11ec8c" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/hpierce1102%2FClassFinder/repository/archive.zip?sha=40703445c18784edcc6411703e7c3869af11ec8c", + "reference": "40703445c18784edcc6411703e7c3869af11ec8c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=5.3" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "~9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "HaydenPierce\\ClassFinder\\": "src/", + "HaydenPierce\\ClassFinder\\UnitTest\\": "test/unit" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Hayden Pierce", + "email": "hayden@haydenpierce.com" + } + ], + "description": "A library that can provide of a list of classes in a given namespace", + "time": "2023-06-18T17:43:01+00:00" + }, { "name": "internachi/modular", "version": "2.0.0", @@ -5424,18 +5466,76 @@ }, "time": "2023-01-25T16:56:05+00:00" }, + { + "name": "laragraph/utils", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/laragraph/utils.git", + "reference": "a1de91340f934b7dbb5540ed5854e2ecde18e3a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laragraph/utils/zipball/a1de91340f934b7dbb5540ed5854e2ecde18e3a2", + "reference": "a1de91340f934b7dbb5540ed5854e2ecde18e3a2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.6.0 || ~5.7.0 || ~5.8.0 || ^6 || ^7 || ^8 || ^9 || ^10", + "illuminate/http": "~5.6.0 || ~5.7.0 || ~5.8.0 || ^6 || ^7 || ^8 || ^9 || ^10", + "php": "^7.2 || ^8", + "thecodingmachine/safe": "^1.1 || ^2", + "webonyx/graphql-php": "^0.13.2 || ^14 || ^15" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.11", + "jangregor/phpstan-prophecy": "^1", + "mll-lab/php-cs-fixer-config": "^4.4", + "orchestra/testbench": "~3.6.0 || ~3.7.0 || ~3.8.0 || ~3.9.0 || ^4 || ^5 || ^6 || ^7 || ^8", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9", + "thecodingmachine/phpstan-safe-rule": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laragraph\\Utils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benedikt Franke", + "email": "benedikt@franke.tech" + } + ], + "description": "Utilities for using GraphQL with Laravel", + "homepage": "https://github.com/laragraph/utils", + "support": { + "issues": "https://github.com/laragraph/utils/issues", + "source": "https://github.com/laragraph/utils" + }, + "time": "2023-11-30T16:05:38+00:00" + }, { "name": "laravel/framework", - "version": "v10.37.2", + "version": "v10.37.3", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d97b5263ccd2f3950fd93f45b1b957259d76d0db" + "reference": "996375dd61f8c6e4ac262b57ed485655d71fcbdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d97b5263ccd2f3950fd93f45b1b957259d76d0db", - "reference": "d97b5263ccd2f3950fd93f45b1b957259d76d0db", + "url": "https://api.github.com/repos/laravel/framework/zipball/996375dd61f8c6e4ac262b57ed485655d71fcbdc", + "reference": "996375dd61f8c6e4ac262b57ed485655d71fcbdc", "shasum": "" }, "require": { @@ -5624,7 +5724,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-12-13T14:12:36+00:00" + "time": "2023-12-13T20:10:58+00:00" }, { "name": "laravel/prompts", @@ -6275,35 +6375,36 @@ }, { "name": "league/csv", - "version": "9.11.0", + "version": "9.12.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39" + "reference": "c1dc31e23eb3cd0f7b537ee1a669d5f58d5cfe21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/33149c4bea4949aa4fa3d03fb11ed28682168b39", - "reference": "33149c4bea4949aa4fa3d03fb11ed28682168b39", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/c1dc31e23eb3cd0f7b537ee1a669d5f58d5cfe21", + "reference": "c1dc31e23eb3cd0f7b537ee1a669d5f58d5cfe21", "shasum": "" }, "require": { + "ext-filter": "*", "ext-json": "*", "ext-mbstring": "*", "php": "^8.1.2" }, "require-dev": { - "doctrine/collections": "^2.1.3", + "doctrine/collections": "^2.1.4", "ext-dom": "*", "ext-xdebug": "*", "friendsofphp/php-cs-fixer": "^v3.22.0", - "phpbench/phpbench": "^1.2.14", - "phpstan/phpstan": "^1.10.26", - "phpstan/phpstan-deprecation-rules": "^1.1.3", - "phpstan/phpstan-phpunit": "^1.3.13", - "phpstan/phpstan-strict-rules": "^1.5.1", - "phpunit/phpunit": "^10.3.1", - "symfony/var-dumper": "^6.3.3" + "phpbench/phpbench": "^1.2.15", + "phpstan/phpstan": "^1.10.46", + "phpstan/phpstan-deprecation-rules": "^1.1.4", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpstan/phpstan-strict-rules": "^1.5.2", + "phpunit/phpunit": "^10.4.2", + "symfony/var-dumper": "^6.4.0" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -6359,7 +6460,7 @@ "type": "github" } ], - "time": "2023-09-23T10:09:54+00:00" + "time": "2023-12-01T17:54:07+00:00" }, { "name": "league/flysystem", @@ -7614,6 +7715,67 @@ }, "time": "2023-12-01T09:41:49+00:00" }, + { + "name": "mll-lab/graphql-php-scalars", + "version": "v6.2.0", + "source": { + "type": "git", + "url": "https://github.com/mll-lab/graphql-php-scalars.git", + "reference": "f0922636f090bc1e56f6a9efb3ebb8272aa5cff3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mll-lab/graphql-php-scalars/zipball/f0922636f090bc1e56f6a9efb3ebb8272aa5cff3", + "reference": "f0922636f090bc1e56f6a9efb3ebb8272aa5cff3", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.17 || ^3 || ^4", + "ext-json": "*", + "php": "^8", + "spatie/regex": "^1.4 || ^2 || ^3", + "thecodingmachine/safe": "^1.3 || ^2", + "webonyx/graphql-php": "^15" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.16", + "mll-lab/php-cs-fixer-config": "^5", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1", + "phpunit/phpunit": "^9 || ^10", + "symfony/var-dumper": "^5.4 || ^6", + "thecodingmachine/phpstan-safe-rule": "^1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "MLL\\GraphQLScalars\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benedikt Franke", + "email": "benedikt@franke.tech" + } + ], + "description": "A collection of custom scalar types for usage with https://github.com/webonyx/graphql-php", + "keywords": [ + "graphql", + "php" + ], + "support": { + "issues": "https://github.com/mll-lab/graphql-php-scalars/issues", + "source": "https://github.com/mll-lab/graphql-php-scalars/tree/v6.2.0" + }, + "time": "2023-05-09T13:20:50+00:00" + }, { "name": "monolog/monolog", "version": "3.5.0", @@ -8178,6 +8340,141 @@ ], "time": "2023-02-08T01:06:31+00:00" }, + { + "name": "nuwave/lighthouse", + "version": "v6.28.0", + "source": { + "type": "git", + "url": "https://github.com/nuwave/lighthouse.git", + "reference": "76018af1019d97739a71eb47c9008f3e69273fbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nuwave/lighthouse/zipball/76018af1019d97739a71eb47c9008f3e69273fbc", + "reference": "76018af1019d97739a71eb47c9008f3e69273fbc", + "shasum": "" + }, + "require": { + "ext-json": "*", + "haydenpierce/class-finder": "^0.4 || ^0.5", + "illuminate/auth": "^9 || ^10", + "illuminate/bus": "^9 || ^10", + "illuminate/contracts": "^9 || ^10", + "illuminate/http": "^9 || ^10", + "illuminate/pagination": "^9 || ^10", + "illuminate/queue": "^9 || ^10", + "illuminate/routing": "^9 || ^10", + "illuminate/support": "^9 || ^10", + "illuminate/validation": "^9 || ^10", + "laragraph/utils": "^1.5 || ^2", + "php": "^8", + "thecodingmachine/safe": "^1 || ^2", + "webonyx/graphql-php": "^15" + }, + "require-dev": { + "algolia/algoliasearch-client-php": "^3 || ^4", + "bensampo/laravel-enum": "^5 || ^6", + "dms/phpunit-arraysubset-asserts": "^0.4 || ^0.5", + "ergebnis/composer-normalize": "^2.2.2", + "fakerphp/faker": "^1.21", + "google/protobuf": "^3.21", + "laravel/framework": "^9 || ^10", + "laravel/legacy-factories": "^1.1.1", + "laravel/lumen-framework": "^9 || ^10 || dev-master", + "laravel/pennant": "^1", + "laravel/scout": "^8 || ^9 || ^10", + "mattiasgeniar/phpunit-query-count-assertions": "^1.1", + "mll-lab/graphql-php-scalars": "^6", + "mll-lab/php-cs-fixer-config": "^5", + "mockery/mockery": "^1.5", + "nesbot/carbon": "^2.62.1", + "nunomaduro/larastan": "^2.6.1", + "orchestra/testbench": "^7.7 || ^8.8", + "phpbench/phpbench": "^1.2.6", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^1.10.3", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1.1", + "phpunit/phpunit": "^9.6.4 || ^10", + "predis/predis": "^1.1 || ^2.1", + "pusher/pusher-php-server": "^5 || ^6 || ^7.0.2", + "rector/rector": "^0.15.18", + "thecodingmachine/phpstan-safe-rule": "^1.2" + }, + "suggest": { + "bensampo/laravel-enum": "Convenient enum definitions that can easily be registered in your Schema", + "ext-protobuf": "Improve protobuf serialization performance (used for tracing)", + "google/protobuf": "Required when using the tracing driver federated-tracing", + "laravel/pennant": "Required for the @feature directive", + "laravel/scout": "Required for the @search directive", + "mll-lab/graphql-php-scalars": "Useful scalar types, required for @whereConditions", + "mll-lab/laravel-graphiql": "A graphical interactive in-browser GraphQL IDE - integrated with Laravel", + "pusher/pusher-php-server": "Required when using the Pusher Subscriptions driver" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Nuwave\\Lighthouse\\LighthouseServiceProvider", + "Nuwave\\Lighthouse\\Auth\\AuthServiceProvider", + "Nuwave\\Lighthouse\\Cache\\CacheServiceProvider", + "Nuwave\\Lighthouse\\GlobalId\\GlobalIdServiceProvider", + "Nuwave\\Lighthouse\\OrderBy\\OrderByServiceProvider", + "Nuwave\\Lighthouse\\Pagination\\PaginationServiceProvider", + "Nuwave\\Lighthouse\\SoftDeletes\\SoftDeletesServiceProvider", + "Nuwave\\Lighthouse\\Testing\\TestingServiceProvider", + "Nuwave\\Lighthouse\\Validation\\ValidationServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Nuwave\\Lighthouse\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christopher Moore", + "email": "chris@nuwavecommerce.com", + "homepage": "https://www.nuwavecommerce.com" + }, + { + "name": "Benedikt Franke", + "email": "benedikt@franke.tech", + "homepage": "https://franke.tech" + } + ], + "description": "A framework for serving GraphQL from Laravel", + "homepage": "https://lighthouse-php.com", + "keywords": [ + "graphql", + "laravel", + "laravel-graphql" + ], + "support": { + "issues": "https://github.com/nuwave/lighthouse/issues", + "source": "https://github.com/nuwave/lighthouse" + }, + "funding": [ + { + "url": "https://github.com/spawnia", + "type": "github" + }, + { + "url": "https://issuehunt.io/r/nuwave/lighthouse", + "type": "issuehunt" + }, + { + "url": "https://www.patreon.com/lighthouse_php", + "type": "patreon" + } + ], + "time": "2023-12-11T13:03:36+00:00" + }, { "name": "openai-php/client", "version": "v0.7.10", @@ -14425,6 +14722,145 @@ }, "time": "2023-08-04T16:19:47+00:00" }, + { + "name": "thecodingmachine/safe", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thecodingmachine/safe.git", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "^3.2", + "thecodingmachine/phpstan-strict-rules": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "files": [ + "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", + "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", + "deprecated/mssql.php", + "deprecated/stats.php", + "deprecated/strings.php", + "lib/special_cases.php", + "deprecated/mysqli.php", + "generated/apache.php", + "generated/apcu.php", + "generated/array.php", + "generated/bzip2.php", + "generated/calendar.php", + "generated/classobj.php", + "generated/com.php", + "generated/cubrid.php", + "generated/curl.php", + "generated/datetime.php", + "generated/dir.php", + "generated/eio.php", + "generated/errorfunc.php", + "generated/exec.php", + "generated/fileinfo.php", + "generated/filesystem.php", + "generated/filter.php", + "generated/fpm.php", + "generated/ftp.php", + "generated/funchand.php", + "generated/gettext.php", + "generated/gmp.php", + "generated/gnupg.php", + "generated/hash.php", + "generated/ibase.php", + "generated/ibmDb2.php", + "generated/iconv.php", + "generated/image.php", + "generated/imap.php", + "generated/info.php", + "generated/inotify.php", + "generated/json.php", + "generated/ldap.php", + "generated/libxml.php", + "generated/lzf.php", + "generated/mailparse.php", + "generated/mbstring.php", + "generated/misc.php", + "generated/mysql.php", + "generated/network.php", + "generated/oci8.php", + "generated/opcache.php", + "generated/openssl.php", + "generated/outcontrol.php", + "generated/pcntl.php", + "generated/pcre.php", + "generated/pgsql.php", + "generated/posix.php", + "generated/ps.php", + "generated/pspell.php", + "generated/readline.php", + "generated/rpminfo.php", + "generated/rrd.php", + "generated/sem.php", + "generated/session.php", + "generated/shmop.php", + "generated/sockets.php", + "generated/sodium.php", + "generated/solr.php", + "generated/spl.php", + "generated/sqlsrv.php", + "generated/ssdeep.php", + "generated/ssh2.php", + "generated/stream.php", + "generated/strings.php", + "generated/swoole.php", + "generated/uodbc.php", + "generated/uopz.php", + "generated/url.php", + "generated/var.php", + "generated/xdiff.php", + "generated/xml.php", + "generated/xmlrpc.php", + "generated/yaml.php", + "generated/yaz.php", + "generated/zip.php", + "generated/zlib.php" + ], + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHP core functions that throw exceptions instead of returning FALSE on error", + "support": { + "issues": "https://github.com/thecodingmachine/safe/issues", + "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" + }, + "time": "2023-04-05T11:54:14+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "v2.2.7", @@ -14545,16 +14981,16 @@ }, { "name": "twilio/sdk", - "version": "7.12.3", + "version": "7.13.0", "source": { "type": "git", "url": "git@github.com:twilio/twilio-php.git", - "reference": "090b449bf83767ea2939dfaf776895a2cdc81179" + "reference": "cda27b65615ecfddce24668803078bc72b46fe17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twilio/twilio-php/zipball/090b449bf83767ea2939dfaf776895a2cdc81179", - "reference": "090b449bf83767ea2939dfaf776895a2cdc81179", + "url": "https://api.github.com/repos/twilio/twilio-php/zipball/cda27b65615ecfddce24668803078bc72b46fe17", + "reference": "cda27b65615ecfddce24668803078bc72b46fe17", "shasum": "" }, "require": { @@ -14590,7 +15026,7 @@ "sms", "twilio" ], - "time": "2023-12-01T05:44:17+00:00" + "time": "2023-12-14T10:47:43+00:00" }, { "name": "ueberdosis/tiptap-php", @@ -14876,6 +15312,80 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webonyx/graphql-php", + "version": "v15.8.1", + "source": { + "type": "git", + "url": "https://github.com/webonyx/graphql-php.git", + "reference": "575ac95f13adfb38219a748572355385c101fdf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/575ac95f13adfb38219a748572355385c101fdf7", + "reference": "575ac95f13adfb38219a748572355385c101fdf7", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.4 || ^8" + }, + "require-dev": { + "amphp/amp": "^2.6", + "amphp/http-server": "^2.1", + "dms/phpunit-arraysubset-asserts": "dev-master", + "ergebnis/composer-normalize": "^2.28", + "friendsofphp/php-cs-fixer": "3.30.0", + "mll-lab/php-cs-fixer-config": "^5", + "nyholm/psr7": "^1.5", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "1.10.47", + "phpstan/phpstan-phpunit": "1.3.15", + "phpstan/phpstan-strict-rules": "1.5.2", + "phpunit/phpunit": "^9.5 || ^10", + "psr/http-message": "^1 || ^2", + "react/http": "^1.6", + "react/promise": "^2.9", + "rector/rector": "^0.18", + "symfony/polyfill-php81": "^1.23", + "symfony/var-exporter": "^5 || ^6 || ^7", + "thecodingmachine/safe": "^1.3 || ^2" + }, + "suggest": { + "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", + "psr/http-message": "To use standard GraphQL server", + "react/promise": "To leverage async resolving on React PHP platform" + }, + "type": "library", + "autoload": { + "psr-4": { + "GraphQL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP port of GraphQL reference implementation", + "homepage": "https://github.com/webonyx/graphql-php", + "keywords": [ + "api", + "graphql" + ], + "support": { + "issues": "https://github.com/webonyx/graphql-php/issues", + "source": "https://github.com/webonyx/graphql-php/tree/v15.8.1" + }, + "funding": [ + { + "url": "https://opencollective.com/webonyx-graphql-php", + "type": "open_collective" + } + ], + "time": "2023-12-05T17:23:35+00:00" } ], "packages-dev": [ @@ -19342,5 +19852,5 @@ "ext-pdo": "*" }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index 3766ace6d2..19e1923db0 100644 --- a/config/app.php +++ b/config/app.php @@ -36,6 +36,7 @@ use Illuminate\Support\Facades\Facade; use App\Providers\MultiConnectionParallelTestingServiceProvider; +use Nuwave\Lighthouse\WhereConditions\WhereConditionsServiceProvider; return [ /* @@ -233,6 +234,7 @@ App\Providers\HealthServiceProvider::class, App\Providers\FilamentServiceProvider::class, MultiConnectionParallelTestingServiceProvider::class, + WhereConditionsServiceProvider::class, ], /* diff --git a/config/cors.php b/config/cors.php index 3dae099264..7363879cd2 100644 --- a/config/cors.php +++ b/config/cors.php @@ -48,7 +48,7 @@ | */ - 'paths' => ['api/*', 'sanctum/csrf-cookie'], + 'paths' => ['api/*', 'graphql', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], diff --git a/config/lighthouse.php b/config/lighthouse.php new file mode 100644 index 0000000000..a05a8ccf70 --- /dev/null +++ b/config/lighthouse.php @@ -0,0 +1,517 @@ + + + Copyright © 2022-2023, Canyon GBS LLC. All rights reserved. + + Advising App™ is licensed under the Elastic License 2.0. For more details, + see https://github.com/canyongbs/advisingapp/blob/main/LICENSE. + + Notice: + + - You may not provide the software to third parties as a hosted or managed + service, where the service provides users with access to any substantial set of + the features or functionality of the software. + - You may not move, change, disable, or circumvent the license key functionality + in the software, and you may not remove or obscure any functionality in the + software that is protected by the license key. + - You may not alter, remove, or obscure any licensing, copyright, or other notices + of the licensor in the software. Any use of the licensor’s trademarks is subject + to applicable law. + - Canyon GBS LLC respects the intellectual property rights of others and expects the + same in return. Canyon GBS™ and Advising App™ are registered trademarks of + Canyon GBS LLC, and we are committed to enforcing and protecting our trademarks + vigorously. + - The software solution, including services, infrastructure, and code, is offered as a + Software as a Service (SaaS) by Canyon GBS LLC. + - Use of this software implies agreement to the license terms and conditions as stated + in the Elastic License 2.0. + + For more information or inquiries please visit our website at + https://www.canyongbs.com or contact us via email at legal@canyongbs.com. + + +*/ + +declare(strict_types = 1); + +return [ + /* + |-------------------------------------------------------------------------- + | Route Configuration + |-------------------------------------------------------------------------- + | + | Controls the HTTP route that your GraphQL server responds to. + | You may set `route` => false, to disable the default route + | registration and take full control. + | + */ + + 'route' => [ + /* + * The URI the endpoint responds to, e.g. mydomain.com/graphql. + */ + 'uri' => '/graphql', + + /* + * Lighthouse creates a named route for convenient URL generation and redirects. + */ + 'name' => 'graphql', + + /* + * Beware that middleware defined here runs before the GraphQL execution phase, + * make sure to return spec-compliant responses in case an error is thrown. + */ + 'middleware' => [ + //EnsureFrontendRequestsAreStateful::class, + // Ensures the request is not vulnerable to cross-site request forgery. + // Nuwave\Lighthouse\Http\Middleware\EnsureXHR::class, + + // Always set the `Accept: application/json` header. + Nuwave\Lighthouse\Http\Middleware\AcceptJson::class, + + // Logs in a user if they are authenticated. In contrast to Laravel's 'auth' + // middleware, this delegates auth and permission checks to the field level. + //Nuwave\Lighthouse\Http\Middleware\AttemptAuthentication::class, + + // Logs every incoming GraphQL query. + // Nuwave\Lighthouse\Http\Middleware\LogGraphQLQueries::class, + 'auth:sanctum', + ], + + /* + * The `prefix`, `domain` and `where` configuration options are optional. + */ + // 'prefix' => '', + // 'domain' => '', + // 'where' => [], + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | The guards to use for authenticating GraphQL requests, if needed. + | Used in directives such as `@guard` or the `AttemptAuthentication` middleware. + | Falls back to the Laravel default if `null`. + | + */ + + 'guards' => ['sanctum'], + + /* + |-------------------------------------------------------------------------- + | Schema Path + |-------------------------------------------------------------------------- + | + | Path to your .graphql schema file. + | Additional schema files may be imported from within that file. + | + */ + + 'schema_path' => base_path('graphql/schema.graphql'), + + /* + |-------------------------------------------------------------------------- + | Schema Cache + |-------------------------------------------------------------------------- + | + | A large part of schema generation consists of parsing and AST manipulation. + | This operation is very expensive, so it is highly recommended enabling + | caching of the final schema to optimize performance of large schemas. + | + */ + + 'schema_cache' => [ + /* + * Setting to true enables schema caching. + */ + 'enable' => env('LIGHTHOUSE_SCHEMA_CACHE_ENABLE', env('APP_ENV') !== 'local'), + + /* + * File path to store the lighthouse schema. + */ + 'path' => env('LIGHTHOUSE_SCHEMA_CACHE_PATH', base_path('bootstrap/cache/lighthouse-schema.php')), + ], + + /* + |-------------------------------------------------------------------------- + | Cache Directive Tags + |-------------------------------------------------------------------------- + | + | Should the `@cache` directive use a tagged cache? + | + */ + 'cache_directive_tags' => false, + + /* + |-------------------------------------------------------------------------- + | Query Cache + |-------------------------------------------------------------------------- + | + | Caches the result of parsing incoming query strings to boost performance on subsequent requests. + | + */ + + 'query_cache' => [ + /* + * Setting to true enables query caching. + */ + 'enable' => env('LIGHTHOUSE_QUERY_CACHE_ENABLE', true), + + /* + * Allows using a specific cache store, uses the app's default if set to null. + */ + 'store' => env('LIGHTHOUSE_QUERY_CACHE_STORE', null), + + /* + * Duration in seconds the query should remain cached, null means forever. + */ + 'ttl' => env('LIGHTHOUSE_QUERY_CACHE_TTL', 24 * 60 * 60), + ], + + /* + |-------------------------------------------------------------------------- + | Namespaces + |-------------------------------------------------------------------------- + | + | These are the default namespaces where Lighthouse looks for classes to + | extend functionality of the schema. You may pass in either a string + | or an array, they are tried in order and the first match is used. + | + */ + + 'namespaces' => [ + 'models' => ['App', 'App\\Models', 'AdvisingApp\\Notifications\\Models'], + 'queries' => 'App\\GraphQL\\Queries', + 'mutations' => 'App\\GraphQL\\Mutations', + 'subscriptions' => 'App\\GraphQL\\Subscriptions', + 'types' => 'App\\GraphQL\\Types', + 'interfaces' => 'App\\GraphQL\\Interfaces', + 'unions' => 'App\\GraphQL\\Unions', + 'scalars' => 'App\\GraphQL\\Scalars', + 'directives' => 'App\\GraphQL\\Directives', + 'validators' => 'App\\GraphQL\\Validators', + ], + + /* + |-------------------------------------------------------------------------- + | Security + |-------------------------------------------------------------------------- + | + | Control how Lighthouse handles security related query validation. + | Read more at https://webonyx.github.io/graphql-php/security/ + | + */ + + 'security' => [ + 'max_query_complexity' => GraphQL\Validator\Rules\QueryComplexity::DISABLED, + 'max_query_depth' => GraphQL\Validator\Rules\QueryDepth::DISABLED, + 'disable_introspection' => (bool) env('LIGHTHOUSE_SECURITY_DISABLE_INTROSPECTION', false) + ? GraphQL\Validator\Rules\DisableIntrospection::ENABLED + : GraphQL\Validator\Rules\DisableIntrospection::DISABLED, + ], + + /* + |-------------------------------------------------------------------------- + | Pagination + |-------------------------------------------------------------------------- + | + | Set defaults for the pagination features within Lighthouse, such as + | the @paginate directive, or paginated relation directives. + | + */ + + 'pagination' => [ + /* + * Allow clients to query paginated lists without specifying the amount of items. + * Setting this to `null` means clients have to explicitly ask for the count. + */ + 'default_count' => 25, + + /* + * Limit the maximum amount of items that clients can request from paginated lists. + * Setting this to `null` means the count is unrestricted. + */ + 'max_count' => 100, + ], + + /* + |-------------------------------------------------------------------------- + | Debug + |-------------------------------------------------------------------------- + | + | Control the debug level as described in https://webonyx.github.io/graphql-php/error-handling/ + | Debugging is only applied if the global Laravel debug config is set to true. + | + | When you set this value through an environment variable, use the following reference table: + | 0 => INCLUDE_NONE + | 1 => INCLUDE_DEBUG_MESSAGE + | 2 => INCLUDE_TRACE + | 3 => INCLUDE_TRACE | INCLUDE_DEBUG_MESSAGE + | 4 => RETHROW_INTERNAL_EXCEPTIONS + | 5 => RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_DEBUG_MESSAGE + | 6 => RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_TRACE + | 7 => RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_TRACE | INCLUDE_DEBUG_MESSAGE + | 8 => RETHROW_UNSAFE_EXCEPTIONS + | 9 => RETHROW_UNSAFE_EXCEPTIONS | INCLUDE_DEBUG_MESSAGE + | 10 => RETHROW_UNSAFE_EXCEPTIONS | INCLUDE_TRACE + | 11 => RETHROW_UNSAFE_EXCEPTIONS | INCLUDE_TRACE | INCLUDE_DEBUG_MESSAGE + | 12 => RETHROW_UNSAFE_EXCEPTIONS | RETHROW_INTERNAL_EXCEPTIONS + | 13 => RETHROW_UNSAFE_EXCEPTIONS | RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_DEBUG_MESSAGE + | 14 => RETHROW_UNSAFE_EXCEPTIONS | RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_TRACE + | 15 => RETHROW_UNSAFE_EXCEPTIONS | RETHROW_INTERNAL_EXCEPTIONS | INCLUDE_TRACE | INCLUDE_DEBUG_MESSAGE + | + */ + + 'debug' => env('LIGHTHOUSE_DEBUG', GraphQL\Error\DebugFlag::INCLUDE_DEBUG_MESSAGE | GraphQL\Error\DebugFlag::INCLUDE_TRACE), + + /* + |-------------------------------------------------------------------------- + | Error Handlers + |-------------------------------------------------------------------------- + | + | Register error handlers that receive the Errors that occur during execution + | and handle them. You may use this to log, filter or format the errors. + | The classes must implement \Nuwave\Lighthouse\Execution\ErrorHandler + | + */ + + 'error_handlers' => [ + Nuwave\Lighthouse\Execution\AuthenticationErrorHandler::class, + Nuwave\Lighthouse\Execution\AuthorizationErrorHandler::class, + Nuwave\Lighthouse\Execution\ValidationErrorHandler::class, + Nuwave\Lighthouse\Execution\ReportingErrorHandler::class, + ], + + /* + |-------------------------------------------------------------------------- + | Field Middleware + |-------------------------------------------------------------------------- + | + | Register global field middleware directives that wrap around every field. + | Execution happens in the defined order, before other field middleware. + | The classes must implement \Nuwave\Lighthouse\Support\Contracts\FieldMiddleware + | + */ + + 'field_middleware' => [ + Nuwave\Lighthouse\Schema\Directives\TrimDirective::class, + Nuwave\Lighthouse\Schema\Directives\ConvertEmptyStringsToNullDirective::class, + Nuwave\Lighthouse\Schema\Directives\SanitizeDirective::class, + Nuwave\Lighthouse\Validation\ValidateDirective::class, + Nuwave\Lighthouse\Schema\Directives\TransformArgsDirective::class, + Nuwave\Lighthouse\Schema\Directives\SpreadDirective::class, + Nuwave\Lighthouse\Schema\Directives\RenameArgsDirective::class, + Nuwave\Lighthouse\Schema\Directives\DropArgsDirective::class, + ], + + /* + |-------------------------------------------------------------------------- + | Global ID + |-------------------------------------------------------------------------- + | + | The name that is used for the global id field on the Node interface. + | When creating a Relay compliant server, this must be named "id". + | + */ + + 'global_id_field' => 'id', + + /* + |-------------------------------------------------------------------------- + | Persisted Queries + |-------------------------------------------------------------------------- + | + | Lighthouse supports Automatic Persisted Queries (APQ), compatible with the + | [Apollo implementation](https://www.apollographql.com/docs/apollo-server/performance/apq). + | You may set this flag to either process or deny these queries. + | + */ + + 'persisted_queries' => true, + + /* + |-------------------------------------------------------------------------- + | Transactional Mutations + |-------------------------------------------------------------------------- + | + | If set to true, built-in directives that mutate models will be + | wrapped in a transaction to ensure atomicity. + | + */ + + 'transactional_mutations' => true, + + /* + |-------------------------------------------------------------------------- + | Mass Assignment Protection + |-------------------------------------------------------------------------- + | + | If set to true, mutations will use forceFill() over fill() when populating + | a model with arguments in mutation directives. Since GraphQL constrains + | allowed inputs by design, mass assignment protection is not needed. + | + */ + + 'force_fill' => true, + + /* + |-------------------------------------------------------------------------- + | Batchload Relations + |-------------------------------------------------------------------------- + | + | If set to true, relations marked with directives like @hasMany or @belongsTo + | will be optimized by combining the queries through the BatchLoader. + | + */ + + 'batchload_relations' => true, + + /* + |-------------------------------------------------------------------------- + | Shortcut Foreign Key Selection + |-------------------------------------------------------------------------- + | + | If set to true, Lighthouse will shortcut queries where the client selects only the + | foreign key pointing to a related model. Only works if the related model's primary + | key field is called exactly `id` for every type in your schema. + | + */ + + 'shortcut_foreign_key_selection' => false, + + /* + |-------------------------------------------------------------------------- + | GraphQL Subscriptions + |-------------------------------------------------------------------------- + | + | Here you can define GraphQL subscription broadcaster and storage drivers + | as well their required configuration options. + | + */ + + 'subscriptions' => [ + /* + * Determines if broadcasts should be queued by default. + */ + 'queue_broadcasts' => env('LIGHTHOUSE_QUEUE_BROADCASTS', true), + + /* + * Determines the queue to use for broadcasting queue jobs. + */ + 'broadcasts_queue_name' => env('LIGHTHOUSE_BROADCASTS_QUEUE_NAME', null), + + /* + * Default subscription storage. + * + * Any Laravel supported cache driver options are available here. + */ + 'storage' => env('LIGHTHOUSE_SUBSCRIPTION_STORAGE', 'redis'), + + /* + * Default subscription storage time to live in seconds. + * + * Indicates how long a subscription can be active before it's automatically removed from storage. + * Setting this to `null` means the subscriptions are stored forever. This may cause + * stale subscriptions to linger indefinitely in case cleanup fails for any reason. + */ + 'storage_ttl' => env('LIGHTHOUSE_SUBSCRIPTION_STORAGE_TTL', null), + + /* + * Default subscription broadcaster. + */ + 'broadcaster' => env('LIGHTHOUSE_BROADCASTER', 'pusher'), + + /* + * Subscription broadcasting drivers with config options. + */ + 'broadcasters' => [ + 'log' => [ + 'driver' => 'log', + ], + 'pusher' => [ + 'driver' => 'pusher', + 'routes' => Nuwave\Lighthouse\Subscriptions\SubscriptionRouter::class . '@pusher', + 'connection' => 'pusher', + ], + 'echo' => [ + 'driver' => 'echo', + 'connection' => env('LIGHTHOUSE_SUBSCRIPTION_REDIS_CONNECTION', 'default'), + 'routes' => Nuwave\Lighthouse\Subscriptions\SubscriptionRouter::class . '@echoRoutes', + ], + ], + + /* + * Should the subscriptions extension be excluded when the response has no subscription channel? + * This optimizes performance by sending less data, but clients must anticipate this appropriately. + */ + 'exclude_empty' => env('LIGHTHOUSE_SUBSCRIPTION_EXCLUDE_EMPTY', true), + ], + + /* + |-------------------------------------------------------------------------- + | Defer + |-------------------------------------------------------------------------- + | + | Configuration for the experimental @defer directive support. + | + */ + + 'defer' => [ + /* + * Maximum number of nested fields that can be deferred in one query. + * Once reached, remaining fields will be resolved synchronously. + * 0 means unlimited. + */ + 'max_nested_fields' => 0, + + /* + * Maximum execution time for deferred queries in milliseconds. + * Once reached, remaining fields will be resolved synchronously. + * 0 means unlimited. + */ + 'max_execution_ms' => 0, + ], + + /* + |-------------------------------------------------------------------------- + | Apollo Federation + |-------------------------------------------------------------------------- + | + | Lighthouse can act as a federated service: https://www.apollographql.com/docs/federation/federation-spec. + | + */ + + 'federation' => [ + /* + * Location of resolver classes when resolving the `_entities` field. + */ + 'entities_resolver_namespace' => 'App\\GraphQL\\Entities', + ], + + /* + |-------------------------------------------------------------------------- + | Tracing + |-------------------------------------------------------------------------- + | + | Configuration for tracing support. + | + */ + + 'tracing' => [ + /* + * Driver used for tracing. + * + * Accepts the fully qualified class name of a class that implements Nuwave\Lighthouse\Tracing\Tracing. + * Lighthouse provides: + * - Nuwave\Lighthouse\Tracing\ApolloTracing\ApolloTracing::class + * - Nuwave\Lighthouse\Tracing\FederatedTracing\FederatedTracing::class + * + * In Lighthouse v7 the default will be changed to 'Nuwave\Lighthouse\Tracing\FederatedTracing\FederatedTracing::class'. + */ + 'driver' => Nuwave\Lighthouse\Tracing\ApolloTracing\ApolloTracing::class, + ], +]; diff --git a/graphql/schema.graphql b/graphql/schema.graphql new file mode 100644 index 0000000000..ce7fbe4249 --- /dev/null +++ b/graphql/schema.graphql @@ -0,0 +1,11 @@ +"A datetime string with format `Y-m-d H:i:s`, e.g. `2018-05-23 13:43:32`." +scalar DateTime + @scalar(class: "Nuwave\\Lighthouse\\Schema\\Types\\Scalars\\DateTime") + +type Query + +type Mutation + +union Educatable = Prospect | Student + +#import user.graphql diff --git a/graphql/user.graphql b/graphql/user.graphql new file mode 100644 index 0000000000..6fc6e79b8d --- /dev/null +++ b/graphql/user.graphql @@ -0,0 +1,27 @@ +extend type Query { + "Find a single user by an identifying attribute." + user( + "Search by primary key." + id: ID @eq @rules(apply: ["prohibits:email", "required_without:email"]) + + "Search by email address." + email: String + @eq + @rules(apply: ["prohibits:id", "required_without:id", "email"]) + ): User @find + + "List multiple users." + users( + "Filters by name. Accepts SQL LIKE wildcards `%` and `_`." + name: String @where(operator: "like") + ): [User!]! @paginate(defaultCount: 10) +} + +"Account of a person who utilizes this application." +type User @model(class: "user") { + "Unique primary key." + id: ID! + + "Unique email address." + email: String! +} diff --git a/package-lock.json b/package-lock.json index e03ead0aec..5bf9c6859b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,10 +13,12 @@ "@twilio/conversations": "^2.5.0", "alpinejs": "^3.13.2", "dompurify": "^3.0.6", + "env-cmd": "^10.1.0", "esbuild-plugin-polyfill-node": "^0.3.0", "flowbite": "^1.8.1", "showdown": "^2.1.0", "sortablejs": "^1.15.0", + "spectaql": "^2.3.0", "vue": "^3.3.4" }, "devDependencies": { @@ -55,6 +57,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@anvilco/apollo-server-plugin-introspection-metadata": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@anvilco/apollo-server-plugin-introspection-metadata/-/apollo-server-plugin-introspection-metadata-2.2.2.tgz", + "integrity": "sha512-wFPYDHzKg7S2u6RiNbj1D3wqDDiVPyEETnBdO/RcuNtTAZ9XO45H2+u0jAlNsNg73Dmr0piznDODI4851RPABg==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@babel/parser": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", @@ -95,126 +109,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", - "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", - "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", - "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", - "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", - "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", - "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", - "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", - "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-arm64": { "version": "0.19.4", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", @@ -230,201 +124,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", - "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", - "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", - "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", - "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", - "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", - "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", - "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", - "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", - "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", - "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", - "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", - "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", - "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@formkit/core": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@formkit/core/-/core-1.2.2.tgz", @@ -544,6 +243,65 @@ "vue": "^3.3.4" } }, + "node_modules/@graphql-tools/load-files": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/load-files/-/load-files-6.6.1.tgz", + "integrity": "sha512-nd4GOjdD68bdJkHfRepILb0gGwF63mJI7uD4oJuuf2Kzeq8LorKa6WfyxUhdMuLmZhnx10zdAlWPfwv1NOAL4Q==", + "dependencies": { + "globby": "11.1.0", + "tslib": "^2.4.0", + "unixify": "1.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", + "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", + "dependencies": { + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", + "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", + "dependencies": { + "@graphql-tools/merge": "^8.4.1", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "^1.0.12" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@headlessui/vue": { "version": "1.7.16", "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.16.tgz", @@ -630,7 +388,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "devOptional": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -643,7 +400,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "devOptional": true, "engines": { "node": ">= 8" } @@ -652,7 +408,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "devOptional": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -885,13 +640,31 @@ "node": ">=14" } }, - "node_modules/@types/node": { - "version": "20.3.3", + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true, - "optional": true, - "peer": true + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==" + }, + "node_modules/@types/qs": { + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "node_modules/@vitejs/plugin-vue": { "version": "4.4.0", @@ -1011,8 +784,19 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", @@ -1076,7 +860,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1097,7 +880,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "devOptional": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1112,6 +894,53 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "devOptional": true }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha512-N+aAxov+CKVS3JuhDIQFr24XvZvwE96Wlhk9dytTg/GmwWoghdOvR8dspx8MVz71O+Y0pA3UPqHF68D6iy8UvQ==", + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1158,8 +987,28 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/big-integer": { "version": "1.6.51", @@ -1183,7 +1032,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "devOptional": true, "engines": { "node": ">=8" } @@ -1313,6 +1161,22 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -1329,7 +1193,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1339,7 +1202,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1382,8 +1244,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bundle-name": { "version": "3.0.0", @@ -1400,6 +1261,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1429,11 +1308,15 @@ } ] }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1445,11 +1328,64 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "devOptional": true, "funding": [ { "type": "individual", @@ -1472,6 +1408,17 @@ "fsevents": "~2.3.2" } }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1486,11 +1433,22 @@ "node": ">=12" } }, + "node_modules/coffeescript": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz", + "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==", + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1501,8 +1459,15 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "engines": { + "node": ">=0.1.90" + } }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1519,7 +1484,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "devOptional": true, "engines": { "node": ">= 6" } @@ -1527,8 +1491,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -1549,12 +1512,38 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "engines": { + "node": "*" + } + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==" + }, "node_modules/core-js": { "version": "3.33.2", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", @@ -1576,6 +1565,11 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -1598,7 +1592,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1608,6 +1601,32 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1625,6 +1644,22 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -1659,6 +1694,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -1679,6 +1727,31 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -1694,28 +1767,132 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "devOptional": true }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "devOptional": true }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, "node_modules/dompurify": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz", "integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==" }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dropzone": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.9.3.tgz", "integrity": "sha512-Azk8kD/2/nJIuVPK+zQ9sjKMRIpRvNyqn9XwbBHNq+iNuSccbJS6hwm1Woy0pMST0erSo0u4j+KJaodndDk4vA==", "dev": true }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, "dependencies": { "commander": "^2.19.0", "lru-cache": "^4.1.5", @@ -1729,8 +1906,12 @@ "node_modules/editorconfig/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.4.450", @@ -1753,21 +1934,71 @@ "node": ">= 4" } }, - "node_modules/esbuild": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", - "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">=12" + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.4", - "@esbuild/android-arm64": "0.19.4", - "@esbuild/android-x64": "0.19.4", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dependencies": { + "string-template": "~0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", "@esbuild/darwin-arm64": "0.19.4", "@esbuild/darwin-x64": "0.19.4", "@esbuild/freebsd-arm64": "0.19.4", @@ -1810,11 +2041,57 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", @@ -1838,6 +2115,30 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1848,7 +2149,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "devOptional": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1864,16 +2164,44 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "devOptional": true, "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1881,6 +2209,23 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-config/-/find-config-1.0.0.tgz", @@ -1893,6 +2238,55 @@ "node": ">= 0.12" } }, + "node_modules/findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", + "dependencies": { + "glob": "~5.0.0" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/findup-sync/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/flatpickr": { "version": "4.6.13", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", @@ -1908,6 +2302,25 @@ "mini-svg-data-uri": "^1.4.3" } }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -1934,31 +2347,37 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "devOptional": true + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -1969,6 +2388,28 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -1981,11 +2422,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "engines": { + "node": ">=10" + } + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2005,7 +2453,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2013,1767 +2460,2047 @@ "node": ">= 6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "devOptional": true, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dependencies": { - "function-bind": "^1.1.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=0.10.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/html-attribute-sorter": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/html-attribute-sorter/-/html-attribute-sorter-0.4.3.tgz", - "integrity": "sha512-HWSvaXJki44tg0uR1t+j5pRdUVpNiZcJaoB/PFhss/YoAw9cxUDLCpIBbLWQmKjBQfWk91P6LaRnredEyabrDw==", - "dev": true, - "engines": { - "node": ">= 12.0.0" + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=14.18.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, "engines": { - "node": ">= 4" + "node": ">= 0.10" } }, - "node_modules/import-meta-resolve": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", - "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "node_modules/graphql-scalars": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.22.4.tgz", + "integrity": "sha512-ILnv7jq5VKHLUyoaTFX7lgYrjCd6vTee9i8/B+D4zJKJT5TguOl0KkpPEbXHjmeor8AZYrVsrYUHdqRBMX1pjA==", "dependencies": { - "binary-extensions": "^2.0.0" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/grunt": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", + "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", + "dependencies": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "bin": { + "grunt": "bin/grunt" }, "engines": { "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "devOptional": true, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", "dependencies": { - "has": "^1.0.3" + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "grunt": "bin/grunt" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "devOptional": true, + "node_modules/grunt-contrib-clean": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", + "integrity": "sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA==", "dependencies": { - "is-extglob": "^2.1.1" + "async": "^3.2.3", + "rimraf": "^2.6.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "peerDependencies": { + "grunt": ">=0.4.5" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, + "node_modules/grunt-contrib-clean/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "is-docker": "^3.0.0" + "glob": "^7.1.3" }, "bin": { - "is-inside-container": "cli.js" + "rimraf": "bin.js" + } + }, + "node_modules/grunt-contrib-concat": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.1.0.tgz", + "integrity": "sha512-Vnl95JIOxfhEN7bnYIlCgQz41kkbi7tsZ/9a4usZmxNxi1S2YAIOy8ysFmO8u4MN26Apal1O106BwARdaNxXQw==", + "dependencies": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" }, "engines": { - "node": ">=14.16" + "node": ">=0.12.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "grunt": ">=1.4.1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, + "node_modules/grunt-contrib-concat/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">=0.12.0" + "node": ">=0.10.0" } }, - "node_modules/is-stream": { + "node_modules/grunt-contrib-connect": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-3.0.0.tgz", + "integrity": "sha512-L1GXk6PqDP/meX0IOX1MByBvOph6h8Pvx4/iBIYD7dpokVCAAQPR/IIV1jkTONEM09xig/Y8/y3R9Fqc8U3HSA==", + "dependencies": { + "async": "^3.2.0", + "connect": "^3.7.0", + "connect-livereload": "^0.6.1", + "morgan": "^1.10.0", + "node-http2": "^4.0.1", + "opn": "^6.0.0", + "portscanner": "^2.2.0", + "serve-index": "^1.9.1", + "serve-static": "^1.14.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iso8601-duration": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-1.2.0.tgz", - "integrity": "sha512-ErTBd++b17E8nmWII1K1uZtBgD1E8RjyvwmxlCjPHNqHMD7gmcMHOw0E8Ro/6+QT4PhHRSnnMo7bxa1vFPkwhg==" - }, - "node_modules/isomorphic-form-data": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz", - "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==", + "node_modules/grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", "dependencies": { - "form-data": "^2.3.2" + "chalk": "^1.1.1", + "file-sync-cmp": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/javascript-state-machine": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/javascript-state-machine/-/javascript-state-machine-3.1.0.tgz", - "integrity": "sha512-BwhYxQ1OPenBPXC735RgfB+ZUG8H3kjsx8hrYTgWnoy6TPipEy4fiicyhT2lxRKAXq9pG7CfFT8a2HLr6Hmwxg==" - }, - "node_modules/jiti": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", - "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", - "devOptional": true, - "bin": { - "jiti": "bin/jiti.js" + "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==", - "dev": true + "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/js-beautify": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", - "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", - "dev": true, + "node_modules/grunt-contrib-copy/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^0.15.3", - "glob": "^8.1.0", - "nopt": "^6.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/grunt-contrib-copy/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-cssmin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-5.0.0.tgz", + "integrity": "sha512-SNp4H4+85mm2xaHYi83FBHuOXylpi5vcwgtNoYCZBbkgeXQXoeTAKa59VODRb0woTDBvxouP91Ff5PzCkikg6g==", "dependencies": { - "balanced-match": "^1.0.0" + "chalk": "^4.1.2", + "clean-css": "^5.3.2", + "maxmin": "^3.0.0" + }, + "engines": { + "node": ">=14.0" } }, - "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, + "node_modules/grunt-contrib-uglify": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", + "integrity": "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "chalk": "^4.1.2", + "maxmin": "^3.0.0", + "uglify-js": "^3.16.1", + "uri-path": "^1.0.0" }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, + "node_modules/grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", "dependencies": { - "brace-expansion": "^2.0.1" + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, + "node_modules/grunt-contrib-watch/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/laravel-vite-plugin": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz", - "integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==", - "dev": true, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", "dependencies": { - "picocolors": "^1.0.0", - "vite-plugin-full-reload": "^1.0.5" + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "node": ">= 0.10.0" } }, - "node_modules/lilconfig": { + "node_modules/grunt-legacy-log-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, "engines": { "node": ">=10" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "devOptional": true - }, - "node_modules/linguist-languages": { - "version": "7.26.1", - "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.26.1.tgz", - "integrity": "sha512-B9O5pDocOkfswmA0qKrqdfeua1TxeQ5PPWdsuo5QRXFv2N0tB3plY+DVWvSWiGkjdqKNU3KBjJYHs/jRXG0adw==", - "dev": true - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" }, "engines": { - "node": ">=8.9.0" + "node": ">=10" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "node_modules/grunt-sass": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz", + "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==", "engines": { - "node": ">= 0.6.0" + "node": ">=8" }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "peerDependencies": { + "grunt": ">=1" } }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, + "node_modules/grunt/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "sprintf-js": "~1.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "node_modules/grunt/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/grunt/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, + "node_modules/grunt/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dependencies": { - "p-defer": "^1.0.0" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" }, "engines": { "node": ">=6" } }, - "node_modules/mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, + "node_modules/gzip-size/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=10" + "node": ">=0.4.7" }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/merge-images": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge-images/-/merge-images-1.2.0.tgz", - "integrity": "sha512-hEGvgnTdXr08uzGvEArxRsKpy7WmozM73YaSi4s5IYF4LxrhANpqfHaz9CgBZ5+0+s2NsjPnPdStz3aCc0Yulw==", - "dev": true - }, - "node_modules/merge-stream": { + "node_modules/has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "devOptional": true, + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "devOptional": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { - "node": ">=8.6" + "node": ">=0.10.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "mime-db": "1.52.0" + "get-intrinsic": "^1.2.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dependencies": { - "brace-expansion": "^1.1.7" + "parse-passwd": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", "engines": { "node": "*" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "devOptional": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "node_modules/html-attribute-sorter": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/html-attribute-sorter/-/html-attribute-sorter-0.4.3.tgz", + "integrity": "sha512-HWSvaXJki44tg0uR1t+j5pRdUVpNiZcJaoB/PFhss/YoAw9cxUDLCpIBbLWQmKjBQfWk91P6LaRnredEyabrDw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "node_modules/htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/fb55" } ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" + "node_modules/http-basic/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/http-basic/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, + "node_modules/http-basic/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/http-basic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "path-key": "^4.0.0" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha512-EjDQFbgJr1vDD/175UJeSX3ncQ3+RUnCL5NkthQGHvF4VNHlzTy8ifJfTqz47qiPRqaFH58+CbuG3x51WuB1XQ==" + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.18.0" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "devOptional": true, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { - "node": ">= 6" + "node": ">= 4" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "node_modules/import-meta-resolve": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", + "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { + "once": "^1.3.0", "wrappy": "1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dependencies": { - "mimic-fn": "^4.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/p-defer": { + "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, "engines": { - "node": ">=4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dependencies": { + "lodash.isfinite": "^3.3.2" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "devOptional": true - }, - "node_modules/php-parser": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", - "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==", - "dev": true + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/picocolors": { + "node_modules/is-relative": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=8.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "devOptional": true, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "devOptional": true, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iso8601-duration": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/iso8601-duration/-/iso8601-duration-1.2.0.tgz", + "integrity": "sha512-ErTBd++b17E8nmWII1K1uZtBgD1E8RjyvwmxlCjPHNqHMD7gmcMHOw0E8Ro/6+QT4PhHRSnnMo7bxa1vFPkwhg==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "devOptional": true, + "node_modules/isomorphic-form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz", + "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "form-data": "^2.3.2" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "node_modules/javascript-state-machine": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/javascript-state-machine/-/javascript-state-machine-3.1.0.tgz", + "integrity": "sha512-BwhYxQ1OPenBPXC735RgfB+ZUG8H3kjsx8hrYTgWnoy6TPipEy4fiicyhT2lxRKAXq9pG7CfFT8a2HLr6Hmwxg==" + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", "devOptional": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jquery": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", + "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==", + "dev": true + }, + "node_modules/js-beautify": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", + "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" }, - "peerDependencies": { - "postcss": "^8.4.21" + "engines": { + "node": ">=12" } }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "devOptional": true, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">= 14" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "devOptional": true, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=10" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "devOptional": true, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-stringify-pretty-compact": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz", + "integrity": "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "devOptional": true + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "node_modules/laravel-vite-plugin": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz", + "integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==", "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.0.5" }, "engines": { "node": ">=14" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "devOptional": true, - "dependencies": { - "pify": "^2.3.0" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "devOptional": true }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/linguist-languages": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.26.1.tgz", + "integrity": "sha512-B9O5pDocOkfswmA0qKrqdfeua1TxeQ5PPWdsuo5QRXFv2N0tB3plY+DVWvSWiGkjdqKNU3KBjJYHs/jRXG0adw==", + "dev": true + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==" + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">= 6" + "node": ">=8.9.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "devOptional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", "dev": true }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==" + }, + "node_modules/lodash.unset": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz", + "integrity": "sha512-bwKX88k2JhCV9D1vtE8+naDKlLiGrSmf8zi/Y9ivFHwbmRfA8RxS/aVJ+sIht2XOwqoNr4xUPUkGZpc1sHFEKg==" + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "devOptional": true, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "@jridgewell/sourcemap-codec": "^1.4.15" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" + "kind-of": "^6.0.2" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.1" + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/resolve-url-loader/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "devOptional": true, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "bin": { - "rollup": "dist/bin/rollup" + "marked": "bin/marked.js" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 12" } }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, + "node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", "dependencies": { - "execa": "^5.0.0" + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sindresorhus/mem?sponsor=1" } }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/mem/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=8" } }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/merge-images": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge-images/-/merge-images-1.2.0.tgz", + "integrity": "sha512-hEGvgnTdXr08uzGvEArxRsKpy7WmozM73YaSi4s5IYF4LxrhANpqfHaz9CgBZ5+0+s2NsjPnPdStz3aCc0Yulw==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "node_modules/microfiber": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/microfiber/-/microfiber-2.1.1.tgz", + "integrity": "sha512-lLHfeAXpPQZIU7/UMwtNtNXpb3PphaNZJSVwEntkRl9ir+lgJr534dTXfbILE1hksNMggOYwAZhAGFrgiySc5A==", + "dependencies": { + "lodash.defaults": "^4.2.0", + "lodash.get": "^4.4.2", + "lodash.unset": "^4.5.2" + }, "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "path-key": "^3.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mimic-fn": "^2.1.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=6" + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/ai" } - ] + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "node_modules/select2": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", - "integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==", - "dev": true + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-http2": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/node-http2/-/node-http2-4.0.1.tgz", + "integrity": "sha512-AP21BjQsOAMTCJCCkdXUUMa1o7/Qx+yAWHnHZbCf8RhZ+hKMjB9rUkAtnfayk/yGj1qapZ5eBHZJBpk1dqdNlw==", + "dependencies": { + "assert": "1.4.1", + "events": "1.1.1", + "https-browserify": "0.0.1", + "setimmediate": "^1.0.5", + "stream-browserify": "2.0.1", + "timers-browserify": "2.0.2", + "url": "^0.11.0", + "websocket-stream": "^5.0.1" + }, + "engines": { + "node": ">=0.12.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dependencies": { - "shebang-regex": "^3.0.0" + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/shebang-regex": { + "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/showdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", - "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { - "commander": "^9.0.0" + "path-key": "^4.0.0" }, - "bin": { - "showdown": "bin/showdown.js" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "individual", - "url": "https://www.paypal.me/tiviesantos" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/showdown/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signature_pad": { - "version": "3.0.0-beta.4", - "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-3.0.0-beta.4.tgz", - "integrity": "sha512-cOf2NhVuTiuNqe2X/ycEmizvCDXk0DoemhsEpnkcGnA4kS5iJYTCqZ9As7tFBbsch45Q1EdX61833+6sjJ8rrw==", - "dev": true - }, - "node_modules/sortablejs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", - "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "devOptional": true, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dependencies": { - "safe-buffer": "~5.2.0" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dependencies": { - "ansi-regex": "^5.0.1" + "ee-first": "1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "devOptional": true, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" + "wrappy": "1" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "devOptional": true, - "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.16" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "devOptional": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, + "node_modules/open/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "is-docker": "cli.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "devOptional": true, + "node_modules/open/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/terser": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", - "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", - "dev": true, - "optional": true, - "peer": true, + "node_modules/opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", + "deprecated": "The package has been renamed to `open`", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "is-wsl": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true, - "peer": true + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "devOptional": true, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dependencies": { - "any-promise": "^1.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "devOptional": true, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dependencies": { - "thenify": ">= 3.1.0 < 4" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" }, "engines": { "node": ">=0.8" } }, - "node_modules/tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "dev": true, - "dependencies": { - "@popperjs/core": "^2.9.0" + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { - "is-number": "^7.0.0" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { - "node": ">=8.0" + "node": ">= 0.8" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "devOptional": true + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", - "dev": true + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "node_modules/twilio-sync": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/twilio-sync/-/twilio-sync-3.1.0.tgz", - "integrity": "sha512-KNkbbnoBITpsmxV2UnmNDEot/Q5t7p5I1zP05oqj0OYT1kMcZq4nhiSNkcxkunfxINFSUzz8d/mUA82yWS7iLQ==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dependencies": { - "@babel/runtime": "^7.14.5", - "@twilio/declarative-type-validator": "^0.1.11", - "@twilio/operation-retrier": "^4.0.7", - "core-js": "^3.17.3", - "iso8601-duration": "=1.2.0", - "loglevel": "^1.6.3", - "platform": "^1.3.6", - "twilsock": "^0.12.2", - "uuid": "^3.4.0" + "path-root-regex": "^0.1.0" }, "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/twilio-sync/node_modules/@twilio/declarative-type-validator": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@twilio/declarative-type-validator/-/declarative-type-validator-0.1.11.tgz", - "integrity": "sha512-yRAMLPD8j3k67UFvPeZvfTlKYuceiNq+iZ8a/ADzAbZMeaV0FMvsJmG97MH8yN/VdXY9hcscchsnc99bJ1sClw==", - "dependencies": { - "@babel/runtime": "^7.14.5", - "core-js": "^3.17.3" - }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/twilsock": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/twilsock/-/twilsock-0.12.2.tgz", - "integrity": "sha512-7G59f2TCEnxcY2ZBCzaZOPmMDoxDrK9lMTiA7UvuiKca37Dljbdlu2EHI3+d7gU1JHkH5GNCmyxqJzSbZodwXA==", - "dependencies": { - "@babel/runtime": "^7.14.5", - "@twilio/declarative-type-validator": "^0.1.11", - "@twilio/operation-retrier": "^4.0.7", - "core-js": "^3.17.3", - "iso8601-duration": "=1.2.0", - "javascript-state-machine": "^3.1.0", - "loglevel": "^1.6.3", - "platform": "^1.3.6", - "uuid": "^3.4.0", - "ws": "^5.2.3" - }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/twilsock/node_modules/@twilio/declarative-type-validator": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@twilio/declarative-type-validator/-/declarative-type-validator-0.1.11.tgz", - "integrity": "sha512-yRAMLPD8j3k67UFvPeZvfTlKYuceiNq+iZ8a/ADzAbZMeaV0FMvsJmG97MH8yN/VdXY9hcscchsnc99bJ1sClw==", - "dependencies": { - "@babel/runtime": "^7.14.5", - "core-js": "^3.17.3" + "node_modules/php-parser": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", + "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "devOptional": true, "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/twilsock/node_modules/ws": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", - "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", - "dependencies": { - "async-limiter": "~1.0.0" + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "devOptional": true, + "engines": { + "node": ">= 6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, "engines": { - "node": ">=8" + "node": ">=0.4", + "npm": ">=1.0.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", @@ -3781,467 +4508,1721 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "devOptional": true, "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "devOptional": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", - "dev": true, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "devOptional": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 14" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { + "postcss": { "optional": true }, - "terser": { + "ts-node": { "optional": true } } }, - "node_modules/vite-plugin-full-reload": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", - "integrity": "sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ==", - "dev": true, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "devOptional": true, "dependencies": { - "picocolors": "^1.0.0", - "picomatch": "^2.3.1" + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "vite": "^2 || ^3 || ^4" + "postcss": "^8.2.14" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "devOptional": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "devOptional": true }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=12" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/raw-body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "devOptional": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/select2": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.13.tgz", + "integrity": "sha512-1JeB87s6oN/TDxQQYCvS5EFoQyvV6eYMZZ0AeA4tdFDYWN3BAGZ8npr17UBFddU0lgAt3H0yjX3X6/ekOj1yjw==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/showdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz", + "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==", + "dependencies": { + "commander": "^9.0.0" + }, + "bin": { + "showdown": "bin/showdown.js" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/tiviesantos" + } + }, + "node_modules/showdown/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/signature_pad": { + "version": "3.0.0-beta.4", + "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-3.0.0-beta.4.tgz", + "integrity": "sha512-cOf2NhVuTiuNqe2X/ycEmizvCDXk0DoemhsEpnkcGnA4kS5iJYTCqZ9As7tFBbsch45Q1EdX61833+6sjJ8rrw==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spectaql": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spectaql/-/spectaql-2.3.0.tgz", + "integrity": "sha512-fk0zWo6R8F/5l5Gy6dpbTyiituXXRpCUcIxj8VTRwbSw2+Xj2xNRkYJC3fIEwTaeNshL88Pts5fnFxFGNA1K7A==", + "dependencies": { + "@anvilco/apollo-server-plugin-introspection-metadata": "^2.0.1", + "@graphql-tools/load-files": "^6.3.2", + "@graphql-tools/merge": "^8.1.2", + "@graphql-tools/schema": "^9.0.1", + "@graphql-tools/utils": "^9.1.1", + "cheerio": "^1.0.0-rc.10", + "coffeescript": "^2.6.1", + "commander": "^10.0.0", + "fast-glob": "^3.2.12", + "graceful-fs": "~4.2.10", + "graphql": "^16.3.0", + "graphql-scalars": "^1.15.0", + "grunt": "~1.5.3", + "grunt-contrib-clean": "^2.0.0", + "grunt-contrib-concat": "^2.1.0", + "grunt-contrib-connect": "^3.0.0", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-cssmin": "^5.0.0", + "grunt-contrib-uglify": "^5.0.1", + "grunt-contrib-watch": "^1.1.0", + "grunt-sass": "^3.0.2", + "handlebars": "^4.7.7", + "highlight.js": "^11.4.0", + "htmlparser2": "~9.0.0", + "js-beautify": "~1.14.7", + "js-yaml": "^4.1.0", + "json-stringify-pretty-compact": "^3.0.0", + "json5": "^2.2.0", + "lodash": "^4.17.21", + "marked": "^4.0.12", + "microfiber": "^2.0.1", + "postcss": "^8.4.19", + "sass": "^1.32.13", + "sync-request": "^6.1.0", + "tmp": "0.2.1" + }, + "bin": { + "spectaql": "bin/spectaql.js" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + } + }, + "node_modules/spectaql/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha512-nmQnY9D9TlnfQIkYJCCWxvCcQODilFRZIw14gCMYQVXOiY4E1Ze1VMxB+6y3qdXHpTordULo2qWloHmNcNAQYw==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "devOptional": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/terser": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", + "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], + "node_modules/terser/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true, - "os": [ - "linux" + "peer": true + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/then-request/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/then-request/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/then-request/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/then-request/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "devOptional": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "devOptional": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", + "integrity": "sha512-O7UB405+hxP2OWqlBdlUMxZVEdsi8NOWL2c730Cs6zeO1l1AkxygvTm6yC4nTw84iGbFcqxbIkkrdNKzq/3Fvg==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dependencies": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/tiny-lr/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "dev": true, + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "devOptional": true + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/twilio-sync": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/twilio-sync/-/twilio-sync-3.1.0.tgz", + "integrity": "sha512-KNkbbnoBITpsmxV2UnmNDEot/Q5t7p5I1zP05oqj0OYT1kMcZq4nhiSNkcxkunfxINFSUzz8d/mUA82yWS7iLQ==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "@twilio/declarative-type-validator": "^0.1.11", + "@twilio/operation-retrier": "^4.0.7", + "core-js": "^3.17.3", + "iso8601-duration": "=1.2.0", + "loglevel": "^1.6.3", + "platform": "^1.3.6", + "twilsock": "^0.12.2", + "uuid": "^3.4.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/twilio-sync/node_modules/@twilio/declarative-type-validator": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@twilio/declarative-type-validator/-/declarative-type-validator-0.1.11.tgz", + "integrity": "sha512-yRAMLPD8j3k67UFvPeZvfTlKYuceiNq+iZ8a/ADzAbZMeaV0FMvsJmG97MH8yN/VdXY9hcscchsnc99bJ1sClw==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "core-js": "^3.17.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/twilsock": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/twilsock/-/twilsock-0.12.2.tgz", + "integrity": "sha512-7G59f2TCEnxcY2ZBCzaZOPmMDoxDrK9lMTiA7UvuiKca37Dljbdlu2EHI3+d7gU1JHkH5GNCmyxqJzSbZodwXA==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "@twilio/declarative-type-validator": "^0.1.11", + "@twilio/operation-retrier": "^4.0.7", + "core-js": "^3.17.3", + "iso8601-duration": "=1.2.0", + "javascript-state-machine": "^3.1.0", + "loglevel": "^1.6.3", + "platform": "^1.3.6", + "uuid": "^3.4.0", + "ws": "^5.2.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/twilsock/node_modules/@twilio/declarative-type-validator": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@twilio/declarative-type-validator/-/declarative-type-validator-0.1.11.tgz", + "integrity": "sha512-yRAMLPD8j3k67UFvPeZvfTlKYuceiNq+iZ8a/ADzAbZMeaV0FMvsJmG97MH8yN/VdXY9hcscchsnc99bJ1sClw==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "core-js": "^3.17.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/twilsock/node_modules/ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "engines": { - "node": ">=12" + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", "engines": { - "node": ">=12" + "node": ">= 0.10" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "os-homedir": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.10" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/value-or-promise": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", + "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], + "node_modules/vite": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], + "node_modules/vite-plugin-full-reload": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", + "integrity": "sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "vite": "^2 || ^3 || ^4" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { + "node_modules/vite/node_modules/@esbuild/linux-arm64": { "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">=12" @@ -4324,11 +6305,71 @@ "vue": "^3.2.0" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-stream": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", + "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", + "dependencies": { + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "^3.2.0", + "xtend": "^4.0.0" + } + }, + "node_modules/websocket-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/websocket-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4339,6 +6380,11 @@ "node": ">= 8" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4359,8 +6405,22 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/ws/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/xmlhttprequest": { "version": "1.8.0", @@ -4379,6 +6439,14 @@ "@babel/runtime-corejs3": "^7.16.5" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4391,8 +6459,7 @@ "node_modules/yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/yaml": { "version": "2.3.1", diff --git a/package.json b/package.json index 356aa3e6b4..7a0d81df99 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build:vite": "vite build", "build": "npm run build:js-compile && npm run build:vite && npm run build:filament && npm run build:application && npm run build:form", "build:application": "(cd widgets/application && vite build)", - "build:form": "(cd widgets/form && vite build)" + "build:form": "(cd widgets/form && vite build)", + "api-docs:generate": "env-cmd spectaql spectaql.yml" }, "devDependencies": { "@headlessui/vue": "^1.7.16", @@ -44,10 +45,12 @@ "@twilio/conversations": "^2.5.0", "alpinejs": "^3.13.2", "dompurify": "^3.0.6", + "env-cmd": "^10.1.0", "esbuild-plugin-polyfill-node": "^0.3.0", "flowbite": "^1.8.1", "showdown": "^2.1.0", "sortablejs": "^1.15.0", + "spectaql": "^2.3.0", "vue": "^3.3.4" } } diff --git a/spectaql.yml b/spectaql.yml new file mode 100644 index 0000000000..f147ea7357 --- /dev/null +++ b/spectaql.yml @@ -0,0 +1,45 @@ +spectaql: +# logoFile: ./test/fixtures/logo.png +# faviconFile: ./test/fixtures/favicon.png + displayAllServers: true + targetDir: ./public/api-docs + oneFile: true + themeDir: spectaql + +introspection: + removeTrailingPeriodFromDescriptions: false + schemaFile: ./storage/app/public/lighthouse-schema.graphql +# metadataFile: ./examples/data/metadata.json +# dynamicExamplesProcessingModule: ./examples/customizations/examples + queryNameStrategy: capitalizeFirst + fieldExpansionDepth: 20 + + spectaqlDirective: + enable: true + +extensions: + graphqlScalarExamples: true + +info: + title: Advising App API Reference + description: Documentation for the Advising App API + termsOfService: https://www.example.com/terms + contact: + name: API Support + url: http://www.example.com/support + email: support@example.com + license: + name: Elastic License 2.0 + url: https://www.elastic.co/licensing/elastic-license + x-introItems: + - title: Important thing 1 + description: Some important stuff we wanted you to know. Supports `markdown` + +servers: + - url: ${APP_URL}/graphql + description: This server + production: true + headers: + - name: Authorization + example: Bearer + comment: The API token generated for a System User within the dashboard. \ No newline at end of file diff --git a/stubs/policy.stub b/stubs/policy.stub new file mode 100644 index 0000000000..5a465a99ed --- /dev/null +++ b/stubs/policy.stub @@ -0,0 +1,66 @@ +